pipework 0.14.1 → 0.16.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/CHANGELOG.md +15 -0
- package/REFERENCE.md +159 -2
- package/dist/REFERENCE.md +159 -2
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +12 -10
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/core/config/base-dir.d.ts +6 -0
- package/dist/core/config/base-dir.d.ts.map +1 -0
- package/dist/core/config/base-dir.js +21 -0
- package/dist/core/config/base-dir.js.map +1 -0
- package/dist/core/config/discover.d.ts.map +1 -1
- package/dist/core/config/discover.js +2 -15
- package/dist/core/config/discover.js.map +1 -1
- package/dist/core/config/env-types.d.ts +70 -0
- package/dist/core/config/env-types.d.ts.map +1 -1
- package/dist/core/config/env.d.ts.map +1 -1
- package/dist/core/config/env.js +10 -6
- package/dist/core/config/env.js.map +1 -1
- package/dist/core/config/import-config.d.ts +3 -0
- package/dist/core/config/import-config.d.ts.map +1 -0
- package/dist/core/config/import-config.js +34 -0
- package/dist/core/config/import-config.js.map +1 -0
- package/dist/core/config/load.d.ts +4 -0
- package/dist/core/config/load.d.ts.map +1 -1
- package/dist/core/config/load.js +14 -5
- package/dist/core/config/load.js.map +1 -1
- package/dist/core/config/resolve.d.ts.map +1 -1
- package/dist/core/config/resolve.js +23 -1
- package/dist/core/config/resolve.js.map +1 -1
- package/dist/core/pipework.d.ts +19 -0
- package/dist/core/pipework.d.ts.map +1 -1
- package/dist/core/pipework.js +25 -0
- package/dist/core/pipework.js.map +1 -1
- package/dist/core/validation/queue-tables.d.ts +8 -0
- package/dist/core/validation/queue-tables.d.ts.map +1 -0
- package/dist/core/validation/queue-tables.js +53 -0
- package/dist/core/validation/queue-tables.js.map +1 -0
- package/dist/core/validation/rls-role.d.ts +16 -0
- package/dist/core/validation/rls-role.d.ts.map +1 -0
- package/dist/core/validation/rls-role.js +54 -0
- package/dist/core/validation/rls-role.js.map +1 -0
- package/dist/core/validation/startup.d.ts +2 -0
- package/dist/core/validation/startup.d.ts.map +1 -1
- package/dist/core/validation/startup.js +6 -0
- package/dist/core/validation/startup.js.map +1 -1
- package/dist/data/db/pool.d.ts +9 -0
- package/dist/data/db/pool.d.ts.map +1 -1
- package/dist/data/db/pool.js +7 -0
- package/dist/data/db/pool.js.map +1 -1
- package/dist/data/migrate/applied.d.ts +21 -7
- package/dist/data/migrate/applied.d.ts.map +1 -1
- package/dist/data/migrate/applied.js +14 -14
- package/dist/data/migrate/applied.js.map +1 -1
- package/dist/data/migrate/apply.d.ts.map +1 -1
- package/dist/data/migrate/apply.js +37 -7
- package/dist/data/migrate/apply.js.map +1 -1
- package/dist/data/migrate/check.d.ts +9 -6
- package/dist/data/migrate/check.d.ts.map +1 -1
- package/dist/data/migrate/check.js +16 -7
- package/dist/data/migrate/check.js.map +1 -1
- package/dist/data/migrate/generate.d.ts +1 -1
- package/dist/data/migrate/generate.d.ts.map +1 -1
- package/dist/data/migrate/generate.js +15 -8
- package/dist/data/migrate/generate.js.map +1 -1
- package/dist/data/migrate/index.d.ts +1 -1
- package/dist/data/migrate/index.d.ts.map +1 -1
- package/dist/data/migrate/index.js +1 -1
- package/dist/data/migrate/index.js.map +1 -1
- package/dist/data/migrate/run.js +2 -2
- package/dist/data/migrate/run.js.map +1 -1
- package/dist/lint/resolver.d.ts.map +1 -1
- package/dist/lint/resolver.js +2 -11
- package/dist/lint/resolver.js.map +1 -1
- package/dist/test/setup.d.ts.map +1 -1
- package/dist/test/setup.js +33 -0
- package/dist/test/setup.js.map +1 -1
- package/dist/test/vitest-workspace.d.ts.map +1 -1
- package/dist/test/vitest-workspace.js +2 -11
- package/dist/test/vitest-workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,31 +1,100 @@
|
|
|
1
1
|
import type { Environment } from './schema.js';
|
|
2
2
|
interface EnvVarBase {
|
|
3
|
+
/** Redact the resolved value from logs and error messages (tokens, secrets). */
|
|
3
4
|
readonly sensitive?: boolean | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Per-environment fallback values, keyed by environment name. Always given
|
|
7
|
+
* as strings (they take the same parse path as a real environment variable);
|
|
8
|
+
* a variable that is set in the environment wins over any default here.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* PORT: { type: 'number', defaults: { development: '3000', test: '0' } }
|
|
12
|
+
*/
|
|
4
13
|
readonly defaults?: Partial<Record<Environment, string>> | undefined;
|
|
5
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* A string environment variable — resolved verbatim.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* S3_BUCKET: { type: 'string', required: true }
|
|
20
|
+
*/
|
|
6
21
|
export interface StringEnvVar extends EnvVarBase {
|
|
7
22
|
readonly type: 'string';
|
|
23
|
+
/** Fail startup when unset and no default applies. */
|
|
8
24
|
readonly required?: boolean | undefined;
|
|
25
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
9
26
|
readonly default?: string | undefined;
|
|
10
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* A number environment variable — parsed with a loud error on a non-numeric value.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* PORT: { type: 'number', default: 3000 }
|
|
33
|
+
*/
|
|
11
34
|
export interface NumberEnvVar extends EnvVarBase {
|
|
12
35
|
readonly type: 'number';
|
|
36
|
+
/** Fail startup when unset and no default applies. */
|
|
13
37
|
readonly required?: boolean | undefined;
|
|
38
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
14
39
|
readonly default?: number | undefined;
|
|
15
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* A boolean environment variable — accepts true/false/1/0, loud error otherwise.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* FEATURE_GRAPH: { type: 'boolean', default: false }
|
|
46
|
+
*/
|
|
16
47
|
export interface BooleanEnvVar extends EnvVarBase {
|
|
17
48
|
readonly type: 'boolean';
|
|
49
|
+
/** Fail startup when unset and no default applies. */
|
|
18
50
|
readonly required?: boolean | undefined;
|
|
51
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
19
52
|
readonly default?: boolean | undefined;
|
|
20
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* A string-array environment variable — the raw value split on `separator`
|
|
56
|
+
* (default `,`), each element trimmed.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* CORS_ORIGINS: { type: 'string[]', separator: ',', default: [] }
|
|
60
|
+
*/
|
|
21
61
|
export interface StringArrayEnvVar extends EnvVarBase {
|
|
22
62
|
readonly type: 'string[]';
|
|
63
|
+
/** Split character for the raw value (default ','). */
|
|
23
64
|
readonly separator?: string | undefined;
|
|
65
|
+
/** Fail startup when unset and no default applies. */
|
|
24
66
|
readonly required?: boolean | undefined;
|
|
67
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
25
68
|
readonly default?: readonly string[] | undefined;
|
|
26
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* One declared environment variable: its type, whether it is required, its
|
|
72
|
+
* fallbacks, and whether the value is sensitive. Declared under the `env`
|
|
73
|
+
* blueprint field; resolved once at config load and exposed typed on
|
|
74
|
+
* `manifold.env` — the canonical replacement for ad-hoc `process.env` reads.
|
|
75
|
+
*/
|
|
27
76
|
export type EnvVarDef = StringEnvVar | NumberEnvVar | BooleanEnvVar | StringArrayEnvVar;
|
|
77
|
+
/**
|
|
78
|
+
* The `env` blueprint field: environment-variable declarations keyed by
|
|
79
|
+
* variable name. Passing this map to `createManifold` is what types
|
|
80
|
+
* `manifold.env`.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* export default createManifold({
|
|
84
|
+
* databases: { app: { url: 'DATABASE_URL', testUrl: 'DATABASE_URL_TEST' } },
|
|
85
|
+
* env: {
|
|
86
|
+
* PORT: { type: 'number', defaults: { development: '3000', test: '0' } },
|
|
87
|
+
* S3_BUCKET: { type: 'string', required: true },
|
|
88
|
+
* API_TOKEN: { type: 'string', required: true, sensitive: true },
|
|
89
|
+
* CORS_ORIGINS: { type: 'string[]', default: [] },
|
|
90
|
+
* },
|
|
91
|
+
* })
|
|
92
|
+
* // manifold.env.PORT → number
|
|
93
|
+
* // manifold.env.S3_BUCKET → string
|
|
94
|
+
* // manifold.env.CORS_ORIGINS → string[]
|
|
95
|
+
*/
|
|
28
96
|
export type EnvDefs = Record<string, EnvVarDef>;
|
|
97
|
+
/** The resolved runtime type of one declaration: 'string' → string, 'number' → number, 'boolean' → boolean, 'string[]' → string[]. */
|
|
29
98
|
export type ResolvedEnvType<T extends EnvVarDef> = T extends {
|
|
30
99
|
readonly type: 'string';
|
|
31
100
|
} ? string : T extends {
|
|
@@ -35,6 +104,7 @@ export type ResolvedEnvType<T extends EnvVarDef> = T extends {
|
|
|
35
104
|
} ? boolean : T extends {
|
|
36
105
|
readonly type: 'string[]';
|
|
37
106
|
} ? string[] : never;
|
|
107
|
+
/** Maps a declaration map to the shape of `manifold.env` — each key typed by its declared `type`. */
|
|
38
108
|
export type ResolveEnvDefs<T extends EnvDefs> = {
|
|
39
109
|
readonly [K in keyof T]: ResolvedEnvType<T[K]>;
|
|
40
110
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-types.d.ts","sourceRoot":"","sources":["../../../src/core/config/env-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,UAAU,UAAU;IAClB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAA;CACrE;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACvC;AAED,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;CACjD;AAED,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,iBAAiB,CAAA;AAEvF,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAE/C,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,SAAS,IAC7C,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,MAAM,GAC9C,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,MAAM,GAC9C,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,OAAO,GAChD,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,MAAM,EAAE,GAClD,KAAK,CAAA;AAEP,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,OAAO,IAAI;IAC9C,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/C,CAAA"}
|
|
1
|
+
{"version":3,"file":"env-types.d.ts","sourceRoot":"","sources":["../../../src/core/config/env-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,UAAU,UAAU;IAClB,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAA;CACrE;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACvC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;CACjD;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,iBAAiB,CAAA;AAEvF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAE/C,sIAAsI;AACtI,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,SAAS,IAC7C,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,MAAM,GAC9C,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,MAAM,GAC9C,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,OAAO,GAChD,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,MAAM,EAAE,GAClD,KAAK,CAAA;AAEP,qGAAqG;AACrG,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,OAAO,IAAI;IAC9C,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/core/config/env.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/core/config/env.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAU/C"}
|
package/dist/core/config/env.js
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import { readFileSync, existsSync } from 'node:fs';
|
|
2
2
|
import { resolve, dirname } from 'node:path';
|
|
3
|
+
const ENV_FILES = ['.env.test.local', '.env.test', '.env.local', '.env'];
|
|
3
4
|
export function loadEnvFiles(cwd) {
|
|
4
5
|
const start = cwd ?? process.cwd();
|
|
5
6
|
const envDir = findEnvDir(start) ?? start;
|
|
6
|
-
loadFile
|
|
7
|
-
|
|
7
|
+
// First-set wins (loadFile never overwrites), so the machine-local,
|
|
8
|
+
// never-committed `.local` variant of each tier takes precedence over the
|
|
9
|
+
// committed file — the standard dotenv convention.
|
|
10
|
+
for (const file of ENV_FILES) {
|
|
11
|
+
loadFile(resolve(envDir, file));
|
|
12
|
+
}
|
|
8
13
|
}
|
|
9
14
|
function findEnvDir(from) {
|
|
15
|
+
const hasEnvFile = (dir) => ENV_FILES.some(f => existsSync(resolve(dir, f)));
|
|
10
16
|
let dir = resolve(from);
|
|
11
17
|
let parent = dirname(dir);
|
|
12
18
|
while (dir !== parent) {
|
|
13
|
-
if (
|
|
19
|
+
if (hasEnvFile(dir))
|
|
14
20
|
return dir;
|
|
15
|
-
}
|
|
16
21
|
dir = parent;
|
|
17
22
|
parent = dirname(dir);
|
|
18
23
|
}
|
|
19
|
-
if (
|
|
24
|
+
if (hasEnvFile(dir))
|
|
20
25
|
return dir;
|
|
21
|
-
}
|
|
22
26
|
return null;
|
|
23
27
|
}
|
|
24
28
|
function loadFile(path) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/core/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,KAAK,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAA;IAEzC,
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/core/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,MAAM,SAAS,GAAG,CAAC,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;AAExE,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,KAAK,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAA;IAEzC,oEAAoE;IACpE,0EAA0E;IAC1E,mDAAmD;IACnD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;IACjC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,UAAU,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACzB,OAAO,GAAG,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAA;QAC/B,GAAG,GAAG,MAAM,CAAA;QACZ,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAA;IAC/B,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAM;IAE7B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAEvD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,SAAQ;QAE1B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1C,IAAI,GAAG,KAAK,EAAE;YAAE,SAAQ;QAExB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,SAAQ;QAE5C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-config.d.ts","sourceRoot":"","sources":["../../../src/core/config/import-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAS9C,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwBxE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { ConfigError } from './errors.js';
|
|
4
|
+
import { setConfigBaseDir, clearConfigBaseDir } from './base-dir.js';
|
|
5
|
+
// The single import-and-validate chokepoint for pipework.config.ts. Every
|
|
6
|
+
// importer (discoverInstance, the vitest config resolver, the eslint config
|
|
7
|
+
// resolver) goes through here so relative `migrations`/`schema` paths always
|
|
8
|
+
// resolve against the config file's directory, whichever entry path loads the
|
|
9
|
+
// config first in a process.
|
|
10
|
+
export async function importConfig(configPath) {
|
|
11
|
+
setConfigBaseDir(dirname(configPath));
|
|
12
|
+
try {
|
|
13
|
+
const mod = await import(pathToFileURL(configPath).href);
|
|
14
|
+
const exported = mod['default'] ?? mod;
|
|
15
|
+
if (!isManifold(exported)) {
|
|
16
|
+
throw new ConfigError(`pipework.config.ts must export a Pipework instance as its default export.`, `Your config should look like:\n\n` +
|
|
17
|
+
` import { createManifold } from 'pipework'\n\n` +
|
|
18
|
+
` export default createManifold({\n` +
|
|
19
|
+
` databases: { app: { url: 'DATABASE_URL' } },\n` +
|
|
20
|
+
` })\n`);
|
|
21
|
+
}
|
|
22
|
+
return exported;
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
// An ESM cache hit re-enters here without re-running loadConfig (the
|
|
26
|
+
// consume). Clear unconditionally so the slot cannot leak into a later
|
|
27
|
+
// directly-constructed loadConfig.
|
|
28
|
+
clearConfigBaseDir();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function isManifold(v) {
|
|
32
|
+
return typeof v === 'object' && v !== null && 'pool' in v && 'config' in v;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=import-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-config.js","sourceRoot":"","sources":["../../../src/core/config/import-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAEpE,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAkB;IACnD,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAA4B,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAA;QACjF,MAAM,QAAQ,GAAY,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAA;QAE/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,WAAW,CACnB,2EAA2E,EAC3E,mCAAmC;gBACnC,iDAAiD;gBACjD,qCAAqC;gBACrC,oDAAoD;gBACpD,QAAQ,CACT,CAAA;QACH,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;YAAS,CAAC;QACT,qEAAqE;QACrE,uEAAuE;QACvE,mCAAmC;QACnC,kBAAkB,EAAE,CAAA;IACtB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAA;AAC5E,CAAC"}
|
|
@@ -48,7 +48,11 @@ export interface ResolvedDatabase {
|
|
|
48
48
|
readonly name: string;
|
|
49
49
|
readonly url: string;
|
|
50
50
|
readonly appUrl?: string;
|
|
51
|
+
/** Directory relative `migrations`/`schema` paths resolve against — the config file's directory (process.cwd() for directly-constructed configs). */
|
|
52
|
+
readonly baseDir: string;
|
|
53
|
+
/** Glob patterns stay as authored; consumers glob them with `cwd: baseDir`. */
|
|
51
54
|
readonly schema: string | string[] | undefined;
|
|
55
|
+
/** Absolute — resolved against baseDir at load time, so cwd never matters (D1). */
|
|
52
56
|
readonly migrations: string | undefined;
|
|
53
57
|
readonly extensions: readonly string[];
|
|
54
58
|
readonly migrationTable: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/core/config/load.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/core/config/load.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAuB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAM9H,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,kHAAkH;IAClH,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAA;IACvD;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAA;IACzC,SAAS,IAAI,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IAClD,aAAa,IAAI,SAAS,MAAM,EAAE,CAAA;IAClC,mBAAmB,IAAI,MAAM,CAAA;IAC7B,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAA;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,qJAAqJ;IACrJ,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;IAC9C,mFAAmF;IACnF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IACnD,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;CACxE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAgBvD"}
|
package/dist/core/config/load.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
1
2
|
import { trunkConfigSchema } from './schema.js';
|
|
2
3
|
import { resolveEnvironment, resolveDbUrl } from './resolve.js';
|
|
3
4
|
import { ConfigError } from './errors.js';
|
|
4
5
|
import { resolveEnvVars } from './env-resolve.js';
|
|
6
|
+
import { consumeConfigBaseDir } from './base-dir.js';
|
|
5
7
|
export function loadConfig(raw) {
|
|
8
|
+
// Consume before validation so a parse failure cannot leave the slot set for
|
|
9
|
+
// an unrelated later load.
|
|
10
|
+
const baseDir = consumeConfigBaseDir() ?? process.cwd();
|
|
6
11
|
const parsed = trunkConfigSchema.safeParse(raw);
|
|
7
12
|
if (!parsed.success) {
|
|
8
13
|
const issues = parsed.error.issues.map(i => ` - ${i.path.join('.')}: ${i.message}`).join('\n');
|
|
@@ -10,16 +15,16 @@ export function loadConfig(raw) {
|
|
|
10
15
|
}
|
|
11
16
|
const config = parsed.data;
|
|
12
17
|
const environment = config.environment ?? resolveEnvironment();
|
|
13
|
-
return buildResolved(config, environment);
|
|
18
|
+
return buildResolved(config, environment, baseDir);
|
|
14
19
|
}
|
|
15
|
-
function buildResolved(config, environment) {
|
|
20
|
+
function buildResolved(config, environment, baseDir) {
|
|
16
21
|
const dbMap = new Map();
|
|
17
22
|
for (const [name, dbConfig] of Object.entries(config.databases)) {
|
|
18
23
|
const url = resolveDbUrl(dbConfig.url, dbConfig.testUrl, environment, name);
|
|
19
24
|
const appUrl = dbConfig.appUrl !== undefined
|
|
20
25
|
? resolveDbUrl(dbConfig.appUrl, dbConfig.appTestUrl, environment, name)
|
|
21
26
|
: undefined;
|
|
22
|
-
dbMap.set(name, resolveDatabase(name, dbConfig, url, appUrl));
|
|
27
|
+
dbMap.set(name, resolveDatabase(name, dbConfig, url, appUrl, baseDir));
|
|
23
28
|
}
|
|
24
29
|
const declaredNames = [...dbMap.keys()];
|
|
25
30
|
const defaultDbName = config.defaultDatabase;
|
|
@@ -102,13 +107,17 @@ function buildResolved(config, environment) {
|
|
|
102
107
|
},
|
|
103
108
|
};
|
|
104
109
|
}
|
|
105
|
-
function resolveDatabase(name, config, url, appUrl) {
|
|
110
|
+
function resolveDatabase(name, config, url, appUrl, baseDir) {
|
|
106
111
|
return {
|
|
107
112
|
name,
|
|
108
113
|
url,
|
|
109
114
|
...(appUrl !== undefined ? { appUrl } : {}),
|
|
115
|
+
baseDir,
|
|
110
116
|
schema: config.schema,
|
|
111
|
-
|
|
117
|
+
// Absolutized here — the single place — so every consumer (generate,
|
|
118
|
+
// migrate safety gate, test template provisioning) is cwd-independent.
|
|
119
|
+
// resolve(base, abs) === abs, so already-absolute consumer paths stay valid.
|
|
120
|
+
migrations: config.migrations !== undefined ? resolve(baseDir, config.migrations) : undefined,
|
|
112
121
|
extensions: config.extensions ?? [],
|
|
113
122
|
migrationTable: config.migrationTable ?? `__pipework_migrations_${name}`,
|
|
114
123
|
pool: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/core/config/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAiF,MAAM,aAAa,CAAA;AAC9H,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/core/config/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/core/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C,wBAAgB,kBAAkB,IAAI,WAAW,CAWhD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/core/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C,wBAAgB,kBAAkB,IAAI,WAAW,CAWhD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA8DtI"}
|
|
@@ -23,9 +23,31 @@ export function resolveDbUrl(envVarName, testEnvVarName, environment, dbName) {
|
|
|
23
23
|
` }\n\n` +
|
|
24
24
|
`Then set ${envVarName}_TEST in your environment.`);
|
|
25
25
|
}
|
|
26
|
+
// D4a (subseam audit 2026-07-16): a testUrl that resolves to the real
|
|
27
|
+
// database means "tests" run against production — the harness
|
|
28
|
+
// creates/drops databases and rolls back transactions on what it assumes
|
|
29
|
+
// is a dedicated instance, and RLS-inertness goes unnoticed. Name-identity
|
|
30
|
+
// first: both fields reading one variable is a config-shape defect,
|
|
31
|
+
// regardless of what the variable holds.
|
|
32
|
+
if (testEnvVarName === envVarName) {
|
|
33
|
+
throw new ConfigError(`Database "${dbName ?? envVarName}" uses the same environment variable "${envVarName}" for url and testUrl — test isolation is defeated.`, `testUrl must be its own variable pointing at a separate database:\n\n` +
|
|
34
|
+
` databases: {\n` +
|
|
35
|
+
` ${dbName ?? 'app'}: {\n` +
|
|
36
|
+
` url: '${envVarName}',\n` +
|
|
37
|
+
` testUrl: '${envVarName}_TEST', // <-- its own variable\n` +
|
|
38
|
+
` },\n` +
|
|
39
|
+
` }\n\n` +
|
|
40
|
+
`Then set ${envVarName}_TEST to a separate database's connection string.`);
|
|
41
|
+
}
|
|
26
42
|
const value = process.env[testEnvVarName];
|
|
27
|
-
if (value !== undefined && value !== '')
|
|
43
|
+
if (value !== undefined && value !== '') {
|
|
44
|
+
const urlValue = process.env[envVarName];
|
|
45
|
+
if (urlValue !== undefined && urlValue !== '' && urlValue === value) {
|
|
46
|
+
throw new ConfigError(`Database "${dbName ?? envVarName}": "${testEnvVarName}" and "${envVarName}" hold the identical connection string — test isolation is defeated.`, `Tests would run against the same database "${envVarName}" points at. ` +
|
|
47
|
+
`Point ${testEnvVarName} at a separate database.`);
|
|
48
|
+
}
|
|
28
49
|
return value;
|
|
50
|
+
}
|
|
29
51
|
throw new ConfigError(`Missing test database URL: environment variable "${testEnvVarName}" is not set.`, `Set ${testEnvVarName} in your .env file or environment.`);
|
|
30
52
|
}
|
|
31
53
|
const value = process.env[envVarName];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/core/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC5C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QACnF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,MAAM,CAAA;IACrC,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,YAAY,CAAA;IAEjD,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,cAAkC,EAAE,WAAwB,EAAE,MAAe;IAC5H,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,WAAW,CACnB,aAAa,MAAM,IAAI,UAAU,yDAAyD,EAC1F,0CAA0C;gBAC1C,kBAAkB;gBAClB,OAAO,MAAM,IAAI,KAAK,OAAO;gBAC7B,eAAe,UAAU,MAAM;gBAC/B,mBAAmB,UAAU,4BAA4B;gBACzD,UAAU;gBACV,SAAS;gBACT,YAAY,UAAU,4BAA4B,CACnD,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACzC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/core/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC5C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QACnF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,MAAM,CAAA;IACrC,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,YAAY,CAAA;IAEjD,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,cAAkC,EAAE,WAAwB,EAAE,MAAe;IAC5H,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,WAAW,CACnB,aAAa,MAAM,IAAI,UAAU,yDAAyD,EAC1F,0CAA0C;gBAC1C,kBAAkB;gBAClB,OAAO,MAAM,IAAI,KAAK,OAAO;gBAC7B,eAAe,UAAU,MAAM;gBAC/B,mBAAmB,UAAU,4BAA4B;gBACzD,UAAU;gBACV,SAAS;gBACT,YAAY,UAAU,4BAA4B,CACnD,CAAA;QACH,CAAC;QAED,sEAAsE;QACtE,8DAA8D;QAC9D,yEAAyE;QACzE,2EAA2E;QAC3E,oEAAoE;QACpE,yCAAyC;QACzC,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,WAAW,CACnB,aAAa,MAAM,IAAI,UAAU,yCAAyC,UAAU,qDAAqD,EACzI,uEAAuE;gBACvE,kBAAkB;gBAClB,OAAO,MAAM,IAAI,KAAK,OAAO;gBAC7B,eAAe,UAAU,MAAM;gBAC/B,mBAAmB,UAAU,oCAAoC;gBACjE,UAAU;gBACV,SAAS;gBACT,YAAY,UAAU,mDAAmD,CAC1E,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACzC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACpE,MAAM,IAAI,WAAW,CACnB,aAAa,MAAM,IAAI,UAAU,OAAO,cAAc,UAAU,UAAU,sEAAsE,EAChJ,8CAA8C,UAAU,eAAe;oBACvE,SAAS,cAAc,0BAA0B,CAClD,CAAA;YACH,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,IAAI,WAAW,CACnB,oDAAoD,cAAc,eAAe,EACjF,OAAO,cAAc,oCAAoC,CAC1D,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAErD,MAAM,IAAI,WAAW,CACnB,+CAA+C,UAAU,eAAe,EACxE,OAAO,UAAU,oCAAoC,CACtD,CAAA;AACH,CAAC"}
|
package/dist/core/pipework.d.ts
CHANGED
|
@@ -82,6 +82,25 @@ export interface ConnectionTracker {
|
|
|
82
82
|
/**
|
|
83
83
|
* Creates the Pipework application instance. This is the entry point for every Pipework app.
|
|
84
84
|
* Define in `pipework.config.ts` and export as default.
|
|
85
|
+
*
|
|
86
|
+
* The `env` field declares the app's environment variables — the canonical
|
|
87
|
+
* home for runtime config (ports, service tokens, bucket names, flags) in
|
|
88
|
+
* place of scattered `process.env` reads. Each variable is read once at config
|
|
89
|
+
* load, validated and coerced to its declared type (loud error on a bad or
|
|
90
|
+
* missing-required value), and exposed typed on `manifold.env`.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* const manifold = createManifold({
|
|
94
|
+
* databases: { app: { url: 'DATABASE_URL', testUrl: 'DATABASE_URL_TEST' } },
|
|
95
|
+
* env: {
|
|
96
|
+
* PORT: { type: 'number', defaults: { development: '3000', test: '0' } },
|
|
97
|
+
* S3_BUCKET: { type: 'string', required: true },
|
|
98
|
+
* API_TOKEN: { type: 'string', required: true, sensitive: true },
|
|
99
|
+
* },
|
|
100
|
+
* })
|
|
101
|
+
* manifold.env.PORT // number — from process.env.PORT, or the per-environment default
|
|
102
|
+
* manifold.env.S3_BUCKET // string — startup fails loudly if unset
|
|
103
|
+
* export default manifold
|
|
85
104
|
*/
|
|
86
105
|
export declare function createManifold<const TEnv extends EnvDefs = EnvDefs>(raw: Omit<BlueprintInput, 'env'> & {
|
|
87
106
|
env?: TEnv | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipework.d.ts","sourceRoot":"","sources":["../../src/core/pipework.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pipework.d.ts","sourceRoot":"","sources":["../../src/core/pipework.ts"],"names":[],"mappings":"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"}
|
package/dist/core/pipework.js
CHANGED
|
@@ -10,6 +10,25 @@ import { runInContext } from '../request/context/store.js';
|
|
|
10
10
|
/**
|
|
11
11
|
* Creates the Pipework application instance. This is the entry point for every Pipework app.
|
|
12
12
|
* Define in `pipework.config.ts` and export as default.
|
|
13
|
+
*
|
|
14
|
+
* The `env` field declares the app's environment variables — the canonical
|
|
15
|
+
* home for runtime config (ports, service tokens, bucket names, flags) in
|
|
16
|
+
* place of scattered `process.env` reads. Each variable is read once at config
|
|
17
|
+
* load, validated and coerced to its declared type (loud error on a bad or
|
|
18
|
+
* missing-required value), and exposed typed on `manifold.env`.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* const manifold = createManifold({
|
|
22
|
+
* databases: { app: { url: 'DATABASE_URL', testUrl: 'DATABASE_URL_TEST' } },
|
|
23
|
+
* env: {
|
|
24
|
+
* PORT: { type: 'number', defaults: { development: '3000', test: '0' } },
|
|
25
|
+
* S3_BUCKET: { type: 'string', required: true },
|
|
26
|
+
* API_TOKEN: { type: 'string', required: true, sensitive: true },
|
|
27
|
+
* },
|
|
28
|
+
* })
|
|
29
|
+
* manifold.env.PORT // number — from process.env.PORT, or the per-environment default
|
|
30
|
+
* manifold.env.S3_BUCKET // string — startup fails loudly if unset
|
|
31
|
+
* export default manifold
|
|
13
32
|
*/
|
|
14
33
|
export function createManifold(raw) {
|
|
15
34
|
const { surfaces: surfacesDef, lifecycle: lifecycleDef, ...blueprintRaw } = raw;
|
|
@@ -48,12 +67,18 @@ export function createManifold(raw) {
|
|
|
48
67
|
startupOpts.timeoutMs = lifecycleConfig.startupTimeoutMs;
|
|
49
68
|
}
|
|
50
69
|
await orchestrateStartup(manifold, startupOpts);
|
|
70
|
+
// The database queue migrations land in: the sole database, or the
|
|
71
|
+
// declared defaultDatabase. Ambiguous multi-DB configs (no default)
|
|
72
|
+
// already fail at `pipework generate`, so skipping here loses nothing.
|
|
73
|
+
const names = config.databaseNames();
|
|
74
|
+
const defaultDbName = names.length === 1 ? names[0] : config.raw.defaultDatabase;
|
|
51
75
|
await validateStartup({
|
|
52
76
|
configuredDatabases: config.databaseNames(),
|
|
53
77
|
environment: config.environment,
|
|
54
78
|
surfaces,
|
|
55
79
|
defaultDbAvailable: config.databaseNames().length === 1,
|
|
56
80
|
databases: config.databases(),
|
|
81
|
+
defaultDatabase: defaultDbName !== undefined ? config.database(defaultDbName) : undefined,
|
|
57
82
|
});
|
|
58
83
|
const context = manifold;
|
|
59
84
|
running = await startSurfaces(context, config, surfaces);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipework.js","sourceRoot":"","sources":["../../src/core/pipework.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAI5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AA6E1D
|
|
1
|
+
{"version":3,"file":"pipework.js","sourceRoot":"","sources":["../../src/core/pipework.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ValidationIssue } from './types.js';
|
|
2
|
+
import type { ResolvedDatabase } from '../config/load.js';
|
|
3
|
+
export declare function queueTableMessage(table: string, database: string): string;
|
|
4
|
+
/** Registered queue tables absent from the database at `url`. Opens a short-lived probe connection, mirroring validateConnectivity. */
|
|
5
|
+
export declare function missingQueueTables(url: string, timeoutMs?: number): Promise<string[]>;
|
|
6
|
+
/** Startup-validation leg: every registered queue's table must exist in the default database (where queue migrations are emitted). */
|
|
7
|
+
export declare function validateQueueTables(defaultDb: ResolvedDatabase, timeoutMs?: number): Promise<ValidationIssue[]>;
|
|
8
|
+
//# sourceMappingURL=queue-tables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-tables.d.ts","sourceRoot":"","sources":["../../../src/core/validation/queue-tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AASzD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOzE;AAED,uIAAuI;AACvI,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBzF;AAED,sIAAsI;AACtI,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,gBAAgB,EAC3B,SAAS,SAAO,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAY5B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { queueDefinitions } from '../../async/jobs/table.js';
|
|
2
|
+
// D2 residual risk (subseam audit 2026-07-16): a queue whose module is in no
|
|
3
|
+
// schema glob and no import chain reaches the registry at runtime (createQueue
|
|
4
|
+
// runs when the worker imports it) but never reached a migration — so the
|
|
5
|
+
// first enqueue in production failed on a missing relation. This check makes
|
|
6
|
+
// that state loud at startup and at test bootstrap instead.
|
|
7
|
+
export function queueTableMessage(table, database) {
|
|
8
|
+
return (`queue table "${table}" is registered (createQueue) but does not exist in database "${database}". ` +
|
|
9
|
+
`The module calling createQueue({ table: '${table}' }) must be reachable from the database's ` +
|
|
10
|
+
`schema glob (or imported by a schema file) so \`pipework generate\` emits its migration. ` +
|
|
11
|
+
`Add it to the schema patterns, run \`pipework generate\`, then \`pipework migrate\`.`);
|
|
12
|
+
}
|
|
13
|
+
/** Registered queue tables absent from the database at `url`. Opens a short-lived probe connection, mirroring validateConnectivity. */
|
|
14
|
+
export async function missingQueueTables(url, timeoutMs = 5000) {
|
|
15
|
+
const tables = [...queueDefinitions().keys()];
|
|
16
|
+
if (tables.length === 0)
|
|
17
|
+
return [];
|
|
18
|
+
const { default: postgres } = await import('postgres');
|
|
19
|
+
const sql = postgres(url, {
|
|
20
|
+
max: 1,
|
|
21
|
+
idle_timeout: 1,
|
|
22
|
+
connect_timeout: Math.ceil(timeoutMs / 1000),
|
|
23
|
+
onnotice: () => { },
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
const missing = [];
|
|
27
|
+
for (const table of tables) {
|
|
28
|
+
const rows = await sql `SELECT to_regclass(${'public.' + table}) IS NOT NULL AS present`;
|
|
29
|
+
if (rows[0]?.['present'] !== true)
|
|
30
|
+
missing.push(table);
|
|
31
|
+
}
|
|
32
|
+
return missing;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await sql.end({ timeout: 1 });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Startup-validation leg: every registered queue's table must exist in the default database (where queue migrations are emitted). */
|
|
39
|
+
export async function validateQueueTables(defaultDb, timeoutMs = 5000) {
|
|
40
|
+
try {
|
|
41
|
+
const missing = await missingQueueTables(defaultDb.url, timeoutMs);
|
|
42
|
+
return missing.map(table => ({
|
|
43
|
+
phase: 'database',
|
|
44
|
+
message: queueTableMessage(table, defaultDb.name),
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// An unreachable database is validateConnectivity's finding — reporting it
|
|
49
|
+
// here too would double up the same root cause.
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=queue-tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-tables.js","sourceRoot":"","sources":["../../../src/core/validation/queue-tables.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAE5D,6EAA6E;AAC7E,+EAA+E;AAC/E,0EAA0E;AAC1E,6EAA6E;AAC7E,4DAA4D;AAE5D,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,QAAgB;IAC/D,OAAO,CACL,gBAAgB,KAAK,iEAAiE,QAAQ,KAAK;QACnG,4CAA4C,KAAK,6CAA6C;QAC9F,2FAA2F;QAC3F,sFAAsF,CACvF,CAAA;AACH,CAAC;AAED,uIAAuI;AACvI,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,SAAS,GAAG,IAAI;IACpE,MAAM,MAAM,GAAG,CAAC,GAAG,gBAAgB,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAElC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE;QACxB,GAAG,EAAE,CAAC;QACN,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC5C,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;KACnB,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,GAAa,EAAE,CAAA;QAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAA,sBAAsB,SAAS,GAAG,KAAK,0BAA0B,CAAA;YACvF,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC;AAED,sIAAsI;AACtI,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAA2B,EAC3B,SAAS,GAAG,IAAI;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAClE,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3B,KAAK,EAAE,UAAmB;YAC1B,OAAO,EAAE,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;SAClD,CAAC,CAAC,CAAA;IACL,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,gDAAgD;QAChD,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ValidationIssue } from './types.js';
|
|
2
|
+
import type { ResolvedDatabase } from '../config/load.js';
|
|
3
|
+
import type { IsolationStrategy } from '../config/schema.js';
|
|
4
|
+
export interface RlsRoleProbe {
|
|
5
|
+
readonly role: string;
|
|
6
|
+
readonly superuser: boolean;
|
|
7
|
+
readonly bypassRls: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function rlsRoleMessage(database: string, probe: RlsRoleProbe): string;
|
|
10
|
+
/** The connection whose role actually executes queries under the harness: transaction isolation collapses every role onto the resolved `url` connection; database/container isolation resolves roles normally (`appUrl ?? url`). */
|
|
11
|
+
export declare function rlsProbeTarget(db: ResolvedDatabase, strategy: IsolationStrategy): string;
|
|
12
|
+
/** Role flags for `current_user` at `url`. Short-lived probe connection, mirroring validateConnectivity. */
|
|
13
|
+
export declare function probeRlsRole(url: string, timeoutMs?: number): Promise<RlsRoleProbe>;
|
|
14
|
+
/** Startup-validation leg: for each database with `rls` configured, the runtime connection's role (`appUrl ?? url`) must not bypass RLS. */
|
|
15
|
+
export declare function validateRlsRoles(databases: ReadonlyMap<string, ResolvedDatabase>, timeoutMs?: number): Promise<ValidationIssue[]>;
|
|
16
|
+
//# sourceMappingURL=rls-role.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rls-role.d.ts","sourceRoot":"","sources":["../../../src/core/validation/rls-role.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAO5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAQ5E;AAED,oOAAoO;AACpO,wBAAgB,cAAc,CAAC,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAExF;AAED,4GAA4G;AAC5G,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAmBvF;AAED,4IAA4I;AAC5I,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAChD,SAAS,SAAO,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB5B"}
|