pipework 0.7.2 → 0.7.5
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/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +80 -0
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/install.d.ts +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +3 -6
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +2 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +20 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/jsonb/index.d.ts +2 -0
- package/dist/jsonb/index.d.ts.map +1 -0
- package/dist/jsonb/index.js +2 -0
- package/dist/jsonb/index.js.map +1 -0
- package/dist/jsonb/namespace.d.ts +11 -0
- package/dist/jsonb/namespace.d.ts.map +1 -0
- package/dist/jsonb/namespace.js +11 -0
- package/dist/jsonb/namespace.js.map +1 -0
- package/dist/jsonb/query.d.ts +5 -0
- package/dist/jsonb/query.d.ts.map +1 -0
- package/dist/jsonb/query.js +11 -0
- package/dist/jsonb/query.js.map +1 -0
- package/dist/validation/doctrine.d.ts +13 -0
- package/dist/validation/doctrine.d.ts.map +1 -0
- package/dist/validation/doctrine.js +100 -0
- package/dist/validation/doctrine.js.map +1 -0
- package/dist/vector/index.d.ts +2 -1
- package/dist/vector/index.d.ts.map +1 -1
- package/dist/vector/index.js +1 -1
- package/dist/vector/index.js.map +1 -1
- package/dist/vector/namespace.d.ts +10 -4
- package/dist/vector/namespace.d.ts.map +1 -1
- package/dist/vector/namespace.js +10 -4
- package/dist/vector/namespace.js.map +1 -1
- package/dist/vector/query.d.ts +14 -1
- package/dist/vector/query.d.ts.map +1 -1
- package/dist/vector/query.js +39 -1
- package/dist/vector/query.js.map +1 -1
- package/dist/workspace/sync.d.ts +1 -0
- package/dist/workspace/sync.d.ts.map +1 -1
- package/dist/workspace/sync.js +1 -1
- package/dist/workspace/sync.js.map +1 -1
- package/package.json +1 -1
- package/dist/drizzle/index.d.ts +0 -3
- package/dist/drizzle/index.d.ts.map +0 -1
- package/dist/drizzle/index.js +0 -3
- package/dist/drizzle/index.js.map +0 -1
- package/dist/resource/batch.d.ts +0 -17
- package/dist/resource/batch.d.ts.map +0 -1
- package/dist/resource/batch.js +0 -47
- package/dist/resource/batch.js.map +0 -1
- package/dist/resource/builder.d.ts +0 -11
- package/dist/resource/builder.d.ts.map +0 -1
- package/dist/resource/builder.js +0 -12
- package/dist/resource/builder.js.map +0 -1
- package/dist/resource/errors.d.ts +0 -7
- package/dist/resource/errors.d.ts.map +0 -1
- package/dist/resource/errors.js +0 -9
- package/dist/resource/errors.js.map +0 -1
- package/dist/resource/index.d.ts +0 -9
- package/dist/resource/index.d.ts.map +0 -1
- package/dist/resource/index.js +0 -6
- package/dist/resource/index.js.map +0 -1
- package/dist/resource/paginate.d.ts +0 -13
- package/dist/resource/paginate.d.ts.map +0 -1
- package/dist/resource/paginate.js +0 -29
- package/dist/resource/paginate.js.map +0 -1
- package/dist/resource/register.d.ts +0 -16
- package/dist/resource/register.d.ts.map +0 -1
- package/dist/resource/register.js +0 -181
- package/dist/resource/register.js.map +0 -1
- package/dist/resource/types.d.ts +0 -69
- package/dist/resource/types.d.ts.map +0 -1
- package/dist/resource/types.js +0 -2
- package/dist/resource/types.js.map +0 -1
- package/dist/trunk.d.ts +0 -35
- package/dist/trunk.d.ts.map +0 -1
- package/dist/trunk.js +0 -102
- package/dist/trunk.js.map +0 -1
- package/dist/validation/surface.d.ts +0 -4
- package/dist/validation/surface.d.ts.map +0 -1
- package/dist/validation/surface.js +0 -55
- package/dist/validation/surface.js.map +0 -1
package/dist/vector/namespace.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { vector as vectorColumn, tsvector } from './types.js';
|
|
2
|
-
import { cosineDistance, cosineSimilarity, l2Distance, innerProduct, toTsvector, toTsquery, tsRank } from './query.js';
|
|
2
|
+
import { cosineDistance, cosineSimilarity, l2Distance, innerProduct, toTsvector, toTsquery, plainToTsquery, matches, headline, tsRank } from './query.js';
|
|
3
3
|
import { validateVectorExtension } from './validate.js';
|
|
4
|
-
/** Vector and full-text search namespace — pgvector column types and
|
|
4
|
+
/** Vector and full-text search namespace — pgvector column types, similarity queries, and FTS operators. */
|
|
5
5
|
export const vector = {
|
|
6
6
|
/** Defines a vector(N) column for embeddings. */
|
|
7
7
|
column: vectorColumn,
|
|
@@ -17,9 +17,15 @@ export const vector = {
|
|
|
17
17
|
innerProduct,
|
|
18
18
|
/** Converts text to a tsvector for full-text indexing. */
|
|
19
19
|
toTsvector,
|
|
20
|
-
/** Converts a search query string to a tsquery. */
|
|
20
|
+
/** Converts a search query string to a tsquery using to_tsquery (supports operators like &, |, !). */
|
|
21
21
|
toTsquery,
|
|
22
|
-
/**
|
|
22
|
+
/** Converts natural language text to a tsquery using plainto_tsquery (no operator syntax required). */
|
|
23
|
+
plainToTsquery,
|
|
24
|
+
/** The @@ match operator — tests whether a tsvector column matches a tsquery. */
|
|
25
|
+
matches,
|
|
26
|
+
/** Generates a ts_headline search snippet with highlighted matches. */
|
|
27
|
+
headline,
|
|
28
|
+
/** Computes ts_rank for full-text search result ordering. Accepts a pre-built tsquery SQL or a raw query string. */
|
|
23
29
|
rank: tsRank,
|
|
24
30
|
/** Verifies the pgvector extension is installed and accessible. */
|
|
25
31
|
validate: validateVectorExtension,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/vector/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/vector/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACzJ,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAEvD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,iDAAiD;IACjD,MAAM,EAAE,YAAY;IACpB,sDAAsD;IACtD,QAAQ;IACR,kFAAkF;IAClF,MAAM,EAAE,cAAc;IACtB,sEAAsE;IACtE,gBAAgB;IAChB,mEAAmE;IACnE,EAAE,EAAE,UAAU;IACd,yDAAyD;IACzD,YAAY;IACZ,0DAA0D;IAC1D,UAAU;IACV,sGAAsG;IACtG,SAAS;IACT,uGAAuG;IACvG,cAAc;IACd,iFAAiF;IACjF,OAAO;IACP,uEAAuE;IACvE,QAAQ;IACR,oHAAoH;IACpH,IAAI,EAAE,MAAM;IACZ,mEAAmE;IACnE,QAAQ,EAAE,uBAAuB;CAClC,CAAA"}
|
package/dist/vector/query.d.ts
CHANGED
|
@@ -5,5 +5,18 @@ export declare function l2Distance(column: Column, query: number[]): SQL<number>
|
|
|
5
5
|
export declare function innerProduct(column: Column, query: number[]): SQL<number>;
|
|
6
6
|
export declare function toTsvector(text: string | SQL, config?: string): SQL;
|
|
7
7
|
export declare function toTsquery(query: string, config?: string): SQL;
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function plainToTsquery(query: string, config?: string): SQL;
|
|
9
|
+
export declare function matches(column: Column | SQL, query: SQL): SQL<boolean>;
|
|
10
|
+
export interface HeadlineOptions {
|
|
11
|
+
maxWords?: number;
|
|
12
|
+
minWords?: number;
|
|
13
|
+
shortWord?: number;
|
|
14
|
+
highlightAll?: boolean;
|
|
15
|
+
maxFragments?: number;
|
|
16
|
+
fragmentDelimiter?: string;
|
|
17
|
+
startSel?: string;
|
|
18
|
+
stopSel?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function headline(column: Column | SQL, query: SQL, config?: string, options?: HeadlineOptions): SQL<string>;
|
|
21
|
+
export declare function tsRank(column: Column | SQL, query: string | SQL, config?: string): SQL<number>;
|
|
9
22
|
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/vector/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEjD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAG3E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAG7E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAGvE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAGzE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAMnE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAG7D;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/vector/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEjD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAG3E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAG7E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAGvE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAGzE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAMnE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAG7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAGlE;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAEtE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,CAOlH;AAeD,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAM9F"}
|
package/dist/vector/query.js
CHANGED
|
@@ -26,8 +26,46 @@ export function toTsquery(query, config) {
|
|
|
26
26
|
const tsConfig = config ?? 'english';
|
|
27
27
|
return sql `to_tsquery(${tsConfig}, ${query})`;
|
|
28
28
|
}
|
|
29
|
+
export function plainToTsquery(query, config) {
|
|
30
|
+
const tsConfig = config ?? 'english';
|
|
31
|
+
return sql `plainto_tsquery(${tsConfig}, ${query})`;
|
|
32
|
+
}
|
|
33
|
+
export function matches(column, query) {
|
|
34
|
+
return sql `${column} @@ ${query}`;
|
|
35
|
+
}
|
|
36
|
+
export function headline(column, query, config, options) {
|
|
37
|
+
const tsConfig = config ?? 'english';
|
|
38
|
+
if (options === undefined) {
|
|
39
|
+
return sql `ts_headline(${tsConfig}, ${column}, ${query})`;
|
|
40
|
+
}
|
|
41
|
+
const optStr = formatHeadlineOptions(options);
|
|
42
|
+
return sql `ts_headline(${tsConfig}, ${column}, ${query}, ${optStr})`;
|
|
43
|
+
}
|
|
44
|
+
function formatHeadlineOptions(options) {
|
|
45
|
+
const parts = [];
|
|
46
|
+
if (options.maxWords !== undefined)
|
|
47
|
+
parts.push(`MaxWords=${String(options.maxWords)}`);
|
|
48
|
+
if (options.minWords !== undefined)
|
|
49
|
+
parts.push(`MinWords=${String(options.minWords)}`);
|
|
50
|
+
if (options.shortWord !== undefined)
|
|
51
|
+
parts.push(`ShortWord=${String(options.shortWord)}`);
|
|
52
|
+
if (options.highlightAll !== undefined)
|
|
53
|
+
parts.push(`HighlightAll=${options.highlightAll ? 'TRUE' : 'FALSE'}`);
|
|
54
|
+
if (options.maxFragments !== undefined)
|
|
55
|
+
parts.push(`MaxFragments=${String(options.maxFragments)}`);
|
|
56
|
+
if (options.fragmentDelimiter !== undefined)
|
|
57
|
+
parts.push(`FragmentDelimiter=${options.fragmentDelimiter}`);
|
|
58
|
+
if (options.startSel !== undefined)
|
|
59
|
+
parts.push(`StartSel=${options.startSel}`);
|
|
60
|
+
if (options.stopSel !== undefined)
|
|
61
|
+
parts.push(`StopSel=${options.stopSel}`);
|
|
62
|
+
return parts.join(', ');
|
|
63
|
+
}
|
|
29
64
|
export function tsRank(column, query, config) {
|
|
30
65
|
const tsConfig = config ?? 'english';
|
|
31
|
-
|
|
66
|
+
if (typeof query === 'string') {
|
|
67
|
+
return sql `ts_rank(${column}, to_tsquery(${tsConfig}, ${query}))`;
|
|
68
|
+
}
|
|
69
|
+
return sql `ts_rank(${column}, ${query})`;
|
|
32
70
|
}
|
|
33
71
|
//# sourceMappingURL=query.js.map
|
package/dist/vector/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/vector/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAGlC,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAe;IAC5D,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IACxC,OAAO,GAAG,CAAQ,GAAG,MAAM,QAAQ,SAAS,UAAU,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,KAAe;IAC9D,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IACxC,OAAO,GAAG,CAAQ,QAAQ,MAAM,QAAQ,SAAS,WAAW,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,KAAe;IACxD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IACxC,OAAO,GAAG,CAAQ,GAAG,MAAM,QAAQ,SAAS,UAAU,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAe;IAC1D,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IACxC,OAAO,GAAG,CAAQ,GAAG,MAAM,QAAQ,SAAS,UAAU,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAkB,EAAE,MAAe;IAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,SAAS,CAAA;IACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAA,eAAe,QAAQ,KAAK,IAAI,GAAG,CAAA;IAC/C,CAAC;IACD,OAAO,GAAG,CAAA,eAAe,QAAQ,KAAK,IAAI,GAAG,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAe;IACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,SAAS,CAAA;IACpC,OAAO,GAAG,CAAA,cAAc,QAAQ,KAAK,KAAK,GAAG,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/vector/query.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace/sync.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/workspace/sync.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/workspace/sync.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAkCjD;AAoBD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAMnF"}
|
package/dist/workspace/sync.js
CHANGED
|
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
4
4
|
import { resolveModules } from './discover.js';
|
|
5
5
|
import { generateWorkspace } from './generate.js';
|
|
6
6
|
export function sync(input) {
|
|
7
|
-
const pipeworkVersion = readPipeworkVersionFromConfig(input.config) ?? readPipeworkVersion();
|
|
7
|
+
const pipeworkVersion = input.pipeworkVersion ?? readPipeworkVersionFromConfig(input.config) ?? readPipeworkVersion();
|
|
8
8
|
const modules = resolveModules(input.config.modules, input.cwd);
|
|
9
9
|
const workspaceConfig = {
|
|
10
10
|
name: input.appName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/workspace/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAA4C,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/workspace/sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/drizzle/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/drizzle/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA"}
|
package/dist/drizzle/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/drizzle/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA"}
|
package/dist/resource/batch.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
|
|
2
|
-
import type { PermissionMeta } from '../di/types.js';
|
|
3
|
-
export interface BatchTargets {
|
|
4
|
-
readonly ids?: string[];
|
|
5
|
-
readonly filters?: Record<string, unknown>;
|
|
6
|
-
}
|
|
7
|
-
export interface BatchAction<TAuth> {
|
|
8
|
-
readonly permission?: PermissionMeta;
|
|
9
|
-
readonly preview?: (db: PostgresJsDatabase, auth: TAuth, tenant: string | null, targets: BatchTargets) => Promise<unknown>;
|
|
10
|
-
readonly execute: (db: PostgresJsDatabase, auth: TAuth, tenant: string | null, targets: BatchTargets) => Promise<unknown>;
|
|
11
|
-
}
|
|
12
|
-
export interface BatchRequest {
|
|
13
|
-
readonly action: string;
|
|
14
|
-
readonly targets: BatchTargets;
|
|
15
|
-
}
|
|
16
|
-
export declare function validateBatchRequest(body: unknown, validActions: string[]): BatchRequest;
|
|
17
|
-
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/resource/batch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC3C;AAED,MAAM,WAAW,WAAW,CAAC,KAAK;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAA;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1H,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC1H;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAC/B;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,YAAY,CAkDxF"}
|
package/dist/resource/batch.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { ValidationError } from '../errors/index.js';
|
|
2
|
-
export function validateBatchRequest(body, validActions) {
|
|
3
|
-
if (body === null || typeof body !== 'object') {
|
|
4
|
-
throw new ValidationError('Batch request body must be an object');
|
|
5
|
-
}
|
|
6
|
-
const obj = body;
|
|
7
|
-
const action = obj['action'];
|
|
8
|
-
if (typeof action !== 'string' || action.length === 0) {
|
|
9
|
-
throw new ValidationError({ action: ['action is required and must be a non-empty string'] });
|
|
10
|
-
}
|
|
11
|
-
if (!validActions.includes(action)) {
|
|
12
|
-
throw new ValidationError({
|
|
13
|
-
action: [`Unknown batch action "${action}". Valid actions: ${validActions.join(', ')}`],
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
const targets = obj['targets'];
|
|
17
|
-
if (targets === null || targets === undefined || typeof targets !== 'object') {
|
|
18
|
-
throw new ValidationError({ targets: ['targets is required and must be an object'] });
|
|
19
|
-
}
|
|
20
|
-
const t = targets;
|
|
21
|
-
const hasIds = Array.isArray(t['ids']);
|
|
22
|
-
const hasFilters = t['filters'] !== undefined && t['filters'] !== null && typeof t['filters'] === 'object';
|
|
23
|
-
if (!hasIds && !hasFilters) {
|
|
24
|
-
throw new ValidationError({ targets: ['targets must contain exactly one of "ids" or "filters"'] });
|
|
25
|
-
}
|
|
26
|
-
if (hasIds && hasFilters) {
|
|
27
|
-
throw new ValidationError({ targets: ['targets must contain exactly one of "ids" or "filters", not both'] });
|
|
28
|
-
}
|
|
29
|
-
if (hasIds) {
|
|
30
|
-
const ids = t['ids'];
|
|
31
|
-
if (ids.length === 0) {
|
|
32
|
-
throw new ValidationError({ 'targets.ids': ['ids array must not be empty'] });
|
|
33
|
-
}
|
|
34
|
-
for (const id of ids) {
|
|
35
|
-
if (typeof id !== 'string') {
|
|
36
|
-
throw new ValidationError({ 'targets.ids': ['all ids must be strings'] });
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return {
|
|
41
|
-
action,
|
|
42
|
-
targets: hasIds
|
|
43
|
-
? { ids: t['ids'] }
|
|
44
|
-
: { filters: t['filters'] },
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=batch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/resource/batch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAkBpD,MAAM,UAAU,oBAAoB,CAAC,IAAa,EAAE,YAAsB;IACxE,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,eAAe,CAAC,sCAAsC,CAAC,CAAA;IACnE,CAAC;IACD,MAAM,GAAG,GAAG,IAA+B,CAAA;IAE3C,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,mDAAmD,CAAC,EAAE,CAAC,CAAA;IAC9F,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,eAAe,CAAC;YACxB,MAAM,EAAE,CAAC,yBAAyB,MAAM,qBAAqB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACxF,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAA;IAC9B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7E,MAAM,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAA;IACvF,CAAC;IACD,MAAM,CAAC,GAAG,OAAkC,CAAA;IAE5C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IACtC,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAA;IAE1G,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,wDAAwD,CAAC,EAAE,CAAC,CAAA;IACpG,CAAC;IACD,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,kEAAkE,CAAC,EAAE,CAAC,CAAA;IAC9G,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAc,CAAA;QACjC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAA;QAC/E,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAA;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO,EAAE,MAAM;YACb,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAa,EAAE;YAC/B,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAA4B,EAAE;KACzD,CAAA;AACH,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { ResourceOperations, Resource, PaginationConfig } from './types.js';
|
|
2
|
-
import type { AuthRequirement, PermissionMeta } from '../di/types.js';
|
|
3
|
-
interface ResourceBuilderState {
|
|
4
|
-
database: string;
|
|
5
|
-
authRequirement: AuthRequirement;
|
|
6
|
-
permission: PermissionMeta | null;
|
|
7
|
-
pagination: PaginationConfig | null;
|
|
8
|
-
}
|
|
9
|
-
export declare function buildResource<TAuth>(name: string, operations: ResourceOperations<TAuth>, state: ResourceBuilderState): Resource<TAuth>;
|
|
10
|
-
export { type ResourceBuilderState };
|
|
11
|
-
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/resource/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAgB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAErE,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,eAAe,CAAA;IAChC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;IACjC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAA;CACpC;AAED,wBAAgB,aAAa,CAAC,KAAK,EACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,kBAAkB,CAAC,KAAK,CAAC,EACrC,KAAK,EAAE,oBAAoB,GAC1B,QAAQ,CAAC,KAAK,CAAC,CASjB;AAED,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAA"}
|
package/dist/resource/builder.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export function buildResource(name, operations, state) {
|
|
2
|
-
const meta = {
|
|
3
|
-
name,
|
|
4
|
-
database: state.database,
|
|
5
|
-
authRequirement: state.authRequirement,
|
|
6
|
-
permission: state.permission,
|
|
7
|
-
pagination: state.pagination,
|
|
8
|
-
};
|
|
9
|
-
return { meta, operations };
|
|
10
|
-
}
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/resource/builder.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,UAAqC,EACrC,KAA2B;IAE3B,MAAM,IAAI,GAAiB;QACzB,IAAI;QACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC7B,CAAC;AAED,OAAO,EAA6B,CAAA"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { TrunkError } from '../errors/base.js';
|
|
2
|
-
export declare class MethodNotAllowedError extends TrunkError {
|
|
3
|
-
readonly code: "METHOD_NOT_ALLOWED";
|
|
4
|
-
readonly httpStatus: 405;
|
|
5
|
-
constructor(method: string, resource: string);
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/resource/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,qBAAa,qBAAsB,SAAQ,UAAU;IACnD,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAS;IAC7C,QAAQ,CAAC,UAAU,EAAG,GAAG,CAAS;gBAEtB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAG7C"}
|
package/dist/resource/errors.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { TrunkError } from '../errors/base.js';
|
|
2
|
-
export class MethodNotAllowedError extends TrunkError {
|
|
3
|
-
code = 'METHOD_NOT_ALLOWED';
|
|
4
|
-
httpStatus = 405;
|
|
5
|
-
constructor(method, resource) {
|
|
6
|
-
super(`${method} not supported on ${resource}`);
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/resource/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,OAAO,qBAAsB,SAAQ,UAAU;IAC1C,IAAI,GAAG,oBAA6B,CAAA;IACpC,UAAU,GAAG,GAAY,CAAA;IAElC,YAAY,MAAc,EAAE,QAAgB;QAC1C,KAAK,CAAC,GAAG,MAAM,qBAAqB,QAAQ,EAAE,CAAC,CAAA;IACjD,CAAC;CACF"}
|
package/dist/resource/index.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type { Resource, ResourceOperations, ResourceMeta, ResourceId, ResourceListOp, ResourceListPaginatedOp, ResourceListCursorOp, ResourceGetOp, ResourceCreateOp, ResourceUpdateOp, ResourceDeleteOp, PaginationConfig, PaginationParams, PaginatedResponse } from './types.js';
|
|
2
|
-
export { buildResource } from './builder.js';
|
|
3
|
-
export { registerResource } from './register.js';
|
|
4
|
-
export { MethodNotAllowedError } from './errors.js';
|
|
5
|
-
export { encodeCursor, decodeCursor, buildPage } from './paginate.js';
|
|
6
|
-
export type { PageResult, CursorPaginationParams } from './paginate.js';
|
|
7
|
-
export { validateBatchRequest } from './batch.js';
|
|
8
|
-
export type { BatchAction, BatchTargets, BatchRequest } from './batch.js';
|
|
9
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resource/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnR,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACrE,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACjD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/resource/index.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { buildResource } from './builder.js';
|
|
2
|
-
export { registerResource } from './register.js';
|
|
3
|
-
export { MethodNotAllowedError } from './errors.js';
|
|
4
|
-
export { encodeCursor, decodeCursor, buildPage } from './paginate.js';
|
|
5
|
-
export { validateBatchRequest } from './batch.js';
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resource/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export interface PageResult<T> {
|
|
2
|
-
readonly items: T[];
|
|
3
|
-
readonly cursor: string | null;
|
|
4
|
-
readonly hasMore: boolean;
|
|
5
|
-
}
|
|
6
|
-
export interface CursorPaginationParams {
|
|
7
|
-
readonly cursor?: string;
|
|
8
|
-
readonly limit: number;
|
|
9
|
-
}
|
|
10
|
-
export declare function encodeCursor(values: readonly unknown[]): string;
|
|
11
|
-
export declare function decodeCursor(cursor: string): unknown[];
|
|
12
|
-
export declare function buildPage<T>(rows: readonly T[], limit: number, getCursor: (item: T) => string): PageResult<T>;
|
|
13
|
-
//# sourceMappingURL=paginate.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paginate.d.ts","sourceRoot":"","sources":["../../src/resource/paginate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAG/D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAYtD;AAED,wBAAgB,SAAS,CAAC,CAAC,EACzB,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAC7B,UAAU,CAAC,CAAC,CAAC,CAOf"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { ValidationError } from '../errors/index.js';
|
|
2
|
-
export function encodeCursor(values) {
|
|
3
|
-
const json = JSON.stringify(values);
|
|
4
|
-
return Buffer.from(json).toString('base64url');
|
|
5
|
-
}
|
|
6
|
-
export function decodeCursor(cursor) {
|
|
7
|
-
try {
|
|
8
|
-
const json = Buffer.from(cursor, 'base64url').toString('utf-8');
|
|
9
|
-
const parsed = JSON.parse(json);
|
|
10
|
-
if (!Array.isArray(parsed)) {
|
|
11
|
-
throw new ValidationError('Invalid cursor: expected encoded array');
|
|
12
|
-
}
|
|
13
|
-
return parsed;
|
|
14
|
-
}
|
|
15
|
-
catch (err) {
|
|
16
|
-
if (err instanceof ValidationError)
|
|
17
|
-
throw err;
|
|
18
|
-
throw new ValidationError('Invalid cursor: malformed or tampered value');
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export function buildPage(rows, limit, getCursor) {
|
|
22
|
-
const hasMore = rows.length > limit;
|
|
23
|
-
const items = hasMore ? rows.slice(0, limit) : [...rows];
|
|
24
|
-
const cursor = hasMore && items.length > 0
|
|
25
|
-
? encodeCursor([getCursor(items[items.length - 1])])
|
|
26
|
-
: null;
|
|
27
|
-
return { items, cursor, hasMore };
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=paginate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paginate.js","sourceRoot":"","sources":["../../src/resource/paginate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAapD,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,eAAe,CAAC,wCAAwC,CAAC,CAAA;QACrE,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,eAAe;YAAE,MAAM,GAAG,CAAA;QAC7C,MAAM,IAAI,eAAe,CAAC,6CAA6C,CAAC,CAAA;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,IAAkB,EAClB,KAAa,EACb,SAA8B;IAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QACxC,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,IAAI,CAAA;IACR,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACnC,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { FastifyInstance } from 'fastify';
|
|
2
|
-
import type { TrunkInstance } from '../trunk.js';
|
|
3
|
-
import type { Resource } from './types.js';
|
|
4
|
-
import type { TenantConfig } from '../tenant/types.js';
|
|
5
|
-
import type { Rbac } from '../rbac/types.js';
|
|
6
|
-
import { type ContextOptions } from '../http/middleware.js';
|
|
7
|
-
interface RegisterOptions {
|
|
8
|
-
instance: TrunkInstance;
|
|
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/resource/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAA;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAQzE,UAAU,eAAe;IACvB,QAAQ,EAAE,aAAa,CAAA;IACvB,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 { TrunkError, NotFoundError } from '../errors/index.js';
|
|
4
|
-
import { buildErrorResponse, buildInternalErrorResponse } from '../http/response.js';
|
|
5
|
-
import { parse } from '../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('../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('../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 TrunkError) {
|
|
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 /resource/: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 /resource/: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 /resource/: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 /resource/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 /resource/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
|