pipework 0.10.2 → 0.10.3
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 +6 -0
- package/dist/cli/commands/dev.d.ts +2 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +56 -36
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/trace/schema/trace-retained.d.ts.map +1 -1
- package/dist/trace/schema/trace-retained.js +12 -2
- package/dist/trace/schema/trace-retained.js.map +1 -1
- package/dist/trace/schema/trace-step-retained.d.ts.map +1 -1
- package/dist/trace/schema/trace-step-retained.js +8 -2
- package/dist/trace/schema/trace-step-retained.js.map +1 -1
- package/package.json +1 -1
- package/dist/request/fixture/register.d.ts +0 -16
- package/dist/request/fixture/register.d.ts.map +0 -1
- package/dist/request/fixture/register.js +0 -181
- package/dist/request/fixture/register.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.10.3
|
|
4
|
+
|
|
5
|
+
- **Fix: no pipework app could start as a live server — startup validation rejected pipework's own internal trace tables.** The brand-uniqueness validator (`validateDomainIntegrity`) flags a brand reused across two tables that aren't linked by an FK, to catch accidental id-type collisions. But the built-in cold-mirror tables `trace_retained` / `trace_step_retained` reuse the hot tables' `TraceId` / `TraceStepId` brands *by design* — a retained row is a copy holding the same id value — declared as plain PKs with no FK. So as soon as `trace: {}` was enabled, startup validation threw `StartupValidationError: brand "TraceId" used by both trace.id and trace_retained.id` and the server refused to boot. The retained mirrors now declare `id` as an `enforced: false` reference to the source table's `id` — the same mechanism `trace-fields` already uses for `rootId`/`parentId`: no physical FK is emitted (retention may still drop the hot partition out from under the copy), but the validator resolves the reference and recognises the brand reuse as intentional (`isInheritedFromFK`). Latent because `pipework test` (transaction-isolation harness) and `pipework migrate` never run startup validation — only the dev/live-serve path does.
|
|
6
|
+
- **Fix: `pipework dev` resolved its TS loader to a path the published package doesn't contain.** `dev.js` resolved the loader at `dist/config/ts-register.js`, but the source lives at `src/core/config/ts-register.ts` → `dist/core/config/ts-register.js`; `dist/config/` is absent from the tarball, so `pipework dev` died with `ERR_MODULE_NOT_FOUND` on a consumer install. Both `dev` resolves (surface-aware and legacy) now point at `dist/core/config/ts-register.js` via a shared `resolveRegisterPath` helper.
|
|
7
|
+
- **Fix: `pipework dev` launched its own bootstrap as TypeScript from inside `node_modules`.** `dev.js` spawned `node ... dist/cli/dev-bootstrap.ts` — but the `.ts` isn't shipped, and Node refuses to strip types for any file under `node_modules` (`ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`), so a consumer install could never run it (it only worked in pipework's own repo, where the source isn't under `node_modules`). The bootstrap now launches as the compiled `dist/cli/dev-bootstrap.js` via `resolveBootstrapPath`; the compiled file runs natively and the `--import` loader still strips types for the consumer's own TS (which is not under `node_modules`).
|
|
8
|
+
|
|
3
9
|
## 0.10.2
|
|
4
10
|
|
|
5
11
|
- **Fix: `pipework check` lint false-greened pre-existing violations across a pipework ruleset bump.** ESLint's `--cache` keys each file on (its content + the local `eslint.config` + the eslint version) — but NOT on the transitive pipework ruleset the config imports. So bumping pipework to tighten a rule (e.g. `strict-boolean-expressions`) left every unchanged file's cached "pass" verdict in place; each `check` only re-linted cache-invalidated files, surfacing a different subset of errors per run and reading like flaky lint while real violations shipped behind green gates. The eslint cache now lives at `<root>/node_modules/.cache/pipework/eslint-<pipework-version>-<module>`: **version-stamped** so a bump points eslint at a fresh cache file (cold lint, no stale verdicts), and **under `node_modules`** so it is gitignored — a stale cache can no longer be committed or travel between clones. (Previously the cache was written as `.eslintcache` in each module root, covered by no `.gitignore`, so caches were being committed and the staleness traveled with the repo.) New exported `eslintCacheLocation(cwd, version, label)`. **Consumers: `git rm` any committed `.eslintcache` files after upgrading — they are now dead.**
|
|
@@ -4,4 +4,6 @@ export interface DevOptions {
|
|
|
4
4
|
entry: string | undefined;
|
|
5
5
|
}
|
|
6
6
|
export declare function dev(options: DevOptions): void;
|
|
7
|
+
export declare function resolveRegisterPath(cliDir: string): string;
|
|
8
|
+
export declare function resolveBootstrapPath(cliDir: string): string;
|
|
7
9
|
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAO7C"}
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAO7C;AAYD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
package/dist/cli/commands/dev.js
CHANGED
|
@@ -9,47 +9,67 @@ export function dev(options) {
|
|
|
9
9
|
}
|
|
10
10
|
startSurfaceAware(options);
|
|
11
11
|
}
|
|
12
|
+
// dev.js compiles to dist/cli/commands/dev.js. The TS loader and the dev
|
|
13
|
+
// bootstrap are sibling build outputs, NOT source files — once pipework is
|
|
14
|
+
// installed they live under node_modules. Both must be resolved as the
|
|
15
|
+
// compiled `.js`: the loader source is src/core/config/ts-register.ts →
|
|
16
|
+
// dist/core/config/ts-register.js (two levels up to dist, then core/config),
|
|
17
|
+
// and the bootstrap is src/cli/dev-bootstrap.ts → dist/cli/dev-bootstrap.js
|
|
18
|
+
// (one level up to dist/cli). Referencing the bootstrap as `.ts` only works in
|
|
19
|
+
// pipework's own repo (source not under node_modules) and is doubly broken
|
|
20
|
+
// once installed: the `.ts` isn't shipped, and Node refuses to strip types for
|
|
21
|
+
// any file under node_modules.
|
|
22
|
+
export function resolveRegisterPath(cliDir) {
|
|
23
|
+
return resolve(cliDir, '..', '..', 'core', 'config', 'ts-register.js');
|
|
24
|
+
}
|
|
25
|
+
export function resolveBootstrapPath(cliDir) {
|
|
26
|
+
return resolve(cliDir, '..', 'dev-bootstrap.js');
|
|
27
|
+
}
|
|
12
28
|
function startSurfaceAware(options) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
printBanner();
|
|
21
|
-
const args = ['--watch', '--experimental-strip-types', '--import', registerPath, bootstrapPath];
|
|
22
|
-
const child = spawn('node', args, {
|
|
23
|
-
cwd: options.cwd,
|
|
24
|
-
stdio: 'inherit',
|
|
25
|
-
env,
|
|
26
|
-
});
|
|
27
|
-
child.on('exit', (code, signal) => {
|
|
28
|
-
if (signal === 'SIGTERM' || signal === 'SIGINT') {
|
|
29
|
-
process.exit(0);
|
|
29
|
+
{
|
|
30
|
+
const cliDir = dirname(fileURLToPath(import.meta.url));
|
|
31
|
+
const bootstrapPath = resolveBootstrapPath(cliDir);
|
|
32
|
+
const registerPath = resolveRegisterPath(cliDir);
|
|
33
|
+
const env = { ...process.env, 'PIPEWORK_DEV_CWD': options.cwd };
|
|
34
|
+
if (options.port !== undefined) {
|
|
35
|
+
env['PORT'] = options.port;
|
|
30
36
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
printBanner();
|
|
38
|
+
const args = ['--watch', '--experimental-strip-types', '--import', registerPath, bootstrapPath];
|
|
39
|
+
const child = spawn('node', args, {
|
|
40
|
+
cwd: options.cwd,
|
|
41
|
+
stdio: 'inherit',
|
|
42
|
+
env,
|
|
43
|
+
});
|
|
44
|
+
child.on('exit', (code, signal) => {
|
|
45
|
+
if (signal === 'SIGTERM' || signal === 'SIGINT') {
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
process.exit(code ?? 0);
|
|
49
|
+
});
|
|
50
|
+
process.on('SIGTERM', () => child.kill('SIGTERM'));
|
|
51
|
+
process.on('SIGINT', () => child.kill('SIGINT'));
|
|
52
|
+
}
|
|
35
53
|
}
|
|
36
54
|
function startLegacy(options) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
55
|
+
{
|
|
56
|
+
const cliDir = dirname(fileURLToPath(import.meta.url));
|
|
57
|
+
const registerPath = resolveRegisterPath(cliDir);
|
|
58
|
+
const entry = options.entry ?? 'src/server.ts';
|
|
59
|
+
const args = ['--watch', '--experimental-strip-types', '--import', registerPath, entry];
|
|
60
|
+
if (options.port !== undefined) {
|
|
61
|
+
process.env['PORT'] = options.port;
|
|
62
|
+
}
|
|
63
|
+
info(`Starting dev server: node ${args.join(' ')}`);
|
|
64
|
+
const child = spawn('node', args, {
|
|
65
|
+
cwd: options.cwd,
|
|
66
|
+
stdio: 'inherit',
|
|
67
|
+
env: process.env,
|
|
68
|
+
});
|
|
69
|
+
child.on('exit', (code) => {
|
|
70
|
+
process.exit(code ?? 0);
|
|
71
|
+
});
|
|
43
72
|
}
|
|
44
|
-
info(`Starting dev server: node ${args.join(' ')}`);
|
|
45
|
-
const child = spawn('node', args, {
|
|
46
|
-
cwd: options.cwd,
|
|
47
|
-
stdio: 'inherit',
|
|
48
|
-
env: process.env,
|
|
49
|
-
});
|
|
50
|
-
child.on('exit', (code) => {
|
|
51
|
-
process.exit(code ?? 0);
|
|
52
|
-
});
|
|
53
73
|
}
|
|
54
74
|
function printBanner() {
|
|
55
75
|
process.stderr.write(`\n ${bold(cyan('pipework dev'))}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAQvD,MAAM,UAAU,GAAG,CAAC,OAAmB;IACrC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,WAAW,CAAC,OAAO,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-retained.d.ts","sourceRoot":"","sources":["../../../src/trace/schema/trace-retained.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"trace-retained.d.ts","sourceRoot":"","sources":["../../../src/trace/schema/trace-retained.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaxB,CAAA"}
|
|
@@ -2,9 +2,19 @@
|
|
|
2
2
|
// holds traces copied out on error so they survive past `hotRetentionDays`.
|
|
3
3
|
// RANGE-partitioned the same way; retention drops day-partitions older than
|
|
4
4
|
// `errorRetentionDays`.
|
|
5
|
-
import { define } from
|
|
5
|
+
import { define, definitions, field } from "../../data/domain/index.js";
|
|
6
6
|
import { traceFields } from './trace-fields.js';
|
|
7
|
-
export const traceRetained = define('trace_retained',
|
|
7
|
+
export const traceRetained = define('trace_retained', {
|
|
8
|
+
...traceFields,
|
|
9
|
+
// A retained row is a *copy* of a hot row and holds the same id value — the
|
|
10
|
+
// same TraceId id-space, not a fresh one. The enforced:false reference to
|
|
11
|
+
// `trace.id` emits no physical FK (retention may drop the hot partition out
|
|
12
|
+
// from under the copy) but tells the brand-uniqueness validator the TraceId
|
|
13
|
+
// reuse is intentional (isInheritedFromFK), mirroring trace-fields' rootId.
|
|
14
|
+
// Thunk form defers resolution past the import cycle — `trace.ts` has not run
|
|
15
|
+
// yet when this module loads — so the brand is restated explicitly.
|
|
16
|
+
id: field.uuid().brand('TraceId').references(() => definitions().get('trace'), 'id', { enforced: false }).defaultRandom(),
|
|
17
|
+
}, {
|
|
8
18
|
primaryKey: ['id', 'openedDay'],
|
|
9
19
|
partitionBy: { strategy: 'range', column: 'openedDay' },
|
|
10
20
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-retained.js","sourceRoot":"","sources":["../../../src/trace/schema/trace-retained.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,wBAAwB;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,
|
|
1
|
+
{"version":3,"file":"trace-retained.js","sourceRoot":"","sources":["../../../src/trace/schema/trace-retained.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,wBAAwB;AAExB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,EAAE;IACpD,GAAG,WAAW;IACd,4EAA4E;IAC5E,0EAA0E;IAC1E,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,8EAA8E;IAC9E,oEAAoE;IACpE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE;CAC3H,EAAE;IACD,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;IAC/B,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE;CACxD,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-step-retained.d.ts","sourceRoot":"","sources":["../../../src/trace/schema/trace-step-retained.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"trace-step-retained.d.ts","sourceRoot":"","sources":["../../../src/trace/schema/trace-step-retained.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc5B,CAAA"}
|
|
@@ -3,10 +3,16 @@
|
|
|
3
3
|
// `trace_retained`: copy-on-error writes the trace and its steps together, so
|
|
4
4
|
// referential integrity holds in the cold tables exactly as it does in the hot
|
|
5
5
|
// ones.
|
|
6
|
-
import { define } from
|
|
6
|
+
import { define, definitions, field } from "../../data/domain/index.js";
|
|
7
7
|
import { traceStepFields } from './trace-step-fields.js';
|
|
8
8
|
import { traceRetained } from './trace-retained.js';
|
|
9
|
-
export const traceStepRetained = define('trace_step_retained',
|
|
9
|
+
export const traceStepRetained = define('trace_step_retained', {
|
|
10
|
+
...traceStepFields,
|
|
11
|
+
// Same id-space as the hot `trace_step` row it mirrors — see trace-retained
|
|
12
|
+
// for why the enforced:false self-space reference is what keeps the
|
|
13
|
+
// brand-uniqueness validator from flagging the intentional TraceStepId reuse.
|
|
14
|
+
id: field.uuid().brand('TraceStepId').references(() => definitions().get('trace_step'), 'id', { enforced: false }).defaultRandom(),
|
|
15
|
+
}, {
|
|
10
16
|
primaryKey: ['id', 'traceDay'],
|
|
11
17
|
partitionBy: { strategy: 'range', column: 'traceDay' },
|
|
12
18
|
foreignKeys: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-step-retained.js","sourceRoot":"","sources":["../../../src/trace/schema/trace-step-retained.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,QAAQ;AAER,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,
|
|
1
|
+
{"version":3,"file":"trace-step-retained.js","sourceRoot":"","sources":["../../../src/trace/schema/trace-step-retained.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,QAAQ;AAER,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,qBAAqB,EAAE;IAC7D,GAAG,eAAe;IAClB,4EAA4E;IAC5E,oEAAoE;IACpE,8EAA8E;IAC9E,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,CAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE;CACpI,EAAE;IACD,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;IAC9B,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE;IACtD,WAAW,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;YAChC,UAAU,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;YACvE,QAAQ,EAAE,SAAS;SACpB,CAAC;CACH,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { FastifyInstance } from 'fastify';
|
|
2
|
-
import type { Manifold } from '../../core/pipework.js';
|
|
3
|
-
import type { Resource } from './types.js';
|
|
4
|
-
import type { TenantConfig } from '../../auth/tenant/types.js';
|
|
5
|
-
import type { Rbac } from '../../auth/rbac/types.js';
|
|
6
|
-
import { type ContextOptions } from '../http/middleware.js';
|
|
7
|
-
interface RegisterOptions {
|
|
8
|
-
instance: Manifold;
|
|
9
|
-
contextOptions: ContextOptions;
|
|
10
|
-
tenantConfig: TenantConfig | null;
|
|
11
|
-
rbac: Rbac | null;
|
|
12
|
-
txDatabases: string[] | null;
|
|
13
|
-
}
|
|
14
|
-
export declare function registerResource<TAuth>(app: FastifyInstance, resource: Resource<TAuth>, options: RegisterOptions): void;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/request/fixture/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAA;AAE5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAQzE,UAAU,eAAe;IACvB,QAAQ,EAAE,QAAQ,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;IACjC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACjB,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EACpC,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,EACzB,OAAO,EAAE,eAAe,GACvB,IAAI,CAsLN"}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { buildContext } from '../http/middleware.js';
|
|
2
|
-
import { runInContext } from '../context/store.js';
|
|
3
|
-
import { PipeworkError, NotFoundError } from '../../core/errors/index.js';
|
|
4
|
-
import { buildErrorResponse, buildInternalErrorResponse } from '../http/response.js';
|
|
5
|
-
import { parse } from '../../data/schema/parse.js';
|
|
6
|
-
import { MethodNotAllowedError } from './errors.js';
|
|
7
|
-
import { validateBatchRequest } from './batch.js';
|
|
8
|
-
export function registerResource(app, resource, options) {
|
|
9
|
-
const { name, database } = resource.meta;
|
|
10
|
-
const basePath = `/${name}`;
|
|
11
|
-
const itemPath = `/${name}/:id`;
|
|
12
|
-
const ops = resource.operations;
|
|
13
|
-
const handler = async (req, reply, fn) => {
|
|
14
|
-
try {
|
|
15
|
-
const ctx = await buildContext(req, options.contextOptions, resource.meta.authRequirement);
|
|
16
|
-
if (resource.meta.permission && options.rbac !== null) {
|
|
17
|
-
const { enforcePermission } = await import('../../auth/rbac/middleware.js');
|
|
18
|
-
const auth = ctx.auth;
|
|
19
|
-
if (auth !== null && ctx.tenant !== null) {
|
|
20
|
-
const userId = typeof auth['userId'] === 'string' ? auth['userId'] : null;
|
|
21
|
-
const authVersion = typeof auth['authVersion'] === 'number' ? auth['authVersion'] : 1;
|
|
22
|
-
if (userId !== null) {
|
|
23
|
-
const dbConfig = options.instance.config.database(database);
|
|
24
|
-
const conn = options.instance.pool.getOrCreate(dbConfig);
|
|
25
|
-
await enforcePermission(options.rbac, conn.drizzle, userId, ctx.tenant, authVersion, resource.meta.permission.resource, resource.meta.permission.action, resource.meta.permission.scope);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
const dbConfig = options.instance.config.database(database);
|
|
30
|
-
const conn = options.instance.pool.getOrCreate(dbConfig);
|
|
31
|
-
if (resource.meta.authRequirement !== 'none' && ctx.tenant === null) {
|
|
32
|
-
return reply.status(401).send(buildErrorResponse(new (await import('../../core/errors/index.js')).UnauthorizedError('Tenant context required')));
|
|
33
|
-
}
|
|
34
|
-
const result = await runInContext(ctx, () => fn(conn.drizzle, ctx.auth, ctx.tenant));
|
|
35
|
-
if (result.body !== undefined) {
|
|
36
|
-
return reply.status(result.status).send(result.body);
|
|
37
|
-
}
|
|
38
|
-
return reply.status(result.status).send();
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
if (error instanceof PipeworkError) {
|
|
42
|
-
return reply.status(error.httpStatus).send(buildErrorResponse(error));
|
|
43
|
-
}
|
|
44
|
-
req.log.error(error, 'Unhandled error in resource handler');
|
|
45
|
-
return reply.status(500).send(buildInternalErrorResponse());
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
// GET /resource — list
|
|
49
|
-
app.get(basePath, async (req, reply) => {
|
|
50
|
-
if (ops.listCursor !== undefined && resource.meta.pagination !== null) {
|
|
51
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
52
|
-
const query = (req.query ?? {});
|
|
53
|
-
const pagination = resource.meta.pagination;
|
|
54
|
-
const rawLimit = query['limit'] !== undefined ? parseInt(query['limit'], 10) : pagination.defaultLimit;
|
|
55
|
-
const limit = Math.min(Math.max(1, Number.isNaN(rawLimit) ? pagination.defaultLimit : rawLimit), pagination.maxLimit);
|
|
56
|
-
const cursor = query['cursor'];
|
|
57
|
-
const result = await ops.listCursor(db, auth, tenant, cursor !== undefined ? { cursor, limit } : { limit });
|
|
58
|
-
return { status: 200, body: result };
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
if (ops.listPaginated !== undefined && resource.meta.pagination !== null) {
|
|
62
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
63
|
-
const query = (req.query ?? {});
|
|
64
|
-
const pagination = resource.meta.pagination;
|
|
65
|
-
const rawLimit = query['limit'] !== undefined ? parseInt(query['limit'], 10) : pagination.defaultLimit;
|
|
66
|
-
const limit = Math.min(Math.max(1, Number.isNaN(rawLimit) ? pagination.defaultLimit : rawLimit), pagination.maxLimit);
|
|
67
|
-
const rawOffset = query['offset'] !== undefined ? parseInt(query['offset'], 10) : 0;
|
|
68
|
-
const offset = Math.max(0, Number.isNaN(rawOffset) ? 0 : rawOffset);
|
|
69
|
-
const result = await ops.listPaginated(db, auth, tenant, { limit, offset });
|
|
70
|
-
return {
|
|
71
|
-
status: 200,
|
|
72
|
-
body: {
|
|
73
|
-
data: result.data,
|
|
74
|
-
pagination: { limit, offset, total: result.total, hasMore: offset + result.data.length < result.total },
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
if (ops.list === undefined) {
|
|
80
|
-
return reply.status(405).send(buildErrorResponse(new MethodNotAllowedError('GET', name)));
|
|
81
|
-
}
|
|
82
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
83
|
-
const result = await ops.list(db, auth, tenant);
|
|
84
|
-
return { status: 200, body: result };
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
// GET /fixture/:id — get
|
|
88
|
-
app.get(itemPath, async (req, reply) => {
|
|
89
|
-
if (ops.get === undefined) {
|
|
90
|
-
return reply.status(405).send(buildErrorResponse(new MethodNotAllowedError('GET', name)));
|
|
91
|
-
}
|
|
92
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
93
|
-
const id = req.params['id'];
|
|
94
|
-
const result = await ops.get(db, auth, tenant, id);
|
|
95
|
-
if (result === null || result === undefined) {
|
|
96
|
-
throw new NotFoundError(`${capitalize(singularize(name))} "${id}"`);
|
|
97
|
-
}
|
|
98
|
-
return { status: 200, body: result };
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
// POST /resource — create
|
|
102
|
-
app.post(basePath, async (req, reply) => {
|
|
103
|
-
if (ops.create === undefined) {
|
|
104
|
-
return reply.status(405).send(buildErrorResponse(new MethodNotAllowedError('POST', name)));
|
|
105
|
-
}
|
|
106
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
107
|
-
let input = req.body;
|
|
108
|
-
if (ops.create.input !== undefined) {
|
|
109
|
-
input = parse(ops.create.input, req.body);
|
|
110
|
-
}
|
|
111
|
-
const result = await ops.create.handler(db, auth, tenant, input);
|
|
112
|
-
return { status: 201, body: result };
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
// PUT /fixture/:id — update
|
|
116
|
-
app.put(itemPath, async (req, reply) => {
|
|
117
|
-
if (ops.update === undefined) {
|
|
118
|
-
return reply.status(405).send(buildErrorResponse(new MethodNotAllowedError('PUT', name)));
|
|
119
|
-
}
|
|
120
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
121
|
-
const id = req.params['id'];
|
|
122
|
-
let input = req.body;
|
|
123
|
-
if (ops.update.input !== undefined) {
|
|
124
|
-
input = parse(ops.update.input, req.body);
|
|
125
|
-
}
|
|
126
|
-
const result = await ops.update.handler(db, auth, tenant, id, input);
|
|
127
|
-
if (result === null || result === undefined) {
|
|
128
|
-
throw new NotFoundError(`${capitalize(singularize(name))} "${id}"`);
|
|
129
|
-
}
|
|
130
|
-
return { status: 200, body: result };
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
// DELETE /fixture/:id — delete
|
|
134
|
-
app.delete(itemPath, async (req, reply) => {
|
|
135
|
-
if (ops.delete === undefined) {
|
|
136
|
-
return reply.status(405).send(buildErrorResponse(new MethodNotAllowedError('DELETE', name)));
|
|
137
|
-
}
|
|
138
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
139
|
-
const id = req.params['id'];
|
|
140
|
-
await ops.delete(db, auth, tenant, id);
|
|
141
|
-
return { status: 204 };
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
if (ops.batch !== undefined) {
|
|
145
|
-
const validActions = Object.keys(ops.batch);
|
|
146
|
-
// POST /fixture/batch/preview — batch preview
|
|
147
|
-
app.post(`${basePath}/batch/preview`, async (req, reply) => {
|
|
148
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
149
|
-
const { action, targets } = validateBatchRequest(req.body, validActions);
|
|
150
|
-
const batchAction = ops.batch[action];
|
|
151
|
-
if (batchAction.preview === undefined) {
|
|
152
|
-
throw new MethodNotAllowedError('POST', `${name}/batch/preview (action: ${action})`);
|
|
153
|
-
}
|
|
154
|
-
const result = await batchAction.preview(db, auth, tenant, targets);
|
|
155
|
-
return { status: 200, body: result };
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
// POST /fixture/batch — batch execute
|
|
159
|
-
app.post(`${basePath}/batch`, async (req, reply) => {
|
|
160
|
-
return handler(req, reply, async (db, auth, tenant) => {
|
|
161
|
-
const { action, targets } = validateBatchRequest(req.body, validActions);
|
|
162
|
-
const batchAction = ops.batch[action];
|
|
163
|
-
const result = await batchAction.execute(db, auth, tenant, targets);
|
|
164
|
-
return { status: 200, body: result };
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
function capitalize(s) {
|
|
170
|
-
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
171
|
-
}
|
|
172
|
-
function singularize(s) {
|
|
173
|
-
if (s.endsWith('ies'))
|
|
174
|
-
return s.slice(0, -3) + 'y';
|
|
175
|
-
if (s.endsWith('ses') || s.endsWith('xes'))
|
|
176
|
-
return s.slice(0, -2);
|
|
177
|
-
if (s.endsWith('s') && !s.endsWith('ss'))
|
|
178
|
-
return s.slice(0, -1);
|
|
179
|
-
return s;
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=register.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/request/fixture/register.ts"],"names":[],"mappings":"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"}
|