@happyvertical/smrt-core 0.42.6 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +39 -43
- package/agents/collection-reads.md +40 -0
- package/agents/data-query.md +21 -0
- package/agents/latest-related.md +35 -0
- package/agents/memory.md +16 -0
- package/agents/schema-paths.md +29 -15
- package/dist/browser.js +2 -2
- package/dist/cascade.d.ts +7 -6
- package/dist/cascade.d.ts.map +1 -1
- package/dist/cascade.js +19 -21
- package/dist/cascade.js.map +1 -1
- package/dist/class.d.ts +17 -0
- package/dist/class.d.ts.map +1 -1
- package/dist/class.js +30 -0
- package/dist/class.js.map +1 -1
- package/dist/collection.d.ts +164 -3
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +345 -10
- package/dist/collection.js.map +1 -1
- package/dist/decorators/index.d.ts +33 -15
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +16 -11
- package/dist/decorators/index.js.map +1 -1
- package/dist/generators/rest.d.ts.map +1 -1
- package/dist/generators/rest.js +10 -2
- package/dist/generators/rest.js.map +1 -1
- package/dist/generators/tool-schema.d.ts +14 -0
- package/dist/generators/tool-schema.d.ts.map +1 -1
- package/dist/generators/tool-schema.js +13 -1
- package/dist/generators/tool-schema.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/interceptors.d.ts +2 -1
- package/dist/interceptors.d.ts.map +1 -1
- package/dist/interceptors.js.map +1 -1
- package/dist/manifest/static-manifest.d.ts.map +1 -1
- package/dist/manifest/static-manifest.js +53 -1
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest/store.js.map +1 -1
- package/dist/manifest.json +62 -1
- package/dist/migrations/differ.d.ts +2 -0
- package/dist/migrations/differ.d.ts.map +1 -1
- package/dist/migrations/differ.js +75 -0
- package/dist/migrations/differ.js.map +1 -1
- package/dist/migrations/generator.d.ts.map +1 -1
- package/dist/migrations/generator.js +19 -2
- package/dist/migrations/generator.js.map +1 -1
- package/dist/migrations/orchestrate.d.ts.map +1 -1
- package/dist/migrations/orchestrate.js +4 -1
- package/dist/migrations/orchestrate.js.map +1 -1
- package/dist/object.d.ts +4 -4
- package/dist/object.js +4 -4
- package/dist/object.js.map +1 -1
- package/dist/prebuild/index.d.ts.map +1 -1
- package/dist/prebuild/index.js +9 -0
- package/dist/prebuild/index.js.map +1 -1
- package/dist/registry/schema-builder.d.ts +6 -0
- package/dist/registry/schema-builder.d.ts.map +1 -1
- package/dist/registry/schema-builder.js +78 -8
- package/dist/registry/schema-builder.js.map +1 -1
- package/dist/registry.d.ts +5 -7
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +6 -8
- package/dist/registry.js.map +1 -1
- package/dist/runtime/types.d.ts +2 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +62 -18
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/types.d.ts +5 -1
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/scanner/types.js.map +1 -1
- package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/base-strategy.js +2 -0
- package/dist/schema/ddl/base-strategy.js.map +1 -1
- package/dist/schema/ddl/duckdb-strategy.d.ts +1 -0
- package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/duckdb-strategy.js +17 -1
- package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
- package/dist/schema/ddl/postgres-strategy.js +1 -1
- package/dist/schema/foreign-key-ddl.d.ts +9 -0
- package/dist/schema/foreign-key-ddl.d.ts.map +1 -0
- package/dist/schema/foreign-key-ddl.js +53 -0
- package/dist/schema/foreign-key-ddl.js.map +1 -0
- package/dist/schema/foreign-key-planner.d.ts +18 -0
- package/dist/schema/foreign-key-planner.d.ts.map +1 -0
- package/dist/schema/foreign-key-planner.js +109 -0
- package/dist/schema/foreign-key-planner.js.map +1 -0
- package/dist/schema/foreign-key-policy.d.ts +21 -0
- package/dist/schema/foreign-key-policy.d.ts.map +1 -0
- package/dist/schema/foreign-key-policy.js +41 -0
- package/dist/schema/foreign-key-policy.js.map +1 -0
- package/dist/schema/generator.d.ts +3 -0
- package/dist/schema/generator.d.ts.map +1 -1
- package/dist/schema/generator.js +54 -10
- package/dist/schema/generator.js.map +1 -1
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +4 -1
- package/dist/schema/manifest-schema.d.ts.map +1 -1
- package/dist/schema/manifest-schema.js +20 -3
- package/dist/schema/manifest-schema.js.map +1 -1
- package/dist/schema/schema-aggregator.d.ts +7 -1
- package/dist/schema/schema-aggregator.d.ts.map +1 -1
- package/dist/schema/schema-aggregator.js +54 -9
- package/dist/schema/schema-aggregator.js.map +1 -1
- package/dist/schema/schema-manager.d.ts +1 -6
- package/dist/schema/schema-manager.d.ts.map +1 -1
- package/dist/schema/schema-manager.js +26 -30
- package/dist/schema/schema-manager.js.map +1 -1
- package/dist/schema/types.d.ts +8 -5
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/utils.d.ts.map +1 -1
- package/dist/schema/utils.js +14 -1
- package/dist/schema/utils.js.map +1 -1
- package/dist/schema.js +4 -1
- package/dist/smrt-knowledge.json +63 -8
- package/dist/testing/database.d.ts +11 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +80 -9
- package/dist/testing/database.js.map +1 -1
- package/dist/vite-plugin/index.d.ts.map +1 -1
- package/dist/vite-plugin/index.js +12 -3
- 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 +24 -3
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
- package/dist/vite-plugin/web-collections.d.ts +3 -1
- package/dist/vite-plugin/web-collections.d.ts.map +1 -1
- package/dist/vite-plugin/web-collections.js +24 -4
- package/dist/vite-plugin/web-collections.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foreign-key-policy.d.ts","sourceRoot":"","sources":["../../src/schema/foreign-key-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD,mEAAmE;AACnE,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,SAAS,CAM9B;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GACd,gBAAgB,CAQlB;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAelD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//#region src/schema/foreign-key-policy.ts
|
|
2
|
+
var FOREIGN_KEY_ACTIONS = /* @__PURE__ */ new Set([
|
|
3
|
+
"CASCADE",
|
|
4
|
+
"SET NULL",
|
|
5
|
+
"RESTRICT",
|
|
6
|
+
"NO ACTION"
|
|
7
|
+
]);
|
|
8
|
+
/** Normalize decorator action spelling into the SQL vocabulary. */
|
|
9
|
+
function normalizeForeignKeyAction(value) {
|
|
10
|
+
if (typeof value !== "string") return void 0;
|
|
11
|
+
const normalized = value.trim().toUpperCase().replace(/_/g, " ");
|
|
12
|
+
return FOREIGN_KEY_ACTIONS.has(normalized) ? normalized : void 0;
|
|
13
|
+
}
|
|
14
|
+
/** Validate an externally supplied action rather than interpolating raw SQL. */
|
|
15
|
+
function requireForeignKeyAction(value, context) {
|
|
16
|
+
const normalized = normalizeForeignKeyAction(value);
|
|
17
|
+
if (!normalized) throw new Error(`Invalid foreign-key action ${JSON.stringify(value)} for ${context}. Expected CASCADE, SET NULL, RESTRICT, or NO ACTION.`);
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolve the one delete policy shared by app-side cascade and database DDL.
|
|
22
|
+
*
|
|
23
|
+
* A same-package reference that identifies the referencing row defaults to
|
|
24
|
+
* CASCADE. Tenant ids are scope markers rather than ownership edges, and all
|
|
25
|
+
* other references default to SQL NO ACTION.
|
|
26
|
+
*/
|
|
27
|
+
function resolveForeignKeyDeleteAction(options) {
|
|
28
|
+
const declaredAction = options.declared === void 0 ? void 0 : requireForeignKeyAction(options.declared, "ON DELETE");
|
|
29
|
+
if (declaredAction) return {
|
|
30
|
+
action: declaredAction,
|
|
31
|
+
declared: true
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
action: !options.isTenantIdField && options.isConflictColumn ? "CASCADE" : "NO ACTION",
|
|
35
|
+
declared: false
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { normalizeForeignKeyAction, requireForeignKeyAction, resolveForeignKeyDeleteAction };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=foreign-key-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foreign-key-policy.js","names":[],"sources":["../../src/schema/foreign-key-policy.ts"],"sourcesContent":["import type { ForeignKeyAction } from './types.js';\n\nconst FOREIGN_KEY_ACTIONS = new Set<ForeignKeyAction>([\n 'CASCADE',\n 'SET NULL',\n 'RESTRICT',\n 'NO ACTION',\n]);\n\n/** Normalize decorator action spelling into the SQL vocabulary. */\nexport function normalizeForeignKeyAction(\n value: unknown,\n): ForeignKeyAction | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim().toUpperCase().replace(/_/g, ' ');\n return FOREIGN_KEY_ACTIONS.has(normalized as ForeignKeyAction)\n ? (normalized as ForeignKeyAction)\n : undefined;\n}\n\n/** Validate an externally supplied action rather than interpolating raw SQL. */\nexport function requireForeignKeyAction(\n value: unknown,\n context: string,\n): ForeignKeyAction {\n const normalized = normalizeForeignKeyAction(value);\n if (!normalized) {\n throw new Error(\n `Invalid foreign-key action ${JSON.stringify(value)} for ${context}. Expected CASCADE, SET NULL, RESTRICT, or NO ACTION.`,\n );\n }\n return normalized;\n}\n\n/**\n * Resolve the one delete policy shared by app-side cascade and database DDL.\n *\n * A same-package reference that identifies the referencing row defaults to\n * CASCADE. Tenant ids are scope markers rather than ownership edges, and all\n * other references default to SQL NO ACTION.\n */\nexport function resolveForeignKeyDeleteAction(options: {\n declared?: unknown;\n isConflictColumn: boolean;\n isTenantIdField: boolean;\n}): { action: ForeignKeyAction; declared: boolean } {\n const declaredAction =\n options.declared === undefined\n ? undefined\n : requireForeignKeyAction(options.declared, 'ON DELETE');\n if (declaredAction) {\n return { action: declaredAction, declared: true };\n }\n return {\n action:\n !options.isTenantIdField && options.isConflictColumn\n ? 'CASCADE'\n : 'NO ACTION',\n declared: false,\n };\n}\n"],"mappings":";AAEA,IAAM,sCAAsB,IAAI,IAAsB;CACpD;CACA;CACA;CACA;AACF,CAAC;;AAGD,SAAgB,0BACd,OAC8B;CAC9B,IAAI,OAAO,UAAU,UAAU,OAAO,KAAA;CACtC,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,MAAM,GAAG;CAC/D,OAAO,oBAAoB,IAAI,UAA8B,IACxD,aACD,KAAA;AACN;;AAGA,SAAgB,wBACd,OACA,SACkB;CAClB,MAAM,aAAa,0BAA0B,KAAK;CAClD,IAAI,CAAC,YACH,MAAM,IAAI,MACR,8BAA8B,KAAK,UAAU,KAAK,EAAE,OAAO,QAAQ,sDACrE;CAEF,OAAO;AACT;;;;;;;;AASA,SAAgB,8BAA8B,SAIM;CAClD,MAAM,iBACJ,QAAQ,aAAa,KAAA,IACjB,KAAA,IACA,wBAAwB,QAAQ,UAAU,WAAW;CAC3D,IAAI,gBACF,OAAO;EAAE,QAAQ;EAAgB,UAAU;CAAK;CAElD,OAAO;EACL,QACE,CAAC,QAAQ,mBAAmB,QAAQ,mBAChC,YACA;EACN,UAAU;CACZ;AACF"}
|
|
@@ -57,7 +57,9 @@ type SchemaGeneratorConfig = {
|
|
|
57
57
|
};
|
|
58
58
|
getDescendants(baseClassName: string): string[];
|
|
59
59
|
getAllFields(className: string): Promise<Map<string, RegistryField>>;
|
|
60
|
+
getFields?(className: string): Map<string, RegistryField>;
|
|
60
61
|
getSTIBase?(className: string): string | null;
|
|
62
|
+
getTableName?(className: string): string | undefined;
|
|
61
63
|
};
|
|
62
64
|
};
|
|
63
65
|
export declare class SchemaGenerator {
|
|
@@ -71,6 +73,7 @@ export declare class SchemaGenerator {
|
|
|
71
73
|
private shouldEmitDefault;
|
|
72
74
|
private getRegistryTargetIdColumnType;
|
|
73
75
|
private reconcileRegistryForeignKeyColumnTypes;
|
|
76
|
+
private applyRegistryForeignKeys;
|
|
74
77
|
/**
|
|
75
78
|
* Whether an existing index already leads with `leadingColumns`, in order.
|
|
76
79
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/schema/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EAGT,cAAc,EACd,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAU7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveForeignKeyDeleteAction } from "./foreign-key-policy.js";
|
|
1
2
|
import { classnameToTablename } from "../utils/naming.js";
|
|
2
3
|
import { formatDefaultValue, quoteIdentifier, quoteStringLiteral } from "./sql-identifiers.js";
|
|
3
4
|
import { assertIdentifierFits, enforceIdentifierLimits } from "./index-utils.js";
|
|
@@ -67,6 +68,44 @@ var SchemaGenerator = class {
|
|
|
67
68
|
};
|
|
68
69
|
}
|
|
69
70
|
}
|
|
71
|
+
applyRegistryForeignKeys(columns, fields, conflictColumns, registry) {
|
|
72
|
+
const conflictSet = new Set(conflictColumns);
|
|
73
|
+
for (const [fieldName, field] of fields.entries()) {
|
|
74
|
+
if (field.type !== "foreignKey" || !field.related) continue;
|
|
75
|
+
const columnName = this.toSnakeCase(fieldName);
|
|
76
|
+
const column = columns[columnName];
|
|
77
|
+
if (!column) continue;
|
|
78
|
+
if (field._meta?.constraint === false) {
|
|
79
|
+
column.foreignKey = void 0;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const isTenantIdField = field.__tenancy?.isTenantIdField === true || field._meta?.__tenancy?.isTenantIdField === true;
|
|
83
|
+
if (isTenantIdField) {
|
|
84
|
+
column.foreignKey = void 0;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const [targetName, declaredTargetColumn] = field.related.split(".");
|
|
88
|
+
const targetBase = registry?.getSTIBase?.(targetName) || targetName;
|
|
89
|
+
const registeredTargetTable = registry?.getTableName?.(targetBase);
|
|
90
|
+
if (registry && !registeredTargetTable) {
|
|
91
|
+
column.foreignKey = void 0;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const targetColumn = declaredTargetColumn || Array.from(registry?.getFields?.(targetBase)?.entries() || []).find(([, targetField]) => targetField._meta?.primaryKey === true)?.[0] || "id";
|
|
95
|
+
const targetTable = registeredTargetTable || this.classNameToTableName(targetBase);
|
|
96
|
+
const { action } = resolveForeignKeyDeleteAction({
|
|
97
|
+
declared: field._meta?.onDelete,
|
|
98
|
+
isConflictColumn: conflictSet.has(columnName),
|
|
99
|
+
isTenantIdField
|
|
100
|
+
});
|
|
101
|
+
column.foreignKey = {
|
|
102
|
+
table: targetTable,
|
|
103
|
+
column: this.toSnakeCase(targetColumn),
|
|
104
|
+
onDelete: action,
|
|
105
|
+
onUpdate: "CASCADE"
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
70
109
|
/**
|
|
71
110
|
* Whether an existing index already leads with `leadingColumns`, in order.
|
|
72
111
|
*
|
|
@@ -570,7 +609,7 @@ var SchemaGenerator = class {
|
|
|
570
609
|
description: field._meta?.description
|
|
571
610
|
};
|
|
572
611
|
if (field._meta?.default !== void 0 && this.shouldEmitDefault(field, field._meta.default)) columnDef.defaultValue = field._meta.default;
|
|
573
|
-
if (field.type === "foreignKey") {
|
|
612
|
+
if (field.type === "foreignKey" && field._meta?.constraint !== false && field._meta?.__tenancy?.isTenantIdField !== true) {
|
|
574
613
|
const relatedName = field.related;
|
|
575
614
|
const onDeleteAction = field._meta?.onDelete;
|
|
576
615
|
if (relatedName) columnDef.foreignKey = {
|
|
@@ -596,9 +635,11 @@ var SchemaGenerator = class {
|
|
|
596
635
|
description: "Last update timestamp"
|
|
597
636
|
};
|
|
598
637
|
this.reconcileRegistryForeignKeyColumnTypes(columns, fields, config?.registry);
|
|
638
|
+
const resolvedConflict = this.resolveConflictTarget("cti", columns, config);
|
|
639
|
+
this.applyRegistryForeignKeys(columns, fields, resolvedConflict.conflictColumns, config?.registry);
|
|
599
640
|
const indexes = [];
|
|
600
641
|
if (!hasCustomPK) {
|
|
601
|
-
const { conflictColumns, tenantColumn } =
|
|
642
|
+
const { conflictColumns, tenantColumn } = resolvedConflict;
|
|
602
643
|
if (!this.conflictColumnsArePrimaryKey(conflictColumns, columns)) indexes.push({
|
|
603
644
|
name: conflictIndexName(tableName, conflictColumns, tenantColumn),
|
|
604
645
|
columns: conflictColumns,
|
|
@@ -623,7 +664,7 @@ var SchemaGenerator = class {
|
|
|
623
664
|
indexes,
|
|
624
665
|
triggers: [],
|
|
625
666
|
foreignKeys: this.extractForeignKeys(columns),
|
|
626
|
-
dependencies:
|
|
667
|
+
dependencies: this.extractForeignKeys(columns).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
|
|
627
668
|
version: createHash("sha256").update(JSON.stringify(columns)).digest("hex").substring(0, 8),
|
|
628
669
|
packageName: "runtime",
|
|
629
670
|
baseClass: "SmrtObject"
|
|
@@ -755,7 +796,7 @@ var SchemaGenerator = class {
|
|
|
755
796
|
description: field._meta?.description
|
|
756
797
|
};
|
|
757
798
|
if (field._meta?.default !== void 0 && this.shouldEmitDefault(field, field._meta.default)) columnDef.defaultValue = field._meta.default;
|
|
758
|
-
if (field.type === "foreignKey") {
|
|
799
|
+
if (field.type === "foreignKey" && field._meta?.constraint !== false && field._meta?.__tenancy?.isTenantIdField !== true) {
|
|
759
800
|
const relatedName = field.related;
|
|
760
801
|
const onDeleteAction = field._meta?.onDelete;
|
|
761
802
|
if (relatedName) columnDef.foreignKey = {
|
|
@@ -781,9 +822,11 @@ var SchemaGenerator = class {
|
|
|
781
822
|
defaultValue: "current_timestamp",
|
|
782
823
|
description: "Last update timestamp"
|
|
783
824
|
};
|
|
825
|
+
const resolvedConflict = this.resolveConflictTarget("sti", columns, config);
|
|
784
826
|
for (const className of allClassNames) {
|
|
785
827
|
const classFields = await ObjectRegistry.getAllFields(className);
|
|
786
828
|
this.reconcileRegistryForeignKeyColumnTypes(columns, classFields, ObjectRegistry);
|
|
829
|
+
this.applyRegistryForeignKeys(columns, classFields, resolvedConflict.conflictColumns, ObjectRegistry);
|
|
787
830
|
}
|
|
788
831
|
const indexes = [];
|
|
789
832
|
this.emitStiConflictIndex(indexes, columns, tableName, config);
|
|
@@ -819,7 +862,7 @@ var SchemaGenerator = class {
|
|
|
819
862
|
indexes,
|
|
820
863
|
triggers: [],
|
|
821
864
|
foreignKeys: this.extractForeignKeys(columns),
|
|
822
|
-
dependencies:
|
|
865
|
+
dependencies: this.extractForeignKeys(columns).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
|
|
823
866
|
version: createHash("sha256").update(JSON.stringify({
|
|
824
867
|
columns,
|
|
825
868
|
baseClassName,
|
|
@@ -949,8 +992,8 @@ var SchemaGenerator = class {
|
|
|
949
992
|
jsonPath: idx.jsonPath
|
|
950
993
|
})),
|
|
951
994
|
triggers: [],
|
|
952
|
-
foreignKeys:
|
|
953
|
-
dependencies:
|
|
995
|
+
foreignKeys: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)),
|
|
996
|
+
dependencies: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
|
|
954
997
|
version: "",
|
|
955
998
|
packageName: ""
|
|
956
999
|
};
|
|
@@ -1046,8 +1089,8 @@ var SchemaGenerator = class {
|
|
|
1046
1089
|
jsonPath: idx.jsonPath
|
|
1047
1090
|
})),
|
|
1048
1091
|
triggers: [],
|
|
1049
|
-
foreignKeys:
|
|
1050
|
-
dependencies:
|
|
1092
|
+
foreignKeys: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)),
|
|
1093
|
+
dependencies: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
|
|
1051
1094
|
version: "",
|
|
1052
1095
|
packageName: ""
|
|
1053
1096
|
};
|
|
@@ -1108,7 +1151,8 @@ var SchemaGenerator = class {
|
|
|
1108
1151
|
referenceKind: col.referenceKind,
|
|
1109
1152
|
notNull: col.notNull,
|
|
1110
1153
|
unique: col.unique,
|
|
1111
|
-
defaultValue: col.default
|
|
1154
|
+
defaultValue: col.default,
|
|
1155
|
+
foreignKey: col.foreignKey ? { ...col.foreignKey } : void 0
|
|
1112
1156
|
};
|
|
1113
1157
|
return columns;
|
|
1114
1158
|
}
|