@payloadcms/db-mongodb 4.0.0-internal.183b315 → 4.0.0-internal.1ccb6d5
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/LICENSE.md +1 -1
- package/dist/connect.d.ts.map +1 -1
- package/dist/connect.js +9 -2
- package/dist/connect.js.map +1 -1
- package/dist/count.d.ts.map +1 -1
- package/dist/count.js +33 -4
- package/dist/count.js.map +1 -1
- package/dist/countGlobalVersions.d.ts.map +1 -1
- package/dist/countGlobalVersions.js +10 -2
- package/dist/countGlobalVersions.js.map +1 -1
- package/dist/countVersions.d.ts.map +1 -1
- package/dist/countVersions.js +36 -4
- package/dist/countVersions.js.map +1 -1
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +2 -1
- package/dist/create.js.map +1 -1
- package/dist/createGlobalVersion.d.ts +1 -1
- package/dist/createGlobalVersion.d.ts.map +1 -1
- package/dist/createGlobalVersion.js +25 -2
- package/dist/createGlobalVersion.js.map +1 -1
- package/dist/createMigration.d.ts.map +1 -1
- package/dist/createMigration.js +9 -2
- package/dist/createMigration.js.map +1 -1
- package/dist/createVersion.d.ts.map +1 -1
- package/dist/createVersion.js +17 -4
- package/dist/createVersion.js.map +1 -1
- package/dist/deleteBranchGlobal.d.ts +10 -0
- package/dist/deleteBranchGlobal.d.ts.map +1 -0
- package/dist/deleteBranchGlobal.js +26 -0
- package/dist/deleteBranchGlobal.js.map +1 -0
- package/dist/deleteMany.d.ts.map +1 -1
- package/dist/deleteMany.js +1 -0
- package/dist/deleteMany.js.map +1 -1
- package/dist/deleteOne.d.ts.map +1 -1
- package/dist/deleteOne.js +20 -1
- package/dist/deleteOne.js.map +1 -1
- package/dist/deleteVersions.d.ts.map +1 -1
- package/dist/deleteVersions.js +1 -0
- package/dist/deleteVersions.js.map +1 -1
- package/dist/exports/migration-utils.d.ts +3 -0
- package/dist/exports/migration-utils.d.ts.map +1 -1
- package/dist/exports/migration-utils.js +3 -0
- package/dist/exports/migration-utils.js.map +1 -1
- package/dist/find.d.ts.map +1 -1
- package/dist/find.js +44 -8
- package/dist/find.js.map +1 -1
- package/dist/findDistinct.d.ts.map +1 -1
- package/dist/findDistinct.js +115 -12
- package/dist/findDistinct.js.map +1 -1
- package/dist/findGlobal.d.ts.map +1 -1
- package/dist/findGlobal.js +48 -9
- package/dist/findGlobal.js.map +1 -1
- package/dist/findGlobalVersions.d.ts.map +1 -1
- package/dist/findGlobalVersions.js +10 -2
- package/dist/findGlobalVersions.js.map +1 -1
- package/dist/findOne.d.ts.map +1 -1
- package/dist/findOne.js +43 -5
- package/dist/findOne.js.map +1 -1
- package/dist/findVersions.d.ts.map +1 -1
- package/dist/findVersions.js +49 -5
- package/dist/findVersions.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +89 -67
- package/dist/init.js.map +1 -1
- package/dist/migrateFresh.d.ts +4 -2
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js +21 -6
- package/dist/migrateFresh.js.map +1 -1
- package/dist/models/buildCollectionSchema.d.ts +8 -2
- package/dist/models/buildCollectionSchema.d.ts.map +1 -1
- package/dist/models/buildCollectionSchema.js +4 -2
- package/dist/models/buildCollectionSchema.js.map +1 -1
- package/dist/models/buildGlobalModel.d.ts +5 -1
- package/dist/models/buildGlobalModel.d.ts.map +1 -1
- package/dist/models/buildGlobalModel.js +34 -3
- package/dist/models/buildGlobalModel.js.map +1 -1
- package/dist/models/buildSchema.d.ts +4 -0
- package/dist/models/buildSchema.d.ts.map +1 -1
- package/dist/models/buildSchema.js +115 -37
- package/dist/models/buildSchema.js.map +1 -1
- package/dist/models/schemaBuildContext.d.ts +21 -0
- package/dist/models/schemaBuildContext.d.ts.map +1 -0
- package/dist/models/schemaBuildContext.js +29 -0
- package/dist/models/schemaBuildContext.js.map +1 -0
- package/dist/predefinedMigrations/branching.d.ts +4 -0
- package/dist/predefinedMigrations/branching.d.ts.map +1 -0
- package/dist/predefinedMigrations/branching.js +9 -0
- package/dist/predefinedMigrations/branching.js.map +1 -0
- package/dist/predefinedMigrations/localize-status.d.ts +4 -0
- package/dist/predefinedMigrations/localize-status.d.ts.map +1 -0
- package/dist/predefinedMigrations/localize-status.js +9 -0
- package/dist/predefinedMigrations/localize-status.js.map +1 -0
- package/dist/predefinedMigrations/migrateBranching.d.ts +17 -0
- package/dist/predefinedMigrations/migrateBranching.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateBranching.js +90 -0
- package/dist/predefinedMigrations/migrateBranching.js.map +1 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.d.ts +27 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.js +324 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.js.map +1 -0
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +4 -4
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
- package/dist/predefinedMigrations/migrateSizesToVariants.d.ts +13 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.js +368 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.js.map +1 -0
- package/dist/predefinedMigrations/sizes-to-variants.d.ts +5 -0
- package/dist/predefinedMigrations/sizes-to-variants.d.ts.map +1 -0
- package/dist/predefinedMigrations/sizes-to-variants.js +8 -0
- package/dist/predefinedMigrations/sizes-to-variants.js.map +1 -0
- package/dist/queries/buildAndOrConditions.d.ts +4 -2
- package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
- package/dist/queries/buildAndOrConditions.js +3 -1
- package/dist/queries/buildAndOrConditions.js.map +1 -1
- package/dist/queries/buildBranchVisibility.d.ts +11 -0
- package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
- package/dist/queries/buildBranchVisibility.js +204 -0
- package/dist/queries/buildBranchVisibility.js.map +1 -0
- package/dist/queries/buildQuery.d.ts +4 -2
- package/dist/queries/buildQuery.d.ts.map +1 -1
- package/dist/queries/buildQuery.js +3 -1
- package/dist/queries/buildQuery.js.map +1 -1
- package/dist/queries/buildRelatedQueryPipeline.d.ts +7 -0
- package/dist/queries/buildRelatedQueryPipeline.d.ts.map +1 -0
- package/dist/queries/buildRelatedQueryPipeline.js +56 -0
- package/dist/queries/buildRelatedQueryPipeline.js.map +1 -0
- package/dist/queries/buildSearchParams.d.ts +4 -2
- package/dist/queries/buildSearchParams.d.ts.map +1 -1
- package/dist/queries/buildSearchParams.js +340 -25
- package/dist/queries/buildSearchParams.js.map +1 -1
- package/dist/queries/buildSortParam.d.ts.map +1 -1
- package/dist/queries/getBuildQueryPlugin.d.ts +3 -1
- package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
- package/dist/queries/getBuildQueryPlugin.js +3 -1
- package/dist/queries/getBuildQueryPlugin.js.map +1 -1
- package/dist/queries/getLocalizedSortProperty.d.ts.map +1 -1
- package/dist/queries/getLocalizedSortProperty.js +1 -1
- package/dist/queries/getLocalizedSortProperty.js.map +1 -1
- package/dist/queries/operatorMap.d.ts.map +1 -1
- package/dist/queries/parseParams.d.ts +4 -2
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +5 -1
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
- package/dist/queries/sanitizeQueryValue.js +2 -3
- package/dist/queries/sanitizeQueryValue.js.map +1 -1
- package/dist/queryDrafts.d.ts.map +1 -1
- package/dist/queryDrafts.js +39 -7
- package/dist/queryDrafts.js.map +1 -1
- package/dist/testCredentials.d.ts.map +1 -1
- package/dist/transactions/beginTransaction.d.ts.map +1 -1
- package/dist/transactions/beginTransaction.js +0 -1
- package/dist/transactions/beginTransaction.js.map +1 -1
- package/dist/transactions/commitTransaction.d.ts.map +1 -1
- package/dist/transactions/commitTransaction.js +68 -7
- package/dist/transactions/commitTransaction.js.map +1 -1
- package/dist/transactions/rollbackTransaction.d.ts.map +1 -1
- package/dist/transactions/rollbackTransaction.js +10 -9
- package/dist/transactions/rollbackTransaction.js.map +1 -1
- package/dist/updateGlobal.d.ts.map +1 -1
- package/dist/updateGlobal.js +91 -9
- package/dist/updateGlobal.js.map +1 -1
- package/dist/updateGlobalVersion.d.ts.map +1 -1
- package/dist/updateGlobalVersion.js +3 -2
- package/dist/updateGlobalVersion.js.map +1 -1
- package/dist/updateJobs.d.ts.map +1 -1
- package/dist/updateJobs.js +71 -14
- package/dist/updateJobs.js.map +1 -1
- package/dist/updateMany.d.ts.map +1 -1
- package/dist/updateMany.js +3 -2
- package/dist/updateMany.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +30 -4
- package/dist/updateOne.js.map +1 -1
- package/dist/updateVersion.d.ts.map +1 -1
- package/dist/updateVersion.js +3 -2
- package/dist/updateVersion.js.map +1 -1
- package/dist/upsertBranchGlobalChange.d.ts +3 -0
- package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
- package/dist/upsertBranchGlobalChange.js +28 -0
- package/dist/upsertBranchGlobalChange.js.map +1 -0
- package/dist/utilities/aggregatePaginate.d.ts +2 -1
- package/dist/utilities/aggregatePaginate.d.ts.map +1 -1
- package/dist/utilities/aggregatePaginate.js +21 -5
- package/dist/utilities/aggregatePaginate.js.map +1 -1
- package/dist/utilities/buildJoinAggregation.d.ts +4 -2
- package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
- package/dist/utilities/buildJoinAggregation.js +160 -26
- package/dist/utilities/buildJoinAggregation.js.map +1 -1
- package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
- package/dist/utilities/buildProjectionFromSelect.js +1 -1
- package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
- package/dist/utilities/getDBName.d.ts.map +1 -1
- package/dist/utilities/getEntity.d.ts +1 -1
- package/dist/utilities/getEntity.d.ts.map +1 -1
- package/dist/utilities/handleError.d.ts.map +1 -1
- package/dist/utilities/isObjectID.d.ts.map +1 -1
- package/dist/utilities/resolveJoins.d.ts +6 -2
- package/dist/utilities/resolveJoins.d.ts.map +1 -1
- package/dist/utilities/resolveJoins.js +115 -26
- package/dist/utilities/resolveJoins.js.map +1 -1
- package/dist/utilities/transform.d.ts.map +1 -1
- package/dist/utilities/transform.js +25 -34
- package/dist/utilities/transform.js.map +1 -1
- package/package.json +18 -21
- package/dist/queries/buildSortParam.spec.js +0 -123
- package/dist/queries/buildSortParam.spec.js.map +0 -1
- package/dist/queries/getLocalizedSortProperty.spec.js +0 -215
- package/dist/queries/getLocalizedSortProperty.spec.js.map +0 -1
- package/dist/utilities/transform.spec.js +0 -479
- package/dist/utilities/transform.spec.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Connection, Schema } from 'mongoose';
|
|
2
|
+
import type { SchemaBuildContext } from 'payload/internal';
|
|
3
|
+
import type { BuildSchemaOptions } from './buildSchema.js';
|
|
4
|
+
export type MongoSchemaBuildContext = SchemaBuildContext<Schema>;
|
|
5
|
+
/**
|
|
6
|
+
* Connection and global plugins can keep state on each nested schema. Mongoose does not clone
|
|
7
|
+
* those nested schemas when it attaches a discriminator, so cached templates would change plugin
|
|
8
|
+
* application.
|
|
9
|
+
*/
|
|
10
|
+
export declare const createMongoSchemaBuildContext: ({ connection, }: {
|
|
11
|
+
connection: Connection;
|
|
12
|
+
}) => MongoSchemaBuildContext;
|
|
13
|
+
export declare const getBlockSchemaCacheKey: ({ blockSlug, buildSchemaOptions, fieldPath, isLocalized, isReference, isVersion, }: {
|
|
14
|
+
blockSlug: string;
|
|
15
|
+
buildSchemaOptions: BuildSchemaOptions;
|
|
16
|
+
fieldPath: string;
|
|
17
|
+
isLocalized: boolean;
|
|
18
|
+
isReference: boolean;
|
|
19
|
+
isVersion: boolean;
|
|
20
|
+
}) => string;
|
|
21
|
+
//# sourceMappingURL=schemaBuildContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaBuildContext.d.ts","sourceRoot":"","sources":["../../src/models/schemaBuildContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAK1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;AAiBhE;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,oBAEvC;IACD,UAAU,EAAE,UAAU,CAAA;CACvB,KAAG,uBAQH,CAAA;AAED,eAAO,MAAM,sBAAsB,uFAOhC;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;CACnB,KAAG,MASU,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import { createSchemaBuildContext } from 'payload/internal';
|
|
3
|
+
const getMongoosePluginRegistry = ({ mongooseInstance })=>mongooseInstance.plugins;
|
|
4
|
+
const defaultMongoosePluginFunctions = new Set(getMongoosePluginRegistry({
|
|
5
|
+
mongooseInstance: new mongoose.Mongoose({
|
|
6
|
+
createInitialConnection: false
|
|
7
|
+
})
|
|
8
|
+
}).map(([plugin])=>plugin));
|
|
9
|
+
/**
|
|
10
|
+
* Connection and global plugins can keep state on each nested schema. Mongoose does not clone
|
|
11
|
+
* those nested schemas when it attaches a discriminator, so cached templates would change plugin
|
|
12
|
+
* application.
|
|
13
|
+
*/ export const createMongoSchemaBuildContext = ({ connection })=>{
|
|
14
|
+
const hasCustomGlobalPlugins = getMongoosePluginRegistry({
|
|
15
|
+
mongooseInstance: connection.base
|
|
16
|
+
}).some(([plugin])=>!defaultMongoosePluginFunctions.has(plugin));
|
|
17
|
+
return createSchemaBuildContext({
|
|
18
|
+
isCacheEnabled: connection.plugins.length === 0 && !hasCustomGlobalPlugins
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export const getBlockSchemaCacheKey = ({ blockSlug, buildSchemaOptions, fieldPath, isLocalized, isReference, isVersion })=>[
|
|
22
|
+
`${isReference ? `block:${blockSlug}` : `inline:${fieldPath}/block:${blockSlug}`}${isVersion ? '-version' : ''}`,
|
|
23
|
+
buildSchemaOptions.disableUnique && 'disableUnique:true',
|
|
24
|
+
buildSchemaOptions.draftsEnabled && 'draftsEnabled:true',
|
|
25
|
+
buildSchemaOptions.indexSortableFields && 'indexSortableFields:true',
|
|
26
|
+
isLocalized && 'isLocalized:true'
|
|
27
|
+
].filter(Boolean).join('|');
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=schemaBuildContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/models/schemaBuildContext.ts"],"sourcesContent":["import type { Connection, Schema } from 'mongoose'\nimport type { SchemaBuildContext } from 'payload/internal'\n\nimport mongoose from 'mongoose'\nimport { createSchemaBuildContext } from 'payload/internal'\n\nimport type { BuildSchemaOptions } from './buildSchema.js'\n\nexport type MongoSchemaBuildContext = SchemaBuildContext<Schema>\n\ntype MongoosePluginRegistry = Array<[Parameters<typeof mongoose.plugin>[0], unknown]>\n\nconst getMongoosePluginRegistry = ({\n mongooseInstance,\n}: {\n mongooseInstance: typeof mongoose\n}): MongoosePluginRegistry =>\n (mongooseInstance as { plugins: MongoosePluginRegistry } & typeof mongoose).plugins\n\nconst defaultMongoosePluginFunctions = new Set(\n getMongoosePluginRegistry({\n mongooseInstance: new mongoose.Mongoose({ createInitialConnection: false }),\n }).map(([plugin]) => plugin),\n)\n\n/**\n * Connection and global plugins can keep state on each nested schema. Mongoose does not clone\n * those nested schemas when it attaches a discriminator, so cached templates would change plugin\n * application.\n */\nexport const createMongoSchemaBuildContext = ({\n connection,\n}: {\n connection: Connection\n}): MongoSchemaBuildContext => {\n const hasCustomGlobalPlugins = getMongoosePluginRegistry({\n mongooseInstance: connection.base,\n }).some(([plugin]) => !defaultMongoosePluginFunctions.has(plugin))\n\n return createSchemaBuildContext<Schema>({\n isCacheEnabled: connection.plugins.length === 0 && !hasCustomGlobalPlugins,\n })\n}\n\nexport const getBlockSchemaCacheKey = ({\n blockSlug,\n buildSchemaOptions,\n fieldPath,\n isLocalized,\n isReference,\n isVersion,\n}: {\n blockSlug: string\n buildSchemaOptions: BuildSchemaOptions\n fieldPath: string\n isLocalized: boolean\n isReference: boolean\n isVersion: boolean\n}): string =>\n [\n `${isReference ? `block:${blockSlug}` : `inline:${fieldPath}/block:${blockSlug}`}${isVersion ? '-version' : ''}`,\n buildSchemaOptions.disableUnique && 'disableUnique:true',\n buildSchemaOptions.draftsEnabled && 'draftsEnabled:true',\n buildSchemaOptions.indexSortableFields && 'indexSortableFields:true',\n isLocalized && 'isLocalized:true',\n ]\n .filter(Boolean)\n .join('|')\n"],"names":["mongoose","createSchemaBuildContext","getMongoosePluginRegistry","mongooseInstance","plugins","defaultMongoosePluginFunctions","Set","Mongoose","createInitialConnection","map","plugin","createMongoSchemaBuildContext","connection","hasCustomGlobalPlugins","base","some","has","isCacheEnabled","length","getBlockSchemaCacheKey","blockSlug","buildSchemaOptions","fieldPath","isLocalized","isReference","isVersion","disableUnique","draftsEnabled","indexSortableFields","filter","Boolean","join"],"mappings":"AAGA,OAAOA,cAAc,WAAU;AAC/B,SAASC,wBAAwB,QAAQ,mBAAkB;AAQ3D,MAAMC,4BAA4B,CAAC,EACjCC,gBAAgB,EAGjB,GACC,AAACA,iBAA2EC,OAAO;AAErF,MAAMC,iCAAiC,IAAIC,IACzCJ,0BAA0B;IACxBC,kBAAkB,IAAIH,SAASO,QAAQ,CAAC;QAAEC,yBAAyB;IAAM;AAC3E,GAAGC,GAAG,CAAC,CAAC,CAACC,OAAO,GAAKA;AAGvB;;;;CAIC,GACD,OAAO,MAAMC,gCAAgC,CAAC,EAC5CC,UAAU,EAGX;IACC,MAAMC,yBAAyBX,0BAA0B;QACvDC,kBAAkBS,WAAWE,IAAI;IACnC,GAAGC,IAAI,CAAC,CAAC,CAACL,OAAO,GAAK,CAACL,+BAA+BW,GAAG,CAACN;IAE1D,OAAOT,yBAAiC;QACtCgB,gBAAgBL,WAAWR,OAAO,CAACc,MAAM,KAAK,KAAK,CAACL;IACtD;AACF,EAAC;AAED,OAAO,MAAMM,yBAAyB,CAAC,EACrCC,SAAS,EACTC,kBAAkB,EAClBC,SAAS,EACTC,WAAW,EACXC,WAAW,EACXC,SAAS,EAQV,GACC;QACE,GAAGD,cAAc,CAAC,MAAM,EAAEJ,WAAW,GAAG,CAAC,OAAO,EAAEE,UAAU,OAAO,EAAEF,WAAW,GAAGK,YAAY,aAAa,IAAI;QAChHJ,mBAAmBK,aAAa,IAAI;QACpCL,mBAAmBM,aAAa,IAAI;QACpCN,mBAAmBO,mBAAmB,IAAI;QAC1CL,eAAe;KAChB,CACEM,MAAM,CAACC,SACPC,IAAI,CAAC,KAAI"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
declare const imports = "import { migrateBranching } from '@payloadcms/db-mongodb/migration-utils'";
|
|
2
|
+
declare const upSQL = " // Index synchronization must run outside the migration transaction.\n await migrateBranching({\n payload,\n })\n";
|
|
3
|
+
export { imports, upSQL };
|
|
4
|
+
//# sourceMappingURL=branching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branching.d.ts","sourceRoot":"","sources":["../../src/predefinedMigrations/branching.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,OAAO,8EAA8E,CAAA;AAC3F,QAAA,MAAM,KAAK,6HAIV,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const imports = `import { migrateBranching } from '@payloadcms/db-mongodb/migration-utils'`;
|
|
2
|
+
const upSQL = ` // Index synchronization must run outside the migration transaction.
|
|
3
|
+
await migrateBranching({
|
|
4
|
+
payload,
|
|
5
|
+
})
|
|
6
|
+
`;
|
|
7
|
+
export { imports, upSQL };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=branching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/predefinedMigrations/branching.ts"],"sourcesContent":["const imports = `import { migrateBranching } from '@payloadcms/db-mongodb/migration-utils'`\nconst upSQL = ` // Index synchronization must run outside the migration transaction.\n await migrateBranching({\n payload,\n })\n`\n\nexport { imports, upSQL }\n"],"names":["imports","upSQL"],"mappings":"AAAA,MAAMA,UAAU,CAAC,yEAAyE,CAAC;AAC3F,MAAMC,QAAQ,CAAC;;;;AAIf,CAAC;AAED,SAASD,OAAO,EAAEC,KAAK,GAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localize-status.d.ts","sourceRoot":"","sources":["../../src/predefinedMigrations/localize-status.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,OAAO,mFAAmF,CAAA;AAChG,QAAA,MAAM,KAAK,mFAIV,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/predefinedMigrations/localize-status.ts"],"sourcesContent":["const imports = `import { migrateLocalizeStatus } from '@payloadcms/db-mongodb/migration-utils'`\nconst upSQL = ` await migrateLocalizeStatus({\n payload,\n req,\n })\n`\n\nexport { imports, upSQL }\n"],"names":["imports","upSQL"],"mappings":"AAAA,MAAMA,UAAU,CAAC,8EAA8E,CAAC;AAChG,MAAMC,QAAQ,CAAC;;;;AAIf,CAAC;AAED,SAASD,OAAO,EAAEC,KAAK,GAAE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ClientSession } from 'mongoose';
|
|
2
|
+
import type { Payload } from 'payload';
|
|
3
|
+
type BranchingMigrationArgs = {
|
|
4
|
+
payload: Payload;
|
|
5
|
+
session?: ClientSession;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Backfills branch identity before replacing legacy indexes with the current schema indexes.
|
|
9
|
+
*
|
|
10
|
+
* Run this generated migration after enabling branching. Backfill errors stop the migration
|
|
11
|
+
* before any indexes are removed, so uniqueness conflicts remain visible and recoverable.
|
|
12
|
+
* Index synchronization removes indexes not declared in the configured Mongoose schema;
|
|
13
|
+
* declare user-managed indexes in that schema before running this migration.
|
|
14
|
+
*/
|
|
15
|
+
export declare const migrateBranching: ({ payload, session, }: BranchingMigrationArgs) => Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=migrateBranching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateBranching.d.ts","sourceRoot":"","sources":["../../src/predefinedMigrations/migrateBranching.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAOtC,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAQD;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,0BAG1B,sBAAsB,KAAG,OAAO,CAAC,IAAI,CAqEvC,CAAA"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { branchField, MAIN_BRANCH } from 'payload';
|
|
2
|
+
const legacyMainFilter = {
|
|
3
|
+
$or: [
|
|
4
|
+
{
|
|
5
|
+
[branchField]: {
|
|
6
|
+
$exists: false
|
|
7
|
+
}
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
[branchField]: null
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Backfills branch identity before replacing legacy indexes with the current schema indexes.
|
|
16
|
+
*
|
|
17
|
+
* Run this generated migration after enabling branching. Backfill errors stop the migration
|
|
18
|
+
* before any indexes are removed, so uniqueness conflicts remain visible and recoverable.
|
|
19
|
+
* Index synchronization removes indexes not declared in the configured Mongoose schema;
|
|
20
|
+
* declare user-managed indexes in that schema before running this migration.
|
|
21
|
+
*/ export const migrateBranching = async ({ payload, session })=>{
|
|
22
|
+
const branching = payload.config.branching;
|
|
23
|
+
if (!branching?.enabled) {
|
|
24
|
+
payload.logger.info({
|
|
25
|
+
msg: 'Branching is not enabled, skipping branching migration'
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const adapter = payload.db;
|
|
30
|
+
const modelsToSync = new Set();
|
|
31
|
+
const updateOptions = session ? {
|
|
32
|
+
session
|
|
33
|
+
} : {};
|
|
34
|
+
payload.logger.info({
|
|
35
|
+
msg: 'Starting branching data and index migration'
|
|
36
|
+
});
|
|
37
|
+
for (const collectionSlug of branching.branchableCollections){
|
|
38
|
+
const collectionModel = adapter.collections[collectionSlug];
|
|
39
|
+
const versionModel = adapter.versions[collectionSlug];
|
|
40
|
+
if (!collectionModel) {
|
|
41
|
+
throw new Error(`Could not find MongoDB model for branchable collection "${collectionSlug}".`);
|
|
42
|
+
}
|
|
43
|
+
await collectionModel.collection.updateMany(legacyMainFilter, {
|
|
44
|
+
$set: {
|
|
45
|
+
[branchField]: MAIN_BRANCH
|
|
46
|
+
}
|
|
47
|
+
}, updateOptions);
|
|
48
|
+
modelsToSync.add(collectionModel);
|
|
49
|
+
if (versionModel) {
|
|
50
|
+
await versionModel.collection.updateMany(legacyMainFilter, {
|
|
51
|
+
$set: {
|
|
52
|
+
[branchField]: MAIN_BRANCH
|
|
53
|
+
}
|
|
54
|
+
}, updateOptions);
|
|
55
|
+
modelsToSync.add(versionModel);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (branching.branchableGlobals.size) {
|
|
59
|
+
await adapter.globals.collection.updateMany({
|
|
60
|
+
...legacyMainFilter,
|
|
61
|
+
globalType: {
|
|
62
|
+
$in: Array.from(branching.branchableGlobals)
|
|
63
|
+
}
|
|
64
|
+
}, {
|
|
65
|
+
$set: {
|
|
66
|
+
[branchField]: MAIN_BRANCH
|
|
67
|
+
}
|
|
68
|
+
}, updateOptions);
|
|
69
|
+
modelsToSync.add(adapter.globals);
|
|
70
|
+
for (const globalSlug of branching.branchableGlobals){
|
|
71
|
+
const versionModel = adapter.versions[globalSlug];
|
|
72
|
+
if (versionModel) {
|
|
73
|
+
await versionModel.collection.updateMany(legacyMainFilter, {
|
|
74
|
+
$set: {
|
|
75
|
+
[branchField]: MAIN_BRANCH
|
|
76
|
+
}
|
|
77
|
+
}, updateOptions);
|
|
78
|
+
modelsToSync.add(versionModel);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const model of modelsToSync){
|
|
83
|
+
await model.syncIndexes();
|
|
84
|
+
}
|
|
85
|
+
payload.logger.info({
|
|
86
|
+
msg: 'Branching data and index migration completed successfully'
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=migrateBranching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/predefinedMigrations/migrateBranching.ts"],"sourcesContent":["import type { ClientSession } from 'mongoose'\nimport type { Payload } from 'payload'\n\nimport { branchField, MAIN_BRANCH } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel, GlobalModel } from '../types.js'\n\ntype BranchingMigrationArgs = {\n payload: Payload\n session?: ClientSession\n}\n\ntype SyncableModel = CollectionModel | GlobalModel\n\nconst legacyMainFilter = {\n $or: [{ [branchField]: { $exists: false } }, { [branchField]: null }],\n}\n\n/**\n * Backfills branch identity before replacing legacy indexes with the current schema indexes.\n *\n * Run this generated migration after enabling branching. Backfill errors stop the migration\n * before any indexes are removed, so uniqueness conflicts remain visible and recoverable.\n * Index synchronization removes indexes not declared in the configured Mongoose schema;\n * declare user-managed indexes in that schema before running this migration.\n */\nexport const migrateBranching = async ({\n payload,\n session,\n}: BranchingMigrationArgs): Promise<void> => {\n const branching = payload.config.branching\n\n if (!branching?.enabled) {\n payload.logger.info({ msg: 'Branching is not enabled, skipping branching migration' })\n return\n }\n\n const adapter = payload.db as MongooseAdapter\n const modelsToSync = new Set<SyncableModel>()\n const updateOptions = session ? { session } : {}\n\n payload.logger.info({ msg: 'Starting branching data and index migration' })\n\n for (const collectionSlug of branching.branchableCollections) {\n const collectionModel = adapter.collections[collectionSlug]\n const versionModel = adapter.versions[collectionSlug]\n\n if (!collectionModel) {\n throw new Error(`Could not find MongoDB model for branchable collection \"${collectionSlug}\".`)\n }\n\n await collectionModel.collection.updateMany(\n legacyMainFilter,\n { $set: { [branchField]: MAIN_BRANCH } },\n updateOptions,\n )\n modelsToSync.add(collectionModel)\n\n if (versionModel) {\n await versionModel.collection.updateMany(\n legacyMainFilter,\n { $set: { [branchField]: MAIN_BRANCH } },\n updateOptions,\n )\n modelsToSync.add(versionModel)\n }\n }\n\n if (branching.branchableGlobals.size) {\n await adapter.globals.collection.updateMany(\n {\n ...legacyMainFilter,\n globalType: { $in: Array.from(branching.branchableGlobals) },\n },\n { $set: { [branchField]: MAIN_BRANCH } },\n updateOptions,\n )\n modelsToSync.add(adapter.globals)\n\n for (const globalSlug of branching.branchableGlobals) {\n const versionModel = adapter.versions[globalSlug]\n\n if (versionModel) {\n await versionModel.collection.updateMany(\n legacyMainFilter,\n { $set: { [branchField]: MAIN_BRANCH } },\n updateOptions,\n )\n modelsToSync.add(versionModel)\n }\n }\n }\n\n for (const model of modelsToSync) {\n await model.syncIndexes()\n }\n\n payload.logger.info({ msg: 'Branching data and index migration completed successfully' })\n}\n"],"names":["branchField","MAIN_BRANCH","legacyMainFilter","$or","$exists","migrateBranching","payload","session","branching","config","enabled","logger","info","msg","adapter","db","modelsToSync","Set","updateOptions","collectionSlug","branchableCollections","collectionModel","collections","versionModel","versions","Error","collection","updateMany","$set","add","branchableGlobals","size","globals","globalType","$in","Array","from","globalSlug","model","syncIndexes"],"mappings":"AAGA,SAASA,WAAW,EAAEC,WAAW,QAAQ,UAAS;AAYlD,MAAMC,mBAAmB;IACvBC,KAAK;QAAC;YAAE,CAACH,YAAY,EAAE;gBAAEI,SAAS;YAAM;QAAE;QAAG;YAAE,CAACJ,YAAY,EAAE;QAAK;KAAE;AACvE;AAEA;;;;;;;CAOC,GACD,OAAO,MAAMK,mBAAmB,OAAO,EACrCC,OAAO,EACPC,OAAO,EACgB;IACvB,MAAMC,YAAYF,QAAQG,MAAM,CAACD,SAAS;IAE1C,IAAI,CAACA,WAAWE,SAAS;QACvBJ,QAAQK,MAAM,CAACC,IAAI,CAAC;YAAEC,KAAK;QAAyD;QACpF;IACF;IAEA,MAAMC,UAAUR,QAAQS,EAAE;IAC1B,MAAMC,eAAe,IAAIC;IACzB,MAAMC,gBAAgBX,UAAU;QAAEA;IAAQ,IAAI,CAAC;IAE/CD,QAAQK,MAAM,CAACC,IAAI,CAAC;QAAEC,KAAK;IAA8C;IAEzE,KAAK,MAAMM,kBAAkBX,UAAUY,qBAAqB,CAAE;QAC5D,MAAMC,kBAAkBP,QAAQQ,WAAW,CAACH,eAAe;QAC3D,MAAMI,eAAeT,QAAQU,QAAQ,CAACL,eAAe;QAErD,IAAI,CAACE,iBAAiB;YACpB,MAAM,IAAII,MAAM,CAAC,wDAAwD,EAAEN,eAAe,EAAE,CAAC;QAC/F;QAEA,MAAME,gBAAgBK,UAAU,CAACC,UAAU,CACzCzB,kBACA;YAAE0B,MAAM;gBAAE,CAAC5B,YAAY,EAAEC;YAAY;QAAE,GACvCiB;QAEFF,aAAaa,GAAG,CAACR;QAEjB,IAAIE,cAAc;YAChB,MAAMA,aAAaG,UAAU,CAACC,UAAU,CACtCzB,kBACA;gBAAE0B,MAAM;oBAAE,CAAC5B,YAAY,EAAEC;gBAAY;YAAE,GACvCiB;YAEFF,aAAaa,GAAG,CAACN;QACnB;IACF;IAEA,IAAIf,UAAUsB,iBAAiB,CAACC,IAAI,EAAE;QACpC,MAAMjB,QAAQkB,OAAO,CAACN,UAAU,CAACC,UAAU,CACzC;YACE,GAAGzB,gBAAgB;YACnB+B,YAAY;gBAAEC,KAAKC,MAAMC,IAAI,CAAC5B,UAAUsB,iBAAiB;YAAE;QAC7D,GACA;YAAEF,MAAM;gBAAE,CAAC5B,YAAY,EAAEC;YAAY;QAAE,GACvCiB;QAEFF,aAAaa,GAAG,CAACf,QAAQkB,OAAO;QAEhC,KAAK,MAAMK,cAAc7B,UAAUsB,iBAAiB,CAAE;YACpD,MAAMP,eAAeT,QAAQU,QAAQ,CAACa,WAAW;YAEjD,IAAId,cAAc;gBAChB,MAAMA,aAAaG,UAAU,CAACC,UAAU,CACtCzB,kBACA;oBAAE0B,MAAM;wBAAE,CAAC5B,YAAY,EAAEC;oBAAY;gBAAE,GACvCiB;gBAEFF,aAAaa,GAAG,CAACN;YACnB;QACF;IACF;IAEA,KAAK,MAAMe,SAAStB,aAAc;QAChC,MAAMsB,MAAMC,WAAW;IACzB;IAEAjC,QAAQK,MAAM,CAACC,IAAI,CAAC;QAAEC,KAAK;IAA4D;AACzF,EAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ClientSession } from 'mongoose';
|
|
2
|
+
import type { Payload, PayloadRequest } from 'payload';
|
|
3
|
+
export type LocalizeStatusArgs = {
|
|
4
|
+
collectionSlug?: string;
|
|
5
|
+
globalSlug?: string;
|
|
6
|
+
payload: Payload;
|
|
7
|
+
req?: any;
|
|
8
|
+
session?: ClientSession;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Migrate all collections and globals with versions.drafts enabled to use per-locale _status.
|
|
12
|
+
*
|
|
13
|
+
* This migration:
|
|
14
|
+
* 1. Converts version._status from a scalar string to a locale-keyed object for each entity
|
|
15
|
+
* 2. Deletes all snapshot:true version documents from each versions collection
|
|
16
|
+
* 3. Unsets the `snapshot` field from remaining version documents
|
|
17
|
+
*/
|
|
18
|
+
export declare function migrateLocalizeStatus({ payload, req, }: {
|
|
19
|
+
payload: Payload;
|
|
20
|
+
req: PayloadRequest;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Converts version._status (and the main document _status) from a scalar string to a
|
|
24
|
+
* per-locale object for a single collection or global.
|
|
25
|
+
*/
|
|
26
|
+
export declare function localizeStatus(args: LocalizeStatusArgs): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=migrateLocalizeStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateLocalizeStatus.d.ts","sourceRoot":"","sources":["../../src/predefinedMigrations/migrateLocalizeStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAQtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,EAC1C,OAAO,EACP,GAAG,GACJ,EAAE;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgQ5E"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { calculateVersionLocaleStatuses } from 'payload/migrations';
|
|
2
|
+
import { getSession } from '../utilities/getSession.js';
|
|
3
|
+
/**
|
|
4
|
+
* Migrate all collections and globals with versions.drafts enabled to use per-locale _status.
|
|
5
|
+
*
|
|
6
|
+
* This migration:
|
|
7
|
+
* 1. Converts version._status from a scalar string to a locale-keyed object for each entity
|
|
8
|
+
* 2. Deletes all snapshot:true version documents from each versions collection
|
|
9
|
+
* 3. Unsets the `snapshot` field from remaining version documents
|
|
10
|
+
*/ export async function migrateLocalizeStatus({ payload, req }) {
|
|
11
|
+
if (!payload.config.localization) {
|
|
12
|
+
payload.logger.info({
|
|
13
|
+
msg: 'Localization not enabled, skipping localize-status migration'
|
|
14
|
+
});
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const collections = payload.config.collections.filter((c)=>c.versions?.drafts && typeof c.versions.drafts === 'object' && c.versions.drafts.localizeStatus);
|
|
18
|
+
const globals = payload.config.globals.filter((g)=>g.versions?.drafts && typeof g.versions.drafts === 'object' && g.versions.drafts.localizeStatus);
|
|
19
|
+
payload.logger.info({
|
|
20
|
+
msg: `Starting localize-status migration for ${collections.length} collection(s) and ${globals.length} global(s)`
|
|
21
|
+
});
|
|
22
|
+
const connection = payload.db.connection;
|
|
23
|
+
const session = await getSession(payload.db, req);
|
|
24
|
+
for (const collection of collections){
|
|
25
|
+
await localizeStatus({
|
|
26
|
+
collectionSlug: collection.slug,
|
|
27
|
+
payload,
|
|
28
|
+
req,
|
|
29
|
+
session
|
|
30
|
+
});
|
|
31
|
+
await cleanupSnapshotDocuments({
|
|
32
|
+
connection,
|
|
33
|
+
entitySlug: collection.slug,
|
|
34
|
+
payload,
|
|
35
|
+
session
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
for (const global of globals){
|
|
39
|
+
await localizeStatus({
|
|
40
|
+
globalSlug: global.slug,
|
|
41
|
+
payload,
|
|
42
|
+
req,
|
|
43
|
+
session
|
|
44
|
+
});
|
|
45
|
+
await cleanupSnapshotDocuments({
|
|
46
|
+
connection,
|
|
47
|
+
entitySlug: global.slug,
|
|
48
|
+
payload,
|
|
49
|
+
session
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
payload.logger.info({
|
|
53
|
+
msg: 'localize-status migration completed successfully'
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Converts version._status (and the main document _status) from a scalar string to a
|
|
58
|
+
* per-locale object for a single collection or global.
|
|
59
|
+
*/ export async function localizeStatus(args) {
|
|
60
|
+
const { collectionSlug, globalSlug, payload, req, session } = args;
|
|
61
|
+
if (!collectionSlug && !globalSlug) {
|
|
62
|
+
throw new Error('Either collectionSlug or globalSlug must be provided');
|
|
63
|
+
}
|
|
64
|
+
if (collectionSlug && globalSlug) {
|
|
65
|
+
throw new Error('Cannot provide both collectionSlug and globalSlug');
|
|
66
|
+
}
|
|
67
|
+
const entitySlug = collectionSlug || globalSlug;
|
|
68
|
+
// MongoDB collection names are case-insensitive and stored as lowercase
|
|
69
|
+
const versionsCollection = `_${entitySlug}_versions`.toLowerCase();
|
|
70
|
+
if (!payload.config.localization) {
|
|
71
|
+
throw new Error('Localization is not enabled in payload config');
|
|
72
|
+
}
|
|
73
|
+
// Check if versions are enabled on this collection/global
|
|
74
|
+
let entityConfig;
|
|
75
|
+
if (collectionSlug) {
|
|
76
|
+
const collection = payload.config.collections.find((c)=>c.slug === collectionSlug);
|
|
77
|
+
if (collection) {
|
|
78
|
+
entityConfig = collection;
|
|
79
|
+
}
|
|
80
|
+
} else if (globalSlug) {
|
|
81
|
+
const global = payload.config.globals.find((g)=>g.slug === globalSlug);
|
|
82
|
+
if (global) {
|
|
83
|
+
entityConfig = global;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!entityConfig) {
|
|
87
|
+
throw new Error(`${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`);
|
|
88
|
+
}
|
|
89
|
+
payload.logger.info({
|
|
90
|
+
msg: `Starting _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`
|
|
91
|
+
});
|
|
92
|
+
// Check if versions are enabled in config (skip if not)
|
|
93
|
+
if (!entityConfig.versions) {
|
|
94
|
+
payload.logger.info({
|
|
95
|
+
msg: `Skipping migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug} - versions not enabled`
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Get MongoDB connection
|
|
100
|
+
const connection = payload.db.connection;
|
|
101
|
+
// Get filtered locales if filterAvailableLocales is defined
|
|
102
|
+
let locales = payload.config.localization.localeCodes;
|
|
103
|
+
if (typeof payload.config.localization.filterAvailableLocales === 'function') {
|
|
104
|
+
const filteredLocaleObjects = await payload.config.localization.filterAvailableLocales({
|
|
105
|
+
locales: payload.config.localization.locales,
|
|
106
|
+
req
|
|
107
|
+
});
|
|
108
|
+
locales = filteredLocaleObjects.map((locale)=>locale.code);
|
|
109
|
+
}
|
|
110
|
+
payload.logger.info({
|
|
111
|
+
msg: `Locales: ${locales.join(', ')}`
|
|
112
|
+
});
|
|
113
|
+
// Check if version._status exists and is NOT already localized
|
|
114
|
+
const sampleDoc = await connection.collection(versionsCollection).findOne({}, {
|
|
115
|
+
session
|
|
116
|
+
});
|
|
117
|
+
if (!sampleDoc) {
|
|
118
|
+
payload.logger.info({
|
|
119
|
+
msg: 'No version documents found, nothing to migrate'
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Check if _status is already localized
|
|
124
|
+
if (sampleDoc.version?._status && typeof sampleDoc.version._status === 'object' && !Array.isArray(sampleDoc.version._status)) {
|
|
125
|
+
payload.logger.info({
|
|
126
|
+
msg: 'version._status is already localized, migration already completed'
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Validate that version._status exists and is a string
|
|
131
|
+
if (!sampleDoc.version || typeof sampleDoc.version._status !== 'string' || Array.isArray(sampleDoc.version._status)) {
|
|
132
|
+
throw new Error(`Migration aborted: version._status field not found or has unexpected format in ${versionsCollection}. ` + `This migration should only run on schemas that have NOT yet been migrated to per-locale status.`);
|
|
133
|
+
}
|
|
134
|
+
payload.logger.info({
|
|
135
|
+
msg: 'Fetching all version documents...'
|
|
136
|
+
});
|
|
137
|
+
// Get all versions, sorted chronologically
|
|
138
|
+
const allVersions = await connection.collection(versionsCollection).find({}, {
|
|
139
|
+
session
|
|
140
|
+
}).sort({
|
|
141
|
+
createdAt: 1,
|
|
142
|
+
parent: 1
|
|
143
|
+
}).toArray();
|
|
144
|
+
payload.logger.info({
|
|
145
|
+
msg: `Found ${allVersions.length} version documents`
|
|
146
|
+
});
|
|
147
|
+
// Transform MongoDB documents to VersionRecord format
|
|
148
|
+
const versionRecords = allVersions.map((doc)=>({
|
|
149
|
+
id: doc._id.toString(),
|
|
150
|
+
_status: doc.version._status,
|
|
151
|
+
createdAt: doc.createdAt,
|
|
152
|
+
parent: doc.parent?.toString(),
|
|
153
|
+
publishedLocale: doc.publishedLocale,
|
|
154
|
+
snapshot: doc.snapshot || false
|
|
155
|
+
}));
|
|
156
|
+
// Calculate status per locale using shared logic
|
|
157
|
+
const versionLocaleStatus = calculateVersionLocaleStatuses(versionRecords, locales, payload);
|
|
158
|
+
payload.logger.info({
|
|
159
|
+
msg: 'Updating version documents with per-locale status...'
|
|
160
|
+
});
|
|
161
|
+
// Update each version document
|
|
162
|
+
let updateCount = 0;
|
|
163
|
+
for (const doc of allVersions){
|
|
164
|
+
const versionId = doc._id.toString();
|
|
165
|
+
const localeStatusMap = versionLocaleStatus.get(versionId);
|
|
166
|
+
if (!localeStatusMap) {
|
|
167
|
+
payload.logger.warn({
|
|
168
|
+
msg: `No status map found for version ${versionId}, skipping`
|
|
169
|
+
});
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// Build the new _status object: { en: 'published', es: 'draft', ... }
|
|
173
|
+
const newStatus = {};
|
|
174
|
+
for (const [locale, status] of localeStatusMap.entries()){
|
|
175
|
+
newStatus[locale] = status;
|
|
176
|
+
}
|
|
177
|
+
// Update the document: change version._status from string to object
|
|
178
|
+
await connection.collection(versionsCollection).updateOne({
|
|
179
|
+
_id: doc._id
|
|
180
|
+
}, {
|
|
181
|
+
$set: {
|
|
182
|
+
'version._status': newStatus
|
|
183
|
+
}
|
|
184
|
+
}, {
|
|
185
|
+
session
|
|
186
|
+
});
|
|
187
|
+
updateCount++;
|
|
188
|
+
}
|
|
189
|
+
payload.logger.info({
|
|
190
|
+
msg: `Updated ${updateCount} version documents`
|
|
191
|
+
});
|
|
192
|
+
// Migrate main collection/global document _status to per-locale status object
|
|
193
|
+
// Only if it has a status field
|
|
194
|
+
if (collectionSlug) {
|
|
195
|
+
const mainCollection = collectionSlug;
|
|
196
|
+
const mainDoc = await connection.collection(mainCollection).findOne({}, {
|
|
197
|
+
session
|
|
198
|
+
});
|
|
199
|
+
if (mainDoc && '_status' in mainDoc) {
|
|
200
|
+
payload.logger.info({
|
|
201
|
+
msg: `Migrating main collection documents for: ${mainCollection}`
|
|
202
|
+
});
|
|
203
|
+
const allDocs = await connection.collection(mainCollection).find({}, {
|
|
204
|
+
session
|
|
205
|
+
}).toArray();
|
|
206
|
+
for (const doc of allDocs){
|
|
207
|
+
if (!doc._id) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
// Get the latest version for this document to determine status per locale
|
|
211
|
+
const latestVersions = await connection.collection(versionsCollection).find({
|
|
212
|
+
parent: doc._id
|
|
213
|
+
}, {
|
|
214
|
+
session
|
|
215
|
+
}).sort({
|
|
216
|
+
createdAt: -1
|
|
217
|
+
}).limit(1).toArray();
|
|
218
|
+
let statusObj = {};
|
|
219
|
+
if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {
|
|
220
|
+
// Use the status from the latest version
|
|
221
|
+
statusObj = latestVersions[0].version._status;
|
|
222
|
+
} else {
|
|
223
|
+
// Fallback: set all locales to draft
|
|
224
|
+
for (const locale of locales){
|
|
225
|
+
statusObj[locale] = 'draft';
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Update main document
|
|
229
|
+
await connection.collection(mainCollection).updateOne({
|
|
230
|
+
_id: doc._id
|
|
231
|
+
}, {
|
|
232
|
+
$set: {
|
|
233
|
+
_status: statusObj
|
|
234
|
+
}
|
|
235
|
+
}, {
|
|
236
|
+
session
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
payload.logger.info({
|
|
240
|
+
msg: `Migrated ${allDocs.length} collection documents`
|
|
241
|
+
});
|
|
242
|
+
} else {
|
|
243
|
+
payload.logger.info({
|
|
244
|
+
msg: 'Skipping main document status migration (no status field found)'
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
} else if (globalSlug) {
|
|
248
|
+
// Globals are stored in a single 'globals' collection with globalType discriminator
|
|
249
|
+
const globalDoc = await connection.collection('globals').findOne({
|
|
250
|
+
globalType: globalSlug
|
|
251
|
+
}, {
|
|
252
|
+
session
|
|
253
|
+
});
|
|
254
|
+
if (globalDoc && '_status' in globalDoc && globalDoc._id) {
|
|
255
|
+
payload.logger.info({
|
|
256
|
+
msg: `Migrating main global document for: ${globalSlug}`
|
|
257
|
+
});
|
|
258
|
+
// Get the latest version for the global
|
|
259
|
+
const latestVersions = await connection.collection(versionsCollection).find({}, {
|
|
260
|
+
session
|
|
261
|
+
}).sort({
|
|
262
|
+
createdAt: -1
|
|
263
|
+
}).limit(1).toArray();
|
|
264
|
+
let statusObj = {};
|
|
265
|
+
if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {
|
|
266
|
+
statusObj = latestVersions[0].version._status;
|
|
267
|
+
} else {
|
|
268
|
+
for (const locale of locales){
|
|
269
|
+
statusObj[locale] = 'draft';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Update global document
|
|
273
|
+
await connection.collection('globals').updateOne({
|
|
274
|
+
_id: globalDoc._id,
|
|
275
|
+
globalType: globalSlug
|
|
276
|
+
}, {
|
|
277
|
+
$set: {
|
|
278
|
+
_status: statusObj
|
|
279
|
+
}
|
|
280
|
+
}, {
|
|
281
|
+
session
|
|
282
|
+
});
|
|
283
|
+
payload.logger.info({
|
|
284
|
+
msg: 'Migrated global document'
|
|
285
|
+
});
|
|
286
|
+
} else {
|
|
287
|
+
payload.logger.info({
|
|
288
|
+
msg: 'Skipping main document status migration (no status field found)'
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
payload.logger.info({
|
|
293
|
+
msg: 'Migration completed successfully'
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
async function cleanupSnapshotDocuments({ connection, entitySlug, payload, session }) {
|
|
297
|
+
const versionsCollection = `_${entitySlug}_versions`.toLowerCase();
|
|
298
|
+
const col = connection.collection(versionsCollection);
|
|
299
|
+
// Delete all snapshot=true documents
|
|
300
|
+
const deleteResult = await col.deleteMany({
|
|
301
|
+
snapshot: true
|
|
302
|
+
}, {
|
|
303
|
+
session
|
|
304
|
+
});
|
|
305
|
+
if (deleteResult.deletedCount > 0) {
|
|
306
|
+
payload.logger.info({
|
|
307
|
+
msg: `Deleted ${deleteResult.deletedCount} snapshot documents from ${versionsCollection}`
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
// Unset the snapshot field from remaining documents
|
|
311
|
+
await col.updateMany({
|
|
312
|
+
snapshot: {
|
|
313
|
+
$exists: true
|
|
314
|
+
}
|
|
315
|
+
}, {
|
|
316
|
+
$unset: {
|
|
317
|
+
snapshot: ''
|
|
318
|
+
}
|
|
319
|
+
}, {
|
|
320
|
+
session
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
//# sourceMappingURL=migrateLocalizeStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/predefinedMigrations/migrateLocalizeStatus.ts"],"sourcesContent":["import type { ClientSession } from 'mongoose'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { calculateVersionLocaleStatuses, type VersionRecord } from 'payload/migrations'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { getSession } from '../utilities/getSession.js'\n\nexport type LocalizeStatusArgs = {\n collectionSlug?: string\n globalSlug?: string\n payload: Payload\n req?: any\n session?: ClientSession\n}\n\n/**\n * Migrate all collections and globals with versions.drafts enabled to use per-locale _status.\n *\n * This migration:\n * 1. Converts version._status from a scalar string to a locale-keyed object for each entity\n * 2. Deletes all snapshot:true version documents from each versions collection\n * 3. Unsets the `snapshot` field from remaining version documents\n */\nexport async function migrateLocalizeStatus({\n payload,\n req,\n}: {\n payload: Payload\n req: PayloadRequest\n}): Promise<void> {\n if (!payload.config.localization) {\n payload.logger.info({\n msg: 'Localization not enabled, skipping localize-status migration',\n })\n return\n }\n\n const collections = payload.config.collections.filter(\n (c) =>\n c.versions?.drafts &&\n typeof c.versions.drafts === 'object' &&\n c.versions.drafts.localizeStatus,\n )\n const globals = payload.config.globals.filter(\n (g) =>\n g.versions?.drafts &&\n typeof g.versions.drafts === 'object' &&\n g.versions.drafts.localizeStatus,\n )\n\n payload.logger.info({\n msg: `Starting localize-status migration for ${collections.length} collection(s) and ${globals.length} global(s)`,\n })\n\n const connection = (payload.db as any).connection\n const session = await getSession(payload.db as MongooseAdapter, req)\n\n for (const collection of collections) {\n await localizeStatus({ collectionSlug: collection.slug, payload, req, session })\n await cleanupSnapshotDocuments({ connection, entitySlug: collection.slug, payload, session })\n }\n\n for (const global of globals) {\n await localizeStatus({ globalSlug: global.slug, payload, req, session })\n await cleanupSnapshotDocuments({ connection, entitySlug: global.slug, payload, session })\n }\n\n payload.logger.info({ msg: 'localize-status migration completed successfully' })\n}\n\n/**\n * Converts version._status (and the main document _status) from a scalar string to a\n * per-locale object for a single collection or global.\n */\nexport async function localizeStatus(args: LocalizeStatusArgs): Promise<void> {\n const { collectionSlug, globalSlug, payload, req, session } = args\n\n if (!collectionSlug && !globalSlug) {\n throw new Error('Either collectionSlug or globalSlug must be provided')\n }\n\n if (collectionSlug && globalSlug) {\n throw new Error('Cannot provide both collectionSlug and globalSlug')\n }\n\n const entitySlug = collectionSlug || globalSlug\n // MongoDB collection names are case-insensitive and stored as lowercase\n const versionsCollection = `_${entitySlug}_versions`.toLowerCase()\n\n if (!payload.config.localization) {\n throw new Error('Localization is not enabled in payload config')\n }\n\n // Check if versions are enabled on this collection/global\n let entityConfig\n if (collectionSlug) {\n const collection = payload.config.collections.find((c) => c.slug === collectionSlug)\n if (collection) {\n entityConfig = collection\n }\n } else if (globalSlug) {\n const global = payload.config.globals.find((g) => g.slug === globalSlug)\n if (global) {\n entityConfig = global\n }\n }\n\n if (!entityConfig) {\n throw new Error(\n `${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`,\n )\n }\n\n payload.logger.info({\n msg: `Starting _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`,\n })\n\n // Check if versions are enabled in config (skip if not)\n if (!entityConfig.versions) {\n payload.logger.info({\n msg: `Skipping migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug} - versions not enabled`,\n })\n return\n }\n\n // Get MongoDB connection\n const connection = (payload.db as any).connection\n\n // Get filtered locales if filterAvailableLocales is defined\n let locales = payload.config.localization.localeCodes\n if (typeof payload.config.localization.filterAvailableLocales === 'function') {\n const filteredLocaleObjects = await payload.config.localization.filterAvailableLocales({\n locales: payload.config.localization.locales,\n req,\n })\n locales = filteredLocaleObjects.map((locale) => locale.code)\n }\n payload.logger.info({ msg: `Locales: ${locales.join(', ')}` })\n\n // Check if version._status exists and is NOT already localized\n const sampleDoc = await connection.collection(versionsCollection).findOne({}, { session })\n\n if (!sampleDoc) {\n payload.logger.info({ msg: 'No version documents found, nothing to migrate' })\n return\n }\n\n // Check if _status is already localized\n if (\n sampleDoc.version?._status &&\n typeof sampleDoc.version._status === 'object' &&\n !Array.isArray(sampleDoc.version._status)\n ) {\n payload.logger.info({\n msg: 'version._status is already localized, migration already completed',\n })\n return\n }\n\n // Validate that version._status exists and is a string\n if (\n !sampleDoc.version ||\n typeof sampleDoc.version._status !== 'string' ||\n Array.isArray(sampleDoc.version._status)\n ) {\n throw new Error(\n `Migration aborted: version._status field not found or has unexpected format in ${versionsCollection}. ` +\n `This migration should only run on schemas that have NOT yet been migrated to per-locale status.`,\n )\n }\n\n payload.logger.info({ msg: 'Fetching all version documents...' })\n\n // Get all versions, sorted chronologically\n const allVersions = await connection\n .collection(versionsCollection)\n .find({}, { session })\n .sort({ createdAt: 1, parent: 1 })\n .toArray()\n\n payload.logger.info({ msg: `Found ${allVersions.length} version documents` })\n\n // Transform MongoDB documents to VersionRecord format\n const versionRecords: VersionRecord[] = allVersions.map((doc: any) => ({\n id: doc._id.toString(),\n _status: doc.version._status as 'draft' | 'published',\n createdAt: doc.createdAt,\n parent: doc.parent?.toString(),\n publishedLocale: doc.publishedLocale,\n snapshot: doc.snapshot || false,\n }))\n\n // Calculate status per locale using shared logic\n const versionLocaleStatus = calculateVersionLocaleStatuses(versionRecords, locales, payload)\n\n payload.logger.info({ msg: 'Updating version documents with per-locale status...' })\n\n // Update each version document\n let updateCount = 0\n for (const doc of allVersions) {\n const versionId = doc._id.toString()\n const localeStatusMap = versionLocaleStatus.get(versionId)\n\n if (!localeStatusMap) {\n payload.logger.warn({ msg: `No status map found for version ${versionId}, skipping` })\n continue\n }\n\n // Build the new _status object: { en: 'published', es: 'draft', ... }\n const newStatus: Record<string, string> = {}\n for (const [locale, status] of localeStatusMap.entries()) {\n newStatus[locale] = status\n }\n\n // Update the document: change version._status from string to object\n await connection.collection(versionsCollection).updateOne(\n { _id: doc._id },\n {\n $set: {\n 'version._status': newStatus,\n },\n },\n { session },\n )\n\n updateCount++\n }\n\n payload.logger.info({ msg: `Updated ${updateCount} version documents` })\n\n // Migrate main collection/global document _status to per-locale status object\n // Only if it has a status field\n if (collectionSlug) {\n const mainCollection = collectionSlug\n const mainDoc = await connection.collection(mainCollection).findOne({}, { session })\n\n if (mainDoc && '_status' in mainDoc) {\n payload.logger.info({ msg: `Migrating main collection documents for: ${mainCollection}` })\n\n const allDocs = await connection.collection(mainCollection).find({}, { session }).toArray()\n\n for (const doc of allDocs) {\n if (!doc._id) {\n continue\n }\n\n // Get the latest version for this document to determine status per locale\n const latestVersions = await connection\n .collection(versionsCollection)\n .find({ parent: doc._id }, { session })\n .sort({ createdAt: -1 })\n .limit(1)\n .toArray()\n\n let statusObj: Record<string, string> = {}\n\n if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {\n // Use the status from the latest version\n statusObj = latestVersions[0].version._status\n } else {\n // Fallback: set all locales to draft\n for (const locale of locales) {\n statusObj[locale] = 'draft'\n }\n }\n\n // Update main document\n await connection.collection(mainCollection).updateOne(\n { _id: doc._id },\n {\n $set: {\n _status: statusObj,\n },\n },\n { session },\n )\n }\n\n payload.logger.info({ msg: `Migrated ${allDocs.length} collection documents` })\n } else {\n payload.logger.info({\n msg: 'Skipping main document status migration (no status field found)',\n })\n }\n } else if (globalSlug) {\n // Globals are stored in a single 'globals' collection with globalType discriminator\n const globalDoc = await connection\n .collection('globals')\n .findOne({ globalType: globalSlug }, { session })\n if (globalDoc && '_status' in globalDoc && globalDoc._id) {\n payload.logger.info({ msg: `Migrating main global document for: ${globalSlug}` })\n\n // Get the latest version for the global\n const latestVersions = await connection\n .collection(versionsCollection)\n .find({}, { session })\n .sort({ createdAt: -1 })\n .limit(1)\n .toArray()\n\n let statusObj: Record<string, string> = {}\n\n if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {\n statusObj = latestVersions[0].version._status\n } else {\n for (const locale of locales) {\n statusObj[locale] = 'draft'\n }\n }\n\n // Update global document\n await connection.collection('globals').updateOne(\n { _id: globalDoc._id, globalType: globalSlug },\n {\n $set: {\n _status: statusObj,\n },\n },\n { session },\n )\n\n payload.logger.info({ msg: 'Migrated global document' })\n } else {\n payload.logger.info({\n msg: 'Skipping main document status migration (no status field found)',\n })\n }\n }\n\n payload.logger.info({ msg: 'Migration completed successfully' })\n}\n\nasync function cleanupSnapshotDocuments({\n connection,\n entitySlug,\n payload,\n session,\n}: {\n connection: any\n entitySlug: string\n payload: Payload\n session?: ClientSession\n}): Promise<void> {\n const versionsCollection = `_${entitySlug}_versions`.toLowerCase()\n\n const col = connection.collection(versionsCollection)\n\n // Delete all snapshot=true documents\n const deleteResult = await col.deleteMany({ snapshot: true }, { session })\n\n if (deleteResult.deletedCount > 0) {\n payload.logger.info({\n msg: `Deleted ${deleteResult.deletedCount} snapshot documents from ${versionsCollection}`,\n })\n }\n\n // Unset the snapshot field from remaining documents\n await col.updateMany({ snapshot: { $exists: true } }, { $unset: { snapshot: '' } }, { session })\n}\n"],"names":["calculateVersionLocaleStatuses","getSession","migrateLocalizeStatus","payload","req","config","localization","logger","info","msg","collections","filter","c","versions","drafts","localizeStatus","globals","g","length","connection","db","session","collection","collectionSlug","slug","cleanupSnapshotDocuments","entitySlug","global","globalSlug","args","Error","versionsCollection","toLowerCase","entityConfig","find","locales","localeCodes","filterAvailableLocales","filteredLocaleObjects","map","locale","code","join","sampleDoc","findOne","version","_status","Array","isArray","allVersions","sort","createdAt","parent","toArray","versionRecords","doc","id","_id","toString","publishedLocale","snapshot","versionLocaleStatus","updateCount","versionId","localeStatusMap","get","warn","newStatus","status","entries","updateOne","$set","mainCollection","mainDoc","allDocs","latestVersions","limit","statusObj","globalDoc","globalType","col","deleteResult","deleteMany","deletedCount","updateMany","$exists","$unset"],"mappings":"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"}
|