3 Commits
Author SHA1 Message Date
semantic-release-bot a4bb860526 chore(release): 1.2.2
## [1.2.2](https://github.com/asepharyana/TeleUploader/compare/v1.2.1...v1.2.2) (2026-09-05)

### Bug Fixes

* **health:** resolve app version in Nix bundle at runtime ([6797dba](https://github.com/asepharyana/TeleUploader/commit/6797dbada27873b14c064e238589e61ad3ecb67c))
2026-09-05 18:14:18 +00:00
asepharyana 6797dbada2 fix(health): resolve app version in Nix bundle at runtime
The health endpoint was returning version 0.0.0 because readPackageVersion()
tried import.meta.require on a JSON path that Bun cannot bundle and the
package.json never shipped into the Nix store (installPhase only copied
dist/, home.html, schema.sql).

- flake.nix installPhase now copies package.json into $out/share/teleuploader/
- readPackageVersion() reads import.meta.dir/../package.json (bundle) or
  process.cwd()/package.json (dev) via readFileSync at runtime

Verified local resolution to 1.2.1; after this fixes deploy it will expose
the live semver on GET /health.
2026-09-06 01:13:48 +07:00
asepharyana 2ca1e67435 ci(release): add actions: write for deploy dispatch
dispatch.mjs dispatches deploy.yml via workflow_dispatch, which requires
actions: write. Without it the success hook hit HTTP 403 (Resource not
accessible by integration), same trap as the mytheclipse pipeline, and the
auto deploy never ran for v1.2.1.
2026-09-06 01:04:00 +07:00
5 changed files with 30 additions and 20 deletions
+1
View File
@@ -7,6 +7,7 @@ on:
permissions:
contents: write
actions: write
id-token: write
concurrency:
+7
View File
@@ -1,3 +1,10 @@
## [1.2.2](https://github.com/asepharyana/TeleUploader/compare/v1.2.1...v1.2.2) (2026-09-05)
### Bug Fixes
* **health:** resolve app version in Nix bundle at runtime ([6797dba](https://github.com/asepharyana/TeleUploader/commit/6797dbada27873b14c064e238589e61ad3ecb67c))
## [1.2.1](https://github.com/asepharyana/TeleUploader/compare/v1.2.0...v1.2.1) (2026-09-05)
+4 -1
View File
@@ -27,7 +27,7 @@
# TeleUploader package
teleuploader = pkgs.stdenvNoCC.mkDerivation rec {
pname = "teleuploader";
version = "1.2.1";
version = "1.2.2";
src = ./.;
@@ -61,6 +61,9 @@
cp -r dist $out/share/teleuploader/dist
cp src/home.html $out/share/teleuploader/ 2>/dev/null || true
cp schema.sql $out/share/teleuploader/ 2>/dev/null || true
# Carry package.json into the store so runtime version lookup in
# env.ts readPackageVersion() resolves (dist/../package.json).
cp package.json $out/share/teleuploader/package.json
# Wrap with bun from Nix store (dependency sharing!)
# Note: NO --chdir — systemd WorkingDirectory controls this
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "filedrop",
"version": "1.2.1",
"version": "1.2.2",
"description": "Telegram file uploader backend",
"type": "module",
"scripts": {
+17 -18
View File
@@ -1,3 +1,4 @@
import { readFileSync } from 'node:fs';
import logger from './shared/logger/index';
import { TELEGRAM_CHUNK_SIZE_MAX_BYTES } from './shared/utils/validation';
@@ -143,25 +144,23 @@ if (telegramChunkSizeBytes > TELEGRAM_CHUNK_SIZE_MAX_BYTES) {
* value always matches the deployed build.
*/
const readPackageVersion = (): string => {
try {
const candidates = [
// node_modules resolution is only available when installed as a dep
import.meta.dir ? `${import.meta.dir}/../package.json` : undefined,
`${process.cwd()}/package.json`,
];
for (const candidate of candidates) {
if (!candidate) continue;
try {
const pkg = JSON.parse(import.meta.require(candidate).default ?? '{}') as {
version?: string;
};
if (pkg.version) return pkg.version;
} catch {
// try next candidate
}
// Candidates in priority order. In the Nix bundle the app lives at
// $out/share/teleuploader/dist/index.js, so the package.json that was
// copied alongside it is one level up from import.meta.dir. In a dev
// checkout it sits in the repo root (process.cwd()). Bun bundles JSON
// imports statically, so we read the file at runtime instead.
const candidates = [
import.meta.dir ? `${import.meta.dir}/../package.json` : undefined,
`${process.cwd()}/package.json`,
];
for (const candidate of candidates) {
if (!candidate) continue;
try {
const parsed = JSON.parse(readFileSync(candidate, 'utf8')) as { version?: string };
if (parsed.version) return parsed.version;
} catch {
// try next candidate
}
} catch {
// fall through
}
return '0.0.0';
};