@happyvertical/smrt-core 0.40.15 → 0.40.16
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/browser.js +2 -2
- package/dist/change-feed.d.ts.map +1 -1
- package/dist/change-feed.js +21 -4
- package/dist/change-feed.js.map +1 -1
- package/dist/class.d.ts.map +1 -1
- package/dist/class.js +5 -3
- package/dist/class.js.map +1 -1
- package/dist/dispatch/bus.d.ts.map +1 -1
- package/dist/dispatch/bus.js +11 -6
- package/dist/dispatch/bus.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/manifest/static-manifest.js +2 -2
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest/test-manifest-stub.d.ts.map +1 -1
- package/dist/manifest/test-manifest-stub.js +132 -2
- package/dist/manifest/test-manifest-stub.js.map +1 -1
- package/dist/manifest.json +2 -2
- package/dist/migrations/backfill-tracker.d.ts +1 -0
- package/dist/migrations/backfill-tracker.d.ts.map +1 -1
- package/dist/migrations/backfill-tracker.js +9 -3
- package/dist/migrations/backfill-tracker.js.map +1 -1
- package/dist/migrations/differ.d.ts +18 -0
- package/dist/migrations/differ.d.ts.map +1 -1
- package/dist/migrations/differ.js +28 -5
- package/dist/migrations/differ.js.map +1 -1
- package/dist/migrations/generator.d.ts +8 -0
- package/dist/migrations/generator.d.ts.map +1 -1
- package/dist/migrations/generator.js +5 -1
- package/dist/migrations/generator.js.map +1 -1
- package/dist/migrations/orchestrate.d.ts +10 -0
- package/dist/migrations/orchestrate.d.ts.map +1 -1
- package/dist/migrations/orchestrate.js +8 -2
- package/dist/migrations/orchestrate.js.map +1 -1
- package/dist/migrations/tracker.d.ts.map +1 -1
- package/dist/migrations/tracker.js +4 -2
- package/dist/migrations/tracker.js.map +1 -1
- package/dist/registry/schema-builder.d.ts +13 -6
- package/dist/registry/schema-builder.d.ts.map +1 -1
- package/dist/registry/schema-builder.js +54 -15
- package/dist/registry/schema-builder.js.map +1 -1
- package/dist/registry.d.ts +3 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -4
- package/dist/registry.js.map +1 -1
- package/dist/schema/code-generator.js +123 -0
- package/dist/schema/code-generator.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 -3
- package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
- package/dist/schema/ddl/index.js +26 -2
- package/dist/schema/ddl/index.js.map +1 -1
- package/dist/schema/ddl/materialize-manifest.d.ts +36 -0
- package/dist/schema/ddl/materialize-manifest.d.ts.map +1 -0
- package/dist/schema/ddl/materialize-manifest.js +361 -0
- package/dist/schema/ddl/materialize-manifest.js.map +1 -0
- package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/postgres-strategy.js +1 -1
- package/dist/schema/ddl/postgres-strategy.js.map +1 -1
- package/dist/schema/index.js +12 -0
- package/dist/schema/override-system.js +205 -0
- package/dist/schema/override-system.js.map +1 -0
- package/dist/schema/schema-aggregator.d.ts.map +1 -1
- package/dist/schema/schema-aggregator.js +261 -0
- package/dist/schema/schema-aggregator.js.map +1 -0
- package/dist/schema/schema-manager.js +11 -1
- package/dist/schema/schema-manager.js.map +1 -1
- package/dist/schema/utils.d.ts +1 -0
- 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/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +13 -0
- package/dist/smrt-knowledge.json +5 -4
- package/dist/system/compatibility.d.ts +25 -0
- package/dist/system/compatibility.d.ts.map +1 -1
- package/dist/system/compatibility.js +61 -1
- package/dist/system/compatibility.js.map +1 -1
- package/dist/system/index.js +2 -2
- package/dist/system/schema.d.ts +17 -9
- package/dist/system/schema.d.ts.map +1 -1
- package/dist/system/schema.js +25 -11
- package/dist/system/schema.js.map +1 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +5 -2
- package/dist/testing/database.js.map +1 -1
- package/package.json +10 -5
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { formatDefaultValue as formatDefaultValue$1, quoteIdentifier } from "../schema/sql-identifiers.js";
|
|
2
|
+
import { getDDLStrategy } from "../schema/ddl/index.js";
|
|
2
3
|
import { getClasses, getCollectionTableNames } from "./shared-state.js";
|
|
3
4
|
import { findClass } from "./name-resolver.js";
|
|
4
5
|
import { classnameToTablename, toSnakeCase } from "../utils/naming.js";
|
|
@@ -97,15 +98,24 @@ function getSchema(name) {
|
|
|
97
98
|
* Get SQL DDL statement for a registered class
|
|
98
99
|
*
|
|
99
100
|
* @param name - Name of the registered class
|
|
100
|
-
*
|
|
101
|
+
* Cached manifest DDL contains abstract types and is not safe to execute on
|
|
102
|
+
* PostgreSQL. New executable paths must pass a target engine. Omitting it is
|
|
103
|
+
* retained for backward compatibility with consumers that only inspect the
|
|
104
|
+
* legacy engine-neutral manifest string.
|
|
105
|
+
*
|
|
106
|
+
* @param engine - Database engine that will execute the DDL
|
|
107
|
+
* @returns Engine-specific SQL DDL, or the legacy cached DDL when omitted
|
|
101
108
|
* @example
|
|
102
109
|
* ```typescript
|
|
103
|
-
* const ddl = ObjectRegistry.getSchemaDDL('Product');
|
|
110
|
+
* const ddl = ObjectRegistry.getSchemaDDL('Product', 'postgres');
|
|
104
111
|
* await db.query(ddl);
|
|
105
112
|
* ```
|
|
106
113
|
*/
|
|
107
|
-
function getSchemaDDL(name) {
|
|
108
|
-
|
|
114
|
+
function getSchemaDDL(name, engine) {
|
|
115
|
+
const schema = getSchema(name);
|
|
116
|
+
if (!schema) return void 0;
|
|
117
|
+
if (engine && Object.keys(schema.columns).length === 0) throw new Error(`Cannot materialize schema '${name}' for ${engine}: the manifest has no structured columns`);
|
|
118
|
+
return engine ? getDDLStrategy(engine).generateCreateTable(schema) : schema.ddl;
|
|
109
119
|
}
|
|
110
120
|
/**
|
|
111
121
|
* Get table name for a registered class
|
|
@@ -127,6 +137,17 @@ function getTableName(name) {
|
|
|
127
137
|
if (stiBase && stiBase !== qualifiedName) return getSchema(stiBase)?.tableName;
|
|
128
138
|
return getSchema(name)?.tableName;
|
|
129
139
|
}
|
|
140
|
+
function withConflictIndex(tableName, columns, indexes, conflictColumns) {
|
|
141
|
+
if (conflictColumns.length === 0 || !conflictColumns.every((column) => columns[column])) return indexes;
|
|
142
|
+
if (indexes.some((index) => index.unique === true && !index.where && !index.jsonPath && index.columns.length === conflictColumns.length && index.columns.every((column) => conflictColumns.includes(column)))) return indexes;
|
|
143
|
+
const preferredName = `${tableName}_${(conflictColumns.length > 2 ? conflictColumns.slice(0, 2) : conflictColumns).join("_")}_idx`;
|
|
144
|
+
const name = indexes.some((index) => index.name === preferredName) ? `${preferredName}_unique` : preferredName;
|
|
145
|
+
return [...indexes, {
|
|
146
|
+
name,
|
|
147
|
+
columns: conflictColumns,
|
|
148
|
+
unique: true
|
|
149
|
+
}];
|
|
150
|
+
}
|
|
130
151
|
/**
|
|
131
152
|
* Get all pre-generated schemas for explicit adapter bootstrap paths.
|
|
132
153
|
*
|
|
@@ -138,11 +159,11 @@ function getTableName(name) {
|
|
|
138
159
|
* @returns Record of table names to schema definitions
|
|
139
160
|
* @example
|
|
140
161
|
* ```typescript
|
|
141
|
-
* const schemas = ObjectRegistry.getAllSchemas();
|
|
162
|
+
* const schemas = ObjectRegistry.getAllSchemas('json');
|
|
142
163
|
* const db = await getDatabase({ type: 'json', url: './data', schemas });
|
|
143
164
|
* ```
|
|
144
165
|
*/
|
|
145
|
-
function getAllSchemas() {
|
|
166
|
+
function getAllSchemas(engine) {
|
|
146
167
|
const tableSchemas = {};
|
|
147
168
|
for (const [_className, registered] of getClasses()) {
|
|
148
169
|
if (isCollectionRegistration(_className, registered, collectionRegistrationLookup)) continue;
|
|
@@ -202,7 +223,8 @@ function getAllSchemas() {
|
|
|
202
223
|
},
|
|
203
224
|
indexes: [],
|
|
204
225
|
ddl: registered.schema.ddl || "",
|
|
205
|
-
isSTI
|
|
226
|
+
isSTI,
|
|
227
|
+
conflictColumns: ObjectRegistry.getConflictColumns(isSTI ? ObjectRegistry.getSTIBase(lookupKey) || lookupKey : lookupKey)
|
|
206
228
|
};
|
|
207
229
|
} else for (const [colName, colDef] of Object.entries(columnsToUse)) if (!tableSchemas[tableName].columns[colName]) tableSchemas[tableName].columns[colName] = colDef;
|
|
208
230
|
if (registered.schema.indexes && registered.schema.indexes.length > 0) {
|
|
@@ -219,12 +241,26 @@ function getAllSchemas() {
|
|
|
219
241
|
}
|
|
220
242
|
const schemas = {};
|
|
221
243
|
for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {
|
|
244
|
+
const engineIndexes = engine ? withConflictIndex(tableName, tableSchema.columns, tableSchema.indexes, tableSchema.conflictColumns) : tableSchema.indexes;
|
|
245
|
+
const mergedSchema = {
|
|
246
|
+
tableName,
|
|
247
|
+
ddl: tableSchema.ddl,
|
|
248
|
+
columns: tableSchema.columns,
|
|
249
|
+
indexes: engineIndexes,
|
|
250
|
+
triggers: [],
|
|
251
|
+
foreignKeys: [],
|
|
252
|
+
version: "",
|
|
253
|
+
dependencies: []
|
|
254
|
+
};
|
|
222
255
|
let ddl;
|
|
223
|
-
if (Object.keys(tableSchema.columns).length === 0 && tableSchema.ddl)
|
|
224
|
-
|
|
256
|
+
if (Object.keys(tableSchema.columns).length === 0 && tableSchema.ddl) {
|
|
257
|
+
if (engine) throw new Error(`Cannot materialize schema '${tableName}' for ${engine}: the manifest has no structured columns`);
|
|
258
|
+
ddl = tableSchema.ddl;
|
|
259
|
+
} else if (Object.keys(tableSchema.columns).length === 0) continue;
|
|
260
|
+
else if (engine) ddl = getDDLStrategy(engine).generateCreateTable(mergedSchema);
|
|
225
261
|
else ddl = generateDDLFromColumns(tableName, tableSchema.columns, tableSchema.isSTI);
|
|
226
262
|
let indexSQL;
|
|
227
|
-
if (
|
|
263
|
+
if (engineIndexes.length > 0) indexSQL = engine ? getDDLStrategy(engine).generateIndexes(mergedSchema) : engineIndexes.map((idx) => {
|
|
228
264
|
const indexType = idx.unique ? "UNIQUE INDEX" : "INDEX";
|
|
229
265
|
const columnList = idx.columns.map((col) => quoteIdentifier(col)).join(", ");
|
|
230
266
|
return `CREATE ${indexType} IF NOT EXISTS ${quoteIdentifier(idx.name)} ON ${quoteIdentifier(tableName)} (${columnList});`;
|
|
@@ -307,7 +343,8 @@ function getAllSchemasAsDefinitions() {
|
|
|
307
343
|
...columnsToUse
|
|
308
344
|
},
|
|
309
345
|
indexes: [],
|
|
310
|
-
isSTI
|
|
346
|
+
isSTI,
|
|
347
|
+
conflictColumns: ObjectRegistry.getConflictColumns(isSTI ? ObjectRegistry.getSTIBase(lookupKey) || lookupKey : lookupKey)
|
|
311
348
|
};
|
|
312
349
|
} else for (const [colName, colDef] of Object.entries(columnsToUse)) if (!tableSchemas[tableName].columns[colName]) tableSchemas[tableName].columns[colName] = colDef;
|
|
313
350
|
if (registered.schema.indexes && registered.schema.indexes.length > 0) {
|
|
@@ -326,7 +363,7 @@ function getAllSchemasAsDefinitions() {
|
|
|
326
363
|
tableName,
|
|
327
364
|
ddl: generateDDLFromColumns(tableName, tableSchema.columns, tableSchema.isSTI),
|
|
328
365
|
columns: tableSchema.columns,
|
|
329
|
-
indexes: tableSchema.indexes,
|
|
366
|
+
indexes: withConflictIndex(tableName, tableSchema.columns, tableSchema.indexes, tableSchema.conflictColumns),
|
|
330
367
|
triggers: [],
|
|
331
368
|
foreignKeys: [],
|
|
332
369
|
version: "",
|
|
@@ -345,17 +382,19 @@ function getAllSchemasAsDefinitions() {
|
|
|
345
382
|
* @param columns - Column definitions
|
|
346
383
|
* @returns DDL CREATE TABLE statement
|
|
347
384
|
*/
|
|
348
|
-
function generateDDLFromColumns(tableName, columns, isSTI = false) {
|
|
385
|
+
function generateDDLFromColumns(tableName, columns, isSTI = false, engine) {
|
|
349
386
|
let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (\n`;
|
|
350
387
|
const columnLines = [];
|
|
351
388
|
for (const [columnName, columnDef] of Object.entries(columns)) {
|
|
352
389
|
const parts = [];
|
|
353
|
-
|
|
390
|
+
const strategy = engine ? getDDLStrategy(engine) : void 0;
|
|
391
|
+
const columnType = strategy ? strategy.mapType(columnDef.type) : columnDef.type;
|
|
392
|
+
parts.push(` ${quoteIdentifier(columnName)} ${columnType}`);
|
|
354
393
|
if (columnDef.primaryKey) parts.push("PRIMARY KEY");
|
|
355
394
|
if (columnDef.notNull) parts.push("NOT NULL");
|
|
356
395
|
if (columnDef.unique && !columnDef.primaryKey) parts.push("UNIQUE");
|
|
357
396
|
if (columnDef.defaultValue !== void 0) {
|
|
358
|
-
const defaultSQL = formatDefaultValue(columnDef.defaultValue, columnDef.type);
|
|
397
|
+
const defaultSQL = strategy ? strategy.formatDefaultValue(columnDef.defaultValue, columnDef.type) : formatDefaultValue(columnDef.defaultValue, columnDef.type);
|
|
359
398
|
parts.push(`DEFAULT ${defaultSQL}`);
|
|
360
399
|
}
|
|
361
400
|
columnLines.push(parts.join(" "));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-builder.js","names":[],"sources":["../../src/registry/schema-builder.ts"],"sourcesContent":["/**\n * Schema building logic for the SMRT ObjectRegistry.\n *\n * Extracted from registry.ts as part of issue #1006.\n */\n\nimport { ObjectRegistry } from '../registry';\nimport type { FieldDefinition } from '../scanner/types.js';\nimport {\n formatDefaultValue as formatDefaultValueShared,\n quoteIdentifier,\n} from '../schema/sql-identifiers.js';\nimport type {\n ColumnDefinition,\n IndexDefinition,\n SchemaDefinition,\n SQLDataType,\n} from '../schema/types.js';\nimport { classnameToTablename, toSnakeCase } from '../utils';\nimport {\n type CollectionRegistrationLookup,\n isCollectionRegistration,\n} from './collection-resolution';\nimport { findClass } from './name-resolver';\nimport { getClasses, getCollectionTableNames } from './shared-state';\n\ntype ForeignKeyAction = NonNullable<\n NonNullable<ColumnDefinition['foreignKey']>['onDelete']\n>;\n\nconst collectionRegistrationLookup: CollectionRegistrationLookup = {\n findClass,\n findClassInPackage: (packageName, className) =>\n ObjectRegistry.getClassInPackage(packageName, className),\n getInheritanceChain: (className) =>\n ObjectRegistry.getInheritanceChain(className),\n};\n\nfunction applyDecoratorSqlTypeOverrides(\n className: string,\n columns: Record<string, ColumnDefinition>,\n): Record<string, ColumnDefinition> {\n const decorators = ObjectRegistry.getFieldDecorators(className);\n if (!decorators.size) {\n return columns;\n }\n\n for (const [fieldName, options] of decorators) {\n if (!options?.sqlType) {\n continue;\n }\n\n const columnName = toSnakeCase(fieldName);\n const existing = columns[columnName];\n if (!existing) {\n continue;\n }\n\n const referenceKind = getReferenceKind(options as FieldDefinition);\n columns[columnName] = {\n ...existing,\n type: String(options.sqlType).toUpperCase() as SQLDataType,\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n\n return columns;\n}\n\nfunction mergeRuntimeFieldColumns(\n className: string,\n schemaColumns: Record<string, ColumnDefinition> | undefined,\n fields: Map<string, FieldDefinition>,\n): Record<string, ColumnDefinition> {\n const columnsToUse = { ...(schemaColumns || {}) };\n\n if (fields.size > 0) {\n const fieldColumns = fieldsToColumns(fields);\n for (const [columnName, columnDef] of Object.entries(fieldColumns)) {\n if (!columnsToUse[columnName]) {\n columnsToUse[columnName] = columnDef;\n }\n }\n\n for (const [fieldName, fieldDef] of fields) {\n const columnName = toSnakeCase(fieldName);\n const existing = columnsToUse[columnName];\n if (!existing) {\n continue;\n }\n\n const sqlType =\n fieldDef._meta?.sqlType ||\n (fieldDef as unknown as { sqlType?: string }).sqlType;\n const referenceKind = getReferenceKind(fieldDef);\n columnsToUse[columnName] = {\n ...existing,\n ...(sqlType\n ? { type: String(sqlType).toUpperCase() as SQLDataType }\n : {}),\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n }\n\n applyDecoratorSqlTypeOverrides(className, columnsToUse);\n return columnsToUse;\n}\n\nfunction getReferenceKind(\n fieldDef: FieldDefinition,\n): ColumnDefinition['referenceKind'] | undefined {\n if (\n (\n fieldDef as unknown as {\n __tenancy?: { isTenantIdField?: boolean };\n }\n ).__tenancy?.isTenantIdField ||\n fieldDef._meta?.__tenancy?.isTenantIdField\n ) {\n return 'tenantId';\n }\n\n if (fieldDef.type === 'foreignKey') {\n return 'foreignKey';\n }\n\n if (fieldDef.type === 'crossPackageRef') {\n return 'crossPackageRef';\n }\n\n return undefined;\n}\n\nfunction shouldEmitDefault(fieldDef: FieldDefinition, sqlType: SQLDataType) {\n return !(\n getReferenceKind(fieldDef) === 'tenantId' &&\n sqlType === 'UUID' &&\n fieldDef.default === ''\n );\n}\n\nfunction createBaseColumns(registered: {\n config?: { idType?: 'uuid' | 'text' };\n}): Record<string, ColumnDefinition> {\n return {\n id: {\n type: registered.config?.idType === 'text' ? 'TEXT' : 'UUID',\n primaryKey: true,\n referenceKind: 'id',\n },\n slug: { type: 'TEXT', notNull: true },\n context: { type: 'TEXT' },\n created_at: { type: 'TIMESTAMP' },\n updated_at: { type: 'TIMESTAMP' },\n };\n}\n\n/**\n * Get cached schema definition for a registered class\n *\n * @param name - Name of the registered class\n * @returns Schema definition or undefined if not found\n * @example\n * ```typescript\n * const schema = getSchema('Product');\n * console.log(schema.tableName); // 'products'\n * console.log(schema.ddl); // 'CREATE TABLE...'\n * ```\n */\nexport function getSchema(name: string): SchemaDefinition | undefined {\n // Issue #951: Use findClass for multi-strategy lookup\n const registered = findClass(name);\n return registered?.schema;\n}\n\n/**\n * Get SQL DDL statement for a registered class\n *\n * @param name - Name of the registered class\n * @returns SQL DDL statement or undefined if not found\n * @example\n * ```typescript\n * const ddl = ObjectRegistry.getSchemaDDL('Product');\n * await db.query(ddl);\n * ```\n */\nexport function getSchemaDDL(name: string): string | undefined {\n return getSchema(name)?.ddl;\n}\n\n/**\n * Get table name for a registered class\n *\n * @param name - Name of the registered class\n * @returns Table name or undefined if not found\n * @example\n * ```typescript\n * const tableName = getTableName('Product');\n * console.log(tableName); // 'products'\n * ```\n */\nexport function getTableName(name: string): string | undefined {\n // Check if this is a collection class - collections have their own tableName mapping\n const collectionTableName = getCollectionTableNames().get(name);\n if (collectionTableName) {\n return collectionTableName;\n }\n\n // For STI classes, return the STI base class's table name.\n // R5-canon: `getSTIBase` returns the qualified name; resolve `name`\n // (which may be simple) to its registration's qualified form for the\n // comparison.\n const stiBase = ObjectRegistry.getSTIBase(name);\n const registered = ObjectRegistry.getClass(name);\n const qualifiedName = registered?.qualifiedName ?? registered?.name ?? name;\n if (stiBase && stiBase !== qualifiedName) {\n return getSchema(stiBase)?.tableName;\n }\n return getSchema(name)?.tableName;\n}\n\n/**\n * Get all pre-generated schemas for explicit adapter bootstrap paths.\n *\n * Returns schemas in SDK SchemaProvider format for all registered classes.\n * Tooling and test helpers can pass these to `getDatabase()` when they want\n * to bootstrap schema before runtime. Core runtime no longer does this\n * implicitly.\n *\n * @returns Record of table names to schema definitions\n * @example\n * ```typescript\n * const schemas = ObjectRegistry.getAllSchemas();\n * const db = await getDatabase({ type: 'json', url: './data', schemas });\n * ```\n */\nexport function getAllSchemas(): Record<\n string,\n { tableName: string; ddl: string; indexes?: string[] }\n> {\n // Step 1: Collect all schemas grouped by tableName\n // For STI, multiple classes may share the same table\n const tableSchemas: Record<\n string,\n {\n tableName: string;\n columns: Record<string, ColumnDefinition>;\n indexes: Array<{ name: string; columns: string[]; unique?: boolean }>;\n ddl: string;\n isSTI: boolean;\n }\n > = {};\n\n for (const [_className, registered] of getClasses()) {\n // Skip collection classes - they don't have their own tables\n // Their schemas incorrectly contain collection properties (loaded, options, etc.)\n if (\n isCollectionRegistration(\n _className,\n registered,\n collectionRegistrationLookup,\n )\n ) {\n continue;\n }\n\n // Issue #951: Use simple name for STI comparisons (map key may be qualified)\n const simpleName = registered.name || _className;\n\n // Issue #703: Handle STI subclasses with null tableName from external manifests\n // When loaded from external manifests, tableName may be null, causing\n // registerFromManifest() to derive a tableName from class name.\n // For STI subclasses, we need to use the STI base's tableName instead.\n if (!registered.schema?.tableName && registered.extends) {\n // R5-canon: use the qualified key for STI lookups so colliding\n // simple names don't resolve to the wrong package's class.\n // `getTableStrategy` / `getSTIBase` both accept qualified names\n // via `findClass`'s multi-strategy lookup.\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n // Ensure we have a schema object to modify\n if (!registered.schema) {\n registered.schema = {\n tableName: '',\n ddl: '',\n columns: {},\n indexes: [],\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: '',\n };\n }\n // Set tableName from STI base so the following block processes this class\n registered.schema.tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n }\n\n if (registered.schema?.tableName) {\n // For STI subclasses, use the STI base class's tableName\n // This ensures all STI subclass columns are merged into the parent table\n // (Issue #693: STI subclasses with separate tableName still serialize to parent table)\n let tableName = registered.schema.tableName;\n // R5-canon: same qualified-key strategy as the block above.\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n // This is an STI subclass - use the base class's tableName\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n\n // Start with manifest columns, then backfill any columns that only exist\n // in runtime field metadata (for example tenantScoped injections). We do\n // not replace existing manifest column metadata here, because the manifest\n // is authoritative for foreign keys, defaults, and other schema details.\n // Explicit decorator sqlType overrides are patched onto the merged column.\n const columnsToUse = mergeRuntimeFieldColumns(\n simpleName,\n registered.schema.columns,\n registered.fields,\n );\n\n if (!tableSchemas[tableName]) {\n // First class for this table - initialize with base columns\n // These are required for all tables but are skipped by fieldsToColumns()\n const baseColumns = createBaseColumns(registered);\n\n // For STI tables, add discriminator and data columns\n // (Issue #690: db:diff needs these columns to detect schema changes)\n const isSTI = tableStrategy === 'sti';\n if (isSTI) {\n baseColumns._meta_type = {\n type: 'TEXT',\n notNull: true,\n defaultValue: '',\n };\n baseColumns._meta_data = { type: 'JSON' };\n }\n\n tableSchemas[tableName] = {\n tableName,\n columns: { ...baseColumns, ...columnsToUse },\n indexes: [],\n ddl: registered.schema.ddl || '',\n isSTI,\n };\n } else {\n // Additional class sharing this table (STI scenario)\n // Merge columns from this class into the existing schema\n for (const [colName, colDef] of Object.entries(columnsToUse)) {\n if (!tableSchemas[tableName].columns[colName]) {\n // New column from this subtype - add it\n tableSchemas[tableName].columns[colName] = colDef;\n }\n }\n }\n\n // Merge indexes (avoid duplicates by name)\n if (registered.schema.indexes && registered.schema.indexes.length > 0) {\n const existingNames = new Set(\n tableSchemas[tableName].indexes.map((idx) =>\n typeof idx === 'string' ? idx : idx.name,\n ),\n );\n for (const idx of registered.schema.indexes) {\n const indexName = typeof idx === 'string' ? idx : idx.name;\n if (!existingNames.has(indexName)) {\n if (typeof idx === 'string') {\n // Legacy string format - skip, can't merge properly\n } else {\n tableSchemas[tableName].indexes.push(idx);\n existingNames.add(idx.name);\n }\n }\n }\n }\n }\n }\n\n // Step 2: Convert to output format, regenerating DDL for merged schemas\n const schemas: Record<\n string,\n { tableName: string; ddl: string; indexes?: string[] }\n > = {};\n\n for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {\n // Generate DDL from merged columns (or use original DDL if columns are empty)\n let ddl: string;\n if (Object.keys(tableSchema.columns).length === 0 && tableSchema.ddl) {\n // No columns merged - use original DDL to avoid generating invalid SQL\n ddl = tableSchema.ddl;\n } else if (Object.keys(tableSchema.columns).length === 0) {\n // Skip schemas with no columns and no original DDL\n continue;\n } else {\n ddl = generateDDLFromColumns(\n tableName,\n tableSchema.columns,\n tableSchema.isSTI,\n );\n }\n\n // Convert index definitions to SQL strings for SDK compatibility\n let indexSQL: string[] | undefined;\n if (tableSchema.indexes.length > 0) {\n indexSQL = tableSchema.indexes.map((idx) => {\n const indexType = idx.unique ? 'UNIQUE INDEX' : 'INDEX';\n const columnList = idx.columns\n .map((col) => quoteIdentifier(col))\n .join(', ');\n return `CREATE ${indexType} IF NOT EXISTS ${quoteIdentifier(\n idx.name,\n )} ON ${quoteIdentifier(tableName)} (${columnList});`;\n });\n }\n\n schemas[tableName] = {\n tableName,\n ddl,\n indexes: indexSQL,\n };\n }\n\n return schemas;\n}\n\n/**\n * Get all registered schemas as SchemaDefinition objects\n *\n * Similar to getAllSchemas(), but returns SchemaDefinition format suitable\n * for use with SchemaComparer (migrations/differ.ts).\n *\n * Key difference: Indexes are kept as IndexDefinition objects instead of\n * being converted to SQL strings.\n *\n * @returns Map of tableName to SchemaDefinition\n */\nexport function getAllSchemasAsDefinitions(): Record<string, SchemaDefinition> {\n // Step 1: Collect all schemas grouped by tableName\n // For STI, multiple classes may share the same table\n const tableSchemas: Record<\n string,\n {\n tableName: string;\n columns: Record<string, ColumnDefinition>;\n indexes: IndexDefinition[];\n isSTI: boolean;\n }\n > = {};\n\n for (const [_className, registered] of getClasses()) {\n // Skip collection classes - they don't have their own tables\n if (\n isCollectionRegistration(\n _className,\n registered,\n collectionRegistrationLookup,\n )\n ) {\n continue;\n }\n\n // Issue #951: Use simple name for STI comparisons (map key may be qualified)\n const simpleName = registered.name || _className;\n\n // Handle STI subclasses with null tableName from external manifests\n if (!registered.schema?.tableName && registered.extends) {\n // R5-canon: use the qualified key for STI lookups so colliding\n // simple names don't resolve to the wrong package's class.\n // `getTableStrategy` / `getSTIBase` both accept qualified names\n // via `findClass`'s multi-strategy lookup.\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n if (!registered.schema) {\n registered.schema = {\n tableName: '',\n ddl: '',\n columns: {},\n indexes: [],\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: '',\n };\n }\n registered.schema.tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n }\n\n if (registered.schema?.tableName) {\n // For STI subclasses, use the STI base class's tableName.\n // R5-canon: qualified-key lookup so a colliding simple name in\n // another package can't yield the wrong tableStrategy / STI base\n // and move this class's columns under that other package's table.\n let tableName = registered.schema.tableName;\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n\n // Manifest schema remains authoritative for existing columns. Runtime\n // field metadata can backfill missing columns and apply explicit sqlType\n // overrides without erasing richer manifest metadata.\n const columnsToUse = mergeRuntimeFieldColumns(\n simpleName,\n registered.schema.columns,\n registered.fields,\n );\n\n if (!tableSchemas[tableName]) {\n // First class for this table - initialize with base columns\n const baseColumns = createBaseColumns(registered);\n\n const isSTI = tableStrategy === 'sti';\n if (isSTI) {\n baseColumns._meta_type = {\n type: 'TEXT',\n notNull: true,\n defaultValue: '',\n };\n baseColumns._meta_data = { type: 'JSON' };\n }\n\n tableSchemas[tableName] = {\n tableName,\n columns: { ...baseColumns, ...columnsToUse },\n indexes: [],\n isSTI,\n };\n } else {\n // Additional class sharing this table (STI scenario) - merge columns\n for (const [colName, colDef] of Object.entries(columnsToUse)) {\n if (!tableSchemas[tableName].columns[colName]) {\n tableSchemas[tableName].columns[colName] = colDef;\n }\n }\n }\n\n // Merge indexes (avoid duplicates by name)\n if (registered.schema.indexes && registered.schema.indexes.length > 0) {\n const existingNames = new Set(\n tableSchemas[tableName].indexes.map((idx) => idx.name),\n );\n for (const idx of registered.schema.indexes) {\n if (!existingNames.has(idx.name)) {\n tableSchemas[tableName].indexes.push(idx);\n existingNames.add(idx.name);\n }\n }\n }\n }\n }\n\n // Step 2: Convert to SchemaDefinition format\n const schemas: Record<string, SchemaDefinition> = {};\n\n for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {\n if (Object.keys(tableSchema.columns).length === 0) {\n continue;\n }\n\n // Generate DDL from columns\n const ddl = generateDDLFromColumns(\n tableName,\n tableSchema.columns,\n tableSchema.isSTI,\n );\n\n schemas[tableName] = {\n tableName,\n ddl,\n columns: tableSchema.columns,\n indexes: tableSchema.indexes, // Keep as IndexDefinition[]\n triggers: [],\n foreignKeys: [],\n version: '',\n dependencies: [],\n };\n }\n\n return schemas;\n}\n\n/**\n * Generate DDL CREATE TABLE statement from columns\n *\n * Used internally by getAllSchemas() to regenerate DDL after merging\n * columns from multiple STI subtypes that share the same table.\n *\n * @param tableName - Name of the table\n * @param columns - Column definitions\n * @returns DDL CREATE TABLE statement\n */\nexport function generateDDLFromColumns(\n tableName: string,\n columns: Record<string, ColumnDefinition>,\n isSTI = false,\n): string {\n let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (\\n`;\n\n const columnLines: string[] = [];\n for (const [columnName, columnDef] of Object.entries(columns)) {\n const parts: string[] = [];\n\n // Column name and type\n parts.push(` ${quoteIdentifier(columnName)} ${columnDef.type}`);\n\n // Primary key\n if (columnDef.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n\n // Not null constraint\n if (columnDef.notNull) {\n parts.push('NOT NULL');\n }\n\n // Unique constraint (skip if primary key already implies uniqueness)\n if (columnDef.unique && !columnDef.primaryKey) {\n parts.push('UNIQUE');\n }\n\n // Default value\n if (columnDef.defaultValue !== undefined) {\n const defaultSQL = formatDefaultValue(\n columnDef.defaultValue,\n columnDef.type,\n );\n parts.push(`DEFAULT ${defaultSQL}`);\n }\n\n columnLines.push(parts.join(' '));\n }\n\n sql += columnLines.join(',\\n');\n\n // Add UNIQUE constraint for UPSERT operations\n // For STI tables: UNIQUE(slug, context, _meta_type) - different types can have same slug+context\n // For non-STI tables: UNIQUE(slug, context)\n if (columns.slug && columns.context) {\n if (isSTI && columns._meta_type) {\n sql += ',\\n UNIQUE(slug, context, _meta_type)';\n } else {\n sql += ',\\n UNIQUE(slug, context)';\n }\n }\n\n sql += '\\n);';\n\n return sql;\n}\n\n/**\n * Format default value for SQL DDL.\n *\n * Thin wrapper over the shared, injection-safe formatter\n * (`schema/sql-identifiers.ts`) so the registry schema-builder uses the same\n * rules as the DDL strategies and schema generator: an allowlist of SQL\n * keyword/function defaults (not \"contains `(`\"), type-driven literal quoting,\n * and no folding of a literal string `\"null\"` into the SQL NULL keyword.\n *\n * @param value - Default value\n * @param type - Column SQL type\n * @returns Formatted SQL default value\n */\nexport function formatDefaultValue(value: unknown, type: string): string {\n return formatDefaultValueShared(value, type);\n}\n\n/**\n * Convert a Map of field definitions to column definitions\n *\n * Used by getAllSchemas() to generate columns from fields when a class\n * has no pre-generated schema (e.g., STI subclasses registered from manifest).\n *\n * @param fields - Map of field name to field definition\n * @returns Record of column name to column definition\n * @private\n */\nexport function fieldsToColumns(\n fields: Map<string, FieldDefinition>,\n): Record<string, ColumnDefinition> {\n const columns: Record<string, ColumnDefinition> = {};\n\n for (const [fieldName, fieldDef] of fields) {\n // Skip id, timestamps - they're on the base table\n if (\n fieldName === 'id' ||\n fieldName === 'created_at' ||\n fieldName === 'updated_at' ||\n fieldName === 'slug' ||\n fieldName === 'context'\n ) {\n continue;\n }\n\n // Skip transient fields (non-persisted)\n if (fieldDef.transient || fieldDef._meta?.transient) {\n continue;\n }\n\n // Skip relationship fields that don't create columns\n // oneToMany and manyToMany are relationship metadata, not actual database columns\n if (fieldDef.type === 'oneToMany' || fieldDef.type === 'manyToMany') {\n continue;\n }\n\n // Skip meta fields - they're stored in _meta_data JSONB column\n if (fieldDef.type === 'meta') {\n continue;\n }\n\n // Map field type to SQL type\n const sqlType =\n fieldDef._meta?.sqlType ||\n (fieldDef.type === 'crossPackageRef' &&\n (fieldDef._meta?.idType === 'text' ||\n (fieldDef as unknown as { idType?: string }).idType === 'text')\n ? 'TEXT'\n : mapFieldTypeToSQL(fieldDef.type));\n const normalizedSqlType = String(sqlType).toUpperCase() as SQLDataType;\n const referenceKind = getReferenceKind(fieldDef);\n\n const column: ColumnDefinition = {\n type: normalizedSqlType,\n referenceKind,\n notNull: fieldDef._meta?.nullable ? false : fieldDef.required || false,\n unique: fieldDef._meta?.unique || false,\n description: fieldDef.description,\n };\n\n // Handle default values\n if (\n fieldDef.default !== undefined &&\n shouldEmitDefault(fieldDef, normalizedSqlType)\n ) {\n column.defaultValue = fieldDef.default;\n }\n\n // Handle foreign keys\n if (fieldDef.type === 'foreignKey' && fieldDef.related) {\n const [table, columnName = 'id'] = fieldDef.related.split('.');\n const fieldMeta = fieldDef._meta as\n | {\n onDelete?: ForeignKeyAction;\n onUpdate?: ForeignKeyAction;\n }\n | undefined;\n column.foreignKey = {\n table: classnameToTablename(table),\n column: columnName,\n onDelete: fieldMeta?.onDelete ?? 'CASCADE',\n onUpdate: fieldMeta?.onUpdate ?? 'CASCADE',\n };\n }\n\n // Use snake_case for column names\n columns[toSnakeCase(fieldName)] = column;\n }\n\n return columns;\n}\n\n/**\n * Map field type to SQL data type\n * @private\n */\nexport function mapFieldTypeToSQL(\n fieldType: FieldDefinition['type'],\n): SQLDataType {\n switch (fieldType) {\n case 'text':\n return 'TEXT';\n case 'integer':\n return 'INTEGER';\n case 'decimal':\n return 'REAL';\n case 'boolean':\n return 'BOOLEAN';\n case 'datetime':\n return 'TIMESTAMP';\n case 'json':\n return 'JSON';\n case 'foreignKey':\n return 'UUID';\n case 'crossPackageRef':\n return 'UUID';\n default:\n return 'TEXT';\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-builder.js","names":[],"sources":["../../src/registry/schema-builder.ts"],"sourcesContent":["/**\n * Schema building logic for the SMRT ObjectRegistry.\n *\n * Extracted from registry.ts as part of issue #1006.\n */\n\nimport { ObjectRegistry } from '../registry';\nimport type { FieldDefinition } from '../scanner/types.js';\nimport { getDDLStrategy } from '../schema/ddl/index.js';\nimport type { DatabaseEngine } from '../schema/ddl/types.js';\nimport {\n formatDefaultValue as formatDefaultValueShared,\n quoteIdentifier,\n} from '../schema/sql-identifiers.js';\nimport type {\n ColumnDefinition,\n IndexDefinition,\n SchemaDefinition,\n SQLDataType,\n} from '../schema/types.js';\nimport { classnameToTablename, toSnakeCase } from '../utils';\nimport {\n type CollectionRegistrationLookup,\n isCollectionRegistration,\n} from './collection-resolution';\nimport { findClass } from './name-resolver';\nimport { getClasses, getCollectionTableNames } from './shared-state';\n\ntype ForeignKeyAction = NonNullable<\n NonNullable<ColumnDefinition['foreignKey']>['onDelete']\n>;\n\nconst collectionRegistrationLookup: CollectionRegistrationLookup = {\n findClass,\n findClassInPackage: (packageName, className) =>\n ObjectRegistry.getClassInPackage(packageName, className),\n getInheritanceChain: (className) =>\n ObjectRegistry.getInheritanceChain(className),\n};\n\nfunction applyDecoratorSqlTypeOverrides(\n className: string,\n columns: Record<string, ColumnDefinition>,\n): Record<string, ColumnDefinition> {\n const decorators = ObjectRegistry.getFieldDecorators(className);\n if (!decorators.size) {\n return columns;\n }\n\n for (const [fieldName, options] of decorators) {\n if (!options?.sqlType) {\n continue;\n }\n\n const columnName = toSnakeCase(fieldName);\n const existing = columns[columnName];\n if (!existing) {\n continue;\n }\n\n const referenceKind = getReferenceKind(options as FieldDefinition);\n columns[columnName] = {\n ...existing,\n type: String(options.sqlType).toUpperCase() as SQLDataType,\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n\n return columns;\n}\n\nfunction mergeRuntimeFieldColumns(\n className: string,\n schemaColumns: Record<string, ColumnDefinition> | undefined,\n fields: Map<string, FieldDefinition>,\n): Record<string, ColumnDefinition> {\n const columnsToUse = { ...(schemaColumns || {}) };\n\n if (fields.size > 0) {\n const fieldColumns = fieldsToColumns(fields);\n for (const [columnName, columnDef] of Object.entries(fieldColumns)) {\n if (!columnsToUse[columnName]) {\n columnsToUse[columnName] = columnDef;\n }\n }\n\n for (const [fieldName, fieldDef] of fields) {\n const columnName = toSnakeCase(fieldName);\n const existing = columnsToUse[columnName];\n if (!existing) {\n continue;\n }\n\n const sqlType =\n fieldDef._meta?.sqlType ||\n (fieldDef as unknown as { sqlType?: string }).sqlType;\n const referenceKind = getReferenceKind(fieldDef);\n columnsToUse[columnName] = {\n ...existing,\n ...(sqlType\n ? { type: String(sqlType).toUpperCase() as SQLDataType }\n : {}),\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n }\n\n applyDecoratorSqlTypeOverrides(className, columnsToUse);\n return columnsToUse;\n}\n\nfunction getReferenceKind(\n fieldDef: FieldDefinition,\n): ColumnDefinition['referenceKind'] | undefined {\n if (\n (\n fieldDef as unknown as {\n __tenancy?: { isTenantIdField?: boolean };\n }\n ).__tenancy?.isTenantIdField ||\n fieldDef._meta?.__tenancy?.isTenantIdField\n ) {\n return 'tenantId';\n }\n\n if (fieldDef.type === 'foreignKey') {\n return 'foreignKey';\n }\n\n if (fieldDef.type === 'crossPackageRef') {\n return 'crossPackageRef';\n }\n\n return undefined;\n}\n\nfunction shouldEmitDefault(fieldDef: FieldDefinition, sqlType: SQLDataType) {\n return !(\n getReferenceKind(fieldDef) === 'tenantId' &&\n sqlType === 'UUID' &&\n fieldDef.default === ''\n );\n}\n\nfunction createBaseColumns(registered: {\n config?: { idType?: 'uuid' | 'text' };\n}): Record<string, ColumnDefinition> {\n return {\n id: {\n type: registered.config?.idType === 'text' ? 'TEXT' : 'UUID',\n primaryKey: true,\n referenceKind: 'id',\n },\n slug: { type: 'TEXT', notNull: true },\n context: { type: 'TEXT' },\n created_at: { type: 'TIMESTAMP' },\n updated_at: { type: 'TIMESTAMP' },\n };\n}\n\n/**\n * Get cached schema definition for a registered class\n *\n * @param name - Name of the registered class\n * @returns Schema definition or undefined if not found\n * @example\n * ```typescript\n * const schema = getSchema('Product');\n * console.log(schema.tableName); // 'products'\n * console.log(schema.ddl); // 'CREATE TABLE...'\n * ```\n */\nexport function getSchema(name: string): SchemaDefinition | undefined {\n // Issue #951: Use findClass for multi-strategy lookup\n const registered = findClass(name);\n return registered?.schema;\n}\n\n/**\n * Get SQL DDL statement for a registered class\n *\n * @param name - Name of the registered class\n * Cached manifest DDL contains abstract types and is not safe to execute on\n * PostgreSQL. New executable paths must pass a target engine. Omitting it is\n * retained for backward compatibility with consumers that only inspect the\n * legacy engine-neutral manifest string.\n *\n * @param engine - Database engine that will execute the DDL\n * @returns Engine-specific SQL DDL, or the legacy cached DDL when omitted\n * @example\n * ```typescript\n * const ddl = ObjectRegistry.getSchemaDDL('Product', 'postgres');\n * await db.query(ddl);\n * ```\n */\nexport function getSchemaDDL(\n name: string,\n engine?: DatabaseEngine,\n): string | undefined {\n const schema = getSchema(name);\n if (!schema) return undefined;\n if (engine && Object.keys(schema.columns).length === 0) {\n throw new Error(\n `Cannot materialize schema '${name}' for ${engine}: the manifest has no structured columns`,\n );\n }\n return engine\n ? getDDLStrategy(engine).generateCreateTable(schema)\n : schema.ddl;\n}\n\n/**\n * Get table name for a registered class\n *\n * @param name - Name of the registered class\n * @returns Table name or undefined if not found\n * @example\n * ```typescript\n * const tableName = getTableName('Product');\n * console.log(tableName); // 'products'\n * ```\n */\nexport function getTableName(name: string): string | undefined {\n // Check if this is a collection class - collections have their own tableName mapping\n const collectionTableName = getCollectionTableNames().get(name);\n if (collectionTableName) {\n return collectionTableName;\n }\n\n // For STI classes, return the STI base class's table name.\n // R5-canon: `getSTIBase` returns the qualified name; resolve `name`\n // (which may be simple) to its registration's qualified form for the\n // comparison.\n const stiBase = ObjectRegistry.getSTIBase(name);\n const registered = ObjectRegistry.getClass(name);\n const qualifiedName = registered?.qualifiedName ?? registered?.name ?? name;\n if (stiBase && stiBase !== qualifiedName) {\n return getSchema(stiBase)?.tableName;\n }\n return getSchema(name)?.tableName;\n}\n\nfunction withConflictIndex(\n tableName: string,\n columns: Record<string, ColumnDefinition>,\n indexes: IndexDefinition[],\n conflictColumns: string[],\n): IndexDefinition[] {\n if (\n conflictColumns.length === 0 ||\n !conflictColumns.every((column) => columns[column])\n ) {\n return indexes;\n }\n\n const hasConflictIndex = indexes.some(\n (index) =>\n index.unique === true &&\n !index.where &&\n !index.jsonPath &&\n index.columns.length === conflictColumns.length &&\n index.columns.every((column) => conflictColumns.includes(column)),\n );\n if (hasConflictIndex) return indexes;\n\n const nameColumns =\n conflictColumns.length > 2 ? conflictColumns.slice(0, 2) : conflictColumns;\n const preferredName = `${tableName}_${nameColumns.join('_')}_idx`;\n const name = indexes.some((index) => index.name === preferredName)\n ? `${preferredName}_unique`\n : preferredName;\n return [\n ...indexes,\n {\n name,\n columns: conflictColumns,\n unique: true,\n },\n ];\n}\n\n/**\n * Get all pre-generated schemas for explicit adapter bootstrap paths.\n *\n * Returns schemas in SDK SchemaProvider format for all registered classes.\n * Tooling and test helpers can pass these to `getDatabase()` when they want\n * to bootstrap schema before runtime. Core runtime no longer does this\n * implicitly.\n *\n * @returns Record of table names to schema definitions\n * @example\n * ```typescript\n * const schemas = ObjectRegistry.getAllSchemas('json');\n * const db = await getDatabase({ type: 'json', url: './data', schemas });\n * ```\n */\nexport function getAllSchemas(\n engine?: DatabaseEngine,\n): Record<string, { tableName: string; ddl: string; indexes?: string[] }> {\n // Step 1: Collect all schemas grouped by tableName\n // For STI, multiple classes may share the same table\n const tableSchemas: Record<\n string,\n {\n tableName: string;\n columns: Record<string, ColumnDefinition>;\n indexes: IndexDefinition[];\n ddl: string;\n isSTI: boolean;\n conflictColumns: string[];\n }\n > = {};\n\n for (const [_className, registered] of getClasses()) {\n // Skip collection classes - they don't have their own tables\n // Their schemas incorrectly contain collection properties (loaded, options, etc.)\n if (\n isCollectionRegistration(\n _className,\n registered,\n collectionRegistrationLookup,\n )\n ) {\n continue;\n }\n\n // Issue #951: Use simple name for STI comparisons (map key may be qualified)\n const simpleName = registered.name || _className;\n\n // Issue #703: Handle STI subclasses with null tableName from external manifests\n // When loaded from external manifests, tableName may be null, causing\n // registerFromManifest() to derive a tableName from class name.\n // For STI subclasses, we need to use the STI base's tableName instead.\n if (!registered.schema?.tableName && registered.extends) {\n // R5-canon: use the qualified key for STI lookups so colliding\n // simple names don't resolve to the wrong package's class.\n // `getTableStrategy` / `getSTIBase` both accept qualified names\n // via `findClass`'s multi-strategy lookup.\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n // Ensure we have a schema object to modify\n if (!registered.schema) {\n registered.schema = {\n tableName: '',\n ddl: '',\n columns: {},\n indexes: [],\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: '',\n };\n }\n // Set tableName from STI base so the following block processes this class\n registered.schema.tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n }\n\n if (registered.schema?.tableName) {\n // For STI subclasses, use the STI base class's tableName\n // This ensures all STI subclass columns are merged into the parent table\n // (Issue #693: STI subclasses with separate tableName still serialize to parent table)\n let tableName = registered.schema.tableName;\n // R5-canon: same qualified-key strategy as the block above.\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n // This is an STI subclass - use the base class's tableName\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n\n // Start with manifest columns, then backfill any columns that only exist\n // in runtime field metadata (for example tenantScoped injections). We do\n // not replace existing manifest column metadata here, because the manifest\n // is authoritative for foreign keys, defaults, and other schema details.\n // Explicit decorator sqlType overrides are patched onto the merged column.\n const columnsToUse = mergeRuntimeFieldColumns(\n simpleName,\n registered.schema.columns,\n registered.fields,\n );\n\n if (!tableSchemas[tableName]) {\n // First class for this table - initialize with base columns\n // These are required for all tables but are skipped by fieldsToColumns()\n const baseColumns = createBaseColumns(registered);\n\n // For STI tables, add discriminator and data columns\n // (Issue #690: db:diff needs these columns to detect schema changes)\n const isSTI = tableStrategy === 'sti';\n if (isSTI) {\n baseColumns._meta_type = {\n type: 'TEXT',\n notNull: true,\n defaultValue: '',\n };\n baseColumns._meta_data = { type: 'JSON' };\n }\n\n tableSchemas[tableName] = {\n tableName,\n columns: { ...baseColumns, ...columnsToUse },\n indexes: [],\n ddl: registered.schema.ddl || '',\n isSTI,\n conflictColumns: ObjectRegistry.getConflictColumns(\n isSTI\n ? ObjectRegistry.getSTIBase(lookupKey) || lookupKey\n : lookupKey,\n ),\n };\n } else {\n // Additional class sharing this table (STI scenario)\n // Merge columns from this class into the existing schema\n for (const [colName, colDef] of Object.entries(columnsToUse)) {\n if (!tableSchemas[tableName].columns[colName]) {\n // New column from this subtype - add it\n tableSchemas[tableName].columns[colName] = colDef;\n }\n }\n }\n\n // Merge indexes (avoid duplicates by name)\n if (registered.schema.indexes && registered.schema.indexes.length > 0) {\n const existingNames = new Set(\n tableSchemas[tableName].indexes.map((idx) =>\n typeof idx === 'string' ? idx : idx.name,\n ),\n );\n for (const idx of registered.schema.indexes) {\n const indexName = typeof idx === 'string' ? idx : idx.name;\n if (!existingNames.has(indexName)) {\n if (typeof idx === 'string') {\n // Legacy string format - skip, can't merge properly\n } else {\n tableSchemas[tableName].indexes.push(idx);\n existingNames.add(idx.name);\n }\n }\n }\n }\n }\n }\n\n // Step 2: Convert to output format, regenerating DDL for merged schemas\n const schemas: Record<\n string,\n { tableName: string; ddl: string; indexes?: string[] }\n > = {};\n\n for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {\n const engineIndexes = engine\n ? withConflictIndex(\n tableName,\n tableSchema.columns,\n tableSchema.indexes,\n tableSchema.conflictColumns,\n )\n : tableSchema.indexes;\n const mergedSchema: SchemaDefinition = {\n tableName,\n ddl: tableSchema.ddl,\n columns: tableSchema.columns,\n indexes: engineIndexes,\n triggers: [],\n foreignKeys: [],\n version: '',\n dependencies: [],\n };\n\n // Generate DDL from merged columns (or use original DDL if columns are empty)\n let ddl: string;\n if (Object.keys(tableSchema.columns).length === 0 && tableSchema.ddl) {\n if (engine) {\n throw new Error(\n `Cannot materialize schema '${tableName}' for ${engine}: the manifest has no structured columns`,\n );\n }\n // Preserve legacy inspection of cached engine-neutral DDL. Executable\n // target-engine paths fail above rather than returning unsafe SQL.\n ddl = tableSchema.ddl;\n } else if (Object.keys(tableSchema.columns).length === 0) {\n // Skip schemas with no columns and no original DDL\n continue;\n } else if (engine) {\n // Target-engine materialization must route the complete structured\n // schema through its strategy. In particular, DuckDB/JSON require\n // UNIQUE constraints inline for ON CONFLICT, and every strategy owns\n // CHECK/default/index-expression rendering.\n ddl = getDDLStrategy(engine).generateCreateTable(mergedSchema);\n } else {\n ddl = generateDDLFromColumns(\n tableName,\n tableSchema.columns,\n tableSchema.isSTI,\n );\n }\n\n // Convert index definitions to SQL strings for SDK compatibility\n let indexSQL: string[] | undefined;\n if (engineIndexes.length > 0) {\n indexSQL = engine\n ? getDDLStrategy(engine).generateIndexes(mergedSchema)\n : engineIndexes.map((idx) => {\n const indexType = idx.unique ? 'UNIQUE INDEX' : 'INDEX';\n const columnList = idx.columns\n .map((col) => quoteIdentifier(col))\n .join(', ');\n return `CREATE ${indexType} IF NOT EXISTS ${quoteIdentifier(\n idx.name,\n )} ON ${quoteIdentifier(tableName)} (${columnList});`;\n });\n }\n\n schemas[tableName] = {\n tableName,\n ddl,\n indexes: indexSQL,\n };\n }\n\n return schemas;\n}\n\n/**\n * Get all registered schemas as SchemaDefinition objects\n *\n * Similar to getAllSchemas(), but returns SchemaDefinition format suitable\n * for use with SchemaComparer (migrations/differ.ts).\n *\n * Key difference: Indexes are kept as IndexDefinition objects instead of\n * being converted to SQL strings.\n *\n * @returns Map of tableName to SchemaDefinition\n */\nexport function getAllSchemasAsDefinitions(): Record<string, SchemaDefinition> {\n // Step 1: Collect all schemas grouped by tableName\n // For STI, multiple classes may share the same table\n const tableSchemas: Record<\n string,\n {\n tableName: string;\n columns: Record<string, ColumnDefinition>;\n indexes: IndexDefinition[];\n isSTI: boolean;\n conflictColumns: string[];\n }\n > = {};\n\n for (const [_className, registered] of getClasses()) {\n // Skip collection classes - they don't have their own tables\n if (\n isCollectionRegistration(\n _className,\n registered,\n collectionRegistrationLookup,\n )\n ) {\n continue;\n }\n\n // Issue #951: Use simple name for STI comparisons (map key may be qualified)\n const simpleName = registered.name || _className;\n\n // Handle STI subclasses with null tableName from external manifests\n if (!registered.schema?.tableName && registered.extends) {\n // R5-canon: use the qualified key for STI lookups so colliding\n // simple names don't resolve to the wrong package's class.\n // `getTableStrategy` / `getSTIBase` both accept qualified names\n // via `findClass`'s multi-strategy lookup.\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n if (!registered.schema) {\n registered.schema = {\n tableName: '',\n ddl: '',\n columns: {},\n indexes: [],\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: '',\n };\n }\n registered.schema.tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n }\n\n if (registered.schema?.tableName) {\n // For STI subclasses, use the STI base class's tableName.\n // R5-canon: qualified-key lookup so a colliding simple name in\n // another package can't yield the wrong tableStrategy / STI base\n // and move this class's columns under that other package's table.\n let tableName = registered.schema.tableName;\n const qualifiedName = registered.qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n\n // Manifest schema remains authoritative for existing columns. Runtime\n // field metadata can backfill missing columns and apply explicit sqlType\n // overrides without erasing richer manifest metadata.\n const columnsToUse = mergeRuntimeFieldColumns(\n simpleName,\n registered.schema.columns,\n registered.fields,\n );\n\n if (!tableSchemas[tableName]) {\n // First class for this table - initialize with base columns\n const baseColumns = createBaseColumns(registered);\n\n const isSTI = tableStrategy === 'sti';\n if (isSTI) {\n baseColumns._meta_type = {\n type: 'TEXT',\n notNull: true,\n defaultValue: '',\n };\n baseColumns._meta_data = { type: 'JSON' };\n }\n\n tableSchemas[tableName] = {\n tableName,\n columns: { ...baseColumns, ...columnsToUse },\n indexes: [],\n isSTI,\n conflictColumns: ObjectRegistry.getConflictColumns(\n isSTI\n ? ObjectRegistry.getSTIBase(lookupKey) || lookupKey\n : lookupKey,\n ),\n };\n } else {\n // Additional class sharing this table (STI scenario) - merge columns\n for (const [colName, colDef] of Object.entries(columnsToUse)) {\n if (!tableSchemas[tableName].columns[colName]) {\n tableSchemas[tableName].columns[colName] = colDef;\n }\n }\n }\n\n // Merge indexes (avoid duplicates by name)\n if (registered.schema.indexes && registered.schema.indexes.length > 0) {\n const existingNames = new Set(\n tableSchemas[tableName].indexes.map((idx) => idx.name),\n );\n for (const idx of registered.schema.indexes) {\n if (!existingNames.has(idx.name)) {\n tableSchemas[tableName].indexes.push(idx);\n existingNames.add(idx.name);\n }\n }\n }\n }\n }\n\n // Step 2: Convert to SchemaDefinition format\n const schemas: Record<string, SchemaDefinition> = {};\n\n for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {\n if (Object.keys(tableSchema.columns).length === 0) {\n continue;\n }\n\n // Generate DDL from columns\n const ddl = generateDDLFromColumns(\n tableName,\n tableSchema.columns,\n tableSchema.isSTI,\n );\n\n schemas[tableName] = {\n tableName,\n ddl,\n columns: tableSchema.columns,\n indexes: withConflictIndex(\n tableName,\n tableSchema.columns,\n tableSchema.indexes,\n tableSchema.conflictColumns,\n ),\n triggers: [],\n foreignKeys: [],\n version: '',\n dependencies: [],\n };\n }\n\n return schemas;\n}\n\n/**\n * Generate DDL CREATE TABLE statement from columns\n *\n * Used internally by getAllSchemas() to regenerate DDL after merging\n * columns from multiple STI subtypes that share the same table.\n *\n * @param tableName - Name of the table\n * @param columns - Column definitions\n * @returns DDL CREATE TABLE statement\n */\nexport function generateDDLFromColumns(\n tableName: string,\n columns: Record<string, ColumnDefinition>,\n isSTI = false,\n engine?: DatabaseEngine,\n): string {\n let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (\\n`;\n\n const columnLines: string[] = [];\n for (const [columnName, columnDef] of Object.entries(columns)) {\n const parts: string[] = [];\n\n // Column name and type\n const strategy = engine ? getDDLStrategy(engine) : undefined;\n const columnType = strategy\n ? strategy.mapType(columnDef.type)\n : columnDef.type;\n parts.push(` ${quoteIdentifier(columnName)} ${columnType}`);\n\n // Primary key\n if (columnDef.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n\n // Not null constraint\n if (columnDef.notNull) {\n parts.push('NOT NULL');\n }\n\n // Unique constraint (skip if primary key already implies uniqueness)\n if (columnDef.unique && !columnDef.primaryKey) {\n parts.push('UNIQUE');\n }\n\n // Default value\n if (columnDef.defaultValue !== undefined) {\n const defaultSQL = strategy\n ? strategy.formatDefaultValue(columnDef.defaultValue, columnDef.type)\n : formatDefaultValue(columnDef.defaultValue, columnDef.type);\n parts.push(`DEFAULT ${defaultSQL}`);\n }\n\n columnLines.push(parts.join(' '));\n }\n\n sql += columnLines.join(',\\n');\n\n // Add UNIQUE constraint for UPSERT operations\n // For STI tables: UNIQUE(slug, context, _meta_type) - different types can have same slug+context\n // For non-STI tables: UNIQUE(slug, context)\n if (columns.slug && columns.context) {\n if (isSTI && columns._meta_type) {\n sql += ',\\n UNIQUE(slug, context, _meta_type)';\n } else {\n sql += ',\\n UNIQUE(slug, context)';\n }\n }\n\n sql += '\\n);';\n\n return sql;\n}\n\n/**\n * Format default value for SQL DDL.\n *\n * Thin wrapper over the shared, injection-safe formatter\n * (`schema/sql-identifiers.ts`) so the registry schema-builder uses the same\n * rules as the DDL strategies and schema generator: an allowlist of SQL\n * keyword/function defaults (not \"contains `(`\"), type-driven literal quoting,\n * and no folding of a literal string `\"null\"` into the SQL NULL keyword.\n *\n * @param value - Default value\n * @param type - Column SQL type\n * @returns Formatted SQL default value\n */\nexport function formatDefaultValue(value: unknown, type: string): string {\n return formatDefaultValueShared(value, type);\n}\n\n/**\n * Convert a Map of field definitions to column definitions\n *\n * Used by getAllSchemas() to generate columns from fields when a class\n * has no pre-generated schema (e.g., STI subclasses registered from manifest).\n *\n * @param fields - Map of field name to field definition\n * @returns Record of column name to column definition\n * @private\n */\nexport function fieldsToColumns(\n fields: Map<string, FieldDefinition>,\n): Record<string, ColumnDefinition> {\n const columns: Record<string, ColumnDefinition> = {};\n\n for (const [fieldName, fieldDef] of fields) {\n // Skip id, timestamps - they're on the base table\n if (\n fieldName === 'id' ||\n fieldName === 'created_at' ||\n fieldName === 'updated_at' ||\n fieldName === 'slug' ||\n fieldName === 'context'\n ) {\n continue;\n }\n\n // Skip transient fields (non-persisted)\n if (fieldDef.transient || fieldDef._meta?.transient) {\n continue;\n }\n\n // Skip relationship fields that don't create columns\n // oneToMany and manyToMany are relationship metadata, not actual database columns\n if (fieldDef.type === 'oneToMany' || fieldDef.type === 'manyToMany') {\n continue;\n }\n\n // Skip meta fields - they're stored in _meta_data JSONB column\n if (fieldDef.type === 'meta') {\n continue;\n }\n\n // Map field type to SQL type\n const sqlType =\n fieldDef._meta?.sqlType ||\n (fieldDef.type === 'crossPackageRef' &&\n (fieldDef._meta?.idType === 'text' ||\n (fieldDef as unknown as { idType?: string }).idType === 'text')\n ? 'TEXT'\n : mapFieldTypeToSQL(fieldDef.type));\n const normalizedSqlType = String(sqlType).toUpperCase() as SQLDataType;\n const referenceKind = getReferenceKind(fieldDef);\n\n const column: ColumnDefinition = {\n type: normalizedSqlType,\n referenceKind,\n notNull: fieldDef._meta?.nullable ? false : fieldDef.required || false,\n unique: fieldDef._meta?.unique || false,\n description: fieldDef.description,\n };\n\n // Handle default values\n if (\n fieldDef.default !== undefined &&\n shouldEmitDefault(fieldDef, normalizedSqlType)\n ) {\n column.defaultValue = fieldDef.default;\n }\n\n // Handle foreign keys\n if (fieldDef.type === 'foreignKey' && fieldDef.related) {\n const [table, columnName = 'id'] = fieldDef.related.split('.');\n const fieldMeta = fieldDef._meta as\n | {\n onDelete?: ForeignKeyAction;\n onUpdate?: ForeignKeyAction;\n }\n | undefined;\n column.foreignKey = {\n table: classnameToTablename(table),\n column: columnName,\n onDelete: fieldMeta?.onDelete ?? 'CASCADE',\n onUpdate: fieldMeta?.onUpdate ?? 'CASCADE',\n };\n }\n\n // Use snake_case for column names\n columns[toSnakeCase(fieldName)] = column;\n }\n\n return columns;\n}\n\n/**\n * Map field type to SQL data type\n * @private\n */\nexport function mapFieldTypeToSQL(\n fieldType: FieldDefinition['type'],\n): SQLDataType {\n switch (fieldType) {\n case 'text':\n return 'TEXT';\n case 'integer':\n return 'INTEGER';\n case 'decimal':\n return 'REAL';\n case 'boolean':\n return 'BOOLEAN';\n case 'datetime':\n return 'TIMESTAMP';\n case 'json':\n return 'JSON';\n case 'foreignKey':\n return 'UUID';\n case 'crossPackageRef':\n return 'UUID';\n default:\n return 'TEXT';\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAgCA,IAAM,+BAA6D;CACjE;CACA,qBAAqB,aAAa,cAChC,eAAe,kBAAkB,aAAa,SAAS;CACzD,sBAAsB,cACpB,eAAe,oBAAoB,SAAS;AAChD;AAEA,SAAS,+BACP,WACA,SACkC;CAClC,MAAM,aAAa,eAAe,mBAAmB,SAAS;CAC9D,IAAI,CAAC,WAAW,MACd,OAAO;CAGT,KAAK,MAAM,CAAC,WAAW,YAAY,YAAY;EAC7C,IAAI,CAAC,SAAS,SACZ;EAGF,MAAM,aAAa,YAAY,SAAS;EACxC,MAAM,WAAW,QAAQ;EACzB,IAAI,CAAC,UACH;EAGF,MAAM,gBAAgB,iBAAiB,OAA0B;EACjE,QAAQ,cAAc;GACpB,GAAG;GACH,MAAM,OAAO,QAAQ,OAAO,CAAC,CAAC,YAAY;GAC1C,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;EAC3C;CACF;CAEA,OAAO;AACT;AAEA,SAAS,yBACP,WACA,eACA,QACkC;CAClC,MAAM,eAAe,EAAE,GAAI,iBAAiB,CAAC,EAAG;CAEhD,IAAI,OAAO,OAAO,GAAG;EACnB,MAAM,eAAe,gBAAgB,MAAM;EAC3C,KAAK,MAAM,CAAC,YAAY,cAAc,OAAO,QAAQ,YAAY,GAC/D,IAAI,CAAC,aAAa,aAChB,aAAa,cAAc;EAI/B,KAAK,MAAM,CAAC,WAAW,aAAa,QAAQ;GAC1C,MAAM,aAAa,YAAY,SAAS;GACxC,MAAM,WAAW,aAAa;GAC9B,IAAI,CAAC,UACH;GAGF,MAAM,UACJ,SAAS,OAAO,WACf,SAA6C;GAChD,MAAM,gBAAgB,iBAAiB,QAAQ;GAC/C,aAAa,cAAc;IACzB,GAAG;IACH,GAAI,UACA,EAAE,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,EAAiB,IACrD,CAAC;IACL,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;GAC3C;EACF;CACF;CAEA,+BAA+B,WAAW,YAAY;CACtD,OAAO;AACT;AAEA,SAAS,iBACP,UAC+C;CAC/C,IAEI,SAGA,WAAW,mBACb,SAAS,OAAO,WAAW,iBAE3B,OAAO;CAGT,IAAI,SAAS,SAAS,cACpB,OAAO;CAGT,IAAI,SAAS,SAAS,mBACpB,OAAO;AAIX;AAEA,SAAS,kBAAkB,UAA2B,SAAsB;CAC1E,OAAO,EACL,iBAAiB,QAAQ,MAAM,cAC/B,YAAY,UACZ,SAAS,YAAY;AAEzB;AAEA,SAAS,kBAAkB,YAEU;CACnC,OAAO;EACL,IAAI;GACF,MAAM,WAAW,QAAQ,WAAW,SAAS,SAAS;GACtD,YAAY;GACZ,eAAe;EACjB;EACA,MAAM;GAAE,MAAM;GAAQ,SAAS;EAAK;EACpC,SAAS,EAAE,MAAM,OAAO;EACxB,YAAY,EAAE,MAAM,YAAY;EAChC,YAAY,EAAE,MAAM,YAAY;CAClC;AACF;;;;;;;;;;;;;AAcA,SAAgB,UAAU,MAA4C;CAGpE,OADmB,UAAU,IACtB,CAAA,EAAY;AACrB;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,aACd,MACA,QACoB;CACpB,MAAM,SAAS,UAAU,IAAI;CAC7B,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,IAAI,UAAU,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,WAAW,GACnD,MAAM,IAAI,MACR,8BAA8B,KAAK,QAAQ,OAAO,yCACpD;CAEF,OAAO,SACH,eAAe,MAAM,CAAC,CAAC,oBAAoB,MAAM,IACjD,OAAO;AACb;;;;;;;;;;;;AAaA,SAAgB,aAAa,MAAkC;CAE7D,MAAM,sBAAsB,wBAAwB,CAAC,CAAC,IAAI,IAAI;CAC9D,IAAI,qBACF,OAAO;CAOT,MAAM,UAAU,eAAe,WAAW,IAAI;CAC9C,MAAM,aAAa,eAAe,SAAS,IAAI;CAC/C,MAAM,gBAAgB,YAAY,iBAAiB,YAAY,QAAQ;CACvE,IAAI,WAAW,YAAY,eACzB,OAAO,UAAU,OAAO,CAAC,EAAE;CAE7B,OAAO,UAAU,IAAI,CAAC,EAAE;AAC1B;AAEA,SAAS,kBACP,WACA,SACA,SACA,iBACmB;CACnB,IACE,gBAAgB,WAAW,KAC3B,CAAC,gBAAgB,OAAO,WAAW,QAAQ,OAAO,GAElD,OAAO;CAWT,IARyB,QAAQ,MAC9B,UACC,MAAM,WAAW,QACjB,CAAC,MAAM,SACP,CAAC,MAAM,YACP,MAAM,QAAQ,WAAW,gBAAgB,UACzC,MAAM,QAAQ,OAAO,WAAW,gBAAgB,SAAS,MAAM,CAAC,CAEhE,GAAkB,OAAO;CAI7B,MAAM,gBAAgB,GAAG,UAAU,IADjC,gBAAgB,SAAS,IAAI,gBAAgB,MAAM,GAAG,CAAC,IAAI,gBAAA,CACX,KAAK,GAAG,EAAE;CAC5D,MAAM,OAAO,QAAQ,MAAM,UAAU,MAAM,SAAS,aAAa,IAC7D,GAAG,cAAc,WACjB;CACJ,OAAO,CACL,GAAG,SACH;EACE;EACA,SAAS;EACT,QAAQ;CACV,CACF;AACF;;;;;;;;;;;;;;;;AAiBA,SAAgB,cACd,QACwE;CAGxE,MAAM,eAUF,CAAC;CAEL,KAAK,MAAM,CAAC,YAAY,eAAe,WAAW,GAAG;EAGnD,IACE,yBACE,YACA,YACA,4BACF,GAEA;EAIF,MAAM,aAAa,WAAW,QAAQ;EAMtC,IAAI,CAAC,WAAW,QAAQ,aAAa,WAAW,SAAS;GAKvD,MAAM,gBAAgB,WAAW,iBAAiB;GAClD,MAAM,YAAY;GAElB,IADsB,eAAe,iBAAiB,SAClD,MAAkB,OAAO;IAC3B,MAAM,cAAc,eAAe,WAAW,SAAS;IACvD,IAAI,eAAe,gBAAgB,eAAe;KAChD,MAAM,eAAe,UAAU,WAAW;KAC1C,IAAI,cAAc,QAAQ,WAAW;MAEnC,IAAI,CAAC,WAAW,QACd,WAAW,SAAS;OAClB,WAAW;OACX,KAAK;OACL,SAAS,CAAC;OACV,SAAS,CAAC;OACV,UAAU,CAAC;OACX,aAAa,CAAC;OACd,cAAc,CAAC;OACf,SAAS;MACX;MAGF,WAAW,OAAO,YAAY,aAAa,OAAO;KACpD;IACF;GACF;EACF;EAEA,IAAI,WAAW,QAAQ,WAAW;GAIhC,IAAI,YAAY,WAAW,OAAO;GAElC,MAAM,gBAAgB,WAAW,iBAAiB;GAClD,MAAM,YAAY;GAClB,MAAM,gBAAgB,eAAe,iBAAiB,SAAS;GAC/D,IAAI,kBAAkB,OAAO;IAC3B,MAAM,cAAc,eAAe,WAAW,SAAS;IACvD,IAAI,eAAe,gBAAgB,eAAe;KAEhD,MAAM,eAAe,UAAU,WAAW;KAC1C,IAAI,cAAc,QAAQ,WACxB,YAAY,aAAa,OAAO;IAEpC;GACF;GAOA,MAAM,eAAe,yBACnB,YACA,WAAW,OAAO,SAClB,WAAW,MACb;GAEA,IAAI,CAAC,aAAa,YAAY;IAG5B,MAAM,cAAc,kBAAkB,UAAU;IAIhD,MAAM,QAAQ,kBAAkB;IAChC,IAAI,OAAO;KACT,YAAY,aAAa;MACvB,MAAM;MACN,SAAS;MACT,cAAc;KAChB;KACA,YAAY,aAAa,EAAE,MAAM,OAAO;IAC1C;IAEA,aAAa,aAAa;KACxB;KACA,SAAS;MAAE,GAAG;MAAa,GAAG;KAAa;KAC3C,SAAS,CAAC;KACV,KAAK,WAAW,OAAO,OAAO;KAC9B;KACA,iBAAiB,eAAe,mBAC9B,QACI,eAAe,WAAW,SAAS,KAAK,YACxC,SACN;IACF;GACF,OAGE,KAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,YAAY,GACzD,IAAI,CAAC,aAAa,UAAU,CAAC,QAAQ,UAEnC,aAAa,UAAU,CAAC,QAAQ,WAAW;GAMjD,IAAI,WAAW,OAAO,WAAW,WAAW,OAAO,QAAQ,SAAS,GAAG;IACrE,MAAM,gBAAgB,IAAI,IACxB,aAAa,UAAU,CAAC,QAAQ,KAAK,QACnC,OAAO,QAAQ,WAAW,MAAM,IAAI,IACtC,CACF;IACA,KAAK,MAAM,OAAO,WAAW,OAAO,SAAS;KAC3C,MAAM,YAAY,OAAO,QAAQ,WAAW,MAAM,IAAI;KACtD,IAAI,CAAC,cAAc,IAAI,SAAS,GAC9B,IAAI,OAAO,QAAQ,UAAU,CAE7B,OAAO;MACL,aAAa,UAAU,CAAC,QAAQ,KAAK,GAAG;MACxC,cAAc,IAAI,IAAI,IAAI;KAC5B;IAEJ;GACF;EACF;CACF;CAGA,MAAM,UAGF,CAAC;CAEL,KAAK,MAAM,CAAC,WAAW,gBAAgB,OAAO,QAAQ,YAAY,GAAG;EACnE,MAAM,gBAAgB,SAClB,kBACE,WACA,YAAY,SACZ,YAAY,SACZ,YAAY,eACd,IACA,YAAY;EAChB,MAAM,eAAiC;GACrC;GACA,KAAK,YAAY;GACjB,SAAS,YAAY;GACrB,SAAS;GACT,UAAU,CAAC;GACX,aAAa,CAAC;GACd,SAAS;GACT,cAAc,CAAC;EACjB;EAGA,IAAI;EACJ,IAAI,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,WAAW,KAAK,YAAY,KAAK;GACpE,IAAI,QACF,MAAM,IAAI,MACR,8BAA8B,UAAU,QAAQ,OAAO,yCACzD;GAIF,MAAM,YAAY;EACpB,OAAO,IAAI,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,WAAW,GAErD;OACK,IAAI,QAKT,MAAM,eAAe,MAAM,CAAC,CAAC,oBAAoB,YAAY;OAE7D,MAAM,uBACJ,WACA,YAAY,SACZ,YAAY,KACd;EAIF,IAAI;EACJ,IAAI,cAAc,SAAS,GACzB,WAAW,SACP,eAAe,MAAM,CAAC,CAAC,gBAAgB,YAAY,IACnD,cAAc,KAAK,QAAQ;GACzB,MAAM,YAAY,IAAI,SAAS,iBAAiB;GAChD,MAAM,aAAa,IAAI,QACpB,KAAK,QAAQ,gBAAgB,GAAG,CAAC,CAAC,CAClC,KAAK,IAAI;GACZ,OAAO,UAAU,UAAU,iBAAiB,gBAC1C,IAAI,IACN,EAAE,MAAM,gBAAgB,SAAS,EAAE,IAAI,WAAW;EACpD,CAAC;EAGP,QAAQ,aAAa;GACnB;GACA;GACA,SAAS;EACX;CACF;CAEA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,6BAA+D;CAG7E,MAAM,eASF,CAAC;CAEL,KAAK,MAAM,CAAC,YAAY,eAAe,WAAW,GAAG;EAEnD,IACE,yBACE,YACA,YACA,4BACF,GAEA;EAIF,MAAM,aAAa,WAAW,QAAQ;EAGtC,IAAI,CAAC,WAAW,QAAQ,aAAa,WAAW,SAAS;GAKvD,MAAM,gBAAgB,WAAW,iBAAiB;GAClD,MAAM,YAAY;GAElB,IADsB,eAAe,iBAAiB,SAClD,MAAkB,OAAO;IAC3B,MAAM,cAAc,eAAe,WAAW,SAAS;IACvD,IAAI,eAAe,gBAAgB,eAAe;KAChD,MAAM,eAAe,UAAU,WAAW;KAC1C,IAAI,cAAc,QAAQ,WAAW;MACnC,IAAI,CAAC,WAAW,QACd,WAAW,SAAS;OAClB,WAAW;OACX,KAAK;OACL,SAAS,CAAC;OACV,SAAS,CAAC;OACV,UAAU,CAAC;OACX,aAAa,CAAC;OACd,cAAc,CAAC;OACf,SAAS;MACX;MAEF,WAAW,OAAO,YAAY,aAAa,OAAO;KACpD;IACF;GACF;EACF;EAEA,IAAI,WAAW,QAAQ,WAAW;GAKhC,IAAI,YAAY,WAAW,OAAO;GAClC,MAAM,gBAAgB,WAAW,iBAAiB;GAClD,MAAM,YAAY;GAClB,MAAM,gBAAgB,eAAe,iBAAiB,SAAS;GAC/D,IAAI,kBAAkB,OAAO;IAC3B,MAAM,cAAc,eAAe,WAAW,SAAS;IACvD,IAAI,eAAe,gBAAgB,eAAe;KAChD,MAAM,eAAe,UAAU,WAAW;KAC1C,IAAI,cAAc,QAAQ,WACxB,YAAY,aAAa,OAAO;IAEpC;GACF;GAKA,MAAM,eAAe,yBACnB,YACA,WAAW,OAAO,SAClB,WAAW,MACb;GAEA,IAAI,CAAC,aAAa,YAAY;IAE5B,MAAM,cAAc,kBAAkB,UAAU;IAEhD,MAAM,QAAQ,kBAAkB;IAChC,IAAI,OAAO;KACT,YAAY,aAAa;MACvB,MAAM;MACN,SAAS;MACT,cAAc;KAChB;KACA,YAAY,aAAa,EAAE,MAAM,OAAO;IAC1C;IAEA,aAAa,aAAa;KACxB;KACA,SAAS;MAAE,GAAG;MAAa,GAAG;KAAa;KAC3C,SAAS,CAAC;KACV;KACA,iBAAiB,eAAe,mBAC9B,QACI,eAAe,WAAW,SAAS,KAAK,YACxC,SACN;IACF;GACF,OAEE,KAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,YAAY,GACzD,IAAI,CAAC,aAAa,UAAU,CAAC,QAAQ,UACnC,aAAa,UAAU,CAAC,QAAQ,WAAW;GAMjD,IAAI,WAAW,OAAO,WAAW,WAAW,OAAO,QAAQ,SAAS,GAAG;IACrE,MAAM,gBAAgB,IAAI,IACxB,aAAa,UAAU,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CACvD;IACA,KAAK,MAAM,OAAO,WAAW,OAAO,SAClC,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,GAAG;KAChC,aAAa,UAAU,CAAC,QAAQ,KAAK,GAAG;KACxC,cAAc,IAAI,IAAI,IAAI;IAC5B;GAEJ;EACF;CACF;CAGA,MAAM,UAA4C,CAAC;CAEnD,KAAK,MAAM,CAAC,WAAW,gBAAgB,OAAO,QAAQ,YAAY,GAAG;EACnE,IAAI,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,WAAW,GAC9C;EAUF,QAAQ,aAAa;GACnB;GACA,KARU,uBACV,WACA,YAAY,SACZ,YAAY,KAKZ;GACA,SAAS,YAAY;GACrB,SAAS,kBACP,WACA,YAAY,SACZ,YAAY,SACZ,YAAY,eACd;GACA,UAAU,CAAC;GACX,aAAa,CAAC;GACd,SAAS;GACT,cAAc,CAAC;EACjB;CACF;CAEA,OAAO;AACT;;;;;;;;;;;AAYA,SAAgB,uBACd,WACA,SACA,QAAQ,OACR,QACQ;CACR,IAAI,MAAM,8BAA8B,gBAAgB,SAAS,EAAE;CAEnE,MAAM,cAAwB,CAAC;CAC/B,KAAK,MAAM,CAAC,YAAY,cAAc,OAAO,QAAQ,OAAO,GAAG;EAC7D,MAAM,QAAkB,CAAC;EAGzB,MAAM,WAAW,SAAS,eAAe,MAAM,IAAI,KAAA;EACnD,MAAM,aAAa,WACf,SAAS,QAAQ,UAAU,IAAI,IAC/B,UAAU;EACd,MAAM,KAAK,KAAK,gBAAgB,UAAU,EAAE,GAAG,YAAY;EAG3D,IAAI,UAAU,YACZ,MAAM,KAAK,aAAa;EAI1B,IAAI,UAAU,SACZ,MAAM,KAAK,UAAU;EAIvB,IAAI,UAAU,UAAU,CAAC,UAAU,YACjC,MAAM,KAAK,QAAQ;EAIrB,IAAI,UAAU,iBAAiB,KAAA,GAAW;GACxC,MAAM,aAAa,WACf,SAAS,mBAAmB,UAAU,cAAc,UAAU,IAAI,IAClE,mBAAmB,UAAU,cAAc,UAAU,IAAI;GAC7D,MAAM,KAAK,WAAW,YAAY;EACpC;EAEA,YAAY,KAAK,MAAM,KAAK,GAAG,CAAC;CAClC;CAEA,OAAO,YAAY,KAAK,KAAK;CAK7B,IAAI,QAAQ,QAAQ,QAAQ,SAC1B,IAAI,SAAS,QAAQ,YACnB,OAAO;MAEP,OAAO;CAIX,OAAO;CAEP,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAgB,mBAAmB,OAAgB,MAAsB;CACvE,OAAO,qBAAyB,OAAO,IAAI;AAC7C;;;;;;;;;;;AAYA,SAAgB,gBACd,QACkC;CAClC,MAAM,UAA4C,CAAC;CAEnD,KAAK,MAAM,CAAC,WAAW,aAAa,QAAQ;EAE1C,IACE,cAAc,QACd,cAAc,gBACd,cAAc,gBACd,cAAc,UACd,cAAc,WAEd;EAIF,IAAI,SAAS,aAAa,SAAS,OAAO,WACxC;EAKF,IAAI,SAAS,SAAS,eAAe,SAAS,SAAS,cACrD;EAIF,IAAI,SAAS,SAAS,QACpB;EAIF,MAAM,UACJ,SAAS,OAAO,YACf,SAAS,SAAS,sBAClB,SAAS,OAAO,WAAW,UACzB,SAA4C,WAAW,UACtD,SACA,kBAAkB,SAAS,IAAI;EACrC,MAAM,oBAAoB,OAAO,OAAO,CAAC,CAAC,YAAY;EAGtD,MAAM,SAA2B;GAC/B,MAAM;GACN,eAJoB,iBAAiB,QAIrC;GACA,SAAS,SAAS,OAAO,WAAW,QAAQ,SAAS,YAAY;GACjE,QAAQ,SAAS,OAAO,UAAU;GAClC,aAAa,SAAS;EACxB;EAGA,IACE,SAAS,YAAY,KAAA,KACrB,kBAAkB,UAAU,iBAAiB,GAE7C,OAAO,eAAe,SAAS;EAIjC,IAAI,SAAS,SAAS,gBAAgB,SAAS,SAAS;GACtD,MAAM,CAAC,OAAO,aAAa,QAAQ,SAAS,QAAQ,MAAM,GAAG;GAC7D,MAAM,YAAY,SAAS;GAM3B,OAAO,aAAa;IAClB,OAAO,qBAAqB,KAAK;IACjC,QAAQ;IACR,UAAU,WAAW,YAAY;IACjC,UAAU,WAAW,YAAY;GACnC;EACF;EAGA,QAAQ,YAAY,SAAS,KAAK;CACpC;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,kBACd,WACa;CACb,QAAQ,WAAR;EACE,KAAK,QACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,mBACH,OAAO;EACT,SACE,OAAO;CACX;AACF"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { SmrtObject } from './object';
|
|
|
7
7
|
import { RegistryDiagnostic } from './registry/diagnostics';
|
|
8
8
|
import { RegisteredClass, RegisteredField, RelationshipMetadata, SmartObjectConfig, SmrtObjectConstructor, ValidatorFunction } from './registry/types';
|
|
9
9
|
import { MethodDefinition, QualifiedClassName, SmartObjectDefinition, SmartObjectManifest, SmrtVisibility, ValidationRule } from './scanner/types.js';
|
|
10
|
+
import { DatabaseEngine } from './schema/ddl/types.js';
|
|
10
11
|
import { SchemaDefinition } from './schema/types.js';
|
|
11
12
|
export { isSmrtCollectionExtendsName, SMRT_COLLECTION_BASE_NAMES, } from './registry/collection-resolution';
|
|
12
13
|
export type { RelationshipMetadata, RelationshipType, SmartObjectConfig, } from './registry/types';
|
|
@@ -708,7 +709,7 @@ export declare class ObjectRegistry {
|
|
|
708
709
|
/**
|
|
709
710
|
* Get SQL DDL statement for a registered class
|
|
710
711
|
*/
|
|
711
|
-
static getSchemaDDL(name: string): string | undefined;
|
|
712
|
+
static getSchemaDDL(name: string, engine?: DatabaseEngine): string | undefined;
|
|
712
713
|
/**
|
|
713
714
|
* Get table name for a registered class
|
|
714
715
|
*/
|
|
@@ -716,7 +717,7 @@ export declare class ObjectRegistry {
|
|
|
716
717
|
/**
|
|
717
718
|
* Get all pre-generated schemas for passing to database adapters
|
|
718
719
|
*/
|
|
719
|
-
static getAllSchemas(): Record<string, {
|
|
720
|
+
static getAllSchemas(engine?: DatabaseEngine): Record<string, {
|
|
720
721
|
tableName: string;
|
|
721
722
|
ddl: string;
|
|
722
723
|
indexes?: string[];
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.js
CHANGED
|
@@ -1176,8 +1176,8 @@ var ObjectRegistry = class ObjectRegistry {
|
|
|
1176
1176
|
/**
|
|
1177
1177
|
* Get SQL DDL statement for a registered class
|
|
1178
1178
|
*/
|
|
1179
|
-
static getSchemaDDL(name) {
|
|
1180
|
-
return getSchemaDDL(name);
|
|
1179
|
+
static getSchemaDDL(name, engine) {
|
|
1180
|
+
return getSchemaDDL(name, engine);
|
|
1181
1181
|
}
|
|
1182
1182
|
/**
|
|
1183
1183
|
* Get table name for a registered class
|
|
@@ -1188,8 +1188,8 @@ var ObjectRegistry = class ObjectRegistry {
|
|
|
1188
1188
|
/**
|
|
1189
1189
|
* Get all pre-generated schemas for passing to database adapters
|
|
1190
1190
|
*/
|
|
1191
|
-
static getAllSchemas() {
|
|
1192
|
-
return getAllSchemas();
|
|
1191
|
+
static getAllSchemas(engine) {
|
|
1192
|
+
return getAllSchemas(engine);
|
|
1193
1193
|
}
|
|
1194
1194
|
/**
|
|
1195
1195
|
* Get all registered schemas as SchemaDefinition objects
|