@strapi/database 5.12.0 → 5.12.2
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 +43 -0
- package/dist/connection.js.map +1 -0
- package/dist/connection.mjs +41 -0
- package/dist/connection.mjs.map +1 -0
- package/dist/dialects/dialect.js +54 -0
- package/dist/dialects/dialect.js.map +1 -0
- package/dist/dialects/dialect.mjs +52 -0
- package/dist/dialects/dialect.mjs.map +1 -0
- package/dist/dialects/index.js +44 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/index.mjs +42 -0
- package/dist/dialects/index.mjs.map +1 -0
- package/dist/dialects/mysql/constants.js +8 -0
- package/dist/dialects/mysql/constants.js.map +1 -0
- package/dist/dialects/mysql/constants.mjs +5 -0
- package/dist/dialects/mysql/constants.mjs.map +1 -0
- package/dist/dialects/mysql/database-inspector.js +35 -0
- package/dist/dialects/mysql/database-inspector.js.map +1 -0
- package/dist/dialects/mysql/database-inspector.mjs +33 -0
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
- package/dist/dialects/mysql/index.js +75 -0
- package/dist/dialects/mysql/index.js.map +1 -0
- package/dist/dialects/mysql/index.mjs +73 -0
- package/dist/dialects/mysql/index.mjs.map +1 -0
- package/dist/dialects/mysql/schema-inspector.js +297 -0
- package/dist/dialects/mysql/schema-inspector.js.map +1 -0
- package/dist/dialects/mysql/schema-inspector.mjs +295 -0
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/postgresql/index.js +62 -0
- package/dist/dialects/postgresql/index.js.map +1 -0
- package/dist/dialects/postgresql/index.mjs +60 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.js +316 -0
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/sqlite/index.js +82 -0
- package/dist/dialects/sqlite/index.js.map +1 -0
- package/dist/dialects/sqlite/index.mjs +80 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.js +211 -0
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
- package/dist/entity-manager/entity-repository.js +139 -0
- package/dist/entity-manager/entity-repository.js.map +1 -0
- package/dist/entity-manager/entity-repository.mjs +137 -0
- package/dist/entity-manager/entity-repository.mjs.map +1 -0
- package/dist/entity-manager/index.js +1186 -0
- package/dist/entity-manager/index.js.map +1 -0
- package/dist/entity-manager/index.mjs +1184 -0
- package/dist/entity-manager/index.mjs.map +1 -0
- package/dist/entity-manager/morph-relations.js +73 -0
- package/dist/entity-manager/morph-relations.js.map +1 -0
- package/dist/entity-manager/morph-relations.mjs +69 -0
- package/dist/entity-manager/morph-relations.mjs.map +1 -0
- package/dist/entity-manager/regular-relations.js +247 -0
- package/dist/entity-manager/regular-relations.js.map +1 -0
- package/dist/entity-manager/regular-relations.mjs +242 -0
- package/dist/entity-manager/regular-relations.mjs.map +1 -0
- package/dist/entity-manager/relations-orderer.js +221 -0
- package/dist/entity-manager/relations-orderer.js.map +1 -0
- package/dist/entity-manager/relations-orderer.mjs +218 -0
- package/dist/entity-manager/relations-orderer.mjs.map +1 -0
- package/dist/errors/database.js +13 -0
- package/dist/errors/database.js.map +1 -0
- package/dist/errors/database.mjs +11 -0
- package/dist/errors/database.mjs.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/index.mjs +7 -0
- package/dist/errors/index.mjs.map +1 -0
- package/dist/errors/invalid-date.js +13 -0
- package/dist/errors/invalid-date.js.map +1 -0
- package/dist/errors/invalid-date.mjs +11 -0
- package/dist/errors/invalid-date.mjs.map +1 -0
- package/dist/errors/invalid-datetime.js +13 -0
- package/dist/errors/invalid-datetime.js.map +1 -0
- package/dist/errors/invalid-datetime.mjs +11 -0
- package/dist/errors/invalid-datetime.mjs.map +1 -0
- package/dist/errors/invalid-relation.js +13 -0
- package/dist/errors/invalid-relation.js.map +1 -0
- package/dist/errors/invalid-relation.mjs +11 -0
- package/dist/errors/invalid-relation.mjs.map +1 -0
- package/dist/errors/invalid-time.js +13 -0
- package/dist/errors/invalid-time.js.map +1 -0
- package/dist/errors/invalid-time.mjs +11 -0
- package/dist/errors/invalid-time.mjs.map +1 -0
- package/dist/errors/not-null.js +17 -0
- package/dist/errors/not-null.js.map +1 -0
- package/dist/errors/not-null.mjs +15 -0
- package/dist/errors/not-null.mjs.map +1 -0
- package/dist/fields/biginteger.js +9 -0
- package/dist/fields/biginteger.js.map +1 -0
- package/dist/fields/biginteger.mjs +7 -0
- package/dist/fields/biginteger.mjs.map +1 -0
- package/dist/fields/boolean.js +48 -0
- package/dist/fields/boolean.js.map +1 -0
- package/dist/fields/boolean.mjs +46 -0
- package/dist/fields/boolean.mjs.map +1 -0
- package/dist/fields/date.js +16 -0
- package/dist/fields/date.js.map +1 -0
- package/dist/fields/date.mjs +14 -0
- package/dist/fields/date.mjs.map +1 -0
- package/dist/fields/datetime.js +37 -0
- package/dist/fields/datetime.js.map +1 -0
- package/dist/fields/datetime.mjs +16 -0
- package/dist/fields/datetime.mjs.map +1 -0
- package/dist/fields/field.js +16 -0
- package/dist/fields/field.js.map +1 -0
- package/dist/fields/field.mjs +14 -0
- package/dist/fields/field.mjs.map +1 -0
- package/dist/fields/index.js +45 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/index.mjs +43 -0
- package/dist/fields/index.mjs.map +1 -0
- package/dist/fields/json.js +36 -0
- package/dist/fields/json.js.map +1 -0
- package/dist/fields/json.mjs +34 -0
- package/dist/fields/json.mjs.map +1 -0
- package/dist/fields/number.js +20 -0
- package/dist/fields/number.js.map +1 -0
- package/dist/fields/number.mjs +18 -0
- package/dist/fields/number.mjs.map +1 -0
- package/dist/fields/shared/parsers.js +91 -0
- package/dist/fields/shared/parsers.js.map +1 -0
- package/dist/fields/shared/parsers.mjs +68 -0
- package/dist/fields/shared/parsers.mjs.map +1 -0
- package/dist/fields/string.js +16 -0
- package/dist/fields/string.js.map +1 -0
- package/dist/fields/string.mjs +14 -0
- package/dist/fields/string.mjs.map +1 -0
- package/dist/fields/time.js +17 -0
- package/dist/fields/time.js.map +1 -0
- package/dist/fields/time.mjs +15 -0
- package/dist/fields/time.mjs.map +1 -0
- package/dist/fields/timestamp.js +37 -0
- package/dist/fields/timestamp.js.map +1 -0
- package/dist/fields/timestamp.mjs +16 -0
- package/dist/fields/timestamp.mjs.map +1 -0
- package/dist/index.js +33 -8569
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -8532
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.js +73 -0
- package/dist/lifecycles/index.js.map +1 -0
- package/dist/lifecycles/index.mjs +71 -0
- package/dist/lifecycles/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/index.js +10 -0
- package/dist/lifecycles/subscribers/index.js.map +1 -0
- package/dist/lifecycles/subscribers/index.mjs +8 -0
- package/dist/lifecycles/subscribers/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.js +55 -0
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
- package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
- package/dist/metadata/index.js +24 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/index.mjs +16 -0
- package/dist/metadata/index.mjs.map +1 -0
- package/dist/metadata/metadata.js +100 -0
- package/dist/metadata/metadata.js.map +1 -0
- package/dist/metadata/metadata.mjs +98 -0
- package/dist/metadata/metadata.mjs.map +1 -0
- package/dist/metadata/relations.js +545 -0
- package/dist/metadata/relations.js.map +1 -0
- package/dist/metadata/relations.mjs +536 -0
- package/dist/metadata/relations.mjs.map +1 -0
- package/dist/migrations/common.js +8 -0
- package/dist/migrations/common.js.map +1 -0
- package/dist/migrations/common.mjs +6 -0
- package/dist/migrations/common.mjs.map +1 -0
- package/dist/migrations/index.js +39 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +37 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/index.js +26 -0
- package/dist/migrations/internal-migrations/index.js.map +1 -0
- package/dist/migrations/internal-migrations/index.mjs +24 -0
- package/dist/migrations/internal-migrations/index.mjs.map +1 -0
- package/dist/migrations/internal.js +63 -0
- package/dist/migrations/internal.js.map +1 -0
- package/dist/migrations/internal.mjs +61 -0
- package/dist/migrations/internal.mjs.map +1 -0
- package/dist/migrations/logger.js +24 -0
- package/dist/migrations/logger.js.map +1 -0
- package/dist/migrations/logger.mjs +22 -0
- package/dist/migrations/logger.mjs.map +1 -0
- package/dist/migrations/storage.js +39 -0
- package/dist/migrations/storage.js.map +1 -0
- package/dist/migrations/storage.mjs +37 -0
- package/dist/migrations/storage.mjs.map +1 -0
- package/dist/migrations/users.js +87 -0
- package/dist/migrations/users.js.map +1 -0
- package/dist/migrations/users.mjs +85 -0
- package/dist/migrations/users.mjs.map +1 -0
- package/dist/query/helpers/join.js +127 -0
- package/dist/query/helpers/join.js.map +1 -0
- package/dist/query/helpers/join.mjs +122 -0
- package/dist/query/helpers/join.mjs.map +1 -0
- package/dist/query/helpers/order-by.js +167 -0
- package/dist/query/helpers/order-by.js.map +1 -0
- package/dist/query/helpers/order-by.mjs +163 -0
- package/dist/query/helpers/order-by.mjs.map +1 -0
- package/dist/query/helpers/populate/apply.js +592 -0
- package/dist/query/helpers/populate/apply.js.map +1 -0
- package/dist/query/helpers/populate/apply.mjs +590 -0
- package/dist/query/helpers/populate/apply.mjs.map +1 -0
- package/dist/query/helpers/populate/process.js +92 -0
- package/dist/query/helpers/populate/process.js.map +1 -0
- package/dist/query/helpers/populate/process.mjs +90 -0
- package/dist/query/helpers/populate/process.mjs.map +1 -0
- package/dist/query/helpers/search.js +67 -0
- package/dist/query/helpers/search.js.map +1 -0
- package/dist/query/helpers/search.mjs +65 -0
- package/dist/query/helpers/search.mjs.map +1 -0
- package/dist/query/helpers/streams/readable.js +131 -0
- package/dist/query/helpers/streams/readable.js.map +1 -0
- package/dist/query/helpers/streams/readable.mjs +129 -0
- package/dist/query/helpers/streams/readable.mjs.map +1 -0
- package/dist/query/helpers/transform.js +77 -0
- package/dist/query/helpers/transform.js.map +1 -0
- package/dist/query/helpers/transform.mjs +73 -0
- package/dist/query/helpers/transform.mjs.map +1 -0
- package/dist/query/helpers/where.js +372 -0
- package/dist/query/helpers/where.js.map +1 -0
- package/dist/query/helpers/where.mjs +369 -0
- package/dist/query/helpers/where.mjs.map +1 -0
- package/dist/query/query-builder.js +507 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +505 -0
- package/dist/query/query-builder.mjs.map +1 -0
- package/dist/repairs/index.js +13 -0
- package/dist/repairs/index.js.map +1 -0
- package/dist/repairs/index.mjs +11 -0
- package/dist/repairs/index.mjs.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
- package/dist/schema/builder.js +354 -0
- package/dist/schema/builder.js.map +1 -0
- package/dist/schema/builder.mjs +352 -0
- package/dist/schema/builder.mjs.map +1 -0
- package/dist/schema/diff.js +379 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/diff.mjs +377 -0
- package/dist/schema/diff.mjs.map +1 -0
- package/dist/schema/index.js +93 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +91 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/schema/schema.js +266 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/schema.mjs +264 -0
- package/dist/schema/schema.mjs.map +1 -0
- package/dist/schema/storage.js +58 -0
- package/dist/schema/storage.js.map +1 -0
- package/dist/schema/storage.mjs +56 -0
- package/dist/schema/storage.mjs.map +1 -0
- package/dist/transaction-context.js +65 -0
- package/dist/transaction-context.js.map +1 -0
- package/dist/transaction-context.mjs +63 -0
- package/dist/transaction-context.mjs.map +1 -0
- package/dist/utils/async-curry.js +19 -0
- package/dist/utils/async-curry.js.map +1 -0
- package/dist/utils/async-curry.mjs +17 -0
- package/dist/utils/async-curry.mjs.map +1 -0
- package/dist/utils/identifiers/hash.js +30 -0
- package/dist/utils/identifiers/hash.js.map +1 -0
- package/dist/utils/identifiers/hash.mjs +28 -0
- package/dist/utils/identifiers/hash.mjs.map +1 -0
- package/dist/utils/identifiers/index.js +414 -0
- package/dist/utils/identifiers/index.js.map +1 -0
- package/dist/utils/identifiers/index.mjs +411 -0
- package/dist/utils/identifiers/index.mjs.map +1 -0
- package/dist/utils/knex.js +21 -0
- package/dist/utils/knex.js.map +1 -0
- package/dist/utils/knex.mjs +18 -0
- package/dist/utils/knex.mjs.map +1 -0
- package/dist/utils/types.js +51 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/types.mjs +44 -0
- package/dist/utils/types.mjs.map +1 -0
- package/dist/validations/index.js +12 -0
- package/dist/validations/index.js.map +1 -0
- package/dist/validations/index.mjs +10 -0
- package/dist/validations/index.mjs.map +1 -0
- package/dist/validations/relations/bidirectional.js +64 -0
- package/dist/validations/relations/bidirectional.js.map +1 -0
- package/dist/validations/relations/bidirectional.mjs +62 -0
- package/dist/validations/relations/bidirectional.mjs.map +1 -0
- package/dist/validations/relations/index.js +13 -0
- package/dist/validations/relations/index.js.map +1 -0
- package/dist/validations/relations/index.mjs +11 -0
- package/dist/validations/relations/index.mjs.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/schema/index.ts"],"sourcesContent":["import createDebug from 'debug';\n\nimport createSchemaBuilder from './builder';\nimport createSchemaDiff from './diff';\nimport createSchemaStorage from './storage';\nimport { metadataToSchema } from './schema';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider {\n builder: ReturnType<typeof createSchemaBuilder>;\n schemaDiff: ReturnType<typeof createSchemaDiff>;\n schemaStorage: ReturnType<typeof createSchemaStorage>;\n sync(): Promise<SchemaDiff['status']>;\n syncSchema(): Promise<SchemaDiff['status']>;\n reset(): Promise<void>;\n create(): Promise<void>;\n drop(): Promise<void>;\n schema: Schema;\n}\n\ninterface State {\n schema?: Schema;\n}\n\nexport const createSchemaProvider = (db: Database): SchemaProvider => {\n const state: State = {};\n\n return {\n get schema() {\n if (!state.schema) {\n debug('Converting metadata to database schema');\n state.schema = metadataToSchema(db.metadata);\n }\n\n return state.schema;\n },\n builder: createSchemaBuilder(db),\n schemaDiff: createSchemaDiff(db),\n schemaStorage: createSchemaStorage(db),\n\n /**\n * Drops the database schema\n */\n async drop() {\n debug('Dropping database schema');\n\n const DBSchema = await db.dialect.schemaInspector.getSchema();\n await this.builder.dropSchema(DBSchema);\n },\n\n /**\n * Creates the database schema\n */\n async create() {\n debug('Created database schema');\n await this.builder.createSchema(this.schema);\n },\n\n /**\n * Resets the database schema\n */\n async reset() {\n debug('Resetting database schema');\n await this.drop();\n await this.create();\n },\n\n async syncSchema(): Promise<SchemaDiff['status']> {\n debug('Synchronizing database schema');\n\n const databaseSchema = await db.dialect.schemaInspector.getSchema();\n const storedSchema = await this.schemaStorage.read();\n\n /*\n 3way diff - DB schema / previous metadataSchema / new metadataSchema\n\n - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored\n - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else\n - Apply this logic to Tables / Columns / Indexes / FKs ...\n - Handle errors (indexes or fks on incompatible stuff ...)\n\n */\n\n const { status, diff } = await this.schemaDiff.diff({\n previousSchema: storedSchema?.schema,\n databaseSchema,\n userSchema: this.schema,\n });\n\n if (status === 'CHANGED') {\n await this.builder.updateSchema(diff);\n }\n\n await this.schemaStorage.add(this.schema);\n\n return status;\n },\n\n // TODO: support options to migrate softly or forcefully\n // TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup\n // TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)\n async sync(): Promise<SchemaDiff['status']> {\n if (await db.migrations.shouldRun()) {\n debug('Found migrations to run');\n await db.migrations.up();\n\n return this.syncSchema();\n }\n\n const oldSchema = await this.schemaStorage.read();\n\n if (!oldSchema) {\n debug('Schema not persisted yet');\n return this.syncSchema();\n }\n\n const { hash: oldHash } = oldSchema;\n const hash = await this.schemaStorage.hashSchema(this.schema);\n\n if (oldHash !== hash) {\n debug('Schema changed');\n\n return this.syncSchema();\n }\n\n debug('Schema unchanged');\n\n return 'UNCHANGED';\n },\n };\n};\n"],"names":["debug","createDebug","createSchemaProvider","db","state","schema","metadataToSchema","metadata","builder","createSchemaBuilder","schemaDiff","createSchemaDiff","schemaStorage","createSchemaStorage","drop","DBSchema","dialect","schemaInspector","getSchema","dropSchema","create","createSchema","reset","syncSchema","databaseSchema","storedSchema","read","status","diff","previousSchema","userSchema","updateSchema","add","sync","migrations","shouldRun","up","oldSchema","hash","oldHash","hashSchema"],"mappings":"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"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var types = require('../utils/types.js');
|
|
4
|
+
var index = require('../utils/identifiers/index.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* TODO: This needs to be refactored to support incoming names such as
|
|
8
|
+
* (column, table, index) that are of the form string | NameToken[] so
|
|
9
|
+
* that pieces can be passed through and shortened here.
|
|
10
|
+
*
|
|
11
|
+
* Currently, we are potentially shortening twice, although in reality
|
|
12
|
+
* that won't happen since the shortened attribute column names will
|
|
13
|
+
* fit here because they are already shortened to the max identifier
|
|
14
|
+
* length
|
|
15
|
+
*
|
|
16
|
+
* That is the reason we use getName() here and not getColumnName();
|
|
17
|
+
* we just want the exact shortened name for the value without doing
|
|
18
|
+
* any other potential manipulation to it
|
|
19
|
+
* */ const createColumn = (name, attribute)=>{
|
|
20
|
+
const { type, args = [], ...opts } = getColumnType(attribute);
|
|
21
|
+
return {
|
|
22
|
+
name: index.identifiers.getName(name),
|
|
23
|
+
type,
|
|
24
|
+
args,
|
|
25
|
+
defaultTo: null,
|
|
26
|
+
notNullable: false,
|
|
27
|
+
unsigned: false,
|
|
28
|
+
...opts,
|
|
29
|
+
...'column' in attribute ? attribute.column ?? {} : {}
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const createTable = (meta)=>{
|
|
33
|
+
const table = {
|
|
34
|
+
name: meta.tableName,
|
|
35
|
+
indexes: meta.indexes || [],
|
|
36
|
+
foreignKeys: meta.foreignKeys || [],
|
|
37
|
+
columns: []
|
|
38
|
+
};
|
|
39
|
+
for (const key of Object.keys(meta.attributes)){
|
|
40
|
+
const attribute = meta.attributes[key];
|
|
41
|
+
// if (types.isRelation(attribute.type)) {
|
|
42
|
+
if (attribute.type === 'relation') {
|
|
43
|
+
if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {
|
|
44
|
+
const { idColumn, typeColumn } = attribute.morphColumn;
|
|
45
|
+
const idColumnName = index.identifiers.getName(idColumn.name);
|
|
46
|
+
const typeColumnName = index.identifiers.getName(typeColumn.name);
|
|
47
|
+
table.columns.push(createColumn(idColumnName, {
|
|
48
|
+
type: 'integer',
|
|
49
|
+
column: {
|
|
50
|
+
unsigned: true
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
table.columns.push(createColumn(typeColumnName, {
|
|
54
|
+
type: 'string'
|
|
55
|
+
}));
|
|
56
|
+
} else if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner && attribute.joinColumn.referencedTable) {
|
|
57
|
+
// NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one
|
|
58
|
+
const { name: columnNameFull, referencedColumn, referencedTable, columnType = 'integer' } = attribute.joinColumn;
|
|
59
|
+
const columnName = index.identifiers.getName(columnNameFull);
|
|
60
|
+
const column = createColumn(columnName, {
|
|
61
|
+
// TODO: find the column type automatically, or allow passing all the column params
|
|
62
|
+
type: columnType,
|
|
63
|
+
column: {
|
|
64
|
+
unsigned: true
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
table.columns.push(column);
|
|
68
|
+
const fkName = index.identifiers.getFkIndexName([
|
|
69
|
+
table.name,
|
|
70
|
+
columnName
|
|
71
|
+
]);
|
|
72
|
+
table.foreignKeys.push({
|
|
73
|
+
name: fkName,
|
|
74
|
+
columns: [
|
|
75
|
+
column.name
|
|
76
|
+
],
|
|
77
|
+
referencedTable,
|
|
78
|
+
referencedColumns: [
|
|
79
|
+
referencedColumn
|
|
80
|
+
],
|
|
81
|
+
// NOTE: could allow configuration
|
|
82
|
+
onDelete: 'SET NULL'
|
|
83
|
+
});
|
|
84
|
+
table.indexes.push({
|
|
85
|
+
name: fkName,
|
|
86
|
+
columns: [
|
|
87
|
+
column.name
|
|
88
|
+
]
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
} else if (types.isScalarAttribute(attribute)) {
|
|
92
|
+
const columnName = index.identifiers.getName(attribute.columnName || key);
|
|
93
|
+
const column = createColumn(columnName, attribute);
|
|
94
|
+
if (column.unique) {
|
|
95
|
+
table.indexes.push({
|
|
96
|
+
type: 'unique',
|
|
97
|
+
name: index.identifiers.getUniqueIndexName([
|
|
98
|
+
table.name,
|
|
99
|
+
column.name
|
|
100
|
+
]),
|
|
101
|
+
columns: [
|
|
102
|
+
columnName
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (column.primary) {
|
|
107
|
+
table.indexes.push({
|
|
108
|
+
type: 'primary',
|
|
109
|
+
name: index.identifiers.getPrimaryIndexName([
|
|
110
|
+
table.name,
|
|
111
|
+
column.name
|
|
112
|
+
]),
|
|
113
|
+
columns: [
|
|
114
|
+
columnName
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
table.columns.push(column);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return table;
|
|
122
|
+
};
|
|
123
|
+
const getColumnType = (attribute)=>{
|
|
124
|
+
if ('columnType' in attribute && attribute.columnType) {
|
|
125
|
+
return attribute.columnType;
|
|
126
|
+
}
|
|
127
|
+
switch(attribute.type){
|
|
128
|
+
case 'increments':
|
|
129
|
+
{
|
|
130
|
+
return {
|
|
131
|
+
type: 'increments',
|
|
132
|
+
args: [
|
|
133
|
+
{
|
|
134
|
+
primary: true,
|
|
135
|
+
primaryKey: true
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
notNullable: true
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// We might want to convert email/password to string types before going into the orm with specific validators & transformers
|
|
142
|
+
case 'password':
|
|
143
|
+
case 'email':
|
|
144
|
+
case 'string':
|
|
145
|
+
case 'enumeration':
|
|
146
|
+
{
|
|
147
|
+
return {
|
|
148
|
+
type: 'string'
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
case 'uid':
|
|
152
|
+
{
|
|
153
|
+
return {
|
|
154
|
+
type: 'string'
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
case 'richtext':
|
|
158
|
+
case 'text':
|
|
159
|
+
{
|
|
160
|
+
return {
|
|
161
|
+
type: 'text',
|
|
162
|
+
args: [
|
|
163
|
+
'longtext'
|
|
164
|
+
]
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
case 'blocks':
|
|
168
|
+
case 'json':
|
|
169
|
+
{
|
|
170
|
+
return {
|
|
171
|
+
type: 'jsonb'
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
case 'integer':
|
|
175
|
+
{
|
|
176
|
+
return {
|
|
177
|
+
type: 'integer'
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
case 'biginteger':
|
|
181
|
+
{
|
|
182
|
+
return {
|
|
183
|
+
type: 'bigInteger'
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
case 'float':
|
|
187
|
+
{
|
|
188
|
+
return {
|
|
189
|
+
type: 'double'
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
case 'decimal':
|
|
193
|
+
{
|
|
194
|
+
return {
|
|
195
|
+
type: 'decimal',
|
|
196
|
+
args: [
|
|
197
|
+
10,
|
|
198
|
+
2
|
|
199
|
+
]
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
case 'date':
|
|
203
|
+
{
|
|
204
|
+
return {
|
|
205
|
+
type: 'date'
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
case 'time':
|
|
209
|
+
{
|
|
210
|
+
return {
|
|
211
|
+
type: 'time',
|
|
212
|
+
args: [
|
|
213
|
+
{
|
|
214
|
+
precision: 3
|
|
215
|
+
}
|
|
216
|
+
]
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
case 'datetime':
|
|
220
|
+
{
|
|
221
|
+
return {
|
|
222
|
+
type: 'datetime',
|
|
223
|
+
args: [
|
|
224
|
+
{
|
|
225
|
+
useTz: false,
|
|
226
|
+
precision: 6
|
|
227
|
+
}
|
|
228
|
+
]
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
case 'timestamp':
|
|
232
|
+
{
|
|
233
|
+
return {
|
|
234
|
+
type: 'timestamp',
|
|
235
|
+
args: [
|
|
236
|
+
{
|
|
237
|
+
useTz: false,
|
|
238
|
+
precision: 6
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
case 'boolean':
|
|
244
|
+
{
|
|
245
|
+
return {
|
|
246
|
+
type: 'boolean'
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
default:
|
|
250
|
+
{
|
|
251
|
+
throw new Error(`Unknown type ${attribute.type}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
const metadataToSchema = (metadata)=>{
|
|
256
|
+
const schema = {
|
|
257
|
+
tables: []
|
|
258
|
+
};
|
|
259
|
+
metadata.forEach((metadata)=>{
|
|
260
|
+
schema.tables.push(createTable(metadata));
|
|
261
|
+
});
|
|
262
|
+
return schema;
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
exports.metadataToSchema = metadataToSchema;
|
|
266
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":"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"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { isScalarAttribute } from '../utils/types.mjs';
|
|
2
|
+
import { identifiers } from '../utils/identifiers/index.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* TODO: This needs to be refactored to support incoming names such as
|
|
6
|
+
* (column, table, index) that are of the form string | NameToken[] so
|
|
7
|
+
* that pieces can be passed through and shortened here.
|
|
8
|
+
*
|
|
9
|
+
* Currently, we are potentially shortening twice, although in reality
|
|
10
|
+
* that won't happen since the shortened attribute column names will
|
|
11
|
+
* fit here because they are already shortened to the max identifier
|
|
12
|
+
* length
|
|
13
|
+
*
|
|
14
|
+
* That is the reason we use getName() here and not getColumnName();
|
|
15
|
+
* we just want the exact shortened name for the value without doing
|
|
16
|
+
* any other potential manipulation to it
|
|
17
|
+
* */ const createColumn = (name, attribute)=>{
|
|
18
|
+
const { type, args = [], ...opts } = getColumnType(attribute);
|
|
19
|
+
return {
|
|
20
|
+
name: identifiers.getName(name),
|
|
21
|
+
type,
|
|
22
|
+
args,
|
|
23
|
+
defaultTo: null,
|
|
24
|
+
notNullable: false,
|
|
25
|
+
unsigned: false,
|
|
26
|
+
...opts,
|
|
27
|
+
...'column' in attribute ? attribute.column ?? {} : {}
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const createTable = (meta)=>{
|
|
31
|
+
const table = {
|
|
32
|
+
name: meta.tableName,
|
|
33
|
+
indexes: meta.indexes || [],
|
|
34
|
+
foreignKeys: meta.foreignKeys || [],
|
|
35
|
+
columns: []
|
|
36
|
+
};
|
|
37
|
+
for (const key of Object.keys(meta.attributes)){
|
|
38
|
+
const attribute = meta.attributes[key];
|
|
39
|
+
// if (types.isRelation(attribute.type)) {
|
|
40
|
+
if (attribute.type === 'relation') {
|
|
41
|
+
if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {
|
|
42
|
+
const { idColumn, typeColumn } = attribute.morphColumn;
|
|
43
|
+
const idColumnName = identifiers.getName(idColumn.name);
|
|
44
|
+
const typeColumnName = identifiers.getName(typeColumn.name);
|
|
45
|
+
table.columns.push(createColumn(idColumnName, {
|
|
46
|
+
type: 'integer',
|
|
47
|
+
column: {
|
|
48
|
+
unsigned: true
|
|
49
|
+
}
|
|
50
|
+
}));
|
|
51
|
+
table.columns.push(createColumn(typeColumnName, {
|
|
52
|
+
type: 'string'
|
|
53
|
+
}));
|
|
54
|
+
} else if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner && attribute.joinColumn.referencedTable) {
|
|
55
|
+
// NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one
|
|
56
|
+
const { name: columnNameFull, referencedColumn, referencedTable, columnType = 'integer' } = attribute.joinColumn;
|
|
57
|
+
const columnName = identifiers.getName(columnNameFull);
|
|
58
|
+
const column = createColumn(columnName, {
|
|
59
|
+
// TODO: find the column type automatically, or allow passing all the column params
|
|
60
|
+
type: columnType,
|
|
61
|
+
column: {
|
|
62
|
+
unsigned: true
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
table.columns.push(column);
|
|
66
|
+
const fkName = identifiers.getFkIndexName([
|
|
67
|
+
table.name,
|
|
68
|
+
columnName
|
|
69
|
+
]);
|
|
70
|
+
table.foreignKeys.push({
|
|
71
|
+
name: fkName,
|
|
72
|
+
columns: [
|
|
73
|
+
column.name
|
|
74
|
+
],
|
|
75
|
+
referencedTable,
|
|
76
|
+
referencedColumns: [
|
|
77
|
+
referencedColumn
|
|
78
|
+
],
|
|
79
|
+
// NOTE: could allow configuration
|
|
80
|
+
onDelete: 'SET NULL'
|
|
81
|
+
});
|
|
82
|
+
table.indexes.push({
|
|
83
|
+
name: fkName,
|
|
84
|
+
columns: [
|
|
85
|
+
column.name
|
|
86
|
+
]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
} else if (isScalarAttribute(attribute)) {
|
|
90
|
+
const columnName = identifiers.getName(attribute.columnName || key);
|
|
91
|
+
const column = createColumn(columnName, attribute);
|
|
92
|
+
if (column.unique) {
|
|
93
|
+
table.indexes.push({
|
|
94
|
+
type: 'unique',
|
|
95
|
+
name: identifiers.getUniqueIndexName([
|
|
96
|
+
table.name,
|
|
97
|
+
column.name
|
|
98
|
+
]),
|
|
99
|
+
columns: [
|
|
100
|
+
columnName
|
|
101
|
+
]
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (column.primary) {
|
|
105
|
+
table.indexes.push({
|
|
106
|
+
type: 'primary',
|
|
107
|
+
name: identifiers.getPrimaryIndexName([
|
|
108
|
+
table.name,
|
|
109
|
+
column.name
|
|
110
|
+
]),
|
|
111
|
+
columns: [
|
|
112
|
+
columnName
|
|
113
|
+
]
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
table.columns.push(column);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return table;
|
|
120
|
+
};
|
|
121
|
+
const getColumnType = (attribute)=>{
|
|
122
|
+
if ('columnType' in attribute && attribute.columnType) {
|
|
123
|
+
return attribute.columnType;
|
|
124
|
+
}
|
|
125
|
+
switch(attribute.type){
|
|
126
|
+
case 'increments':
|
|
127
|
+
{
|
|
128
|
+
return {
|
|
129
|
+
type: 'increments',
|
|
130
|
+
args: [
|
|
131
|
+
{
|
|
132
|
+
primary: true,
|
|
133
|
+
primaryKey: true
|
|
134
|
+
}
|
|
135
|
+
],
|
|
136
|
+
notNullable: true
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// We might want to convert email/password to string types before going into the orm with specific validators & transformers
|
|
140
|
+
case 'password':
|
|
141
|
+
case 'email':
|
|
142
|
+
case 'string':
|
|
143
|
+
case 'enumeration':
|
|
144
|
+
{
|
|
145
|
+
return {
|
|
146
|
+
type: 'string'
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
case 'uid':
|
|
150
|
+
{
|
|
151
|
+
return {
|
|
152
|
+
type: 'string'
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
case 'richtext':
|
|
156
|
+
case 'text':
|
|
157
|
+
{
|
|
158
|
+
return {
|
|
159
|
+
type: 'text',
|
|
160
|
+
args: [
|
|
161
|
+
'longtext'
|
|
162
|
+
]
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
case 'blocks':
|
|
166
|
+
case 'json':
|
|
167
|
+
{
|
|
168
|
+
return {
|
|
169
|
+
type: 'jsonb'
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
case 'integer':
|
|
173
|
+
{
|
|
174
|
+
return {
|
|
175
|
+
type: 'integer'
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
case 'biginteger':
|
|
179
|
+
{
|
|
180
|
+
return {
|
|
181
|
+
type: 'bigInteger'
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
case 'float':
|
|
185
|
+
{
|
|
186
|
+
return {
|
|
187
|
+
type: 'double'
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
case 'decimal':
|
|
191
|
+
{
|
|
192
|
+
return {
|
|
193
|
+
type: 'decimal',
|
|
194
|
+
args: [
|
|
195
|
+
10,
|
|
196
|
+
2
|
|
197
|
+
]
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
case 'date':
|
|
201
|
+
{
|
|
202
|
+
return {
|
|
203
|
+
type: 'date'
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
case 'time':
|
|
207
|
+
{
|
|
208
|
+
return {
|
|
209
|
+
type: 'time',
|
|
210
|
+
args: [
|
|
211
|
+
{
|
|
212
|
+
precision: 3
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
case 'datetime':
|
|
218
|
+
{
|
|
219
|
+
return {
|
|
220
|
+
type: 'datetime',
|
|
221
|
+
args: [
|
|
222
|
+
{
|
|
223
|
+
useTz: false,
|
|
224
|
+
precision: 6
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
case 'timestamp':
|
|
230
|
+
{
|
|
231
|
+
return {
|
|
232
|
+
type: 'timestamp',
|
|
233
|
+
args: [
|
|
234
|
+
{
|
|
235
|
+
useTz: false,
|
|
236
|
+
precision: 6
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
case 'boolean':
|
|
242
|
+
{
|
|
243
|
+
return {
|
|
244
|
+
type: 'boolean'
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
default:
|
|
248
|
+
{
|
|
249
|
+
throw new Error(`Unknown type ${attribute.type}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
const metadataToSchema = (metadata)=>{
|
|
254
|
+
const schema = {
|
|
255
|
+
tables: []
|
|
256
|
+
};
|
|
257
|
+
metadata.forEach((metadata)=>{
|
|
258
|
+
schema.tables.push(createTable(metadata));
|
|
259
|
+
});
|
|
260
|
+
return schema;
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
export { metadataToSchema };
|
|
264
|
+
//# sourceMappingURL=schema.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.mjs","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var crypto = require('crypto');
|
|
4
|
+
|
|
5
|
+
const TABLE_NAME = 'strapi_database_schema';
|
|
6
|
+
var createSchemaStorage = ((db)=>{
|
|
7
|
+
const hasSchemaTable = ()=>db.getSchemaConnection().hasTable(TABLE_NAME);
|
|
8
|
+
const createSchemaTable = ()=>{
|
|
9
|
+
return db.getSchemaConnection().createTable(TABLE_NAME, (t)=>{
|
|
10
|
+
t.increments('id');
|
|
11
|
+
t.json('schema');
|
|
12
|
+
t.datetime('time', {
|
|
13
|
+
useTz: false
|
|
14
|
+
});
|
|
15
|
+
t.string('hash');
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
const checkTableExists = async ()=>{
|
|
19
|
+
if (!await hasSchemaTable()) {
|
|
20
|
+
await createSchemaTable();
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
async read () {
|
|
25
|
+
await checkTableExists();
|
|
26
|
+
const res = await db.getConnection().select('*').from(TABLE_NAME).orderBy('time', 'DESC').first();
|
|
27
|
+
if (!res) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);
|
|
31
|
+
return {
|
|
32
|
+
...res,
|
|
33
|
+
schema: parsedSchema
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
hashSchema (schema) {
|
|
37
|
+
return crypto.createHash('md5').update(JSON.stringify(schema)).digest('hex');
|
|
38
|
+
},
|
|
39
|
+
async add (schema) {
|
|
40
|
+
await checkTableExists();
|
|
41
|
+
// NOTE: we can remove this to add history
|
|
42
|
+
await db.getConnection(TABLE_NAME).delete();
|
|
43
|
+
const time = new Date();
|
|
44
|
+
await db.getConnection().insert({
|
|
45
|
+
schema: JSON.stringify(schema),
|
|
46
|
+
hash: this.hashSchema(schema),
|
|
47
|
+
time
|
|
48
|
+
}).into(TABLE_NAME);
|
|
49
|
+
},
|
|
50
|
+
async clear () {
|
|
51
|
+
await checkTableExists();
|
|
52
|
+
await db.getConnection(TABLE_NAME).truncate();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
module.exports = createSchemaStorage;
|
|
58
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n return crypto.createHash('md5').update(JSON.stringify(schema)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","res","getConnection","select","from","orderBy","first","parsedSchema","schema","JSON","parse","hashSchema","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":";;;;AAKA,MAAMA,UAAa,GAAA,wBAAA;AAEnB,0BAAe,CAAA,CAACC,EAAAA,GAAAA;AACd,IAAA,MAAMC,iBAAiB,IAAMD,EAAAA,CAAGE,mBAAmB,EAAA,CAAGC,QAAQ,CAACJ,UAAAA,CAAAA;AAE/D,IAAA,MAAMK,iBAAoB,GAAA,IAAA;AACxB,QAAA,OAAOJ,GAAGE,mBAAmB,EAAA,CAAGG,WAAW,CAACN,YAAY,CAACO,CAAAA,GAAAA;AACvDA,YAAAA,CAAAA,CAAEC,UAAU,CAAC,IAAA,CAAA;AACbD,YAAAA,CAAAA,CAAEE,IAAI,CAAC,QAAA,CAAA;YACPF,CAAEG,CAAAA,QAAQ,CAAC,MAAQ,EAAA;gBAAEC,KAAO,EAAA;AAAM,aAAA,CAAA;AAClCJ,YAAAA,CAAAA,CAAEK,MAAM,CAAC,MAAA,CAAA;AACX,SAAA,CAAA;AACF,KAAA;AAEA,IAAA,MAAMC,gBAAmB,GAAA,UAAA;QACvB,IAAI,CAAE,MAAMX,cAAmB,EAAA,EAAA;YAC7B,MAAMG,iBAAAA,EAAAA;AACR;AACF,KAAA;IAEA,OAAO;QACL,MAAMS,IAAAA,CAAAA,GAAAA;YAMJ,MAAMD,gBAAAA,EAAAA;AAEN,YAAA,MAAME,GAAM,GAAA,MAAMd,EACfe,CAAAA,aAAa,GACbC,MAAM,CAAC,GACPC,CAAAA,CAAAA,IAAI,CAAClB,UACLmB,CAAAA,CAAAA,OAAO,CAAC,MAAA,EAAQ,QAChBC,KAAK,EAAA;AAER,YAAA,IAAI,CAACL,GAAK,EAAA;gBACR,OAAO,IAAA;AACT;AAEA,YAAA,MAAMM,YAAe,GAAA,OAAON,GAAIO,CAAAA,MAAM,KAAK,QAAA,GAAWP,GAAIO,CAAAA,MAAM,GAAGC,IAAAA,CAAKC,KAAK,CAACT,IAAIO,MAAM,CAAA;YAExF,OAAO;AACL,gBAAA,GAAGP,GAAG;gBACNO,MAAQD,EAAAA;AACV,aAAA;AACF,SAAA;AAEAI,QAAAA,UAAAA,CAAAA,CAAWH,MAAc,EAAA;YACvB,OAAOI,MAAAA,CAAOC,UAAU,CAAC,KAAOC,CAAAA,CAAAA,MAAM,CAACL,IAAAA,CAAKM,SAAS,CAACP,MAASQ,CAAAA,CAAAA,CAAAA,MAAM,CAAC,KAAA,CAAA;AACxE,SAAA;AAEA,QAAA,MAAMC,KAAIT,MAAc,EAAA;YACtB,MAAMT,gBAAAA,EAAAA;;AAGN,YAAA,MAAMZ,EAAGe,CAAAA,aAAa,CAAChB,UAAAA,CAAAA,CAAYgC,MAAM,EAAA;AAEzC,YAAA,MAAMC,OAAO,IAAIC,IAAAA,EAAAA;AAEjB,YAAA,MAAMjC,EACHe,CAAAA,aAAa,EACbmB,CAAAA,MAAM,CAAC;gBACNb,MAAQC,EAAAA,IAAAA,CAAKM,SAAS,CAACP,MAAAA,CAAAA;gBACvBc,IAAM,EAAA,IAAI,CAACX,UAAU,CAACH,MAAAA,CAAAA;AACtBW,gBAAAA;AACF,aAAA,CAAA,CACCI,IAAI,CAACrC,UAAAA,CAAAA;AACV,SAAA;QAEA,MAAMsC,KAAAA,CAAAA,GAAAA;YACJ,MAAMzB,gBAAAA,EAAAA;AAEN,YAAA,MAAMZ,EAAGe,CAAAA,aAAa,CAAChB,UAAAA,CAAAA,CAAYuC,QAAQ,EAAA;AAC7C;AACF,KAAA;AACF,CAAA;;;;"}
|