arkormx 2.0.0-next.5 → 2.0.0-next.6

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/cli.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { createHash, randomUUID } from "node:crypto";
3
4
  import { dirname, extname, join, resolve } from "node:path";
4
5
  import { spawnSync } from "node:child_process";
5
6
  import { str } from "@h3ravel/support";
6
7
  import path, { dirname as dirname$1, extname as extname$1, join as join$1, relative } from "path";
7
8
  import { copyFileSync, existsSync as existsSync$1, mkdirSync as mkdirSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, rmSync as rmSync$1, writeFileSync as writeFileSync$1 } from "fs";
8
9
  import { AsyncLocalStorage } from "async_hooks";
9
- import { createHash } from "node:crypto";
10
10
  import { createJiti } from "@rexxars/jiti";
11
11
  import { pathToFileURL } from "node:url";
12
12
  import { createRequire } from "module";
@@ -55,6 +55,23 @@ var ArkormException = class extends Error {
55
55
  }
56
56
  };
57
57
 
58
+ //#endregion
59
+ //#region src/helpers/PrimaryKeyGenerationPlanner.ts
60
+ var PrimaryKeyGenerationPlanner = class {
61
+ static plan(column) {
62
+ if (!column.primary || column.default !== void 0) return void 0;
63
+ if (column.type === "uuid" || column.type === "string") return {
64
+ strategy: "uuid",
65
+ prismaDefault: "@default(uuid())",
66
+ databaseDefault: column.type === "uuid" ? "gen_random_uuid()" : "gen_random_uuid()::text",
67
+ runtimeFactory: "uuid"
68
+ };
69
+ }
70
+ static generate(generation) {
71
+ if (generation?.runtimeFactory === "uuid") return randomUUID();
72
+ }
73
+ };
74
+
58
75
  //#endregion
59
76
  //#region src/database/ForeignKeyBuilder.ts
60
77
  /**
@@ -248,6 +265,7 @@ var TableBuilder = class {
248
265
  column.primary = true;
249
266
  if (typeof config.autoIncrement === "boolean") column.autoIncrement = config.autoIncrement;
250
267
  if (Object.prototype.hasOwnProperty.call(config, "default")) column.default = config.default;
268
+ column.primaryKeyGeneration = PrimaryKeyGenerationPlanner.plan(column);
251
269
  return this;
252
270
  }
253
271
  /**
@@ -611,8 +629,11 @@ var TableBuilder = class {
611
629
  autoIncrement: options.autoIncrement,
612
630
  after: options.after,
613
631
  default: options.default,
614
- updatedAt: options.updatedAt
632
+ updatedAt: options.updatedAt,
633
+ primaryKeyGeneration: options.primaryKeyGeneration
615
634
  });
635
+ const column = this.columns[this.columns.length - 1];
636
+ column.primaryKeyGeneration = PrimaryKeyGenerationPlanner.plan(column);
616
637
  this.latestColumnName = name;
617
638
  return this;
618
639
  }
@@ -867,7 +888,7 @@ const buildFieldLine = (column) => {
867
888
  const primary = column.primary ? " @id" : "";
868
889
  const mapped = typeof column.map === "string" && column.map.trim().length > 0 ? ` @map("${column.map.replace(/"/g, "\\\"")}")` : "";
869
890
  const updatedAt = column.updatedAt ? " @updatedAt" : "";
870
- const defaultValue = column.type === "enum" ? formatEnumDefaultValue(column.default) : formatDefaultValue(column.default) ?? (column.type === "uuid" && column.primary ? "@default(uuid())" : void 0);
891
+ const defaultValue = column.type === "enum" ? formatEnumDefaultValue(column.default) : column.primaryKeyGeneration?.prismaDefault ?? formatDefaultValue(column.default);
871
892
  const defaultSuffix = defaultValue ? ` ${defaultValue}` : "";
872
893
  return ` ${column.name} ${scalar}${nullable}${primary}${unique}${defaultSuffix}${updatedAt}${mapped}`;
873
894
  };
@@ -1603,7 +1624,20 @@ const normalizePersistedTableMetadata = (table) => {
1603
1624
  const normalizedValues = normalizePersistedEnumValues(values);
1604
1625
  if (normalizedValues.length > 0) all[columnName] = normalizedValues;
1605
1626
  return all;
1606
- }, {})
1627
+ }, {}),
1628
+ primaryKeyGeneration: normalizePersistedPrimaryKeyGeneration(candidate.primaryKeyGeneration)
1629
+ };
1630
+ };
1631
+ const normalizePersistedPrimaryKeyGeneration = (value) => {
1632
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
1633
+ const candidate = value;
1634
+ if (candidate.strategy !== "uuid" || typeof candidate.column !== "string" || candidate.column.trim().length === 0) return void 0;
1635
+ return {
1636
+ column: candidate.column,
1637
+ strategy: "uuid",
1638
+ prismaDefault: typeof candidate.prismaDefault === "string" && candidate.prismaDefault.trim().length > 0 ? candidate.prismaDefault : void 0,
1639
+ databaseDefault: typeof candidate.databaseDefault === "string" && candidate.databaseDefault.trim().length > 0 ? candidate.databaseDefault : void 0,
1640
+ runtimeFactory: candidate.runtimeFactory === "uuid" ? "uuid" : void 0
1607
1641
  };
1608
1642
  };
1609
1643
  const normalizePersistedColumnMappingsState = (state) => {
@@ -1612,7 +1646,7 @@ const normalizePersistedColumnMappingsState = (state) => {
1612
1646
  tables: Object.entries(state?.tables ?? {}).reduce((all, [tableName, tableMetadata]) => {
1613
1647
  if (tableName.trim().length === 0) return all;
1614
1648
  const normalized = normalizePersistedTableMetadata(tableMetadata);
1615
- if (Object.keys(normalized.columns).length > 0 || Object.keys(normalized.enums).length > 0) all[tableName] = normalized;
1649
+ if (Object.keys(normalized.columns).length > 0 || Object.keys(normalized.enums).length > 0 || normalized.primaryKeyGeneration) all[tableName] = normalized;
1616
1650
  return all;
1617
1651
  }, {})
1618
1652
  };
@@ -1683,7 +1717,8 @@ const getPersistedTableMetadata = (table, options = {}) => {
1683
1717
  enums: Object.entries(metadata.enums).reduce((all, [columnName, values]) => {
1684
1718
  all[columnName] = [...values];
1685
1719
  return all;
1686
- }, {})
1720
+ }, {}),
1721
+ primaryKeyGeneration: metadata.primaryKeyGeneration ? { ...metadata.primaryKeyGeneration } : void 0
1687
1722
  };
1688
1723
  };
1689
1724
  const applyMappedColumn = (tableColumns, column, features, table) => {
@@ -1709,6 +1744,17 @@ const removePersistedColumnMetadata = (tableMetadata, columnName) => {
1709
1744
  Object.entries(tableMetadata.columns).forEach(([attribute, mappedColumn]) => {
1710
1745
  if (mappedColumn === columnName) delete tableMetadata.columns[attribute];
1711
1746
  });
1747
+ if (tableMetadata.primaryKeyGeneration?.column === columnName) delete tableMetadata.primaryKeyGeneration;
1748
+ };
1749
+ const applyPrimaryKeyGeneration = (tableMetadata, column) => {
1750
+ if (!column.primary || !column.primaryKeyGeneration) {
1751
+ if (tableMetadata.primaryKeyGeneration?.column === column.name) delete tableMetadata.primaryKeyGeneration;
1752
+ return;
1753
+ }
1754
+ tableMetadata.primaryKeyGeneration = {
1755
+ column: column.name,
1756
+ ...column.primaryKeyGeneration
1757
+ };
1712
1758
  };
1713
1759
  const applyOperationsToPersistedColumnMappingsState = (state, operations, features = resolvePersistedMetadataFeatures()) => {
1714
1760
  const nextTables = Object.entries(state.tables).reduce((all, [table, metadata]) => {
@@ -1717,7 +1763,8 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
1717
1763
  enums: Object.entries(metadata.enums).reduce((nextEnums, [columnName, values]) => {
1718
1764
  nextEnums[columnName] = [...values];
1719
1765
  return nextEnums;
1720
- }, {})
1766
+ }, {}),
1767
+ primaryKeyGeneration: metadata.primaryKeyGeneration ? { ...metadata.primaryKeyGeneration } : void 0
1721
1768
  };
1722
1769
  return all;
1723
1770
  }, {});
@@ -1730,8 +1777,9 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
1730
1777
  operation.columns.forEach((column) => {
1731
1778
  applyMappedColumn(tableMetadata.columns, column, features, operation.table);
1732
1779
  applyEnumColumn(tableMetadata.enums, column, features, operation.table);
1780
+ applyPrimaryKeyGeneration(tableMetadata, column);
1733
1781
  });
1734
- if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0) nextTables[operation.table] = tableMetadata;
1782
+ if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0 || tableMetadata.primaryKeyGeneration) nextTables[operation.table] = tableMetadata;
1735
1783
  else delete nextTables[operation.table];
1736
1784
  return;
1737
1785
  }
@@ -1743,11 +1791,12 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
1743
1791
  operation.addColumns.forEach((column) => {
1744
1792
  applyMappedColumn(tableMetadata.columns, column, features, operation.table);
1745
1793
  applyEnumColumn(tableMetadata.enums, column, features, operation.table);
1794
+ applyPrimaryKeyGeneration(tableMetadata, column);
1746
1795
  });
1747
1796
  operation.dropColumns.forEach((columnName) => {
1748
1797
  removePersistedColumnMetadata(tableMetadata, columnName);
1749
1798
  });
1750
- if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0) nextTables[operation.table] = tableMetadata;
1799
+ if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0 || tableMetadata.primaryKeyGeneration) nextTables[operation.table] = tableMetadata;
1751
1800
  else delete nextTables[operation.table];
1752
1801
  return;
1753
1802
  }
package/dist/index.cjs CHANGED
@@ -164,6 +164,7 @@ var KyselyDatabaseAdapter = class KyselyDatabaseAdapter {
164
164
  return "timestamptz";
165
165
  }
166
166
  resolveSchemaColumnDefault(column) {
167
+ if (column.primaryKeyGeneration?.databaseDefault) return column.primaryKeyGeneration.databaseDefault;
167
168
  const value = column.default ?? (column.updatedAt ? "now()" : void 0);
168
169
  if (value === void 0) return null;
169
170
  if (value === "now()") return "now()";
@@ -1147,6 +1148,23 @@ const getLatestAppliedMigrations = (state, steps) => {
1147
1148
  }).slice(0, Math.max(0, steps)).map((entry) => entry.migration);
1148
1149
  };
1149
1150
 
1151
+ //#endregion
1152
+ //#region src/helpers/PrimaryKeyGenerationPlanner.ts
1153
+ var PrimaryKeyGenerationPlanner = class {
1154
+ static plan(column) {
1155
+ if (!column.primary || column.default !== void 0) return void 0;
1156
+ if (column.type === "uuid" || column.type === "string") return {
1157
+ strategy: "uuid",
1158
+ prismaDefault: "@default(uuid())",
1159
+ databaseDefault: column.type === "uuid" ? "gen_random_uuid()" : "gen_random_uuid()::text",
1160
+ runtimeFactory: "uuid"
1161
+ };
1162
+ }
1163
+ static generate(generation) {
1164
+ if (generation?.runtimeFactory === "uuid") return (0, node_crypto.randomUUID)();
1165
+ }
1166
+ };
1167
+
1150
1168
  //#endregion
1151
1169
  //#region src/database/ForeignKeyBuilder.ts
1152
1170
  /**
@@ -1340,6 +1358,7 @@ var TableBuilder = class {
1340
1358
  column.primary = true;
1341
1359
  if (typeof config.autoIncrement === "boolean") column.autoIncrement = config.autoIncrement;
1342
1360
  if (Object.prototype.hasOwnProperty.call(config, "default")) column.default = config.default;
1361
+ column.primaryKeyGeneration = PrimaryKeyGenerationPlanner.plan(column);
1343
1362
  return this;
1344
1363
  }
1345
1364
  /**
@@ -1703,8 +1722,11 @@ var TableBuilder = class {
1703
1722
  autoIncrement: options.autoIncrement,
1704
1723
  after: options.after,
1705
1724
  default: options.default,
1706
- updatedAt: options.updatedAt
1725
+ updatedAt: options.updatedAt,
1726
+ primaryKeyGeneration: options.primaryKeyGeneration
1707
1727
  });
1728
+ const column = this.columns[this.columns.length - 1];
1729
+ column.primaryKeyGeneration = PrimaryKeyGenerationPlanner.plan(column);
1708
1730
  this.latestColumnName = name;
1709
1731
  return this;
1710
1732
  }
@@ -1959,7 +1981,7 @@ const buildFieldLine = (column) => {
1959
1981
  const primary = column.primary ? " @id" : "";
1960
1982
  const mapped = typeof column.map === "string" && column.map.trim().length > 0 ? ` @map("${column.map.replace(/"/g, "\\\"")}")` : "";
1961
1983
  const updatedAt = column.updatedAt ? " @updatedAt" : "";
1962
- const defaultValue = column.type === "enum" ? formatEnumDefaultValue(column.default) : formatDefaultValue(column.default) ?? (column.type === "uuid" && column.primary ? "@default(uuid())" : void 0);
1984
+ const defaultValue = column.type === "enum" ? formatEnumDefaultValue(column.default) : column.primaryKeyGeneration?.prismaDefault ?? formatDefaultValue(column.default);
1963
1985
  const defaultSuffix = defaultValue ? ` ${defaultValue}` : "";
1964
1986
  return ` ${column.name} ${scalar}${nullable}${primary}${unique}${defaultSuffix}${updatedAt}${mapped}`;
1965
1987
  };
@@ -2607,7 +2629,20 @@ const normalizePersistedTableMetadata = (table) => {
2607
2629
  const normalizedValues = normalizePersistedEnumValues(values);
2608
2630
  if (normalizedValues.length > 0) all[columnName] = normalizedValues;
2609
2631
  return all;
2610
- }, {})
2632
+ }, {}),
2633
+ primaryKeyGeneration: normalizePersistedPrimaryKeyGeneration(candidate.primaryKeyGeneration)
2634
+ };
2635
+ };
2636
+ const normalizePersistedPrimaryKeyGeneration = (value) => {
2637
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
2638
+ const candidate = value;
2639
+ if (candidate.strategy !== "uuid" || typeof candidate.column !== "string" || candidate.column.trim().length === 0) return void 0;
2640
+ return {
2641
+ column: candidate.column,
2642
+ strategy: "uuid",
2643
+ prismaDefault: typeof candidate.prismaDefault === "string" && candidate.prismaDefault.trim().length > 0 ? candidate.prismaDefault : void 0,
2644
+ databaseDefault: typeof candidate.databaseDefault === "string" && candidate.databaseDefault.trim().length > 0 ? candidate.databaseDefault : void 0,
2645
+ runtimeFactory: candidate.runtimeFactory === "uuid" ? "uuid" : void 0
2611
2646
  };
2612
2647
  };
2613
2648
  const normalizePersistedColumnMappingsState = (state) => {
@@ -2616,7 +2651,7 @@ const normalizePersistedColumnMappingsState = (state) => {
2616
2651
  tables: Object.entries(state?.tables ?? {}).reduce((all, [tableName, tableMetadata]) => {
2617
2652
  if (tableName.trim().length === 0) return all;
2618
2653
  const normalized = normalizePersistedTableMetadata(tableMetadata);
2619
- if (Object.keys(normalized.columns).length > 0 || Object.keys(normalized.enums).length > 0) all[tableName] = normalized;
2654
+ if (Object.keys(normalized.columns).length > 0 || Object.keys(normalized.enums).length > 0 || normalized.primaryKeyGeneration) all[tableName] = normalized;
2620
2655
  return all;
2621
2656
  }, {})
2622
2657
  };
@@ -2687,7 +2722,8 @@ const getPersistedTableMetadata = (table, options = {}) => {
2687
2722
  enums: Object.entries(metadata.enums).reduce((all, [columnName, values]) => {
2688
2723
  all[columnName] = [...values];
2689
2724
  return all;
2690
- }, {})
2725
+ }, {}),
2726
+ primaryKeyGeneration: metadata.primaryKeyGeneration ? { ...metadata.primaryKeyGeneration } : void 0
2691
2727
  };
2692
2728
  };
2693
2729
  const getPersistedColumnMap = (table, options = {}) => {
@@ -2696,6 +2732,9 @@ const getPersistedColumnMap = (table, options = {}) => {
2696
2732
  const getPersistedEnumMap = (table, options = {}) => {
2697
2733
  return getPersistedTableMetadata(table, options).enums;
2698
2734
  };
2735
+ const getPersistedPrimaryKeyGeneration = (table, options = {}) => {
2736
+ return getPersistedTableMetadata(table, options).primaryKeyGeneration;
2737
+ };
2699
2738
  const applyMappedColumn = (tableColumns, column, features, table) => {
2700
2739
  if (typeof column.map === "string" && column.map.trim().length > 0 && column.map !== column.name) {
2701
2740
  if (!features.persistedColumnMappings) throw buildPersistedFeatureDisabledError("persistedColumnMappings", table);
@@ -2719,6 +2758,17 @@ const removePersistedColumnMetadata = (tableMetadata, columnName) => {
2719
2758
  Object.entries(tableMetadata.columns).forEach(([attribute, mappedColumn]) => {
2720
2759
  if (mappedColumn === columnName) delete tableMetadata.columns[attribute];
2721
2760
  });
2761
+ if (tableMetadata.primaryKeyGeneration?.column === columnName) delete tableMetadata.primaryKeyGeneration;
2762
+ };
2763
+ const applyPrimaryKeyGeneration = (tableMetadata, column) => {
2764
+ if (!column.primary || !column.primaryKeyGeneration) {
2765
+ if (tableMetadata.primaryKeyGeneration?.column === column.name) delete tableMetadata.primaryKeyGeneration;
2766
+ return;
2767
+ }
2768
+ tableMetadata.primaryKeyGeneration = {
2769
+ column: column.name,
2770
+ ...column.primaryKeyGeneration
2771
+ };
2722
2772
  };
2723
2773
  const applyOperationsToPersistedColumnMappingsState = (state, operations, features = resolvePersistedMetadataFeatures()) => {
2724
2774
  const nextTables = Object.entries(state.tables).reduce((all, [table, metadata]) => {
@@ -2727,7 +2777,8 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
2727
2777
  enums: Object.entries(metadata.enums).reduce((nextEnums, [columnName, values]) => {
2728
2778
  nextEnums[columnName] = [...values];
2729
2779
  return nextEnums;
2730
- }, {})
2780
+ }, {}),
2781
+ primaryKeyGeneration: metadata.primaryKeyGeneration ? { ...metadata.primaryKeyGeneration } : void 0
2731
2782
  };
2732
2783
  return all;
2733
2784
  }, {});
@@ -2740,8 +2791,9 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
2740
2791
  operation.columns.forEach((column) => {
2741
2792
  applyMappedColumn(tableMetadata.columns, column, features, operation.table);
2742
2793
  applyEnumColumn(tableMetadata.enums, column, features, operation.table);
2794
+ applyPrimaryKeyGeneration(tableMetadata, column);
2743
2795
  });
2744
- if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0) nextTables[operation.table] = tableMetadata;
2796
+ if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0 || tableMetadata.primaryKeyGeneration) nextTables[operation.table] = tableMetadata;
2745
2797
  else delete nextTables[operation.table];
2746
2798
  return;
2747
2799
  }
@@ -2753,11 +2805,12 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
2753
2805
  operation.addColumns.forEach((column) => {
2754
2806
  applyMappedColumn(tableMetadata.columns, column, features, operation.table);
2755
2807
  applyEnumColumn(tableMetadata.enums, column, features, operation.table);
2808
+ applyPrimaryKeyGeneration(tableMetadata, column);
2756
2809
  });
2757
2810
  operation.dropColumns.forEach((columnName) => {
2758
2811
  removePersistedColumnMetadata(tableMetadata, columnName);
2759
2812
  });
2760
- if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0) nextTables[operation.table] = tableMetadata;
2813
+ if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0 || tableMetadata.primaryKeyGeneration) nextTables[operation.table] = tableMetadata;
2761
2814
  else delete nextTables[operation.table];
2762
2815
  return;
2763
2816
  }
@@ -7666,7 +7719,8 @@ var QueryBuilder = class QueryBuilder {
7666
7719
  * @returns
7667
7720
  */
7668
7721
  async create(data) {
7669
- const created = await this.executeInsertRow(data);
7722
+ const [payload] = this.normalizeInsertPayloads(data);
7723
+ const created = await this.executeInsertRow(payload);
7670
7724
  return this.model.hydrate(created);
7671
7725
  }
7672
7726
  /**
@@ -7677,7 +7731,8 @@ var QueryBuilder = class QueryBuilder {
7677
7731
  */
7678
7732
  async createMany(values) {
7679
7733
  if (values.length === 0) return [];
7680
- return await Promise.all(values.map(async (value) => await this.create(value)));
7734
+ const payloads = this.normalizeInsertPayloads(values);
7735
+ return await Promise.all(payloads.map(async (value) => await this.create(value)));
7681
7736
  }
7682
7737
  /**
7683
7738
  * Insert one or more records.
@@ -7941,8 +7996,17 @@ var QueryBuilder = class QueryBuilder {
7941
7996
  return !await this.exists();
7942
7997
  }
7943
7998
  normalizeInsertPayloads(values) {
7944
- if (Array.isArray(values)) return values;
7945
- return [values];
7999
+ const payloads = Array.isArray(values) ? values : [values];
8000
+ const metadata = this.model.getModelMetadata();
8001
+ return payloads.map((payload) => {
8002
+ const nextPayload = { ...payload };
8003
+ const primaryKeyValue = nextPayload[metadata.primaryKey];
8004
+ if (primaryKeyValue !== void 0 && primaryKeyValue !== null) return nextPayload;
8005
+ const generated = PrimaryKeyGenerationPlanner.generate(metadata.primaryKeyGeneration);
8006
+ if (generated === void 0) return nextPayload;
8007
+ nextPayload[metadata.primaryKey] = generated;
8008
+ return nextPayload;
8009
+ });
7946
8010
  }
7947
8011
  resolveAffectedCount(result, fallback) {
7948
8012
  if (typeof result === "number") return result;
@@ -8185,6 +8249,7 @@ var QueryBuilder = class QueryBuilder {
8185
8249
  modelName: this.model.name,
8186
8250
  table: metadata.table,
8187
8251
  primaryKey: metadata.primaryKey,
8252
+ primaryKeyGeneration: metadata.primaryKeyGeneration,
8188
8253
  columns: metadata.columns,
8189
8254
  softDelete: metadata.softDelete
8190
8255
  };
@@ -8997,10 +9062,10 @@ var Model = class Model {
8997
9062
  const adapter = this.getAdapter();
8998
9063
  const shouldStrictlyValidatePersistedMappings = Boolean(adapter) && !(adapter instanceof PrismaDatabaseAdapter);
8999
9064
  return {
9000
- ...getPersistedColumnMap(this.getTable(), {
9065
+ ...getPersistedTableMetadata(this.getTable(), {
9001
9066
  features: resolvePersistedMetadataFeatures(getUserConfig("features")),
9002
9067
  strict: shouldStrictlyValidatePersistedMappings
9003
- }),
9068
+ }).columns,
9004
9069
  ...this.columns
9005
9070
  };
9006
9071
  }
@@ -9008,11 +9073,26 @@ var Model = class Model {
9008
9073
  return this.getColumnMap()[attribute] ?? attribute;
9009
9074
  }
9010
9075
  static getModelMetadata() {
9076
+ const adapter = this.getAdapter();
9077
+ const shouldStrictlyValidatePersistedMappings = Boolean(adapter) && !(adapter instanceof PrismaDatabaseAdapter);
9078
+ const persistedMetadata = getPersistedTableMetadata(this.getTable(), {
9079
+ features: resolvePersistedMetadataFeatures(getUserConfig("features")),
9080
+ strict: shouldStrictlyValidatePersistedMappings
9081
+ });
9011
9082
  return {
9012
9083
  table: this.getTable(),
9013
9084
  primaryKey: this.getPrimaryKey(),
9014
- columns: this.getColumnMap(),
9015
- softDelete: this.getSoftDeleteConfig()
9085
+ columns: {
9086
+ ...persistedMetadata.columns,
9087
+ ...this.columns
9088
+ },
9089
+ softDelete: this.getSoftDeleteConfig(),
9090
+ primaryKeyGeneration: persistedMetadata.primaryKeyGeneration?.column === this.getPrimaryKey() ? {
9091
+ strategy: persistedMetadata.primaryKeyGeneration.strategy,
9092
+ prismaDefault: persistedMetadata.primaryKeyGeneration.prismaDefault,
9093
+ databaseDefault: persistedMetadata.primaryKeyGeneration.databaseDefault,
9094
+ runtimeFactory: persistedMetadata.primaryKeyGeneration.runtimeFactory
9095
+ } : void 0
9016
9096
  };
9017
9097
  }
9018
9098
  static getRelationMetadata(name) {
@@ -10043,6 +10123,7 @@ exports.PRISMA_ENUM_MEMBER_REGEX = PRISMA_ENUM_MEMBER_REGEX;
10043
10123
  exports.PRISMA_ENUM_REGEX = PRISMA_ENUM_REGEX;
10044
10124
  exports.PRISMA_MODEL_REGEX = PRISMA_MODEL_REGEX;
10045
10125
  exports.Paginator = Paginator;
10126
+ exports.PrimaryKeyGenerationPlanner = PrimaryKeyGenerationPlanner;
10046
10127
  exports.PrismaDatabaseAdapter = PrismaDatabaseAdapter;
10047
10128
  exports.QueryBuilder = QueryBuilder;
10048
10129
  exports.QueryConstraintException = QueryConstraintException;
@@ -10112,6 +10193,7 @@ exports.getMigrationPlan = getMigrationPlan;
10112
10193
  exports.getPersistedColumnMap = getPersistedColumnMap;
10113
10194
  exports.getPersistedEnumMap = getPersistedEnumMap;
10114
10195
  exports.getPersistedEnumTsType = getPersistedEnumTsType;
10196
+ exports.getPersistedPrimaryKeyGeneration = getPersistedPrimaryKeyGeneration;
10115
10197
  exports.getPersistedTableMetadata = getPersistedTableMetadata;
10116
10198
  exports.getRuntimeAdapter = getRuntimeAdapter;
10117
10199
  exports.getRuntimePaginationCurrentPageResolver = getRuntimePaginationCurrentPageResolver;
package/dist/index.d.cts CHANGED
@@ -5,6 +5,12 @@ import { Command } from "@h3ravel/musket";
5
5
 
6
6
  //#region src/types/migrations.d.ts
7
7
  type SchemaColumnType = 'id' | 'uuid' | 'enum' | 'string' | 'text' | 'integer' | 'bigInteger' | 'float' | 'boolean' | 'json' | 'date' | 'timestamp';
8
+ interface PrimaryKeyGeneration {
9
+ strategy: 'uuid';
10
+ prismaDefault?: string;
11
+ databaseDefault?: string;
12
+ runtimeFactory?: 'uuid';
13
+ }
8
14
  interface SchemaColumn {
9
15
  name: string;
10
16
  type: SchemaColumnType;
@@ -18,6 +24,7 @@ interface SchemaColumn {
18
24
  after?: string;
19
25
  default?: unknown;
20
26
  updatedAt?: boolean;
27
+ primaryKeyGeneration?: PrimaryKeyGeneration;
21
28
  }
22
29
  interface SchemaIndex {
23
30
  columns: string[];
@@ -325,6 +332,7 @@ interface ModelMetadata {
325
332
  primaryKey: string;
326
333
  columns: ColumnMap;
327
334
  softDelete: SoftDeleteConfig;
335
+ primaryKeyGeneration?: PrimaryKeyGeneration;
328
336
  }
329
337
  type RelationMetadataType = 'hasOne' | 'hasMany' | 'belongsTo' | 'belongsToMany' | 'hasOneThrough' | 'hasManyThrough' | 'morphOne' | 'morphMany' | 'morphToMany';
330
338
  interface BaseRelationMetadata {
@@ -2628,6 +2636,7 @@ interface QueryTarget<TModel = unknown> {
2628
2636
  modelName?: string;
2629
2637
  table?: string;
2630
2638
  primaryKey?: string;
2639
+ primaryKeyGeneration?: PrimaryKeyGeneration;
2631
2640
  columns?: Record<string, string>;
2632
2641
  softDelete?: SoftDeleteConfig;
2633
2642
  alias?: string;
@@ -4175,6 +4184,10 @@ interface PersistedMetadataFeatures {
4175
4184
  interface PersistedTableMetadata {
4176
4185
  columns: Record<string, string>;
4177
4186
  enums: Record<string, string[]>;
4187
+ primaryKeyGeneration?: PersistedPrimaryKeyGeneration;
4188
+ }
4189
+ interface PersistedPrimaryKeyGeneration extends PrimaryKeyGeneration {
4190
+ column: string;
4178
4191
  }
4179
4192
  interface PersistedColumnMappingsState {
4180
4193
  version: 1;
@@ -4205,6 +4218,12 @@ declare const getPersistedEnumMap: (table: string, options?: {
4205
4218
  features?: PersistedMetadataFeatures;
4206
4219
  strict?: boolean;
4207
4220
  }) => Record<string, string[]>;
4221
+ declare const getPersistedPrimaryKeyGeneration: (table: string, options?: {
4222
+ cwd?: string;
4223
+ configuredPath?: string;
4224
+ features?: PersistedMetadataFeatures;
4225
+ strict?: boolean;
4226
+ }) => PersistedPrimaryKeyGeneration | undefined;
4208
4227
  declare const applyOperationsToPersistedColumnMappingsState: (state: PersistedColumnMappingsState, operations: SchemaOperation[], features?: PersistedMetadataFeatures) => PersistedColumnMappingsState;
4209
4228
  declare const rebuildPersistedColumnMappingsState: (state: AppliedMigrationsState, availableMigrations: [MigrationClass, string][], features?: PersistedMetadataFeatures) => Promise<PersistedColumnMappingsState>;
4210
4229
  declare const syncPersistedColumnMappingsFromState: (cwd: string, state: AppliedMigrationsState, availableMigrations: [MigrationClass, string][], features?: PersistedMetadataFeatures) => Promise<void>;
@@ -4525,6 +4544,12 @@ declare const runMigrationWithPrisma: (migration: Migration | (new () => Migrati
4525
4544
  operations: SchemaOperation[];
4526
4545
  }>;
4527
4546
  //#endregion
4547
+ //#region src/helpers/PrimaryKeyGenerationPlanner.d.ts
4548
+ declare class PrimaryKeyGenerationPlanner {
4549
+ static plan(column: Pick<SchemaColumn, 'type' | 'primary' | 'default'>): PrimaryKeyGeneration | undefined;
4550
+ static generate(generation: PrimaryKeyGeneration | undefined): unknown;
4551
+ }
4552
+ //#endregion
4528
4553
  //#region src/helpers/runtime-config.d.ts
4529
4554
  /**
4530
4555
  * Define the ArkORM runtime configuration. This function can be used to provide.
@@ -4656,4 +4681,4 @@ declare class URLDriver {
4656
4681
  url(page: number): string;
4657
4682
  }
4658
4683
  //#endregion
4659
- export { AdapterBindableModel, AdapterCapabilities, AdapterCapability, AdapterModelFieldStructure, AdapterModelIntrospectionOptions, AdapterModelStructure, AdapterTransactionContext, AggregateOperation, AggregateSelection, AggregateSpec, AppliedMigrationEntry, AppliedMigrationRun, AppliedMigrationsState, ArkormBootContext, ArkormCollection, ArkormConfig, ArkormErrorContext, ArkormException, Attribute, AttributeCreateInput, AttributeOptions, AttributeOrderBy, AttributeSchemaDelegate, AttributeSelect, AttributeUpdateInput, AttributeWhereInput, BelongsToManyRelationMetadata, BelongsToRelationMetadata, CastDefinition, CastHandler, CastMap, CastType, CliApp, ClientResolver, ColumnMap, DatabaseAdapter, DatabasePrimitive, DatabaseRow, DatabaseRows, DatabaseValue, DelegateCreateData, DelegateFindManyArgs, DelegateForModelSchema, DelegateInclude, DelegateOrderBy, DelegateRow, DelegateRows, DelegateSelect, DelegateUniqueWhere, DelegateUpdateArgs, DelegateUpdateData, DelegateWhere, DeleteManySpec, DeleteSpec, EagerLoadConstraint, EagerLoadMap, EnumBuilder, FactoryAttributes, FactoryDefinition, FactoryModelConstructor, FactoryState, ForeignKeyBuilder, GenerateMigrationOptions, GeneratedMigrationFile, GetUserConfig, GlobalScope, HasManyRelationMetadata, HasManyThroughRelationMetadata, HasOneRelationMetadata, HasOneThroughRelationMetadata, InitCommand, InlineFactory, InsertManySpec, InsertSpec, KyselyDatabaseAdapter, LengthAwarePaginator, MIGRATION_BRAND, MakeFactoryCommand, MakeMigrationCommand, MakeModelCommand, MakeSeederCommand, MigrateCommand, MigrateFreshCommand, MigrateRollbackCommand, Migration, MigrationClass, MigrationHistoryCommand, MigrationInstanceLike, MissingDelegateException, Model, ModelAttributes, ModelAttributesOf, ModelCreateData, ModelEventDispatcher, ModelEventHandler, ModelEventHandlerConstructor, ModelEventListener, ModelEventName, ModelFactory, ModelLifecycleState, ModelMetadata, ModelNotFoundException, ModelStatic, ModelUpdateData, ModelsSyncCommand, MorphManyRelationMetadata, MorphOneRelationMetadata, MorphToManyRelationMetadata, PRISMA_ENUM_MEMBER_REGEX, PRISMA_ENUM_REGEX, PRISMA_MODEL_REGEX, PaginationCurrentPageResolver, PaginationMeta, PaginationOptions, PaginationURLDriver, PaginationURLDriverFactory, Paginator, PersistedColumnMappingsState, PersistedMetadataFeatures, PersistedTableMetadata, PrismaClientLike, PrismaDatabaseAdapter, PrismaDelegateLike, PrismaDelegateMap, PrismaDelegateNameMapping, PrismaFindManyArgsLike, PrismaLikeInclude, PrismaLikeOrderBy, PrismaLikeScalarFilter, PrismaLikeSelect, PrismaLikeSortOrder, PrismaLikeWhereInput, PrismaMigrationWorkflowOptions, PrismaSchemaSyncOptions, PrismaTransactionCallback, PrismaTransactionCapableClient, PrismaTransactionOptions, QueryBuilder, QueryComparisonCondition, QueryComparisonOperator, QueryCondition, QueryConstraintException, QueryGroupCondition, QueryLogicalOperator, QueryNotCondition, QueryOrderBy, QueryRawCondition, QuerySelectColumn, QueryTarget, RelatedModelClass, RelationAggregateSpec, RelationColumnLookupSpec, RelationConstraint, RelationDefaultResolver, RelationDefaultValue, RelationFilterSpec, RelationLoadPlan, RelationLoadSpec, RelationMetadata, RelationMetadataProvider, RelationMetadataType, RelationResolutionException, RelationTableLookupSpec, RelationshipModelStatic, RuntimeModuleLoader, SEEDER_BRAND, SchemaBuilder, SchemaColumn, SchemaColumnType, SchemaForeignKey, SchemaForeignKeyAction, SchemaIndex, SchemaOperation, SchemaTableAlterOperation, SchemaTableCreateOperation, SchemaTableDropOperation, ScopeNotDefinedException, SeedCommand, Seeder, SeederCallArgument, SeederConstructor, SeederInput, SelectSpec, Serializable, SimplePaginationMeta, SoftDeleteConfig, SoftDeleteQueryMode, SortDirection, TableBuilder, URLDriver, UniqueConstraintResolutionException, UnsupportedAdapterFeatureException, UpdateManySpec, UpdateSpec, UpsertSpec, applyAlterTableOperation, applyCreateTableOperation, applyDropTableOperation, applyMigrationRollbackToDatabase, applyMigrationRollbackToPrismaSchema, applyMigrationToDatabase, applyMigrationToPrismaSchema, applyOperationsToPersistedColumnMappingsState, applyOperationsToPrismaSchema, bindAdapterToModels, buildEnumBlock, buildFieldLine, buildIndexLine, buildInverseRelationLine, buildMigrationIdentity, buildMigrationRunId, buildMigrationSource, buildModelBlock, buildRelationLine, computeMigrationChecksum, configureArkormRuntime, createEmptyAppliedMigrationsState, createEmptyPersistedColumnMappingsState, createKyselyAdapter, createMigrationTimestamp, createPrismaAdapter, createPrismaCompatibilityAdapter, createPrismaDatabaseAdapter, createPrismaDelegateMap, defineConfig, defineFactory, deleteAppliedMigrationsStateFromStore, deletePersistedColumnMappingsState, deriveCollectionFieldName, deriveInverseRelationAlias, deriveRelationAlias, deriveRelationFieldName, deriveSingularFieldName, ensureArkormConfigLoading, escapeRegex, findAppliedMigration, findEnumBlock, findModelBlock, formatDefaultValue, formatEnumDefaultValue, formatRelationAction, generateMigrationFile, getActiveTransactionClient, getDefaultStubsPath, getLastMigrationRun, getLatestAppliedMigrations, getMigrationPlan, getPersistedColumnMap, getPersistedEnumMap, getPersistedEnumTsType, getPersistedTableMetadata, getRuntimeAdapter, getRuntimePaginationCurrentPageResolver, getRuntimePaginationURLDriverFactory, getRuntimePrismaClient, getUserConfig, inferDelegateName, isDelegateLike, isMigrationApplied, isTransactionCapableClient, loadArkormConfig, markMigrationApplied, markMigrationRun, pad, readAppliedMigrationsState, readAppliedMigrationsStateFromStore, readPersistedColumnMappingsState, rebuildPersistedColumnMappingsState, removeAppliedMigration, resetArkormRuntimeForTests, resetPersistedColumnMappingsCache, resolveCast, resolveColumnMappingsFilePath, resolveEnumName, resolveMigrationClassName, resolveMigrationStateFilePath, resolvePersistedMetadataFeatures, resolvePrismaType, runArkormTransaction, runMigrationWithPrisma, runPrismaCommand, stripPrismaSchemaModelsAndEnums, supportsDatabaseMigrationExecution, supportsDatabaseMigrationState, supportsDatabaseReset, syncPersistedColumnMappingsFromState, toMigrationFileSlug, toModelName, validatePersistedMetadataFeaturesForMigrations, writeAppliedMigrationsState, writeAppliedMigrationsStateToStore, writePersistedColumnMappingsState };
4684
+ export { AdapterBindableModel, AdapterCapabilities, AdapterCapability, AdapterModelFieldStructure, AdapterModelIntrospectionOptions, AdapterModelStructure, AdapterTransactionContext, AggregateOperation, AggregateSelection, AggregateSpec, AppliedMigrationEntry, AppliedMigrationRun, AppliedMigrationsState, ArkormBootContext, ArkormCollection, ArkormConfig, ArkormErrorContext, ArkormException, Attribute, AttributeCreateInput, AttributeOptions, AttributeOrderBy, AttributeSchemaDelegate, AttributeSelect, AttributeUpdateInput, AttributeWhereInput, BelongsToManyRelationMetadata, BelongsToRelationMetadata, CastDefinition, CastHandler, CastMap, CastType, CliApp, ClientResolver, ColumnMap, DatabaseAdapter, DatabasePrimitive, DatabaseRow, DatabaseRows, DatabaseValue, DelegateCreateData, DelegateFindManyArgs, DelegateForModelSchema, DelegateInclude, DelegateOrderBy, DelegateRow, DelegateRows, DelegateSelect, DelegateUniqueWhere, DelegateUpdateArgs, DelegateUpdateData, DelegateWhere, DeleteManySpec, DeleteSpec, EagerLoadConstraint, EagerLoadMap, EnumBuilder, FactoryAttributes, FactoryDefinition, FactoryModelConstructor, FactoryState, ForeignKeyBuilder, GenerateMigrationOptions, GeneratedMigrationFile, GetUserConfig, GlobalScope, HasManyRelationMetadata, HasManyThroughRelationMetadata, HasOneRelationMetadata, HasOneThroughRelationMetadata, InitCommand, InlineFactory, InsertManySpec, InsertSpec, KyselyDatabaseAdapter, LengthAwarePaginator, MIGRATION_BRAND, MakeFactoryCommand, MakeMigrationCommand, MakeModelCommand, MakeSeederCommand, MigrateCommand, MigrateFreshCommand, MigrateRollbackCommand, Migration, MigrationClass, MigrationHistoryCommand, MigrationInstanceLike, MissingDelegateException, Model, ModelAttributes, ModelAttributesOf, ModelCreateData, ModelEventDispatcher, ModelEventHandler, ModelEventHandlerConstructor, ModelEventListener, ModelEventName, ModelFactory, ModelLifecycleState, ModelMetadata, ModelNotFoundException, ModelStatic, ModelUpdateData, ModelsSyncCommand, MorphManyRelationMetadata, MorphOneRelationMetadata, MorphToManyRelationMetadata, PRISMA_ENUM_MEMBER_REGEX, PRISMA_ENUM_REGEX, PRISMA_MODEL_REGEX, PaginationCurrentPageResolver, PaginationMeta, PaginationOptions, PaginationURLDriver, PaginationURLDriverFactory, Paginator, PersistedColumnMappingsState, PersistedMetadataFeatures, PersistedPrimaryKeyGeneration, PersistedTableMetadata, PrimaryKeyGeneration, PrimaryKeyGenerationPlanner, PrismaClientLike, PrismaDatabaseAdapter, PrismaDelegateLike, PrismaDelegateMap, PrismaDelegateNameMapping, PrismaFindManyArgsLike, PrismaLikeInclude, PrismaLikeOrderBy, PrismaLikeScalarFilter, PrismaLikeSelect, PrismaLikeSortOrder, PrismaLikeWhereInput, PrismaMigrationWorkflowOptions, PrismaSchemaSyncOptions, PrismaTransactionCallback, PrismaTransactionCapableClient, PrismaTransactionOptions, QueryBuilder, QueryComparisonCondition, QueryComparisonOperator, QueryCondition, QueryConstraintException, QueryGroupCondition, QueryLogicalOperator, QueryNotCondition, QueryOrderBy, QueryRawCondition, QuerySelectColumn, QueryTarget, RelatedModelClass, RelationAggregateSpec, RelationColumnLookupSpec, RelationConstraint, RelationDefaultResolver, RelationDefaultValue, RelationFilterSpec, RelationLoadPlan, RelationLoadSpec, RelationMetadata, RelationMetadataProvider, RelationMetadataType, RelationResolutionException, RelationTableLookupSpec, RelationshipModelStatic, RuntimeModuleLoader, SEEDER_BRAND, SchemaBuilder, SchemaColumn, SchemaColumnType, SchemaForeignKey, SchemaForeignKeyAction, SchemaIndex, SchemaOperation, SchemaTableAlterOperation, SchemaTableCreateOperation, SchemaTableDropOperation, ScopeNotDefinedException, SeedCommand, Seeder, SeederCallArgument, SeederConstructor, SeederInput, SelectSpec, Serializable, SimplePaginationMeta, SoftDeleteConfig, SoftDeleteQueryMode, SortDirection, TableBuilder, URLDriver, UniqueConstraintResolutionException, UnsupportedAdapterFeatureException, UpdateManySpec, UpdateSpec, UpsertSpec, applyAlterTableOperation, applyCreateTableOperation, applyDropTableOperation, applyMigrationRollbackToDatabase, applyMigrationRollbackToPrismaSchema, applyMigrationToDatabase, applyMigrationToPrismaSchema, applyOperationsToPersistedColumnMappingsState, applyOperationsToPrismaSchema, bindAdapterToModels, buildEnumBlock, buildFieldLine, buildIndexLine, buildInverseRelationLine, buildMigrationIdentity, buildMigrationRunId, buildMigrationSource, buildModelBlock, buildRelationLine, computeMigrationChecksum, configureArkormRuntime, createEmptyAppliedMigrationsState, createEmptyPersistedColumnMappingsState, createKyselyAdapter, createMigrationTimestamp, createPrismaAdapter, createPrismaCompatibilityAdapter, createPrismaDatabaseAdapter, createPrismaDelegateMap, defineConfig, defineFactory, deleteAppliedMigrationsStateFromStore, deletePersistedColumnMappingsState, deriveCollectionFieldName, deriveInverseRelationAlias, deriveRelationAlias, deriveRelationFieldName, deriveSingularFieldName, ensureArkormConfigLoading, escapeRegex, findAppliedMigration, findEnumBlock, findModelBlock, formatDefaultValue, formatEnumDefaultValue, formatRelationAction, generateMigrationFile, getActiveTransactionClient, getDefaultStubsPath, getLastMigrationRun, getLatestAppliedMigrations, getMigrationPlan, getPersistedColumnMap, getPersistedEnumMap, getPersistedEnumTsType, getPersistedPrimaryKeyGeneration, getPersistedTableMetadata, getRuntimeAdapter, getRuntimePaginationCurrentPageResolver, getRuntimePaginationURLDriverFactory, getRuntimePrismaClient, getUserConfig, inferDelegateName, isDelegateLike, isMigrationApplied, isTransactionCapableClient, loadArkormConfig, markMigrationApplied, markMigrationRun, pad, readAppliedMigrationsState, readAppliedMigrationsStateFromStore, readPersistedColumnMappingsState, rebuildPersistedColumnMappingsState, removeAppliedMigration, resetArkormRuntimeForTests, resetPersistedColumnMappingsCache, resolveCast, resolveColumnMappingsFilePath, resolveEnumName, resolveMigrationClassName, resolveMigrationStateFilePath, resolvePersistedMetadataFeatures, resolvePrismaType, runArkormTransaction, runMigrationWithPrisma, runPrismaCommand, stripPrismaSchemaModelsAndEnums, supportsDatabaseMigrationExecution, supportsDatabaseMigrationState, supportsDatabaseReset, syncPersistedColumnMappingsFromState, toMigrationFileSlug, toModelName, validatePersistedMetadataFeaturesForMigrations, writeAppliedMigrationsState, writeAppliedMigrationsStateToStore, writePersistedColumnMappingsState };
package/dist/index.d.mts CHANGED
@@ -5,6 +5,12 @@ import { PrismaClient } from "@prisma/client";
5
5
 
6
6
  //#region src/types/migrations.d.ts
7
7
  type SchemaColumnType = 'id' | 'uuid' | 'enum' | 'string' | 'text' | 'integer' | 'bigInteger' | 'float' | 'boolean' | 'json' | 'date' | 'timestamp';
8
+ interface PrimaryKeyGeneration {
9
+ strategy: 'uuid';
10
+ prismaDefault?: string;
11
+ databaseDefault?: string;
12
+ runtimeFactory?: 'uuid';
13
+ }
8
14
  interface SchemaColumn {
9
15
  name: string;
10
16
  type: SchemaColumnType;
@@ -18,6 +24,7 @@ interface SchemaColumn {
18
24
  after?: string;
19
25
  default?: unknown;
20
26
  updatedAt?: boolean;
27
+ primaryKeyGeneration?: PrimaryKeyGeneration;
21
28
  }
22
29
  interface SchemaIndex {
23
30
  columns: string[];
@@ -325,6 +332,7 @@ interface ModelMetadata {
325
332
  primaryKey: string;
326
333
  columns: ColumnMap;
327
334
  softDelete: SoftDeleteConfig;
335
+ primaryKeyGeneration?: PrimaryKeyGeneration;
328
336
  }
329
337
  type RelationMetadataType = 'hasOne' | 'hasMany' | 'belongsTo' | 'belongsToMany' | 'hasOneThrough' | 'hasManyThrough' | 'morphOne' | 'morphMany' | 'morphToMany';
330
338
  interface BaseRelationMetadata {
@@ -2628,6 +2636,7 @@ interface QueryTarget<TModel = unknown> {
2628
2636
  modelName?: string;
2629
2637
  table?: string;
2630
2638
  primaryKey?: string;
2639
+ primaryKeyGeneration?: PrimaryKeyGeneration;
2631
2640
  columns?: Record<string, string>;
2632
2641
  softDelete?: SoftDeleteConfig;
2633
2642
  alias?: string;
@@ -4175,6 +4184,10 @@ interface PersistedMetadataFeatures {
4175
4184
  interface PersistedTableMetadata {
4176
4185
  columns: Record<string, string>;
4177
4186
  enums: Record<string, string[]>;
4187
+ primaryKeyGeneration?: PersistedPrimaryKeyGeneration;
4188
+ }
4189
+ interface PersistedPrimaryKeyGeneration extends PrimaryKeyGeneration {
4190
+ column: string;
4178
4191
  }
4179
4192
  interface PersistedColumnMappingsState {
4180
4193
  version: 1;
@@ -4205,6 +4218,12 @@ declare const getPersistedEnumMap: (table: string, options?: {
4205
4218
  features?: PersistedMetadataFeatures;
4206
4219
  strict?: boolean;
4207
4220
  }) => Record<string, string[]>;
4221
+ declare const getPersistedPrimaryKeyGeneration: (table: string, options?: {
4222
+ cwd?: string;
4223
+ configuredPath?: string;
4224
+ features?: PersistedMetadataFeatures;
4225
+ strict?: boolean;
4226
+ }) => PersistedPrimaryKeyGeneration | undefined;
4208
4227
  declare const applyOperationsToPersistedColumnMappingsState: (state: PersistedColumnMappingsState, operations: SchemaOperation[], features?: PersistedMetadataFeatures) => PersistedColumnMappingsState;
4209
4228
  declare const rebuildPersistedColumnMappingsState: (state: AppliedMigrationsState, availableMigrations: [MigrationClass, string][], features?: PersistedMetadataFeatures) => Promise<PersistedColumnMappingsState>;
4210
4229
  declare const syncPersistedColumnMappingsFromState: (cwd: string, state: AppliedMigrationsState, availableMigrations: [MigrationClass, string][], features?: PersistedMetadataFeatures) => Promise<void>;
@@ -4525,6 +4544,12 @@ declare const runMigrationWithPrisma: (migration: Migration | (new () => Migrati
4525
4544
  operations: SchemaOperation[];
4526
4545
  }>;
4527
4546
  //#endregion
4547
+ //#region src/helpers/PrimaryKeyGenerationPlanner.d.ts
4548
+ declare class PrimaryKeyGenerationPlanner {
4549
+ static plan(column: Pick<SchemaColumn, 'type' | 'primary' | 'default'>): PrimaryKeyGeneration | undefined;
4550
+ static generate(generation: PrimaryKeyGeneration | undefined): unknown;
4551
+ }
4552
+ //#endregion
4528
4553
  //#region src/helpers/runtime-config.d.ts
4529
4554
  /**
4530
4555
  * Define the ArkORM runtime configuration. This function can be used to provide.
@@ -4656,4 +4681,4 @@ declare class URLDriver {
4656
4681
  url(page: number): string;
4657
4682
  }
4658
4683
  //#endregion
4659
- export { AdapterBindableModel, AdapterCapabilities, AdapterCapability, AdapterModelFieldStructure, AdapterModelIntrospectionOptions, AdapterModelStructure, AdapterTransactionContext, AggregateOperation, AggregateSelection, AggregateSpec, AppliedMigrationEntry, AppliedMigrationRun, AppliedMigrationsState, ArkormBootContext, ArkormCollection, ArkormConfig, ArkormErrorContext, ArkormException, Attribute, AttributeCreateInput, AttributeOptions, AttributeOrderBy, AttributeSchemaDelegate, AttributeSelect, AttributeUpdateInput, AttributeWhereInput, BelongsToManyRelationMetadata, BelongsToRelationMetadata, CastDefinition, CastHandler, CastMap, CastType, CliApp, ClientResolver, ColumnMap, DatabaseAdapter, DatabasePrimitive, DatabaseRow, DatabaseRows, DatabaseValue, DelegateCreateData, DelegateFindManyArgs, DelegateForModelSchema, DelegateInclude, DelegateOrderBy, DelegateRow, DelegateRows, DelegateSelect, DelegateUniqueWhere, DelegateUpdateArgs, DelegateUpdateData, DelegateWhere, DeleteManySpec, DeleteSpec, EagerLoadConstraint, EagerLoadMap, EnumBuilder, FactoryAttributes, FactoryDefinition, FactoryModelConstructor, FactoryState, ForeignKeyBuilder, GenerateMigrationOptions, GeneratedMigrationFile, GetUserConfig, GlobalScope, HasManyRelationMetadata, HasManyThroughRelationMetadata, HasOneRelationMetadata, HasOneThroughRelationMetadata, InitCommand, InlineFactory, InsertManySpec, InsertSpec, KyselyDatabaseAdapter, LengthAwarePaginator, MIGRATION_BRAND, MakeFactoryCommand, MakeMigrationCommand, MakeModelCommand, MakeSeederCommand, MigrateCommand, MigrateFreshCommand, MigrateRollbackCommand, Migration, MigrationClass, MigrationHistoryCommand, MigrationInstanceLike, MissingDelegateException, Model, ModelAttributes, ModelAttributesOf, ModelCreateData, ModelEventDispatcher, ModelEventHandler, ModelEventHandlerConstructor, ModelEventListener, ModelEventName, ModelFactory, ModelLifecycleState, ModelMetadata, ModelNotFoundException, ModelStatic, ModelUpdateData, ModelsSyncCommand, MorphManyRelationMetadata, MorphOneRelationMetadata, MorphToManyRelationMetadata, PRISMA_ENUM_MEMBER_REGEX, PRISMA_ENUM_REGEX, PRISMA_MODEL_REGEX, PaginationCurrentPageResolver, PaginationMeta, PaginationOptions, PaginationURLDriver, PaginationURLDriverFactory, Paginator, PersistedColumnMappingsState, PersistedMetadataFeatures, PersistedTableMetadata, PrismaClientLike, PrismaDatabaseAdapter, PrismaDelegateLike, PrismaDelegateMap, PrismaDelegateNameMapping, PrismaFindManyArgsLike, PrismaLikeInclude, PrismaLikeOrderBy, PrismaLikeScalarFilter, PrismaLikeSelect, PrismaLikeSortOrder, PrismaLikeWhereInput, PrismaMigrationWorkflowOptions, PrismaSchemaSyncOptions, PrismaTransactionCallback, PrismaTransactionCapableClient, PrismaTransactionOptions, QueryBuilder, QueryComparisonCondition, QueryComparisonOperator, QueryCondition, QueryConstraintException, QueryGroupCondition, QueryLogicalOperator, QueryNotCondition, QueryOrderBy, QueryRawCondition, QuerySelectColumn, QueryTarget, RelatedModelClass, RelationAggregateSpec, RelationColumnLookupSpec, RelationConstraint, RelationDefaultResolver, RelationDefaultValue, RelationFilterSpec, RelationLoadPlan, RelationLoadSpec, RelationMetadata, RelationMetadataProvider, RelationMetadataType, RelationResolutionException, RelationTableLookupSpec, RelationshipModelStatic, RuntimeModuleLoader, SEEDER_BRAND, SchemaBuilder, SchemaColumn, SchemaColumnType, SchemaForeignKey, SchemaForeignKeyAction, SchemaIndex, SchemaOperation, SchemaTableAlterOperation, SchemaTableCreateOperation, SchemaTableDropOperation, ScopeNotDefinedException, SeedCommand, Seeder, SeederCallArgument, SeederConstructor, SeederInput, SelectSpec, Serializable, SimplePaginationMeta, SoftDeleteConfig, SoftDeleteQueryMode, SortDirection, TableBuilder, URLDriver, UniqueConstraintResolutionException, UnsupportedAdapterFeatureException, UpdateManySpec, UpdateSpec, UpsertSpec, applyAlterTableOperation, applyCreateTableOperation, applyDropTableOperation, applyMigrationRollbackToDatabase, applyMigrationRollbackToPrismaSchema, applyMigrationToDatabase, applyMigrationToPrismaSchema, applyOperationsToPersistedColumnMappingsState, applyOperationsToPrismaSchema, bindAdapterToModels, buildEnumBlock, buildFieldLine, buildIndexLine, buildInverseRelationLine, buildMigrationIdentity, buildMigrationRunId, buildMigrationSource, buildModelBlock, buildRelationLine, computeMigrationChecksum, configureArkormRuntime, createEmptyAppliedMigrationsState, createEmptyPersistedColumnMappingsState, createKyselyAdapter, createMigrationTimestamp, createPrismaAdapter, createPrismaCompatibilityAdapter, createPrismaDatabaseAdapter, createPrismaDelegateMap, defineConfig, defineFactory, deleteAppliedMigrationsStateFromStore, deletePersistedColumnMappingsState, deriveCollectionFieldName, deriveInverseRelationAlias, deriveRelationAlias, deriveRelationFieldName, deriveSingularFieldName, ensureArkormConfigLoading, escapeRegex, findAppliedMigration, findEnumBlock, findModelBlock, formatDefaultValue, formatEnumDefaultValue, formatRelationAction, generateMigrationFile, getActiveTransactionClient, getDefaultStubsPath, getLastMigrationRun, getLatestAppliedMigrations, getMigrationPlan, getPersistedColumnMap, getPersistedEnumMap, getPersistedEnumTsType, getPersistedTableMetadata, getRuntimeAdapter, getRuntimePaginationCurrentPageResolver, getRuntimePaginationURLDriverFactory, getRuntimePrismaClient, getUserConfig, inferDelegateName, isDelegateLike, isMigrationApplied, isTransactionCapableClient, loadArkormConfig, markMigrationApplied, markMigrationRun, pad, readAppliedMigrationsState, readAppliedMigrationsStateFromStore, readPersistedColumnMappingsState, rebuildPersistedColumnMappingsState, removeAppliedMigration, resetArkormRuntimeForTests, resetPersistedColumnMappingsCache, resolveCast, resolveColumnMappingsFilePath, resolveEnumName, resolveMigrationClassName, resolveMigrationStateFilePath, resolvePersistedMetadataFeatures, resolvePrismaType, runArkormTransaction, runMigrationWithPrisma, runPrismaCommand, stripPrismaSchemaModelsAndEnums, supportsDatabaseMigrationExecution, supportsDatabaseMigrationState, supportsDatabaseReset, syncPersistedColumnMappingsFromState, toMigrationFileSlug, toModelName, validatePersistedMetadataFeaturesForMigrations, writeAppliedMigrationsState, writeAppliedMigrationsStateToStore, writePersistedColumnMappingsState };
4684
+ export { AdapterBindableModel, AdapterCapabilities, AdapterCapability, AdapterModelFieldStructure, AdapterModelIntrospectionOptions, AdapterModelStructure, AdapterTransactionContext, AggregateOperation, AggregateSelection, AggregateSpec, AppliedMigrationEntry, AppliedMigrationRun, AppliedMigrationsState, ArkormBootContext, ArkormCollection, ArkormConfig, ArkormErrorContext, ArkormException, Attribute, AttributeCreateInput, AttributeOptions, AttributeOrderBy, AttributeSchemaDelegate, AttributeSelect, AttributeUpdateInput, AttributeWhereInput, BelongsToManyRelationMetadata, BelongsToRelationMetadata, CastDefinition, CastHandler, CastMap, CastType, CliApp, ClientResolver, ColumnMap, DatabaseAdapter, DatabasePrimitive, DatabaseRow, DatabaseRows, DatabaseValue, DelegateCreateData, DelegateFindManyArgs, DelegateForModelSchema, DelegateInclude, DelegateOrderBy, DelegateRow, DelegateRows, DelegateSelect, DelegateUniqueWhere, DelegateUpdateArgs, DelegateUpdateData, DelegateWhere, DeleteManySpec, DeleteSpec, EagerLoadConstraint, EagerLoadMap, EnumBuilder, FactoryAttributes, FactoryDefinition, FactoryModelConstructor, FactoryState, ForeignKeyBuilder, GenerateMigrationOptions, GeneratedMigrationFile, GetUserConfig, GlobalScope, HasManyRelationMetadata, HasManyThroughRelationMetadata, HasOneRelationMetadata, HasOneThroughRelationMetadata, InitCommand, InlineFactory, InsertManySpec, InsertSpec, KyselyDatabaseAdapter, LengthAwarePaginator, MIGRATION_BRAND, MakeFactoryCommand, MakeMigrationCommand, MakeModelCommand, MakeSeederCommand, MigrateCommand, MigrateFreshCommand, MigrateRollbackCommand, Migration, MigrationClass, MigrationHistoryCommand, MigrationInstanceLike, MissingDelegateException, Model, ModelAttributes, ModelAttributesOf, ModelCreateData, ModelEventDispatcher, ModelEventHandler, ModelEventHandlerConstructor, ModelEventListener, ModelEventName, ModelFactory, ModelLifecycleState, ModelMetadata, ModelNotFoundException, ModelStatic, ModelUpdateData, ModelsSyncCommand, MorphManyRelationMetadata, MorphOneRelationMetadata, MorphToManyRelationMetadata, PRISMA_ENUM_MEMBER_REGEX, PRISMA_ENUM_REGEX, PRISMA_MODEL_REGEX, PaginationCurrentPageResolver, PaginationMeta, PaginationOptions, PaginationURLDriver, PaginationURLDriverFactory, Paginator, PersistedColumnMappingsState, PersistedMetadataFeatures, PersistedPrimaryKeyGeneration, PersistedTableMetadata, PrimaryKeyGeneration, PrimaryKeyGenerationPlanner, PrismaClientLike, PrismaDatabaseAdapter, PrismaDelegateLike, PrismaDelegateMap, PrismaDelegateNameMapping, PrismaFindManyArgsLike, PrismaLikeInclude, PrismaLikeOrderBy, PrismaLikeScalarFilter, PrismaLikeSelect, PrismaLikeSortOrder, PrismaLikeWhereInput, PrismaMigrationWorkflowOptions, PrismaSchemaSyncOptions, PrismaTransactionCallback, PrismaTransactionCapableClient, PrismaTransactionOptions, QueryBuilder, QueryComparisonCondition, QueryComparisonOperator, QueryCondition, QueryConstraintException, QueryGroupCondition, QueryLogicalOperator, QueryNotCondition, QueryOrderBy, QueryRawCondition, QuerySelectColumn, QueryTarget, RelatedModelClass, RelationAggregateSpec, RelationColumnLookupSpec, RelationConstraint, RelationDefaultResolver, RelationDefaultValue, RelationFilterSpec, RelationLoadPlan, RelationLoadSpec, RelationMetadata, RelationMetadataProvider, RelationMetadataType, RelationResolutionException, RelationTableLookupSpec, RelationshipModelStatic, RuntimeModuleLoader, SEEDER_BRAND, SchemaBuilder, SchemaColumn, SchemaColumnType, SchemaForeignKey, SchemaForeignKeyAction, SchemaIndex, SchemaOperation, SchemaTableAlterOperation, SchemaTableCreateOperation, SchemaTableDropOperation, ScopeNotDefinedException, SeedCommand, Seeder, SeederCallArgument, SeederConstructor, SeederInput, SelectSpec, Serializable, SimplePaginationMeta, SoftDeleteConfig, SoftDeleteQueryMode, SortDirection, TableBuilder, URLDriver, UniqueConstraintResolutionException, UnsupportedAdapterFeatureException, UpdateManySpec, UpdateSpec, UpsertSpec, applyAlterTableOperation, applyCreateTableOperation, applyDropTableOperation, applyMigrationRollbackToDatabase, applyMigrationRollbackToPrismaSchema, applyMigrationToDatabase, applyMigrationToPrismaSchema, applyOperationsToPersistedColumnMappingsState, applyOperationsToPrismaSchema, bindAdapterToModels, buildEnumBlock, buildFieldLine, buildIndexLine, buildInverseRelationLine, buildMigrationIdentity, buildMigrationRunId, buildMigrationSource, buildModelBlock, buildRelationLine, computeMigrationChecksum, configureArkormRuntime, createEmptyAppliedMigrationsState, createEmptyPersistedColumnMappingsState, createKyselyAdapter, createMigrationTimestamp, createPrismaAdapter, createPrismaCompatibilityAdapter, createPrismaDatabaseAdapter, createPrismaDelegateMap, defineConfig, defineFactory, deleteAppliedMigrationsStateFromStore, deletePersistedColumnMappingsState, deriveCollectionFieldName, deriveInverseRelationAlias, deriveRelationAlias, deriveRelationFieldName, deriveSingularFieldName, ensureArkormConfigLoading, escapeRegex, findAppliedMigration, findEnumBlock, findModelBlock, formatDefaultValue, formatEnumDefaultValue, formatRelationAction, generateMigrationFile, getActiveTransactionClient, getDefaultStubsPath, getLastMigrationRun, getLatestAppliedMigrations, getMigrationPlan, getPersistedColumnMap, getPersistedEnumMap, getPersistedEnumTsType, getPersistedPrimaryKeyGeneration, getPersistedTableMetadata, getRuntimeAdapter, getRuntimePaginationCurrentPageResolver, getRuntimePaginationURLDriverFactory, getRuntimePrismaClient, getUserConfig, inferDelegateName, isDelegateLike, isMigrationApplied, isTransactionCapableClient, loadArkormConfig, markMigrationApplied, markMigrationRun, pad, readAppliedMigrationsState, readAppliedMigrationsStateFromStore, readPersistedColumnMappingsState, rebuildPersistedColumnMappingsState, removeAppliedMigration, resetArkormRuntimeForTests, resetPersistedColumnMappingsCache, resolveCast, resolveColumnMappingsFilePath, resolveEnumName, resolveMigrationClassName, resolveMigrationStateFilePath, resolvePersistedMetadataFeatures, resolvePrismaType, runArkormTransaction, runMigrationWithPrisma, runPrismaCommand, stripPrismaSchemaModelsAndEnums, supportsDatabaseMigrationExecution, supportsDatabaseMigrationState, supportsDatabaseReset, syncPersistedColumnMappingsFromState, toMigrationFileSlug, toModelName, validatePersistedMetadataFeaturesForMigrations, writeAppliedMigrationsState, writeAppliedMigrationsStateToStore, writePersistedColumnMappingsState };
package/dist/index.mjs CHANGED
@@ -3,7 +3,7 @@ import { str } from "@h3ravel/support";
3
3
  import { AsyncLocalStorage } from "async_hooks";
4
4
  import { dirname, extname, join, resolve } from "node:path";
5
5
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
6
- import { createHash } from "node:crypto";
6
+ import { createHash, randomUUID } from "node:crypto";
7
7
  import { spawnSync } from "node:child_process";
8
8
  import { createJiti } from "@rexxars/jiti";
9
9
  import { pathToFileURL } from "node:url";
@@ -135,6 +135,7 @@ var KyselyDatabaseAdapter = class KyselyDatabaseAdapter {
135
135
  return "timestamptz";
136
136
  }
137
137
  resolveSchemaColumnDefault(column) {
138
+ if (column.primaryKeyGeneration?.databaseDefault) return column.primaryKeyGeneration.databaseDefault;
138
139
  const value = column.default ?? (column.updatedAt ? "now()" : void 0);
139
140
  if (value === void 0) return null;
140
141
  if (value === "now()") return "now()";
@@ -1118,6 +1119,23 @@ const getLatestAppliedMigrations = (state, steps) => {
1118
1119
  }).slice(0, Math.max(0, steps)).map((entry) => entry.migration);
1119
1120
  };
1120
1121
 
1122
+ //#endregion
1123
+ //#region src/helpers/PrimaryKeyGenerationPlanner.ts
1124
+ var PrimaryKeyGenerationPlanner = class {
1125
+ static plan(column) {
1126
+ if (!column.primary || column.default !== void 0) return void 0;
1127
+ if (column.type === "uuid" || column.type === "string") return {
1128
+ strategy: "uuid",
1129
+ prismaDefault: "@default(uuid())",
1130
+ databaseDefault: column.type === "uuid" ? "gen_random_uuid()" : "gen_random_uuid()::text",
1131
+ runtimeFactory: "uuid"
1132
+ };
1133
+ }
1134
+ static generate(generation) {
1135
+ if (generation?.runtimeFactory === "uuid") return randomUUID();
1136
+ }
1137
+ };
1138
+
1121
1139
  //#endregion
1122
1140
  //#region src/database/ForeignKeyBuilder.ts
1123
1141
  /**
@@ -1311,6 +1329,7 @@ var TableBuilder = class {
1311
1329
  column.primary = true;
1312
1330
  if (typeof config.autoIncrement === "boolean") column.autoIncrement = config.autoIncrement;
1313
1331
  if (Object.prototype.hasOwnProperty.call(config, "default")) column.default = config.default;
1332
+ column.primaryKeyGeneration = PrimaryKeyGenerationPlanner.plan(column);
1314
1333
  return this;
1315
1334
  }
1316
1335
  /**
@@ -1674,8 +1693,11 @@ var TableBuilder = class {
1674
1693
  autoIncrement: options.autoIncrement,
1675
1694
  after: options.after,
1676
1695
  default: options.default,
1677
- updatedAt: options.updatedAt
1696
+ updatedAt: options.updatedAt,
1697
+ primaryKeyGeneration: options.primaryKeyGeneration
1678
1698
  });
1699
+ const column = this.columns[this.columns.length - 1];
1700
+ column.primaryKeyGeneration = PrimaryKeyGenerationPlanner.plan(column);
1679
1701
  this.latestColumnName = name;
1680
1702
  return this;
1681
1703
  }
@@ -1930,7 +1952,7 @@ const buildFieldLine = (column) => {
1930
1952
  const primary = column.primary ? " @id" : "";
1931
1953
  const mapped = typeof column.map === "string" && column.map.trim().length > 0 ? ` @map("${column.map.replace(/"/g, "\\\"")}")` : "";
1932
1954
  const updatedAt = column.updatedAt ? " @updatedAt" : "";
1933
- const defaultValue = column.type === "enum" ? formatEnumDefaultValue(column.default) : formatDefaultValue(column.default) ?? (column.type === "uuid" && column.primary ? "@default(uuid())" : void 0);
1955
+ const defaultValue = column.type === "enum" ? formatEnumDefaultValue(column.default) : column.primaryKeyGeneration?.prismaDefault ?? formatDefaultValue(column.default);
1934
1956
  const defaultSuffix = defaultValue ? ` ${defaultValue}` : "";
1935
1957
  return ` ${column.name} ${scalar}${nullable}${primary}${unique}${defaultSuffix}${updatedAt}${mapped}`;
1936
1958
  };
@@ -2578,7 +2600,20 @@ const normalizePersistedTableMetadata = (table) => {
2578
2600
  const normalizedValues = normalizePersistedEnumValues(values);
2579
2601
  if (normalizedValues.length > 0) all[columnName] = normalizedValues;
2580
2602
  return all;
2581
- }, {})
2603
+ }, {}),
2604
+ primaryKeyGeneration: normalizePersistedPrimaryKeyGeneration(candidate.primaryKeyGeneration)
2605
+ };
2606
+ };
2607
+ const normalizePersistedPrimaryKeyGeneration = (value) => {
2608
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
2609
+ const candidate = value;
2610
+ if (candidate.strategy !== "uuid" || typeof candidate.column !== "string" || candidate.column.trim().length === 0) return void 0;
2611
+ return {
2612
+ column: candidate.column,
2613
+ strategy: "uuid",
2614
+ prismaDefault: typeof candidate.prismaDefault === "string" && candidate.prismaDefault.trim().length > 0 ? candidate.prismaDefault : void 0,
2615
+ databaseDefault: typeof candidate.databaseDefault === "string" && candidate.databaseDefault.trim().length > 0 ? candidate.databaseDefault : void 0,
2616
+ runtimeFactory: candidate.runtimeFactory === "uuid" ? "uuid" : void 0
2582
2617
  };
2583
2618
  };
2584
2619
  const normalizePersistedColumnMappingsState = (state) => {
@@ -2587,7 +2622,7 @@ const normalizePersistedColumnMappingsState = (state) => {
2587
2622
  tables: Object.entries(state?.tables ?? {}).reduce((all, [tableName, tableMetadata]) => {
2588
2623
  if (tableName.trim().length === 0) return all;
2589
2624
  const normalized = normalizePersistedTableMetadata(tableMetadata);
2590
- if (Object.keys(normalized.columns).length > 0 || Object.keys(normalized.enums).length > 0) all[tableName] = normalized;
2625
+ if (Object.keys(normalized.columns).length > 0 || Object.keys(normalized.enums).length > 0 || normalized.primaryKeyGeneration) all[tableName] = normalized;
2591
2626
  return all;
2592
2627
  }, {})
2593
2628
  };
@@ -2658,7 +2693,8 @@ const getPersistedTableMetadata = (table, options = {}) => {
2658
2693
  enums: Object.entries(metadata.enums).reduce((all, [columnName, values]) => {
2659
2694
  all[columnName] = [...values];
2660
2695
  return all;
2661
- }, {})
2696
+ }, {}),
2697
+ primaryKeyGeneration: metadata.primaryKeyGeneration ? { ...metadata.primaryKeyGeneration } : void 0
2662
2698
  };
2663
2699
  };
2664
2700
  const getPersistedColumnMap = (table, options = {}) => {
@@ -2667,6 +2703,9 @@ const getPersistedColumnMap = (table, options = {}) => {
2667
2703
  const getPersistedEnumMap = (table, options = {}) => {
2668
2704
  return getPersistedTableMetadata(table, options).enums;
2669
2705
  };
2706
+ const getPersistedPrimaryKeyGeneration = (table, options = {}) => {
2707
+ return getPersistedTableMetadata(table, options).primaryKeyGeneration;
2708
+ };
2670
2709
  const applyMappedColumn = (tableColumns, column, features, table) => {
2671
2710
  if (typeof column.map === "string" && column.map.trim().length > 0 && column.map !== column.name) {
2672
2711
  if (!features.persistedColumnMappings) throw buildPersistedFeatureDisabledError("persistedColumnMappings", table);
@@ -2690,6 +2729,17 @@ const removePersistedColumnMetadata = (tableMetadata, columnName) => {
2690
2729
  Object.entries(tableMetadata.columns).forEach(([attribute, mappedColumn]) => {
2691
2730
  if (mappedColumn === columnName) delete tableMetadata.columns[attribute];
2692
2731
  });
2732
+ if (tableMetadata.primaryKeyGeneration?.column === columnName) delete tableMetadata.primaryKeyGeneration;
2733
+ };
2734
+ const applyPrimaryKeyGeneration = (tableMetadata, column) => {
2735
+ if (!column.primary || !column.primaryKeyGeneration) {
2736
+ if (tableMetadata.primaryKeyGeneration?.column === column.name) delete tableMetadata.primaryKeyGeneration;
2737
+ return;
2738
+ }
2739
+ tableMetadata.primaryKeyGeneration = {
2740
+ column: column.name,
2741
+ ...column.primaryKeyGeneration
2742
+ };
2693
2743
  };
2694
2744
  const applyOperationsToPersistedColumnMappingsState = (state, operations, features = resolvePersistedMetadataFeatures()) => {
2695
2745
  const nextTables = Object.entries(state.tables).reduce((all, [table, metadata]) => {
@@ -2698,7 +2748,8 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
2698
2748
  enums: Object.entries(metadata.enums).reduce((nextEnums, [columnName, values]) => {
2699
2749
  nextEnums[columnName] = [...values];
2700
2750
  return nextEnums;
2701
- }, {})
2751
+ }, {}),
2752
+ primaryKeyGeneration: metadata.primaryKeyGeneration ? { ...metadata.primaryKeyGeneration } : void 0
2702
2753
  };
2703
2754
  return all;
2704
2755
  }, {});
@@ -2711,8 +2762,9 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
2711
2762
  operation.columns.forEach((column) => {
2712
2763
  applyMappedColumn(tableMetadata.columns, column, features, operation.table);
2713
2764
  applyEnumColumn(tableMetadata.enums, column, features, operation.table);
2765
+ applyPrimaryKeyGeneration(tableMetadata, column);
2714
2766
  });
2715
- if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0) nextTables[operation.table] = tableMetadata;
2767
+ if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0 || tableMetadata.primaryKeyGeneration) nextTables[operation.table] = tableMetadata;
2716
2768
  else delete nextTables[operation.table];
2717
2769
  return;
2718
2770
  }
@@ -2724,11 +2776,12 @@ const applyOperationsToPersistedColumnMappingsState = (state, operations, featur
2724
2776
  operation.addColumns.forEach((column) => {
2725
2777
  applyMappedColumn(tableMetadata.columns, column, features, operation.table);
2726
2778
  applyEnumColumn(tableMetadata.enums, column, features, operation.table);
2779
+ applyPrimaryKeyGeneration(tableMetadata, column);
2727
2780
  });
2728
2781
  operation.dropColumns.forEach((columnName) => {
2729
2782
  removePersistedColumnMetadata(tableMetadata, columnName);
2730
2783
  });
2731
- if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0) nextTables[operation.table] = tableMetadata;
2784
+ if (Object.keys(tableMetadata.columns).length > 0 || Object.keys(tableMetadata.enums).length > 0 || tableMetadata.primaryKeyGeneration) nextTables[operation.table] = tableMetadata;
2732
2785
  else delete nextTables[operation.table];
2733
2786
  return;
2734
2787
  }
@@ -7637,7 +7690,8 @@ var QueryBuilder = class QueryBuilder {
7637
7690
  * @returns
7638
7691
  */
7639
7692
  async create(data) {
7640
- const created = await this.executeInsertRow(data);
7693
+ const [payload] = this.normalizeInsertPayloads(data);
7694
+ const created = await this.executeInsertRow(payload);
7641
7695
  return this.model.hydrate(created);
7642
7696
  }
7643
7697
  /**
@@ -7648,7 +7702,8 @@ var QueryBuilder = class QueryBuilder {
7648
7702
  */
7649
7703
  async createMany(values) {
7650
7704
  if (values.length === 0) return [];
7651
- return await Promise.all(values.map(async (value) => await this.create(value)));
7705
+ const payloads = this.normalizeInsertPayloads(values);
7706
+ return await Promise.all(payloads.map(async (value) => await this.create(value)));
7652
7707
  }
7653
7708
  /**
7654
7709
  * Insert one or more records.
@@ -7912,8 +7967,17 @@ var QueryBuilder = class QueryBuilder {
7912
7967
  return !await this.exists();
7913
7968
  }
7914
7969
  normalizeInsertPayloads(values) {
7915
- if (Array.isArray(values)) return values;
7916
- return [values];
7970
+ const payloads = Array.isArray(values) ? values : [values];
7971
+ const metadata = this.model.getModelMetadata();
7972
+ return payloads.map((payload) => {
7973
+ const nextPayload = { ...payload };
7974
+ const primaryKeyValue = nextPayload[metadata.primaryKey];
7975
+ if (primaryKeyValue !== void 0 && primaryKeyValue !== null) return nextPayload;
7976
+ const generated = PrimaryKeyGenerationPlanner.generate(metadata.primaryKeyGeneration);
7977
+ if (generated === void 0) return nextPayload;
7978
+ nextPayload[metadata.primaryKey] = generated;
7979
+ return nextPayload;
7980
+ });
7917
7981
  }
7918
7982
  resolveAffectedCount(result, fallback) {
7919
7983
  if (typeof result === "number") return result;
@@ -8156,6 +8220,7 @@ var QueryBuilder = class QueryBuilder {
8156
8220
  modelName: this.model.name,
8157
8221
  table: metadata.table,
8158
8222
  primaryKey: metadata.primaryKey,
8223
+ primaryKeyGeneration: metadata.primaryKeyGeneration,
8159
8224
  columns: metadata.columns,
8160
8225
  softDelete: metadata.softDelete
8161
8226
  };
@@ -8968,10 +9033,10 @@ var Model = class Model {
8968
9033
  const adapter = this.getAdapter();
8969
9034
  const shouldStrictlyValidatePersistedMappings = Boolean(adapter) && !(adapter instanceof PrismaDatabaseAdapter);
8970
9035
  return {
8971
- ...getPersistedColumnMap(this.getTable(), {
9036
+ ...getPersistedTableMetadata(this.getTable(), {
8972
9037
  features: resolvePersistedMetadataFeatures(getUserConfig("features")),
8973
9038
  strict: shouldStrictlyValidatePersistedMappings
8974
- }),
9039
+ }).columns,
8975
9040
  ...this.columns
8976
9041
  };
8977
9042
  }
@@ -8979,11 +9044,26 @@ var Model = class Model {
8979
9044
  return this.getColumnMap()[attribute] ?? attribute;
8980
9045
  }
8981
9046
  static getModelMetadata() {
9047
+ const adapter = this.getAdapter();
9048
+ const shouldStrictlyValidatePersistedMappings = Boolean(adapter) && !(adapter instanceof PrismaDatabaseAdapter);
9049
+ const persistedMetadata = getPersistedTableMetadata(this.getTable(), {
9050
+ features: resolvePersistedMetadataFeatures(getUserConfig("features")),
9051
+ strict: shouldStrictlyValidatePersistedMappings
9052
+ });
8982
9053
  return {
8983
9054
  table: this.getTable(),
8984
9055
  primaryKey: this.getPrimaryKey(),
8985
- columns: this.getColumnMap(),
8986
- softDelete: this.getSoftDeleteConfig()
9056
+ columns: {
9057
+ ...persistedMetadata.columns,
9058
+ ...this.columns
9059
+ },
9060
+ softDelete: this.getSoftDeleteConfig(),
9061
+ primaryKeyGeneration: persistedMetadata.primaryKeyGeneration?.column === this.getPrimaryKey() ? {
9062
+ strategy: persistedMetadata.primaryKeyGeneration.strategy,
9063
+ prismaDefault: persistedMetadata.primaryKeyGeneration.prismaDefault,
9064
+ databaseDefault: persistedMetadata.primaryKeyGeneration.databaseDefault,
9065
+ runtimeFactory: persistedMetadata.primaryKeyGeneration.runtimeFactory
9066
+ } : void 0
8987
9067
  };
8988
9068
  }
8989
9069
  static getRelationMetadata(name) {
@@ -9985,4 +10065,4 @@ var Model = class Model {
9985
10065
  };
9986
10066
 
9987
10067
  //#endregion
9988
- export { ArkormCollection, ArkormException, Attribute, CliApp, EnumBuilder, ForeignKeyBuilder, InitCommand, InlineFactory, KyselyDatabaseAdapter, LengthAwarePaginator, MIGRATION_BRAND, MakeFactoryCommand, MakeMigrationCommand, MakeModelCommand, MakeSeederCommand, MigrateCommand, MigrateFreshCommand, MigrateRollbackCommand, Migration, MigrationHistoryCommand, MissingDelegateException, Model, ModelFactory, ModelNotFoundException, ModelsSyncCommand, PRISMA_ENUM_MEMBER_REGEX, PRISMA_ENUM_REGEX, PRISMA_MODEL_REGEX, Paginator, PrismaDatabaseAdapter, QueryBuilder, QueryConstraintException, RelationResolutionException, RuntimeModuleLoader, SEEDER_BRAND, SchemaBuilder, ScopeNotDefinedException, SeedCommand, Seeder, TableBuilder, URLDriver, UniqueConstraintResolutionException, UnsupportedAdapterFeatureException, applyAlterTableOperation, applyCreateTableOperation, applyDropTableOperation, applyMigrationRollbackToDatabase, applyMigrationRollbackToPrismaSchema, applyMigrationToDatabase, applyMigrationToPrismaSchema, applyOperationsToPersistedColumnMappingsState, applyOperationsToPrismaSchema, bindAdapterToModels, buildEnumBlock, buildFieldLine, buildIndexLine, buildInverseRelationLine, buildMigrationIdentity, buildMigrationRunId, buildMigrationSource, buildModelBlock, buildRelationLine, computeMigrationChecksum, configureArkormRuntime, createEmptyAppliedMigrationsState, createEmptyPersistedColumnMappingsState, createKyselyAdapter, createMigrationTimestamp, createPrismaAdapter, createPrismaCompatibilityAdapter, createPrismaDatabaseAdapter, createPrismaDelegateMap, defineConfig, defineFactory, deleteAppliedMigrationsStateFromStore, deletePersistedColumnMappingsState, deriveCollectionFieldName, deriveInverseRelationAlias, deriveRelationAlias, deriveRelationFieldName, deriveSingularFieldName, ensureArkormConfigLoading, escapeRegex, findAppliedMigration, findEnumBlock, findModelBlock, formatDefaultValue, formatEnumDefaultValue, formatRelationAction, generateMigrationFile, getActiveTransactionClient, getDefaultStubsPath, getLastMigrationRun, getLatestAppliedMigrations, getMigrationPlan, getPersistedColumnMap, getPersistedEnumMap, getPersistedEnumTsType, getPersistedTableMetadata, getRuntimeAdapter, getRuntimePaginationCurrentPageResolver, getRuntimePaginationURLDriverFactory, getRuntimePrismaClient, getUserConfig, inferDelegateName, isDelegateLike, isMigrationApplied, isTransactionCapableClient, loadArkormConfig, markMigrationApplied, markMigrationRun, pad, readAppliedMigrationsState, readAppliedMigrationsStateFromStore, readPersistedColumnMappingsState, rebuildPersistedColumnMappingsState, removeAppliedMigration, resetArkormRuntimeForTests, resetPersistedColumnMappingsCache, resolveCast, resolveColumnMappingsFilePath, resolveEnumName, resolveMigrationClassName, resolveMigrationStateFilePath, resolvePersistedMetadataFeatures, resolvePrismaType, runArkormTransaction, runMigrationWithPrisma, runPrismaCommand, stripPrismaSchemaModelsAndEnums, supportsDatabaseMigrationExecution, supportsDatabaseMigrationState, supportsDatabaseReset, syncPersistedColumnMappingsFromState, toMigrationFileSlug, toModelName, validatePersistedMetadataFeaturesForMigrations, writeAppliedMigrationsState, writeAppliedMigrationsStateToStore, writePersistedColumnMappingsState };
10068
+ export { ArkormCollection, ArkormException, Attribute, CliApp, EnumBuilder, ForeignKeyBuilder, InitCommand, InlineFactory, KyselyDatabaseAdapter, LengthAwarePaginator, MIGRATION_BRAND, MakeFactoryCommand, MakeMigrationCommand, MakeModelCommand, MakeSeederCommand, MigrateCommand, MigrateFreshCommand, MigrateRollbackCommand, Migration, MigrationHistoryCommand, MissingDelegateException, Model, ModelFactory, ModelNotFoundException, ModelsSyncCommand, PRISMA_ENUM_MEMBER_REGEX, PRISMA_ENUM_REGEX, PRISMA_MODEL_REGEX, Paginator, PrimaryKeyGenerationPlanner, PrismaDatabaseAdapter, QueryBuilder, QueryConstraintException, RelationResolutionException, RuntimeModuleLoader, SEEDER_BRAND, SchemaBuilder, ScopeNotDefinedException, SeedCommand, Seeder, TableBuilder, URLDriver, UniqueConstraintResolutionException, UnsupportedAdapterFeatureException, applyAlterTableOperation, applyCreateTableOperation, applyDropTableOperation, applyMigrationRollbackToDatabase, applyMigrationRollbackToPrismaSchema, applyMigrationToDatabase, applyMigrationToPrismaSchema, applyOperationsToPersistedColumnMappingsState, applyOperationsToPrismaSchema, bindAdapterToModels, buildEnumBlock, buildFieldLine, buildIndexLine, buildInverseRelationLine, buildMigrationIdentity, buildMigrationRunId, buildMigrationSource, buildModelBlock, buildRelationLine, computeMigrationChecksum, configureArkormRuntime, createEmptyAppliedMigrationsState, createEmptyPersistedColumnMappingsState, createKyselyAdapter, createMigrationTimestamp, createPrismaAdapter, createPrismaCompatibilityAdapter, createPrismaDatabaseAdapter, createPrismaDelegateMap, defineConfig, defineFactory, deleteAppliedMigrationsStateFromStore, deletePersistedColumnMappingsState, deriveCollectionFieldName, deriveInverseRelationAlias, deriveRelationAlias, deriveRelationFieldName, deriveSingularFieldName, ensureArkormConfigLoading, escapeRegex, findAppliedMigration, findEnumBlock, findModelBlock, formatDefaultValue, formatEnumDefaultValue, formatRelationAction, generateMigrationFile, getActiveTransactionClient, getDefaultStubsPath, getLastMigrationRun, getLatestAppliedMigrations, getMigrationPlan, getPersistedColumnMap, getPersistedEnumMap, getPersistedEnumTsType, getPersistedPrimaryKeyGeneration, getPersistedTableMetadata, getRuntimeAdapter, getRuntimePaginationCurrentPageResolver, getRuntimePaginationURLDriverFactory, getRuntimePrismaClient, getUserConfig, inferDelegateName, isDelegateLike, isMigrationApplied, isTransactionCapableClient, loadArkormConfig, markMigrationApplied, markMigrationRun, pad, readAppliedMigrationsState, readAppliedMigrationsStateFromStore, readPersistedColumnMappingsState, rebuildPersistedColumnMappingsState, removeAppliedMigration, resetArkormRuntimeForTests, resetPersistedColumnMappingsCache, resolveCast, resolveColumnMappingsFilePath, resolveEnumName, resolveMigrationClassName, resolveMigrationStateFilePath, resolvePersistedMetadataFeatures, resolvePrismaType, runArkormTransaction, runMigrationWithPrisma, runPrismaCommand, stripPrismaSchemaModelsAndEnums, supportsDatabaseMigrationExecution, supportsDatabaseMigrationState, supportsDatabaseReset, syncPersistedColumnMappingsFromState, toMigrationFileSlug, toModelName, validatePersistedMetadataFeaturesForMigrations, writeAppliedMigrationsState, writeAppliedMigrationsStateToStore, writePersistedColumnMappingsState };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkormx",
3
- "version": "2.0.0-next.5",
3
+ "version": "2.0.0-next.6",
4
4
  "description": "Modern TypeScript-first ORM for Node.js.",
5
5
  "keywords": [
6
6
  "orm",