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.
Files changed (91) hide show
  1. package/dist/cli/commands/check.d.ts.map +1 -1
  2. package/dist/cli/commands/check.js +80 -0
  3. package/dist/cli/commands/check.js.map +1 -1
  4. package/dist/cli/commands/install.d.ts +1 -1
  5. package/dist/cli/commands/install.d.ts.map +1 -1
  6. package/dist/cli/commands/install.js +3 -6
  7. package/dist/cli/commands/install.js.map +1 -1
  8. package/dist/cli/commands/upgrade.d.ts +2 -0
  9. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  10. package/dist/cli/commands/upgrade.js +20 -0
  11. package/dist/cli/commands/upgrade.js.map +1 -0
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +9 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/jsonb/index.d.ts +2 -0
  20. package/dist/jsonb/index.d.ts.map +1 -0
  21. package/dist/jsonb/index.js +2 -0
  22. package/dist/jsonb/index.js.map +1 -0
  23. package/dist/jsonb/namespace.d.ts +11 -0
  24. package/dist/jsonb/namespace.d.ts.map +1 -0
  25. package/dist/jsonb/namespace.js +11 -0
  26. package/dist/jsonb/namespace.js.map +1 -0
  27. package/dist/jsonb/query.d.ts +5 -0
  28. package/dist/jsonb/query.d.ts.map +1 -0
  29. package/dist/jsonb/query.js +11 -0
  30. package/dist/jsonb/query.js.map +1 -0
  31. package/dist/validation/doctrine.d.ts +13 -0
  32. package/dist/validation/doctrine.d.ts.map +1 -0
  33. package/dist/validation/doctrine.js +100 -0
  34. package/dist/validation/doctrine.js.map +1 -0
  35. package/dist/vector/index.d.ts +2 -1
  36. package/dist/vector/index.d.ts.map +1 -1
  37. package/dist/vector/index.js +1 -1
  38. package/dist/vector/index.js.map +1 -1
  39. package/dist/vector/namespace.d.ts +10 -4
  40. package/dist/vector/namespace.d.ts.map +1 -1
  41. package/dist/vector/namespace.js +10 -4
  42. package/dist/vector/namespace.js.map +1 -1
  43. package/dist/vector/query.d.ts +14 -1
  44. package/dist/vector/query.d.ts.map +1 -1
  45. package/dist/vector/query.js +39 -1
  46. package/dist/vector/query.js.map +1 -1
  47. package/dist/workspace/sync.d.ts +1 -0
  48. package/dist/workspace/sync.d.ts.map +1 -1
  49. package/dist/workspace/sync.js +1 -1
  50. package/dist/workspace/sync.js.map +1 -1
  51. package/package.json +1 -1
  52. package/dist/drizzle/index.d.ts +0 -3
  53. package/dist/drizzle/index.d.ts.map +0 -1
  54. package/dist/drizzle/index.js +0 -3
  55. package/dist/drizzle/index.js.map +0 -1
  56. package/dist/resource/batch.d.ts +0 -17
  57. package/dist/resource/batch.d.ts.map +0 -1
  58. package/dist/resource/batch.js +0 -47
  59. package/dist/resource/batch.js.map +0 -1
  60. package/dist/resource/builder.d.ts +0 -11
  61. package/dist/resource/builder.d.ts.map +0 -1
  62. package/dist/resource/builder.js +0 -12
  63. package/dist/resource/builder.js.map +0 -1
  64. package/dist/resource/errors.d.ts +0 -7
  65. package/dist/resource/errors.d.ts.map +0 -1
  66. package/dist/resource/errors.js +0 -9
  67. package/dist/resource/errors.js.map +0 -1
  68. package/dist/resource/index.d.ts +0 -9
  69. package/dist/resource/index.d.ts.map +0 -1
  70. package/dist/resource/index.js +0 -6
  71. package/dist/resource/index.js.map +0 -1
  72. package/dist/resource/paginate.d.ts +0 -13
  73. package/dist/resource/paginate.d.ts.map +0 -1
  74. package/dist/resource/paginate.js +0 -29
  75. package/dist/resource/paginate.js.map +0 -1
  76. package/dist/resource/register.d.ts +0 -16
  77. package/dist/resource/register.d.ts.map +0 -1
  78. package/dist/resource/register.js +0 -181
  79. package/dist/resource/register.js.map +0 -1
  80. package/dist/resource/types.d.ts +0 -69
  81. package/dist/resource/types.d.ts.map +0 -1
  82. package/dist/resource/types.js +0 -2
  83. package/dist/resource/types.js.map +0 -1
  84. package/dist/trunk.d.ts +0 -35
  85. package/dist/trunk.d.ts.map +0 -1
  86. package/dist/trunk.js +0 -102
  87. package/dist/trunk.js.map +0 -1
  88. package/dist/validation/surface.d.ts +0 -4
  89. package/dist/validation/surface.d.ts.map +0 -1
  90. package/dist/validation/surface.js +0 -55
  91. package/dist/validation/surface.js.map +0 -1
@@ -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 similarity/ranking queries. */
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
- /** Computes ts_rank for full-text search result ordering. */
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;AACtH,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAEvD,oGAAoG;AACpG,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,mDAAmD;IACnD,SAAS;IACT,6DAA6D;IAC7D,IAAI,EAAE,MAAM;IACZ,mEAAmE;IACnE,QAAQ,EAAE,uBAAuB;CAClC,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"}
@@ -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 tsRank(column: Column, query: string, config?: string): SQL<number>;
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,CAGlF"}
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"}
@@ -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
- return sql `ts_rank(${column}, to_tsquery(${tsConfig}, ${query}))`;
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
@@ -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,MAAc,EAAE,KAAa,EAAE,MAAe;IACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,SAAS,CAAA;IACpC,OAAO,GAAG,CAAQ,WAAW,MAAM,gBAAgB,QAAQ,KAAK,KAAK,IAAI,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/vector/query.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export interface SyncInput {
4
4
  readonly config: Blueprint;
5
5
  readonly cwd: string;
6
6
  readonly appName: string;
7
+ readonly pipeworkVersion?: string;
7
8
  }
8
9
  export interface SyncResult {
9
10
  readonly files: readonly GeneratedFile[];
@@ -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;CACzB;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"}
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"}
@@ -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":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/workspace/sync.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipework",
3
- "version": "0.7.2",
3
+ "version": "0.7.5",
4
4
  "description": "TypeScript framework for multi-tenant SaaS applications. PostgreSQL-only.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,3 +0,0 @@
1
- export * as query from 'drizzle-orm';
2
- export * as schema from 'drizzle-orm/pg-core';
3
- //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -1,3 +0,0 @@
1
- export * as query from 'drizzle-orm';
2
- export * as schema from 'drizzle-orm/pg-core';
3
- //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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