@strapi/content-releases 5.37.1 → 5.38.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/assets/purchase-page-illustration-dark.jpg.js.map +1 -1
- package/dist/admin/assets/purchase-page-illustration-dark.jpg.mjs.map +1 -1
- package/dist/admin/assets/purchase-page-illustration-light.jpg.js.map +1 -1
- package/dist/admin/assets/purchase-page-illustration-light.jpg.mjs.map +1 -1
- package/dist/admin/components/EntryValidationPopover.js.map +1 -1
- package/dist/admin/components/EntryValidationPopover.mjs +1 -1
- package/dist/admin/components/EntryValidationPopover.mjs.map +1 -1
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/components/ReleaseAction.js.map +1 -1
- package/dist/admin/components/ReleaseAction.mjs +1 -1
- package/dist/admin/components/ReleaseAction.mjs.map +1 -1
- package/dist/admin/components/ReleaseActionMenu.js.map +1 -1
- package/dist/admin/components/ReleaseActionMenu.mjs +3 -3
- package/dist/admin/components/ReleaseActionMenu.mjs.map +1 -1
- package/dist/admin/components/ReleaseActionModal.js.map +1 -1
- package/dist/admin/components/ReleaseActionModal.mjs +2 -2
- package/dist/admin/components/ReleaseActionModal.mjs.map +1 -1
- package/dist/admin/components/ReleaseActionOptions.js.map +1 -1
- package/dist/admin/components/ReleaseActionOptions.mjs.map +1 -1
- package/dist/admin/components/ReleaseListCell.js.map +1 -1
- package/dist/admin/components/ReleaseListCell.mjs.map +1 -1
- package/dist/admin/components/ReleaseModal.js.map +1 -1
- package/dist/admin/components/ReleaseModal.mjs.map +1 -1
- package/dist/admin/components/ReleasesPanel.js.map +1 -1
- package/dist/admin/components/ReleasesPanel.mjs.map +1 -1
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/components/Widgets.mjs +1 -1
- package/dist/admin/components/Widgets.mjs.map +1 -1
- package/dist/admin/constants.js.map +1 -1
- package/dist/admin/constants.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/hooks.js.map +1 -1
- package/dist/admin/modules/hooks.mjs.map +1 -1
- package/dist/admin/pages/App.js.map +1 -1
- package/dist/admin/pages/App.mjs.map +1 -1
- package/dist/admin/pages/PurchaseContentReleases.js.map +1 -1
- package/dist/admin/pages/PurchaseContentReleases.mjs.map +1 -1
- package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -1
- package/dist/admin/pages/ReleaseDetailsPage.mjs +2 -2
- package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -1
- package/dist/admin/pages/ReleasesPage.js.map +1 -1
- package/dist/admin/pages/ReleasesPage.mjs +1 -1
- package/dist/admin/pages/ReleasesPage.mjs.map +1 -1
- package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -1
- package/dist/admin/pages/ReleasesSettingsPage.mjs +1 -1
- package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -1
- package/dist/admin/services/homepage.js.map +1 -1
- package/dist/admin/services/homepage.mjs.map +1 -1
- package/dist/admin/services/release.js.map +1 -1
- package/dist/admin/services/release.mjs.map +1 -1
- package/dist/admin/store/hooks.js.map +1 -1
- package/dist/admin/store/hooks.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +103 -0
- package/dist/admin/translations/es.json.js.map +1 -0
- package/dist/admin/translations/es.json.mjs +101 -0
- package/dist/admin/translations/es.json.mjs.map +1 -0
- package/dist/admin/utils/api.js.map +1 -1
- package/dist/admin/utils/api.mjs.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
- package/dist/admin/utils/time.js.map +1 -1
- package/dist/admin/utils/time.mjs.map +1 -1
- package/dist/admin/validation/schemas.js.map +1 -1
- package/dist/admin/validation/schemas.mjs.map +1 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/constants.js.map +1 -1
- package/dist/server/constants.mjs.map +1 -1
- package/dist/server/content-types/index.js +4 -4
- package/dist/server/content-types/index.js.map +1 -1
- package/dist/server/content-types/index.mjs.map +1 -1
- package/dist/server/content-types/release/index.js.map +1 -1
- package/dist/server/content-types/release/index.mjs.map +1 -1
- package/dist/server/content-types/release/schema.js.map +1 -1
- package/dist/server/content-types/release/schema.mjs.map +1 -1
- package/dist/server/content-types/release-action/index.js.map +1 -1
- package/dist/server/content-types/release-action/index.mjs.map +1 -1
- package/dist/server/content-types/release-action/schema.js.map +1 -1
- package/dist/server/content-types/release-action/schema.mjs.map +1 -1
- package/dist/server/controllers/homepage.js.map +1 -1
- package/dist/server/controllers/homepage.mjs.map +1 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/release-action.js.map +1 -1
- package/dist/server/controllers/release-action.mjs +1 -1
- package/dist/server/controllers/release-action.mjs.map +1 -1
- package/dist/server/controllers/release.js.map +1 -1
- package/dist/server/controllers/release.mjs +1 -1
- package/dist/server/controllers/release.mjs.map +1 -1
- package/dist/server/controllers/settings.js.map +1 -1
- package/dist/server/controllers/settings.mjs.map +1 -1
- package/dist/server/controllers/validation/release-action.js.map +1 -1
- package/dist/server/controllers/validation/release-action.mjs.map +1 -1
- package/dist/server/controllers/validation/release.js.map +1 -1
- package/dist/server/controllers/validation/release.mjs.map +1 -1
- package/dist/server/controllers/validation/settings.js.map +1 -1
- package/dist/server/controllers/validation/settings.mjs.map +1 -1
- package/dist/server/destroy.js.map +1 -1
- package/dist/server/destroy.mjs.map +1 -1
- package/dist/server/index.js +9 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/middlewares/documents.js.map +1 -1
- package/dist/server/middlewares/documents.mjs +1 -1
- package/dist/server/middlewares/documents.mjs.map +1 -1
- package/dist/server/migrations/database/5.0.0-document-id-in-actions.js.map +1 -1
- package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs.map +1 -1
- package/dist/server/migrations/index.js.map +1 -1
- package/dist/server/migrations/index.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/homepage.js.map +1 -1
- package/dist/server/routes/homepage.mjs.map +1 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/routes/release-action.js.map +1 -1
- package/dist/server/routes/release-action.mjs.map +1 -1
- package/dist/server/routes/release.js.map +1 -1
- package/dist/server/routes/release.mjs.map +1 -1
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/settings.mjs.map +1 -1
- package/dist/server/services/homepage.js.map +1 -1
- package/dist/server/services/homepage.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/release-action.js.map +1 -1
- package/dist/server/services/release-action.mjs +3 -3
- package/dist/server/services/release-action.mjs.map +1 -1
- package/dist/server/services/release.js +10 -3
- package/dist/server/services/release.js.map +1 -1
- package/dist/server/services/release.mjs +13 -6
- package/dist/server/services/release.mjs.map +1 -1
- package/dist/server/services/scheduling.js.map +1 -1
- package/dist/server/services/scheduling.mjs.map +1 -1
- package/dist/server/services/settings.js.map +1 -1
- package/dist/server/services/settings.mjs.map +1 -1
- package/dist/server/services/validation.js.map +1 -1
- package/dist/server/services/validation.mjs.map +1 -1
- package/dist/server/src/services/release.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +16 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/index.js +91 -0
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs +91 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/package.json +17 -12
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { contentTypes } from '@strapi/utils';
|
|
2
|
+
|
|
1
3
|
const getService = (name, { strapi: strapi1 })=>{
|
|
2
4
|
return strapi1.plugin('content-releases').service(name);
|
|
3
5
|
};
|
|
@@ -83,6 +85,94 @@ const getEntryStatus = async (contentType, entry)=>{
|
|
|
83
85
|
}
|
|
84
86
|
return 'published';
|
|
85
87
|
};
|
|
88
|
+
/**
|
|
89
|
+
* Recursively collects content type UIDs that a model (content type or component) has relations to.
|
|
90
|
+
* Go through component and dynamic zone attributes to find nested relations.
|
|
91
|
+
*/ const collectRelationTargets = (modelUid, strapi1, visited = new Set())=>{
|
|
92
|
+
const targets = new Set();
|
|
93
|
+
if (visited.has(modelUid)) {
|
|
94
|
+
return targets;
|
|
95
|
+
}
|
|
96
|
+
visited.add(modelUid);
|
|
97
|
+
const model = strapi1.getModel(modelUid);
|
|
98
|
+
if (!model?.attributes) {
|
|
99
|
+
return targets;
|
|
100
|
+
}
|
|
101
|
+
for (const attribute of Object.values(model.attributes)){
|
|
102
|
+
if (attribute?.type === 'relation' && attribute.target) {
|
|
103
|
+
targets.add(attribute.target);
|
|
104
|
+
}
|
|
105
|
+
if (attribute?.type === 'component' && attribute.component) {
|
|
106
|
+
for (const t of collectRelationTargets(attribute.component, strapi1, visited)){
|
|
107
|
+
targets.add(t);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (attribute?.type === 'dynamiczone' && attribute.components) {
|
|
111
|
+
for (const compUid of attribute.components){
|
|
112
|
+
for (const t of collectRelationTargets(compUid, strapi1, visited)){
|
|
113
|
+
targets.add(t);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return targets;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Returns content type UIDs sorted by relation dependency order for publishing.
|
|
122
|
+
* When content type A has a relation to content type B (both with draft & publish),
|
|
123
|
+
* B will appear before A in the result. This ensures that when publishing a release,
|
|
124
|
+
* related entities are published first, so that relation IDs can be correctly
|
|
125
|
+
* resolved (published target must exist when publishing source).
|
|
126
|
+
*
|
|
127
|
+
* Relations in components (nested or not) and dynamic zones are also considered.
|
|
128
|
+
*
|
|
129
|
+
* @param contentTypeUids - Content type UIDs that will be published in the release
|
|
130
|
+
* @param strapi - Strapi instance
|
|
131
|
+
* @returns Content type UIDs in publish order (dependencies first)
|
|
132
|
+
*/ const getPublishOrderForContentTypes = (contentTypeUids, { strapi: strapi1 })=>{
|
|
133
|
+
const uidSet = new Set(contentTypeUids);
|
|
134
|
+
// Build dependency graph: source depends on target (source must be published after target)
|
|
135
|
+
const dependencies = new Map();
|
|
136
|
+
for (const uid of contentTypeUids){
|
|
137
|
+
const model = strapi1.getModel(uid);
|
|
138
|
+
if (model && contentTypes.hasDraftAndPublish(model)) {
|
|
139
|
+
const relationTargets = collectRelationTargets(uid, strapi1);
|
|
140
|
+
for (const targetUid of relationTargets){
|
|
141
|
+
const targetContentTypeUid = targetUid;
|
|
142
|
+
const isTargetInRelease = uidSet.has(targetContentTypeUid) && targetContentTypeUid in strapi1.contentTypes;
|
|
143
|
+
const targetModel = strapi1.getModel(targetContentTypeUid);
|
|
144
|
+
const targetHasDraftAndPublish = targetModel && contentTypes.hasDraftAndPublish(targetModel);
|
|
145
|
+
if (isTargetInRelease && targetHasDraftAndPublish) {
|
|
146
|
+
let dependencySet = dependencies.get(uid);
|
|
147
|
+
if (!dependencySet) {
|
|
148
|
+
dependencySet = new Set();
|
|
149
|
+
dependencies.set(uid, dependencySet);
|
|
150
|
+
}
|
|
151
|
+
dependencySet.add(targetContentTypeUid);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Topological sort: dependencies first
|
|
157
|
+
const sorted = [];
|
|
158
|
+
const visited = new Set();
|
|
159
|
+
const visiting = new Set();
|
|
160
|
+
const visit = (uid)=>{
|
|
161
|
+
if (visited.has(uid)) return;
|
|
162
|
+
if (visiting.has(uid)) return; // No cycle in valid schemas
|
|
163
|
+
visiting.add(uid);
|
|
164
|
+
for (const dep of dependencies.get(uid) ?? []){
|
|
165
|
+
visit(dep);
|
|
166
|
+
}
|
|
167
|
+
visiting.delete(uid);
|
|
168
|
+
visited.add(uid);
|
|
169
|
+
sorted.push(uid);
|
|
170
|
+
};
|
|
171
|
+
for (const uid of contentTypeUids){
|
|
172
|
+
visit(uid);
|
|
173
|
+
}
|
|
174
|
+
return sorted;
|
|
175
|
+
};
|
|
86
176
|
|
|
87
|
-
export { getDraftEntryValidStatus, getEntry, getEntryStatus, getService, isEntryValid };
|
|
177
|
+
export { getDraftEntryValidStatus, getEntry, getEntryStatus, getPublishOrderForContentTypes, getService, isEntryValid };
|
|
88
178
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import type { UID, Data, Core } from '@strapi/types';\n\nimport type { SettingsService } from '../services/settings';\nimport type { ReleaseService } from '../services/release';\nimport type { ReleaseActionService } from '../services/release-action';\n\ntype Services = {\n release: ReleaseService;\n 'release-validation': any;\n scheduling: any;\n 'release-action': ReleaseActionService;\n 'event-manager': any;\n settings: SettingsService;\n};\n\ninterface Action {\n contentType: UID.ContentType;\n documentId?: Data.DocumentID;\n locale?: string;\n}\n\nexport const getService = <TName extends keyof Services>(\n name: TName,\n { strapi }: { strapi: Core.Strapi }\n): Services[TName] => {\n return strapi.plugin('content-releases').service(name);\n};\n\nexport const getDraftEntryValidStatus = async (\n { contentType, documentId, locale }: Action,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n // @ts-expect-error - populateBuilderService should be a function but is returning service\n const populate = await populateBuilderService(contentType).populateDeep(Infinity).build();\n\n const entry = await getEntry({ contentType, documentId, locale, populate }, { strapi });\n\n return isEntryValid(contentType, entry, { strapi });\n};\n\nexport const isEntryValid = async (\n contentTypeUid: string,\n entry: any,\n { strapi }: { strapi: Core.Strapi }\n) => {\n try {\n // @TODO: When documents service has validateEntityCreation method, use it instead\n await strapi.entityValidator.validateEntityCreation(\n strapi.getModel(contentTypeUid as UID.ContentType),\n entry,\n undefined,\n // @ts-expect-error - FIXME: entity here is unnecessary\n entry\n );\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (workflow?.stageRequiredToPublish) {\n return entry.strapi_stage.id === workflow.stageRequiredToPublish.id;\n }\n\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getEntry = async (\n {\n contentType,\n documentId,\n locale,\n populate,\n status = 'draft',\n }: Action & { status?: 'draft' | 'published'; populate: any },\n { strapi }: { strapi: Core.Strapi }\n) => {\n if (documentId) {\n // Try to get an existing draft or published document\n const entry = await strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status });\n\n // The document isn't published yet, but the action is to publish it, fetch the draft\n if (status === 'published' && !entry) {\n return strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status: 'draft' });\n }\n\n return entry;\n }\n\n return strapi.documents(contentType).findFirst({ locale, populate, status });\n};\n\nexport const getEntryStatus = async (contentType: UID.ContentType, entry: Data.ContentType) => {\n if (entry.publishedAt) {\n return 'published';\n }\n\n const publishedEntry = await strapi.documents(contentType).findOne({\n documentId: entry.documentId,\n locale: entry.locale,\n status: 'published',\n fields: ['updatedAt'],\n });\n\n if (!publishedEntry) {\n return 'draft';\n }\n\n const entryUpdatedAt = new Date(entry.updatedAt).getTime();\n const publishedEntryUpdatedAt = new Date(publishedEntry.updatedAt).getTime();\n\n if (entryUpdatedAt > publishedEntryUpdatedAt) {\n return 'modified';\n }\n\n return 'published';\n};\n"],"names":["getService","name","strapi","plugin","service","getDraftEntryValidStatus","contentType","documentId","locale","populateBuilderService","populate","populateDeep","Infinity","build","entry","getEntry","isEntryValid","contentTypeUid","entityValidator","validateEntityCreation","getModel","undefined","workflowsService","workflow","getAssignedWorkflow","stageRequiredToPublish","strapi_stage","id","status","documents","findOne","findFirst","getEntryStatus","publishedAt","publishedEntry","fields","entryUpdatedAt","Date","updatedAt","getTime","publishedEntryUpdatedAt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Data, Core } from '@strapi/types';\n\nimport type { SettingsService } from '../services/settings';\nimport type { ReleaseService } from '../services/release';\nimport type { ReleaseActionService } from '../services/release-action';\n\ntype Services = {\n release: ReleaseService;\n 'release-validation': any;\n scheduling: any;\n 'release-action': ReleaseActionService;\n 'event-manager': any;\n settings: SettingsService;\n};\n\ninterface Action {\n contentType: UID.ContentType;\n documentId?: Data.DocumentID;\n locale?: string;\n}\n\nexport const getService = <TName extends keyof Services>(\n name: TName,\n { strapi }: { strapi: Core.Strapi }\n): Services[TName] => {\n return strapi.plugin('content-releases').service(name);\n};\n\nexport const getDraftEntryValidStatus = async (\n { contentType, documentId, locale }: Action,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n // @ts-expect-error - populateBuilderService should be a function but is returning service\n const populate = await populateBuilderService(contentType).populateDeep(Infinity).build();\n\n const entry = await getEntry({ contentType, documentId, locale, populate }, { strapi });\n\n return isEntryValid(contentType, entry, { strapi });\n};\n\nexport const isEntryValid = async (\n contentTypeUid: string,\n entry: any,\n { strapi }: { strapi: Core.Strapi }\n) => {\n try {\n // @TODO: When documents service has validateEntityCreation method, use it instead\n await strapi.entityValidator.validateEntityCreation(\n strapi.getModel(contentTypeUid as UID.ContentType),\n entry,\n undefined,\n // @ts-expect-error - FIXME: entity here is unnecessary\n entry\n );\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (workflow?.stageRequiredToPublish) {\n return entry.strapi_stage.id === workflow.stageRequiredToPublish.id;\n }\n\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getEntry = async (\n {\n contentType,\n documentId,\n locale,\n populate,\n status = 'draft',\n }: Action & { status?: 'draft' | 'published'; populate: any },\n { strapi }: { strapi: Core.Strapi }\n) => {\n if (documentId) {\n // Try to get an existing draft or published document\n const entry = await strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status });\n\n // The document isn't published yet, but the action is to publish it, fetch the draft\n if (status === 'published' && !entry) {\n return strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status: 'draft' });\n }\n\n return entry;\n }\n\n return strapi.documents(contentType).findFirst({ locale, populate, status });\n};\n\nexport const getEntryStatus = async (contentType: UID.ContentType, entry: Data.ContentType) => {\n if (entry.publishedAt) {\n return 'published';\n }\n\n const publishedEntry = await strapi.documents(contentType).findOne({\n documentId: entry.documentId,\n locale: entry.locale,\n status: 'published',\n fields: ['updatedAt'],\n });\n\n if (!publishedEntry) {\n return 'draft';\n }\n\n const entryUpdatedAt = new Date(entry.updatedAt).getTime();\n const publishedEntryUpdatedAt = new Date(publishedEntry.updatedAt).getTime();\n\n if (entryUpdatedAt > publishedEntryUpdatedAt) {\n return 'modified';\n }\n\n return 'published';\n};\n\n/**\n * Recursively collects content type UIDs that a model (content type or component) has relations to.\n * Go through component and dynamic zone attributes to find nested relations.\n */\nconst collectRelationTargets = (\n modelUid: string,\n strapi: Core.Strapi,\n visited = new Set<string>()\n): Set<string> => {\n const targets = new Set<string>();\n if (visited.has(modelUid)) {\n return targets;\n }\n visited.add(modelUid);\n\n const model = strapi.getModel(modelUid as UID.Schema);\n if (!model?.attributes) {\n return targets;\n }\n\n for (const attribute of Object.values(model.attributes) as Array<{\n type?: string;\n target?: string;\n component?: string;\n components?: string[];\n }>) {\n if (attribute?.type === 'relation' && attribute.target) {\n targets.add(attribute.target);\n }\n if (attribute?.type === 'component' && attribute.component) {\n for (const t of collectRelationTargets(attribute.component, strapi, visited)) {\n targets.add(t);\n }\n }\n if (attribute?.type === 'dynamiczone' && attribute.components) {\n for (const compUid of attribute.components) {\n for (const t of collectRelationTargets(compUid, strapi, visited)) {\n targets.add(t);\n }\n }\n }\n }\n return targets;\n};\n\n/**\n * Returns content type UIDs sorted by relation dependency order for publishing.\n * When content type A has a relation to content type B (both with draft & publish),\n * B will appear before A in the result. This ensures that when publishing a release,\n * related entities are published first, so that relation IDs can be correctly\n * resolved (published target must exist when publishing source).\n *\n * Relations in components (nested or not) and dynamic zones are also considered.\n *\n * @param contentTypeUids - Content type UIDs that will be published in the release\n * @param strapi - Strapi instance\n * @returns Content type UIDs in publish order (dependencies first)\n */\nexport const getPublishOrderForContentTypes = (\n contentTypeUids: UID.ContentType[],\n { strapi }: { strapi: Core.Strapi }\n): UID.ContentType[] => {\n const uidSet = new Set(contentTypeUids);\n\n // Build dependency graph: source depends on target (source must be published after target)\n const dependencies = new Map<UID.ContentType, Set<UID.ContentType>>();\n\n for (const uid of contentTypeUids) {\n const model = strapi.getModel(uid);\n if (model && contentTypesUtils.hasDraftAndPublish(model)) {\n const relationTargets = collectRelationTargets(uid, strapi);\n\n for (const targetUid of relationTargets) {\n const targetContentTypeUid = targetUid as UID.ContentType;\n const isTargetInRelease =\n uidSet.has(targetContentTypeUid) && targetContentTypeUid in strapi.contentTypes;\n const targetModel = strapi.getModel(targetContentTypeUid);\n const targetHasDraftAndPublish =\n targetModel && contentTypesUtils.hasDraftAndPublish(targetModel);\n\n if (isTargetInRelease && targetHasDraftAndPublish) {\n let dependencySet = dependencies.get(uid);\n if (!dependencySet) {\n dependencySet = new Set();\n dependencies.set(uid, dependencySet);\n }\n dependencySet.add(targetContentTypeUid);\n }\n }\n }\n }\n\n // Topological sort: dependencies first\n const sorted: UID.ContentType[] = [];\n const visited = new Set<UID.ContentType>();\n const visiting = new Set<UID.ContentType>();\n\n const visit = (uid: UID.ContentType) => {\n if (visited.has(uid)) return;\n if (visiting.has(uid)) return; // No cycle in valid schemas\n\n visiting.add(uid);\n for (const dep of dependencies.get(uid) ?? []) {\n visit(dep);\n }\n visiting.delete(uid);\n visited.add(uid);\n sorted.push(uid);\n };\n\n for (const uid of contentTypeUids) {\n visit(uid);\n }\n\n return sorted;\n};\n"],"names":["getService","name","strapi","plugin","service","getDraftEntryValidStatus","contentType","documentId","locale","populateBuilderService","populate","populateDeep","Infinity","build","entry","getEntry","isEntryValid","contentTypeUid","entityValidator","validateEntityCreation","getModel","undefined","workflowsService","workflow","getAssignedWorkflow","stageRequiredToPublish","strapi_stage","id","status","documents","findOne","findFirst","getEntryStatus","publishedAt","publishedEntry","fields","entryUpdatedAt","Date","updatedAt","getTime","publishedEntryUpdatedAt","collectRelationTargets","modelUid","visited","Set","targets","has","add","model","attributes","attribute","Object","values","type","target","component","t","components","compUid","getPublishOrderForContentTypes","contentTypeUids","uidSet","dependencies","Map","uid","contentTypesUtils","hasDraftAndPublish","relationTargets","targetUid","targetContentTypeUid","isTargetInRelease","contentTypes","targetModel","targetHasDraftAndPublish","dependencySet","get","set","sorted","visiting","visit","dep","delete","push"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/content-releases",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.38.1",
|
|
4
4
|
"description": "Strapi plugin for organizing and releasing content",
|
|
5
|
+
"homepage": "https://strapi.io",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/strapi/strapi/issues"
|
|
8
|
+
},
|
|
5
9
|
"repository": {
|
|
6
10
|
"type": "git",
|
|
7
|
-
"url": "
|
|
11
|
+
"url": "git://github.com/strapi/strapi.git",
|
|
12
|
+
"directory": "packages/core/content-releases"
|
|
8
13
|
},
|
|
9
14
|
"license": "SEE LICENSE IN LICENSE",
|
|
10
15
|
"author": {
|
|
@@ -59,29 +64,29 @@
|
|
|
59
64
|
},
|
|
60
65
|
"dependencies": {
|
|
61
66
|
"@reduxjs/toolkit": "1.9.7",
|
|
62
|
-
"@strapi/database": "5.
|
|
63
|
-
"@strapi/design-system": "2.
|
|
64
|
-
"@strapi/icons": "2.
|
|
65
|
-
"@strapi/types": "5.
|
|
66
|
-
"@strapi/utils": "5.
|
|
67
|
+
"@strapi/database": "5.38.1",
|
|
68
|
+
"@strapi/design-system": "2.2.0",
|
|
69
|
+
"@strapi/icons": "2.2.0",
|
|
70
|
+
"@strapi/types": "5.38.1",
|
|
71
|
+
"@strapi/utils": "5.38.1",
|
|
67
72
|
"date-fns": "2.30.0",
|
|
68
73
|
"date-fns-tz": "2.0.1",
|
|
69
74
|
"formik": "2.4.5",
|
|
70
75
|
"lodash": "4.17.23",
|
|
71
|
-
"qs": "6.
|
|
76
|
+
"qs": "6.15.0",
|
|
72
77
|
"react-intl": "6.6.2",
|
|
73
78
|
"react-redux": "8.1.3",
|
|
74
79
|
"yup": "0.32.9"
|
|
75
80
|
},
|
|
76
81
|
"devDependencies": {
|
|
77
|
-
"@strapi/admin": "5.
|
|
78
|
-
"@strapi/admin-test-utils": "5.
|
|
79
|
-
"@strapi/content-manager": "5.
|
|
82
|
+
"@strapi/admin": "5.38.1",
|
|
83
|
+
"@strapi/admin-test-utils": "5.38.1",
|
|
84
|
+
"@strapi/content-manager": "5.38.1",
|
|
80
85
|
"@testing-library/dom": "10.4.1",
|
|
81
86
|
"@testing-library/react": "16.3.0",
|
|
82
87
|
"@testing-library/user-event": "14.6.1",
|
|
83
88
|
"@types/koa": "2.13.4",
|
|
84
|
-
"koa": "2.16.
|
|
89
|
+
"koa": "2.16.4",
|
|
85
90
|
"msw": "1.3.0",
|
|
86
91
|
"react": "18.3.1",
|
|
87
92
|
"react-dom": "18.3.1",
|