@strapi/core 5.53.0 → 5.54.0
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/domain/content-type/index.d.ts.map +1 -1
- package/dist/domain/content-type/index.js +3 -1
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/index.mjs +3 -1
- package/dist/domain/content-type/index.mjs.map +1 -1
- package/dist/package.json.js +14 -15
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +14 -15
- package/dist/package.json.mjs.map +1 -1
- package/dist/services/content-source-maps.d.ts +14 -2
- package/dist/services/content-source-maps.d.ts.map +1 -1
- package/dist/services/content-source-maps.js +134 -1
- package/dist/services/content-source-maps.js.map +1 -1
- package/dist/services/content-source-maps.mjs +134 -2
- package/dist/services/content-source-maps.mjs.map +1 -1
- package/dist/services/cron.d.ts +3 -18
- package/dist/services/cron.d.ts.map +1 -1
- package/dist/services/cron.js +241 -33
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +241 -33
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.js +12 -3
- package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs +12 -3
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.d.ts +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.js +12 -3
- package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs +12 -3
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.d.ts +6 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.js +13 -10
- package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs +13 -10
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
- package/dist/services/features.d.ts.map +1 -1
- package/dist/services/features.js +3 -0
- package/dist/services/features.js.map +1 -1
- package/dist/services/features.mjs +3 -0
- package/dist/services/features.mjs.map +1 -1
- package/package.json +14 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/content-type/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAWF,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,YAAY,qBAAqB,oEAqCxE,CAAC;AAwFF,QAAA,MAAM,WAAW,GAAI,QAAQ,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,WAK/D,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/content-type/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAWF,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,YAAY,qBAAqB,oEAqCxE,CAAC;AAwFF,QAAA,MAAM,WAAW,GAAI,QAAQ,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,WAK/D,CAAC;AAqBF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
|
package/dist/package.json.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var name = "@strapi/core";
|
|
6
|
-
var version = "5.
|
|
6
|
+
var version = "5.54.0";
|
|
7
7
|
var description = "Core of Strapi";
|
|
8
8
|
var homepage = "https://strapi.io";
|
|
9
9
|
var bugs = {
|
|
@@ -66,15 +66,15 @@ var dependencies = {
|
|
|
66
66
|
"@modelcontextprotocol/node": "2.0.0",
|
|
67
67
|
"@modelcontextprotocol/server": "2.0.0",
|
|
68
68
|
"@paralleldrive/cuid2": "2.2.2",
|
|
69
|
-
"@strapi/admin": "5.
|
|
70
|
-
"@strapi/database": "5.
|
|
71
|
-
"@strapi/generators": "5.
|
|
72
|
-
"@strapi/logger": "5.
|
|
73
|
-
"@strapi/openapi": "5.
|
|
74
|
-
"@strapi/permissions": "5.
|
|
75
|
-
"@strapi/types": "5.
|
|
76
|
-
"@strapi/typescript-utils": "5.
|
|
77
|
-
"@strapi/utils": "5.
|
|
69
|
+
"@strapi/admin": "5.54.0",
|
|
70
|
+
"@strapi/database": "5.54.0",
|
|
71
|
+
"@strapi/generators": "5.54.0",
|
|
72
|
+
"@strapi/logger": "5.54.0",
|
|
73
|
+
"@strapi/openapi": "5.54.0",
|
|
74
|
+
"@strapi/permissions": "5.54.0",
|
|
75
|
+
"@strapi/types": "5.54.0",
|
|
76
|
+
"@strapi/typescript-utils": "5.54.0",
|
|
77
|
+
"@strapi/utils": "5.54.0",
|
|
78
78
|
"@vercel/stega": "0.1.2",
|
|
79
79
|
bcryptjs: "2.4.3",
|
|
80
80
|
boxen: "5.1.2",
|
|
@@ -83,6 +83,7 @@ var dependencies = {
|
|
|
83
83
|
"cli-table3": "0.6.5",
|
|
84
84
|
commander: "8.3.0",
|
|
85
85
|
configstore: "5.0.1",
|
|
86
|
+
croner: "10.0.1",
|
|
86
87
|
debug: "4.3.4",
|
|
87
88
|
delegates: "1.0.0",
|
|
88
89
|
dotenv: "16.6.1",
|
|
@@ -107,7 +108,6 @@ var dependencies = {
|
|
|
107
108
|
"koa-static": "5.0.0",
|
|
108
109
|
lodash: "4.18.1",
|
|
109
110
|
"mime-types": "2.1.35",
|
|
110
|
-
"node-schedule": "2.1.1",
|
|
111
111
|
open: "8.4.2",
|
|
112
112
|
ora: "5.4.1",
|
|
113
113
|
"package-json": "10.0.1",
|
|
@@ -138,15 +138,14 @@ var devDependencies = {
|
|
|
138
138
|
"@types/lodash": "^4.14.191",
|
|
139
139
|
"@types/mime-types": "2.1.1",
|
|
140
140
|
"@types/node": "20.19.41",
|
|
141
|
-
"@types/node-schedule": "2.1.7",
|
|
142
141
|
ajv: "8.20.0",
|
|
143
142
|
"ajv-formats": "3.0.1",
|
|
144
|
-
"eslint-config-custom": "5.
|
|
143
|
+
"eslint-config-custom": "5.54.0",
|
|
145
144
|
jest: "29.6.0",
|
|
146
145
|
supertest: "7.2.2",
|
|
147
|
-
tsconfig: "5.
|
|
146
|
+
tsconfig: "5.54.0",
|
|
148
147
|
vitest: "catalog:",
|
|
149
|
-
"vitest-config": "5.
|
|
148
|
+
"vitest-config": "5.54.0"
|
|
150
149
|
};
|
|
151
150
|
var engines = {
|
|
152
151
|
node: ">=20.0.0 <=26.x.x",
|
package/dist/package.json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/package.json.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var name = "@strapi/core";
|
|
2
|
-
var version = "5.
|
|
2
|
+
var version = "5.54.0";
|
|
3
3
|
var description = "Core of Strapi";
|
|
4
4
|
var homepage = "https://strapi.io";
|
|
5
5
|
var bugs = {
|
|
@@ -62,15 +62,15 @@ var dependencies = {
|
|
|
62
62
|
"@modelcontextprotocol/node": "2.0.0",
|
|
63
63
|
"@modelcontextprotocol/server": "2.0.0",
|
|
64
64
|
"@paralleldrive/cuid2": "2.2.2",
|
|
65
|
-
"@strapi/admin": "5.
|
|
66
|
-
"@strapi/database": "5.
|
|
67
|
-
"@strapi/generators": "5.
|
|
68
|
-
"@strapi/logger": "5.
|
|
69
|
-
"@strapi/openapi": "5.
|
|
70
|
-
"@strapi/permissions": "5.
|
|
71
|
-
"@strapi/types": "5.
|
|
72
|
-
"@strapi/typescript-utils": "5.
|
|
73
|
-
"@strapi/utils": "5.
|
|
65
|
+
"@strapi/admin": "5.54.0",
|
|
66
|
+
"@strapi/database": "5.54.0",
|
|
67
|
+
"@strapi/generators": "5.54.0",
|
|
68
|
+
"@strapi/logger": "5.54.0",
|
|
69
|
+
"@strapi/openapi": "5.54.0",
|
|
70
|
+
"@strapi/permissions": "5.54.0",
|
|
71
|
+
"@strapi/types": "5.54.0",
|
|
72
|
+
"@strapi/typescript-utils": "5.54.0",
|
|
73
|
+
"@strapi/utils": "5.54.0",
|
|
74
74
|
"@vercel/stega": "0.1.2",
|
|
75
75
|
bcryptjs: "2.4.3",
|
|
76
76
|
boxen: "5.1.2",
|
|
@@ -79,6 +79,7 @@ var dependencies = {
|
|
|
79
79
|
"cli-table3": "0.6.5",
|
|
80
80
|
commander: "8.3.0",
|
|
81
81
|
configstore: "5.0.1",
|
|
82
|
+
croner: "10.0.1",
|
|
82
83
|
debug: "4.3.4",
|
|
83
84
|
delegates: "1.0.0",
|
|
84
85
|
dotenv: "16.6.1",
|
|
@@ -103,7 +104,6 @@ var dependencies = {
|
|
|
103
104
|
"koa-static": "5.0.0",
|
|
104
105
|
lodash: "4.18.1",
|
|
105
106
|
"mime-types": "2.1.35",
|
|
106
|
-
"node-schedule": "2.1.1",
|
|
107
107
|
open: "8.4.2",
|
|
108
108
|
ora: "5.4.1",
|
|
109
109
|
"package-json": "10.0.1",
|
|
@@ -134,15 +134,14 @@ var devDependencies = {
|
|
|
134
134
|
"@types/lodash": "^4.14.191",
|
|
135
135
|
"@types/mime-types": "2.1.1",
|
|
136
136
|
"@types/node": "20.19.41",
|
|
137
|
-
"@types/node-schedule": "2.1.7",
|
|
138
137
|
ajv: "8.20.0",
|
|
139
138
|
"ajv-formats": "3.0.1",
|
|
140
|
-
"eslint-config-custom": "5.
|
|
139
|
+
"eslint-config-custom": "5.54.0",
|
|
141
140
|
jest: "29.6.0",
|
|
142
141
|
supertest: "7.2.2",
|
|
143
|
-
tsconfig: "5.
|
|
142
|
+
tsconfig: "5.54.0",
|
|
144
143
|
vitest: "catalog:",
|
|
145
|
-
"vitest-config": "5.
|
|
144
|
+
"vitest-config": "5.54.0"
|
|
146
145
|
};
|
|
147
146
|
var engines = {
|
|
148
147
|
node: ">=20.0.0 <=26.x.x",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -4,10 +4,22 @@ interface EncodingInfo {
|
|
|
4
4
|
data: any;
|
|
5
5
|
schema: Struct.Schema;
|
|
6
6
|
}
|
|
7
|
+
type BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & {
|
|
8
|
+
fieldPath: string;
|
|
9
|
+
};
|
|
10
|
+
type EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;
|
|
11
|
+
/**
|
|
12
|
+
* Pure transformation over a blocks AST. Injects one stega marker per visual block
|
|
13
|
+
* (first text leaf, or image alt text) using the blocks field path for all markers.
|
|
14
|
+
* Code blocks are skipped entirely.
|
|
15
|
+
*/
|
|
16
|
+
declare const encodeBlocks: (blocks: unknown, metadata: BlocksEncodeMetadata, encodeField: EncodeFieldFn) => unknown;
|
|
7
17
|
declare const createContentSourceMapsService: (strapi: Core.Strapi) => {
|
|
8
|
-
encodeField(text: string, { kind, model, documentId, type, path, locale }: FieldContentSourceMap): string;
|
|
18
|
+
encodeField(text: string, { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap): string;
|
|
19
|
+
encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown;
|
|
9
20
|
encodeEntry({ data, schema }: EncodingInfo): Promise<any>;
|
|
10
21
|
encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any>;
|
|
11
22
|
};
|
|
12
|
-
export { createContentSourceMapsService };
|
|
23
|
+
export { createContentSourceMapsService, encodeBlocks };
|
|
24
|
+
export type { BlocksEncodeMetadata, EncodeFieldFn };
|
|
13
25
|
//# sourceMappingURL=content-source-maps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-source-maps.d.ts","sourceRoot":"","sources":["../../src/services/content-source-maps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAO,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"content-source-maps.d.ts","sourceRoot":"","sources":["../../src/services/content-source-maps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAO,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AA0CxE,UAAU,YAAY;IACpB,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;CACvB;AAED,KAAK,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,KAAK,MAAM,CAAC;AA4G/E;;;;GAIG;AACH,QAAA,MAAM,YAAY,GAChB,QAAQ,OAAO,EACf,UAAU,oBAAoB,EAC9B,aAAa,aAAa,KACzB,OA0BF,CAAC;AAEF,QAAA,MAAM,8BAA8B,GAAI,QAAQ,IAAI,CAAC,MAAM;sBAG/C,MAAM,8DACgD,qBAAqB;yBAoC9D,OAAO,YAAY,oBAAoB,GAAG,OAAO;kCAIlC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;uCA4DtB,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;CAmBvE,CAAC;AAEF,OAAO,EAAE,8BAA8B,EAAE,YAAY,EAAE,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -34,9 +34,124 @@ const EXCLUDED_FIELDS = [
|
|
|
34
34
|
const isObject = (value)=>{
|
|
35
35
|
return typeof value === 'object' && value !== null;
|
|
36
36
|
};
|
|
37
|
+
const blocksFieldMetadata = (metadata)=>({
|
|
38
|
+
...metadata,
|
|
39
|
+
path: metadata.fieldPath,
|
|
40
|
+
type: 'blocks'
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.
|
|
44
|
+
*/ const encodeFirstTextLeaf = (node, metadata, encodeField)=>{
|
|
45
|
+
if (!isObject(node)) {
|
|
46
|
+
return {
|
|
47
|
+
node,
|
|
48
|
+
encoded: false
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (node.type === 'text' && typeof node.text === 'string') {
|
|
52
|
+
return {
|
|
53
|
+
node: {
|
|
54
|
+
...node,
|
|
55
|
+
text: encodeField(node.text, blocksFieldMetadata(metadata))
|
|
56
|
+
},
|
|
57
|
+
encoded: true
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (Array.isArray(node.children)) {
|
|
61
|
+
let encoded = false;
|
|
62
|
+
const children = node.children.map((child)=>{
|
|
63
|
+
if (encoded) {
|
|
64
|
+
return child;
|
|
65
|
+
}
|
|
66
|
+
const result = encodeFirstTextLeaf(child, metadata, encodeField);
|
|
67
|
+
encoded = result.encoded;
|
|
68
|
+
return result.node;
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
node: {
|
|
72
|
+
...node,
|
|
73
|
+
children
|
|
74
|
+
},
|
|
75
|
+
encoded
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
node,
|
|
80
|
+
encoded: false
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
const encodeListBlock = (listNode, metadata, encodeField)=>{
|
|
84
|
+
const children = listNode.children.map((child)=>{
|
|
85
|
+
if (!isObject(child)) {
|
|
86
|
+
return child;
|
|
87
|
+
}
|
|
88
|
+
if (child.type === 'list-item') {
|
|
89
|
+
return encodeFirstTextLeaf(child, metadata, encodeField).node;
|
|
90
|
+
}
|
|
91
|
+
if (child.type === 'list') {
|
|
92
|
+
return encodeListBlock(child, metadata, encodeField);
|
|
93
|
+
}
|
|
94
|
+
return child;
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
...listNode,
|
|
98
|
+
children
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
const encodeImageBlock = (imageNode, metadata, encodeField)=>{
|
|
102
|
+
if (!isObject(imageNode.image)) {
|
|
103
|
+
return imageNode;
|
|
104
|
+
}
|
|
105
|
+
const { alternativeText } = imageNode.image;
|
|
106
|
+
// Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can
|
|
107
|
+
// cause the preview highlight to expand across the entire page. The alt attribute is a
|
|
108
|
+
// safe target: it's visible to the previewScript via getAttribute and never used as a URL.
|
|
109
|
+
// Only encode when alternativeText is a non-empty string — images with no alt text get
|
|
110
|
+
// no stega marker and won't independently trigger the highlight, but the blocks field
|
|
111
|
+
// as a whole remains highlightable via its other (text) blocks.
|
|
112
|
+
if (typeof alternativeText !== 'string' || alternativeText.length === 0) {
|
|
113
|
+
return imageNode;
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
...imageNode,
|
|
117
|
+
image: {
|
|
118
|
+
...imageNode.image,
|
|
119
|
+
alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata))
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Pure transformation over a blocks AST. Injects one stega marker per visual block
|
|
125
|
+
* (first text leaf, or image alt text) using the blocks field path for all markers.
|
|
126
|
+
* Code blocks are skipped entirely.
|
|
127
|
+
*/ const encodeBlocks = (blocks, metadata, encodeField)=>{
|
|
128
|
+
if (!Array.isArray(blocks)) {
|
|
129
|
+
return blocks;
|
|
130
|
+
}
|
|
131
|
+
return blocks.map((block)=>{
|
|
132
|
+
if (!isObject(block)) {
|
|
133
|
+
return block;
|
|
134
|
+
}
|
|
135
|
+
switch(block.type){
|
|
136
|
+
case 'code':
|
|
137
|
+
// Skip encoding — encoding code content would corrupt the syntax.
|
|
138
|
+
return block;
|
|
139
|
+
case 'image':
|
|
140
|
+
return encodeImageBlock(block, metadata, encodeField);
|
|
141
|
+
case 'list':
|
|
142
|
+
return encodeListBlock(block, metadata, encodeField);
|
|
143
|
+
case 'paragraph':
|
|
144
|
+
case 'heading':
|
|
145
|
+
case 'quote':
|
|
146
|
+
return encodeFirstTextLeaf(block, metadata, encodeField).node;
|
|
147
|
+
default:
|
|
148
|
+
return block;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
};
|
|
37
152
|
const createContentSourceMapsService = (strapi)=>{
|
|
38
153
|
return {
|
|
39
|
-
encodeField (text, { kind, model, documentId, type, path, locale }) {
|
|
154
|
+
encodeField (text, { kind, model, documentId, type, path, locale, fieldPath }) {
|
|
40
155
|
/**
|
|
41
156
|
* Combine all metadata into into a one string so we only have to deal with one data-atribute
|
|
42
157
|
* on the frontend. Make it human readable because that data-attribute may be set manually by
|
|
@@ -54,11 +169,17 @@ const createContentSourceMapsService = (strapi)=>{
|
|
|
54
169
|
if (locale) {
|
|
55
170
|
strapiSource.set('locale', locale);
|
|
56
171
|
}
|
|
172
|
+
if (fieldPath) {
|
|
173
|
+
strapiSource.set('fieldPath', fieldPath);
|
|
174
|
+
}
|
|
57
175
|
const encoded = stega.vercelStegaCombine(text, {
|
|
58
176
|
strapiSource: strapiSource.toString()
|
|
59
177
|
}, false);
|
|
60
178
|
return encoded;
|
|
61
179
|
},
|
|
180
|
+
encodeBlocks (blocks, metadata) {
|
|
181
|
+
return encodeBlocks(blocks, metadata, this.encodeField.bind(this));
|
|
182
|
+
},
|
|
62
183
|
async encodeEntry ({ data, schema }) {
|
|
63
184
|
if (!isObject(data) || data === undefined) {
|
|
64
185
|
return data;
|
|
@@ -67,6 +188,17 @@ const createContentSourceMapsService = (strapi)=>{
|
|
|
67
188
|
if (!attribute || EXCLUDED_FIELDS.includes(key)) {
|
|
68
189
|
return;
|
|
69
190
|
}
|
|
191
|
+
if (attribute.type === 'blocks' && Array.isArray(value)) {
|
|
192
|
+
const fieldPath = path.rawWithIndices;
|
|
193
|
+
set(key, this.encodeBlocks(value, {
|
|
194
|
+
fieldPath,
|
|
195
|
+
kind: schema.kind,
|
|
196
|
+
model: schema.uid,
|
|
197
|
+
locale: data.locale,
|
|
198
|
+
documentId: data.documentId
|
|
199
|
+
}));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
70
202
|
if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
|
|
71
203
|
// For inner fields of a multi-media field's items (e.g. `medias.0.url`),
|
|
72
204
|
// drop the array index so all items share the same encoded path. The
|
|
@@ -113,4 +245,5 @@ const createContentSourceMapsService = (strapi)=>{
|
|
|
113
245
|
};
|
|
114
246
|
|
|
115
247
|
exports.createContentSourceMapsService = createContentSourceMapsService;
|
|
248
|
+
exports.encodeBlocks = encodeBlocks;
|
|
116
249
|
//# sourceMappingURL=content-source-maps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-source-maps.js","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'biginteger',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'boolean',\n 'enumeration',\n 'json',\n 'media',\n 'email',\n 'password',\n /**\n * We cannot modify the response shape, so types that aren't based on string cannot be encoded:\n * - json: object\n * - blocks: object, will require a custom implementation in a dedicated PR\n * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n */\n];\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\ninterface EncodingInfo {\n data: any;\n schema: Struct.Schema;\n}\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (!isObject(data) || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n }\n },\n {\n schema,\n getModel: (uid) => strapi.getModel(uid as UID.Schema),\n },\n data\n );\n },\n\n async encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any> {\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, schema }))\n );\n }\n\n if (!isObject(data)) {\n return data;\n }\n\n return await this.encodeEntry({ data, schema });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","createContentSourceMapsService","strapi","encodeField","text","kind","model","documentId","type","path","locale","strapiSource","URLSearchParams","set","encoded","vercelStegaCombine","toString","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","includes","parentAttr","isInsideMultiMedia","multiple","encodedPath","rawWithIndices","uid","getModel","encodeSourceMaps","Array","isArray","Promise","all","map","item","error","log"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-source-maps.js","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'biginteger',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'boolean',\n 'enumeration',\n 'json',\n 'media',\n 'email',\n 'password',\n /**\n * We cannot modify the response shape, so types that aren't based on string cannot be encoded:\n * - json: object\n * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n *\n * The blocks type is an array of nodes — handled in a dedicated branch below\n * because it requires walking the AST to encode the first text leaf of each visual block.\n */\n];\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\ninterface EncodingInfo {\n data: any;\n schema: Struct.Schema;\n}\n\ntype BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & { fieldPath: string };\n\ntype EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst blocksFieldMetadata = (metadata: BlocksEncodeMetadata): FieldContentSourceMap => ({\n ...metadata,\n path: metadata.fieldPath,\n type: 'blocks',\n});\n\n/**\n * Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.\n */\nconst encodeFirstTextLeaf = (\n node: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): { node: unknown; encoded: boolean } => {\n if (!isObject(node)) {\n return { node, encoded: false };\n }\n\n if (node.type === 'text' && typeof node.text === 'string') {\n return {\n node: {\n ...node,\n text: encodeField(node.text, blocksFieldMetadata(metadata)),\n },\n encoded: true,\n };\n }\n\n if (Array.isArray(node.children)) {\n let encoded = false;\n const children = node.children.map((child) => {\n if (encoded) {\n return child;\n }\n\n const result = encodeFirstTextLeaf(child, metadata, encodeField);\n encoded = result.encoded;\n return result.node;\n });\n\n return {\n node: { ...node, children },\n encoded,\n };\n }\n\n return { node, encoded: false };\n};\n\nconst encodeListBlock = (\n listNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n const children = (listNode.children as unknown[]).map((child) => {\n if (!isObject(child)) {\n return child;\n }\n\n if (child.type === 'list-item') {\n return encodeFirstTextLeaf(child, metadata, encodeField).node;\n }\n\n if (child.type === 'list') {\n return encodeListBlock(child, metadata, encodeField);\n }\n\n return child;\n });\n\n return { ...listNode, children };\n};\n\nconst encodeImageBlock = (\n imageNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n if (!isObject(imageNode.image)) {\n return imageNode;\n }\n\n const { alternativeText } = imageNode.image as Record<string, unknown>;\n // Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can\n // cause the preview highlight to expand across the entire page. The alt attribute is a\n // safe target: it's visible to the previewScript via getAttribute and never used as a URL.\n // Only encode when alternativeText is a non-empty string — images with no alt text get\n // no stega marker and won't independently trigger the highlight, but the blocks field\n // as a whole remains highlightable via its other (text) blocks.\n if (typeof alternativeText !== 'string' || alternativeText.length === 0) {\n return imageNode;\n }\n\n return {\n ...imageNode,\n image: {\n ...(imageNode.image as Record<string, unknown>),\n alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata)),\n },\n };\n};\n\n/**\n * Pure transformation over a blocks AST. Injects one stega marker per visual block\n * (first text leaf, or image alt text) using the blocks field path for all markers.\n * Code blocks are skipped entirely.\n */\nconst encodeBlocks = (\n blocks: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): unknown => {\n if (!Array.isArray(blocks)) {\n return blocks;\n }\n\n return blocks.map((block) => {\n if (!isObject(block)) {\n return block;\n }\n\n switch (block.type) {\n case 'code':\n // Skip encoding — encoding code content would corrupt the syntax.\n return block;\n case 'image':\n return encodeImageBlock(block, metadata, encodeField);\n case 'list':\n return encodeListBlock(block, metadata, encodeField);\n case 'paragraph':\n case 'heading':\n case 'quote':\n return encodeFirstTextLeaf(block, metadata, encodeField).node;\n default:\n return block;\n }\n });\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n if (fieldPath) {\n strapiSource.set('fieldPath', fieldPath);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown {\n return encodeBlocks(blocks, metadata, this.encodeField.bind(this));\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (!isObject(data) || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (attribute.type === 'blocks' && Array.isArray(value)) {\n const fieldPath = path.rawWithIndices!;\n set(\n key,\n this.encodeBlocks(value, {\n fieldPath,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n }\n },\n {\n schema,\n getModel: (uid) => strapi.getModel(uid as UID.Schema),\n },\n data\n );\n },\n\n async encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any> {\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, schema }))\n );\n }\n\n if (!isObject(data)) {\n return data;\n }\n\n return await this.encodeEntry({ data, schema });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService, encodeBlocks };\nexport type { BlocksEncodeMetadata, EncodeFieldFn };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","blocksFieldMetadata","metadata","path","fieldPath","type","encodeFirstTextLeaf","node","encodeField","encoded","text","Array","isArray","children","map","child","result","encodeListBlock","listNode","encodeImageBlock","imageNode","image","alternativeText","length","encodeBlocks","blocks","block","createContentSourceMapsService","strapi","kind","model","documentId","locale","strapiSource","URLSearchParams","set","vercelStegaCombine","toString","bind","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","includes","rawWithIndices","uid","parentAttr","isInsideMultiMedia","multiple","encodedPath","getModel","encodeSourceMaps","Promise","all","item","error","log"],"mappings":"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"}
|