@fuzdev/fuz_app 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/bootstrap_account.d.ts +1 -1
- package/dist/auth/bootstrap_account.d.ts.map +1 -1
- package/dist/auth/bootstrap_account.js +2 -2
- package/dist/auth/bootstrap_routes.js +1 -1
- package/dist/auth/daemon_token_middleware.d.ts +1 -1
- package/dist/auth/daemon_token_middleware.d.ts.map +1 -1
- package/dist/auth/deps.d.ts +1 -1
- package/dist/auth/deps.d.ts.map +1 -1
- package/dist/auth/keyring.d.ts +4 -0
- package/dist/auth/keyring.d.ts.map +1 -1
- package/dist/auth/keyring.js +7 -0
- package/dist/cli/config.d.ts +2 -2
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +2 -2
- package/dist/cli/daemon.d.ts +3 -3
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +1 -1
- package/dist/dev/setup.d.ts +1 -1
- package/dist/dev/setup.d.ts.map +1 -1
- package/dist/dev/setup.js +6 -6
- package/dist/env/dotenv.d.ts +2 -2
- package/dist/env/dotenv.d.ts.map +1 -1
- package/dist/env/dotenv.js +2 -2
- package/dist/runtime/deno.d.ts.map +1 -1
- package/dist/runtime/deno.js +4 -2
- package/dist/runtime/deps.d.ts +6 -2
- package/dist/runtime/deps.d.ts.map +1 -1
- package/dist/runtime/fs.d.ts +1 -1
- package/dist/runtime/fs.d.ts.map +1 -1
- package/dist/runtime/fs.js +1 -1
- package/dist/runtime/mock.d.ts +2 -0
- package/dist/runtime/mock.d.ts.map +1 -1
- package/dist/runtime/mock.js +37 -8
- package/dist/runtime/node.d.ts.map +1 -1
- package/dist/runtime/node.js +4 -2
- package/dist/server/app_backend.d.ts +1 -1
- package/dist/server/app_backend.d.ts.map +1 -1
- package/dist/server/app_backend.js +2 -2
- package/dist/testing/app_server.js +1 -1
- package/dist/testing/stubs.js +2 -2
- package/package.json +2 -2
|
@@ -52,7 +52,7 @@ export interface BootstrapAccountDeps {
|
|
|
52
52
|
/** Path to the bootstrap token file on disk. */
|
|
53
53
|
token_path: string;
|
|
54
54
|
/** Read a file's contents as a string. */
|
|
55
|
-
|
|
55
|
+
read_text_file: (path: string) => Promise<string>;
|
|
56
56
|
/** Delete a file. */
|
|
57
57
|
delete_file: (path: string) => Promise<void>;
|
|
58
58
|
/** Only hashing is needed — verification happens separately during login. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap_account.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/bootstrap_account.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,EACN,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AAEpC,gDAAgD;AAChD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC;IACzC,wFAAwF;IACxF,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,gCAAgC;AAChC,MAAM,MAAM,uBAAuB,GAChC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,0BAA0B,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAC,GAClE;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,wBAAwB,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAC,GAChE;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,mBAAmB,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAC,CAAC;AAE/D,qFAAqF;AACrF,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,EAAE,EAAE,EAAE,CAAC;IACP,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,
|
|
1
|
+
{"version":3,"file":"bootstrap_account.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/bootstrap_account.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,EACN,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AAEpC,gDAAgD;AAChD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC;IACzC,wFAAwF;IACxF,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,gCAAgC;AAChC,MAAM,MAAM,uBAAuB,GAChC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,0BAA0B,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAC,GAClE;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,wBAAwB,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAC,GAChE;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,mBAAmB,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAC,CAAC;AAE/D,qFAAqF;AACrF,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,EAAE,EAAE,EAAE,CAAC;IACP,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,qBAAqB;IACrB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,6EAA6E;IAC7E,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAClD,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,GAC7B,MAAM,oBAAoB,EAC1B,gBAAgB,MAAM,EACtB,OAAO,qBAAqB,KAC1B,OAAO,CAAC,sBAAsB,CA4EhC,CAAC"}
|
|
@@ -30,11 +30,11 @@ import { query_grant_permit } from './permit_queries.js';
|
|
|
30
30
|
* @returns the created account, actor, and permits — or a bootstrap failure
|
|
31
31
|
*/
|
|
32
32
|
export const bootstrap_account = async (deps, provided_token, input) => {
|
|
33
|
-
const { db, token_path,
|
|
33
|
+
const { db, token_path, read_text_file, delete_file, password, log } = deps;
|
|
34
34
|
// 1. Read and verify token (non-destructive, before transaction)
|
|
35
35
|
let expected_token;
|
|
36
36
|
try {
|
|
37
|
-
expected_token = (await
|
|
37
|
+
expected_token = (await read_text_file(token_path)).trim();
|
|
38
38
|
}
|
|
39
39
|
catch {
|
|
40
40
|
return { ok: false, error: ERROR_TOKEN_FILE_MISSING, status: 404 };
|
|
@@ -100,7 +100,7 @@ export const create_bootstrap_route_specs = (deps, options) => {
|
|
|
100
100
|
const result = await bootstrap_account({
|
|
101
101
|
db: route.background_db,
|
|
102
102
|
token_path,
|
|
103
|
-
|
|
103
|
+
read_text_file: deps.read_text_file,
|
|
104
104
|
delete_file: deps.delete_file,
|
|
105
105
|
password: deps.password,
|
|
106
106
|
log: deps.log,
|
|
@@ -17,7 +17,7 @@ import { type DaemonTokenState } from './daemon_token.js';
|
|
|
17
17
|
/** Default rotation interval in milliseconds (30 seconds). */
|
|
18
18
|
export declare const DEFAULT_ROTATION_INTERVAL_MS = 30000;
|
|
19
19
|
/** Deps for writing the daemon token to disk. */
|
|
20
|
-
export type DaemonTokenWriteDeps = Pick<EnvDeps, 'env_get'> & FsWriteDeps & {
|
|
20
|
+
export type DaemonTokenWriteDeps = Pick<EnvDeps, 'env_get'> & Pick<FsWriteDeps, 'mkdir' | 'write_text_file' | 'rename'> & {
|
|
21
21
|
/** Set file permissions. Optional — consumers provide when available (e.g. `Deno.chmod`). */
|
|
22
22
|
chmod?: (path: string, mode: number) => Promise<void>;
|
|
23
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon_token_middleware.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/daemon_token_middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAWrF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAKN,KAAK,gBAAgB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,iDAAiD;AACjD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAC1D,WAAW,GAAG;
|
|
1
|
+
{"version":3,"file":"daemon_token_middleware.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/daemon_token_middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAWrF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAKN,KAAK,gBAAgB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,iDAAiD;AACjD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAC1D,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,GAAG,QAAQ,CAAC,GAAG;IAC3D,6FAA6F;IAC7F,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GACjC,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,MAAM,MAAM,KACV,MAAM,GAAG,IAGX,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC9B,SAAS,oBAAoB,EAC7B,YAAY,MAAM,EAClB,OAAO,MAAM,KACX,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,GAAU,MAAM,SAAS,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAEtF,CAAC;AAEF,yCAAyC;AACzC,MAAM,WAAW,0BAA0B;IAC1C,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IACnC,2EAA2E;IAC3E,KAAK,EAAE,gBAAgB,CAAC;IACxB,kGAAkG;IAClG,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,GACvC,SAAS,oBAAoB,GAAG,YAAY,EAC5C,MAAM,SAAS,EACf,SAAS,0BAA0B,EACnC,KAAK,MAAM,KACT,OAAO,CAAC,mBAAmB,CAwD7B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,8BAA8B,GAC1C,OAAO,gBAAgB,EACvB,MAAM,SAAS,KACb,iBAoCF,CAAC"}
|
package/dist/auth/deps.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export interface AppDeps {
|
|
|
23
23
|
/** Get file/directory stats, or null if path doesn't exist. */
|
|
24
24
|
stat: (path: string) => Promise<StatResult | null>;
|
|
25
25
|
/** Read a file as text. */
|
|
26
|
-
|
|
26
|
+
read_text_file: (path: string) => Promise<string>;
|
|
27
27
|
/** Delete a file. */
|
|
28
28
|
delete_file: (path: string) => Promise<void>;
|
|
29
29
|
/** HMAC-SHA256 cookie signing keyring. */
|
package/dist/auth/deps.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACvB,+DAA+D;IAC/D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,2BAA2B;IAC3B,
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACvB,+DAA+D;IAC/D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,2BAA2B;IAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,qBAAqB;IACrB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,yBAAyB;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC"}
|
package/dist/auth/keyring.d.ts
CHANGED
|
@@ -59,6 +59,10 @@ export declare const create_keyring: (env_value: string | undefined) => Keyring
|
|
|
59
59
|
/**
|
|
60
60
|
* Validate key ring configuration.
|
|
61
61
|
*
|
|
62
|
+
* Returns an error when no keys are configured (undefined, empty string,
|
|
63
|
+
* or all-separator input like `'____'`), and for each key shorter than
|
|
64
|
+
* {@link MIN_KEY_LENGTH} characters.
|
|
65
|
+
*
|
|
62
66
|
* @param env_value - the SECRET_COOKIE_KEYS environment variable
|
|
63
67
|
* @returns array of validation errors (empty if valid)
|
|
64
68
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyring.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/keyring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB;;;OAGG;IACH,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;;;OAIG;IACH,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAAC;CACrF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,SAAS,KAAG,OAAO,GAAG,IAkCxE,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"keyring.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/keyring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB;;;OAGG;IACH,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;;;OAIG;IACH,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAAC;CACrF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,SAAS,KAAG,OAAO,GAAG,IAkCxE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,GAAG,SAAS,KAAG,KAAK,CAAC,MAAM,CAc5E,CAAC;AA6CF;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAC/B;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAC,GAC5B;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;CAAC,CAAC;AAEtC;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,GAAI,WAAW,MAAM,GAAG,SAAS,KAAG,sBAUxE,CAAC"}
|
package/dist/auth/keyring.js
CHANGED
|
@@ -73,11 +73,18 @@ export const create_keyring = (env_value) => {
|
|
|
73
73
|
/**
|
|
74
74
|
* Validate key ring configuration.
|
|
75
75
|
*
|
|
76
|
+
* Returns an error when no keys are configured (undefined, empty string,
|
|
77
|
+
* or all-separator input like `'____'`), and for each key shorter than
|
|
78
|
+
* {@link MIN_KEY_LENGTH} characters.
|
|
79
|
+
*
|
|
76
80
|
* @param env_value - the SECRET_COOKIE_KEYS environment variable
|
|
77
81
|
* @returns array of validation errors (empty if valid)
|
|
78
82
|
*/
|
|
79
83
|
export const validate_keyring = (env_value) => {
|
|
80
84
|
const keys = parse_keys(env_value);
|
|
85
|
+
if (keys.length === 0) {
|
|
86
|
+
return ['SECRET_COOKIE_KEYS is required'];
|
|
87
|
+
}
|
|
81
88
|
const errors = [];
|
|
82
89
|
for (const [i, key] of keys.entries()) {
|
|
83
90
|
if (key.length < MIN_KEY_LENGTH) {
|
package/dist/cli/config.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export declare const get_config_path: (runtime: Pick<EnvDeps, "env_get">, name:
|
|
|
33
33
|
* @param schema - Zod schema to validate against
|
|
34
34
|
* @returns parsed config, or null if file doesn't exist or is invalid
|
|
35
35
|
*/
|
|
36
|
-
export declare const load_config: <T>(runtime: FsReadDeps & LogDeps, path: string, schema: z.ZodType<T>) => Promise<T | null>;
|
|
36
|
+
export declare const load_config: <T>(runtime: Pick<FsReadDeps, "stat" | "read_text_file"> & LogDeps, path: string, schema: z.ZodType<T>) => Promise<T | null>;
|
|
37
37
|
/**
|
|
38
38
|
* Save CLI configuration to a JSON file.
|
|
39
39
|
*
|
|
@@ -44,5 +44,5 @@ export declare const load_config: <T>(runtime: FsReadDeps & LogDeps, path: strin
|
|
|
44
44
|
* @param dir - directory containing the config file (created if missing)
|
|
45
45
|
* @param config - configuration to save
|
|
46
46
|
*/
|
|
47
|
-
export declare const save_config: <T>(runtime: FsWriteDeps, path: string, dir: string, config: T) => Promise<void>;
|
|
47
|
+
export declare const save_config: <T>(runtime: Pick<FsWriteDeps, "mkdir" | "write_text_file">, path: string, dir: string, config: T) => Promise<void>;
|
|
48
48
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/cli/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/cli/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAE3B,OAAO,KAAK,EAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAElF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,IAGtF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,IAG1F,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,EAClC,SAAS,UAAU,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/cli/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAE3B,OAAO,KAAK,EAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAElF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,IAGtF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,IAG1F,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,EAClC,SAAS,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG,OAAO,EAC9D,MAAM,MAAM,EACZ,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAClB,OAAO,CAAC,CAAC,GAAG,IAAI,CAoBlB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,EAClC,SAAS,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,CAAC,EACvD,MAAM,MAAM,EACZ,KAAK,MAAM,EACX,QAAQ,CAAC,KACP,OAAO,CAAC,IAAI,CAOd,CAAC"}
|
package/dist/cli/config.js
CHANGED
|
@@ -44,7 +44,7 @@ export const load_config = async (runtime, path, schema) => {
|
|
|
44
44
|
return null;
|
|
45
45
|
}
|
|
46
46
|
try {
|
|
47
|
-
const content = await runtime.
|
|
47
|
+
const content = await runtime.read_text_file(path);
|
|
48
48
|
const parsed = JSON.parse(content);
|
|
49
49
|
const result = schema.safeParse(parsed);
|
|
50
50
|
if (!result.success) {
|
|
@@ -73,5 +73,5 @@ export const save_config = async (runtime, path, dir, config) => {
|
|
|
73
73
|
await runtime.mkdir(dir, { recursive: true });
|
|
74
74
|
// write with pretty formatting
|
|
75
75
|
const content = JSON.stringify(config, null, '\t');
|
|
76
|
-
await runtime.
|
|
76
|
+
await runtime.write_text_file(path, content + '\n');
|
|
77
77
|
};
|
package/dist/cli/daemon.d.ts
CHANGED
|
@@ -40,7 +40,7 @@ export declare const get_daemon_info_path: (runtime: Pick<EnvDeps, "env_get">, n
|
|
|
40
40
|
* @param name - application name
|
|
41
41
|
* @param info - daemon info to write
|
|
42
42
|
*/
|
|
43
|
-
export declare const write_daemon_info: (runtime: Pick<EnvDeps, "env_get"> & FsWriteDeps, name: string, info: DaemonInfo) => Promise<void>;
|
|
43
|
+
export declare const write_daemon_info: (runtime: Pick<EnvDeps, "env_get"> & Pick<FsWriteDeps, "mkdir" | "write_text_file" | "rename">, name: string, info: DaemonInfo) => Promise<void>;
|
|
44
44
|
/**
|
|
45
45
|
* Read and validate daemon info from the PID file.
|
|
46
46
|
*
|
|
@@ -48,7 +48,7 @@ export declare const write_daemon_info: (runtime: Pick<EnvDeps, "env_get"> & FsW
|
|
|
48
48
|
* @param name - application name
|
|
49
49
|
* @returns parsed daemon info, or null if missing or invalid
|
|
50
50
|
*/
|
|
51
|
-
export declare const read_daemon_info: (runtime: Pick<EnvDeps, "env_get"> & FsReadDeps & LogDeps, name: string) => Promise<DaemonInfo | null>;
|
|
51
|
+
export declare const read_daemon_info: (runtime: Pick<EnvDeps, "env_get"> & Pick<FsReadDeps, "stat" | "read_text_file"> & LogDeps, name: string) => Promise<DaemonInfo | null>;
|
|
52
52
|
/**
|
|
53
53
|
* Check if a process is running by PID.
|
|
54
54
|
*
|
|
@@ -78,5 +78,5 @@ export interface StopDaemonResult {
|
|
|
78
78
|
* @param name - application name
|
|
79
79
|
* @returns result describing the outcome
|
|
80
80
|
*/
|
|
81
|
-
export declare const stop_daemon: (runtime: Pick<EnvDeps, "env_get"> & FsReadDeps & FsRemoveDeps & CommandDeps & LogDeps, name: string) => Promise<StopDaemonResult>;
|
|
81
|
+
export declare const stop_daemon: (runtime: Pick<EnvDeps, "env_get"> & Pick<FsReadDeps, "stat" | "read_text_file"> & FsRemoveDeps & CommandDeps & LogDeps, name: string) => Promise<StopDaemonResult>;
|
|
82
82
|
//# sourceMappingURL=daemon.d.ts.map
|
package/dist/cli/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/cli/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,eAAO,MAAM,UAAU;IACtB,sBAAsB;;IAEtB,yBAAyB;;IAEzB,uCAAuC;;IAEvC,yCAAyC;;IAEzC,0CAA0C;;kBAEzC,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,MAAM,MAAM,KACV,MAAM,GAAG,IAGX,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC7B,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/cli/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,eAAO,MAAM,UAAU;IACtB,sBAAsB;;IAEtB,yBAAyB;;IAEzB,uCAAuC;;IAEvC,yCAAyC;;IAEzC,0CAA0C;;kBAEzC,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,MAAM,MAAM,KACV,MAAM,GAAG,IAGX,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC7B,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,GAAG,QAAQ,CAAC,EAC7F,MAAM,MAAM,EACZ,MAAM,UAAU,KACd,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC5B,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG,OAAO,EACzF,MAAM,MAAM,KACV,OAAO,CAAC,UAAU,GAAG,IAAI,CAwB3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,SAAS,WAAW,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,OAAO,CAG1F,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GACvB,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAChC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAC3C,YAAY,GACZ,WAAW,GACX,OAAO,EACR,MAAM,MAAM,KACV,OAAO,CAAC,gBAAgB,CA2C1B,CAAC"}
|
package/dist/cli/daemon.js
CHANGED
|
@@ -71,7 +71,7 @@ export const read_daemon_info = async (runtime, name) => {
|
|
|
71
71
|
return null;
|
|
72
72
|
}
|
|
73
73
|
try {
|
|
74
|
-
const content = await runtime.
|
|
74
|
+
const content = await runtime.read_text_file(daemon_path);
|
|
75
75
|
const parsed = JSON.parse(content);
|
|
76
76
|
const result = DaemonInfo.safeParse(parsed);
|
|
77
77
|
if (!result.success) {
|
package/dist/dev/setup.d.ts
CHANGED
|
@@ -99,7 +99,7 @@ export declare const generate_random_key: (deps: CommandDeps) => Promise<string>
|
|
|
99
99
|
* @param name - the variable name to read
|
|
100
100
|
* @returns the value, or `undefined` if the file or variable doesn't exist
|
|
101
101
|
*/
|
|
102
|
-
export declare const read_env_var: (deps: FsReadDeps, env_path: string, name: string) => Promise<string | undefined>;
|
|
102
|
+
export declare const read_env_var: (deps: Pick<FsReadDeps, "stat" | "read_text_file">, env_path: string, name: string) => Promise<string | undefined>;
|
|
103
103
|
/**
|
|
104
104
|
* Create an env file from its example template, auto-generating `SECRET_COOKIE_KEYS`.
|
|
105
105
|
*
|
package/dist/dev/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/dev/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACX,WAAW,EACX,aAAa,EACb,OAAO,EACP,UAAU,EACV,YAAY,EACZ,WAAW,EACX,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,WAIlC,CAAC;AAEF,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC9B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAChC,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC7B,+CAA+C;IAC/C,KAAK,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,qEAAqE;IACrE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,0BAA0B;IAC1C,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,qCAAqC;AACrC,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,oCAAoC;AACpC,MAAM,WAAW,oBAAoB;IACpC,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAID;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IAQpD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAU,MAAM,WAAW,KAAG,OAAO,CAAC,MAAM,CAI3E,CAAC;AAIF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACxB,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/dev/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACX,WAAW,EACX,aAAa,EACb,OAAO,EACP,UAAU,EACV,YAAY,EACZ,WAAW,EACX,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,WAIlC,CAAC;AAEF,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC9B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAChC,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC7B,+CAA+C;IAC/C,KAAK,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,qEAAqE;IACrE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,0BAA0B;IAC1C,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,qCAAqC;AACrC,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,oCAAoC;AACpC,MAAM,WAAW,oBAAoB;IACpC,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB;AAID;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IAQpD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAU,MAAM,WAAW,KAAG,OAAO,CAAC,MAAM,CAI3E,CAAC;AAIF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACxB,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,EACjD,UAAU,MAAM,EAChB,MAAM,MAAM,KACV,OAAO,CAAC,MAAM,GAAG,SAAS,CAU5B,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GAC1B,MAAM,UAAU,GAAG,WAAW,GAAG,WAAW,EAC5C,UAAU,MAAM,EAChB,cAAc,MAAM,EACpB,UAAU,eAAe,KACvB,OAAO,CAAC,cAAc,CAiDxB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GACjC,MAAM,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,EACtD,UAAU,MAAM,EAChB,UAAU,0BAA0B,KAClC,OAAO,CAAC,gBAAgB,CA0B1B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GACjC,MAAM,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,EACrE,UAAU,MAAM,EAChB,UAAU,0BAA0B,KAClC,OAAO,CAAC,gBAAgB,CAoB1B,CAAC;AAIF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC3B,MAAM,WAAW,EACjB,SAAS,MAAM,EACf,UAAU,qBAAqB,KAC7B,OAAO,CAAC,aAAa,CAgBvB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GAC1B,MAAM,WAAW,GAAG,UAAU,GAAG,YAAY,EAC7C,cAAc,MAAM,EACpB,UAAU,oBAAoB,KAC5B,OAAO,CAAC,aAAa,CA8CvB,CAAC"}
|
package/dist/dev/setup.js
CHANGED
|
@@ -56,7 +56,7 @@ export const read_env_var = async (deps, env_path, name) => {
|
|
|
56
56
|
if (!stat?.is_file)
|
|
57
57
|
return undefined;
|
|
58
58
|
try {
|
|
59
|
-
const content = await deps.
|
|
59
|
+
const content = await deps.read_text_file(env_path);
|
|
60
60
|
const match = new RegExp(`^${name}=(.+)$`, 'm').exec(content);
|
|
61
61
|
return match?.[1]?.trim();
|
|
62
62
|
}
|
|
@@ -88,7 +88,7 @@ export const setup_env_file = async (deps, env_path, example_path, options) => {
|
|
|
88
88
|
const stat = await deps.stat(env_path);
|
|
89
89
|
if (stat?.is_file) {
|
|
90
90
|
// file exists — backfill any empty values
|
|
91
|
-
let content = await deps.
|
|
91
|
+
let content = await deps.read_text_file(env_path);
|
|
92
92
|
let changed = false;
|
|
93
93
|
for (const [key, generate] of Object.entries(replacements)) {
|
|
94
94
|
const pattern = new RegExp(`^${key}=$`, 'm');
|
|
@@ -100,7 +100,7 @@ export const setup_env_file = async (deps, env_path, example_path, options) => {
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
if (changed) {
|
|
103
|
-
await deps.
|
|
103
|
+
await deps.write_text_file(env_path, content);
|
|
104
104
|
if (set_permissions)
|
|
105
105
|
await set_permissions(env_path, 0o600);
|
|
106
106
|
}
|
|
@@ -110,7 +110,7 @@ export const setup_env_file = async (deps, env_path, example_path, options) => {
|
|
|
110
110
|
return { created: false, updated: changed, path: env_path };
|
|
111
111
|
}
|
|
112
112
|
// create from example
|
|
113
|
-
let content = await deps.
|
|
113
|
+
let content = await deps.read_text_file(example_path);
|
|
114
114
|
for (const [key, generate] of Object.entries(replacements)) {
|
|
115
115
|
const pattern = new RegExp(`^${key}=$`, 'm');
|
|
116
116
|
if (pattern.test(content)) {
|
|
@@ -118,7 +118,7 @@ export const setup_env_file = async (deps, env_path, example_path, options) => {
|
|
|
118
118
|
content = content.replace(pattern, `${key}=${value}`);
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
-
await deps.
|
|
121
|
+
await deps.write_text_file(env_path, content);
|
|
122
122
|
if (set_permissions)
|
|
123
123
|
await set_permissions(env_path, 0o600);
|
|
124
124
|
log.ok(`Created ${env_path} with generated secrets`);
|
|
@@ -154,7 +154,7 @@ export const setup_bootstrap_token = async (deps, app_name, options) => {
|
|
|
154
154
|
if (set_permissions)
|
|
155
155
|
await set_permissions(state_dir, 0o700);
|
|
156
156
|
const key = await generate_random_key(deps);
|
|
157
|
-
await deps.
|
|
157
|
+
await deps.write_text_file(token_path, key + '\n');
|
|
158
158
|
if (set_permissions)
|
|
159
159
|
await set_permissions(token_path, 0o600);
|
|
160
160
|
log.ok(`Created ~/.${app_name}/secret_bootstrap_token (one-shot, deleted after first use)`);
|
package/dist/env/dotenv.d.ts
CHANGED
|
@@ -17,9 +17,9 @@ export declare const parse_dotenv: (content: string) => Record<string, string>;
|
|
|
17
17
|
/**
|
|
18
18
|
* Load and parse an env file.
|
|
19
19
|
*
|
|
20
|
-
* @param runtime - runtime with `
|
|
20
|
+
* @param runtime - runtime with `read_text_file` capability
|
|
21
21
|
* @param path - path to env file
|
|
22
22
|
* @returns parsed env record, or null if file doesn't exist
|
|
23
23
|
*/
|
|
24
|
-
export declare const load_env_file: (runtime: Pick<FsReadDeps, "
|
|
24
|
+
export declare const load_env_file: (runtime: Pick<FsReadDeps, "read_text_file">, path: string) => Promise<Record<string, string> | null>;
|
|
25
25
|
//# sourceMappingURL=dotenv.d.ts.map
|
package/dist/env/dotenv.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dotenv.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/env/dotenv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAqBnE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACzB,SAAS,IAAI,CAAC,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"dotenv.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/env/dotenv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAqBnE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACzB,SAAS,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAC3C,MAAM,MAAM,KACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAOvC,CAAC"}
|
package/dist/env/dotenv.js
CHANGED
|
@@ -37,13 +37,13 @@ export const parse_dotenv = (content) => {
|
|
|
37
37
|
/**
|
|
38
38
|
* Load and parse an env file.
|
|
39
39
|
*
|
|
40
|
-
* @param runtime - runtime with `
|
|
40
|
+
* @param runtime - runtime with `read_text_file` capability
|
|
41
41
|
* @param path - path to env file
|
|
42
42
|
* @returns parsed env record, or null if file doesn't exist
|
|
43
43
|
*/
|
|
44
44
|
export const load_env_file = async (runtime, path) => {
|
|
45
45
|
try {
|
|
46
|
-
const content = await runtime.
|
|
46
|
+
const content = await runtime.read_text_file(path);
|
|
47
47
|
return parse_dotenv(content);
|
|
48
48
|
}
|
|
49
49
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deno.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deno.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"deno.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deno.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;AAsCtE;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,KAAG,WAqEhE,CAAC"}
|
package/dist/runtime/deno.js
CHANGED
|
@@ -36,8 +36,10 @@ export const create_deno_runtime = (args) => ({
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
mkdir: (path, options) => Deno.mkdir(path, options),
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
read_text_file: (path) => Deno.readTextFile(path),
|
|
40
|
+
read_file: (path) => Deno.readFile(path),
|
|
41
|
+
write_text_file: (path, content) => Deno.writeTextFile(path, content),
|
|
42
|
+
write_file: (path, data) => Deno.writeFile(path, data),
|
|
41
43
|
rename: (old_path, new_path) => Deno.rename(old_path, new_path),
|
|
42
44
|
remove: (path, options) => Deno.remove(path, options),
|
|
43
45
|
// === Local Commands ===
|
package/dist/runtime/deps.d.ts
CHANGED
|
@@ -39,7 +39,9 @@ export interface FsReadDeps {
|
|
|
39
39
|
/** Get file/directory stats, or null if path doesn't exist. */
|
|
40
40
|
stat: (path: string) => Promise<StatResult | null>;
|
|
41
41
|
/** Read a file as text. */
|
|
42
|
-
|
|
42
|
+
read_text_file: (path: string) => Promise<string>;
|
|
43
|
+
/** Read a file as bytes. */
|
|
44
|
+
read_file: (path: string) => Promise<Uint8Array>;
|
|
43
45
|
}
|
|
44
46
|
/**
|
|
45
47
|
* File system write operations.
|
|
@@ -50,7 +52,9 @@ export interface FsWriteDeps {
|
|
|
50
52
|
recursive?: boolean;
|
|
51
53
|
}) => Promise<void>;
|
|
52
54
|
/** Write text to a file. */
|
|
53
|
-
|
|
55
|
+
write_text_file: (path: string, content: string) => Promise<void>;
|
|
56
|
+
/** Write bytes to a file. */
|
|
57
|
+
write_file: (path: string, data: Uint8Array) => Promise<void>;
|
|
54
58
|
/** Rename (move) a file. */
|
|
55
59
|
rename: (old_path: string, new_path: string) => Promise<void>;
|
|
56
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACvB,yCAAyC;IACzC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9C,mCAAmC;IACnC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,+DAA+D;IAC/D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,2BAA2B;IAC3B,
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deps.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/fs.d.ts
CHANGED
|
@@ -11,5 +11,5 @@ import type { FsWriteDeps } from './deps.js';
|
|
|
11
11
|
* @param path - destination file path
|
|
12
12
|
* @param content - file contents to write
|
|
13
13
|
*/
|
|
14
|
-
export declare const write_file_atomic: (deps: Pick<FsWriteDeps, "
|
|
14
|
+
export declare const write_file_atomic: (deps: Pick<FsWriteDeps, "write_text_file" | "rename">, path: string, content: string) => Promise<void>;
|
|
15
15
|
//# sourceMappingURL=fs.d.ts.map
|
package/dist/runtime/fs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/fs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC7B,MAAM,IAAI,CAAC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/fs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC7B,MAAM,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,QAAQ,CAAC,EACrD,MAAM,MAAM,EACZ,SAAS,MAAM,KACb,OAAO,CAAC,IAAI,CAId,CAAC"}
|
package/dist/runtime/fs.js
CHANGED
package/dist/runtime/mock.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface MockRuntime extends RuntimeDeps {
|
|
|
16
16
|
mock_env: Map<string, string>;
|
|
17
17
|
/** Mock file system (path -> content). */
|
|
18
18
|
mock_fs: Map<string, string>;
|
|
19
|
+
/** Mock binary file system (path -> bytes). */
|
|
20
|
+
mock_fs_bytes: Map<string, Uint8Array>;
|
|
19
21
|
/** Mock directories that exist. */
|
|
20
22
|
mock_dirs: Set<string>;
|
|
21
23
|
/** Exit calls recorded (exit codes). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAc,aAAa,EAAC,MAAM,WAAW,CAAC;AAItE;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC/C,kCAAkC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mCAAmC;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,yBAAyB;IACzB,aAAa,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACzD,sCAAsC;IACtC,qBAAqB,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACjE,8BAA8B;IAC9B,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,4CAA4C;IAC5C,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,yCAAyC;IACzC,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAM,KAAK,CAAC,MAAM,CAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAc,aAAa,EAAC,MAAM,WAAW,CAAC;AAItE;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC/C,kCAAkC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+CAA+C;IAC/C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,mCAAmC;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,yBAAyB;IACzB,aAAa,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACzD,sCAAsC;IACtC,qBAAqB,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACjE,8BAA8B;IAC9B,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,4CAA4C;IAC5C,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,yCAAyC;IACzC,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAM,KAAK,CAAC,MAAM,CAAM,KAAG,WA8J9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,WAAW,KAAG,IAWzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,EAAE,OAAO,MAAM,KAAG,IAEpE,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;CAKxB"}
|
package/dist/runtime/mock.js
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
export const create_mock_runtime = (args = []) => {
|
|
29
29
|
const mock_env = new Map();
|
|
30
30
|
const mock_fs = new Map();
|
|
31
|
+
const mock_fs_bytes = new Map();
|
|
31
32
|
const mock_dirs = new Set();
|
|
32
33
|
const exit_calls = [];
|
|
33
34
|
const command_calls = [];
|
|
@@ -39,6 +40,7 @@ export const create_mock_runtime = (args = []) => {
|
|
|
39
40
|
args,
|
|
40
41
|
mock_env,
|
|
41
42
|
mock_fs,
|
|
43
|
+
mock_fs_bytes,
|
|
42
44
|
mock_dirs,
|
|
43
45
|
exit_calls,
|
|
44
46
|
command_calls,
|
|
@@ -65,7 +67,7 @@ export const create_mock_runtime = (args = []) => {
|
|
|
65
67
|
},
|
|
66
68
|
// === Local File System ===
|
|
67
69
|
stat: async (path) => {
|
|
68
|
-
if (mock_fs.has(path)) {
|
|
70
|
+
if (mock_fs.has(path) || mock_fs_bytes.has(path)) {
|
|
69
71
|
return { is_file: true, is_directory: false };
|
|
70
72
|
}
|
|
71
73
|
if (mock_dirs.has(path)) {
|
|
@@ -86,27 +88,49 @@ export const create_mock_runtime = (args = []) => {
|
|
|
86
88
|
mock_dirs.add(path);
|
|
87
89
|
}
|
|
88
90
|
},
|
|
91
|
+
read_text_file: async (path) => {
|
|
92
|
+
const content = mock_fs.get(path);
|
|
93
|
+
if (content !== undefined)
|
|
94
|
+
return content;
|
|
95
|
+
const bytes = mock_fs_bytes.get(path);
|
|
96
|
+
if (bytes !== undefined)
|
|
97
|
+
return new TextDecoder().decode(bytes);
|
|
98
|
+
const error = new Error(`ENOENT: no such file or directory: ${path}`);
|
|
99
|
+
error.code = 'ENOENT';
|
|
100
|
+
throw error;
|
|
101
|
+
},
|
|
89
102
|
read_file: async (path) => {
|
|
103
|
+
const bytes = mock_fs_bytes.get(path);
|
|
104
|
+
if (bytes !== undefined)
|
|
105
|
+
return bytes;
|
|
90
106
|
const content = mock_fs.get(path);
|
|
91
|
-
if (content
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return content;
|
|
107
|
+
if (content !== undefined)
|
|
108
|
+
return new TextEncoder().encode(content);
|
|
109
|
+
const error = new Error(`ENOENT: no such file or directory: ${path}`);
|
|
110
|
+
error.code = 'ENOENT';
|
|
111
|
+
throw error;
|
|
97
112
|
},
|
|
98
|
-
|
|
113
|
+
write_text_file: async (path, content) => {
|
|
99
114
|
mock_fs.set(path, content);
|
|
100
115
|
},
|
|
116
|
+
write_file: async (path, data) => {
|
|
117
|
+
mock_fs_bytes.set(path, data);
|
|
118
|
+
},
|
|
101
119
|
rename: async (old_path, new_path) => {
|
|
102
120
|
const content = mock_fs.get(old_path);
|
|
103
121
|
if (content !== undefined) {
|
|
104
122
|
mock_fs.set(new_path, content);
|
|
105
123
|
mock_fs.delete(old_path);
|
|
106
124
|
}
|
|
125
|
+
const bytes = mock_fs_bytes.get(old_path);
|
|
126
|
+
if (bytes !== undefined) {
|
|
127
|
+
mock_fs_bytes.set(new_path, bytes);
|
|
128
|
+
mock_fs_bytes.delete(old_path);
|
|
129
|
+
}
|
|
107
130
|
},
|
|
108
131
|
remove: async (path, options) => {
|
|
109
132
|
mock_fs.delete(path);
|
|
133
|
+
mock_fs_bytes.delete(path);
|
|
110
134
|
mock_dirs.delete(path);
|
|
111
135
|
if (options?.recursive) {
|
|
112
136
|
const prefix = path.endsWith('/') ? path : path + '/';
|
|
@@ -114,6 +138,10 @@ export const create_mock_runtime = (args = []) => {
|
|
|
114
138
|
if (key.startsWith(prefix))
|
|
115
139
|
mock_fs.delete(key);
|
|
116
140
|
}
|
|
141
|
+
for (const key of mock_fs_bytes.keys()) {
|
|
142
|
+
if (key.startsWith(prefix))
|
|
143
|
+
mock_fs_bytes.delete(key);
|
|
144
|
+
}
|
|
117
145
|
for (const key of mock_dirs) {
|
|
118
146
|
if (key.startsWith(prefix))
|
|
119
147
|
mock_dirs.delete(key);
|
|
@@ -163,6 +191,7 @@ export const create_mock_runtime = (args = []) => {
|
|
|
163
191
|
export const reset_mock_runtime = (runtime) => {
|
|
164
192
|
runtime.mock_env.clear();
|
|
165
193
|
runtime.mock_fs.clear();
|
|
194
|
+
runtime.mock_fs_bytes.clear();
|
|
166
195
|
runtime.mock_dirs.clear();
|
|
167
196
|
runtime.exit_calls.length = 0;
|
|
168
197
|
runtime.command_calls.length = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC/B,OAAM,aAAa,CAAC,MAAM,CAAyB,KACjD,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC/B,OAAM,aAAa,CAAC,MAAM,CAAyB,KACjD,WA+GD,CAAC"}
|
package/dist/runtime/node.js
CHANGED
|
@@ -40,8 +40,10 @@ export const create_node_runtime = (args = process.argv.slice(2)) => ({
|
|
|
40
40
|
mkdir: async (path, options) => {
|
|
41
41
|
await mkdir(path, options);
|
|
42
42
|
},
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
read_text_file: (path) => readFile(path, 'utf-8'),
|
|
44
|
+
read_file: (path) => readFile(path).then((buf) => new Uint8Array(buf)),
|
|
45
|
+
write_text_file: (path, content) => writeFile(path, content, 'utf-8'),
|
|
46
|
+
write_file: (path, data) => writeFile(path, data),
|
|
45
47
|
rename: (old_path, new_path) => rename(old_path, new_path),
|
|
46
48
|
remove: (path, options) => rm(path, options),
|
|
47
49
|
// === Local Commands ===
|
|
@@ -43,7 +43,7 @@ export interface CreateAppBackendOptions {
|
|
|
43
43
|
/** Get file/directory stats, or null if path doesn't exist. */
|
|
44
44
|
stat: (path: string) => Promise<StatResult | null>;
|
|
45
45
|
/** Read a file as text. */
|
|
46
|
-
|
|
46
|
+
read_text_file: (path: string) => Promise<string>;
|
|
47
47
|
/** Delete a file. */
|
|
48
48
|
delete_file: (path: string) => Promise<void>;
|
|
49
49
|
/** Database connection URL (`postgres://`, `file://`, or `memory://`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app_backend.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/server/app_backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAE/C,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAiB,KAAK,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAItE;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3D,iEAAiE;IACjE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACvC,+DAA+D;IAC/D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,2BAA2B;IAC3B,
|
|
1
|
+
{"version":3,"file":"app_backend.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/server/app_backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAE/C,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAiB,KAAK,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAItE;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3D,iEAAiE;IACjE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACvC,+DAA+D;IAC/D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,2BAA2B;IAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,qBAAqB;IACrB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,iFAAiF;IACjF,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAChD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAU,SAAS,uBAAuB,KAAG,OAAO,CAAC,UAAU,CAa7F,CAAC"}
|
|
@@ -24,7 +24,7 @@ import { create_db } from '../db/create_db.js';
|
|
|
24
24
|
* @returns app backend with deps, database metadata, and migration results
|
|
25
25
|
*/
|
|
26
26
|
export const create_app_backend = async (options) => {
|
|
27
|
-
const { database_url, keyring, password, stat,
|
|
27
|
+
const { database_url, keyring, password, stat, read_text_file, delete_file } = options;
|
|
28
28
|
const log = options.log ?? new Logger('server');
|
|
29
29
|
const on_audit_event = options.on_audit_event ?? (() => { }); // eslint-disable-line @typescript-eslint/no-empty-function
|
|
30
30
|
const { db, close, db_type, db_name } = await create_db(database_url);
|
|
@@ -34,6 +34,6 @@ export const create_app_backend = async (options) => {
|
|
|
34
34
|
db_name,
|
|
35
35
|
migration_results,
|
|
36
36
|
close,
|
|
37
|
-
deps: { keyring, password, db, stat,
|
|
37
|
+
deps: { keyring, password, db, stat, read_text_file, delete_file, log, on_audit_event },
|
|
38
38
|
};
|
|
39
39
|
};
|
|
@@ -95,7 +95,7 @@ export const create_test_app_server = async (options) => {
|
|
|
95
95
|
}
|
|
96
96
|
const fs_stubs = {
|
|
97
97
|
stat: async () => null,
|
|
98
|
-
|
|
98
|
+
read_text_file: async () => '',
|
|
99
99
|
delete_file: async (_path) => { }, // eslint-disable-line @typescript-eslint/no-empty-function
|
|
100
100
|
};
|
|
101
101
|
let backend;
|
package/dist/testing/stubs.js
CHANGED
|
@@ -83,7 +83,7 @@ const stub_db = create_noop_stub('stub_db');
|
|
|
83
83
|
/** Stub `AppDeps` for auth surface tests — throws on any method access. */
|
|
84
84
|
export const stub_app_deps = {
|
|
85
85
|
stat: create_throwing_stub('stat'),
|
|
86
|
-
|
|
86
|
+
read_text_file: create_throwing_stub('read_text_file'),
|
|
87
87
|
delete_file: create_throwing_stub('delete_file'),
|
|
88
88
|
keyring: create_throwing_stub('keyring'),
|
|
89
89
|
password: create_throwing_stub('password'),
|
|
@@ -98,7 +98,7 @@ export const stub_app_deps = {
|
|
|
98
98
|
*/
|
|
99
99
|
export const create_stub_app_deps = () => ({
|
|
100
100
|
stat: async () => null,
|
|
101
|
-
|
|
101
|
+
read_text_file: async () => '',
|
|
102
102
|
delete_file: async (_path) => { }, // eslint-disable-line @typescript-eslint/no-empty-function
|
|
103
103
|
keyring: create_noop_stub('keyring'),
|
|
104
104
|
password: create_noop_stub('password'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fuzdev/fuz_app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "fullstack app library",
|
|
5
5
|
"glyph": "🗝",
|
|
6
6
|
"logo": "logo.svg",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@fuzdev/fuz_css": "^0.58.0",
|
|
48
48
|
"@fuzdev/fuz_ui": "^0.191.2",
|
|
49
49
|
"@fuzdev/fuz_util": "^0.55.0",
|
|
50
|
-
"@fuzdev/gro": "^0.197.
|
|
50
|
+
"@fuzdev/gro": "^0.197.3",
|
|
51
51
|
"@jridgewell/trace-mapping": "^0.3.31",
|
|
52
52
|
"@node-rs/argon2": "^2.0.2",
|
|
53
53
|
"@ryanatkn/eslint-config": "^0.10.1",
|