@happyvertical/smrt-core 0.40.14 → 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.
Files changed (92) hide show
  1. package/README.md +85 -11
  2. package/dist/browser.js +2 -2
  3. package/dist/change-feed.d.ts.map +1 -1
  4. package/dist/change-feed.js +21 -4
  5. package/dist/change-feed.js.map +1 -1
  6. package/dist/class.d.ts.map +1 -1
  7. package/dist/class.js +5 -3
  8. package/dist/class.js.map +1 -1
  9. package/dist/dispatch/bus.d.ts.map +1 -1
  10. package/dist/dispatch/bus.js +11 -6
  11. package/dist/dispatch/bus.js.map +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/manifest/static-manifest.js +2 -2
  14. package/dist/manifest/static-manifest.js.map +1 -1
  15. package/dist/manifest/store.js +1 -1
  16. package/dist/manifest/test-manifest-stub.d.ts.map +1 -1
  17. package/dist/manifest/test-manifest-stub.js +132 -2
  18. package/dist/manifest/test-manifest-stub.js.map +1 -1
  19. package/dist/manifest.json +2 -2
  20. package/dist/migrations/backfill-tracker.d.ts +1 -0
  21. package/dist/migrations/backfill-tracker.d.ts.map +1 -1
  22. package/dist/migrations/backfill-tracker.js +9 -3
  23. package/dist/migrations/backfill-tracker.js.map +1 -1
  24. package/dist/migrations/differ.d.ts +18 -0
  25. package/dist/migrations/differ.d.ts.map +1 -1
  26. package/dist/migrations/differ.js +28 -5
  27. package/dist/migrations/differ.js.map +1 -1
  28. package/dist/migrations/generator.d.ts +8 -0
  29. package/dist/migrations/generator.d.ts.map +1 -1
  30. package/dist/migrations/generator.js +5 -1
  31. package/dist/migrations/generator.js.map +1 -1
  32. package/dist/migrations/orchestrate.d.ts +10 -0
  33. package/dist/migrations/orchestrate.d.ts.map +1 -1
  34. package/dist/migrations/orchestrate.js +8 -2
  35. package/dist/migrations/orchestrate.js.map +1 -1
  36. package/dist/migrations/tracker.d.ts.map +1 -1
  37. package/dist/migrations/tracker.js +4 -2
  38. package/dist/migrations/tracker.js.map +1 -1
  39. package/dist/registry/schema-builder.d.ts +13 -6
  40. package/dist/registry/schema-builder.d.ts.map +1 -1
  41. package/dist/registry/schema-builder.js +54 -15
  42. package/dist/registry/schema-builder.js.map +1 -1
  43. package/dist/registry.d.ts +3 -2
  44. package/dist/registry.d.ts.map +1 -1
  45. package/dist/registry.js +4 -4
  46. package/dist/registry.js.map +1 -1
  47. package/dist/schema/code-generator.js +123 -0
  48. package/dist/schema/code-generator.js.map +1 -0
  49. package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
  50. package/dist/schema/ddl/base-strategy.js +2 -2
  51. package/dist/schema/ddl/base-strategy.js.map +1 -1
  52. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
  53. package/dist/schema/ddl/duckdb-strategy.js +2 -3
  54. package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
  55. package/dist/schema/ddl/index.js +26 -2
  56. package/dist/schema/ddl/index.js.map +1 -1
  57. package/dist/schema/ddl/materialize-manifest.d.ts +36 -0
  58. package/dist/schema/ddl/materialize-manifest.d.ts.map +1 -0
  59. package/dist/schema/ddl/materialize-manifest.js +361 -0
  60. package/dist/schema/ddl/materialize-manifest.js.map +1 -0
  61. package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -1
  62. package/dist/schema/ddl/postgres-strategy.js +1 -1
  63. package/dist/schema/ddl/postgres-strategy.js.map +1 -1
  64. package/dist/schema/index.js +12 -0
  65. package/dist/schema/override-system.js +205 -0
  66. package/dist/schema/override-system.js.map +1 -0
  67. package/dist/schema/schema-aggregator.d.ts.map +1 -1
  68. package/dist/schema/schema-aggregator.js +261 -0
  69. package/dist/schema/schema-aggregator.js.map +1 -0
  70. package/dist/schema/schema-manager.js +11 -1
  71. package/dist/schema/schema-manager.js.map +1 -1
  72. package/dist/schema/utils.d.ts +1 -0
  73. package/dist/schema/utils.d.ts.map +1 -1
  74. package/dist/schema/utils.js +2 -1
  75. package/dist/schema/utils.js.map +1 -1
  76. package/dist/schema.d.ts +2 -0
  77. package/dist/schema.d.ts.map +1 -0
  78. package/dist/schema.js +13 -0
  79. package/dist/smrt-knowledge.json +5 -4
  80. package/dist/system/compatibility.d.ts +25 -0
  81. package/dist/system/compatibility.d.ts.map +1 -1
  82. package/dist/system/compatibility.js +61 -1
  83. package/dist/system/compatibility.js.map +1 -1
  84. package/dist/system/index.js +2 -2
  85. package/dist/system/schema.d.ts +17 -9
  86. package/dist/system/schema.d.ts.map +1 -1
  87. package/dist/system/schema.js +25 -11
  88. package/dist/system/schema.js.map +1 -1
  89. package/dist/testing/database.d.ts.map +1 -1
  90. package/dist/testing/database.js +5 -2
  91. package/dist/testing/database.js.map +1 -1
  92. 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
- * @returns SQL DDL statement or undefined if not found
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
- return getSchema(name)?.ddl;
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) ddl = tableSchema.ddl;
224
- else if (Object.keys(tableSchema.columns).length === 0) continue;
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 (tableSchema.indexes.length > 0) indexSQL = tableSchema.indexes.map((idx) => {
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
- parts.push(` ${quoteIdentifier(columnName)} ${columnDef.type}`);
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"}
@@ -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[];
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EACL,cAAc,EAEd,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAUhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAS3C,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,wBAAwB,CAAC;AA8DhC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAiB5E,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAmC1B;;;;;;GAMG;AACH,UAAU,qBAAsB,SAAQ,YAAY;IAClD,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AAEH,KAAK,qBAAqB,GAAG,KAAK,OAAO,EAAE,GAAG,KAAK,cAAc,CAAC,GAAG,CAAC,CAAC;AAEvE;;;GAGG;AACH,UAAU,kBAAkB;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,CAAC;CACH;AAED;;;GAGG;AACH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,UAAU,CAAC;IAC/B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACrC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAqHD;;;;;GAKG;AACH,qBAAa,cAAc;IACzB;;OAEG;IACH,OAAO,CAAC,MAAM,KAAK,OAAO,GAEzB;IAED;;OAEG;IACH,OAAO,CAAC,MAAM,KAAK,WAAW,GAE7B;IAED;;;OAGG;IACH,OAAO,CAAC,MAAM,KAAK,oBAAoB,GAEtC;IAED;;;OAGG;IACH,MAAM,CAAC,sBAAsB,CAC3B,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,IAAI;IAIP;;OAEG;IAEH,OAAO,CAAC,MAAM,KAAK,eAAe,GAEjC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWtD;;;OAGG;IACH,OAAO,CAAC,MAAM,KAAK,aAAa,GAE/B;IAED;;OAEG;IACH,OAAO,CAAC,MAAM,KAAK,QAAQ,GAE1B;IAED,OAAO,CAAC,MAAM,KAAK,QAAQ,QAE1B;IAED;;;;OAIG;IACH,OAAO,CAAC,MAAM,KAAK,eAAe,GAWjC;IAED;;;OAGG;IACH,OAAO,CAAC,MAAM,KAAK,iBAAiB,GAEnC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9D;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAIvC;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,sBAAsB,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,qBAAqB,GAC7B,IAAI;IAqBP;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,iBAAiB,CACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,qBAAqB,GAAG,SAAS;IAIpC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,kBAAkB,CACvB,SAAS,EAAE,MAAM,GAChB,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAIrC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKrD;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,OAAO,UAAU,EACvB,MAAM,GAAE,iBAAsB,GAC7B,IAAI;IAIP;;;;;;;;;OASG;IACH,MAAM,CAAC,kBAAkB,CACvB,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,qBAAqB,GAC3C,IAAI;IAGP,MAAM,CAAC,oBAAoB,CACzB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,qBAAqB,EAChC,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI;IAIP;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IASxB;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,qBAAqB,CAC1B,IAAI,EAAE,qBAAqB,GAC1B,eAAe,GAAG,SAAS;IAI9B;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,uBAAuB,CAC5B,aAAa,EAAE,MAAM,GACpB,eAAe,GAAG,SAAS;IAI9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,iBAAiB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,SAAS;IAI9B;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE;IAI9D;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB;IAIzD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,mBAAmB,CACxB,WAAW,EAAE,MAAM,GAClB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI/B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,sBAAsB,CAC3B,UAAU,EAAE,cAAc,GACzB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI/B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAIvD;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAIpD;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE;IAIhC;;;OAGG;IACH,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;IAIzC;;;;;;;;;;OAUG;WACU,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwJ5E;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG;QAC/D,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IA0FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,MAAM,CAAC,uBAAuB,CAC5B,aAAa,EAAE,MAAM,GAAG,GAAG,GAAG,mBAAmB,GAChD;QACD,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IA2GD;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAmCtC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,cAAc,IAAI,SAAS,kBAAkB,EAAE;IAItD,wDAAwD;IACxD,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAkBpB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAmB1D;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,8BAA8B,IAAI,IAAI;IAU7C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAuC5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;WACU,aAAa,CAAC,CAAC,SAAS,UAAU,EAC7C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAsG7B;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAM5D;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAU9D,MAAM,CAAC,iBAAiB,CACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GACnC,iBAAiB,EAAE;IAItB;;;;;;;;;;;;;;;;;OAiBG;WACU,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsMnE;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB;IAMjD;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI5D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIrD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIrD;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM,CAC5B,MAAM,EACN;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CACvD;IAID;;OAEG;IACH,MAAM,CAAC,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAGrE;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,SAAS;IAMnE;;;;;;;;;;OAUG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,GAAG,SAAS;IAMrE;;;;;;;;;;;OAWG;WACU,iBAAiB,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,EAAE,CAAC;IA6G7B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAIlD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;IAyDzC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAIhE;;;;;;;;;;OAUG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,EAAE;IAIlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAUvD;;;;;;;;;OASG;WACU,YAAY,CACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAQxC;;;;;;;;;;;;;OAaG;IAEH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC;;;;;;;;;;;;;;;;;;;OAmBG;WACU,aAAa,CACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAMzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAqBlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CG;IACH,MAAM,CAAC,oBAAoB,IAAI,cAAc,EAAE;IAc/C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,EAAE;IAezE;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAY5D;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,8BAA8B,CACnC,SAAS,EAAE,MAAM,GAChB,oBAAoB,EAAE;IAazB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;IAuBzD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAoCtD;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,qBAAqB,CAC1B,SAAS,EAAE,MAAM,GAChB,eAAe,CAAC,oBAAoB,CAAC,GAAG,SAAS;IAKpD;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA4CnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAsClD;;;;;;;;;;;;;;;;;;OAkBG;WACU,iBAAiB,CAC5B,EAAE,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,GACjD,OAAO,CAAC,IAAI,CAAC;IAoChB;;;;;;;;;;;;;;;;;OAiBG;WACU,gBAAgB,CAC3B,EAAE,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,GACjD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAWrC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,kBAAkB,CACvB,SAAS,EAAE,MAAM,GAChB,oBAAoB,GAAG,SAAS;IAInC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIhD;;;;;;;;;OASG;IACH,MAAM,CAAC,mBAAmB,IAAI,MAAM,EAAE;IAItC;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,yBAAyB,IAAI,sBAAsB;IAI1D;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,sBAAsB,CAC3B,SAAS,EAAE,MAAM,GAChB,uBAAuB,GAAG,SAAS;IAItC;;;;;;;;OAQG;IACH,MAAM,CAAC,4BAA4B,CACjC,SAAS,EAAE,MAAM,GAChB,qBAAqB,GAAG,SAAS;CAGrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,wBAAgB,IAAI,CAAC,MAAM,GAAE,iBAAsB,IAMzC,CAAC,SAAS,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,EACvD,MAAM,CAAC,EACP,mBAAmB,qBAAqB,CAAC,CAAC,CAAC,KAC1C,CAAC,CAmML"}
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