@happyvertical/smrt-core 0.40.69 → 0.41.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 +29 -4
- package/README.md +20 -1
- package/agents/change-feed.md +1 -1
- package/agents/query-bounds.md +45 -0
- package/agents/schema-paths.md +786 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -3
- package/dist/cascade.d.ts +120 -0
- package/dist/cascade.d.ts.map +1 -0
- package/dist/cascade.js +430 -0
- package/dist/cascade.js.map +1 -0
- package/dist/change-feed.d.ts +34 -2
- package/dist/change-feed.d.ts.map +1 -1
- package/dist/change-feed.js +52 -11
- package/dist/change-feed.js.map +1 -1
- package/dist/class.d.ts +36 -3
- package/dist/class.d.ts.map +1 -1
- package/dist/class.js +87 -9
- package/dist/class.js.map +1 -1
- package/dist/collection-cache.js +0 -0
- package/dist/collection-cache.js.map +1 -1
- package/dist/collection.d.ts +130 -2
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +290 -57
- package/dist/collection.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/database.d.ts +8 -0
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +16 -8
- package/dist/database.js.map +1 -1
- package/dist/db-errors.d.ts +105 -0
- package/dist/db-errors.d.ts.map +1 -0
- package/dist/db-errors.js +382 -0
- package/dist/db-errors.js.map +1 -0
- package/dist/decorators/index.d.ts +80 -6
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +102 -12
- package/dist/decorators/index.js.map +1 -1
- package/dist/dispatch/bus.d.ts.map +1 -1
- package/dist/dispatch/bus.js +4 -3
- package/dist/dispatch/bus.js.map +1 -1
- package/dist/dispatch/collections/Dispatches.d.ts.map +1 -1
- package/dist/dispatch/collections/Dispatches.js +19 -4
- package/dist/dispatch/collections/Dispatches.js.map +1 -1
- package/dist/dispatch/types.d.ts +5 -0
- package/dist/dispatch/types.d.ts.map +1 -1
- package/dist/embedded-write-queue.d.ts +46 -0
- package/dist/embedded-write-queue.d.ts.map +1 -0
- package/dist/embedded-write-queue.js +66 -0
- package/dist/embedded-write-queue.js.map +1 -0
- package/dist/embeddings/storage.d.ts +7 -0
- package/dist/embeddings/storage.d.ts.map +1 -1
- package/dist/embeddings/storage.js +29 -12
- package/dist/embeddings/storage.js.map +1 -1
- package/dist/errors.d.ts +31 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +34 -2
- package/dist/errors.js.map +1 -1
- package/dist/generators/changes-route.d.ts.map +1 -1
- package/dist/generators/changes-route.js +6 -3
- package/dist/generators/changes-route.js.map +1 -1
- package/dist/generators/mcp-runtime-template.d.ts +8 -0
- package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
- package/dist/generators/mcp-runtime-template.js +38 -4
- package/dist/generators/mcp-runtime-template.js.map +1 -1
- package/dist/generators/mcp.d.ts +16 -0
- package/dist/generators/mcp.d.ts.map +1 -1
- package/dist/generators/mcp.js +41 -3
- package/dist/generators/mcp.js.map +1 -1
- package/dist/generators/rest.d.ts +22 -0
- package/dist/generators/rest.d.ts.map +1 -1
- package/dist/generators/rest.js +34 -3
- package/dist/generators/rest.js.map +1 -1
- package/dist/hierarchical.js +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -5
- package/dist/interceptors.d.ts +21 -0
- package/dist/interceptors.d.ts.map +1 -1
- package/dist/interceptors.js +27 -1
- package/dist/interceptors.js.map +1 -1
- package/dist/manifest/generator.d.ts.map +1 -1
- package/dist/manifest/generator.js +4 -7
- package/dist/manifest/generator.js.map +1 -1
- package/dist/manifest/static-manifest.js +10 -10
- 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 +19 -19
- package/dist/migrations/differ.d.ts +211 -9
- package/dist/migrations/differ.d.ts.map +1 -1
- package/dist/migrations/differ.js +613 -50
- package/dist/migrations/differ.js.map +1 -1
- package/dist/migrations/generator.d.ts +31 -4
- package/dist/migrations/generator.d.ts.map +1 -1
- package/dist/migrations/generator.js +49 -5
- package/dist/migrations/generator.js.map +1 -1
- package/dist/migrations/index.d.ts +4 -2
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +6 -3
- package/dist/migrations/minor-units.d.ts +162 -0
- package/dist/migrations/minor-units.d.ts.map +1 -0
- package/dist/migrations/minor-units.js +381 -0
- package/dist/migrations/minor-units.js.map +1 -0
- package/dist/migrations/orchestrate.js +35 -6
- package/dist/migrations/orchestrate.js.map +1 -1
- package/dist/migrations/sqlite-rebuild.d.ts +142 -0
- package/dist/migrations/sqlite-rebuild.d.ts.map +1 -0
- package/dist/migrations/sqlite-rebuild.js +514 -0
- package/dist/migrations/sqlite-rebuild.js.map +1 -0
- package/dist/migrations/tracker.d.ts +114 -1
- package/dist/migrations/tracker.d.ts.map +1 -1
- package/dist/migrations/tracker.js +331 -16
- package/dist/migrations/tracker.js.map +1 -1
- package/dist/migrations/types.d.ts +19 -4
- package/dist/migrations/types.d.ts.map +1 -1
- package/dist/migrations.js +6 -3
- package/dist/object.d.ts +142 -10
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +196 -41
- package/dist/object.js.map +1 -1
- package/dist/postgres-timeouts.d.ts +240 -0
- package/dist/postgres-timeouts.d.ts.map +1 -0
- package/dist/postgres-timeouts.js +204 -0
- package/dist/postgres-timeouts.js.map +1 -0
- package/dist/query-bounds.d.ts +101 -0
- package/dist/query-bounds.d.ts.map +1 -0
- package/dist/query-bounds.js +177 -0
- package/dist/query-bounds.js.map +1 -0
- package/dist/registry/class-registration.d.ts.map +1 -1
- package/dist/registry/class-registration.js +3 -1
- package/dist/registry/class-registration.js.map +1 -1
- package/dist/registry/manifest-field-merge.d.ts +12 -0
- package/dist/registry/manifest-field-merge.d.ts.map +1 -1
- package/dist/registry/manifest-field-merge.js +14 -2
- package/dist/registry/manifest-field-merge.js.map +1 -1
- package/dist/registry/schema-builder.d.ts +22 -1
- package/dist/registry/schema-builder.d.ts.map +1 -1
- package/dist/registry/schema-builder.js +205 -165
- package/dist/registry/schema-builder.js.map +1 -1
- package/dist/registry/types.d.ts +35 -3
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry.d.ts +41 -46
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +61 -83
- package/dist/registry.js.map +1 -1
- package/dist/scanner/manifest-generator.d.ts +45 -0
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +92 -28
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/types.d.ts +5 -0
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/scanner/types.js.map +1 -1
- package/dist/schema/conflict-target.d.ts +104 -0
- package/dist/schema/conflict-target.d.ts.map +1 -0
- package/dist/schema/conflict-target.js +129 -0
- package/dist/schema/conflict-target.js.map +1 -0
- package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/base-strategy.js +2 -2
- package/dist/schema/ddl/base-strategy.js.map +1 -1
- package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/duckdb-strategy.js +2 -1
- package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
- package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/postgres-strategy.js +12 -1
- package/dist/schema/ddl/postgres-strategy.js.map +1 -1
- package/dist/schema/generator.d.ts +307 -6
- package/dist/schema/generator.d.ts.map +1 -1
- package/dist/schema/generator.js +510 -87
- package/dist/schema/generator.js.map +1 -1
- package/dist/schema/index-utils.d.ts +120 -0
- package/dist/schema/index-utils.d.ts.map +1 -1
- package/dist/schema/index-utils.js +242 -1
- package/dist/schema/index-utils.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/live-parity.d.ts +90 -0
- package/dist/schema/live-parity.d.ts.map +1 -0
- package/dist/schema/live-parity.js +602 -0
- package/dist/schema/live-parity.js.map +1 -0
- package/dist/schema/manifest-schema.d.ts +121 -0
- package/dist/schema/manifest-schema.d.ts.map +1 -0
- package/dist/schema/manifest-schema.js +267 -0
- package/dist/schema/manifest-schema.js.map +1 -0
- package/dist/schema/schema-aggregator.d.ts +24 -10
- package/dist/schema/schema-aggregator.d.ts.map +1 -1
- package/dist/schema/schema-aggregator.js +35 -90
- package/dist/schema/schema-aggregator.js.map +1 -1
- package/dist/schema/system-table-shapes.d.ts +65 -0
- package/dist/schema/system-table-shapes.d.ts.map +1 -0
- package/dist/schema/system-table-shapes.js +187 -0
- package/dist/schema/system-table-shapes.js.map +1 -0
- package/dist/schema/types.d.ts +103 -4
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/utils.d.ts +2 -1
- package/dist/schema/utils.d.ts.map +1 -1
- package/dist/schema/utils.js +5 -3
- package/dist/schema/utils.js.map +1 -1
- package/dist/schema.js +4 -1
- package/dist/smrt-knowledge.json +20 -8
- package/dist/sync/apply.d.ts.map +1 -1
- package/dist/sync/apply.js +9 -16
- package/dist/sync/apply.js.map +1 -1
- package/dist/system/compatibility.d.ts +42 -0
- package/dist/system/compatibility.d.ts.map +1 -1
- package/dist/system/compatibility.js +182 -9
- package/dist/system/compatibility.js.map +1 -1
- package/dist/system/index.d.ts +1 -0
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +3 -2
- package/dist/system/retention.d.ts +237 -0
- package/dist/system/retention.d.ts.map +1 -0
- package/dist/system/retention.js +497 -0
- package/dist/system/retention.js.map +1 -0
- package/dist/system/schema.d.ts +100 -15
- package/dist/system/schema.d.ts.map +1 -1
- package/dist/system/schema.js +81 -45
- package/dist/system/schema.js.map +1 -1
- package/dist/system/types.d.ts +0 -2
- package/dist/system/types.d.ts.map +1 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +1 -0
- package/dist/testing/database.js.map +1 -1
- package/dist/vite-plugin/index.d.ts.map +1 -1
- package/dist/vite-plugin/index.js +4 -9
- 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 +71 -5
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
- package/dist/vite-plugin/web-collections.d.ts.map +1 -1
- package/dist/vite-plugin/web-collections.js +6 -4
- package/dist/vite-plugin/web-collections.js.map +1 -1
- package/package.json +5 -5
|
@@ -27,6 +27,23 @@ export declare class ManifestGenerator {
|
|
|
27
27
|
smrtDependencies?: string[];
|
|
28
28
|
includeVisibility?: SmrtVisibility[];
|
|
29
29
|
}): SmartObjectManifest;
|
|
30
|
+
/**
|
|
31
|
+
* Run every manifest generation pass, in order, on a manifest whose
|
|
32
|
+
* `objects` have been collected. This is THE pass sequence: the OXC vite
|
|
33
|
+
* plugin (`vite-plugin/index.ts`) and `ManifestBuilder.buildManifest()`
|
|
34
|
+
* call it too, so the three producers cannot drift — before #2360
|
|
35
|
+
* `ManifestBuilder` skipped the report passes and its manifests carried
|
|
36
|
+
* `(slug, context)` conflict indexes for `@report` classes while the
|
|
37
|
+
* runtime upserted on the report's group columns.
|
|
38
|
+
*
|
|
39
|
+
* @param manifest - manifest with `objects` populated (and
|
|
40
|
+
* `smrtDependencies` set, so external STI bases resolve)
|
|
41
|
+
* @param options - package metadata for the agent-manifest pass
|
|
42
|
+
*/
|
|
43
|
+
applyGenerationPasses(manifest: SmartObjectManifest, options?: {
|
|
44
|
+
packageName?: string;
|
|
45
|
+
packageJson?: PackageJsonLike;
|
|
46
|
+
}): void;
|
|
30
47
|
/**
|
|
31
48
|
* Materialize tenantScoped schema fields.
|
|
32
49
|
*
|
|
@@ -68,6 +85,27 @@ export declare class ManifestGenerator {
|
|
|
68
85
|
generateSchemas(manifest: SmartObjectManifest): void;
|
|
69
86
|
normalizeReportObjects(manifest: SmartObjectManifest): void;
|
|
70
87
|
normalizeReportTenantScope(manifest: SmartObjectManifest): void;
|
|
88
|
+
/**
|
|
89
|
+
* Materialize the tenant-aware default conflict target (#2360).
|
|
90
|
+
*
|
|
91
|
+
* A tenant-scoped class that declares no `@smrt({ conflictColumns })` keys
|
|
92
|
+
* on `[tenant column, ...natural key]` — `(tenant_id, slug, context)` for
|
|
93
|
+
* a class-per-table object, `(tenant_id, slug, context, _meta_type)` for a
|
|
94
|
+
* single-table hierarchy — so two tenants can each own the same slug and
|
|
95
|
+
* neither `save()` adopts the other's row. Writing the resolved key into
|
|
96
|
+
* `decoratorConfig.conflictColumns` (mirroring `normalizeReportObjects`)
|
|
97
|
+
* makes the manifest, the generated schema, the knowledge artifact and
|
|
98
|
+
* `ObjectRegistry.getConflictColumns()` read one value.
|
|
99
|
+
*
|
|
100
|
+
* Only schema owners are normalized: an STI child inherits the table (and
|
|
101
|
+
* therefore the key) from its root, and `getConflictColumns()` resolves a
|
|
102
|
+
* child through its root at runtime. Explicit `conflictColumns` and
|
|
103
|
+
* `@report` classes (keyed by `normalizeReportObjects`) are left alone.
|
|
104
|
+
* Runs after `injectTenantScopedFields()` and `mergeInheritedFields()` so
|
|
105
|
+
* the tenant field and the inherited `tableStrategy` are in place, and
|
|
106
|
+
* before `generateSchemas()`.
|
|
107
|
+
*/
|
|
108
|
+
normalizeConflictColumns(manifest: SmartObjectManifest): void;
|
|
71
109
|
private resolveSamePackageForeignKeyColumnTypes;
|
|
72
110
|
private findForeignKeyTargetSchema;
|
|
73
111
|
private getObjectTableName;
|
|
@@ -109,6 +147,13 @@ export declare class ManifestGenerator {
|
|
|
109
147
|
* inheritance-resolver.ts`). Keep the two lists in sync.
|
|
110
148
|
*/
|
|
111
149
|
private extendsFrameworkAbstractBase;
|
|
150
|
+
/**
|
|
151
|
+
* Resolve a class name (simple `Content` or qualified `@pkg:Content`) to
|
|
152
|
+
* the key it is stored under in `manifest.objects`, or `undefined` when the
|
|
153
|
+
* manifest does not carry it. Manifest keys are qualified names; `extends`
|
|
154
|
+
* and {@link findSTIBaseInfo} report simple names.
|
|
155
|
+
*/
|
|
156
|
+
private resolveManifestKey;
|
|
112
157
|
/**
|
|
113
158
|
* Find full STI base class info (className + tableName)
|
|
114
159
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { classnameToTablename, toSnakeCase } from "../utils/naming.js";
|
|
1
2
|
import "./types.js";
|
|
2
3
|
import { createQualifiedName } from "../utils/qualified-names.js";
|
|
3
4
|
import { generateToolManifest } from "../tools/tool-generator.js";
|
|
4
5
|
import { resolveCustomActionMetadata } from "../generators/custom-action.js";
|
|
5
|
-
import {
|
|
6
|
+
import { defaultConflictColumns, resolveTenantColumn } from "../schema/conflict-target.js";
|
|
6
7
|
import { SchemaGenerator } from "../schema/generator.js";
|
|
7
8
|
import { isTestFile } from "./test-file-patterns.js";
|
|
8
9
|
import { loadExternalManifestSync, lookupInManifest } from "../manifest/manifest-loader.js";
|
|
@@ -100,15 +101,35 @@ var ManifestGenerator = class {
|
|
|
100
101
|
}
|
|
101
102
|
manifest.objects[manifestKey] = objectDef;
|
|
102
103
|
}
|
|
104
|
+
this.applyGenerationPasses(manifest, {
|
|
105
|
+
packageName: options?.packageName,
|
|
106
|
+
packageJson: options?.packageJson
|
|
107
|
+
});
|
|
108
|
+
return manifest;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Run every manifest generation pass, in order, on a manifest whose
|
|
112
|
+
* `objects` have been collected. This is THE pass sequence: the OXC vite
|
|
113
|
+
* plugin (`vite-plugin/index.ts`) and `ManifestBuilder.buildManifest()`
|
|
114
|
+
* call it too, so the three producers cannot drift — before #2360
|
|
115
|
+
* `ManifestBuilder` skipped the report passes and its manifests carried
|
|
116
|
+
* `(slug, context)` conflict indexes for `@report` classes while the
|
|
117
|
+
* runtime upserted on the report's group columns.
|
|
118
|
+
*
|
|
119
|
+
* @param manifest - manifest with `objects` populated (and
|
|
120
|
+
* `smrtDependencies` set, so external STI bases resolve)
|
|
121
|
+
* @param options - package metadata for the agent-manifest pass
|
|
122
|
+
*/
|
|
123
|
+
applyGenerationPasses(manifest, options) {
|
|
103
124
|
this.normalizeReportTenantScope(manifest);
|
|
104
125
|
this.injectTenantScopedFields(manifest);
|
|
105
126
|
this.mergeInheritedFields(manifest);
|
|
106
127
|
this.normalizeReportObjects(manifest);
|
|
128
|
+
this.normalizeConflictColumns(manifest);
|
|
107
129
|
this.generateValidationRules(manifest);
|
|
108
130
|
this.generateSchemas(manifest);
|
|
109
131
|
this.assertTenantScopedSchemaContract(manifest);
|
|
110
132
|
this.generateAgentManifests(manifest, options?.packageName, options?.packageJson);
|
|
111
|
-
return manifest;
|
|
112
133
|
}
|
|
113
134
|
/**
|
|
114
135
|
* Materialize tenantScoped schema fields.
|
|
@@ -285,26 +306,17 @@ var ManifestGenerator = class {
|
|
|
285
306
|
generateSchemas(manifest) {
|
|
286
307
|
const generator = new SchemaGenerator();
|
|
287
308
|
const aggregatedManifest = this.createAggregatedManifest(manifest);
|
|
288
|
-
const processedSTIBases = /* @__PURE__ */ new Set();
|
|
289
|
-
const localObjects = new Set(Object.values(manifest.objects).map((o) => o.className));
|
|
290
309
|
for (const [name, obj] of Object.entries(manifest.objects)) {
|
|
291
310
|
if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(obj.className)) continue;
|
|
292
311
|
const tableName = obj.decoratorConfig?.tableName || this.classNameToTableName(obj.className);
|
|
293
|
-
if (obj.decoratorConfig?.tableStrategy === "sti") {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
312
|
+
if (obj.decoratorConfig?.tableStrategy === "sti" || this.isSTIChildClass(obj, manifest)) {
|
|
313
|
+
const stiRoot = this.findSTIBaseInfo(obj, manifest);
|
|
314
|
+
const rootKey = stiRoot ? this.resolveManifestKey(stiRoot.className, aggregatedManifest) ?? stiRoot.className : name;
|
|
315
|
+
const rootTableName = stiRoot?.tableName || tableName;
|
|
316
|
+
const rootConfig = aggregatedManifest.objects[rootKey]?.decoratorConfig ?? obj.decoratorConfig;
|
|
317
|
+
logger.info(`[manifest-generator] Generating STI schema for ${name} (root: ${rootKey}, table: ${rootTableName})`);
|
|
318
|
+
obj.schema = generator.generateSTISchemaFromManifest(rootKey, rootTableName, obj.fields, aggregatedManifest, rootConfig);
|
|
298
319
|
this.applySqlTypeOverrides(obj);
|
|
299
|
-
} else if (this.isSTIChildClass(obj, manifest)) {
|
|
300
|
-
const stiBase = this.findSTIBaseInfo(obj, manifest);
|
|
301
|
-
if (stiBase && localObjects.has(stiBase.className)) logger.info(`[manifest-generator] Skipping schema for STI child ${name} (base ${stiBase?.className} is local)`);
|
|
302
|
-
else {
|
|
303
|
-
const baseTableName = stiBase?.tableName || tableName;
|
|
304
|
-
logger.info(`[manifest-generator] Generating STI schema for ${name} (external base: ${stiBase?.className}, table: ${baseTableName})`);
|
|
305
|
-
obj.schema = generator.generateSTISchemaFromManifest(stiBase?.className || name, baseTableName, obj.fields, aggregatedManifest, obj.decoratorConfig);
|
|
306
|
-
this.applySqlTypeOverrides(obj);
|
|
307
|
-
}
|
|
308
320
|
} else {
|
|
309
321
|
logger.info(`[manifest-generator] Generating CTI schema for ${name} (table: ${tableName})`);
|
|
310
322
|
obj.schema = generator.generateCTISchemaFromManifest(name, tableName, obj.fields, obj.decoratorConfig);
|
|
@@ -335,12 +347,51 @@ var ManifestGenerator = class {
|
|
|
335
347
|
obj.decoratorConfig.tenantScoped ??= { mode: "optional" };
|
|
336
348
|
}
|
|
337
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* Materialize the tenant-aware default conflict target (#2360).
|
|
352
|
+
*
|
|
353
|
+
* A tenant-scoped class that declares no `@smrt({ conflictColumns })` keys
|
|
354
|
+
* on `[tenant column, ...natural key]` — `(tenant_id, slug, context)` for
|
|
355
|
+
* a class-per-table object, `(tenant_id, slug, context, _meta_type)` for a
|
|
356
|
+
* single-table hierarchy — so two tenants can each own the same slug and
|
|
357
|
+
* neither `save()` adopts the other's row. Writing the resolved key into
|
|
358
|
+
* `decoratorConfig.conflictColumns` (mirroring `normalizeReportObjects`)
|
|
359
|
+
* makes the manifest, the generated schema, the knowledge artifact and
|
|
360
|
+
* `ObjectRegistry.getConflictColumns()` read one value.
|
|
361
|
+
*
|
|
362
|
+
* Only schema owners are normalized: an STI child inherits the table (and
|
|
363
|
+
* therefore the key) from its root, and `getConflictColumns()` resolves a
|
|
364
|
+
* child through its root at runtime. Explicit `conflictColumns` and
|
|
365
|
+
* `@report` classes (keyed by `normalizeReportObjects`) are left alone.
|
|
366
|
+
* Runs after `injectTenantScopedFields()` and `mergeInheritedFields()` so
|
|
367
|
+
* the tenant field and the inherited `tableStrategy` are in place, and
|
|
368
|
+
* before `generateSchemas()`.
|
|
369
|
+
*/
|
|
370
|
+
normalizeConflictColumns(manifest) {
|
|
371
|
+
for (const obj of Object.values(manifest.objects)) {
|
|
372
|
+
if (!obj.decoratorConfig) continue;
|
|
373
|
+
if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(obj.className)) continue;
|
|
374
|
+
if (obj.decoratorConfig.conflictColumns) continue;
|
|
375
|
+
if (obj.decoratorConfig.report) continue;
|
|
376
|
+
if (this.isSTIChildClass(obj, manifest)) continue;
|
|
377
|
+
const tenantScoped = obj.decoratorConfig.tenantScoped;
|
|
378
|
+
if (!tenantScoped) continue;
|
|
379
|
+
const { tenantConfig } = this.normalizeTenantScopedConfig(tenantScoped);
|
|
380
|
+
const tenantColumn = resolveTenantColumn(tenantConfig.field, (fieldName) => Boolean(obj.fields[fieldName]), toSnakeCase);
|
|
381
|
+
if (!tenantColumn) continue;
|
|
382
|
+
obj.decoratorConfig.conflictColumns = defaultConflictColumns(obj.decoratorConfig.tableStrategy === "sti" ? "sti" : "cti", tenantColumn);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
338
385
|
resolveSamePackageForeignKeyColumnTypes(manifest, generator) {
|
|
339
386
|
const schemaByTable = /* @__PURE__ */ new Map();
|
|
387
|
+
const schemasByTable = /* @__PURE__ */ new Map();
|
|
340
388
|
const ownerBySchema = /* @__PURE__ */ new Map();
|
|
341
389
|
const changedSchemas = /* @__PURE__ */ new Set();
|
|
342
390
|
for (const [name, obj] of Object.entries(manifest.objects)) if (obj.schema?.tableName) {
|
|
343
391
|
schemaByTable.set(obj.schema.tableName, obj.schema);
|
|
392
|
+
const siblings = schemasByTable.get(obj.schema.tableName) ?? [];
|
|
393
|
+
siblings.push(obj.schema);
|
|
394
|
+
schemasByTable.set(obj.schema.tableName, siblings);
|
|
344
395
|
ownerBySchema.set(obj.schema, {
|
|
345
396
|
name,
|
|
346
397
|
obj
|
|
@@ -349,20 +400,22 @@ var ManifestGenerator = class {
|
|
|
349
400
|
for (const obj of Object.values(manifest.objects)) {
|
|
350
401
|
const sourceTable = this.getObjectTableName(obj);
|
|
351
402
|
if (!sourceTable) continue;
|
|
352
|
-
const
|
|
353
|
-
if (!
|
|
403
|
+
const sourceSchemas = schemasByTable.get(sourceTable);
|
|
404
|
+
if (!sourceSchemas || sourceSchemas.length === 0) continue;
|
|
354
405
|
for (const [fieldName, field] of Object.entries(obj.fields || {})) {
|
|
355
406
|
if (field.type !== "foreignKey" || !field.related || field._meta?.sqlType) continue;
|
|
356
407
|
const columnName = toSnakeCase(fieldName);
|
|
357
|
-
const sourceColumn = sourceSchema.columns[columnName];
|
|
358
|
-
if (!sourceColumn) continue;
|
|
359
408
|
const targetIdType = this.findForeignKeyTargetSchema(field.related, manifest, schemaByTable)?.columns.id?.type;
|
|
360
|
-
if (!targetIdType
|
|
361
|
-
sourceSchema
|
|
362
|
-
|
|
363
|
-
type
|
|
364
|
-
|
|
365
|
-
|
|
409
|
+
if (!targetIdType) continue;
|
|
410
|
+
for (const sourceSchema of sourceSchemas) {
|
|
411
|
+
const sourceColumn = sourceSchema.columns[columnName];
|
|
412
|
+
if (!sourceColumn || sourceColumn.type === targetIdType) continue;
|
|
413
|
+
sourceSchema.columns[columnName] = {
|
|
414
|
+
...sourceColumn,
|
|
415
|
+
type: targetIdType
|
|
416
|
+
};
|
|
417
|
+
changedSchemas.add(sourceSchema);
|
|
418
|
+
}
|
|
366
419
|
}
|
|
367
420
|
}
|
|
368
421
|
for (const schema of changedSchemas) this.refreshManifestSchemaDDL(schema, generator, ownerBySchema.get(schema), manifest);
|
|
@@ -536,6 +589,17 @@ var ManifestGenerator = class {
|
|
|
536
589
|
return false;
|
|
537
590
|
}
|
|
538
591
|
/**
|
|
592
|
+
* Resolve a class name (simple `Content` or qualified `@pkg:Content`) to
|
|
593
|
+
* the key it is stored under in `manifest.objects`, or `undefined` when the
|
|
594
|
+
* manifest does not carry it. Manifest keys are qualified names; `extends`
|
|
595
|
+
* and {@link findSTIBaseInfo} report simple names.
|
|
596
|
+
*/
|
|
597
|
+
resolveManifestKey(className, manifest) {
|
|
598
|
+
if (manifest.objects[className]) return className;
|
|
599
|
+
const simpleName = className.includes(":") ? className.slice(className.lastIndexOf(":") + 1) : className;
|
|
600
|
+
for (const [key, obj] of Object.entries(manifest.objects)) if (obj.qualifiedName === className || obj.className === simpleName) return key;
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
539
603
|
* Find full STI base class info (className + tableName)
|
|
540
604
|
*
|
|
541
605
|
* Walks up the inheritance chain to find the STI base class and returns
|