@happyvertical/smrt-core 0.36.5 → 0.36.7
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/collection.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/consumer-plugin/index.d.ts.map +1 -1
- package/dist/consumer-plugin/index.js +7 -3
- package/dist/consumer-plugin/index.js.map +1 -1
- package/dist/database.d.ts +3 -3
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js.map +1 -1
- package/dist/embeddings/provider.d.ts +14 -2
- package/dist/embeddings/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js +3 -3
- package/dist/embeddings/provider.js.map +1 -1
- package/dist/embeddings/storage.js.map +1 -1
- package/dist/errors.d.ts +22 -22
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +5 -4
- package/dist/errors.js.map +1 -1
- package/dist/generators/cli.d.ts +4 -22
- package/dist/generators/cli.d.ts.map +1 -1
- package/dist/generators/cli.js +9 -5
- package/dist/generators/cli.js.map +1 -1
- package/dist/generators/mcp-runtime-template.d.ts +1 -1
- package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
- package/dist/generators/mcp-runtime-template.js.map +1 -1
- package/dist/generators/mcp.d.ts +16 -4
- package/dist/generators/mcp.d.ts.map +1 -1
- package/dist/generators/mcp.js +25 -9
- package/dist/generators/mcp.js.map +1 -1
- package/dist/generators/rest.d.ts +6 -5
- package/dist/generators/rest.d.ts.map +1 -1
- package/dist/generators/rest.js +8 -5
- package/dist/generators/rest.js.map +1 -1
- package/dist/generators/swagger.d.ts +12 -2
- package/dist/generators/swagger.d.ts.map +1 -1
- package/dist/generators/swagger.js +6 -3
- package/dist/generators/swagger.js.map +1 -1
- package/dist/knowledge.d.ts +12 -1
- package/dist/knowledge.d.ts.map +1 -1
- package/dist/knowledge.js.map +1 -1
- package/dist/lazy-config.d.ts.map +1 -1
- package/dist/lazy-config.js.map +1 -1
- package/dist/manifest/generator.d.ts.map +1 -1
- package/dist/manifest/generator.js +14 -12
- package/dist/manifest/generator.js.map +1 -1
- package/dist/manifest/manager.d.ts +3 -3
- package/dist/manifest/manager.d.ts.map +1 -1
- package/dist/manifest/manager.js.map +1 -1
- package/dist/manifest/manifest-loader.d.ts +3 -2
- package/dist/manifest/manifest-loader.d.ts.map +1 -1
- package/dist/manifest/manifest-loader.js +3 -2
- package/dist/manifest/manifest-loader.js.map +1 -1
- package/dist/manifest/static-manifest.js +2 -2
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +2 -2
- package/dist/manifest/test-manifest-stub.js +2 -2
- package/dist/manifest/test-manifest-stub.js.map +1 -1
- package/dist/manifest.json +2 -2
- package/dist/mcp-advisor/index.d.ts +1 -1
- package/dist/mcp-advisor/index.d.ts.map +1 -1
- package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -1
- package/dist/mcp-advisor/types.d.ts +5 -5
- package/dist/mcp-advisor/types.d.ts.map +1 -1
- package/dist/migrations/differ.js.map +1 -1
- package/dist/scanner/manifest-generator.d.ts +11 -3
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +19 -15
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/types.d.ts +60 -6
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/schema/code-generator.d.ts.map +1 -1
- package/dist/schema/ddl/base-strategy.d.ts +2 -2
- package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/base-strategy.js.map +1 -1
- package/dist/schema/ddl/sqlite-strategy.d.ts +1 -1
- package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/sqlite-strategy.js.map +1 -1
- package/dist/schema/ddl/types.d.ts +1 -1
- package/dist/schema/ddl/types.d.ts.map +1 -1
- package/dist/schema/generator.d.ts +27 -4
- package/dist/schema/generator.d.ts.map +1 -1
- package/dist/schema/generator.js +3 -2
- package/dist/schema/generator.js.map +1 -1
- package/dist/schema/override-system.d.ts +3 -3
- package/dist/schema/override-system.d.ts.map +1 -1
- package/dist/schema/schema-aggregator.d.ts.map +1 -1
- package/dist/schema/schema-manager.d.ts.map +1 -1
- package/dist/schema/schema-manager.js +12 -4
- package/dist/schema/schema-manager.js.map +1 -1
- package/dist/schema/types.d.ts +1 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/utils.d.ts +6 -1
- package/dist/schema/utils.d.ts.map +1 -1
- package/dist/schema/utils.js +2 -1
- package/dist/schema/utils.js.map +1 -1
- package/dist/signals/sanitizer.d.ts +1 -1
- package/dist/signals/sanitizer.d.ts.map +1 -1
- package/dist/signals/sanitizer.js +12 -2
- package/dist/signals/sanitizer.js.map +1 -1
- package/dist/smrt-knowledge.json +4 -4
- package/dist/system/types.d.ts +2 -2
- package/dist/system/types.d.ts.map +1 -1
- package/dist/system-fields.d.ts +5 -43
- package/dist/system-fields.d.ts.map +1 -1
- package/dist/system-fields.js +2 -1
- package/dist/system-fields.js.map +1 -1
- package/dist/test-utils.d.ts +39 -13
- package/dist/test-utils.d.ts.map +1 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js.map +1 -1
- package/dist/tools/tool-executor.d.ts +19 -5
- package/dist/tools/tool-executor.d.ts.map +1 -1
- package/dist/tools/tool-executor.js +4 -2
- package/dist/tools/tool-executor.js.map +1 -1
- package/dist/tools/tool-generator.d.ts +8 -1
- package/dist/tools/tool-generator.d.ts.map +1 -1
- package/dist/tools/tool-generator.js +10 -11
- package/dist/tools/tool-generator.js.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils.d.ts +16 -8
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js.map +1 -1
- package/dist/vite-plugin/index.d.ts.map +1 -1
- package/dist/vite-plugin/index.js +9 -7
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -1
- package/dist/vite-plugin/sveltekit-generator.js +4 -3
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
- package/dist/vite-plugin/templates/default-ui.ts +20 -6
- package/package.json +4 -4
package/dist/scanner/types.d.ts
CHANGED
|
@@ -4,6 +4,60 @@ import { SmartObjectConfig } from '../registry.js';
|
|
|
4
4
|
* Example: "@happyvertical/smrt-core:Product"
|
|
5
5
|
*/
|
|
6
6
|
export type QualifiedClassName = `${string}:${string}`;
|
|
7
|
+
/**
|
|
8
|
+
* Structured metadata attached to a field definition under `_meta`.
|
|
9
|
+
*
|
|
10
|
+
* Captures the field-helper options the scanner and schema/manifest
|
|
11
|
+
* generators read off a field (`sqlType`, `nullable`, `__tenancy`, …). The
|
|
12
|
+
* index signature keeps the bag open for forward-compatible keys without
|
|
13
|
+
* forcing every consumer through `any`.
|
|
14
|
+
*/
|
|
15
|
+
export interface FieldMeta {
|
|
16
|
+
/** Explicit SQL type override (e.g. 'UUID') applied during schema generation. */
|
|
17
|
+
sqlType?: string;
|
|
18
|
+
/** Storage type for cross-package reference ids ('text' forces TEXT). */
|
|
19
|
+
idType?: 'uuid' | 'text';
|
|
20
|
+
/** When true, the column is nullable regardless of `required`. */
|
|
21
|
+
nullable?: boolean;
|
|
22
|
+
/** Mirror of the field's required flag captured at registration. */
|
|
23
|
+
required?: boolean;
|
|
24
|
+
/** Default value carried in metadata for runtime-registry generation. */
|
|
25
|
+
default?: unknown;
|
|
26
|
+
/** Marks the field as the primary key column. */
|
|
27
|
+
primaryKey?: boolean;
|
|
28
|
+
/** Marks the column as unique. */
|
|
29
|
+
unique?: boolean;
|
|
30
|
+
/** Column description carried into generated schema. */
|
|
31
|
+
description?: string;
|
|
32
|
+
/** Opt-in column/JSON-path indexing flag. */
|
|
33
|
+
indexed?: boolean;
|
|
34
|
+
/** Foreign-key delete action carried in metadata. */
|
|
35
|
+
onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT';
|
|
36
|
+
/** Excludes the field from persistence when true. */
|
|
37
|
+
transient?: boolean;
|
|
38
|
+
/** Numeric/length validation bounds and pattern. */
|
|
39
|
+
min?: number;
|
|
40
|
+
max?: number;
|
|
41
|
+
minLength?: number;
|
|
42
|
+
maxLength?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Validation regex. A string source, a `RegExp`, or — when a manifest was
|
|
45
|
+
* JSON-serialized and a `RegExp` collapsed to `{}` — an opaque object. Read
|
|
46
|
+
* sites must narrow before accessing `.source`.
|
|
47
|
+
*/
|
|
48
|
+
pattern?: unknown;
|
|
49
|
+
/** Tenancy metadata injected for tenant-scoped models. */
|
|
50
|
+
__tenancy?: {
|
|
51
|
+
isTenantIdField?: boolean;
|
|
52
|
+
[key: string]: unknown;
|
|
53
|
+
};
|
|
54
|
+
/** Report-aggregate metadata injected by the report normalizer. */
|
|
55
|
+
__report?: {
|
|
56
|
+
kind?: string;
|
|
57
|
+
[key: string]: unknown;
|
|
58
|
+
};
|
|
59
|
+
[key: string]: unknown;
|
|
60
|
+
}
|
|
7
61
|
/**
|
|
8
62
|
* Controls how a class is exposed in manifests and across packages
|
|
9
63
|
*/
|
|
@@ -11,14 +65,14 @@ export type SmrtVisibility = 'public' | 'internal' | 'test';
|
|
|
11
65
|
export interface FieldDefinition {
|
|
12
66
|
type: 'text' | 'decimal' | 'boolean' | 'integer' | 'datetime' | 'json' | 'foreignKey' | 'crossPackageRef' | 'oneToMany' | 'manyToMany' | 'meta';
|
|
13
67
|
required?: boolean;
|
|
14
|
-
default?:
|
|
68
|
+
default?: unknown;
|
|
15
69
|
min?: number;
|
|
16
70
|
max?: number;
|
|
17
71
|
maxLength?: number;
|
|
18
72
|
minLength?: number;
|
|
19
73
|
related?: string;
|
|
20
74
|
description?: string;
|
|
21
|
-
_meta?:
|
|
75
|
+
_meta?: FieldMeta;
|
|
22
76
|
transient?: boolean;
|
|
23
77
|
/**
|
|
24
78
|
* Sensitive value (API secrets, credentials, tax IDs). Still persisted, but
|
|
@@ -46,7 +100,7 @@ export interface MethodDefinition {
|
|
|
46
100
|
name: string;
|
|
47
101
|
type: string;
|
|
48
102
|
optional: boolean;
|
|
49
|
-
default?:
|
|
103
|
+
default?: unknown;
|
|
50
104
|
}>;
|
|
51
105
|
returnType: string;
|
|
52
106
|
description?: string;
|
|
@@ -65,7 +119,7 @@ export interface ManifestColumnDefinition {
|
|
|
65
119
|
referenceKind?: 'id' | 'foreignKey' | 'crossPackageRef' | 'tenantId';
|
|
66
120
|
notNull?: boolean;
|
|
67
121
|
unique?: boolean;
|
|
68
|
-
default?:
|
|
122
|
+
default?: unknown;
|
|
69
123
|
}
|
|
70
124
|
/**
|
|
71
125
|
* Pre-generated schema index definition for manifest
|
|
@@ -249,7 +303,7 @@ export interface SmartObjectDefinition {
|
|
|
249
303
|
function: {
|
|
250
304
|
name: string;
|
|
251
305
|
description?: string;
|
|
252
|
-
parameters?: Record<string,
|
|
306
|
+
parameters?: Record<string, unknown>;
|
|
253
307
|
};
|
|
254
308
|
}>;
|
|
255
309
|
/**
|
|
@@ -274,7 +328,7 @@ export interface SmartObjectDefinition {
|
|
|
274
328
|
* Static properties captured from the class definition
|
|
275
329
|
* Currently used for `static uiSlots` on Agent subclasses
|
|
276
330
|
*/
|
|
277
|
-
staticProperties?: Record<string,
|
|
331
|
+
staticProperties?: Record<string, unknown>;
|
|
278
332
|
/**
|
|
279
333
|
* Auto-generated agent manifest
|
|
280
334
|
* Only present for classes with `agent` in their decorator config
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,UAAU,GACV,MAAM,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,IAAI,EACA,MAAM,GACN,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,MAAM,GACN,YAAY,GACZ,iBAAiB,GACjB,WAAW,GACX,YAAY,GACZ,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/schema/code-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/schema/code-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAIV,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAEpB,qBAAa,mBAAmB;IAC9B;;OAEG;IACH,oBAAoB,CAClB,UAAU,EAAE,qBAAqB,EACjC,MAAM,EAAE,gBAAgB,GACvB,MAAM;IAOT;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,MAAM;IASrE;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,MAAM;IAe1E;;OAEG;IACH,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACxC,MAAM;CAuBV"}
|
|
@@ -60,12 +60,12 @@ export declare abstract class BaseDDLStrategy implements DDLStrategy {
|
|
|
60
60
|
* the SQL NULL keyword. Boolean rendering is bridged through
|
|
61
61
|
* `formatBooleanDefault` so engine overrides (SQLite → 0/1) still apply.
|
|
62
62
|
*/
|
|
63
|
-
formatDefaultValue(value:
|
|
63
|
+
formatDefaultValue(value: unknown, type: SQLDataType): string;
|
|
64
64
|
/**
|
|
65
65
|
* Format boolean default
|
|
66
66
|
* Override for engines that use INTEGER (SQLite)
|
|
67
67
|
*/
|
|
68
|
-
protected formatBooleanDefault(value:
|
|
68
|
+
protected formatBooleanDefault(value: boolean): string;
|
|
69
69
|
/**
|
|
70
70
|
* Whether this engine supports triggers
|
|
71
71
|
* Override in DuckDB strategy to return false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-strategy.d.ts","sourceRoot":"","sources":["../../../src/schema/ddl/base-strategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4B9D;;;;;GAKG;AACH,8BAAsB,eAAgB,YAAW,WAAW;IAC1D,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEzC;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAuBrD;;;;OAIG;IACH,wBAAwB,CACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,gBAAgB,GAC1B,MAAM;IAuCT;;;OAGG;IACH,SAAS,CAAC,+BAA+B,CACvC,OAAO,EAAE,eAAe,EAAE,GACzB,MAAM,EAAE;IAsBX;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE;IAwDnD;;;;;OAKG;IACH,SAAS,CAAC,6BAA6B,CACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,MAAM;IAKT;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE;IAsBpD;;;OAGG;IACH,SAAS,CAAC,wBAAwB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,MAAM;IAcT;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IA2BlC;;;;;;;;;OASG;IACH,kBAAkB,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"base-strategy.d.ts","sourceRoot":"","sources":["../../../src/schema/ddl/base-strategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4B9D;;;;;GAKG;AACH,8BAAsB,eAAgB,YAAW,WAAW;IAC1D,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEzC;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAuBrD;;;;OAIG;IACH,wBAAwB,CACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,gBAAgB,GAC1B,MAAM;IAuCT;;;OAGG;IACH,SAAS,CAAC,+BAA+B,CACvC,OAAO,EAAE,eAAe,EAAE,GACzB,MAAM,EAAE;IAsBX;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE;IAwDnD;;;;;OAKG;IACH,SAAS,CAAC,6BAA6B,CACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,MAAM;IAKT;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE;IAsBpD;;;OAGG;IACH,SAAS,CAAC,wBAAwB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,MAAM;IAcT;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IA2BlC;;;;;;;;;OASG;IACH,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM;IAS7D;;;OAGG;IACH,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAItD;;;OAGG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;OAGG;IACH,oBAAoB,IAAI,OAAO;CAGhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-strategy.js","sources":["../../../src/schema/ddl/base-strategy.ts"],"sourcesContent":["/**\n * Base DDL Strategy - Shared logic for all database engines\n *\n * Provides common DDL generation logic that engine-specific strategies\n * can override for their particular requirements.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport {\n formatDefaultValue as formatDefaultValueShared,\n isSafeIdentifier,\n isSafeIdentifierPath,\n quoteIdentifier,\n quoteStringLiteral,\n} from '../sql-identifiers.js';\nimport type {\n ColumnDefinition,\n IndexDefinition,\n SchemaDefinition,\n SQLDataType,\n TriggerDefinition,\n} from '../types.js';\nimport type { DatabaseEngine, DDLStrategy } from './types.js';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Validate the column + JSON path used to build a JSON-path index expression.\n *\n * The path segment is embedded as a SQL string literal inside a dialect\n * function/operator (`json_extract(\"col\", '$.path')` / `\"col\"->>'path'`), and\n * the column as a delimited identifier. We escape both, but also reject paths\n * or columns that aren't simple (dotted) identifiers so a malformed `@meta`\n * field name can't smuggle structure into the expression even after escaping.\n * These names are developer-controlled build-time inputs, so an invalid one is\n * a programming error and throwing is the safest, loudest outcome.\n */\nfunction assertSafeJsonPathTarget(jsonColumn: string, path: string): void {\n if (!isSafeIdentifier(jsonColumn)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index column \"${jsonColumn}\": must be a simple identifier`,\n );\n }\n if (!isSafeIdentifierPath(path)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index path \"${path}\": must be a simple (dotted) identifier`,\n );\n }\n}\n\n/**\n * Abstract base class for DDL strategies\n *\n * Implements common DDL generation patterns. Engine-specific strategies\n * extend this class and override methods as needed.\n */\nexport abstract class BaseDDLStrategy implements DDLStrategy {\n abstract readonly engine: DatabaseEngine;\n\n /**\n * Generate CREATE TABLE statement\n */\n generateCreateTable(schema: SchemaDefinition): string {\n const { tableName, columns, indexes = [] } = schema;\n\n let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (\\n`;\n\n // Generate column definitions\n const columnDefs: string[] = [];\n for (const [columnName, columnDef] of Object.entries(columns)) {\n columnDefs.push(this.generateColumnDefinition(columnName, columnDef));\n }\n\n // Add inline UNIQUE constraints for engines that require them\n if (this.requiresInlineUnique() && indexes.length > 0) {\n const uniqueConstraints = this.generateInlineUniqueConstraints(indexes);\n columnDefs.push(...uniqueConstraints);\n }\n\n sql += columnDefs.map((def) => ` ${def}`).join(',\\n');\n sql += '\\n);';\n\n return sql;\n }\n\n /**\n * Generate a single column definition\n *\n * Public so SchemaManager can reuse it for ALTER TABLE ADD COLUMN.\n */\n generateColumnDefinition(\n columnName: string,\n columnDef: ColumnDefinition,\n ): string {\n const parts: string[] = [\n quoteIdentifier(columnName),\n this.mapType(columnDef.type),\n ];\n\n // Primary key\n if (columnDef.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n\n // NOT NULL (skip for primary key - it's implicit)\n if (columnDef.notNull && !columnDef.primaryKey) {\n parts.push('NOT NULL');\n }\n\n // UNIQUE (for single-column unique, not composite)\n // Skip if engine requires inline unique - those are handled separately\n if (columnDef.unique && !this.requiresInlineUnique()) {\n parts.push('UNIQUE');\n }\n\n // DEFAULT value\n if (columnDef.defaultValue !== undefined) {\n const formatted = this.formatDefaultValue(\n columnDef.defaultValue,\n columnDef.type,\n );\n parts.push(`DEFAULT ${formatted}`);\n }\n\n // CHECK constraint\n if (columnDef.check) {\n parts.push(`CHECK (${columnDef.check})`);\n }\n\n return parts.join(' ');\n }\n\n /**\n * Generate inline UNIQUE constraints for composite indexes\n * Used by engines that require inline UNIQUE for UPSERT to work (DuckDB)\n */\n protected generateInlineUniqueConstraints(\n indexes: IndexDefinition[],\n ): string[] {\n const constraints: string[] = [];\n\n if (!indexes || !Array.isArray(indexes)) {\n return constraints;\n }\n\n for (const index of indexes) {\n // Skip malformed index entries\n if (!index || !index.columns || !Array.isArray(index.columns)) {\n continue;\n }\n\n if (index.unique && index.columns.length > 0) {\n const columns = index.columns.map((c) => quoteIdentifier(c)).join(', ');\n constraints.push(`UNIQUE(${columns})`);\n }\n }\n\n return constraints;\n }\n\n /**\n * Generate CREATE INDEX statements\n * Override in engine-specific strategies if needed\n */\n generateIndexes(schema: SchemaDefinition): string[] {\n const { tableName, indexes = [] } = schema;\n const statements: string[] = [];\n\n if (!indexes || indexes.length === 0) {\n return statements;\n }\n\n for (const index of indexes) {\n // Narrow the jsonPath target up-front so the formatter call doesn't\n // need optional-chained args (and so the malformed-entry check has a\n // single source of truth).\n const jsonPath =\n index?.jsonPath?.column && index.jsonPath.path ? index.jsonPath : null;\n if (\n !index ||\n (!jsonPath &&\n (!index.columns ||\n !Array.isArray(index.columns) ||\n index.columns.length === 0))\n ) {\n logger.warn(`[DDL] Skipping malformed index: ${JSON.stringify(index)}`);\n continue;\n }\n\n // Skip UNIQUE indexes if engine requires them inline\n if (index.unique && this.requiresInlineUnique()) {\n continue;\n }\n\n const indexType = index.unique ? 'UNIQUE INDEX' : 'INDEX';\n\n // JSON-path indexes use a dialect-specific expression\n const target = jsonPath\n ? `(${this.formatJsonPathIndexExpression(\n jsonPath.column,\n jsonPath.path,\n )})`\n : index.columns.map((c) => quoteIdentifier(c)).join(', ');\n\n let sql = `CREATE ${indexType} IF NOT EXISTS ${quoteIdentifier(\n index.name,\n )} ON ${quoteIdentifier(tableName)} (${target})`;\n\n // Partial index condition\n if (index.where) {\n sql += ` WHERE ${index.where}`;\n }\n\n sql += ';';\n statements.push(sql);\n }\n\n return statements;\n }\n\n /**\n * Render the SQL expression used to index a JSON path inside a JSONB column.\n * Subclasses override for dialect-specific syntax.\n *\n * Default (ANSI-ish): `<jsonColumn>->>'<path>'` — works on Postgres.\n */\n protected formatJsonPathIndexExpression(\n jsonColumn: string,\n path: string,\n ): string {\n assertSafeJsonPathTarget(jsonColumn, path);\n return `${quoteIdentifier(jsonColumn)}->>${quoteStringLiteral(path)}`;\n }\n\n /**\n * Generate CREATE TRIGGER statements\n * Override in engine-specific strategies - DuckDB returns empty\n */\n generateTriggers(schema: SchemaDefinition): string[] {\n if (!this.supportsTriggers()) {\n return [];\n }\n\n const { tableName, triggers = [] } = schema;\n const statements: string[] = [];\n\n if (!triggers || triggers.length === 0) {\n return statements;\n }\n\n for (const trigger of triggers) {\n const sql = this.generateTriggerStatement(tableName, trigger);\n if (sql) {\n statements.push(sql);\n }\n }\n\n return statements;\n }\n\n /**\n * Generate a single trigger statement\n * Can be overridden for engine-specific trigger syntax\n */\n protected generateTriggerStatement(\n tableName: string,\n trigger: TriggerDefinition,\n ): string {\n // Default SQLite-style trigger syntax\n let sql = `CREATE TRIGGER IF NOT EXISTS ${quoteIdentifier(trigger.name)}\\n`;\n sql += `${trigger.when} ${trigger.event} ON ${quoteIdentifier(tableName)}\\n`;\n\n if (trigger.condition) {\n sql += `WHEN ${trigger.condition}\\n`;\n }\n\n sql += `BEGIN\\n${trigger.body}\\nEND;`;\n\n return sql;\n }\n\n /**\n * Map abstract SQL type to engine-specific type\n * Default implementation - override for engine-specific types\n */\n mapType(type: SQLDataType): string {\n // Default mapping works for most engines\n switch (type) {\n case 'TEXT':\n return 'TEXT';\n case 'INTEGER':\n return 'INTEGER';\n case 'REAL':\n return 'REAL';\n case 'BLOB':\n return 'BLOB';\n case 'BOOLEAN':\n return 'BOOLEAN';\n case 'JSON':\n return 'JSON';\n case 'TIMESTAMP':\n return 'TIMESTAMP';\n case 'UUID':\n // Fallback for engines without a native uuid type (e.g. SQLite):\n // store as TEXT. PostgreSQL/DuckDB override this with their native\n // uuid type. (R11)\n return 'TEXT';\n default:\n return 'TEXT';\n }\n }\n\n /**\n * Format default value for SQL.\n *\n * Delegates to the shared, injection-safe `formatDefaultValue`\n * (`schema/sql-identifiers.ts`) so every DDL path uses one set of rules:\n * an allowlist of SQL keyword/function defaults (not \"contains `(`\"),\n * type-driven literal quoting, and no folding of the string `\"null\"` into\n * the SQL NULL keyword. Boolean rendering is bridged through\n * `formatBooleanDefault` so engine overrides (SQLite → 0/1) still apply.\n */\n formatDefaultValue(value: any, type: SQLDataType): string {\n return formatDefaultValueShared(value, type, {\n booleanLiterals: [\n this.formatBooleanDefault(true),\n this.formatBooleanDefault(false),\n ],\n });\n }\n\n /**\n * Format boolean default\n * Override for engines that use INTEGER (SQLite)\n */\n protected formatBooleanDefault(value: any): string {\n return value ? 'TRUE' : 'FALSE';\n }\n\n /**\n * Whether this engine supports triggers\n * Override in DuckDB strategy to return false\n */\n supportsTriggers(): boolean {\n return true;\n }\n\n /**\n * Whether UNIQUE constraints must be inline for UPSERT\n * Override in DuckDB strategy to return true\n */\n requiresInlineUnique(): boolean {\n return false;\n }\n}\n"],"names":["formatDefaultValueShared"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base-strategy.js","sources":["../../../src/schema/ddl/base-strategy.ts"],"sourcesContent":["/**\n * Base DDL Strategy - Shared logic for all database engines\n *\n * Provides common DDL generation logic that engine-specific strategies\n * can override for their particular requirements.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport {\n formatDefaultValue as formatDefaultValueShared,\n isSafeIdentifier,\n isSafeIdentifierPath,\n quoteIdentifier,\n quoteStringLiteral,\n} from '../sql-identifiers.js';\nimport type {\n ColumnDefinition,\n IndexDefinition,\n SchemaDefinition,\n SQLDataType,\n TriggerDefinition,\n} from '../types.js';\nimport type { DatabaseEngine, DDLStrategy } from './types.js';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Validate the column + JSON path used to build a JSON-path index expression.\n *\n * The path segment is embedded as a SQL string literal inside a dialect\n * function/operator (`json_extract(\"col\", '$.path')` / `\"col\"->>'path'`), and\n * the column as a delimited identifier. We escape both, but also reject paths\n * or columns that aren't simple (dotted) identifiers so a malformed `@meta`\n * field name can't smuggle structure into the expression even after escaping.\n * These names are developer-controlled build-time inputs, so an invalid one is\n * a programming error and throwing is the safest, loudest outcome.\n */\nfunction assertSafeJsonPathTarget(jsonColumn: string, path: string): void {\n if (!isSafeIdentifier(jsonColumn)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index column \"${jsonColumn}\": must be a simple identifier`,\n );\n }\n if (!isSafeIdentifierPath(path)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index path \"${path}\": must be a simple (dotted) identifier`,\n );\n }\n}\n\n/**\n * Abstract base class for DDL strategies\n *\n * Implements common DDL generation patterns. Engine-specific strategies\n * extend this class and override methods as needed.\n */\nexport abstract class BaseDDLStrategy implements DDLStrategy {\n abstract readonly engine: DatabaseEngine;\n\n /**\n * Generate CREATE TABLE statement\n */\n generateCreateTable(schema: SchemaDefinition): string {\n const { tableName, columns, indexes = [] } = schema;\n\n let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (\\n`;\n\n // Generate column definitions\n const columnDefs: string[] = [];\n for (const [columnName, columnDef] of Object.entries(columns)) {\n columnDefs.push(this.generateColumnDefinition(columnName, columnDef));\n }\n\n // Add inline UNIQUE constraints for engines that require them\n if (this.requiresInlineUnique() && indexes.length > 0) {\n const uniqueConstraints = this.generateInlineUniqueConstraints(indexes);\n columnDefs.push(...uniqueConstraints);\n }\n\n sql += columnDefs.map((def) => ` ${def}`).join(',\\n');\n sql += '\\n);';\n\n return sql;\n }\n\n /**\n * Generate a single column definition\n *\n * Public so SchemaManager can reuse it for ALTER TABLE ADD COLUMN.\n */\n generateColumnDefinition(\n columnName: string,\n columnDef: ColumnDefinition,\n ): string {\n const parts: string[] = [\n quoteIdentifier(columnName),\n this.mapType(columnDef.type),\n ];\n\n // Primary key\n if (columnDef.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n\n // NOT NULL (skip for primary key - it's implicit)\n if (columnDef.notNull && !columnDef.primaryKey) {\n parts.push('NOT NULL');\n }\n\n // UNIQUE (for single-column unique, not composite)\n // Skip if engine requires inline unique - those are handled separately\n if (columnDef.unique && !this.requiresInlineUnique()) {\n parts.push('UNIQUE');\n }\n\n // DEFAULT value\n if (columnDef.defaultValue !== undefined) {\n const formatted = this.formatDefaultValue(\n columnDef.defaultValue,\n columnDef.type,\n );\n parts.push(`DEFAULT ${formatted}`);\n }\n\n // CHECK constraint\n if (columnDef.check) {\n parts.push(`CHECK (${columnDef.check})`);\n }\n\n return parts.join(' ');\n }\n\n /**\n * Generate inline UNIQUE constraints for composite indexes\n * Used by engines that require inline UNIQUE for UPSERT to work (DuckDB)\n */\n protected generateInlineUniqueConstraints(\n indexes: IndexDefinition[],\n ): string[] {\n const constraints: string[] = [];\n\n if (!indexes || !Array.isArray(indexes)) {\n return constraints;\n }\n\n for (const index of indexes) {\n // Skip malformed index entries\n if (!index || !index.columns || !Array.isArray(index.columns)) {\n continue;\n }\n\n if (index.unique && index.columns.length > 0) {\n const columns = index.columns.map((c) => quoteIdentifier(c)).join(', ');\n constraints.push(`UNIQUE(${columns})`);\n }\n }\n\n return constraints;\n }\n\n /**\n * Generate CREATE INDEX statements\n * Override in engine-specific strategies if needed\n */\n generateIndexes(schema: SchemaDefinition): string[] {\n const { tableName, indexes = [] } = schema;\n const statements: string[] = [];\n\n if (!indexes || indexes.length === 0) {\n return statements;\n }\n\n for (const index of indexes) {\n // Narrow the jsonPath target up-front so the formatter call doesn't\n // need optional-chained args (and so the malformed-entry check has a\n // single source of truth).\n const jsonPath =\n index?.jsonPath?.column && index.jsonPath.path ? index.jsonPath : null;\n if (\n !index ||\n (!jsonPath &&\n (!index.columns ||\n !Array.isArray(index.columns) ||\n index.columns.length === 0))\n ) {\n logger.warn(`[DDL] Skipping malformed index: ${JSON.stringify(index)}`);\n continue;\n }\n\n // Skip UNIQUE indexes if engine requires them inline\n if (index.unique && this.requiresInlineUnique()) {\n continue;\n }\n\n const indexType = index.unique ? 'UNIQUE INDEX' : 'INDEX';\n\n // JSON-path indexes use a dialect-specific expression\n const target = jsonPath\n ? `(${this.formatJsonPathIndexExpression(\n jsonPath.column,\n jsonPath.path,\n )})`\n : index.columns.map((c) => quoteIdentifier(c)).join(', ');\n\n let sql = `CREATE ${indexType} IF NOT EXISTS ${quoteIdentifier(\n index.name,\n )} ON ${quoteIdentifier(tableName)} (${target})`;\n\n // Partial index condition\n if (index.where) {\n sql += ` WHERE ${index.where}`;\n }\n\n sql += ';';\n statements.push(sql);\n }\n\n return statements;\n }\n\n /**\n * Render the SQL expression used to index a JSON path inside a JSONB column.\n * Subclasses override for dialect-specific syntax.\n *\n * Default (ANSI-ish): `<jsonColumn>->>'<path>'` — works on Postgres.\n */\n protected formatJsonPathIndexExpression(\n jsonColumn: string,\n path: string,\n ): string {\n assertSafeJsonPathTarget(jsonColumn, path);\n return `${quoteIdentifier(jsonColumn)}->>${quoteStringLiteral(path)}`;\n }\n\n /**\n * Generate CREATE TRIGGER statements\n * Override in engine-specific strategies - DuckDB returns empty\n */\n generateTriggers(schema: SchemaDefinition): string[] {\n if (!this.supportsTriggers()) {\n return [];\n }\n\n const { tableName, triggers = [] } = schema;\n const statements: string[] = [];\n\n if (!triggers || triggers.length === 0) {\n return statements;\n }\n\n for (const trigger of triggers) {\n const sql = this.generateTriggerStatement(tableName, trigger);\n if (sql) {\n statements.push(sql);\n }\n }\n\n return statements;\n }\n\n /**\n * Generate a single trigger statement\n * Can be overridden for engine-specific trigger syntax\n */\n protected generateTriggerStatement(\n tableName: string,\n trigger: TriggerDefinition,\n ): string {\n // Default SQLite-style trigger syntax\n let sql = `CREATE TRIGGER IF NOT EXISTS ${quoteIdentifier(trigger.name)}\\n`;\n sql += `${trigger.when} ${trigger.event} ON ${quoteIdentifier(tableName)}\\n`;\n\n if (trigger.condition) {\n sql += `WHEN ${trigger.condition}\\n`;\n }\n\n sql += `BEGIN\\n${trigger.body}\\nEND;`;\n\n return sql;\n }\n\n /**\n * Map abstract SQL type to engine-specific type\n * Default implementation - override for engine-specific types\n */\n mapType(type: SQLDataType): string {\n // Default mapping works for most engines\n switch (type) {\n case 'TEXT':\n return 'TEXT';\n case 'INTEGER':\n return 'INTEGER';\n case 'REAL':\n return 'REAL';\n case 'BLOB':\n return 'BLOB';\n case 'BOOLEAN':\n return 'BOOLEAN';\n case 'JSON':\n return 'JSON';\n case 'TIMESTAMP':\n return 'TIMESTAMP';\n case 'UUID':\n // Fallback for engines without a native uuid type (e.g. SQLite):\n // store as TEXT. PostgreSQL/DuckDB override this with their native\n // uuid type. (R11)\n return 'TEXT';\n default:\n return 'TEXT';\n }\n }\n\n /**\n * Format default value for SQL.\n *\n * Delegates to the shared, injection-safe `formatDefaultValue`\n * (`schema/sql-identifiers.ts`) so every DDL path uses one set of rules:\n * an allowlist of SQL keyword/function defaults (not \"contains `(`\"),\n * type-driven literal quoting, and no folding of the string `\"null\"` into\n * the SQL NULL keyword. Boolean rendering is bridged through\n * `formatBooleanDefault` so engine overrides (SQLite → 0/1) still apply.\n */\n formatDefaultValue(value: unknown, type: SQLDataType): string {\n return formatDefaultValueShared(value, type, {\n booleanLiterals: [\n this.formatBooleanDefault(true),\n this.formatBooleanDefault(false),\n ],\n });\n }\n\n /**\n * Format boolean default\n * Override for engines that use INTEGER (SQLite)\n */\n protected formatBooleanDefault(value: boolean): string {\n return value ? 'TRUE' : 'FALSE';\n }\n\n /**\n * Whether this engine supports triggers\n * Override in DuckDB strategy to return false\n */\n supportsTriggers(): boolean {\n return true;\n }\n\n /**\n * Whether UNIQUE constraints must be inline for UPSERT\n * Override in DuckDB strategy to return true\n */\n requiresInlineUnique(): boolean {\n return false;\n }\n}\n"],"names":["formatDefaultValueShared"],"mappings":"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"}
|
|
@@ -24,7 +24,7 @@ export declare class SQLiteStrategy extends BaseDDLStrategy {
|
|
|
24
24
|
* literals — so SQLite booleans render as 0/1 and no CAST expression is ever
|
|
25
25
|
* emitted in a DEFAULT clause.
|
|
26
26
|
*/
|
|
27
|
-
protected formatBooleanDefault(value:
|
|
27
|
+
protected formatBooleanDefault(value: boolean): string;
|
|
28
28
|
/**
|
|
29
29
|
* SQLite supports triggers
|
|
30
30
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-strategy.d.ts","sourceRoot":"","sources":["../../../src/schema/ddl/sqlite-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,cAAe,SAAQ,eAAe;IACjD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAY;IAE3C;;;;OAIG;IACH,SAAS,CAAC,6BAA6B,CACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,MAAM;IAoBT;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IAalC;;;;;;;OAOG;IACH,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"sqlite-strategy.d.ts","sourceRoot":"","sources":["../../../src/schema/ddl/sqlite-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,cAAe,SAAQ,eAAe;IACjD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAY;IAE3C;;;;OAIG;IACH,SAAS,CAAC,6BAA6B,CACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,MAAM;IAoBT;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IAalC;;;;;;;OAOG;IACH,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAItD;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;OAGG;IACH,oBAAoB,IAAI,OAAO;CAGhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-strategy.js","sources":["../../../src/schema/ddl/sqlite-strategy.ts"],"sourcesContent":["/**\n * SQLite DDL Strategy\n *\n * SQLite-specific DDL generation with the following characteristics:\n * - No CAST expressions in DEFAULT values\n * - BOOLEAN stored as INTEGER (0/1)\n * - JSON stored as TEXT (with JSON1 extension functions)\n * - Supports triggers with SQLite syntax\n * - UNIQUE can be inline or separate indexes\n */\n\nimport {\n isSafeIdentifier,\n isSafeIdentifierPath,\n quoteIdentifier,\n quoteStringLiteral,\n} from '../sql-identifiers.js';\nimport type { SQLDataType } from '../types.js';\nimport { BaseDDLStrategy } from './base-strategy.js';\nimport type { DatabaseEngine } from './types.js';\n\nexport class SQLiteStrategy extends BaseDDLStrategy {\n readonly engine: DatabaseEngine = 'sqlite';\n\n /**\n * SQLite JSON-path index expression — uses the JSON1 `json_extract` function\n * since SQLite has no native `->>` operator pre-3.38 and we want broad\n * compatibility with hosted SQLite/libSQL variants.\n */\n protected formatJsonPathIndexExpression(\n jsonColumn: string,\n path: string,\n ): string {\n // Column must be a simple identifier (no dots); only the path may be dotted.\n // Mirrors the `assertSafeJsonPathTarget` file-level helper in\n // base-strategy.ts so this SQLite override doesn't silently accept dotted\n // columns that PG/DuckDB (and renderIndexTarget) reject.\n if (!isSafeIdentifier(jsonColumn)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index column \"${jsonColumn}\": must be a simple identifier`,\n );\n }\n if (!isSafeIdentifierPath(path)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index path \"${path}\": must be a simple (dotted) identifier`,\n );\n }\n return `json_extract(${quoteIdentifier(jsonColumn)}, ${quoteStringLiteral(\n `$.${path}`,\n )})`;\n }\n\n /**\n * Map types for SQLite\n * - BOOLEAN → INTEGER (SQLite uses 0/1)\n * - JSON → TEXT (SQLite stores JSON as text, uses JSON1 functions)\n * - TIMESTAMP → DATETIME (SQLite convention)\n */\n mapType(type: SQLDataType): string {\n switch (type) {\n case 'BOOLEAN':\n return 'INTEGER'; // SQLite uses 0/1 for booleans\n case 'JSON':\n return 'TEXT'; // SQLite stores JSON as TEXT\n case 'TIMESTAMP':\n return 'DATETIME'; // SQLite convention\n default:\n return super.mapType(type);\n }\n }\n\n /**\n * Format boolean as 0/1 for SQLite.\n *\n * `formatDefaultValue` is inherited from BaseDDLStrategy, which delegates to\n * the shared safe formatter and bridges this override in as the boolean\n * literals — so SQLite booleans render as 0/1 and no CAST expression is ever\n * emitted in a DEFAULT clause.\n */\n protected formatBooleanDefault(value:
|
|
1
|
+
{"version":3,"file":"sqlite-strategy.js","sources":["../../../src/schema/ddl/sqlite-strategy.ts"],"sourcesContent":["/**\n * SQLite DDL Strategy\n *\n * SQLite-specific DDL generation with the following characteristics:\n * - No CAST expressions in DEFAULT values\n * - BOOLEAN stored as INTEGER (0/1)\n * - JSON stored as TEXT (with JSON1 extension functions)\n * - Supports triggers with SQLite syntax\n * - UNIQUE can be inline or separate indexes\n */\n\nimport {\n isSafeIdentifier,\n isSafeIdentifierPath,\n quoteIdentifier,\n quoteStringLiteral,\n} from '../sql-identifiers.js';\nimport type { SQLDataType } from '../types.js';\nimport { BaseDDLStrategy } from './base-strategy.js';\nimport type { DatabaseEngine } from './types.js';\n\nexport class SQLiteStrategy extends BaseDDLStrategy {\n readonly engine: DatabaseEngine = 'sqlite';\n\n /**\n * SQLite JSON-path index expression — uses the JSON1 `json_extract` function\n * since SQLite has no native `->>` operator pre-3.38 and we want broad\n * compatibility with hosted SQLite/libSQL variants.\n */\n protected formatJsonPathIndexExpression(\n jsonColumn: string,\n path: string,\n ): string {\n // Column must be a simple identifier (no dots); only the path may be dotted.\n // Mirrors the `assertSafeJsonPathTarget` file-level helper in\n // base-strategy.ts so this SQLite override doesn't silently accept dotted\n // columns that PG/DuckDB (and renderIndexTarget) reject.\n if (!isSafeIdentifier(jsonColumn)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index column \"${jsonColumn}\": must be a simple identifier`,\n );\n }\n if (!isSafeIdentifierPath(path)) {\n throw new Error(\n `[DDL] Unsafe JSON-path index path \"${path}\": must be a simple (dotted) identifier`,\n );\n }\n return `json_extract(${quoteIdentifier(jsonColumn)}, ${quoteStringLiteral(\n `$.${path}`,\n )})`;\n }\n\n /**\n * Map types for SQLite\n * - BOOLEAN → INTEGER (SQLite uses 0/1)\n * - JSON → TEXT (SQLite stores JSON as text, uses JSON1 functions)\n * - TIMESTAMP → DATETIME (SQLite convention)\n */\n mapType(type: SQLDataType): string {\n switch (type) {\n case 'BOOLEAN':\n return 'INTEGER'; // SQLite uses 0/1 for booleans\n case 'JSON':\n return 'TEXT'; // SQLite stores JSON as TEXT\n case 'TIMESTAMP':\n return 'DATETIME'; // SQLite convention\n default:\n return super.mapType(type);\n }\n }\n\n /**\n * Format boolean as 0/1 for SQLite.\n *\n * `formatDefaultValue` is inherited from BaseDDLStrategy, which delegates to\n * the shared safe formatter and bridges this override in as the boolean\n * literals — so SQLite booleans render as 0/1 and no CAST expression is ever\n * emitted in a DEFAULT clause.\n */\n protected formatBooleanDefault(value: boolean): string {\n return value ? '1' : '0';\n }\n\n /**\n * SQLite supports triggers\n */\n supportsTriggers(): boolean {\n return true;\n }\n\n /**\n * SQLite doesn't require inline UNIQUE for UPSERT\n * Both inline and separate indexes work\n */\n requiresInlineUnique(): boolean {\n return false;\n }\n}\n"],"names":[],"mappings":";;AAqBO,MAAM,uBAAuB,gBAAgB;AAAA,EACzC,SAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,8BACR,YACA,MACQ;AAKR,QAAI,CAAC,iBAAiB,UAAU,GAAG;AACjC,YAAM,IAAI;AAAA,QACR,wCAAwC,UAAU;AAAA,MAAA;AAAA,IAEtD;AACA,QAAI,CAAC,qBAAqB,IAAI,GAAG;AAC/B,YAAM,IAAI;AAAA,QACR,sCAAsC,IAAI;AAAA,MAAA;AAAA,IAE9C;AACA,WAAO,gBAAgB,gBAAgB,UAAU,CAAC,KAAK;AAAA,MACrD,KAAK,IAAI;AAAA,IAAA,CACV;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,MAA2B;AACjC,YAAQ,MAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA;AAAA,MACT,KAAK;AACH,eAAO;AAAA;AAAA,MACT,KAAK;AACH,eAAO;AAAA;AAAA,MACT;AACE,eAAO,MAAM,QAAQ,IAAI;AAAA,IAAA;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,qBAAqB,OAAwB;AACrD,WAAO,QAAQ,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA4B;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAgC;AAC9B,WAAO;AAAA,EACT;AACF;"}
|
|
@@ -71,7 +71,7 @@ export interface DDLStrategy {
|
|
|
71
71
|
* @param type - The column type
|
|
72
72
|
* @returns Formatted default value SQL
|
|
73
73
|
*/
|
|
74
|
-
formatDefaultValue(value:
|
|
74
|
+
formatDefaultValue(value: unknown, type: SQLDataType): string;
|
|
75
75
|
/**
|
|
76
76
|
* Whether this engine supports database triggers
|
|
77
77
|
* @returns true if triggers are supported
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/schema/ddl/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEhC;;;;OAIG;IACH,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAEtD;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAAC;IAEpD;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAAC;IAErD;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAEnC;;;;;;;OAOG;IACH,kBAAkB,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/schema/ddl/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEhC;;;;OAIG;IACH,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAEtD;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAAC;IAEpD;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAAC;IAErD;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAEnC;;;;;;;OAOG;IACH,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAE9D;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC;IAE5B;;;;OAIG;IACH,oBAAoB,IAAI,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,wBAAwB,CACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO,UAAU,EAAE,gBAAgB,GAC7C,MAAM,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6CAA6C;IAC7C,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC"}
|
|
@@ -1,6 +1,29 @@
|
|
|
1
|
-
import { FieldDefinition, ManifestSchema, SmartObjectDefinition, SmartObjectManifest } from '../scanner/types.js';
|
|
1
|
+
import { FieldDefinition, FieldMeta, ManifestSchema, SmartObjectDefinition, SmartObjectManifest } from '../scanner/types.js';
|
|
2
2
|
import { DatabaseEngine } from './ddl/types.js';
|
|
3
3
|
import { SchemaDefinition } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Structural shape of a field as read from either the build-time manifest
|
|
6
|
+
* (`FieldDefinition`) or the runtime ObjectRegistry (`getAllFields()` returns
|
|
7
|
+
* `Map<string, any>` upstream). The schema generator consumes both through a
|
|
8
|
+
* single set of property reads, so this interface captures every field key the
|
|
9
|
+
* generator touches without coupling to either source's exact type.
|
|
10
|
+
*
|
|
11
|
+
* `_meta` carries the structured field-helper metadata (`FieldMeta`); a few
|
|
12
|
+
* legacy fields (`indexed`, `idType`, `__tenancy`) may also appear at the top
|
|
13
|
+
* level depending on the source, so they are declared here too.
|
|
14
|
+
*/
|
|
15
|
+
interface RegistryField {
|
|
16
|
+
type?: FieldDefinition['type'];
|
|
17
|
+
related?: string;
|
|
18
|
+
required?: boolean;
|
|
19
|
+
default?: unknown;
|
|
20
|
+
description?: string;
|
|
21
|
+
transient?: boolean;
|
|
22
|
+
indexed?: boolean;
|
|
23
|
+
idType?: 'uuid' | 'text';
|
|
24
|
+
__tenancy?: FieldMeta['__tenancy'];
|
|
25
|
+
_meta?: FieldMeta;
|
|
26
|
+
}
|
|
4
27
|
type SchemaGeneratorConfig = {
|
|
5
28
|
conflictColumns?: string[];
|
|
6
29
|
idType?: 'uuid' | 'text';
|
|
@@ -9,7 +32,7 @@ type SchemaGeneratorConfig = {
|
|
|
9
32
|
idType?: 'uuid' | 'text';
|
|
10
33
|
};
|
|
11
34
|
getDescendants(baseClassName: string): string[];
|
|
12
|
-
getAllFields(className: string): Promise<Map<string,
|
|
35
|
+
getAllFields(className: string): Promise<Map<string, RegistryField>>;
|
|
13
36
|
getSTIBase?(className: string): string | null;
|
|
14
37
|
};
|
|
15
38
|
};
|
|
@@ -75,7 +98,7 @@ export declare class SchemaGenerator {
|
|
|
75
98
|
* @param fields - Map of Field definitions from ObjectRegistry
|
|
76
99
|
* @returns Schema definition object
|
|
77
100
|
*/
|
|
78
|
-
generateSchemaFromRegistry(className: string, tableName: string, fields: Map<string,
|
|
101
|
+
generateSchemaFromRegistry(className: string, tableName: string, fields: Map<string, RegistryField>, config?: SchemaGeneratorConfig): SchemaDefinition;
|
|
79
102
|
/**
|
|
80
103
|
* Generate STI (Single Table Inheritance) schema from ObjectRegistry fields
|
|
81
104
|
*
|
|
@@ -108,7 +131,7 @@ export declare class SchemaGenerator {
|
|
|
108
131
|
* // - _meta_data JSON (flexible storage)
|
|
109
132
|
* ```
|
|
110
133
|
*/
|
|
111
|
-
generateSTISchemaFromRegistry(baseClassName: string, tableName: string, _fields: Map<string,
|
|
134
|
+
generateSTISchemaFromRegistry(baseClassName: string, tableName: string, _fields: Map<string, RegistryField>, config?: SchemaGeneratorConfig): Promise<SchemaDefinition>;
|
|
112
135
|
/**
|
|
113
136
|
* Generate STI schema from manifest data (build-time, no runtime registry)
|
|
114
137
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/schema/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,eAAe,
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/schema/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/schema/generator.js
CHANGED
|
@@ -774,7 +774,8 @@ class SchemaGenerator {
|
|
|
774
774
|
if (field.transient || field._meta?.transient) {
|
|
775
775
|
continue;
|
|
776
776
|
}
|
|
777
|
-
|
|
777
|
+
const indexedField = field;
|
|
778
|
+
if (field.type === "meta" && (indexedField.indexed === true || field._meta?.indexed === true)) {
|
|
778
779
|
indexedMetaFields.add(fieldName);
|
|
779
780
|
}
|
|
780
781
|
if (fieldName === "id" || fieldName === "slug" || fieldName === "context" || fieldName === "created_at" || fieldName === "createdAt" || fieldName === "updated_at" || fieldName === "updatedAt") {
|
|
@@ -803,7 +804,7 @@ class SchemaGenerator {
|
|
|
803
804
|
if (field.type === "foreignKey") {
|
|
804
805
|
fkColumnsByClass.get(className)?.add(columnName);
|
|
805
806
|
}
|
|
806
|
-
const isIndexed =
|
|
807
|
+
const isIndexed = indexedField.indexed === true || field._meta?.indexed === true;
|
|
807
808
|
if (isIndexed && field.type !== "foreignKey") {
|
|
808
809
|
indexedStiColumns.add(columnName);
|
|
809
810
|
}
|