UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 4.51 kB
{"version":3,"file":"get-collection-migration-status.mjs","names":[],"sources":["../../../src/libs/collection/get-collection-migration-status.ts"],"sourcesContent":["import type CollectionBuilder from \"../../libs/collection/builders/collection-builder/index.js\";\nimport { isTreeTableType } from \"../../libs/collection/custom-fields/storage/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport { CollectionMigrationsRepository } from \"../repositories/index.js\";\nimport stripColumnPrefix from \"./helpers/strip-column-prefix.js\";\nimport inferSchema from \"./schema/infer-schema.js\";\nimport diffSnapshotVsConfig from \"./schema/runtime/diff-snapshot-vs-config.js\";\n\nexport type MigrationStatus = {\n\trequiresMigration: boolean;\n\t/**\n\t * These fields are missing columns in the database. They exist in the current state of the collection/brick fields.\n\t */\n\tmissingColumns: Record<string, string[]>;\n};\n\n/**\n * Works out if a collection requires migration by comparing the latest\n * persisted schema snapshot with the current inferred schema.\n */\nconst getMigrationStatus: ServiceFn<\n\t[{ collection: CollectionBuilder }],\n\tMigrationStatus\n> = async (context, data) => {\n\tconst CollectionMigrations = new CollectionMigrationsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\tconst localSchemaRes = inferSchema(data.collection, context.config.db);\n\tif (localSchemaRes.error) return localSchemaRes;\n\n\tconst latestMigrationRes =\n\t\tawait CollectionMigrations.selectLatestByCollectionKey({\n\t\t\tcollectionKey: data.collection.key,\n\t\t});\n\tif (latestMigrationRes.error) return latestMigrationRes;\n\n\tif (!latestMigrationRes.data) {\n\t\treturn {\n\t\t\tdata: {\n\t\t\t\trequiresMigration: true,\n\t\t\t\tmissingColumns: {},\n\t\t\t},\n\t\t\terror: undefined,\n\t\t};\n\t}\n\n\tconst diff = diffSnapshotVsConfig(\n\t\tlatestMigrationRes.data.collection_schema,\n\t\tlocalSchemaRes.data,\n\t);\n\n\tconst missingColumns: Record<string, string[]> = {};\n\n\tfor (const table of localSchemaRes.data.tables) {\n\t\tif (\n\t\t\ttable.type !== \"document-fields\" &&\n\t\t\ttable.type !== \"brick\" &&\n\t\t\t!isTreeTableType(table.type)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst missingTable = diff.missingTableNames.has(table.name);\n\t\tconst missingColumnNames = diff.missingColumnsByTable.get(table.name);\n\n\t\tconst missingFieldColumns = table.columns\n\t\t\t.filter((column) => column.source === \"field\")\n\t\t\t.filter((column) =>\n\t\t\t\tmissingTable ? true : missingColumnNames?.has(column.name),\n\t\t\t)\n\t\t\t.map((column) => stripColumnPrefix(column.name));\n\n\t\tif (missingFieldColumns.length === 0) continue;\n\n\t\tconst tableKey =\n\t\t\ttable.type === \"document-fields\" ? \"document-fields\" : table.key.brick;\n\t\tif (!tableKey) continue;\n\n\t\tif (!missingColumns[tableKey]) {\n\t\t\tmissingColumns[tableKey] = [];\n\t\t}\n\n\t\tmissingColumns[tableKey].push(...missingFieldColumns);\n\t}\n\n\tconst requiresMigration =\n\t\tdiff.missingTableNames.size > 0 ||\n\t\tdiff.missingColumnsByTable.size > 0 ||\n\t\tdiff.missingIndexesByTable.size > 0 ||\n\t\tdiff.modifiedColumnsByTable.size > 0 ||\n\t\tdiff.modifiedIndexesByTable.size > 0;\n\n\treturn {\n\t\tdata: {\n\t\t\trequiresMigration,\n\t\t\tmissingColumns,\n\t\t},\n\t\terror: undefined,\n\t};\n};\n\nexport default getMigrationStatus;\n"],"mappings":"mRAoBA,MAAM,EAGF,MAAO,EAAS,IAAS,CAC5B,IAAM,EAAuB,IAAI,EAChC,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EAEM,EAAiB,EAAY,EAAK,WAAY,EAAQ,OAAO,EAAE,EACrE,GAAI,EAAe,MAAO,OAAO,EAEjC,IAAM,EACL,MAAM,EAAqB,4BAA4B,CACtD,cAAe,EAAK,WAAW,GAChC,CAAC,EACF,GAAI,EAAmB,MAAO,OAAO,EAErC,GAAI,CAAC,EAAmB,KACvB,MAAO,CACN,KAAM,CACL,kBAAmB,GACnB,eAAgB,CAAC,CAClB,EACA,MAAO,IAAA,EACR,EAGD,IAAM,EAAO,EACZ,EAAmB,KAAK,kBACxB,EAAe,IAChB,EAEM,EAA2C,CAAC,EAElD,IAAK,IAAM,KAAS,EAAe,KAAK,OAAQ,CAC/C,GACC,EAAM,OAAS,mBACf,EAAM,OAAS,SACf,CAAC,EAAgB,EAAM,IAAI,EAE3B,SAGD,IAAM,EAAe,EAAK,kBAAkB,IAAI,EAAM,IAAI,EACpD,EAAqB,EAAK,sBAAsB,IAAI,EAAM,IAAI,EAE9D,EAAsB,EAAM,QAChC,OAAQ,GAAW,EAAO,SAAW,OAAO,CAAC,CAC7C,OAAQ,GACR,EAAe,GAAO,GAAoB,IAAI,EAAO,IAAI,CAC1D,CAAC,CACA,IAAK,GAAW,EAAkB,EAAO,IAAI,CAAC,EAEhD,GAAI,EAAoB,SAAW,EAAG,SAEtC,IAAM,EACL,EAAM,OAAS,kBAAoB,kBAAoB,EAAM,IAAI,MAC7D,IAEA,EAAe,KACnB,EAAe,GAAY,CAAC,GAG7B,EAAe,EAAS,CAAC,KAAK,GAAG,CAAmB,EACrD,CASA,MAAO,CACN,KAAM,CACL,kBARD,EAAK,kBAAkB,KAAO,GAC9B,EAAK,sBAAsB,KAAO,GAClC,EAAK,sBAAsB,KAAO,GAClC,EAAK,uBAAuB,KAAO,GACnC,EAAK,uBAAuB,KAAO,EAKlC,gBACD,EACA,MAAO,IAAA,EACR,CACD"}