@strapi/database 5.30.0 → 5.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connection.js.map +1 -1
- package/dist/connection.mjs.map +1 -1
- package/dist/dialects/dialect.js.map +1 -1
- package/dist/dialects/dialect.mjs.map +1 -1
- package/dist/dialects/index.js.map +1 -1
- package/dist/dialects/index.mjs.map +1 -1
- package/dist/dialects/mysql/database-inspector.js.map +1 -1
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -1
- package/dist/dialects/mysql/index.js +1 -2
- package/dist/dialects/mysql/index.js.map +1 -1
- package/dist/dialects/mysql/index.mjs +1 -2
- package/dist/dialects/mysql/index.mjs.map +1 -1
- package/dist/dialects/mysql/schema-inspector.js.map +1 -1
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -1
- package/dist/dialects/postgresql/index.js.map +1 -1
- package/dist/dialects/postgresql/index.mjs.map +1 -1
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -1
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -1
- package/dist/dialects/sqlite/index.js.map +1 -1
- package/dist/dialects/sqlite/index.mjs.map +1 -1
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -1
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -1
- package/dist/entity-manager/index.js.map +1 -1
- package/dist/entity-manager/index.mjs.map +1 -1
- package/dist/entity-manager/morph-relations.js.map +1 -1
- package/dist/entity-manager/morph-relations.mjs.map +1 -1
- package/dist/errors/database.js.map +1 -1
- package/dist/errors/database.mjs.map +1 -1
- package/dist/errors/invalid-date.js.map +1 -1
- package/dist/errors/invalid-date.mjs.map +1 -1
- package/dist/errors/invalid-datetime.js.map +1 -1
- package/dist/errors/invalid-datetime.mjs.map +1 -1
- package/dist/errors/invalid-relation.js.map +1 -1
- package/dist/errors/invalid-relation.mjs.map +1 -1
- package/dist/errors/invalid-time.js.map +1 -1
- package/dist/errors/invalid-time.mjs.map +1 -1
- package/dist/errors/not-null.js.map +1 -1
- package/dist/errors/not-null.mjs.map +1 -1
- package/dist/fields/field.js.map +1 -1
- package/dist/fields/field.mjs.map +1 -1
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/index.mjs.map +1 -1
- package/dist/fields/number.js.map +1 -1
- package/dist/fields/number.mjs.map +1 -1
- package/dist/fields/shared/parsers.js.map +1 -1
- package/dist/fields/shared/parsers.mjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/metadata/metadata.js.map +1 -1
- package/dist/metadata/metadata.mjs.map +1 -1
- package/dist/metadata/relations.js.map +1 -1
- package/dist/metadata/relations.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -1
- package/dist/migrations/logger.js.map +1 -1
- package/dist/migrations/logger.mjs.map +1 -1
- package/dist/query/helpers/join.js.map +1 -1
- package/dist/query/helpers/join.mjs.map +1 -1
- package/dist/query/helpers/order-by.js.map +1 -1
- package/dist/query/helpers/order-by.mjs.map +1 -1
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/search.js.map +1 -1
- package/dist/query/helpers/search.mjs.map +1 -1
- package/dist/query/helpers/streams/readable.js.map +1 -1
- package/dist/query/helpers/streams/readable.mjs.map +1 -1
- package/dist/query/helpers/where.js.map +1 -1
- package/dist/query/helpers/where.mjs.map +1 -1
- package/dist/query/query-builder.js.map +1 -1
- package/dist/query/query-builder.mjs.map +1 -1
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -1
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -1
- package/dist/schema/builder.js.map +1 -1
- package/dist/schema/builder.mjs.map +1 -1
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/schema.mjs.map +1 -1
- package/dist/utils/identifiers/hash.js.map +1 -1
- package/dist/utils/identifiers/hash.mjs.map +1 -1
- package/dist/utils/identifiers/index.js +2 -4
- package/dist/utils/identifiers/index.js.map +1 -1
- package/dist/utils/identifiers/index.mjs +2 -4
- package/dist/utils/identifiers/index.mjs.map +1 -1
- package/dist/utils/knex.js.map +1 -1
- package/dist/utils/knex.mjs.map +1 -1
- package/package.json +4 -4
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\nfunction isClientValid(config: { client?: unknown }): config is { client: keyof typeof clientMap } {\n return Object.keys(clientMap).includes(config.client as string);\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isClientValid(userConfig)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: (clientMap as any)[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n knexConfig.pool = knexConfig.pool || {};\n // if the user has set their own afterCreate in config, we will replace it and call it\n const userAfterCreate = knexConfig.pool?.afterCreate;\n const strapiAfterCreate = strapiConfig.pool.afterCreate;\n knexConfig.pool.afterCreate = (\n conn: unknown,\n done: (err: Error | null | undefined, connection: any) => void\n ) => {\n strapiAfterCreate(conn, (err: Error | null | undefined, nativeConn: any) => {\n if (err) {\n return done(err, nativeConn);\n }\n if (userAfterCreate) {\n return userAfterCreate(nativeConn, done);\n }\n return done(null, nativeConn);\n });\n };\n }\n\n return knex(knexConfig);\n};\n"],"names":["clientMap","sqlite","mysql","postgres","isClientValid","config","Object","keys","includes","client","createConnection","userConfig","strapiConfig","Error","knexConfig","pool","afterCreate","userAfterCreate","strapiAfterCreate","conn","done","err","nativeConn","knex"],"mappings":";;;;AAGA,MAAMA,SAAY,GAAA;IAChBC,MAAQ,EAAA,gBAAA;IACRC,KAAO,EAAA,QAAA;IACPC,QAAU,EAAA;AACZ,CAAA;AAEA,SAASC,cAAcC,MAA4B,EAAA;AACjD,IAAA,OAAOC,OAAOC,IAAI,CAACP,WAAWQ,QAAQ,CAACH,OAAOI,MAAM,CAAA;AACtD;AAEO,MAAMC,gBAAmB,GAAA,CAACC,UAAyBC,EAAAA,YAAAA,GAAAA;IACxD,IAAI,CAACR,cAAcO,UAAa,CAAA,EAAA;
|
|
1
|
+
{"version":3,"file":"connection.js","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\nfunction isClientValid(config: { client?: unknown }): config is { client: keyof typeof clientMap } {\n return Object.keys(clientMap).includes(config.client as string);\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isClientValid(userConfig)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: (clientMap as any)[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n knexConfig.pool = knexConfig.pool || {};\n // if the user has set their own afterCreate in config, we will replace it and call it\n const userAfterCreate = knexConfig.pool?.afterCreate;\n const strapiAfterCreate = strapiConfig.pool.afterCreate;\n knexConfig.pool.afterCreate = (\n conn: unknown,\n done: (err: Error | null | undefined, connection: any) => void\n ) => {\n strapiAfterCreate(conn, (err: Error | null | undefined, nativeConn: any) => {\n if (err) {\n return done(err, nativeConn);\n }\n if (userAfterCreate) {\n return userAfterCreate(nativeConn, done);\n }\n return done(null, nativeConn);\n });\n };\n }\n\n return knex(knexConfig);\n};\n"],"names":["clientMap","sqlite","mysql","postgres","isClientValid","config","Object","keys","includes","client","createConnection","userConfig","strapiConfig","Error","knexConfig","pool","afterCreate","userAfterCreate","strapiAfterCreate","conn","done","err","nativeConn","knex"],"mappings":";;;;AAGA,MAAMA,SAAY,GAAA;IAChBC,MAAQ,EAAA,gBAAA;IACRC,KAAO,EAAA,QAAA;IACPC,QAAU,EAAA;AACZ,CAAA;AAEA,SAASC,cAAcC,MAA4B,EAAA;AACjD,IAAA,OAAOC,OAAOC,IAAI,CAACP,WAAWQ,QAAQ,CAACH,OAAOI,MAAM,CAAA;AACtD;AAEO,MAAMC,gBAAmB,GAAA,CAACC,UAAyBC,EAAAA,YAAAA,GAAAA;IACxD,IAAI,CAACR,cAAcO,UAAa,CAAA,EAAA;AAC9B,QAAA,MAAM,IAAIE,KAAM,CAAA,CAAC,4BAA4B,EAAEF,UAAAA,CAAWF,MAAM,CAAE,CAAA,CAAA;AACpE;AAEA,IAAA,MAAMK,UAA0B,GAAA;AAAE,QAAA,GAAGH,UAAU;AAAEF,QAAAA,MAAAA,EAAQ,SAAkB,CAACE,UAAAA,CAAWF,MAAM;AAAE,KAAA;;IAG/F,IAAIG,YAAAA,EAAcG,MAAMC,WAAa,EAAA;AACnCF,QAAAA,UAAAA,CAAWC,IAAI,GAAGD,UAAWC,CAAAA,IAAI,IAAI,EAAC;;QAEtC,MAAME,eAAAA,GAAkBH,UAAWC,CAAAA,IAAI,EAAEC,WAAAA;AACzC,QAAA,MAAME,iBAAoBN,GAAAA,YAAAA,CAAaG,IAAI,CAACC,WAAW;AACvDF,QAAAA,UAAAA,CAAWC,IAAI,CAACC,WAAW,GAAG,CAC5BG,IACAC,EAAAA,IAAAA,GAAAA;YAEAF,iBAAkBC,CAAAA,IAAAA,EAAM,CAACE,GAA+BC,EAAAA,UAAAA,GAAAA;AACtD,gBAAA,IAAID,GAAK,EAAA;AACP,oBAAA,OAAOD,KAAKC,GAAKC,EAAAA,UAAAA,CAAAA;AACnB;AACA,gBAAA,IAAIL,eAAiB,EAAA;AACnB,oBAAA,OAAOA,gBAAgBK,UAAYF,EAAAA,IAAAA,CAAAA;AACrC;AACA,gBAAA,OAAOA,KAAK,IAAME,EAAAA,UAAAA,CAAAA;AACpB,aAAA,CAAA;AACF,SAAA;AACF;AAEA,IAAA,OAAOC,IAAKT,CAAAA,UAAAA,CAAAA;AACd;;;;"}
|
package/dist/connection.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.mjs","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\nfunction isClientValid(config: { client?: unknown }): config is { client: keyof typeof clientMap } {\n return Object.keys(clientMap).includes(config.client as string);\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isClientValid(userConfig)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: (clientMap as any)[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n knexConfig.pool = knexConfig.pool || {};\n // if the user has set their own afterCreate in config, we will replace it and call it\n const userAfterCreate = knexConfig.pool?.afterCreate;\n const strapiAfterCreate = strapiConfig.pool.afterCreate;\n knexConfig.pool.afterCreate = (\n conn: unknown,\n done: (err: Error | null | undefined, connection: any) => void\n ) => {\n strapiAfterCreate(conn, (err: Error | null | undefined, nativeConn: any) => {\n if (err) {\n return done(err, nativeConn);\n }\n if (userAfterCreate) {\n return userAfterCreate(nativeConn, done);\n }\n return done(null, nativeConn);\n });\n };\n }\n\n return knex(knexConfig);\n};\n"],"names":["clientMap","sqlite","mysql","postgres","isClientValid","config","Object","keys","includes","client","createConnection","userConfig","strapiConfig","Error","knexConfig","pool","afterCreate","userAfterCreate","strapiAfterCreate","conn","done","err","nativeConn","knex"],"mappings":";;AAGA,MAAMA,SAAY,GAAA;IAChBC,MAAQ,EAAA,gBAAA;IACRC,KAAO,EAAA,QAAA;IACPC,QAAU,EAAA;AACZ,CAAA;AAEA,SAASC,cAAcC,MAA4B,EAAA;AACjD,IAAA,OAAOC,OAAOC,IAAI,CAACP,WAAWQ,QAAQ,CAACH,OAAOI,MAAM,CAAA;AACtD;AAEO,MAAMC,gBAAmB,GAAA,CAACC,UAAyBC,EAAAA,YAAAA,GAAAA;IACxD,IAAI,CAACR,cAAcO,UAAa,CAAA,EAAA;
|
|
1
|
+
{"version":3,"file":"connection.mjs","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\nfunction isClientValid(config: { client?: unknown }): config is { client: keyof typeof clientMap } {\n return Object.keys(clientMap).includes(config.client as string);\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isClientValid(userConfig)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: (clientMap as any)[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n knexConfig.pool = knexConfig.pool || {};\n // if the user has set their own afterCreate in config, we will replace it and call it\n const userAfterCreate = knexConfig.pool?.afterCreate;\n const strapiAfterCreate = strapiConfig.pool.afterCreate;\n knexConfig.pool.afterCreate = (\n conn: unknown,\n done: (err: Error | null | undefined, connection: any) => void\n ) => {\n strapiAfterCreate(conn, (err: Error | null | undefined, nativeConn: any) => {\n if (err) {\n return done(err, nativeConn);\n }\n if (userAfterCreate) {\n return userAfterCreate(nativeConn, done);\n }\n return done(null, nativeConn);\n });\n };\n }\n\n return knex(knexConfig);\n};\n"],"names":["clientMap","sqlite","mysql","postgres","isClientValid","config","Object","keys","includes","client","createConnection","userConfig","strapiConfig","Error","knexConfig","pool","afterCreate","userAfterCreate","strapiAfterCreate","conn","done","err","nativeConn","knex"],"mappings":";;AAGA,MAAMA,SAAY,GAAA;IAChBC,MAAQ,EAAA,gBAAA;IACRC,KAAO,EAAA,QAAA;IACPC,QAAU,EAAA;AACZ,CAAA;AAEA,SAASC,cAAcC,MAA4B,EAAA;AACjD,IAAA,OAAOC,OAAOC,IAAI,CAACP,WAAWQ,QAAQ,CAACH,OAAOI,MAAM,CAAA;AACtD;AAEO,MAAMC,gBAAmB,GAAA,CAACC,UAAyBC,EAAAA,YAAAA,GAAAA;IACxD,IAAI,CAACR,cAAcO,UAAa,CAAA,EAAA;AAC9B,QAAA,MAAM,IAAIE,KAAM,CAAA,CAAC,4BAA4B,EAAEF,UAAAA,CAAWF,MAAM,CAAE,CAAA,CAAA;AACpE;AAEA,IAAA,MAAMK,UAA0B,GAAA;AAAE,QAAA,GAAGH,UAAU;AAAEF,QAAAA,MAAAA,EAAQ,SAAkB,CAACE,UAAAA,CAAWF,MAAM;AAAE,KAAA;;IAG/F,IAAIG,YAAAA,EAAcG,MAAMC,WAAa,EAAA;AACnCF,QAAAA,UAAAA,CAAWC,IAAI,GAAGD,UAAWC,CAAAA,IAAI,IAAI,EAAC;;QAEtC,MAAME,eAAAA,GAAkBH,UAAWC,CAAAA,IAAI,EAAEC,WAAAA;AACzC,QAAA,MAAME,iBAAoBN,GAAAA,YAAAA,CAAaG,IAAI,CAACC,WAAW;AACvDF,QAAAA,UAAAA,CAAWC,IAAI,CAACC,WAAW,GAAG,CAC5BG,IACAC,EAAAA,IAAAA,GAAAA;YAEAF,iBAAkBC,CAAAA,IAAAA,EAAM,CAACE,GAA+BC,EAAAA,UAAAA,GAAAA;AACtD,gBAAA,IAAID,GAAK,EAAA;AACP,oBAAA,OAAOD,KAAKC,GAAKC,EAAAA,UAAAA,CAAAA;AACnB;AACA,gBAAA,IAAIL,eAAiB,EAAA;AACnB,oBAAA,OAAOA,gBAAgBK,UAAYF,EAAAA,IAAAA,CAAAA;AACrC;AACA,gBAAA,OAAOA,KAAK,IAAME,EAAAA,UAAAA,CAAAA;AACpB,aAAA,CAAA;AACF,SAAA;AACF;AAEA,IAAA,OAAOC,IAAKT,CAAAA,UAAAA,CAAAA;AACd;;;;"}
|
|
@@ -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 /**\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","
|
|
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","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;IA5EA,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;;;;"}
|
|
@@ -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 /**\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","
|
|
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","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;IA5EA,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;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/dialects/index.ts"],"sourcesContent":["import type { Database } from '..';\nimport Dialect from './dialect';\nimport PostgresClass from './postgresql';\nimport MysqlClass from './mysql';\nimport SqliteClass from './sqlite';\n\n/**\n * Require our dialect-specific code\n */\nconst getDialectClass = (client: string): typeof Dialect => {\n switch (client) {\n case 'postgres':\n return PostgresClass;\n case 'mysql':\n return MysqlClass;\n case 'sqlite':\n return SqliteClass;\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\n/**\n * Get the dialect of a database client\n */\nconst getDialectName = (client: unknown) => {\n switch (client) {\n case 'postgres':\n return 'postgres';\n case 'mysql':\n return 'mysql';\n case 'sqlite':\n return 'sqlite';\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\nconst getDialect = (db: Database) => {\n const { client } = db.config.connection;\n const dialectName = getDialectName(client);\n\n const constructor = getDialectClass(dialectName);\n const dialect = new constructor(db, dialectName);\n\n return dialect;\n};\n\nexport { Dialect, getDialect };\n"],"names":["getDialectClass","client","PostgresClass","MysqlClass","SqliteClass","Error","getDialectName","getDialect","db","config","connection","dialectName","constructor","dialect"],"mappings":";;;;;;AAMA;;IAGA,MAAMA,kBAAkB,CAACC,MAAAA,GAAAA;IACvB,OAAQA,MAAAA;QACN,KAAK,UAAA;YACH,OAAOC,OAAAA;QACT,KAAK,OAAA;YACH,OAAOC,OAAAA;QACT,KAAK,QAAA;YACH,OAAOC,KAAAA;AACT,QAAA;AACE,YAAA,MAAM,IAAIC,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/dialects/index.ts"],"sourcesContent":["import type { Database } from '..';\nimport Dialect from './dialect';\nimport PostgresClass from './postgresql';\nimport MysqlClass from './mysql';\nimport SqliteClass from './sqlite';\n\n/**\n * Require our dialect-specific code\n */\nconst getDialectClass = (client: string): typeof Dialect => {\n switch (client) {\n case 'postgres':\n return PostgresClass;\n case 'mysql':\n return MysqlClass;\n case 'sqlite':\n return SqliteClass;\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\n/**\n * Get the dialect of a database client\n */\nconst getDialectName = (client: unknown) => {\n switch (client) {\n case 'postgres':\n return 'postgres';\n case 'mysql':\n return 'mysql';\n case 'sqlite':\n return 'sqlite';\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\nconst getDialect = (db: Database) => {\n const { client } = db.config.connection;\n const dialectName = getDialectName(client);\n\n const constructor = getDialectClass(dialectName);\n const dialect = new constructor(db, dialectName);\n\n return dialect;\n};\n\nexport { Dialect, getDialect };\n"],"names":["getDialectClass","client","PostgresClass","MysqlClass","SqliteClass","Error","getDialectName","getDialect","db","config","connection","dialectName","constructor","dialect"],"mappings":";;;;;;AAMA;;IAGA,MAAMA,kBAAkB,CAACC,MAAAA,GAAAA;IACvB,OAAQA,MAAAA;QACN,KAAK,UAAA;YACH,OAAOC,OAAAA;QACT,KAAK,OAAA;YACH,OAAOC,OAAAA;QACT,KAAK,QAAA;YACH,OAAOC,KAAAA;AACT,QAAA;AACE,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,gBAAgB,EAAEJ,MAAQ,CAAA,CAAA,CAAA;AAC/C;AACF,CAAA;AAEA;;IAGA,MAAMK,iBAAiB,CAACL,MAAAA,GAAAA;IACtB,OAAQA,MAAAA;QACN,KAAK,UAAA;YACH,OAAO,UAAA;QACT,KAAK,OAAA;YACH,OAAO,OAAA;QACT,KAAK,QAAA;YACH,OAAO,QAAA;AACT,QAAA;AACE,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,gBAAgB,EAAEJ,MAAQ,CAAA,CAAA,CAAA;AAC/C;AACF,CAAA;AAEA,MAAMM,aAAa,CAACC,EAAAA,GAAAA;AAClB,IAAA,MAAM,EAAEP,MAAM,EAAE,GAAGO,EAAGC,CAAAA,MAAM,CAACC,UAAU;AACvC,IAAA,MAAMC,cAAcL,cAAeL,CAAAA,MAAAA,CAAAA;AAEnC,IAAA,MAAMW,cAAcZ,eAAgBW,CAAAA,WAAAA,CAAAA;IACpC,MAAME,OAAAA,GAAU,IAAID,WAAAA,CAAYJ,EAAIG,EAAAA,WAAAA,CAAAA;IAEpC,OAAOE,OAAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/dialects/index.ts"],"sourcesContent":["import type { Database } from '..';\nimport Dialect from './dialect';\nimport PostgresClass from './postgresql';\nimport MysqlClass from './mysql';\nimport SqliteClass from './sqlite';\n\n/**\n * Require our dialect-specific code\n */\nconst getDialectClass = (client: string): typeof Dialect => {\n switch (client) {\n case 'postgres':\n return PostgresClass;\n case 'mysql':\n return MysqlClass;\n case 'sqlite':\n return SqliteClass;\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\n/**\n * Get the dialect of a database client\n */\nconst getDialectName = (client: unknown) => {\n switch (client) {\n case 'postgres':\n return 'postgres';\n case 'mysql':\n return 'mysql';\n case 'sqlite':\n return 'sqlite';\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\nconst getDialect = (db: Database) => {\n const { client } = db.config.connection;\n const dialectName = getDialectName(client);\n\n const constructor = getDialectClass(dialectName);\n const dialect = new constructor(db, dialectName);\n\n return dialect;\n};\n\nexport { Dialect, getDialect };\n"],"names":["getDialectClass","client","PostgresClass","MysqlClass","SqliteClass","Error","getDialectName","getDialect","db","config","connection","dialectName","constructor","dialect"],"mappings":";;;;AAMA;;IAGA,MAAMA,kBAAkB,CAACC,MAAAA,GAAAA;IACvB,OAAQA,MAAAA;QACN,KAAK,UAAA;YACH,OAAOC,eAAAA;QACT,KAAK,OAAA;YACH,OAAOC,YAAAA;QACT,KAAK,QAAA;YACH,OAAOC,aAAAA;AACT,QAAA;AACE,YAAA,MAAM,IAAIC,
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/dialects/index.ts"],"sourcesContent":["import type { Database } from '..';\nimport Dialect from './dialect';\nimport PostgresClass from './postgresql';\nimport MysqlClass from './mysql';\nimport SqliteClass from './sqlite';\n\n/**\n * Require our dialect-specific code\n */\nconst getDialectClass = (client: string): typeof Dialect => {\n switch (client) {\n case 'postgres':\n return PostgresClass;\n case 'mysql':\n return MysqlClass;\n case 'sqlite':\n return SqliteClass;\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\n/**\n * Get the dialect of a database client\n */\nconst getDialectName = (client: unknown) => {\n switch (client) {\n case 'postgres':\n return 'postgres';\n case 'mysql':\n return 'mysql';\n case 'sqlite':\n return 'sqlite';\n default:\n throw new Error(`Unknown dialect ${client}`);\n }\n};\n\nconst getDialect = (db: Database) => {\n const { client } = db.config.connection;\n const dialectName = getDialectName(client);\n\n const constructor = getDialectClass(dialectName);\n const dialect = new constructor(db, dialectName);\n\n return dialect;\n};\n\nexport { Dialect, getDialect };\n"],"names":["getDialectClass","client","PostgresClass","MysqlClass","SqliteClass","Error","getDialectName","getDialect","db","config","connection","dialectName","constructor","dialect"],"mappings":";;;;AAMA;;IAGA,MAAMA,kBAAkB,CAACC,MAAAA,GAAAA;IACvB,OAAQA,MAAAA;QACN,KAAK,UAAA;YACH,OAAOC,eAAAA;QACT,KAAK,OAAA;YACH,OAAOC,YAAAA;QACT,KAAK,QAAA;YACH,OAAOC,aAAAA;AACT,QAAA;AACE,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,gBAAgB,EAAEJ,MAAQ,CAAA,CAAA,CAAA;AAC/C;AACF,CAAA;AAEA;;IAGA,MAAMK,iBAAiB,CAACL,MAAAA,GAAAA;IACtB,OAAQA,MAAAA;QACN,KAAK,UAAA;YACH,OAAO,UAAA;QACT,KAAK,OAAA;YACH,OAAO,OAAA;QACT,KAAK,QAAA;YACH,OAAO,QAAA;AACT,QAAA;AACE,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,gBAAgB,EAAEJ,MAAQ,CAAA,CAAA,CAAA;AAC/C;AACF,CAAA;AAEA,MAAMM,aAAa,CAACC,EAAAA,GAAAA;AAClB,IAAA,MAAM,EAAEP,MAAM,EAAE,GAAGO,EAAGC,CAAAA,MAAM,CAACC,UAAU;AACvC,IAAA,MAAMC,cAAcL,cAAeL,CAAAA,MAAAA,CAAAA;AAEnC,IAAA,MAAMW,cAAcZ,eAAgBW,CAAAA,WAAAA,CAAAA;IACpC,MAAME,OAAAA,GAAU,IAAID,WAAAA,CAAYJ,EAAIG,EAAAA,WAAAA,CAAAA;IAEpC,OAAOE,OAAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-inspector.js","sources":["../../../src/dialects/mysql/database-inspector.ts"],"sourcesContent":["import { MARIADB, MYSQL } from './constants';\nimport type { Database } from '../..';\n\nexport interface Information {\n database: typeof MARIADB | typeof MYSQL | null;\n version: string | null;\n}\n\nconst SQL_QUERIES = {\n VERSION: `SELECT version() as version`,\n};\n\nexport default class MysqlDatabaseInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getInformation(nativeConnection?: unknown): Promise<Information> {\n let database: Information['database'];\n let versionNumber: Information['version'];\n try {\n const [results] = await this.db.connection\n .raw(SQL_QUERIES.VERSION)\n .connection(nativeConnection);\n const versionSplit = results[0].version.split('-');\n const databaseName = versionSplit[1];\n versionNumber = versionSplit[0];\n database = databaseName && databaseName.toLowerCase() === 'mariadb' ? MARIADB : MYSQL;\n } catch (e) {\n return {\n database: null,\n version: null,\n };\n }\n\n return {\n database,\n version: versionNumber,\n };\n }\n}\n"],"names":["SQL_QUERIES","VERSION","MysqlDatabaseInspector","getInformation","nativeConnection","database","versionNumber","results","db","connection","raw","versionSplit","version","split","databaseName","toLowerCase","MARIADB","MYSQL","e"
|
|
1
|
+
{"version":3,"file":"database-inspector.js","sources":["../../../src/dialects/mysql/database-inspector.ts"],"sourcesContent":["import { MARIADB, MYSQL } from './constants';\nimport type { Database } from '../..';\n\nexport interface Information {\n database: typeof MARIADB | typeof MYSQL | null;\n version: string | null;\n}\n\nconst SQL_QUERIES = {\n VERSION: `SELECT version() as version`,\n};\n\nexport default class MysqlDatabaseInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getInformation(nativeConnection?: unknown): Promise<Information> {\n let database: Information['database'];\n let versionNumber: Information['version'];\n try {\n const [results] = await this.db.connection\n .raw(SQL_QUERIES.VERSION)\n .connection(nativeConnection);\n const versionSplit = results[0].version.split('-');\n const databaseName = versionSplit[1];\n versionNumber = versionSplit[0];\n database = databaseName && databaseName.toLowerCase() === 'mariadb' ? MARIADB : MYSQL;\n } catch (e) {\n return {\n database: null,\n version: null,\n };\n }\n\n return {\n database,\n version: versionNumber,\n };\n }\n}\n"],"names":["SQL_QUERIES","VERSION","MysqlDatabaseInspector","getInformation","nativeConnection","database","versionNumber","results","db","connection","raw","versionSplit","version","split","databaseName","toLowerCase","MARIADB","MYSQL","e"],"mappings":";;;;AAQA,MAAMA,WAAc,GAAA;IAClBC,OAAS,EAAA,CAAC,2BAA2B;AACvC,CAAA;AAEe,MAAMC,sBAAAA,CAAAA;IAOnB,MAAMC,cAAAA,CAAeC,gBAA0B,EAAwB;QACrE,IAAIC,QAAAA;QACJ,IAAIC,aAAAA;QACJ,IAAI;AACF,YAAA,MAAM,CAACC,OAAQ,CAAA,GAAG,MAAM,IAAI,CAACC,EAAE,CAACC,UAAU,CACvCC,GAAG,CAACV,WAAAA,CAAYC,OAAO,CAAA,CACvBQ,UAAU,CAACL,gBAAAA,CAAAA;YACd,MAAMO,YAAAA,GAAeJ,OAAO,CAAC,CAAA,CAAE,CAACK,OAAO,CAACC,KAAK,CAAC,GAAA,CAAA;YAC9C,MAAMC,YAAAA,GAAeH,YAAY,CAAC,CAAE,CAAA;YACpCL,aAAgBK,GAAAA,YAAY,CAAC,CAAE,CAAA;AAC/BN,YAAAA,QAAAA,GAAWS,YAAgBA,IAAAA,YAAAA,CAAaC,WAAW,EAAA,KAAO,YAAYC,iBAAUC,GAAAA,eAAAA;AAClF,SAAA,CAAE,OAAOC,CAAG,EAAA;YACV,OAAO;gBACLb,QAAU,EAAA,IAAA;gBACVO,OAAS,EAAA;AACX,aAAA;AACF;QAEA,OAAO;AACLP,YAAAA,QAAAA;YACAO,OAASN,EAAAA;AACX,SAAA;AACF;AA1BA,IAAA,WAAA,CAAYE,EAAY,CAAE;QACxB,IAAI,CAACA,EAAE,GAAGA,EAAAA;AACZ;AAyBF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-inspector.mjs","sources":["../../../src/dialects/mysql/database-inspector.ts"],"sourcesContent":["import { MARIADB, MYSQL } from './constants';\nimport type { Database } from '../..';\n\nexport interface Information {\n database: typeof MARIADB | typeof MYSQL | null;\n version: string | null;\n}\n\nconst SQL_QUERIES = {\n VERSION: `SELECT version() as version`,\n};\n\nexport default class MysqlDatabaseInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getInformation(nativeConnection?: unknown): Promise<Information> {\n let database: Information['database'];\n let versionNumber: Information['version'];\n try {\n const [results] = await this.db.connection\n .raw(SQL_QUERIES.VERSION)\n .connection(nativeConnection);\n const versionSplit = results[0].version.split('-');\n const databaseName = versionSplit[1];\n versionNumber = versionSplit[0];\n database = databaseName && databaseName.toLowerCase() === 'mariadb' ? MARIADB : MYSQL;\n } catch (e) {\n return {\n database: null,\n version: null,\n };\n }\n\n return {\n database,\n version: versionNumber,\n };\n }\n}\n"],"names":["SQL_QUERIES","VERSION","MysqlDatabaseInspector","getInformation","nativeConnection","database","versionNumber","results","db","connection","raw","versionSplit","version","split","databaseName","toLowerCase","MARIADB","MYSQL","e"
|
|
1
|
+
{"version":3,"file":"database-inspector.mjs","sources":["../../../src/dialects/mysql/database-inspector.ts"],"sourcesContent":["import { MARIADB, MYSQL } from './constants';\nimport type { Database } from '../..';\n\nexport interface Information {\n database: typeof MARIADB | typeof MYSQL | null;\n version: string | null;\n}\n\nconst SQL_QUERIES = {\n VERSION: `SELECT version() as version`,\n};\n\nexport default class MysqlDatabaseInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getInformation(nativeConnection?: unknown): Promise<Information> {\n let database: Information['database'];\n let versionNumber: Information['version'];\n try {\n const [results] = await this.db.connection\n .raw(SQL_QUERIES.VERSION)\n .connection(nativeConnection);\n const versionSplit = results[0].version.split('-');\n const databaseName = versionSplit[1];\n versionNumber = versionSplit[0];\n database = databaseName && databaseName.toLowerCase() === 'mariadb' ? MARIADB : MYSQL;\n } catch (e) {\n return {\n database: null,\n version: null,\n };\n }\n\n return {\n database,\n version: versionNumber,\n };\n }\n}\n"],"names":["SQL_QUERIES","VERSION","MysqlDatabaseInspector","getInformation","nativeConnection","database","versionNumber","results","db","connection","raw","versionSplit","version","split","databaseName","toLowerCase","MARIADB","MYSQL","e"],"mappings":";;AAQA,MAAMA,WAAc,GAAA;IAClBC,OAAS,EAAA,CAAC,2BAA2B;AACvC,CAAA;AAEe,MAAMC,sBAAAA,CAAAA;IAOnB,MAAMC,cAAAA,CAAeC,gBAA0B,EAAwB;QACrE,IAAIC,QAAAA;QACJ,IAAIC,aAAAA;QACJ,IAAI;AACF,YAAA,MAAM,CAACC,OAAQ,CAAA,GAAG,MAAM,IAAI,CAACC,EAAE,CAACC,UAAU,CACvCC,GAAG,CAACV,WAAAA,CAAYC,OAAO,CAAA,CACvBQ,UAAU,CAACL,gBAAAA,CAAAA;YACd,MAAMO,YAAAA,GAAeJ,OAAO,CAAC,CAAA,CAAE,CAACK,OAAO,CAACC,KAAK,CAAC,GAAA,CAAA;YAC9C,MAAMC,YAAAA,GAAeH,YAAY,CAAC,CAAE,CAAA;YACpCL,aAAgBK,GAAAA,YAAY,CAAC,CAAE,CAAA;AAC/BN,YAAAA,QAAAA,GAAWS,YAAgBA,IAAAA,YAAAA,CAAaC,WAAW,EAAA,KAAO,YAAYC,OAAUC,GAAAA,KAAAA;AAClF,SAAA,CAAE,OAAOC,CAAG,EAAA;YACV,OAAO;gBACLb,QAAU,EAAA,IAAA;gBACVO,OAAS,EAAA;AACX,aAAA;AACF;QAEA,OAAO;AACLP,YAAAA,QAAAA;YACAO,OAASN,EAAAA;AACX,SAAA;AACF;AA1BA,IAAA,WAAA,CAAYE,EAAY,CAAE;QACxB,IAAI,CAACA,EAAE,GAAGA,EAAAA;AACZ;AAyBF;;;;"}
|
|
@@ -64,8 +64,7 @@ class MysqlDialect extends dialect {
|
|
|
64
64
|
super.transformErrors(error);
|
|
65
65
|
}
|
|
66
66
|
constructor(db){
|
|
67
|
-
super(db, 'mysql');
|
|
68
|
-
this.info = null;
|
|
67
|
+
super(db, 'mysql'), this.info = null;
|
|
69
68
|
this.schemaInspector = new schemaInspector(db);
|
|
70
69
|
this.databaseInspector = new databaseInspector(db);
|
|
71
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/dialects/mysql/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport Dialect from '../dialect';\nimport MysqlSchemaInspector from './schema-inspector';\nimport MysqlDatabaseInspector from './database-inspector';\nimport type { Database } from '../..';\n\nimport type { Information } from './database-inspector';\n\nexport default class MysqlDialect extends Dialect {\n schemaInspector: MysqlSchemaInspector;\n\n databaseInspector: MysqlDatabaseInspector;\n\n info: Information | null = null;\n\n constructor(db: Database) {\n super(db, 'mysql');\n\n this.schemaInspector = new MysqlSchemaInspector(db);\n this.databaseInspector = new MysqlDatabaseInspector(db);\n }\n\n configure() {\n const connection = this.db.config.connection.connection as Knex.MySqlConnectionConfig;\n\n connection.supportBigNumbers = true;\n // Only allow bigNumberStrings option set to be true if no connection option passed\n // Otherwise bigNumberStrings option should be allowed to used from DB config\n if (connection.bigNumberStrings === undefined) {\n connection.bigNumberStrings = true;\n }\n connection.typeCast = (\n field: { type: string; string: () => string; length: number },\n next: () => void\n ) => {\n if (field.type === 'DECIMAL' || field.type === 'NEWDECIMAL') {\n const value = field.string();\n return value === null ? null : Number(value);\n }\n\n if (field.type === 'TINY' && field.length === 1) {\n const value = field.string();\n return value ? value === '1' : null;\n }\n\n if (field.type === 'DATE') {\n return field.string();\n }\n\n return next();\n };\n }\n\n async initialize(nativeConnection: unknown) {\n try {\n await this.db.connection\n .raw(`set session sql_require_primary_key = 0;`)\n .connection(nativeConnection);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n\n // We only need to get info on the first connection in the pool\n /**\n * Note: There is a race condition here where if two connections are opened at the same time, both will retrieve\n * db info, but it doesn't cause issues, it's just one wasted query one time, so we can safely leave it to avoid\n * adding extra complexity\n * */\n if (!this.info) {\n this.info = await this.databaseInspector.getInformation(nativeConnection);\n }\n }\n\n async startSchemaUpdate() {\n try {\n await this.db.connection.raw(`set foreign_key_checks = 0;`);\n await this.db.connection.raw(`set session sql_require_primary_key = 0;`);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n }\n\n async endSchemaUpdate() {\n await this.db.connection.raw(`set foreign_key_checks = 1;`);\n }\n\n supportsUnsigned() {\n return true;\n }\n\n usesForeignKeys() {\n return true;\n }\n\n transformErrors(error: Error) {\n super.transformErrors(error);\n }\n}\n"],"names":["MysqlDialect","Dialect","configure","connection","db","config","supportBigNumbers","bigNumberStrings","undefined","typeCast","field","next","type","value","string","Number","length","initialize","nativeConnection","raw","err","info","databaseInspector","getInformation","startSchemaUpdate","endSchemaUpdate","supportsUnsigned","usesForeignKeys","transformErrors","error","
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/dialects/mysql/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport Dialect from '../dialect';\nimport MysqlSchemaInspector from './schema-inspector';\nimport MysqlDatabaseInspector from './database-inspector';\nimport type { Database } from '../..';\n\nimport type { Information } from './database-inspector';\n\nexport default class MysqlDialect extends Dialect {\n schemaInspector: MysqlSchemaInspector;\n\n databaseInspector: MysqlDatabaseInspector;\n\n info: Information | null = null;\n\n constructor(db: Database) {\n super(db, 'mysql');\n\n this.schemaInspector = new MysqlSchemaInspector(db);\n this.databaseInspector = new MysqlDatabaseInspector(db);\n }\n\n configure() {\n const connection = this.db.config.connection.connection as Knex.MySqlConnectionConfig;\n\n connection.supportBigNumbers = true;\n // Only allow bigNumberStrings option set to be true if no connection option passed\n // Otherwise bigNumberStrings option should be allowed to used from DB config\n if (connection.bigNumberStrings === undefined) {\n connection.bigNumberStrings = true;\n }\n connection.typeCast = (\n field: { type: string; string: () => string; length: number },\n next: () => void\n ) => {\n if (field.type === 'DECIMAL' || field.type === 'NEWDECIMAL') {\n const value = field.string();\n return value === null ? null : Number(value);\n }\n\n if (field.type === 'TINY' && field.length === 1) {\n const value = field.string();\n return value ? value === '1' : null;\n }\n\n if (field.type === 'DATE') {\n return field.string();\n }\n\n return next();\n };\n }\n\n async initialize(nativeConnection: unknown) {\n try {\n await this.db.connection\n .raw(`set session sql_require_primary_key = 0;`)\n .connection(nativeConnection);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n\n // We only need to get info on the first connection in the pool\n /**\n * Note: There is a race condition here where if two connections are opened at the same time, both will retrieve\n * db info, but it doesn't cause issues, it's just one wasted query one time, so we can safely leave it to avoid\n * adding extra complexity\n * */\n if (!this.info) {\n this.info = await this.databaseInspector.getInformation(nativeConnection);\n }\n }\n\n async startSchemaUpdate() {\n try {\n await this.db.connection.raw(`set foreign_key_checks = 0;`);\n await this.db.connection.raw(`set session sql_require_primary_key = 0;`);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n }\n\n async endSchemaUpdate() {\n await this.db.connection.raw(`set foreign_key_checks = 1;`);\n }\n\n supportsUnsigned() {\n return true;\n }\n\n usesForeignKeys() {\n return true;\n }\n\n transformErrors(error: Error) {\n super.transformErrors(error);\n }\n}\n"],"names":["MysqlDialect","Dialect","configure","connection","db","config","supportBigNumbers","bigNumberStrings","undefined","typeCast","field","next","type","value","string","Number","length","initialize","nativeConnection","raw","err","info","databaseInspector","getInformation","startSchemaUpdate","endSchemaUpdate","supportsUnsigned","usesForeignKeys","transformErrors","error","schemaInspector","MysqlSchemaInspector","MysqlDatabaseInspector"],"mappings":";;;;;;AASe,MAAMA,YAAqBC,SAAAA,OAAAA,CAAAA;IAcxCC,SAAY,GAAA;QACV,MAAMC,UAAAA,GAAa,IAAI,CAACC,EAAE,CAACC,MAAM,CAACF,UAAU,CAACA,UAAU;AAEvDA,QAAAA,UAAAA,CAAWG,iBAAiB,GAAG,IAAA;;;QAG/B,IAAIH,UAAAA,CAAWI,gBAAgB,KAAKC,SAAW,EAAA;AAC7CL,YAAAA,UAAAA,CAAWI,gBAAgB,GAAG,IAAA;AAChC;QACAJ,UAAWM,CAAAA,QAAQ,GAAG,CACpBC,KACAC,EAAAA,IAAAA,GAAAA;AAEA,YAAA,IAAID,MAAME,IAAI,KAAK,aAAaF,KAAME,CAAAA,IAAI,KAAK,YAAc,EAAA;gBAC3D,MAAMC,KAAAA,GAAQH,MAAMI,MAAM,EAAA;gBAC1B,OAAOD,KAAAA,KAAU,IAAO,GAAA,IAAA,GAAOE,MAAOF,CAAAA,KAAAA,CAAAA;AACxC;AAEA,YAAA,IAAIH,MAAME,IAAI,KAAK,UAAUF,KAAMM,CAAAA,MAAM,KAAK,CAAG,EAAA;gBAC/C,MAAMH,KAAAA,GAAQH,MAAMI,MAAM,EAAA;gBAC1B,OAAOD,KAAAA,GAAQA,UAAU,GAAM,GAAA,IAAA;AACjC;YAEA,IAAIH,KAAAA,CAAME,IAAI,KAAK,MAAQ,EAAA;AACzB,gBAAA,OAAOF,MAAMI,MAAM,EAAA;AACrB;YAEA,OAAOH,IAAAA,EAAAA;AACT,SAAA;AACF;IAEA,MAAMM,UAAAA,CAAWC,gBAAyB,EAAE;QAC1C,IAAI;AACF,YAAA,MAAM,IAAI,CAACd,EAAE,CAACD,UAAU,CACrBgB,GAAG,CAAC,CAAC,wCAAwC,CAAC,CAAA,CAC9ChB,UAAU,CAACe,gBAAAA,CAAAA;AAChB,SAAA,CAAE,OAAOE,GAAK,EAAA;;AAEd;;AAGA;;;;AAIG,UACH,IAAI,CAAC,IAAI,CAACC,IAAI,EAAE;YACd,IAAI,CAACA,IAAI,GAAG,MAAM,IAAI,CAACC,iBAAiB,CAACC,cAAc,CAACL,gBAAAA,CAAAA;AAC1D;AACF;AAEA,IAAA,MAAMM,iBAAoB,GAAA;QACxB,IAAI;YACF,MAAM,IAAI,CAACpB,EAAE,CAACD,UAAU,CAACgB,GAAG,CAAC,CAAC,2BAA2B,CAAC,CAAA;YAC1D,MAAM,IAAI,CAACf,EAAE,CAACD,UAAU,CAACgB,GAAG,CAAC,CAAC,wCAAwC,CAAC,CAAA;AACzE,SAAA,CAAE,OAAOC,GAAK,EAAA;;AAEd;AACF;AAEA,IAAA,MAAMK,eAAkB,GAAA;QACtB,MAAM,IAAI,CAACrB,EAAE,CAACD,UAAU,CAACgB,GAAG,CAAC,CAAC,2BAA2B,CAAC,CAAA;AAC5D;IAEAO,gBAAmB,GAAA;QACjB,OAAO,IAAA;AACT;IAEAC,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AAEAC,IAAAA,eAAAA,CAAgBC,KAAY,EAAE;AAC5B,QAAA,KAAK,CAACD,eAAgBC,CAAAA,KAAAA,CAAAA;AACxB;AAjFA,IAAA,WAAA,CAAYzB,EAAY,CAAE;QACxB,KAAK,CAACA,EAAI,EAAA,OAAA,CAAA,EAAA,IAAA,CAHZiB,IAA2B,GAAA,IAAA;AAKzB,QAAA,IAAI,CAACS,eAAe,GAAG,IAAIC,eAAqB3B,CAAAA,EAAAA,CAAAA;AAChD,QAAA,IAAI,CAACkB,iBAAiB,GAAG,IAAIU,iBAAuB5B,CAAAA,EAAAA,CAAAA;AACtD;AA6EF;;;;"}
|
|
@@ -62,8 +62,7 @@ class MysqlDialect extends Dialect {
|
|
|
62
62
|
super.transformErrors(error);
|
|
63
63
|
}
|
|
64
64
|
constructor(db){
|
|
65
|
-
super(db, 'mysql');
|
|
66
|
-
this.info = null;
|
|
65
|
+
super(db, 'mysql'), this.info = null;
|
|
67
66
|
this.schemaInspector = new MysqlSchemaInspector(db);
|
|
68
67
|
this.databaseInspector = new MysqlDatabaseInspector(db);
|
|
69
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/dialects/mysql/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport Dialect from '../dialect';\nimport MysqlSchemaInspector from './schema-inspector';\nimport MysqlDatabaseInspector from './database-inspector';\nimport type { Database } from '../..';\n\nimport type { Information } from './database-inspector';\n\nexport default class MysqlDialect extends Dialect {\n schemaInspector: MysqlSchemaInspector;\n\n databaseInspector: MysqlDatabaseInspector;\n\n info: Information | null = null;\n\n constructor(db: Database) {\n super(db, 'mysql');\n\n this.schemaInspector = new MysqlSchemaInspector(db);\n this.databaseInspector = new MysqlDatabaseInspector(db);\n }\n\n configure() {\n const connection = this.db.config.connection.connection as Knex.MySqlConnectionConfig;\n\n connection.supportBigNumbers = true;\n // Only allow bigNumberStrings option set to be true if no connection option passed\n // Otherwise bigNumberStrings option should be allowed to used from DB config\n if (connection.bigNumberStrings === undefined) {\n connection.bigNumberStrings = true;\n }\n connection.typeCast = (\n field: { type: string; string: () => string; length: number },\n next: () => void\n ) => {\n if (field.type === 'DECIMAL' || field.type === 'NEWDECIMAL') {\n const value = field.string();\n return value === null ? null : Number(value);\n }\n\n if (field.type === 'TINY' && field.length === 1) {\n const value = field.string();\n return value ? value === '1' : null;\n }\n\n if (field.type === 'DATE') {\n return field.string();\n }\n\n return next();\n };\n }\n\n async initialize(nativeConnection: unknown) {\n try {\n await this.db.connection\n .raw(`set session sql_require_primary_key = 0;`)\n .connection(nativeConnection);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n\n // We only need to get info on the first connection in the pool\n /**\n * Note: There is a race condition here where if two connections are opened at the same time, both will retrieve\n * db info, but it doesn't cause issues, it's just one wasted query one time, so we can safely leave it to avoid\n * adding extra complexity\n * */\n if (!this.info) {\n this.info = await this.databaseInspector.getInformation(nativeConnection);\n }\n }\n\n async startSchemaUpdate() {\n try {\n await this.db.connection.raw(`set foreign_key_checks = 0;`);\n await this.db.connection.raw(`set session sql_require_primary_key = 0;`);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n }\n\n async endSchemaUpdate() {\n await this.db.connection.raw(`set foreign_key_checks = 1;`);\n }\n\n supportsUnsigned() {\n return true;\n }\n\n usesForeignKeys() {\n return true;\n }\n\n transformErrors(error: Error) {\n super.transformErrors(error);\n }\n}\n"],"names":["MysqlDialect","Dialect","configure","connection","db","config","supportBigNumbers","bigNumberStrings","undefined","typeCast","field","next","type","value","string","Number","length","initialize","nativeConnection","raw","err","info","databaseInspector","getInformation","startSchemaUpdate","endSchemaUpdate","supportsUnsigned","usesForeignKeys","transformErrors","error","
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/dialects/mysql/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport Dialect from '../dialect';\nimport MysqlSchemaInspector from './schema-inspector';\nimport MysqlDatabaseInspector from './database-inspector';\nimport type { Database } from '../..';\n\nimport type { Information } from './database-inspector';\n\nexport default class MysqlDialect extends Dialect {\n schemaInspector: MysqlSchemaInspector;\n\n databaseInspector: MysqlDatabaseInspector;\n\n info: Information | null = null;\n\n constructor(db: Database) {\n super(db, 'mysql');\n\n this.schemaInspector = new MysqlSchemaInspector(db);\n this.databaseInspector = new MysqlDatabaseInspector(db);\n }\n\n configure() {\n const connection = this.db.config.connection.connection as Knex.MySqlConnectionConfig;\n\n connection.supportBigNumbers = true;\n // Only allow bigNumberStrings option set to be true if no connection option passed\n // Otherwise bigNumberStrings option should be allowed to used from DB config\n if (connection.bigNumberStrings === undefined) {\n connection.bigNumberStrings = true;\n }\n connection.typeCast = (\n field: { type: string; string: () => string; length: number },\n next: () => void\n ) => {\n if (field.type === 'DECIMAL' || field.type === 'NEWDECIMAL') {\n const value = field.string();\n return value === null ? null : Number(value);\n }\n\n if (field.type === 'TINY' && field.length === 1) {\n const value = field.string();\n return value ? value === '1' : null;\n }\n\n if (field.type === 'DATE') {\n return field.string();\n }\n\n return next();\n };\n }\n\n async initialize(nativeConnection: unknown) {\n try {\n await this.db.connection\n .raw(`set session sql_require_primary_key = 0;`)\n .connection(nativeConnection);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n\n // We only need to get info on the first connection in the pool\n /**\n * Note: There is a race condition here where if two connections are opened at the same time, both will retrieve\n * db info, but it doesn't cause issues, it's just one wasted query one time, so we can safely leave it to avoid\n * adding extra complexity\n * */\n if (!this.info) {\n this.info = await this.databaseInspector.getInformation(nativeConnection);\n }\n }\n\n async startSchemaUpdate() {\n try {\n await this.db.connection.raw(`set foreign_key_checks = 0;`);\n await this.db.connection.raw(`set session sql_require_primary_key = 0;`);\n } catch (err) {\n // Ignore error due to lack of session permissions\n }\n }\n\n async endSchemaUpdate() {\n await this.db.connection.raw(`set foreign_key_checks = 1;`);\n }\n\n supportsUnsigned() {\n return true;\n }\n\n usesForeignKeys() {\n return true;\n }\n\n transformErrors(error: Error) {\n super.transformErrors(error);\n }\n}\n"],"names":["MysqlDialect","Dialect","configure","connection","db","config","supportBigNumbers","bigNumberStrings","undefined","typeCast","field","next","type","value","string","Number","length","initialize","nativeConnection","raw","err","info","databaseInspector","getInformation","startSchemaUpdate","endSchemaUpdate","supportsUnsigned","usesForeignKeys","transformErrors","error","schemaInspector","MysqlSchemaInspector","MysqlDatabaseInspector"],"mappings":";;;;AASe,MAAMA,YAAqBC,SAAAA,OAAAA,CAAAA;IAcxCC,SAAY,GAAA;QACV,MAAMC,UAAAA,GAAa,IAAI,CAACC,EAAE,CAACC,MAAM,CAACF,UAAU,CAACA,UAAU;AAEvDA,QAAAA,UAAAA,CAAWG,iBAAiB,GAAG,IAAA;;;QAG/B,IAAIH,UAAAA,CAAWI,gBAAgB,KAAKC,SAAW,EAAA;AAC7CL,YAAAA,UAAAA,CAAWI,gBAAgB,GAAG,IAAA;AAChC;QACAJ,UAAWM,CAAAA,QAAQ,GAAG,CACpBC,KACAC,EAAAA,IAAAA,GAAAA;AAEA,YAAA,IAAID,MAAME,IAAI,KAAK,aAAaF,KAAME,CAAAA,IAAI,KAAK,YAAc,EAAA;gBAC3D,MAAMC,KAAAA,GAAQH,MAAMI,MAAM,EAAA;gBAC1B,OAAOD,KAAAA,KAAU,IAAO,GAAA,IAAA,GAAOE,MAAOF,CAAAA,KAAAA,CAAAA;AACxC;AAEA,YAAA,IAAIH,MAAME,IAAI,KAAK,UAAUF,KAAMM,CAAAA,MAAM,KAAK,CAAG,EAAA;gBAC/C,MAAMH,KAAAA,GAAQH,MAAMI,MAAM,EAAA;gBAC1B,OAAOD,KAAAA,GAAQA,UAAU,GAAM,GAAA,IAAA;AACjC;YAEA,IAAIH,KAAAA,CAAME,IAAI,KAAK,MAAQ,EAAA;AACzB,gBAAA,OAAOF,MAAMI,MAAM,EAAA;AACrB;YAEA,OAAOH,IAAAA,EAAAA;AACT,SAAA;AACF;IAEA,MAAMM,UAAAA,CAAWC,gBAAyB,EAAE;QAC1C,IAAI;AACF,YAAA,MAAM,IAAI,CAACd,EAAE,CAACD,UAAU,CACrBgB,GAAG,CAAC,CAAC,wCAAwC,CAAC,CAAA,CAC9ChB,UAAU,CAACe,gBAAAA,CAAAA;AAChB,SAAA,CAAE,OAAOE,GAAK,EAAA;;AAEd;;AAGA;;;;AAIG,UACH,IAAI,CAAC,IAAI,CAACC,IAAI,EAAE;YACd,IAAI,CAACA,IAAI,GAAG,MAAM,IAAI,CAACC,iBAAiB,CAACC,cAAc,CAACL,gBAAAA,CAAAA;AAC1D;AACF;AAEA,IAAA,MAAMM,iBAAoB,GAAA;QACxB,IAAI;YACF,MAAM,IAAI,CAACpB,EAAE,CAACD,UAAU,CAACgB,GAAG,CAAC,CAAC,2BAA2B,CAAC,CAAA;YAC1D,MAAM,IAAI,CAACf,EAAE,CAACD,UAAU,CAACgB,GAAG,CAAC,CAAC,wCAAwC,CAAC,CAAA;AACzE,SAAA,CAAE,OAAOC,GAAK,EAAA;;AAEd;AACF;AAEA,IAAA,MAAMK,eAAkB,GAAA;QACtB,MAAM,IAAI,CAACrB,EAAE,CAACD,UAAU,CAACgB,GAAG,CAAC,CAAC,2BAA2B,CAAC,CAAA;AAC5D;IAEAO,gBAAmB,GAAA;QACjB,OAAO,IAAA;AACT;IAEAC,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AAEAC,IAAAA,eAAAA,CAAgBC,KAAY,EAAE;AAC5B,QAAA,KAAK,CAACD,eAAgBC,CAAAA,KAAAA,CAAAA;AACxB;AAjFA,IAAA,WAAA,CAAYzB,EAAY,CAAE;QACxB,KAAK,CAACA,EAAI,EAAA,OAAA,CAAA,EAAA,IAAA,CAHZiB,IAA2B,GAAA,IAAA;AAKzB,QAAA,IAAI,CAACS,eAAe,GAAG,IAAIC,oBAAqB3B,CAAAA,EAAAA,CAAAA;AAChD,QAAA,IAAI,CAACkB,iBAAiB,GAAG,IAAIU,sBAAuB5B,CAAAA,EAAAA,CAAAA;AACtD;AA6EF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-inspector.js","sources":["../../../src/dialects/mysql/schema-inspector.ts"],"sourcesContent":["import type { Column, ForeignKey, Index, Schema } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\nimport type { Database } from '../..';\n\ninterface RawTable {\n table_name: string;\n}\n\ninterface RawColumn {\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n column_type: string;\n column_key: string;\n}\n\ninterface RawIndex {\n Key_name: string;\n Column_name: string;\n Non_unique: boolean | string;\n}\n\ninterface RawForeignKey {\n constraint_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT\n t.table_name as table_name\n FROM information_schema.tables t\n WHERE table_type = 'BASE TABLE'\n AND table_schema = schema();\n `,\n LIST_COLUMNS: /* sql */ `\n SELECT\n c.data_type as data_type,\n c.column_name as column_name,\n c.character_maximum_length as character_maximum_length,\n c.column_default as column_default,\n c.is_nullable as is_nullable,\n c.column_type as column_type,\n c.column_key as column_key\n FROM information_schema.columns c\n WHERE table_schema = database()\n AND table_name = ?;\n `,\n INDEX_LIST: /* sql */ `\n show index from ??;\n `,\n FOREIGN_KEY_LIST: /* sql */ `\n SELECT\n tc.constraint_name as constraint_name\n FROM information_schema.table_constraints tc\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = database()\n AND tc.table_name = ?;\n `,\n FOREIGN_KEY_REFERENCES: /* sql */ `\n SELECT\n kcu.constraint_name as constraint_name,\n kcu.column_name as column_name,\n kcu.referenced_table_name as referenced_table_name,\n kcu.referenced_column_name as referenced_column_name\n FROM information_schema.key_column_usage kcu\n WHERE kcu.constraint_name in (?)\n AND kcu.table_schema = database()\n AND kcu.table_name = ?;\n `,\n FOREIGN_KEY_REFERENTIALS_CONSTRAINTS: /* sql */ `\n SELECT\n rc.constraint_name as constraint_name,\n rc.update_rule as on_update,\n rc.delete_rule as on_delete\n FROM information_schema.referential_constraints AS rc\n WHERE rc.constraint_name in (?)\n AND rc.constraint_schema = database()\n AND rc.table_name = ?;\n `,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'int': {\n if (column.column_key === 'PRI') {\n return { type: 'increments', args: [{ primary: true, primaryKey: true }], unsigned: false };\n }\n\n return { type: 'integer' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'enum': {\n return { type: 'string' };\n }\n case 'tinyint': {\n return { type: 'boolean' };\n }\n case 'longtext': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'varchar': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'datetime': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'timestamp': {\n return { type: 'timestamp', args: [{ useTz: false, precision: 6 }] };\n }\n case 'json': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nexport default class MysqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n\n const tables = await this.getTables();\n\n schema.tables = await Promise.all(\n tables.map(async (tableName) => {\n const columns = await this.getColumns(tableName);\n const indexes = await this.getIndexes(tableName);\n const foreignKeys = await this.getForeignKeys(tableName);\n\n return {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n };\n })\n );\n\n return schema;\n }\n\n async getTables(): Promise<string[]> {\n const [rows] = await this.db.connection.raw<[RawTable[]]>(SQL_QUERIES.TABLE_LIST);\n\n return rows.map((row) => row.table_name);\n }\n\n async getColumns(tableName: string): Promise<Column[]> {\n const [rows] = await this.db.connection.raw<[RawColumn[]]>(SQL_QUERIES.LIST_COLUMNS, [\n tableName,\n ]);\n\n return rows.map((row) => {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n return {\n type,\n args,\n defaultTo: row.column_default,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: row.column_type.endsWith(' unsigned'),\n ...rest,\n };\n });\n }\n\n async getIndexes(tableName: string): Promise<Index[]> {\n const [rows] = await this.db.connection.raw<[RawIndex[]]>(SQL_QUERIES.INDEX_LIST, [tableName]);\n\n const ret: Record<RawIndex['Key_name'], Index> = {};\n\n for (const index of rows) {\n if (index.Column_name === 'id') {\n continue;\n }\n\n if (!ret[index.Key_name]) {\n const indexInfo: Index = {\n columns: [index.Column_name],\n name: index.Key_name,\n };\n if (!index.Non_unique || index.Non_unique === '0') {\n indexInfo.type = 'unique';\n }\n\n ret[index.Key_name] = indexInfo;\n } else {\n ret[index.Key_name].columns.push(index.Column_name);\n }\n }\n\n return Object.values(ret);\n }\n\n async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n const [rows] = await this.db.connection.raw<[RawForeignKey[]]>(SQL_QUERIES.FOREIGN_KEY_LIST, [\n tableName,\n ]);\n\n const ret: Record<RawForeignKey['constraint_name'], ForeignKey> = {};\n\n for (const fk of rows) {\n ret[fk.constraint_name] = {\n name: fk.constraint_name,\n columns: [],\n referencedColumns: [],\n referencedTable: null,\n onUpdate: null,\n onDelete: null,\n } as unknown as ForeignKey;\n }\n\n const contraintNames = Object.keys(ret);\n\n if (contraintNames.length > 0) {\n const [fkReferences] = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_REFERENCES, [\n contraintNames,\n tableName,\n ]);\n\n for (const fkReference of fkReferences) {\n ret[fkReference.constraint_name].referencedTable = fkReference.referenced_table_name;\n ret[fkReference.constraint_name].columns.push(fkReference.column_name);\n ret[fkReference.constraint_name].referencedColumns.push(fkReference.referenced_column_name);\n }\n\n const [fkReferentialConstraints] = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENTIALS_CONSTRAINTS,\n [contraintNames, tableName]\n );\n\n for (const fkReferentialConstraint of fkReferentialConstraints) {\n ret[fkReferentialConstraint.constraint_name].onUpdate =\n fkReferentialConstraint.on_update.toUpperCase();\n ret[fkReferentialConstraint.constraint_name].onDelete =\n fkReferentialConstraint.on_delete.toUpperCase();\n }\n }\n\n return Object.values(ret);\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","LIST_COLUMNS","INDEX_LIST","FOREIGN_KEY_LIST","FOREIGN_KEY_REFERENCES","FOREIGN_KEY_REFERENTIALS_CONSTRAINTS","toStrapiType","column","rootType","data_type","toLowerCase","match","column_key","type","args","primary","primaryKey","unsigned","character_maximum_length","useTz","precision","MysqlSchemaInspector","getSchema","schema","tables","getTables","Promise","all","map","tableName","columns","getColumns","indexes","getIndexes","foreignKeys","getForeignKeys","name","rows","db","connection","raw","row","table_name","rest","defaultTo","column_default","column_name","notNullable","is_nullable","column_type","endsWith","ret","index","Column_name","Key_name","indexInfo","Non_unique","push","Object","values","fk","constraint_name","referencedColumns","referencedTable","onUpdate","onDelete","contraintNames","keys","length","fkReferences","fkReference","referenced_table_name","referenced_column_name","fkReferentialConstraints","fkReferentialConstraint","on_update","toUpperCase","on_delete","constructor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-inspector.js","sources":["../../../src/dialects/mysql/schema-inspector.ts"],"sourcesContent":["import type { Column, ForeignKey, Index, Schema } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\nimport type { Database } from '../..';\n\ninterface RawTable {\n table_name: string;\n}\n\ninterface RawColumn {\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n column_type: string;\n column_key: string;\n}\n\ninterface RawIndex {\n Key_name: string;\n Column_name: string;\n Non_unique: boolean | string;\n}\n\ninterface RawForeignKey {\n constraint_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT\n t.table_name as table_name\n FROM information_schema.tables t\n WHERE table_type = 'BASE TABLE'\n AND table_schema = schema();\n `,\n LIST_COLUMNS: /* sql */ `\n SELECT\n c.data_type as data_type,\n c.column_name as column_name,\n c.character_maximum_length as character_maximum_length,\n c.column_default as column_default,\n c.is_nullable as is_nullable,\n c.column_type as column_type,\n c.column_key as column_key\n FROM information_schema.columns c\n WHERE table_schema = database()\n AND table_name = ?;\n `,\n INDEX_LIST: /* sql */ `\n show index from ??;\n `,\n FOREIGN_KEY_LIST: /* sql */ `\n SELECT\n tc.constraint_name as constraint_name\n FROM information_schema.table_constraints tc\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = database()\n AND tc.table_name = ?;\n `,\n FOREIGN_KEY_REFERENCES: /* sql */ `\n SELECT\n kcu.constraint_name as constraint_name,\n kcu.column_name as column_name,\n kcu.referenced_table_name as referenced_table_name,\n kcu.referenced_column_name as referenced_column_name\n FROM information_schema.key_column_usage kcu\n WHERE kcu.constraint_name in (?)\n AND kcu.table_schema = database()\n AND kcu.table_name = ?;\n `,\n FOREIGN_KEY_REFERENTIALS_CONSTRAINTS: /* sql */ `\n SELECT\n rc.constraint_name as constraint_name,\n rc.update_rule as on_update,\n rc.delete_rule as on_delete\n FROM information_schema.referential_constraints AS rc\n WHERE rc.constraint_name in (?)\n AND rc.constraint_schema = database()\n AND rc.table_name = ?;\n `,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'int': {\n if (column.column_key === 'PRI') {\n return { type: 'increments', args: [{ primary: true, primaryKey: true }], unsigned: false };\n }\n\n return { type: 'integer' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'enum': {\n return { type: 'string' };\n }\n case 'tinyint': {\n return { type: 'boolean' };\n }\n case 'longtext': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'varchar': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'datetime': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'timestamp': {\n return { type: 'timestamp', args: [{ useTz: false, precision: 6 }] };\n }\n case 'json': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nexport default class MysqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n\n const tables = await this.getTables();\n\n schema.tables = await Promise.all(\n tables.map(async (tableName) => {\n const columns = await this.getColumns(tableName);\n const indexes = await this.getIndexes(tableName);\n const foreignKeys = await this.getForeignKeys(tableName);\n\n return {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n };\n })\n );\n\n return schema;\n }\n\n async getTables(): Promise<string[]> {\n const [rows] = await this.db.connection.raw<[RawTable[]]>(SQL_QUERIES.TABLE_LIST);\n\n return rows.map((row) => row.table_name);\n }\n\n async getColumns(tableName: string): Promise<Column[]> {\n const [rows] = await this.db.connection.raw<[RawColumn[]]>(SQL_QUERIES.LIST_COLUMNS, [\n tableName,\n ]);\n\n return rows.map((row) => {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n return {\n type,\n args,\n defaultTo: row.column_default,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: row.column_type.endsWith(' unsigned'),\n ...rest,\n };\n });\n }\n\n async getIndexes(tableName: string): Promise<Index[]> {\n const [rows] = await this.db.connection.raw<[RawIndex[]]>(SQL_QUERIES.INDEX_LIST, [tableName]);\n\n const ret: Record<RawIndex['Key_name'], Index> = {};\n\n for (const index of rows) {\n if (index.Column_name === 'id') {\n continue;\n }\n\n if (!ret[index.Key_name]) {\n const indexInfo: Index = {\n columns: [index.Column_name],\n name: index.Key_name,\n };\n if (!index.Non_unique || index.Non_unique === '0') {\n indexInfo.type = 'unique';\n }\n\n ret[index.Key_name] = indexInfo;\n } else {\n ret[index.Key_name].columns.push(index.Column_name);\n }\n }\n\n return Object.values(ret);\n }\n\n async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n const [rows] = await this.db.connection.raw<[RawForeignKey[]]>(SQL_QUERIES.FOREIGN_KEY_LIST, [\n tableName,\n ]);\n\n const ret: Record<RawForeignKey['constraint_name'], ForeignKey> = {};\n\n for (const fk of rows) {\n ret[fk.constraint_name] = {\n name: fk.constraint_name,\n columns: [],\n referencedColumns: [],\n referencedTable: null,\n onUpdate: null,\n onDelete: null,\n } as unknown as ForeignKey;\n }\n\n const contraintNames = Object.keys(ret);\n\n if (contraintNames.length > 0) {\n const [fkReferences] = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_REFERENCES, [\n contraintNames,\n tableName,\n ]);\n\n for (const fkReference of fkReferences) {\n ret[fkReference.constraint_name].referencedTable = fkReference.referenced_table_name;\n ret[fkReference.constraint_name].columns.push(fkReference.column_name);\n ret[fkReference.constraint_name].referencedColumns.push(fkReference.referenced_column_name);\n }\n\n const [fkReferentialConstraints] = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENTIALS_CONSTRAINTS,\n [contraintNames, tableName]\n );\n\n for (const fkReferentialConstraint of fkReferentialConstraints) {\n ret[fkReferentialConstraint.constraint_name].onUpdate =\n fkReferentialConstraint.on_update.toUpperCase();\n ret[fkReferentialConstraint.constraint_name].onDelete =\n fkReferentialConstraint.on_delete.toUpperCase();\n }\n }\n\n return Object.values(ret);\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","LIST_COLUMNS","INDEX_LIST","FOREIGN_KEY_LIST","FOREIGN_KEY_REFERENCES","FOREIGN_KEY_REFERENTIALS_CONSTRAINTS","toStrapiType","column","rootType","data_type","toLowerCase","match","column_key","type","args","primary","primaryKey","unsigned","character_maximum_length","useTz","precision","MysqlSchemaInspector","getSchema","schema","tables","getTables","Promise","all","map","tableName","columns","getColumns","indexes","getIndexes","foreignKeys","getForeignKeys","name","rows","db","connection","raw","row","table_name","rest","defaultTo","column_default","column_name","notNullable","is_nullable","column_type","endsWith","ret","index","Column_name","Key_name","indexInfo","Non_unique","push","Object","values","fk","constraint_name","referencedColumns","referencedTable","onUpdate","onDelete","contraintNames","keys","length","fkReferences","fkReference","referenced_table_name","referenced_column_name","fkReferentialConstraints","fkReferentialConstraint","on_update","toUpperCase","on_delete"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-inspector.mjs","sources":["../../../src/dialects/mysql/schema-inspector.ts"],"sourcesContent":["import type { Column, ForeignKey, Index, Schema } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\nimport type { Database } from '../..';\n\ninterface RawTable {\n table_name: string;\n}\n\ninterface RawColumn {\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n column_type: string;\n column_key: string;\n}\n\ninterface RawIndex {\n Key_name: string;\n Column_name: string;\n Non_unique: boolean | string;\n}\n\ninterface RawForeignKey {\n constraint_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT\n t.table_name as table_name\n FROM information_schema.tables t\n WHERE table_type = 'BASE TABLE'\n AND table_schema = schema();\n `,\n LIST_COLUMNS: /* sql */ `\n SELECT\n c.data_type as data_type,\n c.column_name as column_name,\n c.character_maximum_length as character_maximum_length,\n c.column_default as column_default,\n c.is_nullable as is_nullable,\n c.column_type as column_type,\n c.column_key as column_key\n FROM information_schema.columns c\n WHERE table_schema = database()\n AND table_name = ?;\n `,\n INDEX_LIST: /* sql */ `\n show index from ??;\n `,\n FOREIGN_KEY_LIST: /* sql */ `\n SELECT\n tc.constraint_name as constraint_name\n FROM information_schema.table_constraints tc\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = database()\n AND tc.table_name = ?;\n `,\n FOREIGN_KEY_REFERENCES: /* sql */ `\n SELECT\n kcu.constraint_name as constraint_name,\n kcu.column_name as column_name,\n kcu.referenced_table_name as referenced_table_name,\n kcu.referenced_column_name as referenced_column_name\n FROM information_schema.key_column_usage kcu\n WHERE kcu.constraint_name in (?)\n AND kcu.table_schema = database()\n AND kcu.table_name = ?;\n `,\n FOREIGN_KEY_REFERENTIALS_CONSTRAINTS: /* sql */ `\n SELECT\n rc.constraint_name as constraint_name,\n rc.update_rule as on_update,\n rc.delete_rule as on_delete\n FROM information_schema.referential_constraints AS rc\n WHERE rc.constraint_name in (?)\n AND rc.constraint_schema = database()\n AND rc.table_name = ?;\n `,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'int': {\n if (column.column_key === 'PRI') {\n return { type: 'increments', args: [{ primary: true, primaryKey: true }], unsigned: false };\n }\n\n return { type: 'integer' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'enum': {\n return { type: 'string' };\n }\n case 'tinyint': {\n return { type: 'boolean' };\n }\n case 'longtext': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'varchar': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'datetime': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'timestamp': {\n return { type: 'timestamp', args: [{ useTz: false, precision: 6 }] };\n }\n case 'json': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nexport default class MysqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n\n const tables = await this.getTables();\n\n schema.tables = await Promise.all(\n tables.map(async (tableName) => {\n const columns = await this.getColumns(tableName);\n const indexes = await this.getIndexes(tableName);\n const foreignKeys = await this.getForeignKeys(tableName);\n\n return {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n };\n })\n );\n\n return schema;\n }\n\n async getTables(): Promise<string[]> {\n const [rows] = await this.db.connection.raw<[RawTable[]]>(SQL_QUERIES.TABLE_LIST);\n\n return rows.map((row) => row.table_name);\n }\n\n async getColumns(tableName: string): Promise<Column[]> {\n const [rows] = await this.db.connection.raw<[RawColumn[]]>(SQL_QUERIES.LIST_COLUMNS, [\n tableName,\n ]);\n\n return rows.map((row) => {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n return {\n type,\n args,\n defaultTo: row.column_default,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: row.column_type.endsWith(' unsigned'),\n ...rest,\n };\n });\n }\n\n async getIndexes(tableName: string): Promise<Index[]> {\n const [rows] = await this.db.connection.raw<[RawIndex[]]>(SQL_QUERIES.INDEX_LIST, [tableName]);\n\n const ret: Record<RawIndex['Key_name'], Index> = {};\n\n for (const index of rows) {\n if (index.Column_name === 'id') {\n continue;\n }\n\n if (!ret[index.Key_name]) {\n const indexInfo: Index = {\n columns: [index.Column_name],\n name: index.Key_name,\n };\n if (!index.Non_unique || index.Non_unique === '0') {\n indexInfo.type = 'unique';\n }\n\n ret[index.Key_name] = indexInfo;\n } else {\n ret[index.Key_name].columns.push(index.Column_name);\n }\n }\n\n return Object.values(ret);\n }\n\n async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n const [rows] = await this.db.connection.raw<[RawForeignKey[]]>(SQL_QUERIES.FOREIGN_KEY_LIST, [\n tableName,\n ]);\n\n const ret: Record<RawForeignKey['constraint_name'], ForeignKey> = {};\n\n for (const fk of rows) {\n ret[fk.constraint_name] = {\n name: fk.constraint_name,\n columns: [],\n referencedColumns: [],\n referencedTable: null,\n onUpdate: null,\n onDelete: null,\n } as unknown as ForeignKey;\n }\n\n const contraintNames = Object.keys(ret);\n\n if (contraintNames.length > 0) {\n const [fkReferences] = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_REFERENCES, [\n contraintNames,\n tableName,\n ]);\n\n for (const fkReference of fkReferences) {\n ret[fkReference.constraint_name].referencedTable = fkReference.referenced_table_name;\n ret[fkReference.constraint_name].columns.push(fkReference.column_name);\n ret[fkReference.constraint_name].referencedColumns.push(fkReference.referenced_column_name);\n }\n\n const [fkReferentialConstraints] = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENTIALS_CONSTRAINTS,\n [contraintNames, tableName]\n );\n\n for (const fkReferentialConstraint of fkReferentialConstraints) {\n ret[fkReferentialConstraint.constraint_name].onUpdate =\n fkReferentialConstraint.on_update.toUpperCase();\n ret[fkReferentialConstraint.constraint_name].onDelete =\n fkReferentialConstraint.on_delete.toUpperCase();\n }\n }\n\n return Object.values(ret);\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","LIST_COLUMNS","INDEX_LIST","FOREIGN_KEY_LIST","FOREIGN_KEY_REFERENCES","FOREIGN_KEY_REFERENTIALS_CONSTRAINTS","toStrapiType","column","rootType","data_type","toLowerCase","match","column_key","type","args","primary","primaryKey","unsigned","character_maximum_length","useTz","precision","MysqlSchemaInspector","getSchema","schema","tables","getTables","Promise","all","map","tableName","columns","getColumns","indexes","getIndexes","foreignKeys","getForeignKeys","name","rows","db","connection","raw","row","table_name","rest","defaultTo","column_default","column_name","notNullable","is_nullable","column_type","endsWith","ret","index","Column_name","Key_name","indexInfo","Non_unique","push","Object","values","fk","constraint_name","referencedColumns","referencedTable","onUpdate","onDelete","contraintNames","keys","length","fkReferences","fkReference","referenced_table_name","referenced_column_name","fkReferentialConstraints","fkReferentialConstraint","on_update","toUpperCase","on_delete","constructor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-inspector.mjs","sources":["../../../src/dialects/mysql/schema-inspector.ts"],"sourcesContent":["import type { Column, ForeignKey, Index, Schema } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\nimport type { Database } from '../..';\n\ninterface RawTable {\n table_name: string;\n}\n\ninterface RawColumn {\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n column_type: string;\n column_key: string;\n}\n\ninterface RawIndex {\n Key_name: string;\n Column_name: string;\n Non_unique: boolean | string;\n}\n\ninterface RawForeignKey {\n constraint_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT\n t.table_name as table_name\n FROM information_schema.tables t\n WHERE table_type = 'BASE TABLE'\n AND table_schema = schema();\n `,\n LIST_COLUMNS: /* sql */ `\n SELECT\n c.data_type as data_type,\n c.column_name as column_name,\n c.character_maximum_length as character_maximum_length,\n c.column_default as column_default,\n c.is_nullable as is_nullable,\n c.column_type as column_type,\n c.column_key as column_key\n FROM information_schema.columns c\n WHERE table_schema = database()\n AND table_name = ?;\n `,\n INDEX_LIST: /* sql */ `\n show index from ??;\n `,\n FOREIGN_KEY_LIST: /* sql */ `\n SELECT\n tc.constraint_name as constraint_name\n FROM information_schema.table_constraints tc\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = database()\n AND tc.table_name = ?;\n `,\n FOREIGN_KEY_REFERENCES: /* sql */ `\n SELECT\n kcu.constraint_name as constraint_name,\n kcu.column_name as column_name,\n kcu.referenced_table_name as referenced_table_name,\n kcu.referenced_column_name as referenced_column_name\n FROM information_schema.key_column_usage kcu\n WHERE kcu.constraint_name in (?)\n AND kcu.table_schema = database()\n AND kcu.table_name = ?;\n `,\n FOREIGN_KEY_REFERENTIALS_CONSTRAINTS: /* sql */ `\n SELECT\n rc.constraint_name as constraint_name,\n rc.update_rule as on_update,\n rc.delete_rule as on_delete\n FROM information_schema.referential_constraints AS rc\n WHERE rc.constraint_name in (?)\n AND rc.constraint_schema = database()\n AND rc.table_name = ?;\n `,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'int': {\n if (column.column_key === 'PRI') {\n return { type: 'increments', args: [{ primary: true, primaryKey: true }], unsigned: false };\n }\n\n return { type: 'integer' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'enum': {\n return { type: 'string' };\n }\n case 'tinyint': {\n return { type: 'boolean' };\n }\n case 'longtext': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'varchar': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'datetime': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'timestamp': {\n return { type: 'timestamp', args: [{ useTz: false, precision: 6 }] };\n }\n case 'json': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nexport default class MysqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n\n const tables = await this.getTables();\n\n schema.tables = await Promise.all(\n tables.map(async (tableName) => {\n const columns = await this.getColumns(tableName);\n const indexes = await this.getIndexes(tableName);\n const foreignKeys = await this.getForeignKeys(tableName);\n\n return {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n };\n })\n );\n\n return schema;\n }\n\n async getTables(): Promise<string[]> {\n const [rows] = await this.db.connection.raw<[RawTable[]]>(SQL_QUERIES.TABLE_LIST);\n\n return rows.map((row) => row.table_name);\n }\n\n async getColumns(tableName: string): Promise<Column[]> {\n const [rows] = await this.db.connection.raw<[RawColumn[]]>(SQL_QUERIES.LIST_COLUMNS, [\n tableName,\n ]);\n\n return rows.map((row) => {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n return {\n type,\n args,\n defaultTo: row.column_default,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: row.column_type.endsWith(' unsigned'),\n ...rest,\n };\n });\n }\n\n async getIndexes(tableName: string): Promise<Index[]> {\n const [rows] = await this.db.connection.raw<[RawIndex[]]>(SQL_QUERIES.INDEX_LIST, [tableName]);\n\n const ret: Record<RawIndex['Key_name'], Index> = {};\n\n for (const index of rows) {\n if (index.Column_name === 'id') {\n continue;\n }\n\n if (!ret[index.Key_name]) {\n const indexInfo: Index = {\n columns: [index.Column_name],\n name: index.Key_name,\n };\n if (!index.Non_unique || index.Non_unique === '0') {\n indexInfo.type = 'unique';\n }\n\n ret[index.Key_name] = indexInfo;\n } else {\n ret[index.Key_name].columns.push(index.Column_name);\n }\n }\n\n return Object.values(ret);\n }\n\n async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n const [rows] = await this.db.connection.raw<[RawForeignKey[]]>(SQL_QUERIES.FOREIGN_KEY_LIST, [\n tableName,\n ]);\n\n const ret: Record<RawForeignKey['constraint_name'], ForeignKey> = {};\n\n for (const fk of rows) {\n ret[fk.constraint_name] = {\n name: fk.constraint_name,\n columns: [],\n referencedColumns: [],\n referencedTable: null,\n onUpdate: null,\n onDelete: null,\n } as unknown as ForeignKey;\n }\n\n const contraintNames = Object.keys(ret);\n\n if (contraintNames.length > 0) {\n const [fkReferences] = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_REFERENCES, [\n contraintNames,\n tableName,\n ]);\n\n for (const fkReference of fkReferences) {\n ret[fkReference.constraint_name].referencedTable = fkReference.referenced_table_name;\n ret[fkReference.constraint_name].columns.push(fkReference.column_name);\n ret[fkReference.constraint_name].referencedColumns.push(fkReference.referenced_column_name);\n }\n\n const [fkReferentialConstraints] = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENTIALS_CONSTRAINTS,\n [contraintNames, tableName]\n );\n\n for (const fkReferentialConstraint of fkReferentialConstraints) {\n ret[fkReferentialConstraint.constraint_name].onUpdate =\n fkReferentialConstraint.on_update.toUpperCase();\n ret[fkReferentialConstraint.constraint_name].onDelete =\n fkReferentialConstraint.on_delete.toUpperCase();\n }\n }\n\n return Object.values(ret);\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","LIST_COLUMNS","INDEX_LIST","FOREIGN_KEY_LIST","FOREIGN_KEY_REFERENCES","FOREIGN_KEY_REFERENTIALS_CONSTRAINTS","toStrapiType","column","rootType","data_type","toLowerCase","match","column_key","type","args","primary","primaryKey","unsigned","character_maximum_length","useTz","precision","MysqlSchemaInspector","getSchema","schema","tables","getTables","Promise","all","map","tableName","columns","getColumns","indexes","getIndexes","foreignKeys","getForeignKeys","name","rows","db","connection","raw","row","table_name","rest","defaultTo","column_default","column_name","notNullable","is_nullable","column_type","endsWith","ret","index","Column_name","Key_name","indexInfo","Non_unique","push","Object","values","fk","constraint_name","referencedColumns","referencedTable","onUpdate","onDelete","contraintNames","keys","length","fkReferences","fkReference","referenced_table_name","referenced_column_name","fkReferentialConstraints","fkReferentialConstraint","on_update","toUpperCase","on_delete"],"mappings":"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"}
|
|
@@ -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 /**\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","
|
|
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","schemaInspector","PostgresqlSchemaInspector"],"mappings":"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"}
|
|
@@ -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 /**\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","
|
|
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","schemaInspector","PostgresqlSchemaInspector"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-inspector.js","sources":["../../../src/dialects/postgresql/schema-inspector.ts"],"sourcesContent":["import type { Database } from '../..';\nimport type { Schema, Column, Index, ForeignKey } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\n\ninterface RawTable {\n table_name: string;\n}\n\ninterface RawColumn {\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n}\n\ninterface RawIndex {\n indexrelid: string;\n index_name: string;\n column_name: string;\n is_unique: boolean;\n is_primary: boolean;\n}\n\ninterface RawForeignKey {\n constraint_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT *\n FROM information_schema.tables\n WHERE\n table_schema = ?\n AND table_type = 'BASE TABLE'\n AND table_name != 'geometry_columns'\n AND table_name != 'spatial_ref_sys';\n `,\n LIST_COLUMNS: /* sql */ `\n SELECT data_type, column_name, character_maximum_length, column_default, is_nullable\n FROM information_schema.columns\n WHERE table_schema = ? AND table_name = ?;\n `,\n INDEX_LIST: /* sql */ `\n SELECT\n ix.indexrelid,\n i.relname as index_name,\n a.attname as column_name,\n ix.indisunique as is_unique,\n ix.indisprimary as is_primary\n FROM\n pg_class t,\n pg_namespace s,\n pg_class i,\n pg_index ix,\n pg_attribute a\n WHERE\n t.oid = ix.indrelid\n AND i.oid = ix.indexrelid\n AND a.attrelid = t.oid\n AND a.attnum = ANY(ix.indkey)\n AND t.relkind = 'r'\n AND t.relnamespace = s.oid\n AND s.nspname = ?\n AND t.relname = ?;\n `,\n FOREIGN_KEY_LIST: /* sql */ `\n SELECT\n tco.\"constraint_name\" as constraint_name\n FROM information_schema.table_constraints tco\n WHERE\n tco.constraint_type = 'FOREIGN KEY'\n AND tco.constraint_schema = ?\n AND tco.table_name = ?\n `,\n FOREIGN_KEY_REFERENCES: /* sql */ `\n SELECT\n kcu.\"constraint_name\" as constraint_name,\n kcu.\"column_name\" as column_name\n\n FROM information_schema.key_column_usage kcu\n WHERE kcu.constraint_name=ANY(?)\n AND kcu.table_schema = ?\n AND kcu.table_name = ?;\n `,\n\n FOREIGN_KEY_REFERENCES_CONSTRAIN: /* sql */ `\n SELECT\n rco.update_rule as on_update,\n rco.delete_rule as on_delete,\n rco.\"unique_constraint_name\" as unique_constraint_name\n FROM information_schema.referential_constraints rco\n WHERE rco.constraint_name=ANY(?)\n AND rco.constraint_schema = ?\n`,\n FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE: /* sql */ `\n SELECT\n rel_kcu.\"table_name\" as foreign_table,\n rel_kcu.\"column_name\" as fk_column_name\n FROM information_schema.key_column_usage rel_kcu\n WHERE rel_kcu.constraint_name=?\n AND rel_kcu.table_schema = ?\n`,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'integer': {\n // find a way to figure out the increments\n return { type: 'integer' };\n }\n case 'text': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n case 'character': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'timestamp': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'numeric': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'real':\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'jsonb': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nconst getIndexType = (index: RawIndex) => {\n if (index.is_primary) {\n return 'primary';\n }\n\n if (index.is_unique) {\n return 'unique';\n }\n};\n\nexport default class PostgresqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n\n const tables = await this.getTables();\n\n schema.tables = await Promise.all(\n tables.map(async (tableName) => {\n const columns = await this.getColumns(tableName);\n const indexes = await this.getIndexes(tableName);\n const foreignKeys = await this.getForeignKeys(tableName);\n\n return {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n };\n })\n );\n\n return schema;\n }\n\n getDatabaseSchema(): string {\n return this.db.getSchemaName() || 'public';\n }\n\n async getTables(): Promise<string[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawTable[] }>(SQL_QUERIES.TABLE_LIST, [\n this.getDatabaseSchema(),\n ]);\n\n return rows.map((row) => row.table_name);\n }\n\n async getColumns(tableName: string): Promise<Column[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawColumn[] }>(SQL_QUERIES.LIST_COLUMNS, [\n this.getDatabaseSchema(),\n tableName,\n ]);\n\n return rows.map((row) => {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n const defaultTo =\n row.column_default && row.column_default.includes('nextval(') ? null : row.column_default;\n\n return {\n type,\n args,\n defaultTo,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: false,\n ...rest,\n };\n });\n }\n\n async getIndexes(tableName: string): Promise<Index[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawIndex[] }>(SQL_QUERIES.INDEX_LIST, [\n this.getDatabaseSchema(),\n tableName,\n ]);\n\n const ret: Record<RawIndex['indexrelid'], Index> = {};\n\n for (const index of rows) {\n if (index.column_name === 'id') {\n continue;\n }\n\n if (!ret[index.indexrelid]) {\n ret[index.indexrelid] = {\n columns: [index.column_name],\n name: index.index_name,\n type: getIndexType(index),\n };\n } else {\n ret[index.indexrelid].columns.push(index.column_name);\n }\n }\n\n return Object.values(ret);\n }\n\n async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawForeignKey[] }>(\n SQL_QUERIES.FOREIGN_KEY_LIST,\n [this.getDatabaseSchema(), tableName]\n );\n\n const ret: Record<RawForeignKey['constraint_name'], ForeignKey> = {};\n\n for (const fk of rows) {\n ret[fk.constraint_name] = {\n name: fk.constraint_name,\n columns: [],\n referencedColumns: [],\n referencedTable: null,\n onUpdate: null,\n onDelete: null,\n } as unknown as ForeignKey;\n }\n\n const constraintNames = Object.keys(ret);\n const dbSchema = this.getDatabaseSchema();\n if (constraintNames.length > 0) {\n const { rows: fkReferences } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES,\n [[constraintNames], dbSchema, tableName]\n );\n\n for (const fkReference of fkReferences) {\n ret[fkReference.constraint_name].columns.push(fkReference.column_name);\n\n const { rows: fkReferencesConstraint } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN,\n [[fkReference.constraint_name], dbSchema]\n );\n\n for (const fkReferenceC of fkReferencesConstraint) {\n const { rows: fkReferencesConstraintReferece } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE,\n [fkReferenceC.unique_constraint_name, dbSchema]\n );\n for (const fkReferenceConst of fkReferencesConstraintReferece) {\n ret[fkReference.constraint_name].referencedTable = fkReferenceConst.foreign_table;\n ret[fkReference.constraint_name].referencedColumns.push(\n fkReferenceConst.fk_column_name\n );\n }\n ret[fkReference.constraint_name].onUpdate = fkReferenceC.on_update.toUpperCase();\n ret[fkReference.constraint_name].onDelete = fkReferenceC.on_delete.toUpperCase();\n }\n }\n }\n\n return Object.values(ret);\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","LIST_COLUMNS","INDEX_LIST","FOREIGN_KEY_LIST","FOREIGN_KEY_REFERENCES","FOREIGN_KEY_REFERENCES_CONSTRAIN","FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE","toStrapiType","column","rootType","data_type","toLowerCase","match","type","args","character_maximum_length","useTz","precision","getIndexType","index","is_primary","is_unique","PostgresqlSchemaInspector","getSchema","schema","tables","getTables","Promise","all","map","tableName","columns","getColumns","indexes","getIndexes","foreignKeys","getForeignKeys","name","getDatabaseSchema","db","getSchemaName","rows","connection","raw","row","table_name","rest","defaultTo","column_default","includes","column_name","notNullable","is_nullable","unsigned","ret","indexrelid","index_name","push","Object","values","fk","constraint_name","referencedColumns","referencedTable","onUpdate","onDelete","constraintNames","keys","dbSchema","length","fkReferences","fkReference","fkReferencesConstraint","fkReferenceC","fkReferencesConstraintReferece","unique_constraint_name","fkReferenceConst","foreign_table","fk_column_name","on_update","toUpperCase","on_delete","constructor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-inspector.js","sources":["../../../src/dialects/postgresql/schema-inspector.ts"],"sourcesContent":["import type { Database } from '../..';\nimport type { Schema, Column, Index, ForeignKey } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\n\ninterface RawTable {\n table_name: string;\n}\n\ninterface RawColumn {\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n}\n\ninterface RawIndex {\n indexrelid: string;\n index_name: string;\n column_name: string;\n is_unique: boolean;\n is_primary: boolean;\n}\n\ninterface RawForeignKey {\n constraint_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT *\n FROM information_schema.tables\n WHERE\n table_schema = ?\n AND table_type = 'BASE TABLE'\n AND table_name != 'geometry_columns'\n AND table_name != 'spatial_ref_sys';\n `,\n LIST_COLUMNS: /* sql */ `\n SELECT data_type, column_name, character_maximum_length, column_default, is_nullable\n FROM information_schema.columns\n WHERE table_schema = ? AND table_name = ?;\n `,\n INDEX_LIST: /* sql */ `\n SELECT\n ix.indexrelid,\n i.relname as index_name,\n a.attname as column_name,\n ix.indisunique as is_unique,\n ix.indisprimary as is_primary\n FROM\n pg_class t,\n pg_namespace s,\n pg_class i,\n pg_index ix,\n pg_attribute a\n WHERE\n t.oid = ix.indrelid\n AND i.oid = ix.indexrelid\n AND a.attrelid = t.oid\n AND a.attnum = ANY(ix.indkey)\n AND t.relkind = 'r'\n AND t.relnamespace = s.oid\n AND s.nspname = ?\n AND t.relname = ?;\n `,\n FOREIGN_KEY_LIST: /* sql */ `\n SELECT\n tco.\"constraint_name\" as constraint_name\n FROM information_schema.table_constraints tco\n WHERE\n tco.constraint_type = 'FOREIGN KEY'\n AND tco.constraint_schema = ?\n AND tco.table_name = ?\n `,\n FOREIGN_KEY_REFERENCES: /* sql */ `\n SELECT\n kcu.\"constraint_name\" as constraint_name,\n kcu.\"column_name\" as column_name\n\n FROM information_schema.key_column_usage kcu\n WHERE kcu.constraint_name=ANY(?)\n AND kcu.table_schema = ?\n AND kcu.table_name = ?;\n `,\n\n FOREIGN_KEY_REFERENCES_CONSTRAIN: /* sql */ `\n SELECT\n rco.update_rule as on_update,\n rco.delete_rule as on_delete,\n rco.\"unique_constraint_name\" as unique_constraint_name\n FROM information_schema.referential_constraints rco\n WHERE rco.constraint_name=ANY(?)\n AND rco.constraint_schema = ?\n`,\n FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE: /* sql */ `\n SELECT\n rel_kcu.\"table_name\" as foreign_table,\n rel_kcu.\"column_name\" as fk_column_name\n FROM information_schema.key_column_usage rel_kcu\n WHERE rel_kcu.constraint_name=?\n AND rel_kcu.table_schema = ?\n`,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'integer': {\n // find a way to figure out the increments\n return { type: 'integer' };\n }\n case 'text': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n case 'character': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'timestamp': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'numeric': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'real':\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'jsonb': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nconst getIndexType = (index: RawIndex) => {\n if (index.is_primary) {\n return 'primary';\n }\n\n if (index.is_unique) {\n return 'unique';\n }\n};\n\nexport default class PostgresqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n\n const tables = await this.getTables();\n\n schema.tables = await Promise.all(\n tables.map(async (tableName) => {\n const columns = await this.getColumns(tableName);\n const indexes = await this.getIndexes(tableName);\n const foreignKeys = await this.getForeignKeys(tableName);\n\n return {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n };\n })\n );\n\n return schema;\n }\n\n getDatabaseSchema(): string {\n return this.db.getSchemaName() || 'public';\n }\n\n async getTables(): Promise<string[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawTable[] }>(SQL_QUERIES.TABLE_LIST, [\n this.getDatabaseSchema(),\n ]);\n\n return rows.map((row) => row.table_name);\n }\n\n async getColumns(tableName: string): Promise<Column[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawColumn[] }>(SQL_QUERIES.LIST_COLUMNS, [\n this.getDatabaseSchema(),\n tableName,\n ]);\n\n return rows.map((row) => {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n const defaultTo =\n row.column_default && row.column_default.includes('nextval(') ? null : row.column_default;\n\n return {\n type,\n args,\n defaultTo,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: false,\n ...rest,\n };\n });\n }\n\n async getIndexes(tableName: string): Promise<Index[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawIndex[] }>(SQL_QUERIES.INDEX_LIST, [\n this.getDatabaseSchema(),\n tableName,\n ]);\n\n const ret: Record<RawIndex['indexrelid'], Index> = {};\n\n for (const index of rows) {\n if (index.column_name === 'id') {\n continue;\n }\n\n if (!ret[index.indexrelid]) {\n ret[index.indexrelid] = {\n columns: [index.column_name],\n name: index.index_name,\n type: getIndexType(index),\n };\n } else {\n ret[index.indexrelid].columns.push(index.column_name);\n }\n }\n\n return Object.values(ret);\n }\n\n async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawForeignKey[] }>(\n SQL_QUERIES.FOREIGN_KEY_LIST,\n [this.getDatabaseSchema(), tableName]\n );\n\n const ret: Record<RawForeignKey['constraint_name'], ForeignKey> = {};\n\n for (const fk of rows) {\n ret[fk.constraint_name] = {\n name: fk.constraint_name,\n columns: [],\n referencedColumns: [],\n referencedTable: null,\n onUpdate: null,\n onDelete: null,\n } as unknown as ForeignKey;\n }\n\n const constraintNames = Object.keys(ret);\n const dbSchema = this.getDatabaseSchema();\n if (constraintNames.length > 0) {\n const { rows: fkReferences } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES,\n [[constraintNames], dbSchema, tableName]\n );\n\n for (const fkReference of fkReferences) {\n ret[fkReference.constraint_name].columns.push(fkReference.column_name);\n\n const { rows: fkReferencesConstraint } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN,\n [[fkReference.constraint_name], dbSchema]\n );\n\n for (const fkReferenceC of fkReferencesConstraint) {\n const { rows: fkReferencesConstraintReferece } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE,\n [fkReferenceC.unique_constraint_name, dbSchema]\n );\n for (const fkReferenceConst of fkReferencesConstraintReferece) {\n ret[fkReference.constraint_name].referencedTable = fkReferenceConst.foreign_table;\n ret[fkReference.constraint_name].referencedColumns.push(\n fkReferenceConst.fk_column_name\n );\n }\n ret[fkReference.constraint_name].onUpdate = fkReferenceC.on_update.toUpperCase();\n ret[fkReference.constraint_name].onDelete = fkReferenceC.on_delete.toUpperCase();\n }\n }\n }\n\n return Object.values(ret);\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","LIST_COLUMNS","INDEX_LIST","FOREIGN_KEY_LIST","FOREIGN_KEY_REFERENCES","FOREIGN_KEY_REFERENCES_CONSTRAIN","FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE","toStrapiType","column","rootType","data_type","toLowerCase","match","type","args","character_maximum_length","useTz","precision","getIndexType","index","is_primary","is_unique","PostgresqlSchemaInspector","getSchema","schema","tables","getTables","Promise","all","map","tableName","columns","getColumns","indexes","getIndexes","foreignKeys","getForeignKeys","name","getDatabaseSchema","db","getSchemaName","rows","connection","raw","row","table_name","rest","defaultTo","column_default","includes","column_name","notNullable","is_nullable","unsigned","ret","indexrelid","index_name","push","Object","values","fk","constraint_name","referencedColumns","referencedTable","onUpdate","onDelete","constraintNames","keys","dbSchema","length","fkReferences","fkReference","fkReferencesConstraint","fkReferenceC","fkReferencesConstraintReferece","unique_constraint_name","fkReferenceConst","foreign_table","fk_column_name","on_update","toUpperCase","on_delete"],"mappings":"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"}
|