@strapi/database 5.19.0 → 5.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,5 +26,17 @@ export default class Dialect {
26
26
  message: string;
27
27
  }): void;
28
28
  canAddIncrements(): boolean;
29
+ /**
30
+ * Get column type conversion SQL for complex type changes
31
+ * Override in specific dialects to handle database-specific conversions
32
+ * @param currentType - The current database data type
33
+ * @param targetType - The target Strapi type
34
+ * @returns Conversion SQL details or null if no special handling needed
35
+ */
36
+ getColumnTypeConversionSQL(currentType: string, targetType: string): {
37
+ sql: string;
38
+ typeClause: string;
39
+ warning?: string;
40
+ } | null;
29
41
  }
30
42
  //# sourceMappingURL=dialect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/dialects/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IAC1B,EAAE,EAAE,QAAQ,CAAC;IAEb,eAAe,EAAE,eAAe,CAAyB;IAEzD,MAAM,EAAE,MAAM,CAAC;gBAEH,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IAMxC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG;IAGd,UAAU,CAAC,iBAAiB,CAAC,EAAE,OAAO;IAI5C,SAAS;IAIT,UAAU,CAAC,IAAI,EAAE,OAAO;IAIxB,mBAAmB;IAInB,eAAe;IAIf,YAAY;IAIZ,gBAAgB;IAIhB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAKtC,iBAAiB;IAIjB,eAAe;IAIrB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlD,gBAAgB;CAGjB"}
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/dialects/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IAC1B,EAAE,EAAE,QAAQ,CAAC;IAEb,eAAe,EAAE,eAAe,CAAyB;IAEzD,MAAM,EAAE,MAAM,CAAC;gBAEH,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IAMxC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG;IAGd,UAAU,CAAC,iBAAiB,CAAC,EAAE,OAAO;IAI5C,SAAS;IAIT,UAAU,CAAC,IAAI,EAAE,OAAO;IAIxB,mBAAmB;IAInB,eAAe;IAIf,YAAY;IAIZ,gBAAgB;IAIhB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAKtC,iBAAiB;IAIjB,eAAe;IAIrB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlD,gBAAgB;IAIhB;;;;;;OAMG;IACH,0BAA0B,CAExB,WAAW,EAAE,MAAM,EAEnB,UAAU,EAAE,MAAM,GACjB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAGhE"}
@@ -43,6 +43,17 @@ class Dialect {
43
43
  canAddIncrements() {
44
44
  return true;
45
45
  }
46
+ /**
47
+ * Get column type conversion SQL for complex type changes
48
+ * Override in specific dialects to handle database-specific conversions
49
+ * @param currentType - The current database data type
50
+ * @param targetType - The target Strapi type
51
+ * @returns Conversion SQL details or null if no special handling needed
52
+ */ getColumnTypeConversionSQL(// eslint-disable-next-line @typescript-eslint/no-unused-vars
53
+ currentType, // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
+ targetType) {
55
+ return null;
56
+ }
46
57
  constructor(db, client){
47
58
  this.schemaInspector = {};
48
59
  this.db = db;
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.js","sources":["../../src/dialects/dialect.ts"],"sourcesContent":["import type { Database } from '..';\nimport type { ForeignKey, Index, Schema } from '../schema';\n\nexport interface SchemaInspector {\n getSchema(): Promise<Schema>;\n getIndexes(tableName: string): Promise<Index[]>;\n getForeignKeys(tableName: string): Promise<ForeignKey[]>;\n getTables(): Promise<string[]>;\n}\n\nexport default class Dialect {\n db: Database;\n\n schemaInspector: SchemaInspector = {} as SchemaInspector;\n\n client: string;\n\n constructor(db: Database, client: string) {\n this.db = db;\n this.client = client;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n configure(conn?: any) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async initialize(_nativeConnection?: unknown) {\n // noop\n }\n\n getTables() {\n throw new Error('getTables not implemented for this dialect');\n }\n\n getSqlType(type: unknown) {\n return type;\n }\n\n canAlterConstraints() {\n return true;\n }\n\n usesForeignKeys() {\n return false;\n }\n\n useReturning() {\n return false;\n }\n\n supportsUnsigned() {\n return false;\n }\n\n supportsOperator(operator?: string): boolean;\n supportsOperator(): boolean {\n return true;\n }\n\n async startSchemaUpdate() {\n // noop\n }\n\n async endSchemaUpdate() {\n // noop\n }\n\n transformErrors(error: Error | { message: string }) {\n if (error instanceof Error) {\n throw error;\n }\n\n throw new Error(error.message);\n }\n\n canAddIncrements() {\n return true;\n }\n}\n"],"names":["Dialect","configure","conn","initialize","_nativeConnection","getTables","Error","getSqlType","type","canAlterConstraints","usesForeignKeys","useReturning","supportsUnsigned","supportsOperator","startSchemaUpdate","endSchemaUpdate","transformErrors","error","message","canAddIncrements","constructor","db","client","schemaInspector"],"mappings":";;AAUe,MAAMA,OAAAA,CAAAA;;IAanBC,SAAUC,CAAAA,IAAU,EAAE;;IAGtB,MAAMC,UAAAA,CAAWC,iBAA2B,EAAE;;AAE9C;IAEAC,SAAY,GAAA;AACV,QAAA,MAAM,IAAIC,KAAM,CAAA,4CAAA,CAAA;AAClB;AAEAC,IAAAA,UAAAA,CAAWC,IAAa,EAAE;QACxB,OAAOA,IAAAA;AACT;IAEAC,mBAAsB,GAAA;QACpB,OAAO,IAAA;AACT;IAEAC,eAAkB,GAAA;QAChB,OAAO,KAAA;AACT;IAEAC,YAAe,GAAA;QACb,OAAO,KAAA;AACT;IAEAC,gBAAmB,GAAA;QACjB,OAAO,KAAA;AACT;IAGAC,gBAA4B,GAAA;QAC1B,OAAO,IAAA;AACT;AAEA,IAAA,MAAMC,iBAAoB,GAAA;;AAE1B;AAEA,IAAA,MAAMC,eAAkB,GAAA;;AAExB;AAEAC,IAAAA,eAAAA,CAAgBC,KAAkC,EAAE;AAClD,QAAA,IAAIA,iBAAiBX,KAAO,EAAA;YAC1B,MAAMW,KAAAA;AACR;QAEA,MAAM,IAAIX,KAAMW,CAAAA,KAAAA,CAAMC,OAAO,CAAA;AAC/B;IAEAC,gBAAmB,GAAA;QACjB,OAAO,IAAA;AACT;IA5DAC,WAAYC,CAAAA,EAAY,EAAEC,MAAc,CAAE;AAJ1CC,QAAAA,IAAAA,CAAAA,eAAAA,GAAmC,EAAC;QAKlC,IAAI,CAACF,EAAE,GAAGA,EAAAA;QACV,IAAI,CAACC,MAAM,GAAGA,MAAAA;AAChB;AA0DF;;;;"}
1
+ {"version":3,"file":"dialect.js","sources":["../../src/dialects/dialect.ts"],"sourcesContent":["import type { Database } from '..';\nimport type { ForeignKey, Index, Schema } from '../schema';\n\nexport interface SchemaInspector {\n getSchema(): Promise<Schema>;\n getIndexes(tableName: string): Promise<Index[]>;\n getForeignKeys(tableName: string): Promise<ForeignKey[]>;\n getTables(): Promise<string[]>;\n}\n\nexport default class Dialect {\n db: Database;\n\n schemaInspector: SchemaInspector = {} as SchemaInspector;\n\n client: string;\n\n constructor(db: Database, client: string) {\n this.db = db;\n this.client = client;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n configure(conn?: any) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async initialize(_nativeConnection?: unknown) {\n // noop\n }\n\n getTables() {\n throw new Error('getTables not implemented for this dialect');\n }\n\n getSqlType(type: unknown) {\n return type;\n }\n\n canAlterConstraints() {\n return true;\n }\n\n usesForeignKeys() {\n return false;\n }\n\n useReturning() {\n return false;\n }\n\n supportsUnsigned() {\n return false;\n }\n\n supportsOperator(operator?: string): boolean;\n supportsOperator(): boolean {\n return true;\n }\n\n async startSchemaUpdate() {\n // noop\n }\n\n async endSchemaUpdate() {\n // noop\n }\n\n transformErrors(error: Error | { message: string }) {\n if (error instanceof Error) {\n throw error;\n }\n\n throw new Error(error.message);\n }\n\n canAddIncrements() {\n return true;\n }\n\n /**\n * Get column type conversion SQL for complex type changes\n * Override in specific dialects to handle database-specific conversions\n * @param currentType - The current database data type\n * @param targetType - The target Strapi type\n * @returns Conversion SQL details or null if no special handling needed\n */\n getColumnTypeConversionSQL(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n currentType: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n targetType: string\n ): { sql: string; typeClause: string; warning?: string } | null {\n return null;\n }\n}\n"],"names":["Dialect","configure","conn","initialize","_nativeConnection","getTables","Error","getSqlType","type","canAlterConstraints","usesForeignKeys","useReturning","supportsUnsigned","supportsOperator","startSchemaUpdate","endSchemaUpdate","transformErrors","error","message","canAddIncrements","getColumnTypeConversionSQL","currentType","targetType","constructor","db","client","schemaInspector"],"mappings":";;AAUe,MAAMA,OAAAA,CAAAA;;IAanBC,SAAUC,CAAAA,IAAU,EAAE;;IAGtB,MAAMC,UAAAA,CAAWC,iBAA2B,EAAE;;AAE9C;IAEAC,SAAY,GAAA;AACV,QAAA,MAAM,IAAIC,KAAM,CAAA,4CAAA,CAAA;AAClB;AAEAC,IAAAA,UAAAA,CAAWC,IAAa,EAAE;QACxB,OAAOA,IAAAA;AACT;IAEAC,mBAAsB,GAAA;QACpB,OAAO,IAAA;AACT;IAEAC,eAAkB,GAAA;QAChB,OAAO,KAAA;AACT;IAEAC,YAAe,GAAA;QACb,OAAO,KAAA;AACT;IAEAC,gBAAmB,GAAA;QACjB,OAAO,KAAA;AACT;IAGAC,gBAA4B,GAAA;QAC1B,OAAO,IAAA;AACT;AAEA,IAAA,MAAMC,iBAAoB,GAAA;;AAE1B;AAEA,IAAA,MAAMC,eAAkB,GAAA;;AAExB;AAEAC,IAAAA,eAAAA,CAAgBC,KAAkC,EAAE;AAClD,QAAA,IAAIA,iBAAiBX,KAAO,EAAA;YAC1B,MAAMW,KAAAA;AACR;QAEA,MAAM,IAAIX,KAAMW,CAAAA,KAAAA,CAAMC,OAAO,CAAA;AAC/B;IAEAC,gBAAmB,GAAA;QACjB,OAAO,IAAA;AACT;AAEA;;;;;;AAMC,MACDC;AAEEC,IAAAA,WAAmB;AAEnBC,IAAAA,UAAkB,EAC4C;QAC9D,OAAO,IAAA;AACT;IA5EAC,WAAYC,CAAAA,EAAY,EAAEC,MAAc,CAAE;AAJ1CC,QAAAA,IAAAA,CAAAA,eAAAA,GAAmC,EAAC;QAKlC,IAAI,CAACF,EAAE,GAAGA,EAAAA;QACV,IAAI,CAACC,MAAM,GAAGA,MAAAA;AAChB;AA0EF;;;;"}
@@ -41,6 +41,17 @@ class Dialect {
41
41
  canAddIncrements() {
42
42
  return true;
43
43
  }
44
+ /**
45
+ * Get column type conversion SQL for complex type changes
46
+ * Override in specific dialects to handle database-specific conversions
47
+ * @param currentType - The current database data type
48
+ * @param targetType - The target Strapi type
49
+ * @returns Conversion SQL details or null if no special handling needed
50
+ */ getColumnTypeConversionSQL(// eslint-disable-next-line @typescript-eslint/no-unused-vars
51
+ currentType, // eslint-disable-next-line @typescript-eslint/no-unused-vars
52
+ targetType) {
53
+ return null;
54
+ }
44
55
  constructor(db, client){
45
56
  this.schemaInspector = {};
46
57
  this.db = db;
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.mjs","sources":["../../src/dialects/dialect.ts"],"sourcesContent":["import type { Database } from '..';\nimport type { ForeignKey, Index, Schema } from '../schema';\n\nexport interface SchemaInspector {\n getSchema(): Promise<Schema>;\n getIndexes(tableName: string): Promise<Index[]>;\n getForeignKeys(tableName: string): Promise<ForeignKey[]>;\n getTables(): Promise<string[]>;\n}\n\nexport default class Dialect {\n db: Database;\n\n schemaInspector: SchemaInspector = {} as SchemaInspector;\n\n client: string;\n\n constructor(db: Database, client: string) {\n this.db = db;\n this.client = client;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n configure(conn?: any) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async initialize(_nativeConnection?: unknown) {\n // noop\n }\n\n getTables() {\n throw new Error('getTables not implemented for this dialect');\n }\n\n getSqlType(type: unknown) {\n return type;\n }\n\n canAlterConstraints() {\n return true;\n }\n\n usesForeignKeys() {\n return false;\n }\n\n useReturning() {\n return false;\n }\n\n supportsUnsigned() {\n return false;\n }\n\n supportsOperator(operator?: string): boolean;\n supportsOperator(): boolean {\n return true;\n }\n\n async startSchemaUpdate() {\n // noop\n }\n\n async endSchemaUpdate() {\n // noop\n }\n\n transformErrors(error: Error | { message: string }) {\n if (error instanceof Error) {\n throw error;\n }\n\n throw new Error(error.message);\n }\n\n canAddIncrements() {\n return true;\n }\n}\n"],"names":["Dialect","configure","conn","initialize","_nativeConnection","getTables","Error","getSqlType","type","canAlterConstraints","usesForeignKeys","useReturning","supportsUnsigned","supportsOperator","startSchemaUpdate","endSchemaUpdate","transformErrors","error","message","canAddIncrements","constructor","db","client","schemaInspector"],"mappings":"AAUe,MAAMA,OAAAA,CAAAA;;IAanBC,SAAUC,CAAAA,IAAU,EAAE;;IAGtB,MAAMC,UAAAA,CAAWC,iBAA2B,EAAE;;AAE9C;IAEAC,SAAY,GAAA;AACV,QAAA,MAAM,IAAIC,KAAM,CAAA,4CAAA,CAAA;AAClB;AAEAC,IAAAA,UAAAA,CAAWC,IAAa,EAAE;QACxB,OAAOA,IAAAA;AACT;IAEAC,mBAAsB,GAAA;QACpB,OAAO,IAAA;AACT;IAEAC,eAAkB,GAAA;QAChB,OAAO,KAAA;AACT;IAEAC,YAAe,GAAA;QACb,OAAO,KAAA;AACT;IAEAC,gBAAmB,GAAA;QACjB,OAAO,KAAA;AACT;IAGAC,gBAA4B,GAAA;QAC1B,OAAO,IAAA;AACT;AAEA,IAAA,MAAMC,iBAAoB,GAAA;;AAE1B;AAEA,IAAA,MAAMC,eAAkB,GAAA;;AAExB;AAEAC,IAAAA,eAAAA,CAAgBC,KAAkC,EAAE;AAClD,QAAA,IAAIA,iBAAiBX,KAAO,EAAA;YAC1B,MAAMW,KAAAA;AACR;QAEA,MAAM,IAAIX,KAAMW,CAAAA,KAAAA,CAAMC,OAAO,CAAA;AAC/B;IAEAC,gBAAmB,GAAA;QACjB,OAAO,IAAA;AACT;IA5DAC,WAAYC,CAAAA,EAAY,EAAEC,MAAc,CAAE;AAJ1CC,QAAAA,IAAAA,CAAAA,eAAAA,GAAmC,EAAC;QAKlC,IAAI,CAACF,EAAE,GAAGA,EAAAA;QACV,IAAI,CAACC,MAAM,GAAGA,MAAAA;AAChB;AA0DF;;;;"}
1
+ {"version":3,"file":"dialect.mjs","sources":["../../src/dialects/dialect.ts"],"sourcesContent":["import type { Database } from '..';\nimport type { ForeignKey, Index, Schema } from '../schema';\n\nexport interface SchemaInspector {\n getSchema(): Promise<Schema>;\n getIndexes(tableName: string): Promise<Index[]>;\n getForeignKeys(tableName: string): Promise<ForeignKey[]>;\n getTables(): Promise<string[]>;\n}\n\nexport default class Dialect {\n db: Database;\n\n schemaInspector: SchemaInspector = {} as SchemaInspector;\n\n client: string;\n\n constructor(db: Database, client: string) {\n this.db = db;\n this.client = client;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n configure(conn?: any) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async initialize(_nativeConnection?: unknown) {\n // noop\n }\n\n getTables() {\n throw new Error('getTables not implemented for this dialect');\n }\n\n getSqlType(type: unknown) {\n return type;\n }\n\n canAlterConstraints() {\n return true;\n }\n\n usesForeignKeys() {\n return false;\n }\n\n useReturning() {\n return false;\n }\n\n supportsUnsigned() {\n return false;\n }\n\n supportsOperator(operator?: string): boolean;\n supportsOperator(): boolean {\n return true;\n }\n\n async startSchemaUpdate() {\n // noop\n }\n\n async endSchemaUpdate() {\n // noop\n }\n\n transformErrors(error: Error | { message: string }) {\n if (error instanceof Error) {\n throw error;\n }\n\n throw new Error(error.message);\n }\n\n canAddIncrements() {\n return true;\n }\n\n /**\n * Get column type conversion SQL for complex type changes\n * Override in specific dialects to handle database-specific conversions\n * @param currentType - The current database data type\n * @param targetType - The target Strapi type\n * @returns Conversion SQL details or null if no special handling needed\n */\n getColumnTypeConversionSQL(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n currentType: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n targetType: string\n ): { sql: string; typeClause: string; warning?: string } | null {\n return null;\n }\n}\n"],"names":["Dialect","configure","conn","initialize","_nativeConnection","getTables","Error","getSqlType","type","canAlterConstraints","usesForeignKeys","useReturning","supportsUnsigned","supportsOperator","startSchemaUpdate","endSchemaUpdate","transformErrors","error","message","canAddIncrements","getColumnTypeConversionSQL","currentType","targetType","constructor","db","client","schemaInspector"],"mappings":"AAUe,MAAMA,OAAAA,CAAAA;;IAanBC,SAAUC,CAAAA,IAAU,EAAE;;IAGtB,MAAMC,UAAAA,CAAWC,iBAA2B,EAAE;;AAE9C;IAEAC,SAAY,GAAA;AACV,QAAA,MAAM,IAAIC,KAAM,CAAA,4CAAA,CAAA;AAClB;AAEAC,IAAAA,UAAAA,CAAWC,IAAa,EAAE;QACxB,OAAOA,IAAAA;AACT;IAEAC,mBAAsB,GAAA;QACpB,OAAO,IAAA;AACT;IAEAC,eAAkB,GAAA;QAChB,OAAO,KAAA;AACT;IAEAC,YAAe,GAAA;QACb,OAAO,KAAA;AACT;IAEAC,gBAAmB,GAAA;QACjB,OAAO,KAAA;AACT;IAGAC,gBAA4B,GAAA;QAC1B,OAAO,IAAA;AACT;AAEA,IAAA,MAAMC,iBAAoB,GAAA;;AAE1B;AAEA,IAAA,MAAMC,eAAkB,GAAA;;AAExB;AAEAC,IAAAA,eAAAA,CAAgBC,KAAkC,EAAE;AAClD,QAAA,IAAIA,iBAAiBX,KAAO,EAAA;YAC1B,MAAMW,KAAAA;AACR;QAEA,MAAM,IAAIX,KAAMW,CAAAA,KAAAA,CAAMC,OAAO,CAAA;AAC/B;IAEAC,gBAAmB,GAAA;QACjB,OAAO,IAAA;AACT;AAEA;;;;;;AAMC,MACDC;AAEEC,IAAAA,WAAmB;AAEnBC,IAAAA,UAAkB,EAC4C;QAC9D,OAAO,IAAA;AACT;IA5EAC,WAAYC,CAAAA,EAAY,EAAEC,MAAc,CAAE;AAJ1CC,QAAAA,IAAAA,CAAAA,eAAAA,GAAmC,EAAC;QAKlC,IAAI,CAACF,EAAE,GAAGA,EAAAA;QACV,IAAI,CAACC,MAAM,GAAGA,MAAAA;AAChB;AA0EF;;;;"}
@@ -10,5 +10,16 @@ export default class PostgresDialect extends Dialect {
10
10
  usesForeignKeys(): boolean;
11
11
  getSqlType(type: string): string;
12
12
  transformErrors(error: NodeJS.ErrnoException): void;
13
+ /**
14
+ * Get column type conversion SQL with USING clause for PostgreSQL
15
+ * @param currentType - The current PostgreSQL data type
16
+ * @param targetType - The target Strapi type
17
+ * @returns SQL string with USING clause or null if no special conversion needed
18
+ */
19
+ getColumnTypeConversionSQL(currentType: string, targetType: string): {
20
+ sql: string;
21
+ typeClause: string;
22
+ warning?: string;
23
+ } | null;
13
24
  }
14
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dialects/postgresql/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,yBAAyB,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,eAAe,EAAE,yBAAyB,CAAC;gBAE/B,EAAE,EAAE,QAAQ;IAMxB,YAAY;IAIN,UAAU,CAAC,gBAAgB,EAAE,OAAO;IA+B1C,eAAe;IAIf,UAAU,CAAC,IAAI,EAAE,MAAM;IAWvB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc;CAY7C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dialects/postgresql/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,yBAAyB,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,eAAe,EAAE,yBAAyB,CAAC;gBAE/B,EAAE,EAAE,QAAQ;IAMxB,YAAY;IAIN,UAAU,CAAC,gBAAgB,EAAE,OAAO;IA+B1C,eAAe;IAIf,UAAU,CAAC,IAAI,EAAE,MAAM;IAWvB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc;IAa5C;;;;;OAKG;IACH,0BAA0B,CACxB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB;QACD,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;CAuBT"}
@@ -52,6 +52,31 @@ class PostgresDialect extends dialect {
52
52
  }
53
53
  }
54
54
  }
55
+ /**
56
+ * Get column type conversion SQL with USING clause for PostgreSQL
57
+ * @param currentType - The current PostgreSQL data type
58
+ * @param targetType - The target Strapi type
59
+ * @returns SQL string with USING clause or null if no special conversion needed
60
+ */ getColumnTypeConversionSQL(currentType, targetType) {
61
+ // Time to datetime conversion
62
+ if (targetType === 'datetime' && currentType === 'time without time zone') {
63
+ return {
64
+ sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE timestamp(6) USING ('1970-01-01 ' || ??::text)::timestamp`,
65
+ typeClause: 'timestamp(6)',
66
+ warning: 'Time values will be converted to datetime with default date "1970-01-01". Original time values will be preserved.'
67
+ };
68
+ }
69
+ // Datetime to time conversion
70
+ if (targetType === 'time' && currentType === 'timestamp without time zone') {
71
+ return {
72
+ sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE time(3) USING ??::time`,
73
+ typeClause: 'time(3)',
74
+ warning: 'Datetime values will be converted to time only. Date information will be lost.'
75
+ };
76
+ }
77
+ // No special conversion needed
78
+ return null;
79
+ }
55
80
  constructor(db){
56
81
  super(db, 'postgres');
57
82
  this.schemaInspector = new schemaInspector(db);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/dialects/postgresql/index.ts"],"sourcesContent":["import * as errors from '../../errors';\nimport type { Database } from '../..';\nimport Dialect from '../dialect';\nimport PostgresqlSchemaInspector from './schema-inspector';\n\nexport default class PostgresDialect extends Dialect {\n schemaInspector: PostgresqlSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'postgres');\n\n this.schemaInspector = new PostgresqlSchemaInspector(db);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n // Don't cast DATE string to Date()\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.DATE,\n 'text',\n (v: unknown) => v\n );\n // Don't parse JSONB automatically\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.JSONB,\n 'text',\n (v: unknown) => v\n );\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.NUMERIC,\n 'text',\n parseFloat\n );\n\n // If we're using a schema, set the default path for all table names in queries to use that schema\n // Ideally we would rely on Knex config.searchPath to do this for us\n // However, createConnection must remain synchronous and if the user is using a connection function,\n // we do not know what their schema is until after the connection is resolved\n const schemaName = this.db.getSchemaName();\n if (schemaName) {\n await this.db.connection\n .raw(`SET search_path TO \"${schemaName}\"`)\n .connection(nativeConnection);\n }\n }\n\n usesForeignKeys() {\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.code) {\n case '23502': {\n throw new errors.NotNullError({\n column: 'column' in error ? `${error.column}` : undefined,\n });\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n}\n"],"names":["PostgresDialect","Dialect","useReturning","initialize","nativeConnection","db","connection","client","driver","types","setTypeParser","builtins","DATE","v","JSONB","NUMERIC","parseFloat","schemaName","getSchemaName","raw","usesForeignKeys","getSqlType","type","transformErrors","error","code","errors","column","undefined","constructor","schemaInspector","PostgresqlSchemaInspector"],"mappings":";;;;;;AAKe,MAAMA,eAAwBC,SAAAA,OAAAA,CAAAA;IAS3CC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;IAEA,MAAMC,UAAAA,CAAWC,gBAAyB,EAAE;;AAE1C,QAAA,IAAI,CAACC,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACC,IAAI,EACpD,MAAA,EACA,CAACC,CAAeA,GAAAA,CAAAA,CAAAA;;AAGlB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACG,KAAK,EACrD,MAAA,EACA,CAACD,CAAeA,GAAAA,CAAAA,CAAAA;AAElB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACI,OAAO,EACvD,MACAC,EAAAA,UAAAA,CAAAA;;;;;AAOF,QAAA,MAAMC,UAAa,GAAA,IAAI,CAACZ,EAAE,CAACa,aAAa,EAAA;AACxC,QAAA,IAAID,UAAY,EAAA;AACd,YAAA,MAAM,IAAI,CAACZ,EAAE,CAACC,UAAU,CACrBa,GAAG,CAAC,CAAC,oBAAoB,EAAEF,UAAW,CAAA,CAAC,CAAC,CAAA,CACxCX,UAAU,CAACF,gBAAAA,CAAAA;AAChB;AACF;IAEAgB,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AAEAC,IAAAA,UAAAA,CAAWC,IAAY,EAAE;QACvB,OAAQA,IAAAA;YACN,KAAK,WAAA;AAAa,gBAAA;oBAChB,OAAO,UAAA;AACT;AACA,YAAA;AAAS,gBAAA;oBACP,OAAOA,IAAAA;AACT;AACF;AACF;AAEAC,IAAAA,eAAAA,CAAgBC,KAA4B,EAAE;AAC5C,QAAA,OAAQA,MAAMC,IAAI;YAChB,KAAK,OAAA;AAAS,gBAAA;oBACZ,MAAM,IAAIC,OAAmB,CAAC;wBAC5BC,MAAQ,EAAA,QAAA,IAAYH,QAAQ,CAAC,EAAEA,MAAMG,MAAM,CAAC,CAAC,GAAGC;AAClD,qBAAA,CAAA;AACF;AACA,YAAA;AAAS,gBAAA;AACP,oBAAA,KAAK,CAACL,eAAgBC,CAAAA,KAAAA,CAAAA;AACxB;AACF;AACF;AAnEAK,IAAAA,WAAAA,CAAYxB,EAAY,CAAE;AACxB,QAAA,KAAK,CAACA,EAAI,EAAA,UAAA,CAAA;AAEV,QAAA,IAAI,CAACyB,eAAe,GAAG,IAAIC,eAA0B1B,CAAAA,EAAAA,CAAAA;AACvD;AAgEF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/dialects/postgresql/index.ts"],"sourcesContent":["import * as errors from '../../errors';\nimport type { Database } from '../..';\nimport Dialect from '../dialect';\nimport PostgresqlSchemaInspector from './schema-inspector';\n\nexport default class PostgresDialect extends Dialect {\n schemaInspector: PostgresqlSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'postgres');\n\n this.schemaInspector = new PostgresqlSchemaInspector(db);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n // Don't cast DATE string to Date()\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.DATE,\n 'text',\n (v: unknown) => v\n );\n // Don't parse JSONB automatically\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.JSONB,\n 'text',\n (v: unknown) => v\n );\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.NUMERIC,\n 'text',\n parseFloat\n );\n\n // If we're using a schema, set the default path for all table names in queries to use that schema\n // Ideally we would rely on Knex config.searchPath to do this for us\n // However, createConnection must remain synchronous and if the user is using a connection function,\n // we do not know what their schema is until after the connection is resolved\n const schemaName = this.db.getSchemaName();\n if (schemaName) {\n await this.db.connection\n .raw(`SET search_path TO \"${schemaName}\"`)\n .connection(nativeConnection);\n }\n }\n\n usesForeignKeys() {\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.code) {\n case '23502': {\n throw new errors.NotNullError({\n column: 'column' in error ? `${error.column}` : undefined,\n });\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n\n /**\n * Get column type conversion SQL with USING clause for PostgreSQL\n * @param currentType - The current PostgreSQL data type\n * @param targetType - The target Strapi type\n * @returns SQL string with USING clause or null if no special conversion needed\n */\n getColumnTypeConversionSQL(\n currentType: string,\n targetType: string\n ): {\n sql: string;\n typeClause: string;\n warning?: string;\n } | null {\n // Time to datetime conversion\n if (targetType === 'datetime' && currentType === 'time without time zone') {\n return {\n sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE timestamp(6) USING ('1970-01-01 ' || ??::text)::timestamp`,\n typeClause: 'timestamp(6)',\n warning:\n 'Time values will be converted to datetime with default date \"1970-01-01\". Original time values will be preserved.',\n };\n }\n\n // Datetime to time conversion\n if (targetType === 'time' && currentType === 'timestamp without time zone') {\n return {\n sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE time(3) USING ??::time`,\n typeClause: 'time(3)',\n warning: 'Datetime values will be converted to time only. Date information will be lost.',\n };\n }\n\n // No special conversion needed\n return null;\n }\n}\n"],"names":["PostgresDialect","Dialect","useReturning","initialize","nativeConnection","db","connection","client","driver","types","setTypeParser","builtins","DATE","v","JSONB","NUMERIC","parseFloat","schemaName","getSchemaName","raw","usesForeignKeys","getSqlType","type","transformErrors","error","code","errors","column","undefined","getColumnTypeConversionSQL","currentType","targetType","sql","typeClause","warning","constructor","schemaInspector","PostgresqlSchemaInspector"],"mappings":"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"}
@@ -50,6 +50,31 @@ class PostgresDialect extends Dialect {
50
50
  }
51
51
  }
52
52
  }
53
+ /**
54
+ * Get column type conversion SQL with USING clause for PostgreSQL
55
+ * @param currentType - The current PostgreSQL data type
56
+ * @param targetType - The target Strapi type
57
+ * @returns SQL string with USING clause or null if no special conversion needed
58
+ */ getColumnTypeConversionSQL(currentType, targetType) {
59
+ // Time to datetime conversion
60
+ if (targetType === 'datetime' && currentType === 'time without time zone') {
61
+ return {
62
+ sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE timestamp(6) USING ('1970-01-01 ' || ??::text)::timestamp`,
63
+ typeClause: 'timestamp(6)',
64
+ warning: 'Time values will be converted to datetime with default date "1970-01-01". Original time values will be preserved.'
65
+ };
66
+ }
67
+ // Datetime to time conversion
68
+ if (targetType === 'time' && currentType === 'timestamp without time zone') {
69
+ return {
70
+ sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE time(3) USING ??::time`,
71
+ typeClause: 'time(3)',
72
+ warning: 'Datetime values will be converted to time only. Date information will be lost.'
73
+ };
74
+ }
75
+ // No special conversion needed
76
+ return null;
77
+ }
53
78
  constructor(db){
54
79
  super(db, 'postgres');
55
80
  this.schemaInspector = new PostgresqlSchemaInspector(db);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/dialects/postgresql/index.ts"],"sourcesContent":["import * as errors from '../../errors';\nimport type { Database } from '../..';\nimport Dialect from '../dialect';\nimport PostgresqlSchemaInspector from './schema-inspector';\n\nexport default class PostgresDialect extends Dialect {\n schemaInspector: PostgresqlSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'postgres');\n\n this.schemaInspector = new PostgresqlSchemaInspector(db);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n // Don't cast DATE string to Date()\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.DATE,\n 'text',\n (v: unknown) => v\n );\n // Don't parse JSONB automatically\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.JSONB,\n 'text',\n (v: unknown) => v\n );\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.NUMERIC,\n 'text',\n parseFloat\n );\n\n // If we're using a schema, set the default path for all table names in queries to use that schema\n // Ideally we would rely on Knex config.searchPath to do this for us\n // However, createConnection must remain synchronous and if the user is using a connection function,\n // we do not know what their schema is until after the connection is resolved\n const schemaName = this.db.getSchemaName();\n if (schemaName) {\n await this.db.connection\n .raw(`SET search_path TO \"${schemaName}\"`)\n .connection(nativeConnection);\n }\n }\n\n usesForeignKeys() {\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.code) {\n case '23502': {\n throw new errors.NotNullError({\n column: 'column' in error ? `${error.column}` : undefined,\n });\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n}\n"],"names":["PostgresDialect","Dialect","useReturning","initialize","nativeConnection","db","connection","client","driver","types","setTypeParser","builtins","DATE","v","JSONB","NUMERIC","parseFloat","schemaName","getSchemaName","raw","usesForeignKeys","getSqlType","type","transformErrors","error","code","errors","column","undefined","constructor","schemaInspector","PostgresqlSchemaInspector"],"mappings":";;;;AAKe,MAAMA,eAAwBC,SAAAA,OAAAA,CAAAA;IAS3CC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;IAEA,MAAMC,UAAAA,CAAWC,gBAAyB,EAAE;;AAE1C,QAAA,IAAI,CAACC,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACC,IAAI,EACpD,MAAA,EACA,CAACC,CAAeA,GAAAA,CAAAA,CAAAA;;AAGlB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACG,KAAK,EACrD,MAAA,EACA,CAACD,CAAeA,GAAAA,CAAAA,CAAAA;AAElB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACI,OAAO,EACvD,MACAC,EAAAA,UAAAA,CAAAA;;;;;AAOF,QAAA,MAAMC,UAAa,GAAA,IAAI,CAACZ,EAAE,CAACa,aAAa,EAAA;AACxC,QAAA,IAAID,UAAY,EAAA;AACd,YAAA,MAAM,IAAI,CAACZ,EAAE,CAACC,UAAU,CACrBa,GAAG,CAAC,CAAC,oBAAoB,EAAEF,UAAW,CAAA,CAAC,CAAC,CAAA,CACxCX,UAAU,CAACF,gBAAAA,CAAAA;AAChB;AACF;IAEAgB,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AAEAC,IAAAA,UAAAA,CAAWC,IAAY,EAAE;QACvB,OAAQA,IAAAA;YACN,KAAK,WAAA;AAAa,gBAAA;oBAChB,OAAO,UAAA;AACT;AACA,YAAA;AAAS,gBAAA;oBACP,OAAOA,IAAAA;AACT;AACF;AACF;AAEAC,IAAAA,eAAAA,CAAgBC,KAA4B,EAAE;AAC5C,QAAA,OAAQA,MAAMC,IAAI;YAChB,KAAK,OAAA;AAAS,gBAAA;oBACZ,MAAM,IAAIC,YAAmB,CAAC;wBAC5BC,MAAQ,EAAA,QAAA,IAAYH,QAAQ,CAAC,EAAEA,MAAMG,MAAM,CAAC,CAAC,GAAGC;AAClD,qBAAA,CAAA;AACF;AACA,YAAA;AAAS,gBAAA;AACP,oBAAA,KAAK,CAACL,eAAgBC,CAAAA,KAAAA,CAAAA;AACxB;AACF;AACF;AAnEAK,IAAAA,WAAAA,CAAYxB,EAAY,CAAE;AACxB,QAAA,KAAK,CAACA,EAAI,EAAA,UAAA,CAAA;AAEV,QAAA,IAAI,CAACyB,eAAe,GAAG,IAAIC,yBAA0B1B,CAAAA,EAAAA,CAAAA;AACvD;AAgEF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/dialects/postgresql/index.ts"],"sourcesContent":["import * as errors from '../../errors';\nimport type { Database } from '../..';\nimport Dialect from '../dialect';\nimport PostgresqlSchemaInspector from './schema-inspector';\n\nexport default class PostgresDialect extends Dialect {\n schemaInspector: PostgresqlSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'postgres');\n\n this.schemaInspector = new PostgresqlSchemaInspector(db);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n // Don't cast DATE string to Date()\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.DATE,\n 'text',\n (v: unknown) => v\n );\n // Don't parse JSONB automatically\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.JSONB,\n 'text',\n (v: unknown) => v\n );\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.NUMERIC,\n 'text',\n parseFloat\n );\n\n // If we're using a schema, set the default path for all table names in queries to use that schema\n // Ideally we would rely on Knex config.searchPath to do this for us\n // However, createConnection must remain synchronous and if the user is using a connection function,\n // we do not know what their schema is until after the connection is resolved\n const schemaName = this.db.getSchemaName();\n if (schemaName) {\n await this.db.connection\n .raw(`SET search_path TO \"${schemaName}\"`)\n .connection(nativeConnection);\n }\n }\n\n usesForeignKeys() {\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.code) {\n case '23502': {\n throw new errors.NotNullError({\n column: 'column' in error ? `${error.column}` : undefined,\n });\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n\n /**\n * Get column type conversion SQL with USING clause for PostgreSQL\n * @param currentType - The current PostgreSQL data type\n * @param targetType - The target Strapi type\n * @returns SQL string with USING clause or null if no special conversion needed\n */\n getColumnTypeConversionSQL(\n currentType: string,\n targetType: string\n ): {\n sql: string;\n typeClause: string;\n warning?: string;\n } | null {\n // Time to datetime conversion\n if (targetType === 'datetime' && currentType === 'time without time zone') {\n return {\n sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE timestamp(6) USING ('1970-01-01 ' || ??::text)::timestamp`,\n typeClause: 'timestamp(6)',\n warning:\n 'Time values will be converted to datetime with default date \"1970-01-01\". Original time values will be preserved.',\n };\n }\n\n // Datetime to time conversion\n if (targetType === 'time' && currentType === 'timestamp without time zone') {\n return {\n sql: `ALTER TABLE ?? ALTER COLUMN ?? TYPE time(3) USING ??::time`,\n typeClause: 'time(3)',\n warning: 'Datetime values will be converted to time only. Date information will be lost.',\n };\n }\n\n // No special conversion needed\n return null;\n }\n}\n"],"names":["PostgresDialect","Dialect","useReturning","initialize","nativeConnection","db","connection","client","driver","types","setTypeParser","builtins","DATE","v","JSONB","NUMERIC","parseFloat","schemaName","getSchemaName","raw","usesForeignKeys","getSqlType","type","transformErrors","error","code","errors","column","undefined","getColumnTypeConversionSQL","currentType","targetType","sql","typeClause","warning","constructor","schemaInspector","PostgresqlSchemaInspector"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/schema/builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAwC,MAAM,SAAS,CAAC;6BAI3E,QAAQ;IAIxB;;;OAGG;0BACmB,KAAK,WAAW;IAItC;;OAEG;yBACwB,MAAM;IAMjC;;;;OAIG;yBACwB,KAAK,EAAE,OAAO,KAAK,WAAW;IAczD;;OAEG;uBACsB,MAAM;;;IAc/B;;;OAGG;6BAE4B,UAAU,CAAC,MAAM,CAAC;;AA9DrD,wBA6GE"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/schema/builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAwC,MAAM,SAAS,CAAC;6BAI3E,QAAQ;IAIxB;;;OAGG;0BACmB,KAAK,WAAW;IAItC;;OAEG;yBACwB,MAAM;IAMjC;;;;OAIG;yBACwB,KAAK,EAAE,OAAO,KAAK,WAAW;IAczD;;OAEG;uBACsB,MAAM;;;IAc/B;;;OAGG;6BAE4B,UAAU,CAAC,MAAM,CAAC;;AA9DrD,wBA8HE"}
@@ -60,11 +60,19 @@ var createSchemaBuilder = ((db)=>{
60
60
  await db.dialect.startSchemaUpdate();
61
61
  // Pre-fetch metadata for all updated tables
62
62
  const existingMetadata = {};
63
+ const columnTypes = {};
63
64
  for (const table of schemaDiff.tables.updated){
64
65
  existingMetadata[table.name] = {
65
66
  indexes: await db.dialect.schemaInspector.getIndexes(table.name),
66
67
  foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name)
67
68
  };
69
+ // Pre-fetch column types for PostgreSQL to avoid transaction timeouts
70
+ if (db.config.connection.client === 'postgres') {
71
+ columnTypes[table.name] = {};
72
+ for (const updatedColumn of table.columns.updated){
73
+ columnTypes[table.name][updatedColumn.name] = await helpers.getCurrentColumnType(table.name, updatedColumn.name);
74
+ }
75
+ }
68
76
  }
69
77
  await db.connection.transaction(async (trx)=>{
70
78
  await this.createTables(schemaDiff.tables.added, trx);
@@ -83,6 +91,8 @@ var createSchemaBuilder = ((db)=>{
83
91
  }
84
92
  for (const table of schemaDiff.tables.updated){
85
93
  debug(`Updating table: ${table.name}`);
94
+ // Handle special type conversions before standard alterations
95
+ await helpers.handleSpecialTypeConversions(trx, table, columnTypes[table.name] || {});
86
96
  // alter table
87
97
  const schemaBuilder = this.getSchemaBuilder(trx);
88
98
  const { indexes, foreignKeys } = existingMetadata[table.name];
@@ -341,12 +351,128 @@ const createHelpers = (db)=>{
341
351
  (table.foreignKeys || []).forEach((foreignKey)=>dropForeignKey(tableBuilder, foreignKey));
342
352
  });
343
353
  };
354
+ /**
355
+ * Get the current column type from the database
356
+ */ const getCurrentColumnType = async (tableName, columnName)=>{
357
+ try {
358
+ const schemaName = db.getSchemaName();
359
+ const result = await db.connection.raw(`
360
+ SELECT data_type
361
+ FROM information_schema.columns
362
+ WHERE table_name = ?
363
+ AND column_name = ?
364
+ ${schemaName ? 'AND table_schema = ?' : ''}
365
+ LIMIT 1
366
+ `, schemaName ? [
367
+ tableName,
368
+ columnName,
369
+ schemaName
370
+ ] : [
371
+ tableName,
372
+ columnName
373
+ ]);
374
+ return result.rows?.[0]?.data_type || null;
375
+ } catch (error) {
376
+ // Log error but don't fail the migration
377
+ debug(`Failed to get column type for ${tableName}.${columnName}: ${error instanceof Error ? error.message : String(error)}`);
378
+ return null;
379
+ }
380
+ };
381
+ /**
382
+ * Apply column properties after type conversion
383
+ */ const applyColumnProperties = async (trx, tableName, columnName, column)=>{
384
+ // Apply NOT NULL constraint
385
+ if (column.notNullable) {
386
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET NOT NULL`, [
387
+ tableName,
388
+ columnName
389
+ ]);
390
+ } else {
391
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? DROP NOT NULL`, [
392
+ tableName,
393
+ columnName
394
+ ]);
395
+ }
396
+ // Apply default value
397
+ if (column.defaultTo !== undefined) {
398
+ const [defaultValue, defaultOpts] = _.castArray(column.defaultTo);
399
+ if (_.prop('isRaw', defaultOpts)) {
400
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${defaultValue}`, [
401
+ tableName,
402
+ columnName
403
+ ]);
404
+ } else {
405
+ // PostgreSQL doesn't support parameterized SET DEFAULT, so we need to escape the value
406
+ const escapedDefault = typeof defaultValue === 'string' ? `'${defaultValue.replace(/'/g, "''")}'` : defaultValue;
407
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${escapedDefault}`, [
408
+ tableName,
409
+ columnName
410
+ ]);
411
+ }
412
+ }
413
+ };
414
+ /**
415
+ * Handle special type conversions that require custom SQL
416
+ */ const handleSpecialTypeConversions = async (trx, table, preloadedColumnTypes = {})=>{
417
+ // Only PostgreSQL needs special handling for now
418
+ if (db.config.connection.client !== 'postgres') {
419
+ return;
420
+ }
421
+ const conversionsToApply = [];
422
+ // Check each updated column for special type conversions
423
+ for (const updatedColumn of table.columns.updated){
424
+ const { name: columnName, object: column } = updatedColumn;
425
+ // Use pre-loaded column type if available, otherwise fetch it
426
+ const currentType = preloadedColumnTypes[columnName] ?? await getCurrentColumnType(table.name, columnName);
427
+ if (currentType) {
428
+ // Check if dialect has special conversion SQL
429
+ const conversionSQL = db.dialect.getColumnTypeConversionSQL(currentType, column.type);
430
+ if (conversionSQL) {
431
+ conversionsToApply.push({
432
+ column: updatedColumn,
433
+ sql: conversionSQL.sql,
434
+ params: [
435
+ table.name,
436
+ columnName,
437
+ columnName
438
+ ],
439
+ currentType,
440
+ targetType: column.type,
441
+ warning: conversionSQL.warning
442
+ });
443
+ }
444
+ }
445
+ }
446
+ // Apply conversions
447
+ for (const conversion of conversionsToApply){
448
+ const { column, sql, params, currentType, targetType, warning } = conversion;
449
+ // Log warning about type conversion
450
+ const warningMessage = warning || 'This conversion may result in data changes.';
451
+ db.logger.warn(`Database type conversion: "${table.name}.${column.name}" from "${currentType}" to "${targetType}". ${warningMessage}`);
452
+ debug(`Applying special type conversion for column ${column.name} on ${table.name}`);
453
+ debug(`Executing SQL: ${sql} with params: ${JSON.stringify(params)}`);
454
+ try {
455
+ // Execute the conversion using the transaction connection
456
+ await trx.raw(sql, params);
457
+ debug(`Successfully converted ${column.name} from ${currentType} to ${targetType}`);
458
+ } catch (conversionError) {
459
+ db.logger.error(`Failed to convert column ${column.name}: ${conversionError instanceof Error ? conversionError.message : String(conversionError)}`);
460
+ throw conversionError;
461
+ }
462
+ // Apply other column properties
463
+ await applyColumnProperties(trx, table.name, column.name, column.object);
464
+ // Remove from standard updates to prevent double processing
465
+ table.columns.updated = table.columns.updated.filter((col)=>col.name !== column.name);
466
+ }
467
+ };
344
468
  return {
345
469
  createTable,
346
470
  alterTable,
347
471
  dropTable,
348
472
  createTableForeignKeys,
349
- dropTableForeignKeys
473
+ dropTableForeignKeys,
474
+ handleSpecialTypeConversions,
475
+ getCurrentColumnType
350
476
  };
351
477
  };
352
478
 
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sources":["../../src/schema/builder.ts"],"sourcesContent":["import { isNil, prop, omit, castArray } from 'lodash/fp';\nimport createDebug from 'debug';\n\nimport type { Knex } from 'knex';\nimport type { Database } from '..';\nimport type { Schema, Table, SchemaDiff, TableDiff, ForeignKey, Index, Column } from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport default (db: Database) => {\n const helpers = createHelpers(db);\n\n return {\n /**\n * Returns a knex schema builder instance\n * @param {string} table - table name\n */\n getSchemaBuilder(trx: Knex.Transaction) {\n return db.getSchemaConnection(trx);\n },\n\n /**\n * Creates schema in DB\n */\n async createSchema(schema: Schema) {\n await db.connection.transaction(async (trx) => {\n await this.createTables(schema.tables, trx);\n });\n },\n\n /**\n * Creates a list of tables in a schema\n * @param {KnexInstance} trx\n * @param {Table[]} tables\n */\n async createTables(tables: Table[], trx: Knex.Transaction) {\n for (const table of tables) {\n debug(`Creating table: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTable(schemaBuilder, table);\n }\n\n // create FKs once all the tables exist\n for (const table of tables) {\n debug(`Creating table foreign keys: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTableForeignKeys(schemaBuilder, table);\n }\n },\n /**\n * Drops schema from DB\n */\n async dropSchema(schema: Schema, { dropDatabase = false } = {}) {\n if (dropDatabase) {\n // TODO: drop database & return as it will drop everything\n return;\n }\n\n await db.connection.transaction(async (trx) => {\n for (const table of schema.tables.reverse()) {\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n });\n },\n\n /**\n * Applies a schema diff update in the DB\n * @param {*} schemaDiff\n */\n // TODO: implement force option to disable removal in DB\n async updateSchema(schemaDiff: SchemaDiff['diff']) {\n const forceMigration = db.config.settings?.forceMigration;\n\n await db.dialect.startSchemaUpdate();\n\n // Pre-fetch metadata for all updated tables\n const existingMetadata: Record<string, { indexes: Index[]; foreignKeys: ForeignKey[] }> = {};\n for (const table of schemaDiff.tables.updated) {\n existingMetadata[table.name] = {\n indexes: await db.dialect.schemaInspector.getIndexes(table.name),\n foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name),\n };\n }\n\n await db.connection.transaction(async (trx) => {\n await this.createTables(schemaDiff.tables.added, trx);\n\n if (forceMigration) {\n // drop all delete table foreign keys then delete the tables\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table foreign keys: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTableForeignKeys(schemaBuilder, table);\n }\n\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n }\n\n for (const table of schemaDiff.tables.updated) {\n debug(`Updating table: ${table.name}`);\n // alter table\n const schemaBuilder = this.getSchemaBuilder(trx);\n\n const { indexes, foreignKeys } = existingMetadata[table.name];\n await helpers.alterTable(schemaBuilder, table, { indexes, foreignKeys });\n }\n });\n\n await db.dialect.endSchemaUpdate();\n },\n };\n};\n\nconst createHelpers = (db: Database) => {\n /**\n * Creates a foreign key on a table\n */\n const createForeignKey = (tableBuilder: Knex.TableBuilder, foreignKey: ForeignKey) => {\n const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;\n\n const constraint = tableBuilder\n .foreign(columns, name)\n .references(referencedColumns)\n .inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);\n\n if (onDelete) {\n constraint.onDelete(onDelete);\n }\n\n if (onUpdate) {\n constraint.onUpdate(onUpdate);\n }\n };\n\n /**\n * Drops a foreign key from a table\n */\n const dropForeignKey = (\n tableBuilder: Knex.TableBuilder,\n foreignKey: ForeignKey,\n existingForeignKeys?: ForeignKey[]\n ) => {\n const { name, columns } = foreignKey;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (\n existingForeignKeys &&\n !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)\n ) {\n debug(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);\n return;\n }\n\n tableBuilder.dropForeign(columns, name);\n };\n\n /**\n * Creates an index on a table\n */\n const createIndex = (tableBuilder: Knex.TableBuilder, index: Index) => {\n const { type, columns, name } = index;\n\n switch (type) {\n case 'primary': {\n return tableBuilder.primary(columns, { constraintName: name });\n }\n case 'unique': {\n return tableBuilder.unique(columns, { indexName: name });\n }\n default: {\n return tableBuilder.index(columns, name, type);\n }\n }\n };\n\n /**\n * Drops an index from table\n * @param {Knex.TableBuilder} tableBuilder\n * @param {Index} index\n */\n const dropIndex = (tableBuilder: Knex.TableBuilder, index: Index, existingIndexes?: Index[]) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n const { type, columns, name } = index;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {\n debug(`Index ${index.name} not found in existingIndexes. Skipping drop.`);\n return;\n }\n\n switch (type) {\n case 'primary': {\n return tableBuilder.dropPrimary(name);\n }\n case 'unique': {\n return tableBuilder.dropUnique(columns, name);\n }\n default: {\n return tableBuilder.dropIndex(columns, name);\n }\n }\n };\n\n /**\n * Creates a column in a table\n */\n const createColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n const { type, name, args = [], defaultTo, unsigned, notNullable } = column;\n\n const col = (tableBuilder[type as keyof Knex.TableBuilder] as any)(name, ...args);\n\n if (unsigned === true) {\n col.unsigned();\n }\n\n if (!isNil(defaultTo)) {\n const [value, opts] = castArray(defaultTo);\n\n if (prop('isRaw', opts)) {\n col.defaultTo(db.connection.raw(value), omit('isRaw', opts));\n } else {\n col.defaultTo(value, opts);\n }\n }\n\n if (notNullable === true) {\n col.notNullable();\n } else {\n col.nullable();\n }\n\n return col;\n };\n\n /**\n * Drops a column from a table\n */\n const dropColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n return tableBuilder.dropColumn(column.name);\n };\n\n /**\n * Creates a table in a database\n */\n const createTable = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n await schemaBuilder.createTable(table.name, (tableBuilder) => {\n // columns\n (table.columns || []).forEach((column) => createColumn(tableBuilder, column));\n\n // indexes\n (table.indexes || []).forEach((index) => createIndex(tableBuilder, index));\n\n // foreign keys\n\n if (!db.dialect.canAlterConstraints()) {\n (table.foreignKeys || []).forEach((foreignKey) =>\n createForeignKey(tableBuilder, foreignKey)\n );\n }\n });\n };\n\n /**\n * Alters a database table by applying a set of schema changes including updates to columns, indexes, and foreign keys.\n * This function ensures proper ordering of operations to avoid conflicts (e.g., foreign key errors) and handles\n * MySQL-specific quirks where dropping a foreign key can implicitly drop an associated index.\n *\n * @param {Knex.SchemaBuilder} schemaBuilder - Knex SchemaBuilder instance to perform schema operations.\n * @param {TableDiff['diff']} table - A diff object representing the schema changes to be applied to the table.\n * @param {{ indexes: Index[]; foreignKeys: ForeignKey[] }} existingMetadata - Metadata about existing indexes and\n * foreign keys in the table. Used to ensure safe operations and avoid unnecessary modifications.\n * - indexes: Array of existing index definitions.\n * - foreignKeys: Array of existing foreign key definitions.\n */\n const alterTable = async (\n schemaBuilder: Knex.SchemaBuilder,\n table: TableDiff['diff'],\n existingMetadata: { indexes: Index[]; foreignKeys: ForeignKey[] } = {\n indexes: [],\n foreignKeys: [],\n }\n ) => {\n let existingIndexes = [...existingMetadata.indexes];\n const existingForeignKeys = [...existingMetadata.foreignKeys];\n\n // Track dropped foreign keys\n const droppedForeignKeyNames: string[] = [];\n\n await schemaBuilder.alterTable(table.name, async (tableBuilder) => {\n // Drop foreign keys first to avoid foreign key errors in the following steps\n for (const removedForeignKey of table.foreignKeys.removed) {\n debug(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);\n\n droppedForeignKeyNames.push(removedForeignKey.name);\n }\n\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);\n\n droppedForeignKeyNames.push(updatedForeignKey.object.name);\n }\n\n // In MySQL, dropping a foreign key can also implicitly drop an index with the same name\n // Remove dropped foreign keys from existingIndexes for MySQL\n if (db.config.connection.client === 'mysql') {\n existingIndexes = existingIndexes.filter(\n (index) => !droppedForeignKeyNames.includes(index.name)\n );\n }\n\n for (const removedIndex of table.indexes.removed) {\n debug(`Dropping index ${removedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, removedIndex, existingIndexes);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Dropping updated index ${updatedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, updatedIndex.object, existingIndexes);\n }\n\n // Drop columns after FKs have been removed to avoid FK errors\n for (const removedColumn of table.columns.removed) {\n debug(`Dropping column ${removedColumn.name} on ${table.name}`);\n dropColumn(tableBuilder, removedColumn);\n }\n\n // Update existing columns\n for (const updatedColumn of table.columns.updated) {\n debug(`Updating column ${updatedColumn.name} on ${table.name}`);\n\n const { object } = updatedColumn;\n\n if (object.type === 'increments') {\n createColumn(tableBuilder, { ...object, type: 'integer' }).alter();\n } else {\n createColumn(tableBuilder, object).alter();\n }\n }\n\n // Add any new columns\n for (const addedColumn of table.columns.added) {\n debug(`Creating column ${addedColumn.name} on ${table.name}`);\n\n if (addedColumn.type === 'increments' && !db.dialect.canAddIncrements()) {\n tableBuilder.integer(addedColumn.name).unsigned();\n tableBuilder.primary([addedColumn.name]);\n } else {\n createColumn(tableBuilder, addedColumn);\n }\n }\n\n // once the columns have all been updated, we can create indexes again\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, updatedForeignKey.object);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Recreating updated index ${updatedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, updatedIndex.object);\n }\n\n for (const addedForeignKey of table.foreignKeys.added) {\n debug(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, addedForeignKey);\n }\n\n for (const addedIndex of table.indexes.added) {\n debug(`Creating index ${addedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, addedIndex);\n }\n });\n };\n\n /**\n * Drops a table from a database\n */\n const dropTable = (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n return schemaBuilder.dropTableIfExists(table.name);\n };\n\n /**\n * Creates a table foreign keys constraints\n */\n const createTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => createForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Drops a table foreign keys constraints\n */\n const dropTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => dropForeignKey(tableBuilder, foreignKey));\n });\n };\n\n return {\n createTable,\n alterTable,\n dropTable,\n createTableForeignKeys,\n dropTableForeignKeys,\n };\n};\n"],"names":["debug","createDebug","db","helpers","createHelpers","getSchemaBuilder","trx","getSchemaConnection","createSchema","schema","connection","transaction","createTables","tables","table","name","schemaBuilder","createTable","createTableForeignKeys","dropSchema","dropDatabase","reverse","dropTable","updateSchema","schemaDiff","forceMigration","config","settings","dialect","startSchemaUpdate","existingMetadata","updated","indexes","schemaInspector","getIndexes","foreignKeys","getForeignKeys","added","removed","dropTableForeignKeys","alterTable","endSchemaUpdate","createForeignKey","tableBuilder","foreignKey","columns","referencedColumns","referencedTable","onDelete","onUpdate","constraint","foreign","references","inTable","getSchemaName","dropForeignKey","existingForeignKeys","some","existingIndex","dropForeign","createIndex","index","type","primary","constraintName","unique","indexName","dropIndex","existingIndexes","dropPrimary","dropUnique","createColumn","column","args","defaultTo","unsigned","notNullable","col","isNil","value","opts","castArray","prop","raw","omit","nullable","dropColumn","forEach","canAlterConstraints","droppedForeignKeyNames","removedForeignKey","push","updatedForeignKey","object","client","filter","includes","removedIndex","updatedIndex","removedColumn","updatedColumn","alter","addedColumn","canAddIncrements","integer","addedForeignKey","addedIndex","dropTableIfExists"],"mappings":"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"}
1
+ {"version":3,"file":"builder.js","sources":["../../src/schema/builder.ts"],"sourcesContent":["import { isNil, prop, omit, castArray } from 'lodash/fp';\nimport createDebug from 'debug';\n\nimport type { Knex } from 'knex';\nimport type { Database } from '..';\nimport type { Schema, Table, SchemaDiff, TableDiff, ForeignKey, Index, Column } from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport default (db: Database) => {\n const helpers = createHelpers(db);\n\n return {\n /**\n * Returns a knex schema builder instance\n * @param {string} table - table name\n */\n getSchemaBuilder(trx: Knex.Transaction) {\n return db.getSchemaConnection(trx);\n },\n\n /**\n * Creates schema in DB\n */\n async createSchema(schema: Schema) {\n await db.connection.transaction(async (trx) => {\n await this.createTables(schema.tables, trx);\n });\n },\n\n /**\n * Creates a list of tables in a schema\n * @param {KnexInstance} trx\n * @param {Table[]} tables\n */\n async createTables(tables: Table[], trx: Knex.Transaction) {\n for (const table of tables) {\n debug(`Creating table: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTable(schemaBuilder, table);\n }\n\n // create FKs once all the tables exist\n for (const table of tables) {\n debug(`Creating table foreign keys: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTableForeignKeys(schemaBuilder, table);\n }\n },\n /**\n * Drops schema from DB\n */\n async dropSchema(schema: Schema, { dropDatabase = false } = {}) {\n if (dropDatabase) {\n // TODO: drop database & return as it will drop everything\n return;\n }\n\n await db.connection.transaction(async (trx) => {\n for (const table of schema.tables.reverse()) {\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n });\n },\n\n /**\n * Applies a schema diff update in the DB\n * @param {*} schemaDiff\n */\n // TODO: implement force option to disable removal in DB\n async updateSchema(schemaDiff: SchemaDiff['diff']) {\n const forceMigration = db.config.settings?.forceMigration;\n\n await db.dialect.startSchemaUpdate();\n\n // Pre-fetch metadata for all updated tables\n const existingMetadata: Record<string, { indexes: Index[]; foreignKeys: ForeignKey[] }> = {};\n const columnTypes: Record<string, Record<string, string | null>> = {};\n\n for (const table of schemaDiff.tables.updated) {\n existingMetadata[table.name] = {\n indexes: await db.dialect.schemaInspector.getIndexes(table.name),\n foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name),\n };\n\n // Pre-fetch column types for PostgreSQL to avoid transaction timeouts\n if (db.config.connection.client === 'postgres') {\n columnTypes[table.name] = {};\n for (const updatedColumn of table.columns.updated) {\n columnTypes[table.name][updatedColumn.name] = await helpers.getCurrentColumnType(\n table.name,\n updatedColumn.name\n );\n }\n }\n }\n\n await db.connection.transaction(async (trx) => {\n await this.createTables(schemaDiff.tables.added, trx);\n\n if (forceMigration) {\n // drop all delete table foreign keys then delete the tables\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table foreign keys: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTableForeignKeys(schemaBuilder, table);\n }\n\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n }\n\n for (const table of schemaDiff.tables.updated) {\n debug(`Updating table: ${table.name}`);\n\n // Handle special type conversions before standard alterations\n await helpers.handleSpecialTypeConversions(trx, table, columnTypes[table.name] || {});\n\n // alter table\n const schemaBuilder = this.getSchemaBuilder(trx);\n\n const { indexes, foreignKeys } = existingMetadata[table.name];\n await helpers.alterTable(schemaBuilder, table, { indexes, foreignKeys });\n }\n });\n\n await db.dialect.endSchemaUpdate();\n },\n };\n};\n\nconst createHelpers = (db: Database) => {\n /**\n * Creates a foreign key on a table\n */\n const createForeignKey = (tableBuilder: Knex.TableBuilder, foreignKey: ForeignKey) => {\n const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;\n\n const constraint = tableBuilder\n .foreign(columns, name)\n .references(referencedColumns)\n .inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);\n\n if (onDelete) {\n constraint.onDelete(onDelete);\n }\n\n if (onUpdate) {\n constraint.onUpdate(onUpdate);\n }\n };\n\n /**\n * Drops a foreign key from a table\n */\n const dropForeignKey = (\n tableBuilder: Knex.TableBuilder,\n foreignKey: ForeignKey,\n existingForeignKeys?: ForeignKey[]\n ) => {\n const { name, columns } = foreignKey;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (\n existingForeignKeys &&\n !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)\n ) {\n debug(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);\n return;\n }\n\n tableBuilder.dropForeign(columns, name);\n };\n\n /**\n * Creates an index on a table\n */\n const createIndex = (tableBuilder: Knex.TableBuilder, index: Index) => {\n const { type, columns, name } = index;\n\n switch (type) {\n case 'primary': {\n return tableBuilder.primary(columns, { constraintName: name });\n }\n case 'unique': {\n return tableBuilder.unique(columns, { indexName: name });\n }\n default: {\n return tableBuilder.index(columns, name, type);\n }\n }\n };\n\n /**\n * Drops an index from table\n * @param {Knex.TableBuilder} tableBuilder\n * @param {Index} index\n */\n const dropIndex = (tableBuilder: Knex.TableBuilder, index: Index, existingIndexes?: Index[]) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n const { type, columns, name } = index;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {\n debug(`Index ${index.name} not found in existingIndexes. Skipping drop.`);\n return;\n }\n\n switch (type) {\n case 'primary': {\n return tableBuilder.dropPrimary(name);\n }\n case 'unique': {\n return tableBuilder.dropUnique(columns, name);\n }\n default: {\n return tableBuilder.dropIndex(columns, name);\n }\n }\n };\n\n /**\n * Creates a column in a table\n */\n const createColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n const { type, name, args = [], defaultTo, unsigned, notNullable } = column;\n\n const col = (tableBuilder[type as keyof Knex.TableBuilder] as any)(name, ...args);\n\n if (unsigned === true) {\n col.unsigned();\n }\n\n if (!isNil(defaultTo)) {\n const [value, opts] = castArray(defaultTo);\n\n if (prop('isRaw', opts)) {\n col.defaultTo(db.connection.raw(value), omit('isRaw', opts));\n } else {\n col.defaultTo(value, opts);\n }\n }\n\n if (notNullable === true) {\n col.notNullable();\n } else {\n col.nullable();\n }\n\n return col;\n };\n\n /**\n * Drops a column from a table\n */\n const dropColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n return tableBuilder.dropColumn(column.name);\n };\n\n /**\n * Creates a table in a database\n */\n const createTable = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n await schemaBuilder.createTable(table.name, (tableBuilder) => {\n // columns\n (table.columns || []).forEach((column) => createColumn(tableBuilder, column));\n\n // indexes\n (table.indexes || []).forEach((index) => createIndex(tableBuilder, index));\n\n // foreign keys\n\n if (!db.dialect.canAlterConstraints()) {\n (table.foreignKeys || []).forEach((foreignKey) =>\n createForeignKey(tableBuilder, foreignKey)\n );\n }\n });\n };\n\n /**\n * Alters a database table by applying a set of schema changes including updates to columns, indexes, and foreign keys.\n * This function ensures proper ordering of operations to avoid conflicts (e.g., foreign key errors) and handles\n * MySQL-specific quirks where dropping a foreign key can implicitly drop an associated index.\n *\n * @param {Knex.SchemaBuilder} schemaBuilder - Knex SchemaBuilder instance to perform schema operations.\n * @param {TableDiff['diff']} table - A diff object representing the schema changes to be applied to the table.\n * @param {{ indexes: Index[]; foreignKeys: ForeignKey[] }} existingMetadata - Metadata about existing indexes and\n * foreign keys in the table. Used to ensure safe operations and avoid unnecessary modifications.\n * - indexes: Array of existing index definitions.\n * - foreignKeys: Array of existing foreign key definitions.\n */\n const alterTable = async (\n schemaBuilder: Knex.SchemaBuilder,\n table: TableDiff['diff'],\n existingMetadata: { indexes: Index[]; foreignKeys: ForeignKey[] } = {\n indexes: [],\n foreignKeys: [],\n }\n ) => {\n let existingIndexes = [...existingMetadata.indexes];\n const existingForeignKeys = [...existingMetadata.foreignKeys];\n\n // Track dropped foreign keys\n const droppedForeignKeyNames: string[] = [];\n\n await schemaBuilder.alterTable(table.name, async (tableBuilder) => {\n // Drop foreign keys first to avoid foreign key errors in the following steps\n for (const removedForeignKey of table.foreignKeys.removed) {\n debug(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);\n\n droppedForeignKeyNames.push(removedForeignKey.name);\n }\n\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);\n\n droppedForeignKeyNames.push(updatedForeignKey.object.name);\n }\n\n // In MySQL, dropping a foreign key can also implicitly drop an index with the same name\n // Remove dropped foreign keys from existingIndexes for MySQL\n if (db.config.connection.client === 'mysql') {\n existingIndexes = existingIndexes.filter(\n (index) => !droppedForeignKeyNames.includes(index.name)\n );\n }\n\n for (const removedIndex of table.indexes.removed) {\n debug(`Dropping index ${removedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, removedIndex, existingIndexes);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Dropping updated index ${updatedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, updatedIndex.object, existingIndexes);\n }\n\n // Drop columns after FKs have been removed to avoid FK errors\n for (const removedColumn of table.columns.removed) {\n debug(`Dropping column ${removedColumn.name} on ${table.name}`);\n dropColumn(tableBuilder, removedColumn);\n }\n\n // Update existing columns\n for (const updatedColumn of table.columns.updated) {\n debug(`Updating column ${updatedColumn.name} on ${table.name}`);\n\n const { object } = updatedColumn;\n\n if (object.type === 'increments') {\n createColumn(tableBuilder, { ...object, type: 'integer' }).alter();\n } else {\n createColumn(tableBuilder, object).alter();\n }\n }\n\n // Add any new columns\n for (const addedColumn of table.columns.added) {\n debug(`Creating column ${addedColumn.name} on ${table.name}`);\n\n if (addedColumn.type === 'increments' && !db.dialect.canAddIncrements()) {\n tableBuilder.integer(addedColumn.name).unsigned();\n tableBuilder.primary([addedColumn.name]);\n } else {\n createColumn(tableBuilder, addedColumn);\n }\n }\n\n // once the columns have all been updated, we can create indexes again\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, updatedForeignKey.object);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Recreating updated index ${updatedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, updatedIndex.object);\n }\n\n for (const addedForeignKey of table.foreignKeys.added) {\n debug(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, addedForeignKey);\n }\n\n for (const addedIndex of table.indexes.added) {\n debug(`Creating index ${addedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, addedIndex);\n }\n });\n };\n\n /**\n * Drops a table from a database\n */\n const dropTable = (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n return schemaBuilder.dropTableIfExists(table.name);\n };\n\n /**\n * Creates a table foreign keys constraints\n */\n const createTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => createForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Drops a table foreign keys constraints\n */\n const dropTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => dropForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Get the current column type from the database\n */\n const getCurrentColumnType = async (\n tableName: string,\n columnName: string\n ): Promise<string | null> => {\n try {\n const schemaName = db.getSchemaName();\n const result = await db.connection.raw(\n `\n SELECT data_type \n FROM information_schema.columns \n WHERE table_name = ? \n AND column_name = ?\n ${schemaName ? 'AND table_schema = ?' : ''}\n LIMIT 1\n `,\n schemaName ? [tableName, columnName, schemaName] : [tableName, columnName]\n );\n\n return result.rows?.[0]?.data_type || null;\n } catch (error) {\n // Log error but don't fail the migration\n debug(\n `Failed to get column type for ${tableName}.${columnName}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n };\n\n /**\n * Apply column properties after type conversion\n */\n const applyColumnProperties = async (\n trx: Knex.Transaction,\n tableName: string,\n columnName: string,\n column: Column\n ) => {\n // Apply NOT NULL constraint\n if (column.notNullable) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET NOT NULL`, [tableName, columnName]);\n } else {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? DROP NOT NULL`, [tableName, columnName]);\n }\n\n // Apply default value\n if (column.defaultTo !== undefined) {\n const [defaultValue, defaultOpts] = castArray(column.defaultTo);\n if (prop('isRaw', defaultOpts)) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${defaultValue}`, [\n tableName,\n columnName,\n ]);\n } else {\n // PostgreSQL doesn't support parameterized SET DEFAULT, so we need to escape the value\n const escapedDefault =\n typeof defaultValue === 'string' ? `'${defaultValue.replace(/'/g, \"''\")}'` : defaultValue;\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${escapedDefault}`, [\n tableName,\n columnName,\n ]);\n }\n }\n };\n\n /**\n * Handle special type conversions that require custom SQL\n */\n const handleSpecialTypeConversions = async (\n trx: Knex.Transaction,\n table: TableDiff['diff'],\n preloadedColumnTypes: Record<string, string | null> = {}\n ) => {\n // Only PostgreSQL needs special handling for now\n if (db.config.connection.client !== 'postgres') {\n return;\n }\n\n const conversionsToApply = [];\n\n // Check each updated column for special type conversions\n for (const updatedColumn of table.columns.updated) {\n const { name: columnName, object: column } = updatedColumn;\n\n // Use pre-loaded column type if available, otherwise fetch it\n const currentType =\n preloadedColumnTypes[columnName] ?? (await getCurrentColumnType(table.name, columnName));\n\n if (currentType) {\n // Check if dialect has special conversion SQL\n const conversionSQL = db.dialect.getColumnTypeConversionSQL(currentType, column.type);\n\n if (conversionSQL) {\n conversionsToApply.push({\n column: updatedColumn,\n sql: conversionSQL.sql,\n params: [table.name, columnName, columnName],\n currentType,\n targetType: column.type,\n warning: conversionSQL.warning,\n });\n }\n }\n }\n\n // Apply conversions\n for (const conversion of conversionsToApply) {\n const { column, sql, params, currentType, targetType, warning } = conversion;\n\n // Log warning about type conversion\n const warningMessage = warning || 'This conversion may result in data changes.';\n db.logger.warn(\n `Database type conversion: \"${table.name}.${column.name}\" from \"${currentType}\" to \"${targetType}\". ${warningMessage}`\n );\n\n debug(`Applying special type conversion for column ${column.name} on ${table.name}`);\n debug(`Executing SQL: ${sql} with params: ${JSON.stringify(params)}`);\n\n try {\n // Execute the conversion using the transaction connection\n await trx.raw(sql, params);\n debug(`Successfully converted ${column.name} from ${currentType} to ${targetType}`);\n } catch (conversionError) {\n db.logger.error(\n `Failed to convert column ${column.name}: ${conversionError instanceof Error ? conversionError.message : String(conversionError)}`\n );\n throw conversionError;\n }\n\n // Apply other column properties\n await applyColumnProperties(trx, table.name, column.name, column.object);\n\n // Remove from standard updates to prevent double processing\n table.columns.updated = table.columns.updated.filter((col) => col.name !== column.name);\n }\n };\n\n return {\n createTable,\n alterTable,\n dropTable,\n createTableForeignKeys,\n dropTableForeignKeys,\n handleSpecialTypeConversions,\n getCurrentColumnType,\n };\n};\n"],"names":["debug","createDebug","db","helpers","createHelpers","getSchemaBuilder","trx","getSchemaConnection","createSchema","schema","connection","transaction","createTables","tables","table","name","schemaBuilder","createTable","createTableForeignKeys","dropSchema","dropDatabase","reverse","dropTable","updateSchema","schemaDiff","forceMigration","config","settings","dialect","startSchemaUpdate","existingMetadata","columnTypes","updated","indexes","schemaInspector","getIndexes","foreignKeys","getForeignKeys","client","updatedColumn","columns","getCurrentColumnType","added","removed","dropTableForeignKeys","handleSpecialTypeConversions","alterTable","endSchemaUpdate","createForeignKey","tableBuilder","foreignKey","referencedColumns","referencedTable","onDelete","onUpdate","constraint","foreign","references","inTable","getSchemaName","dropForeignKey","existingForeignKeys","some","existingIndex","dropForeign","createIndex","index","type","primary","constraintName","unique","indexName","dropIndex","existingIndexes","dropPrimary","dropUnique","createColumn","column","args","defaultTo","unsigned","notNullable","col","isNil","value","opts","castArray","prop","raw","omit","nullable","dropColumn","forEach","canAlterConstraints","droppedForeignKeyNames","removedForeignKey","push","updatedForeignKey","object","filter","includes","removedIndex","updatedIndex","removedColumn","alter","addedColumn","canAddIncrements","integer","addedForeignKey","addedIndex","dropTableIfExists","tableName","columnName","schemaName","result","rows","data_type","error","Error","message","String","applyColumnProperties","undefined","defaultValue","defaultOpts","escapedDefault","replace","preloadedColumnTypes","conversionsToApply","currentType","conversionSQL","getColumnTypeConversionSQL","sql","params","targetType","warning","conversion","warningMessage","logger","warn","JSON","stringify","conversionError"],"mappings":"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"}
@@ -58,11 +58,19 @@ var createSchemaBuilder = ((db)=>{
58
58
  await db.dialect.startSchemaUpdate();
59
59
  // Pre-fetch metadata for all updated tables
60
60
  const existingMetadata = {};
61
+ const columnTypes = {};
61
62
  for (const table of schemaDiff.tables.updated){
62
63
  existingMetadata[table.name] = {
63
64
  indexes: await db.dialect.schemaInspector.getIndexes(table.name),
64
65
  foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name)
65
66
  };
67
+ // Pre-fetch column types for PostgreSQL to avoid transaction timeouts
68
+ if (db.config.connection.client === 'postgres') {
69
+ columnTypes[table.name] = {};
70
+ for (const updatedColumn of table.columns.updated){
71
+ columnTypes[table.name][updatedColumn.name] = await helpers.getCurrentColumnType(table.name, updatedColumn.name);
72
+ }
73
+ }
66
74
  }
67
75
  await db.connection.transaction(async (trx)=>{
68
76
  await this.createTables(schemaDiff.tables.added, trx);
@@ -81,6 +89,8 @@ var createSchemaBuilder = ((db)=>{
81
89
  }
82
90
  for (const table of schemaDiff.tables.updated){
83
91
  debug(`Updating table: ${table.name}`);
92
+ // Handle special type conversions before standard alterations
93
+ await helpers.handleSpecialTypeConversions(trx, table, columnTypes[table.name] || {});
84
94
  // alter table
85
95
  const schemaBuilder = this.getSchemaBuilder(trx);
86
96
  const { indexes, foreignKeys } = existingMetadata[table.name];
@@ -339,12 +349,128 @@ const createHelpers = (db)=>{
339
349
  (table.foreignKeys || []).forEach((foreignKey)=>dropForeignKey(tableBuilder, foreignKey));
340
350
  });
341
351
  };
352
+ /**
353
+ * Get the current column type from the database
354
+ */ const getCurrentColumnType = async (tableName, columnName)=>{
355
+ try {
356
+ const schemaName = db.getSchemaName();
357
+ const result = await db.connection.raw(`
358
+ SELECT data_type
359
+ FROM information_schema.columns
360
+ WHERE table_name = ?
361
+ AND column_name = ?
362
+ ${schemaName ? 'AND table_schema = ?' : ''}
363
+ LIMIT 1
364
+ `, schemaName ? [
365
+ tableName,
366
+ columnName,
367
+ schemaName
368
+ ] : [
369
+ tableName,
370
+ columnName
371
+ ]);
372
+ return result.rows?.[0]?.data_type || null;
373
+ } catch (error) {
374
+ // Log error but don't fail the migration
375
+ debug(`Failed to get column type for ${tableName}.${columnName}: ${error instanceof Error ? error.message : String(error)}`);
376
+ return null;
377
+ }
378
+ };
379
+ /**
380
+ * Apply column properties after type conversion
381
+ */ const applyColumnProperties = async (trx, tableName, columnName, column)=>{
382
+ // Apply NOT NULL constraint
383
+ if (column.notNullable) {
384
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET NOT NULL`, [
385
+ tableName,
386
+ columnName
387
+ ]);
388
+ } else {
389
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? DROP NOT NULL`, [
390
+ tableName,
391
+ columnName
392
+ ]);
393
+ }
394
+ // Apply default value
395
+ if (column.defaultTo !== undefined) {
396
+ const [defaultValue, defaultOpts] = castArray(column.defaultTo);
397
+ if (prop('isRaw', defaultOpts)) {
398
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${defaultValue}`, [
399
+ tableName,
400
+ columnName
401
+ ]);
402
+ } else {
403
+ // PostgreSQL doesn't support parameterized SET DEFAULT, so we need to escape the value
404
+ const escapedDefault = typeof defaultValue === 'string' ? `'${defaultValue.replace(/'/g, "''")}'` : defaultValue;
405
+ await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${escapedDefault}`, [
406
+ tableName,
407
+ columnName
408
+ ]);
409
+ }
410
+ }
411
+ };
412
+ /**
413
+ * Handle special type conversions that require custom SQL
414
+ */ const handleSpecialTypeConversions = async (trx, table, preloadedColumnTypes = {})=>{
415
+ // Only PostgreSQL needs special handling for now
416
+ if (db.config.connection.client !== 'postgres') {
417
+ return;
418
+ }
419
+ const conversionsToApply = [];
420
+ // Check each updated column for special type conversions
421
+ for (const updatedColumn of table.columns.updated){
422
+ const { name: columnName, object: column } = updatedColumn;
423
+ // Use pre-loaded column type if available, otherwise fetch it
424
+ const currentType = preloadedColumnTypes[columnName] ?? await getCurrentColumnType(table.name, columnName);
425
+ if (currentType) {
426
+ // Check if dialect has special conversion SQL
427
+ const conversionSQL = db.dialect.getColumnTypeConversionSQL(currentType, column.type);
428
+ if (conversionSQL) {
429
+ conversionsToApply.push({
430
+ column: updatedColumn,
431
+ sql: conversionSQL.sql,
432
+ params: [
433
+ table.name,
434
+ columnName,
435
+ columnName
436
+ ],
437
+ currentType,
438
+ targetType: column.type,
439
+ warning: conversionSQL.warning
440
+ });
441
+ }
442
+ }
443
+ }
444
+ // Apply conversions
445
+ for (const conversion of conversionsToApply){
446
+ const { column, sql, params, currentType, targetType, warning } = conversion;
447
+ // Log warning about type conversion
448
+ const warningMessage = warning || 'This conversion may result in data changes.';
449
+ db.logger.warn(`Database type conversion: "${table.name}.${column.name}" from "${currentType}" to "${targetType}". ${warningMessage}`);
450
+ debug(`Applying special type conversion for column ${column.name} on ${table.name}`);
451
+ debug(`Executing SQL: ${sql} with params: ${JSON.stringify(params)}`);
452
+ try {
453
+ // Execute the conversion using the transaction connection
454
+ await trx.raw(sql, params);
455
+ debug(`Successfully converted ${column.name} from ${currentType} to ${targetType}`);
456
+ } catch (conversionError) {
457
+ db.logger.error(`Failed to convert column ${column.name}: ${conversionError instanceof Error ? conversionError.message : String(conversionError)}`);
458
+ throw conversionError;
459
+ }
460
+ // Apply other column properties
461
+ await applyColumnProperties(trx, table.name, column.name, column.object);
462
+ // Remove from standard updates to prevent double processing
463
+ table.columns.updated = table.columns.updated.filter((col)=>col.name !== column.name);
464
+ }
465
+ };
342
466
  return {
343
467
  createTable,
344
468
  alterTable,
345
469
  dropTable,
346
470
  createTableForeignKeys,
347
- dropTableForeignKeys
471
+ dropTableForeignKeys,
472
+ handleSpecialTypeConversions,
473
+ getCurrentColumnType
348
474
  };
349
475
  };
350
476
 
@@ -1 +1 @@
1
- {"version":3,"file":"builder.mjs","sources":["../../src/schema/builder.ts"],"sourcesContent":["import { isNil, prop, omit, castArray } from 'lodash/fp';\nimport createDebug from 'debug';\n\nimport type { Knex } from 'knex';\nimport type { Database } from '..';\nimport type { Schema, Table, SchemaDiff, TableDiff, ForeignKey, Index, Column } from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport default (db: Database) => {\n const helpers = createHelpers(db);\n\n return {\n /**\n * Returns a knex schema builder instance\n * @param {string} table - table name\n */\n getSchemaBuilder(trx: Knex.Transaction) {\n return db.getSchemaConnection(trx);\n },\n\n /**\n * Creates schema in DB\n */\n async createSchema(schema: Schema) {\n await db.connection.transaction(async (trx) => {\n await this.createTables(schema.tables, trx);\n });\n },\n\n /**\n * Creates a list of tables in a schema\n * @param {KnexInstance} trx\n * @param {Table[]} tables\n */\n async createTables(tables: Table[], trx: Knex.Transaction) {\n for (const table of tables) {\n debug(`Creating table: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTable(schemaBuilder, table);\n }\n\n // create FKs once all the tables exist\n for (const table of tables) {\n debug(`Creating table foreign keys: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTableForeignKeys(schemaBuilder, table);\n }\n },\n /**\n * Drops schema from DB\n */\n async dropSchema(schema: Schema, { dropDatabase = false } = {}) {\n if (dropDatabase) {\n // TODO: drop database & return as it will drop everything\n return;\n }\n\n await db.connection.transaction(async (trx) => {\n for (const table of schema.tables.reverse()) {\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n });\n },\n\n /**\n * Applies a schema diff update in the DB\n * @param {*} schemaDiff\n */\n // TODO: implement force option to disable removal in DB\n async updateSchema(schemaDiff: SchemaDiff['diff']) {\n const forceMigration = db.config.settings?.forceMigration;\n\n await db.dialect.startSchemaUpdate();\n\n // Pre-fetch metadata for all updated tables\n const existingMetadata: Record<string, { indexes: Index[]; foreignKeys: ForeignKey[] }> = {};\n for (const table of schemaDiff.tables.updated) {\n existingMetadata[table.name] = {\n indexes: await db.dialect.schemaInspector.getIndexes(table.name),\n foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name),\n };\n }\n\n await db.connection.transaction(async (trx) => {\n await this.createTables(schemaDiff.tables.added, trx);\n\n if (forceMigration) {\n // drop all delete table foreign keys then delete the tables\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table foreign keys: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTableForeignKeys(schemaBuilder, table);\n }\n\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n }\n\n for (const table of schemaDiff.tables.updated) {\n debug(`Updating table: ${table.name}`);\n // alter table\n const schemaBuilder = this.getSchemaBuilder(trx);\n\n const { indexes, foreignKeys } = existingMetadata[table.name];\n await helpers.alterTable(schemaBuilder, table, { indexes, foreignKeys });\n }\n });\n\n await db.dialect.endSchemaUpdate();\n },\n };\n};\n\nconst createHelpers = (db: Database) => {\n /**\n * Creates a foreign key on a table\n */\n const createForeignKey = (tableBuilder: Knex.TableBuilder, foreignKey: ForeignKey) => {\n const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;\n\n const constraint = tableBuilder\n .foreign(columns, name)\n .references(referencedColumns)\n .inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);\n\n if (onDelete) {\n constraint.onDelete(onDelete);\n }\n\n if (onUpdate) {\n constraint.onUpdate(onUpdate);\n }\n };\n\n /**\n * Drops a foreign key from a table\n */\n const dropForeignKey = (\n tableBuilder: Knex.TableBuilder,\n foreignKey: ForeignKey,\n existingForeignKeys?: ForeignKey[]\n ) => {\n const { name, columns } = foreignKey;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (\n existingForeignKeys &&\n !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)\n ) {\n debug(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);\n return;\n }\n\n tableBuilder.dropForeign(columns, name);\n };\n\n /**\n * Creates an index on a table\n */\n const createIndex = (tableBuilder: Knex.TableBuilder, index: Index) => {\n const { type, columns, name } = index;\n\n switch (type) {\n case 'primary': {\n return tableBuilder.primary(columns, { constraintName: name });\n }\n case 'unique': {\n return tableBuilder.unique(columns, { indexName: name });\n }\n default: {\n return tableBuilder.index(columns, name, type);\n }\n }\n };\n\n /**\n * Drops an index from table\n * @param {Knex.TableBuilder} tableBuilder\n * @param {Index} index\n */\n const dropIndex = (tableBuilder: Knex.TableBuilder, index: Index, existingIndexes?: Index[]) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n const { type, columns, name } = index;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {\n debug(`Index ${index.name} not found in existingIndexes. Skipping drop.`);\n return;\n }\n\n switch (type) {\n case 'primary': {\n return tableBuilder.dropPrimary(name);\n }\n case 'unique': {\n return tableBuilder.dropUnique(columns, name);\n }\n default: {\n return tableBuilder.dropIndex(columns, name);\n }\n }\n };\n\n /**\n * Creates a column in a table\n */\n const createColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n const { type, name, args = [], defaultTo, unsigned, notNullable } = column;\n\n const col = (tableBuilder[type as keyof Knex.TableBuilder] as any)(name, ...args);\n\n if (unsigned === true) {\n col.unsigned();\n }\n\n if (!isNil(defaultTo)) {\n const [value, opts] = castArray(defaultTo);\n\n if (prop('isRaw', opts)) {\n col.defaultTo(db.connection.raw(value), omit('isRaw', opts));\n } else {\n col.defaultTo(value, opts);\n }\n }\n\n if (notNullable === true) {\n col.notNullable();\n } else {\n col.nullable();\n }\n\n return col;\n };\n\n /**\n * Drops a column from a table\n */\n const dropColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n return tableBuilder.dropColumn(column.name);\n };\n\n /**\n * Creates a table in a database\n */\n const createTable = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n await schemaBuilder.createTable(table.name, (tableBuilder) => {\n // columns\n (table.columns || []).forEach((column) => createColumn(tableBuilder, column));\n\n // indexes\n (table.indexes || []).forEach((index) => createIndex(tableBuilder, index));\n\n // foreign keys\n\n if (!db.dialect.canAlterConstraints()) {\n (table.foreignKeys || []).forEach((foreignKey) =>\n createForeignKey(tableBuilder, foreignKey)\n );\n }\n });\n };\n\n /**\n * Alters a database table by applying a set of schema changes including updates to columns, indexes, and foreign keys.\n * This function ensures proper ordering of operations to avoid conflicts (e.g., foreign key errors) and handles\n * MySQL-specific quirks where dropping a foreign key can implicitly drop an associated index.\n *\n * @param {Knex.SchemaBuilder} schemaBuilder - Knex SchemaBuilder instance to perform schema operations.\n * @param {TableDiff['diff']} table - A diff object representing the schema changes to be applied to the table.\n * @param {{ indexes: Index[]; foreignKeys: ForeignKey[] }} existingMetadata - Metadata about existing indexes and\n * foreign keys in the table. Used to ensure safe operations and avoid unnecessary modifications.\n * - indexes: Array of existing index definitions.\n * - foreignKeys: Array of existing foreign key definitions.\n */\n const alterTable = async (\n schemaBuilder: Knex.SchemaBuilder,\n table: TableDiff['diff'],\n existingMetadata: { indexes: Index[]; foreignKeys: ForeignKey[] } = {\n indexes: [],\n foreignKeys: [],\n }\n ) => {\n let existingIndexes = [...existingMetadata.indexes];\n const existingForeignKeys = [...existingMetadata.foreignKeys];\n\n // Track dropped foreign keys\n const droppedForeignKeyNames: string[] = [];\n\n await schemaBuilder.alterTable(table.name, async (tableBuilder) => {\n // Drop foreign keys first to avoid foreign key errors in the following steps\n for (const removedForeignKey of table.foreignKeys.removed) {\n debug(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);\n\n droppedForeignKeyNames.push(removedForeignKey.name);\n }\n\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);\n\n droppedForeignKeyNames.push(updatedForeignKey.object.name);\n }\n\n // In MySQL, dropping a foreign key can also implicitly drop an index with the same name\n // Remove dropped foreign keys from existingIndexes for MySQL\n if (db.config.connection.client === 'mysql') {\n existingIndexes = existingIndexes.filter(\n (index) => !droppedForeignKeyNames.includes(index.name)\n );\n }\n\n for (const removedIndex of table.indexes.removed) {\n debug(`Dropping index ${removedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, removedIndex, existingIndexes);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Dropping updated index ${updatedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, updatedIndex.object, existingIndexes);\n }\n\n // Drop columns after FKs have been removed to avoid FK errors\n for (const removedColumn of table.columns.removed) {\n debug(`Dropping column ${removedColumn.name} on ${table.name}`);\n dropColumn(tableBuilder, removedColumn);\n }\n\n // Update existing columns\n for (const updatedColumn of table.columns.updated) {\n debug(`Updating column ${updatedColumn.name} on ${table.name}`);\n\n const { object } = updatedColumn;\n\n if (object.type === 'increments') {\n createColumn(tableBuilder, { ...object, type: 'integer' }).alter();\n } else {\n createColumn(tableBuilder, object).alter();\n }\n }\n\n // Add any new columns\n for (const addedColumn of table.columns.added) {\n debug(`Creating column ${addedColumn.name} on ${table.name}`);\n\n if (addedColumn.type === 'increments' && !db.dialect.canAddIncrements()) {\n tableBuilder.integer(addedColumn.name).unsigned();\n tableBuilder.primary([addedColumn.name]);\n } else {\n createColumn(tableBuilder, addedColumn);\n }\n }\n\n // once the columns have all been updated, we can create indexes again\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, updatedForeignKey.object);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Recreating updated index ${updatedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, updatedIndex.object);\n }\n\n for (const addedForeignKey of table.foreignKeys.added) {\n debug(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, addedForeignKey);\n }\n\n for (const addedIndex of table.indexes.added) {\n debug(`Creating index ${addedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, addedIndex);\n }\n });\n };\n\n /**\n * Drops a table from a database\n */\n const dropTable = (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n return schemaBuilder.dropTableIfExists(table.name);\n };\n\n /**\n * Creates a table foreign keys constraints\n */\n const createTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => createForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Drops a table foreign keys constraints\n */\n const dropTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => dropForeignKey(tableBuilder, foreignKey));\n });\n };\n\n return {\n createTable,\n alterTable,\n dropTable,\n createTableForeignKeys,\n dropTableForeignKeys,\n };\n};\n"],"names":["debug","createDebug","db","helpers","createHelpers","getSchemaBuilder","trx","getSchemaConnection","createSchema","schema","connection","transaction","createTables","tables","table","name","schemaBuilder","createTable","createTableForeignKeys","dropSchema","dropDatabase","reverse","dropTable","updateSchema","schemaDiff","forceMigration","config","settings","dialect","startSchemaUpdate","existingMetadata","updated","indexes","schemaInspector","getIndexes","foreignKeys","getForeignKeys","added","removed","dropTableForeignKeys","alterTable","endSchemaUpdate","createForeignKey","tableBuilder","foreignKey","columns","referencedColumns","referencedTable","onDelete","onUpdate","constraint","foreign","references","inTable","getSchemaName","dropForeignKey","existingForeignKeys","some","existingIndex","dropForeign","createIndex","index","type","primary","constraintName","unique","indexName","dropIndex","existingIndexes","dropPrimary","dropUnique","createColumn","column","args","defaultTo","unsigned","notNullable","col","isNil","value","opts","castArray","prop","raw","omit","nullable","dropColumn","forEach","canAlterConstraints","droppedForeignKeyNames","removedForeignKey","push","updatedForeignKey","object","client","filter","includes","removedIndex","updatedIndex","removedColumn","updatedColumn","alter","addedColumn","canAddIncrements","integer","addedForeignKey","addedIndex","dropTableIfExists"],"mappings":";;;AAOA,MAAMA,QAAQC,WAAY,CAAA,kBAAA,CAAA;AAE1B,0BAAe,CAAA,CAACC,EAAAA,GAAAA;AACd,IAAA,MAAMC,UAAUC,aAAcF,CAAAA,EAAAA,CAAAA;IAE9B,OAAO;AACL;;;AAGC,QACDG,kBAAiBC,GAAqB,EAAA;YACpC,OAAOJ,EAAAA,CAAGK,mBAAmB,CAACD,GAAAA,CAAAA;AAChC,SAAA;AAEA;;QAGA,MAAME,cAAaC,MAAc,EAAA;AAC/B,YAAA,MAAMP,EAAGQ,CAAAA,UAAU,CAACC,WAAW,CAAC,OAAOL,GAAAA,GAAAA;AACrC,gBAAA,MAAM,IAAI,CAACM,YAAY,CAACH,MAAAA,CAAOI,MAAM,EAAEP,GAAAA,CAAAA;AACzC,aAAA,CAAA;AACF,SAAA;AAEA;;;;AAIC,QACD,MAAMM,YAAAA,CAAAA,CAAaC,MAAe,EAAEP,GAAqB,EAAA;YACvD,KAAK,MAAMQ,SAASD,MAAQ,CAAA;AAC1Bb,gBAAAA,KAAAA,CAAM,CAAC,gBAAgB,EAAEc,KAAMC,CAAAA,IAAI,CAAC,CAAC,CAAA;AACrC,gBAAA,MAAMC,aAAgB,GAAA,IAAI,CAACX,gBAAgB,CAACC,GAAAA,CAAAA;gBAC5C,MAAMH,OAAAA,CAAQc,WAAW,CAACD,aAAeF,EAAAA,KAAAA,CAAAA;AAC3C;;YAGA,KAAK,MAAMA,SAASD,MAAQ,CAAA;AAC1Bb,gBAAAA,KAAAA,CAAM,CAAC,6BAA6B,EAAEc,KAAMC,CAAAA,IAAI,CAAC,CAAC,CAAA;AAClD,gBAAA,MAAMC,aAAgB,GAAA,IAAI,CAACX,gBAAgB,CAACC,GAAAA,CAAAA;gBAC5C,MAAMH,OAAAA,CAAQe,sBAAsB,CAACF,aAAeF,EAAAA,KAAAA,CAAAA;AACtD;AACF,SAAA;AACA;;QAGA,MAAMK,UAAWV,CAAAA,CAAAA,MAAc,EAAE,EAAEW,eAAe,KAAK,EAAE,GAAG,EAAE,EAAA;AAC5D,YAAA,IAAIA,YAAc,EAAA;;AAEhB,gBAAA;AACF;AAEA,YAAA,MAAMlB,EAAGQ,CAAAA,UAAU,CAACC,WAAW,CAAC,OAAOL,GAAAA,GAAAA;AACrC,gBAAA,KAAK,MAAMQ,KAASL,IAAAA,MAAAA,CAAOI,MAAM,CAACQ,OAAO,EAAI,CAAA;AAC3C,oBAAA,MAAML,aAAgB,GAAA,IAAI,CAACX,gBAAgB,CAACC,GAAAA,CAAAA;oBAC5C,MAAMH,OAAAA,CAAQmB,SAAS,CAACN,aAAeF,EAAAA,KAAAA,CAAAA;AACzC;AACF,aAAA,CAAA;AACF,SAAA;AAEA;;;AAGC;AAED,QAAA,MAAMS,cAAaC,UAA8B,EAAA;AAC/C,YAAA,MAAMC,cAAiBvB,GAAAA,EAAAA,CAAGwB,MAAM,CAACC,QAAQ,EAAEF,cAAAA;YAE3C,MAAMvB,EAAAA,CAAG0B,OAAO,CAACC,iBAAiB,EAAA;;AAGlC,YAAA,MAAMC,mBAAoF,EAAC;AAC3F,YAAA,KAAK,MAAMhB,KAASU,IAAAA,UAAAA,CAAWX,MAAM,CAACkB,OAAO,CAAE;AAC7CD,gBAAAA,gBAAgB,CAAChB,KAAAA,CAAMC,IAAI,CAAC,GAAG;oBAC7BiB,OAAS,EAAA,MAAM9B,GAAG0B,OAAO,CAACK,eAAe,CAACC,UAAU,CAACpB,KAAAA,CAAMC,IAAI,CAAA;oBAC/DoB,WAAa,EAAA,MAAMjC,GAAG0B,OAAO,CAACK,eAAe,CAACG,cAAc,CAACtB,KAAAA,CAAMC,IAAI;AACzE,iBAAA;AACF;AAEA,YAAA,MAAMb,EAAGQ,CAAAA,UAAU,CAACC,WAAW,CAAC,OAAOL,GAAAA,GAAAA;gBACrC,MAAM,IAAI,CAACM,YAAY,CAACY,WAAWX,MAAM,CAACwB,KAAK,EAAE/B,GAAAA,CAAAA;AAEjD,gBAAA,IAAImB,cAAgB,EAAA;;AAElB,oBAAA,KAAK,MAAMX,KAASU,IAAAA,UAAAA,CAAWX,MAAM,CAACyB,OAAO,CAAE;AAC7CtC,wBAAAA,KAAAA,CAAM,CAAC,6BAA6B,EAAEc,KAAMC,CAAAA,IAAI,CAAC,CAAC,CAAA;AAElD,wBAAA,MAAMC,aAAgB,GAAA,IAAI,CAACX,gBAAgB,CAACC,GAAAA,CAAAA;wBAC5C,MAAMH,OAAAA,CAAQoC,oBAAoB,CAACvB,aAAeF,EAAAA,KAAAA,CAAAA;AACpD;AAEA,oBAAA,KAAK,MAAMA,KAASU,IAAAA,UAAAA,CAAWX,MAAM,CAACyB,OAAO,CAAE;AAC7CtC,wBAAAA,KAAAA,CAAM,CAAC,gBAAgB,EAAEc,KAAMC,CAAAA,IAAI,CAAC,CAAC,CAAA;AAErC,wBAAA,MAAMC,aAAgB,GAAA,IAAI,CAACX,gBAAgB,CAACC,GAAAA,CAAAA;wBAC5C,MAAMH,OAAAA,CAAQmB,SAAS,CAACN,aAAeF,EAAAA,KAAAA,CAAAA;AACzC;AACF;AAEA,gBAAA,KAAK,MAAMA,KAASU,IAAAA,UAAAA,CAAWX,MAAM,CAACkB,OAAO,CAAE;AAC7C/B,oBAAAA,KAAAA,CAAM,CAAC,gBAAgB,EAAEc,KAAMC,CAAAA,IAAI,CAAC,CAAC,CAAA;;AAErC,oBAAA,MAAMC,aAAgB,GAAA,IAAI,CAACX,gBAAgB,CAACC,GAAAA,CAAAA;oBAE5C,MAAM,EAAE0B,OAAO,EAAEG,WAAW,EAAE,GAAGL,gBAAgB,CAAChB,KAAMC,CAAAA,IAAI,CAAC;AAC7D,oBAAA,MAAMZ,OAAQqC,CAAAA,UAAU,CAACxB,aAAAA,EAAeF,KAAO,EAAA;AAAEkB,wBAAAA,OAAAA;AAASG,wBAAAA;AAAY,qBAAA,CAAA;AACxE;AACF,aAAA,CAAA;YAEA,MAAMjC,EAAAA,CAAG0B,OAAO,CAACa,eAAe,EAAA;AAClC;AACF,KAAA;AACF,CAAA;AAEA,MAAMrC,gBAAgB,CAACF,EAAAA,GAAAA;AACrB;;MAGA,MAAMwC,gBAAmB,GAAA,CAACC,YAAiCC,EAAAA,UAAAA,GAAAA;AACzD,QAAA,MAAM,EAAE7B,IAAI,EAAE8B,OAAO,EAAEC,iBAAiB,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,QAAQ,EAAE,GAAGL,UAAAA;QAElF,MAAMM,UAAAA,GAAaP,aAChBQ,OAAO,CAACN,SAAS9B,IACjBqC,CAAAA,CAAAA,UAAU,CAACN,iBAAAA,CAAAA,CACXO,OAAO,CAACnD,GAAGoD,aAAa,EAAA,GAAK,CAAC,EAAEpD,EAAGoD,CAAAA,aAAa,GAAG,CAAC,EAAEP,eAAgB,CAAA,CAAC,GAAGA,eAAAA,CAAAA;AAE7E,QAAA,IAAIC,QAAU,EAAA;AACZE,YAAAA,UAAAA,CAAWF,QAAQ,CAACA,QAAAA,CAAAA;AACtB;AAEA,QAAA,IAAIC,QAAU,EAAA;AACZC,YAAAA,UAAAA,CAAWD,QAAQ,CAACA,QAAAA,CAAAA;AACtB;AACF,KAAA;AAEA;;AAEC,MACD,MAAMM,cAAAA,GAAiB,CACrBZ,YAAAA,EACAC,UACAY,EAAAA,mBAAAA,GAAAA;AAEA,QAAA,MAAM,EAAEzC,IAAI,EAAE8B,OAAO,EAAE,GAAGD,UAAAA;;QAG1B,IACEY,mBAAAA,IACA,CAACA,mBAAoBC,CAAAA,IAAI,CAAC,CAACC,aAAAA,GAAkBA,aAAe3C,EAAAA,IAAAA,KAASA,IACrE,CAAA,EAAA;AACAf,YAAAA,KAAAA,CAAM,CAAC,YAAY,EAAEe,IAAAA,CAAK,mDAAmD,CAAC,CAAA;AAC9E,YAAA;AACF;QAEA4B,YAAagB,CAAAA,WAAW,CAACd,OAAS9B,EAAAA,IAAAA,CAAAA;AACpC,KAAA;AAEA;;MAGA,MAAM6C,WAAc,GAAA,CAACjB,YAAiCkB,EAAAA,KAAAA,GAAAA;AACpD,QAAA,MAAM,EAAEC,IAAI,EAAEjB,OAAO,EAAE9B,IAAI,EAAE,GAAG8C,KAAAA;QAEhC,OAAQC,IAAAA;YACN,KAAK,SAAA;AAAW,gBAAA;oBACd,OAAOnB,YAAAA,CAAaoB,OAAO,CAAClB,OAAS,EAAA;wBAAEmB,cAAgBjD,EAAAA;AAAK,qBAAA,CAAA;AAC9D;YACA,KAAK,QAAA;AAAU,gBAAA;oBACb,OAAO4B,YAAAA,CAAasB,MAAM,CAACpB,OAAS,EAAA;wBAAEqB,SAAWnD,EAAAA;AAAK,qBAAA,CAAA;AACxD;AACA,YAAA;AAAS,gBAAA;AACP,oBAAA,OAAO4B,YAAakB,CAAAA,KAAK,CAAChB,OAAAA,EAAS9B,IAAM+C,EAAAA,IAAAA,CAAAA;AAC3C;AACF;AACF,KAAA;AAEA;;;;AAIC,MACD,MAAMK,SAAAA,GAAY,CAACxB,YAAAA,EAAiCkB,KAAcO,EAAAA,eAAAA,GAAAA;AAChE,QAAA,IAAI,CAAClE,EAAGwB,CAAAA,MAAM,CAACC,QAAQ,EAAEF,cAAgB,EAAA;AACvC,YAAA;AACF;AAEA,QAAA,MAAM,EAAEqC,IAAI,EAAEjB,OAAO,EAAE9B,IAAI,EAAE,GAAG8C,KAAAA;;QAGhC,IAAIO,eAAAA,IAAmB,CAACA,eAAgBX,CAAAA,IAAI,CAAC,CAACC,aAAAA,GAAkBA,aAAe3C,EAAAA,IAAAA,KAASA,IAAO,CAAA,EAAA;AAC7Ff,YAAAA,KAAAA,CAAM,CAAC,MAAM,EAAE6D,MAAM9C,IAAI,CAAC,6CAA6C,CAAC,CAAA;AACxE,YAAA;AACF;QAEA,OAAQ+C,IAAAA;YACN,KAAK,SAAA;AAAW,gBAAA;oBACd,OAAOnB,YAAAA,CAAa0B,WAAW,CAACtD,IAAAA,CAAAA;AAClC;YACA,KAAK,QAAA;AAAU,gBAAA;oBACb,OAAO4B,YAAAA,CAAa2B,UAAU,CAACzB,OAAS9B,EAAAA,IAAAA,CAAAA;AAC1C;AACA,YAAA;AAAS,gBAAA;oBACP,OAAO4B,YAAAA,CAAawB,SAAS,CAACtB,OAAS9B,EAAAA,IAAAA,CAAAA;AACzC;AACF;AACF,KAAA;AAEA;;MAGA,MAAMwD,YAAe,GAAA,CAAC5B,YAAiC6B,EAAAA,MAAAA,GAAAA;AACrD,QAAA,MAAM,EAAEV,IAAI,EAAE/C,IAAI,EAAE0D,IAAO,GAAA,EAAE,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,WAAW,EAAE,GAAGJ,MAAAA;AAEpE,QAAA,MAAMK,MAAM,YAAa,CAACf,IAAAA,CAAgC,CAAS/C,IAAS0D,EAAAA,GAAAA,IAAAA,CAAAA;AAE5E,QAAA,IAAIE,aAAa,IAAM,EAAA;AACrBE,YAAAA,GAAAA,CAAIF,QAAQ,EAAA;AACd;QAEA,IAAI,CAACG,MAAMJ,SAAY,CAAA,EAAA;AACrB,YAAA,MAAM,CAACK,KAAAA,EAAOC,IAAK,CAAA,GAAGC,SAAUP,CAAAA,SAAAA,CAAAA;YAEhC,IAAIQ,IAAAA,CAAK,SAASF,IAAO,CAAA,EAAA;gBACvBH,GAAIH,CAAAA,SAAS,CAACxE,EAAGQ,CAAAA,UAAU,CAACyE,GAAG,CAACJ,KAAQK,CAAAA,EAAAA,IAAAA,CAAK,OAASJ,EAAAA,IAAAA,CAAAA,CAAAA;aACjD,MAAA;gBACLH,GAAIH,CAAAA,SAAS,CAACK,KAAOC,EAAAA,IAAAA,CAAAA;AACvB;AACF;AAEA,QAAA,IAAIJ,gBAAgB,IAAM,EAAA;AACxBC,YAAAA,GAAAA,CAAID,WAAW,EAAA;SACV,MAAA;AACLC,YAAAA,GAAAA,CAAIQ,QAAQ,EAAA;AACd;QAEA,OAAOR,GAAAA;AACT,KAAA;AAEA;;MAGA,MAAMS,UAAa,GAAA,CAAC3C,YAAiC6B,EAAAA,MAAAA,GAAAA;AACnD,QAAA,IAAI,CAACtE,EAAGwB,CAAAA,MAAM,CAACC,QAAQ,EAAEF,cAAgB,EAAA;AACvC,YAAA;AACF;AAEA,QAAA,OAAOkB,YAAa2C,CAAAA,UAAU,CAACd,MAAAA,CAAOzD,IAAI,CAAA;AAC5C,KAAA;AAEA;;MAGA,MAAME,WAAc,GAAA,OAAOD,aAAmCF,EAAAA,KAAAA,GAAAA;AAC5D,QAAA,MAAME,cAAcC,WAAW,CAACH,KAAMC,CAAAA,IAAI,EAAE,CAAC4B,YAAAA,GAAAA;;YAE1C7B,CAAAA,KAAAA,CAAM+B,OAAO,IAAI,EAAC,EAAG0C,OAAO,CAAC,CAACf,MAAWD,GAAAA,YAAAA,CAAa5B,YAAc6B,EAAAA,MAAAA,CAAAA,CAAAA;;YAGpE1D,CAAAA,KAAAA,CAAMkB,OAAO,IAAI,EAAC,EAAGuD,OAAO,CAAC,CAAC1B,KAAUD,GAAAA,WAAAA,CAAYjB,YAAckB,EAAAA,KAAAA,CAAAA,CAAAA;;AAInE,YAAA,IAAI,CAAC3D,EAAAA,CAAG0B,OAAO,CAAC4D,mBAAmB,EAAI,EAAA;gBACpC1E,CAAAA,KAAAA,CAAMqB,WAAW,IAAI,EAAC,EAAGoD,OAAO,CAAC,CAAC3C,UACjCF,GAAAA,gBAAAA,CAAiBC,YAAcC,EAAAA,UAAAA,CAAAA,CAAAA;AAEnC;AACF,SAAA,CAAA;AACF,KAAA;AAEA;;;;;;;;;;;AAWC,MACD,MAAMJ,UAAAA,GAAa,OACjBxB,aAAAA,EACAF,OACAgB,gBAAoE,GAAA;AAClEE,QAAAA,OAAAA,EAAS,EAAE;AACXG,QAAAA,WAAAA,EAAa;KACd,GAAA;AAED,QAAA,IAAIiC,eAAkB,GAAA;AAAItC,YAAAA,GAAAA,gBAAAA,CAAiBE;AAAQ,SAAA;AACnD,QAAA,MAAMwB,mBAAsB,GAAA;AAAI1B,YAAAA,GAAAA,gBAAAA,CAAiBK;AAAY,SAAA;;AAG7D,QAAA,MAAMsD,yBAAmC,EAAE;AAE3C,QAAA,MAAMzE,cAAcwB,UAAU,CAAC1B,KAAMC,CAAAA,IAAI,EAAE,OAAO4B,YAAAA,GAAAA;;AAEhD,YAAA,KAAK,MAAM+C,iBAAqB5E,IAAAA,KAAAA,CAAMqB,WAAW,CAACG,OAAO,CAAE;gBACzDtC,KAAM,CAAA,CAAC,qBAAqB,EAAE0F,iBAAkB3E,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;AACvEwC,gBAAAA,cAAAA,CAAeZ,cAAc+C,iBAAmBlC,EAAAA,mBAAAA,CAAAA;gBAEhDiC,sBAAuBE,CAAAA,IAAI,CAACD,iBAAAA,CAAkB3E,IAAI,CAAA;AACpD;AAEA,YAAA,KAAK,MAAM6E,iBAAqB9E,IAAAA,KAAAA,CAAMqB,WAAW,CAACJ,OAAO,CAAE;gBACzD/B,KAAM,CAAA,CAAC,6BAA6B,EAAE4F,iBAAkB7E,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;gBAC/EwC,cAAeZ,CAAAA,YAAAA,EAAciD,iBAAkBC,CAAAA,MAAM,EAAErC,mBAAAA,CAAAA;AAEvDiC,gBAAAA,sBAAAA,CAAuBE,IAAI,CAACC,iBAAkBC,CAAAA,MAAM,CAAC9E,IAAI,CAAA;AAC3D;;;AAIA,YAAA,IAAIb,GAAGwB,MAAM,CAAChB,UAAU,CAACoF,MAAM,KAAK,OAAS,EAAA;gBAC3C1B,eAAkBA,GAAAA,eAAAA,CAAgB2B,MAAM,CACtC,CAAClC,KAAAA,GAAU,CAAC4B,sBAAuBO,CAAAA,QAAQ,CAACnC,KAAAA,CAAM9C,IAAI,CAAA,CAAA;AAE1D;AAEA,YAAA,KAAK,MAAMkF,YAAgBnF,IAAAA,KAAAA,CAAMkB,OAAO,CAACM,OAAO,CAAE;gBAChDtC,KAAM,CAAA,CAAC,eAAe,EAAEiG,YAAalF,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;AAC5DoD,gBAAAA,SAAAA,CAAUxB,cAAcsD,YAAc7B,EAAAA,eAAAA,CAAAA;AACxC;AAEA,YAAA,KAAK,MAAM8B,YAAgBpF,IAAAA,KAAAA,CAAMkB,OAAO,CAACD,OAAO,CAAE;gBAChD/B,KAAM,CAAA,CAAC,uBAAuB,EAAEkG,YAAanF,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;gBACpEoD,SAAUxB,CAAAA,YAAAA,EAAcuD,YAAaL,CAAAA,MAAM,EAAEzB,eAAAA,CAAAA;AAC/C;;AAGA,YAAA,KAAK,MAAM+B,aAAiBrF,IAAAA,KAAAA,CAAM+B,OAAO,CAACP,OAAO,CAAE;gBACjDtC,KAAM,CAAA,CAAC,gBAAgB,EAAEmG,aAAcpF,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;AAC9DuE,gBAAAA,UAAAA,CAAW3C,YAAcwD,EAAAA,aAAAA,CAAAA;AAC3B;;AAGA,YAAA,KAAK,MAAMC,aAAiBtF,IAAAA,KAAAA,CAAM+B,OAAO,CAACd,OAAO,CAAE;gBACjD/B,KAAM,CAAA,CAAC,gBAAgB,EAAEoG,aAAcrF,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;gBAE9D,MAAM,EAAE8E,MAAM,EAAE,GAAGO,aAAAA;gBAEnB,IAAIP,MAAAA,CAAO/B,IAAI,KAAK,YAAc,EAAA;AAChCS,oBAAAA,YAAAA,CAAa5B,YAAc,EAAA;AAAE,wBAAA,GAAGkD,MAAM;wBAAE/B,IAAM,EAAA;AAAU,qBAAA,CAAA,CAAGuC,KAAK,EAAA;iBAC3D,MAAA;oBACL9B,YAAa5B,CAAAA,YAAAA,EAAckD,QAAQQ,KAAK,EAAA;AAC1C;AACF;;AAGA,YAAA,KAAK,MAAMC,WAAexF,IAAAA,KAAAA,CAAM+B,OAAO,CAACR,KAAK,CAAE;gBAC7CrC,KAAM,CAAA,CAAC,gBAAgB,EAAEsG,WAAYvF,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;gBAE5D,IAAIuF,WAAAA,CAAYxC,IAAI,KAAK,YAAA,IAAgB,CAAC5D,EAAG0B,CAAAA,OAAO,CAAC2E,gBAAgB,EAAI,EAAA;AACvE5D,oBAAAA,YAAAA,CAAa6D,OAAO,CAACF,WAAYvF,CAAAA,IAAI,EAAE4D,QAAQ,EAAA;AAC/ChC,oBAAAA,YAAAA,CAAaoB,OAAO,CAAC;AAACuC,wBAAAA,WAAAA,CAAYvF;AAAK,qBAAA,CAAA;iBAClC,MAAA;AACLwD,oBAAAA,YAAAA,CAAa5B,YAAc2D,EAAAA,WAAAA,CAAAA;AAC7B;AACF;;AAGA,YAAA,KAAK,MAAMV,iBAAqB9E,IAAAA,KAAAA,CAAMqB,WAAW,CAACJ,OAAO,CAAE;gBACzD/B,KAAM,CAAA,CAAC,+BAA+B,EAAE4F,iBAAkB7E,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;gBACjF2B,gBAAiBC,CAAAA,YAAAA,EAAciD,kBAAkBC,MAAM,CAAA;AACzD;AAEA,YAAA,KAAK,MAAMK,YAAgBpF,IAAAA,KAAAA,CAAMkB,OAAO,CAACD,OAAO,CAAE;gBAChD/B,KAAM,CAAA,CAAC,yBAAyB,EAAEkG,YAAanF,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;gBACtE6C,WAAYjB,CAAAA,YAAAA,EAAcuD,aAAaL,MAAM,CAAA;AAC/C;AAEA,YAAA,KAAK,MAAMY,eAAmB3F,IAAAA,KAAAA,CAAMqB,WAAW,CAACE,KAAK,CAAE;gBACrDrC,KAAM,CAAA,CAAC,qBAAqB,EAAEyG,eAAgB1F,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;AACrE2B,gBAAAA,gBAAAA,CAAiBC,YAAc8D,EAAAA,eAAAA,CAAAA;AACjC;AAEA,YAAA,KAAK,MAAMC,UAAc5F,IAAAA,KAAAA,CAAMkB,OAAO,CAACK,KAAK,CAAE;gBAC5CrC,KAAM,CAAA,CAAC,eAAe,EAAE0G,UAAW3F,CAAAA,IAAI,CAAC,IAAI,EAAED,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAA;AAC1D6C,gBAAAA,WAAAA,CAAYjB,YAAc+D,EAAAA,UAAAA,CAAAA;AAC5B;AACF,SAAA,CAAA;AACF,KAAA;AAEA;;MAGA,MAAMpF,SAAY,GAAA,CAACN,aAAmCF,EAAAA,KAAAA,GAAAA;AACpD,QAAA,IAAI,CAACZ,EAAGwB,CAAAA,MAAM,CAACC,QAAQ,CAACF,cAAc,EAAE;AACtC,YAAA;AACF;AAEA,QAAA,OAAOT,aAAc2F,CAAAA,iBAAiB,CAAC7F,KAAAA,CAAMC,IAAI,CAAA;AACnD,KAAA;AAEA;;MAGA,MAAMG,sBAAyB,GAAA,OAAOF,aAAmCF,EAAAA,KAAAA,GAAAA;;AAEvE,QAAA,MAAME,cAAcF,KAAK,CAACA,KAAMC,CAAAA,IAAI,EAAE,CAAC4B,YAAAA,GAAAA;YACpC7B,CAAAA,KAAAA,CAAMqB,WAAW,IAAI,EAAC,EAAGoD,OAAO,CAAC,CAAC3C,UAAeF,GAAAA,gBAAAA,CAAiBC,YAAcC,EAAAA,UAAAA,CAAAA,CAAAA;AACnF,SAAA,CAAA;AACF,KAAA;AAEA;;MAGA,MAAML,oBAAuB,GAAA,OAAOvB,aAAmCF,EAAAA,KAAAA,GAAAA;AACrE,QAAA,IAAI,CAACZ,EAAGwB,CAAAA,MAAM,CAACC,QAAQ,CAACF,cAAc,EAAE;AACtC,YAAA;AACF;;AAGA,QAAA,MAAMT,cAAcF,KAAK,CAACA,KAAMC,CAAAA,IAAI,EAAE,CAAC4B,YAAAA,GAAAA;YACpC7B,CAAAA,KAAAA,CAAMqB,WAAW,IAAI,EAAC,EAAGoD,OAAO,CAAC,CAAC3C,UAAeW,GAAAA,cAAAA,CAAeZ,YAAcC,EAAAA,UAAAA,CAAAA,CAAAA;AACjF,SAAA,CAAA;AACF,KAAA;IAEA,OAAO;AACL3B,QAAAA,WAAAA;AACAuB,QAAAA,UAAAA;AACAlB,QAAAA,SAAAA;AACAJ,QAAAA,sBAAAA;AACAqB,QAAAA;AACF,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"builder.mjs","sources":["../../src/schema/builder.ts"],"sourcesContent":["import { isNil, prop, omit, castArray } from 'lodash/fp';\nimport createDebug from 'debug';\n\nimport type { Knex } from 'knex';\nimport type { Database } from '..';\nimport type { Schema, Table, SchemaDiff, TableDiff, ForeignKey, Index, Column } from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport default (db: Database) => {\n const helpers = createHelpers(db);\n\n return {\n /**\n * Returns a knex schema builder instance\n * @param {string} table - table name\n */\n getSchemaBuilder(trx: Knex.Transaction) {\n return db.getSchemaConnection(trx);\n },\n\n /**\n * Creates schema in DB\n */\n async createSchema(schema: Schema) {\n await db.connection.transaction(async (trx) => {\n await this.createTables(schema.tables, trx);\n });\n },\n\n /**\n * Creates a list of tables in a schema\n * @param {KnexInstance} trx\n * @param {Table[]} tables\n */\n async createTables(tables: Table[], trx: Knex.Transaction) {\n for (const table of tables) {\n debug(`Creating table: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTable(schemaBuilder, table);\n }\n\n // create FKs once all the tables exist\n for (const table of tables) {\n debug(`Creating table foreign keys: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTableForeignKeys(schemaBuilder, table);\n }\n },\n /**\n * Drops schema from DB\n */\n async dropSchema(schema: Schema, { dropDatabase = false } = {}) {\n if (dropDatabase) {\n // TODO: drop database & return as it will drop everything\n return;\n }\n\n await db.connection.transaction(async (trx) => {\n for (const table of schema.tables.reverse()) {\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n });\n },\n\n /**\n * Applies a schema diff update in the DB\n * @param {*} schemaDiff\n */\n // TODO: implement force option to disable removal in DB\n async updateSchema(schemaDiff: SchemaDiff['diff']) {\n const forceMigration = db.config.settings?.forceMigration;\n\n await db.dialect.startSchemaUpdate();\n\n // Pre-fetch metadata for all updated tables\n const existingMetadata: Record<string, { indexes: Index[]; foreignKeys: ForeignKey[] }> = {};\n const columnTypes: Record<string, Record<string, string | null>> = {};\n\n for (const table of schemaDiff.tables.updated) {\n existingMetadata[table.name] = {\n indexes: await db.dialect.schemaInspector.getIndexes(table.name),\n foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name),\n };\n\n // Pre-fetch column types for PostgreSQL to avoid transaction timeouts\n if (db.config.connection.client === 'postgres') {\n columnTypes[table.name] = {};\n for (const updatedColumn of table.columns.updated) {\n columnTypes[table.name][updatedColumn.name] = await helpers.getCurrentColumnType(\n table.name,\n updatedColumn.name\n );\n }\n }\n }\n\n await db.connection.transaction(async (trx) => {\n await this.createTables(schemaDiff.tables.added, trx);\n\n if (forceMigration) {\n // drop all delete table foreign keys then delete the tables\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table foreign keys: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTableForeignKeys(schemaBuilder, table);\n }\n\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n }\n\n for (const table of schemaDiff.tables.updated) {\n debug(`Updating table: ${table.name}`);\n\n // Handle special type conversions before standard alterations\n await helpers.handleSpecialTypeConversions(trx, table, columnTypes[table.name] || {});\n\n // alter table\n const schemaBuilder = this.getSchemaBuilder(trx);\n\n const { indexes, foreignKeys } = existingMetadata[table.name];\n await helpers.alterTable(schemaBuilder, table, { indexes, foreignKeys });\n }\n });\n\n await db.dialect.endSchemaUpdate();\n },\n };\n};\n\nconst createHelpers = (db: Database) => {\n /**\n * Creates a foreign key on a table\n */\n const createForeignKey = (tableBuilder: Knex.TableBuilder, foreignKey: ForeignKey) => {\n const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;\n\n const constraint = tableBuilder\n .foreign(columns, name)\n .references(referencedColumns)\n .inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);\n\n if (onDelete) {\n constraint.onDelete(onDelete);\n }\n\n if (onUpdate) {\n constraint.onUpdate(onUpdate);\n }\n };\n\n /**\n * Drops a foreign key from a table\n */\n const dropForeignKey = (\n tableBuilder: Knex.TableBuilder,\n foreignKey: ForeignKey,\n existingForeignKeys?: ForeignKey[]\n ) => {\n const { name, columns } = foreignKey;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (\n existingForeignKeys &&\n !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)\n ) {\n debug(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);\n return;\n }\n\n tableBuilder.dropForeign(columns, name);\n };\n\n /**\n * Creates an index on a table\n */\n const createIndex = (tableBuilder: Knex.TableBuilder, index: Index) => {\n const { type, columns, name } = index;\n\n switch (type) {\n case 'primary': {\n return tableBuilder.primary(columns, { constraintName: name });\n }\n case 'unique': {\n return tableBuilder.unique(columns, { indexName: name });\n }\n default: {\n return tableBuilder.index(columns, name, type);\n }\n }\n };\n\n /**\n * Drops an index from table\n * @param {Knex.TableBuilder} tableBuilder\n * @param {Index} index\n */\n const dropIndex = (tableBuilder: Knex.TableBuilder, index: Index, existingIndexes?: Index[]) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n const { type, columns, name } = index;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {\n debug(`Index ${index.name} not found in existingIndexes. Skipping drop.`);\n return;\n }\n\n switch (type) {\n case 'primary': {\n return tableBuilder.dropPrimary(name);\n }\n case 'unique': {\n return tableBuilder.dropUnique(columns, name);\n }\n default: {\n return tableBuilder.dropIndex(columns, name);\n }\n }\n };\n\n /**\n * Creates a column in a table\n */\n const createColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n const { type, name, args = [], defaultTo, unsigned, notNullable } = column;\n\n const col = (tableBuilder[type as keyof Knex.TableBuilder] as any)(name, ...args);\n\n if (unsigned === true) {\n col.unsigned();\n }\n\n if (!isNil(defaultTo)) {\n const [value, opts] = castArray(defaultTo);\n\n if (prop('isRaw', opts)) {\n col.defaultTo(db.connection.raw(value), omit('isRaw', opts));\n } else {\n col.defaultTo(value, opts);\n }\n }\n\n if (notNullable === true) {\n col.notNullable();\n } else {\n col.nullable();\n }\n\n return col;\n };\n\n /**\n * Drops a column from a table\n */\n const dropColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n return tableBuilder.dropColumn(column.name);\n };\n\n /**\n * Creates a table in a database\n */\n const createTable = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n await schemaBuilder.createTable(table.name, (tableBuilder) => {\n // columns\n (table.columns || []).forEach((column) => createColumn(tableBuilder, column));\n\n // indexes\n (table.indexes || []).forEach((index) => createIndex(tableBuilder, index));\n\n // foreign keys\n\n if (!db.dialect.canAlterConstraints()) {\n (table.foreignKeys || []).forEach((foreignKey) =>\n createForeignKey(tableBuilder, foreignKey)\n );\n }\n });\n };\n\n /**\n * Alters a database table by applying a set of schema changes including updates to columns, indexes, and foreign keys.\n * This function ensures proper ordering of operations to avoid conflicts (e.g., foreign key errors) and handles\n * MySQL-specific quirks where dropping a foreign key can implicitly drop an associated index.\n *\n * @param {Knex.SchemaBuilder} schemaBuilder - Knex SchemaBuilder instance to perform schema operations.\n * @param {TableDiff['diff']} table - A diff object representing the schema changes to be applied to the table.\n * @param {{ indexes: Index[]; foreignKeys: ForeignKey[] }} existingMetadata - Metadata about existing indexes and\n * foreign keys in the table. Used to ensure safe operations and avoid unnecessary modifications.\n * - indexes: Array of existing index definitions.\n * - foreignKeys: Array of existing foreign key definitions.\n */\n const alterTable = async (\n schemaBuilder: Knex.SchemaBuilder,\n table: TableDiff['diff'],\n existingMetadata: { indexes: Index[]; foreignKeys: ForeignKey[] } = {\n indexes: [],\n foreignKeys: [],\n }\n ) => {\n let existingIndexes = [...existingMetadata.indexes];\n const existingForeignKeys = [...existingMetadata.foreignKeys];\n\n // Track dropped foreign keys\n const droppedForeignKeyNames: string[] = [];\n\n await schemaBuilder.alterTable(table.name, async (tableBuilder) => {\n // Drop foreign keys first to avoid foreign key errors in the following steps\n for (const removedForeignKey of table.foreignKeys.removed) {\n debug(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);\n\n droppedForeignKeyNames.push(removedForeignKey.name);\n }\n\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);\n\n droppedForeignKeyNames.push(updatedForeignKey.object.name);\n }\n\n // In MySQL, dropping a foreign key can also implicitly drop an index with the same name\n // Remove dropped foreign keys from existingIndexes for MySQL\n if (db.config.connection.client === 'mysql') {\n existingIndexes = existingIndexes.filter(\n (index) => !droppedForeignKeyNames.includes(index.name)\n );\n }\n\n for (const removedIndex of table.indexes.removed) {\n debug(`Dropping index ${removedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, removedIndex, existingIndexes);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Dropping updated index ${updatedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, updatedIndex.object, existingIndexes);\n }\n\n // Drop columns after FKs have been removed to avoid FK errors\n for (const removedColumn of table.columns.removed) {\n debug(`Dropping column ${removedColumn.name} on ${table.name}`);\n dropColumn(tableBuilder, removedColumn);\n }\n\n // Update existing columns\n for (const updatedColumn of table.columns.updated) {\n debug(`Updating column ${updatedColumn.name} on ${table.name}`);\n\n const { object } = updatedColumn;\n\n if (object.type === 'increments') {\n createColumn(tableBuilder, { ...object, type: 'integer' }).alter();\n } else {\n createColumn(tableBuilder, object).alter();\n }\n }\n\n // Add any new columns\n for (const addedColumn of table.columns.added) {\n debug(`Creating column ${addedColumn.name} on ${table.name}`);\n\n if (addedColumn.type === 'increments' && !db.dialect.canAddIncrements()) {\n tableBuilder.integer(addedColumn.name).unsigned();\n tableBuilder.primary([addedColumn.name]);\n } else {\n createColumn(tableBuilder, addedColumn);\n }\n }\n\n // once the columns have all been updated, we can create indexes again\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, updatedForeignKey.object);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Recreating updated index ${updatedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, updatedIndex.object);\n }\n\n for (const addedForeignKey of table.foreignKeys.added) {\n debug(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, addedForeignKey);\n }\n\n for (const addedIndex of table.indexes.added) {\n debug(`Creating index ${addedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, addedIndex);\n }\n });\n };\n\n /**\n * Drops a table from a database\n */\n const dropTable = (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n return schemaBuilder.dropTableIfExists(table.name);\n };\n\n /**\n * Creates a table foreign keys constraints\n */\n const createTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => createForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Drops a table foreign keys constraints\n */\n const dropTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => dropForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Get the current column type from the database\n */\n const getCurrentColumnType = async (\n tableName: string,\n columnName: string\n ): Promise<string | null> => {\n try {\n const schemaName = db.getSchemaName();\n const result = await db.connection.raw(\n `\n SELECT data_type \n FROM information_schema.columns \n WHERE table_name = ? \n AND column_name = ?\n ${schemaName ? 'AND table_schema = ?' : ''}\n LIMIT 1\n `,\n schemaName ? [tableName, columnName, schemaName] : [tableName, columnName]\n );\n\n return result.rows?.[0]?.data_type || null;\n } catch (error) {\n // Log error but don't fail the migration\n debug(\n `Failed to get column type for ${tableName}.${columnName}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n };\n\n /**\n * Apply column properties after type conversion\n */\n const applyColumnProperties = async (\n trx: Knex.Transaction,\n tableName: string,\n columnName: string,\n column: Column\n ) => {\n // Apply NOT NULL constraint\n if (column.notNullable) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET NOT NULL`, [tableName, columnName]);\n } else {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? DROP NOT NULL`, [tableName, columnName]);\n }\n\n // Apply default value\n if (column.defaultTo !== undefined) {\n const [defaultValue, defaultOpts] = castArray(column.defaultTo);\n if (prop('isRaw', defaultOpts)) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${defaultValue}`, [\n tableName,\n columnName,\n ]);\n } else {\n // PostgreSQL doesn't support parameterized SET DEFAULT, so we need to escape the value\n const escapedDefault =\n typeof defaultValue === 'string' ? `'${defaultValue.replace(/'/g, \"''\")}'` : defaultValue;\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${escapedDefault}`, [\n tableName,\n columnName,\n ]);\n }\n }\n };\n\n /**\n * Handle special type conversions that require custom SQL\n */\n const handleSpecialTypeConversions = async (\n trx: Knex.Transaction,\n table: TableDiff['diff'],\n preloadedColumnTypes: Record<string, string | null> = {}\n ) => {\n // Only PostgreSQL needs special handling for now\n if (db.config.connection.client !== 'postgres') {\n return;\n }\n\n const conversionsToApply = [];\n\n // Check each updated column for special type conversions\n for (const updatedColumn of table.columns.updated) {\n const { name: columnName, object: column } = updatedColumn;\n\n // Use pre-loaded column type if available, otherwise fetch it\n const currentType =\n preloadedColumnTypes[columnName] ?? (await getCurrentColumnType(table.name, columnName));\n\n if (currentType) {\n // Check if dialect has special conversion SQL\n const conversionSQL = db.dialect.getColumnTypeConversionSQL(currentType, column.type);\n\n if (conversionSQL) {\n conversionsToApply.push({\n column: updatedColumn,\n sql: conversionSQL.sql,\n params: [table.name, columnName, columnName],\n currentType,\n targetType: column.type,\n warning: conversionSQL.warning,\n });\n }\n }\n }\n\n // Apply conversions\n for (const conversion of conversionsToApply) {\n const { column, sql, params, currentType, targetType, warning } = conversion;\n\n // Log warning about type conversion\n const warningMessage = warning || 'This conversion may result in data changes.';\n db.logger.warn(\n `Database type conversion: \"${table.name}.${column.name}\" from \"${currentType}\" to \"${targetType}\". ${warningMessage}`\n );\n\n debug(`Applying special type conversion for column ${column.name} on ${table.name}`);\n debug(`Executing SQL: ${sql} with params: ${JSON.stringify(params)}`);\n\n try {\n // Execute the conversion using the transaction connection\n await trx.raw(sql, params);\n debug(`Successfully converted ${column.name} from ${currentType} to ${targetType}`);\n } catch (conversionError) {\n db.logger.error(\n `Failed to convert column ${column.name}: ${conversionError instanceof Error ? conversionError.message : String(conversionError)}`\n );\n throw conversionError;\n }\n\n // Apply other column properties\n await applyColumnProperties(trx, table.name, column.name, column.object);\n\n // Remove from standard updates to prevent double processing\n table.columns.updated = table.columns.updated.filter((col) => col.name !== column.name);\n }\n };\n\n return {\n createTable,\n alterTable,\n dropTable,\n createTableForeignKeys,\n dropTableForeignKeys,\n handleSpecialTypeConversions,\n getCurrentColumnType,\n };\n};\n"],"names":["debug","createDebug","db","helpers","createHelpers","getSchemaBuilder","trx","getSchemaConnection","createSchema","schema","connection","transaction","createTables","tables","table","name","schemaBuilder","createTable","createTableForeignKeys","dropSchema","dropDatabase","reverse","dropTable","updateSchema","schemaDiff","forceMigration","config","settings","dialect","startSchemaUpdate","existingMetadata","columnTypes","updated","indexes","schemaInspector","getIndexes","foreignKeys","getForeignKeys","client","updatedColumn","columns","getCurrentColumnType","added","removed","dropTableForeignKeys","handleSpecialTypeConversions","alterTable","endSchemaUpdate","createForeignKey","tableBuilder","foreignKey","referencedColumns","referencedTable","onDelete","onUpdate","constraint","foreign","references","inTable","getSchemaName","dropForeignKey","existingForeignKeys","some","existingIndex","dropForeign","createIndex","index","type","primary","constraintName","unique","indexName","dropIndex","existingIndexes","dropPrimary","dropUnique","createColumn","column","args","defaultTo","unsigned","notNullable","col","isNil","value","opts","castArray","prop","raw","omit","nullable","dropColumn","forEach","canAlterConstraints","droppedForeignKeyNames","removedForeignKey","push","updatedForeignKey","object","filter","includes","removedIndex","updatedIndex","removedColumn","alter","addedColumn","canAddIncrements","integer","addedForeignKey","addedIndex","dropTableIfExists","tableName","columnName","schemaName","result","rows","data_type","error","Error","message","String","applyColumnProperties","undefined","defaultValue","defaultOpts","escapedDefault","replace","preloadedColumnTypes","conversionsToApply","currentType","conversionSQL","getColumnTypeConversionSQL","sql","params","targetType","warning","conversion","warningMessage","logger","warn","JSON","stringify","conversionError"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/database",
3
- "version": "5.19.0",
3
+ "version": "5.21.0",
4
4
  "description": "Strapi's database layer",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@paralleldrive/cuid2": "2.2.2",
45
- "@strapi/utils": "5.19.0",
45
+ "@strapi/utils": "5.21.0",
46
46
  "ajv": "8.16.0",
47
47
  "date-fns": "2.30.0",
48
48
  "debug": "4.3.4",
@@ -54,8 +54,8 @@
54
54
  },
55
55
  "devDependencies": {
56
56
  "@types/fs-extra": "11.0.4",
57
- "eslint-config-custom": "5.19.0",
58
- "tsconfig": "5.19.0"
57
+ "eslint-config-custom": "5.21.0",
58
+ "tsconfig": "5.21.0"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=18.0.0 <=22.x.x",