@strapi/utils 5.51.2 → 5.52.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/content-types.d.ts.map +1 -1
- package/dist/content-types.js +39 -2
- package/dist/content-types.js.map +1 -1
- package/dist/content-types.mjs +39 -2
- package/dist/content-types.mjs.map +1 -1
- package/dist/convert-query-params.js +4 -4
- package/dist/convert-query-params.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/parse-type.d.ts +13 -0
- package/dist/parse-type.d.ts.map +1 -1
- package/dist/parse-type.js +42 -13
- package/dist/parse-type.js.map +1 -1
- package/dist/parse-type.mjs +39 -13
- package/dist/parse-type.mjs.map +1 -1
- package/dist/sanitize/sanitizers.d.ts.map +1 -1
- package/dist/sanitize/sanitizers.js +5 -3
- package/dist/sanitize/sanitizers.js.map +1 -1
- package/dist/sanitize/sanitizers.mjs +5 -3
- package/dist/sanitize/sanitizers.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.d.ts.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.js +128 -86
- package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.mjs +128 -86
- package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -1
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js +9 -1
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs +9 -1
- package/dist/traverse-entity.mjs.map +1 -1
- package/dist/validate/validators.js +12 -19
- package/dist/validate/validators.js.map +1 -1
- package/dist/validate/validators.mjs +13 -20
- package/dist/validate/validators.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../src/content-types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../src/content-types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,KAAK,EACL,IAAI,EACJ,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACb,MAAM,SAAS,CAAC;AAgBjB,QAAA,MAAM,SAAS;;;;;;;;;;;CAWd,CAAC;AAEF,6GAA6G;AAC7G,QAAA,MAAM,SAAS,EAAE,MAAM,EAAqC,CAAC;AAC7D,gEAAgE;AAChE,QAAA,MAAM,aAAa,EAAE,MAAM,EAAe,CAAC;AAC3C,2EAA2E;AAC3E,QAAA,MAAM,iBAAiB,EAAE,MAAM,EAAoB,CAAC;AACpD,mEAAmE;AACnE,QAAA,MAAM,uBAAuB,EAAE,MAAM,EAAgD,CAAC;AAEtF;;;GAGG;AAEH,QAAA,MAAM,wBAAwB,EAAE,MAAM,EA4BrC,CAAC;AAEF;;;GAGG;AAEH,QAAA,MAAM,sCAAsC,EAAE,MAAM,EAAe,CAAC;AAEpE,2FAA2F;AAE3F,QAAA,MAAM,oBAAoB,EAAE,MAAM,EAajC,CAAC;AAaF,UAAU,8BAA8B;IACtC,uGAAuG;IACvG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAGD,QAAA,MAAM,uBAAuB,GAC3B,MAAM,MAAM,EACZ,sBAA4B,8BAAmC,KAC9D,OAeF,CAAC;AAGF,QAAA,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,OAE3C,CAAC;AAEF,QAAA,MAAM,yBAAyB,GAAI,uBAEhC,8BAAmC,KAAG,MAAM,EAI9C,CAAC;AAEF,QAAA,MAAM,qBAAqB,QAAO,MAAM,EAA+B,CAAC;AAExE,QAAA,MAAM,yCAAyC,GAAI,gBAAgB,QAAQ,CAAC,MAAM,CAAC,KAAG,MAAM,EAI3F,CAAC;AAEF,QAAA,MAAM,0CAA0C,GAAI,KAAK,MAAM,EAAE,eAAe,MAAM,KAAG,MAC8J,CAAC;AAExP,QAAA,MAAM,sCAAsC,GAAI,gBAAgB,MAAM,EAAE,KAAG,MAC0E,CAAC;AAEtJ,QAAA,MAAM,aAAa,GAAI,OAAO,KAAK,aAYlC,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAI,OAAO,KAAK,aAYrC,CAAC;AAEF,QAAA,MAAM,wBAAwB,GAAI,OAAO,KAAK,aAe7C,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,OAAO,KAAK,aAI1C,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,OAAO,KAAK,EAAE,eAAe,MAAM,YAE/D,CAAC;AAEF,QAAA,MAAM,uBAAuB,GAAI,OAAO,KAAK,aAc5C,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAI,OAAO,KAAK,aAEzC,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,OAAO,KAAK,EAAE,eAAe,MAAM,YAE9D,CAAC;AAEF,QAAA,MAAM,UAAU,GAAI,OAAO,KAAK;;;;;;;EACmC,CAAC;AAEpE,QAAA,MAAM,kBAAkB,GAAI,OAAO,KAAK,YACiB,CAAC;AAE1D,QAAA,MAAM,wBAAwB,GAAI,OAAO,KAAK,QAEnB,CAAC;AAE5B,QAAA,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,YACmB,CAAC;AAE5E,QAAA,MAAM,QAAQ,GAAI,MAAM,OAAO,KAAG,IAAI,IAAI,KAQzC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,MAAM,OAAO,KAAG,IAAI,IAAI,KAAK,GAAG;IAAE,SAAS,EAAE,WAAW,CAAA;CAElF,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,MAAM,OAAO,KAAG,IAAI,IAAI,KAAK,GAAG;IAAE,SAAS,EAAE,aAAa,CAAA;CAEtF,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI;;CAA0B,YAAyB,CAAC;AAC1E,QAAA,MAAM,gBAAgB,GAAI;;CAA0B,YAA6B,CAAC;AAClF,QAAA,MAAM,MAAM,GAAI,MAAM,IAAI,MAAM,OAAO,KAAK,YAAwB,CAAC;AAsDrE,QAAA,MAAM,oBAAoB,GAAI,OAAO,KAAK,aAKzC,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,OAAO,KAAK,EAAE,eAAe,MAAM,YAS9D,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,YAAY,SAAS,wBAE/C,CAAC;AAEF,QAAA,MAAM,iCAAiC,GAAI,WAAW,SAAS,QAS9D,CAAC;AACF,QAAA,MAAM,gBAAgB,GAAI,YAAY,SAAS,YAAgC,CAAC;AAChF,QAAA,MAAM,qBAAqB,GAAI,YAAY,SAAS,KAAG,SAAS,IAAI,mBACpC,CAAC;AAGjC,QAAA,MAAM,qBAAqB,GAAI,YAAY,SAAS,YACsC,CAAC;AAE3F,QAAA,MAAM,oBAAoB,GACxB,YAAY,SAAS,KACpB,SAAS,IAAI,kBAAkB,GAAG,oBACiC,CAAC;AAEvE,QAAA,MAAM,sBAAsB,GAAI,YAAY,SAAS,KAAG,SAAS,IAAI,oBACpB,CAAC;AAClD,QAAA,MAAM,4BAA4B,GAAI,YAAY,SAAS,YAI1D,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,QAAQ,KAAK,aAS5C,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,QAAQ,KAAK,aASxC,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,QAAQ,KAAK,aASzC,CAAC;AAEF,QAAA,MAAM,uBAAuB,GAAI,QAAQ,KAAK,aAS7C,CAAC;AAEF;;;;GAIG;AACH,QAAA,MAAM,gBAAgB,GAAI,WAAW,SAAS,EAAE,MAAM,MAAM,YAE3D,CAAC;AAEF;;;;GAIG;AACH,QAAA,MAAM,yBAAyB,GAAI,aAAa,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,WAI1E,CAAC;AAEF,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,4BAA4B,EAC5B,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,sCAAsC,EACtC,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,yCAAyC,EACzC,0CAA0C,EAC1C,sCAAsC,EACtC,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,yBAAyB,EACzB,iCAAiC,GAClC,CAAC"}
|
package/dist/content-types.js
CHANGED
|
@@ -209,7 +209,42 @@ const isContentTypeSchema = (data)=>{
|
|
|
209
209
|
const isSingleType = ({ kind = COLLECTION_TYPE })=>kind === SINGLE_TYPE;
|
|
210
210
|
const isCollectionType = ({ kind = COLLECTION_TYPE })=>kind === COLLECTION_TYPE;
|
|
211
211
|
const isKind = (kind)=>(model)=>model.kind === kind;
|
|
212
|
-
|
|
212
|
+
/**
|
|
213
|
+
* Memo of each model's "stored" private attributes — those declared in
|
|
214
|
+
* `api.responses.privateAttributes` config or in the model's `options.privateAttributes`,
|
|
215
|
+
* as opposed to attributes flagged `private: true` individually.
|
|
216
|
+
*
|
|
217
|
+
* `isPrivateAttribute` is called once per key, per node, per traversal, per entity, and
|
|
218
|
+
* recomputing this set every time dominated response sanitization: a 25-entity page made
|
|
219
|
+
* 48,605 calls, each doing two lodash path lookups plus a fresh `union()` allocation, all
|
|
220
|
+
* returning the same answer.
|
|
221
|
+
*
|
|
222
|
+
* Keyed on the model object rather than its uid, so a rebuilt schema is a distinct key and
|
|
223
|
+
* the entry cannot go stale. Deliberately NOT stored on the schema itself: a
|
|
224
|
+
* `privateAttributes` getter used to live there and was removed in 2023 (2fa8f30371)
|
|
225
|
+
* because it polluted schema serialization, and because it was only ever attached by
|
|
226
|
+
* `createContentType`, so components never got one.
|
|
227
|
+
*
|
|
228
|
+
* Both inputs are fixed for a model's lifetime — `api.responses.privateAttributes` is
|
|
229
|
+
* boot configuration and is never written at runtime, and `options.privateAttributes`
|
|
230
|
+
* comes from the schema definition. The cache is only populated once `strapi.config` is
|
|
231
|
+
* available so that a lookup during early boot cannot record an empty set permanently.
|
|
232
|
+
*/ const storedPrivateAttributesCache = new WeakMap();
|
|
233
|
+
const computeStoredPrivateAttributes = (model)=>new Set(fp.union(strapi?.config?.get('api.responses.privateAttributes', []) ?? [], fp.getOr([], 'options.privateAttributes', model)));
|
|
234
|
+
const getStoredPrivateAttributesSet = (model)=>{
|
|
235
|
+
const cacheable = typeof model === 'object' && model !== null && strapi?.config != null;
|
|
236
|
+
if (!cacheable) {
|
|
237
|
+
return computeStoredPrivateAttributes(model);
|
|
238
|
+
}
|
|
239
|
+
let cached = storedPrivateAttributesCache.get(model);
|
|
240
|
+
if (cached === undefined) {
|
|
241
|
+
cached = computeStoredPrivateAttributes(model);
|
|
242
|
+
storedPrivateAttributesCache.set(model, cached);
|
|
243
|
+
}
|
|
244
|
+
return cached;
|
|
245
|
+
};
|
|
246
|
+
// Set iteration order is insertion order, which matches what `union` returned before.
|
|
247
|
+
const getStoredPrivateAttributes = (model)=>Array.from(getStoredPrivateAttributesSet(model));
|
|
213
248
|
const getPrivateAttributes = (model)=>{
|
|
214
249
|
return ___default.default.union(getStoredPrivateAttributes(model), ___default.default.keys(___default.default.pickBy(model.attributes, (attr)=>!!attr.private)));
|
|
215
250
|
};
|
|
@@ -217,7 +252,9 @@ const isPrivateAttribute = (model, attributeName)=>{
|
|
|
217
252
|
if (model?.attributes?.[attributeName]?.private === true) {
|
|
218
253
|
return true;
|
|
219
254
|
}
|
|
220
|
-
|
|
255
|
+
const storedPrivateAttributes = getStoredPrivateAttributesSet(model);
|
|
256
|
+
// The set is empty for the overwhelming majority of models, so check size before hashing.
|
|
257
|
+
return storedPrivateAttributes.size !== 0 && storedPrivateAttributes.has(attributeName);
|
|
221
258
|
};
|
|
222
259
|
const isScalarAttribute = (attribute)=>{
|
|
223
260
|
return attribute && ![
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.js","sources":["../src/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, getOr, union, snakeCase } from 'lodash/fp';\nimport type {\n Model,\n Kind,\n Attribute,\n RelationalAttribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n WithRequired,\n} from './types';\n\nconst SINGLE_TYPE = 'singleType';\nconst COLLECTION_TYPE = 'collectionType';\n\nconst ID_ATTRIBUTE = 'id';\nconst DOC_ID_ATTRIBUTE = 'documentId';\n\nconst PUBLISHED_AT_ATTRIBUTE = 'publishedAt';\nconst FIRST_PUBLISHED_AT_ATTRIBUTE = 'firstPublishedAt';\nconst CREATED_BY_ATTRIBUTE = 'createdBy';\nconst UPDATED_BY_ATTRIBUTE = 'updatedBy';\n\nconst CREATED_AT_ATTRIBUTE = 'createdAt';\nconst UPDATED_AT_ATTRIBUTE = 'updatedAt';\n\nconst constants = {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n SINGLE_TYPE,\n COLLECTION_TYPE,\n};\n\n/** ID-like fields accepted at root level and on relations/media/components (validate/sanitize traversal). */\nconst ID_FIELDS: string[] = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n/** Keys accepted on morphTo relation payloads (e.g. __type). */\nconst MORPH_TO_KEYS: string[] = ['__type'];\n/** Keys accepted on dynamic zone component payloads (e.g. __component). */\nconst DYNAMIC_ZONE_KEYS: string[] = ['__component'];\n/** Relation operation keys (connect, disconnect, set, options). */\nconst RELATION_OPERATION_KEYS: string[] = ['connect', 'disconnect', 'set', 'options'];\n\n/**\n * Reserved attribute names that cannot be used by user-defined content-type fields.\n * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES: string[] = [\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n // V6: we will need to add first_published_at when it becomes the default behaviour\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n/**\n * Reserved attribute names that only conflict when draftAndPublish is enabled.\n * `status` is the v5 Document Service / REST query parameter for draft/published filtering.\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH: string[] = ['status'];\n\n/** Reserved model (collection) names that cannot be used by user-defined content-types. */\n// use snake_case\nconst RESERVED_MODEL_NAMES: string[] = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nconst matchesReservedName = (snakeCaseName: string, list: string[]): boolean => {\n if (list.includes(snakeCaseName)) {\n return true;\n }\n\n return list\n .filter((entry) => entry.endsWith('*'))\n .map((entry) => entry.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix));\n};\n\ninterface IsReservedAttributeNameOptions {\n /** When true, draft-and-publish-specific names (e.g. `status`) are also reserved. Defaults to true. */\n draftAndPublish?: boolean;\n}\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedAttributeName = (\n name: string,\n { draftAndPublish = true }: IsReservedAttributeNameOptions = {}\n): boolean => {\n const snakeCaseName = snakeCase(name);\n\n if (matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES)) {\n return true;\n }\n\n if (\n draftAndPublish &&\n matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedModelName = (name: string): boolean => {\n return matchesReservedName(snakeCase(name), RESERVED_MODEL_NAMES);\n};\n\nconst getReservedAttributeNames = ({\n draftAndPublish = true,\n}: IsReservedAttributeNameOptions = {}): string[] => {\n return draftAndPublish\n ? [...RESERVED_ATTRIBUTE_NAMES, ...RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH]\n : [...RESERVED_ATTRIBUTE_NAMES];\n};\n\nconst getReservedModelNames = (): string[] => [...RESERVED_MODEL_NAMES];\n\nconst findDraftAndPublishReservedAttributeNames = (attributeNames: Iterable<string>): string[] => {\n return [...attributeNames].filter((name) =>\n matchesReservedName(snakeCase(name), RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n );\n};\n\nconst getDraftAndPublishReservedAttributeWarning = (uid: string, attributeName: string): string =>\n `The attribute name '${attributeName}' on content type '${uid}' is reserved when 'draftAndPublish' is enabled. It conflicts with the Document Service / REST 'status' query parameter. Rename the attribute or disable the 'draftAndPublish' option.`;\n\nconst getDraftAndPublishEnableBlockedMessage = (attributeNames: string[]): string =>\n `Cannot enable draft and publish while the following attribute names are reserved: ${attributeNames.join(', ')}. Rename them or remove them first.`;\n\nconst getTimestamps = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_AT_ATTRIBUTE);\n }\n\n if (has(UPDATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_AT_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getCreatorFields = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_BY_ATTRIBUTE);\n }\n\n if (has(UPDATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_BY_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getNonWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n const nonWritableAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.writable === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonWritableAttributes,\n ]);\n};\n\nconst getWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n return _.difference(Object.keys(model.attributes), getNonWritableAttributes(model));\n};\n\nconst isWritableAttribute = (model: Model, attributeName: string) => {\n return getWritableAttributes(model).includes(attributeName);\n};\n\nconst getNonVisibleAttributes = (model: Model) => {\n const nonVisibleAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.visible === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonVisibleAttributes,\n ]);\n};\n\nconst getVisibleAttributes = (model: Model) => {\n return _.difference(_.keys(model.attributes), getNonVisibleAttributes(model));\n};\n\nconst isVisibleAttribute = (model: Model, attributeName: string) => {\n return getVisibleAttributes(model).includes(attributeName);\n};\n\nconst getOptions = (model: Model) =>\n _.assign({ draftAndPublish: false }, _.get(model, 'options', {}));\n\nconst hasDraftAndPublish = (model: Model) =>\n _.get(model, 'options.draftAndPublish', false) === true;\n\nconst hasFirstPublishedAtField = (model: Model) =>\n strapi.config.get('features.future.experimental_firstPublishedAt', false) &&\n hasDraftAndPublish(model);\n\nconst isDraft = <T extends object>(data: T, model: Model) =>\n hasDraftAndPublish(model) && _.get(data, PUBLISHED_AT_ATTRIBUTE) === null;\n\nconst isSchema = (data: unknown): data is Model => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'modelType' in data &&\n typeof data.modelType === 'string' &&\n ['component', 'contentType'].includes(data.modelType)\n );\n};\n\nconst isComponentSchema = (data: unknown): data is Model & { modelType: 'component' } => {\n return isSchema(data) && data.modelType === 'component';\n};\n\nconst isContentTypeSchema = (data: unknown): data is Model & { modelType: 'contentType' } => {\n return isSchema(data) && data.modelType === 'contentType';\n};\n\nconst isSingleType = ({ kind = COLLECTION_TYPE }) => kind === SINGLE_TYPE;\nconst isCollectionType = ({ kind = COLLECTION_TYPE }) => kind === COLLECTION_TYPE;\nconst isKind = (kind: Kind) => (model: Model) => model.kind === kind;\n\nconst getStoredPrivateAttributes = (model: Model) =>\n union(\n (strapi?.config?.get('api.responses.privateAttributes', []) ?? []) as Array<string>,\n getOr([], 'options.privateAttributes', model)\n );\n\nconst getPrivateAttributes = (model: Model) => {\n return _.union(\n getStoredPrivateAttributes(model),\n _.keys(_.pickBy(model.attributes, (attr) => !!attr.private))\n );\n};\n\nconst isPrivateAttribute = (model: Model, attributeName: string) => {\n if (model?.attributes?.[attributeName]?.private === true) {\n return true;\n }\n return getStoredPrivateAttributes(model).includes(attributeName);\n};\n\nconst isScalarAttribute = (attribute?: Attribute) => {\n return attribute && !['media', 'component', 'relation', 'dynamiczone'].includes(attribute.type);\n};\n\nconst getDoesAttributeRequireValidation = (attribute: Attribute) => {\n return (\n attribute.required ||\n attribute.unique ||\n Object.prototype.hasOwnProperty.call(attribute, 'max') ||\n Object.prototype.hasOwnProperty.call(attribute, 'min') ||\n Object.prototype.hasOwnProperty.call(attribute, 'maxLength') ||\n Object.prototype.hasOwnProperty.call(attribute, 'minLength')\n );\n};\nconst isMediaAttribute = (attribute?: Attribute) => attribute?.type === 'media';\nconst isRelationalAttribute = (attribute?: Attribute): attribute is RelationalAttribute =>\n attribute?.type === 'relation';\n\nconst HAS_RELATION_REORDERING = ['manyToMany', 'manyToOne', 'oneToMany'];\nconst hasRelationReordering = (attribute?: Attribute) =>\n isRelationalAttribute(attribute) && HAS_RELATION_REORDERING.includes(attribute.relation);\n\nconst isComponentAttribute = (\n attribute?: Attribute\n): attribute is ComponentAttribute | DynamicZoneAttribute =>\n !!attribute && ['component', 'dynamiczone'].includes(attribute.type);\n\nconst isDynamicZoneAttribute = (attribute?: Attribute): attribute is DynamicZoneAttribute =>\n !!attribute && attribute.type === 'dynamiczone';\nconst isMorphToRelationalAttribute = (attribute?: Attribute) => {\n return (\n !!attribute && isRelationalAttribute(attribute) && attribute.relation?.startsWith?.('morphTo')\n );\n};\n\nconst getComponentAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isComponentAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getMediaAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isMediaAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getScalarAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isScalarAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getRelationalAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isRelationalAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\n/**\n * Checks if an attribute is of type `type`\n * @param {object} attribute\n * @param {string} type\n */\nconst isTypedAttribute = (attribute: Attribute, type: string) => {\n return _.has(attribute, 'type') && attribute.type === type;\n};\n\n/**\n * Returns a route prefix for a contentType\n * @param {object} contentType\n * @returns {string}\n */\nconst getContentTypeRoutePrefix = (contentType: WithRequired<Model, 'info'>) => {\n return isSingleType(contentType)\n ? _.kebabCase(contentType.info.singularName)\n : _.kebabCase(contentType.info.pluralName);\n};\n\nexport {\n isSchema,\n isContentTypeSchema,\n isComponentSchema,\n isScalarAttribute,\n isMediaAttribute,\n isRelationalAttribute,\n hasRelationReordering,\n isComponentAttribute,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isTypedAttribute,\n getPrivateAttributes,\n isPrivateAttribute,\n constants,\n ID_FIELDS,\n MORPH_TO_KEYS,\n DYNAMIC_ZONE_KEYS,\n RELATION_OPERATION_KEYS,\n RESERVED_ATTRIBUTE_NAMES,\n RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH,\n RESERVED_MODEL_NAMES,\n isReservedAttributeName,\n isReservedModelName,\n getReservedAttributeNames,\n getReservedModelNames,\n findDraftAndPublishReservedAttributeNames,\n getDraftAndPublishReservedAttributeWarning,\n getDraftAndPublishEnableBlockedMessage,\n getNonWritableAttributes,\n getComponentAttributes,\n getMediaAttributes,\n getScalarAttributes,\n getRelationalAttributes,\n getWritableAttributes,\n isWritableAttribute,\n getNonVisibleAttributes,\n getVisibleAttributes,\n getTimestamps,\n getCreatorFields,\n isVisibleAttribute,\n getOptions,\n isDraft,\n hasDraftAndPublish,\n hasFirstPublishedAtField,\n isSingleType,\n isCollectionType,\n isKind,\n getContentTypeRoutePrefix,\n getDoesAttributeRequireValidation,\n};\n"],"names":["SINGLE_TYPE","COLLECTION_TYPE","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","constants","ID_FIELDS","MORPH_TO_KEYS","DYNAMIC_ZONE_KEYS","RELATION_OPERATION_KEYS","RESERVED_ATTRIBUTE_NAMES","RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH","RESERVED_MODEL_NAMES","matchesReservedName","snakeCaseName","list","includes","filter","entry","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName","name","draftAndPublish","snakeCase","isReservedModelName","getReservedAttributeNames","getReservedModelNames","findDraftAndPublishReservedAttributeNames","attributeNames","getDraftAndPublishReservedAttributeWarning","uid","attributeName","getDraftAndPublishEnableBlockedMessage","join","getTimestamps","model","attributes","has","push","getCreatorFields","getNonWritableAttributes","nonWritableAttributes","_","reduce","acc","attr","attrName","writable","concat","uniq","getWritableAttributes","difference","Object","keys","isWritableAttribute","getNonVisibleAttributes","nonVisibleAttributes","visible","getVisibleAttributes","isVisibleAttribute","getOptions","assign","get","hasDraftAndPublish","hasFirstPublishedAtField","strapi","config","isDraft","data","isSchema","modelType","isComponentSchema","isContentTypeSchema","isSingleType","kind","isCollectionType","isKind","getStoredPrivateAttributes","union","getOr","getPrivateAttributes","pickBy","private","isPrivateAttribute","isScalarAttribute","attribute","type","getDoesAttributeRequireValidation","required","unique","prototype","hasOwnProperty","call","isMediaAttribute","isRelationalAttribute","HAS_RELATION_REORDERING","hasRelationReordering","relation","isComponentAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","getComponentAttributes","schema","getMediaAttributes","getScalarAttributes","getRelationalAttributes","isTypedAttribute","getContentTypeRoutePrefix","contentType","kebabCase","info","singularName","pluralName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-types.js","sources":["../src/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, getOr, union, snakeCase } from 'lodash/fp';\nimport type {\n Model,\n Kind,\n Attribute,\n RelationalAttribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n WithRequired,\n} from './types';\n\nconst SINGLE_TYPE = 'singleType';\nconst COLLECTION_TYPE = 'collectionType';\n\nconst ID_ATTRIBUTE = 'id';\nconst DOC_ID_ATTRIBUTE = 'documentId';\n\nconst PUBLISHED_AT_ATTRIBUTE = 'publishedAt';\nconst FIRST_PUBLISHED_AT_ATTRIBUTE = 'firstPublishedAt';\nconst CREATED_BY_ATTRIBUTE = 'createdBy';\nconst UPDATED_BY_ATTRIBUTE = 'updatedBy';\n\nconst CREATED_AT_ATTRIBUTE = 'createdAt';\nconst UPDATED_AT_ATTRIBUTE = 'updatedAt';\n\nconst constants = {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n SINGLE_TYPE,\n COLLECTION_TYPE,\n};\n\n/** ID-like fields accepted at root level and on relations/media/components (validate/sanitize traversal). */\nconst ID_FIELDS: string[] = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n/** Keys accepted on morphTo relation payloads (e.g. __type). */\nconst MORPH_TO_KEYS: string[] = ['__type'];\n/** Keys accepted on dynamic zone component payloads (e.g. __component). */\nconst DYNAMIC_ZONE_KEYS: string[] = ['__component'];\n/** Relation operation keys (connect, disconnect, set, options). */\nconst RELATION_OPERATION_KEYS: string[] = ['connect', 'disconnect', 'set', 'options'];\n\n/**\n * Reserved attribute names that cannot be used by user-defined content-type fields.\n * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES: string[] = [\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n // V6: we will need to add first_published_at when it becomes the default behaviour\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n/**\n * Reserved attribute names that only conflict when draftAndPublish is enabled.\n * `status` is the v5 Document Service / REST query parameter for draft/published filtering.\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH: string[] = ['status'];\n\n/** Reserved model (collection) names that cannot be used by user-defined content-types. */\n// use snake_case\nconst RESERVED_MODEL_NAMES: string[] = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nconst matchesReservedName = (snakeCaseName: string, list: string[]): boolean => {\n if (list.includes(snakeCaseName)) {\n return true;\n }\n\n return list\n .filter((entry) => entry.endsWith('*'))\n .map((entry) => entry.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix));\n};\n\ninterface IsReservedAttributeNameOptions {\n /** When true, draft-and-publish-specific names (e.g. `status`) are also reserved. Defaults to true. */\n draftAndPublish?: boolean;\n}\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedAttributeName = (\n name: string,\n { draftAndPublish = true }: IsReservedAttributeNameOptions = {}\n): boolean => {\n const snakeCaseName = snakeCase(name);\n\n if (matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES)) {\n return true;\n }\n\n if (\n draftAndPublish &&\n matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedModelName = (name: string): boolean => {\n return matchesReservedName(snakeCase(name), RESERVED_MODEL_NAMES);\n};\n\nconst getReservedAttributeNames = ({\n draftAndPublish = true,\n}: IsReservedAttributeNameOptions = {}): string[] => {\n return draftAndPublish\n ? [...RESERVED_ATTRIBUTE_NAMES, ...RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH]\n : [...RESERVED_ATTRIBUTE_NAMES];\n};\n\nconst getReservedModelNames = (): string[] => [...RESERVED_MODEL_NAMES];\n\nconst findDraftAndPublishReservedAttributeNames = (attributeNames: Iterable<string>): string[] => {\n return [...attributeNames].filter((name) =>\n matchesReservedName(snakeCase(name), RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n );\n};\n\nconst getDraftAndPublishReservedAttributeWarning = (uid: string, attributeName: string): string =>\n `The attribute name '${attributeName}' on content type '${uid}' is reserved when 'draftAndPublish' is enabled. It conflicts with the Document Service / REST 'status' query parameter. Rename the attribute or disable the 'draftAndPublish' option.`;\n\nconst getDraftAndPublishEnableBlockedMessage = (attributeNames: string[]): string =>\n `Cannot enable draft and publish while the following attribute names are reserved: ${attributeNames.join(', ')}. Rename them or remove them first.`;\n\nconst getTimestamps = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_AT_ATTRIBUTE);\n }\n\n if (has(UPDATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_AT_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getCreatorFields = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_BY_ATTRIBUTE);\n }\n\n if (has(UPDATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_BY_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getNonWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n const nonWritableAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.writable === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonWritableAttributes,\n ]);\n};\n\nconst getWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n return _.difference(Object.keys(model.attributes), getNonWritableAttributes(model));\n};\n\nconst isWritableAttribute = (model: Model, attributeName: string) => {\n return getWritableAttributes(model).includes(attributeName);\n};\n\nconst getNonVisibleAttributes = (model: Model) => {\n const nonVisibleAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.visible === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonVisibleAttributes,\n ]);\n};\n\nconst getVisibleAttributes = (model: Model) => {\n return _.difference(_.keys(model.attributes), getNonVisibleAttributes(model));\n};\n\nconst isVisibleAttribute = (model: Model, attributeName: string) => {\n return getVisibleAttributes(model).includes(attributeName);\n};\n\nconst getOptions = (model: Model) =>\n _.assign({ draftAndPublish: false }, _.get(model, 'options', {}));\n\nconst hasDraftAndPublish = (model: Model) =>\n _.get(model, 'options.draftAndPublish', false) === true;\n\nconst hasFirstPublishedAtField = (model: Model) =>\n strapi.config.get('features.future.experimental_firstPublishedAt', false) &&\n hasDraftAndPublish(model);\n\nconst isDraft = <T extends object>(data: T, model: Model) =>\n hasDraftAndPublish(model) && _.get(data, PUBLISHED_AT_ATTRIBUTE) === null;\n\nconst isSchema = (data: unknown): data is Model => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'modelType' in data &&\n typeof data.modelType === 'string' &&\n ['component', 'contentType'].includes(data.modelType)\n );\n};\n\nconst isComponentSchema = (data: unknown): data is Model & { modelType: 'component' } => {\n return isSchema(data) && data.modelType === 'component';\n};\n\nconst isContentTypeSchema = (data: unknown): data is Model & { modelType: 'contentType' } => {\n return isSchema(data) && data.modelType === 'contentType';\n};\n\nconst isSingleType = ({ kind = COLLECTION_TYPE }) => kind === SINGLE_TYPE;\nconst isCollectionType = ({ kind = COLLECTION_TYPE }) => kind === COLLECTION_TYPE;\nconst isKind = (kind: Kind) => (model: Model) => model.kind === kind;\n\n/**\n * Memo of each model's \"stored\" private attributes — those declared in\n * `api.responses.privateAttributes` config or in the model's `options.privateAttributes`,\n * as opposed to attributes flagged `private: true` individually.\n *\n * `isPrivateAttribute` is called once per key, per node, per traversal, per entity, and\n * recomputing this set every time dominated response sanitization: a 25-entity page made\n * 48,605 calls, each doing two lodash path lookups plus a fresh `union()` allocation, all\n * returning the same answer.\n *\n * Keyed on the model object rather than its uid, so a rebuilt schema is a distinct key and\n * the entry cannot go stale. Deliberately NOT stored on the schema itself: a\n * `privateAttributes` getter used to live there and was removed in 2023 (2fa8f30371)\n * because it polluted schema serialization, and because it was only ever attached by\n * `createContentType`, so components never got one.\n *\n * Both inputs are fixed for a model's lifetime — `api.responses.privateAttributes` is\n * boot configuration and is never written at runtime, and `options.privateAttributes`\n * comes from the schema definition. The cache is only populated once `strapi.config` is\n * available so that a lookup during early boot cannot record an empty set permanently.\n */\nconst storedPrivateAttributesCache = new WeakMap<object, Set<string>>();\n\nconst computeStoredPrivateAttributes = (model: Model): Set<string> =>\n new Set(\n union(\n (strapi?.config?.get('api.responses.privateAttributes', []) ?? []) as Array<string>,\n getOr([], 'options.privateAttributes', model) as Array<string>\n )\n );\n\nconst getStoredPrivateAttributesSet = (model: Model): Set<string> => {\n const cacheable = typeof model === 'object' && model !== null && strapi?.config != null;\n\n if (!cacheable) {\n return computeStoredPrivateAttributes(model);\n }\n\n let cached = storedPrivateAttributesCache.get(model as object);\n\n if (cached === undefined) {\n cached = computeStoredPrivateAttributes(model);\n storedPrivateAttributesCache.set(model as object, cached);\n }\n\n return cached;\n};\n\n// Set iteration order is insertion order, which matches what `union` returned before.\nconst getStoredPrivateAttributes = (model: Model) =>\n Array.from(getStoredPrivateAttributesSet(model));\n\nconst getPrivateAttributes = (model: Model) => {\n return _.union(\n getStoredPrivateAttributes(model),\n _.keys(_.pickBy(model.attributes, (attr) => !!attr.private))\n );\n};\n\nconst isPrivateAttribute = (model: Model, attributeName: string) => {\n if (model?.attributes?.[attributeName]?.private === true) {\n return true;\n }\n\n const storedPrivateAttributes = getStoredPrivateAttributesSet(model);\n\n // The set is empty for the overwhelming majority of models, so check size before hashing.\n return storedPrivateAttributes.size !== 0 && storedPrivateAttributes.has(attributeName);\n};\n\nconst isScalarAttribute = (attribute?: Attribute) => {\n return attribute && !['media', 'component', 'relation', 'dynamiczone'].includes(attribute.type);\n};\n\nconst getDoesAttributeRequireValidation = (attribute: Attribute) => {\n return (\n attribute.required ||\n attribute.unique ||\n Object.prototype.hasOwnProperty.call(attribute, 'max') ||\n Object.prototype.hasOwnProperty.call(attribute, 'min') ||\n Object.prototype.hasOwnProperty.call(attribute, 'maxLength') ||\n Object.prototype.hasOwnProperty.call(attribute, 'minLength')\n );\n};\nconst isMediaAttribute = (attribute?: Attribute) => attribute?.type === 'media';\nconst isRelationalAttribute = (attribute?: Attribute): attribute is RelationalAttribute =>\n attribute?.type === 'relation';\n\nconst HAS_RELATION_REORDERING = ['manyToMany', 'manyToOne', 'oneToMany'];\nconst hasRelationReordering = (attribute?: Attribute) =>\n isRelationalAttribute(attribute) && HAS_RELATION_REORDERING.includes(attribute.relation);\n\nconst isComponentAttribute = (\n attribute?: Attribute\n): attribute is ComponentAttribute | DynamicZoneAttribute =>\n !!attribute && ['component', 'dynamiczone'].includes(attribute.type);\n\nconst isDynamicZoneAttribute = (attribute?: Attribute): attribute is DynamicZoneAttribute =>\n !!attribute && attribute.type === 'dynamiczone';\nconst isMorphToRelationalAttribute = (attribute?: Attribute) => {\n return (\n !!attribute && isRelationalAttribute(attribute) && attribute.relation?.startsWith?.('morphTo')\n );\n};\n\nconst getComponentAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isComponentAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getMediaAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isMediaAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getScalarAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isScalarAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getRelationalAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isRelationalAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\n/**\n * Checks if an attribute is of type `type`\n * @param {object} attribute\n * @param {string} type\n */\nconst isTypedAttribute = (attribute: Attribute, type: string) => {\n return _.has(attribute, 'type') && attribute.type === type;\n};\n\n/**\n * Returns a route prefix for a contentType\n * @param {object} contentType\n * @returns {string}\n */\nconst getContentTypeRoutePrefix = (contentType: WithRequired<Model, 'info'>) => {\n return isSingleType(contentType)\n ? _.kebabCase(contentType.info.singularName)\n : _.kebabCase(contentType.info.pluralName);\n};\n\nexport {\n isSchema,\n isContentTypeSchema,\n isComponentSchema,\n isScalarAttribute,\n isMediaAttribute,\n isRelationalAttribute,\n hasRelationReordering,\n isComponentAttribute,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isTypedAttribute,\n getPrivateAttributes,\n isPrivateAttribute,\n constants,\n ID_FIELDS,\n MORPH_TO_KEYS,\n DYNAMIC_ZONE_KEYS,\n RELATION_OPERATION_KEYS,\n RESERVED_ATTRIBUTE_NAMES,\n RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH,\n RESERVED_MODEL_NAMES,\n isReservedAttributeName,\n isReservedModelName,\n getReservedAttributeNames,\n getReservedModelNames,\n findDraftAndPublishReservedAttributeNames,\n getDraftAndPublishReservedAttributeWarning,\n getDraftAndPublishEnableBlockedMessage,\n getNonWritableAttributes,\n getComponentAttributes,\n getMediaAttributes,\n getScalarAttributes,\n getRelationalAttributes,\n getWritableAttributes,\n isWritableAttribute,\n getNonVisibleAttributes,\n getVisibleAttributes,\n getTimestamps,\n getCreatorFields,\n isVisibleAttribute,\n getOptions,\n isDraft,\n hasDraftAndPublish,\n hasFirstPublishedAtField,\n isSingleType,\n isCollectionType,\n isKind,\n getContentTypeRoutePrefix,\n getDoesAttributeRequireValidation,\n};\n"],"names":["SINGLE_TYPE","COLLECTION_TYPE","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","constants","ID_FIELDS","MORPH_TO_KEYS","DYNAMIC_ZONE_KEYS","RELATION_OPERATION_KEYS","RESERVED_ATTRIBUTE_NAMES","RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH","RESERVED_MODEL_NAMES","matchesReservedName","snakeCaseName","list","includes","filter","entry","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName","name","draftAndPublish","snakeCase","isReservedModelName","getReservedAttributeNames","getReservedModelNames","findDraftAndPublishReservedAttributeNames","attributeNames","getDraftAndPublishReservedAttributeWarning","uid","attributeName","getDraftAndPublishEnableBlockedMessage","join","getTimestamps","model","attributes","has","push","getCreatorFields","getNonWritableAttributes","nonWritableAttributes","_","reduce","acc","attr","attrName","writable","concat","uniq","getWritableAttributes","difference","Object","keys","isWritableAttribute","getNonVisibleAttributes","nonVisibleAttributes","visible","getVisibleAttributes","isVisibleAttribute","getOptions","assign","get","hasDraftAndPublish","hasFirstPublishedAtField","strapi","config","isDraft","data","isSchema","modelType","isComponentSchema","isContentTypeSchema","isSingleType","kind","isCollectionType","isKind","storedPrivateAttributesCache","WeakMap","computeStoredPrivateAttributes","Set","union","getOr","getStoredPrivateAttributesSet","cacheable","cached","undefined","set","getStoredPrivateAttributes","Array","from","getPrivateAttributes","pickBy","private","isPrivateAttribute","storedPrivateAttributes","size","isScalarAttribute","attribute","type","getDoesAttributeRequireValidation","required","unique","prototype","hasOwnProperty","call","isMediaAttribute","isRelationalAttribute","HAS_RELATION_REORDERING","hasRelationReordering","relation","isComponentAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","getComponentAttributes","schema","getMediaAttributes","getScalarAttributes","getRelationalAttributes","isTypedAttribute","getContentTypeRoutePrefix","contentType","kebabCase","info","singularName","pluralName"],"mappings":"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"}
|
package/dist/content-types.mjs
CHANGED
|
@@ -203,7 +203,42 @@ const isContentTypeSchema = (data)=>{
|
|
|
203
203
|
const isSingleType = ({ kind = COLLECTION_TYPE })=>kind === SINGLE_TYPE;
|
|
204
204
|
const isCollectionType = ({ kind = COLLECTION_TYPE })=>kind === COLLECTION_TYPE;
|
|
205
205
|
const isKind = (kind)=>(model)=>model.kind === kind;
|
|
206
|
-
|
|
206
|
+
/**
|
|
207
|
+
* Memo of each model's "stored" private attributes — those declared in
|
|
208
|
+
* `api.responses.privateAttributes` config or in the model's `options.privateAttributes`,
|
|
209
|
+
* as opposed to attributes flagged `private: true` individually.
|
|
210
|
+
*
|
|
211
|
+
* `isPrivateAttribute` is called once per key, per node, per traversal, per entity, and
|
|
212
|
+
* recomputing this set every time dominated response sanitization: a 25-entity page made
|
|
213
|
+
* 48,605 calls, each doing two lodash path lookups plus a fresh `union()` allocation, all
|
|
214
|
+
* returning the same answer.
|
|
215
|
+
*
|
|
216
|
+
* Keyed on the model object rather than its uid, so a rebuilt schema is a distinct key and
|
|
217
|
+
* the entry cannot go stale. Deliberately NOT stored on the schema itself: a
|
|
218
|
+
* `privateAttributes` getter used to live there and was removed in 2023 (2fa8f30371)
|
|
219
|
+
* because it polluted schema serialization, and because it was only ever attached by
|
|
220
|
+
* `createContentType`, so components never got one.
|
|
221
|
+
*
|
|
222
|
+
* Both inputs are fixed for a model's lifetime — `api.responses.privateAttributes` is
|
|
223
|
+
* boot configuration and is never written at runtime, and `options.privateAttributes`
|
|
224
|
+
* comes from the schema definition. The cache is only populated once `strapi.config` is
|
|
225
|
+
* available so that a lookup during early boot cannot record an empty set permanently.
|
|
226
|
+
*/ const storedPrivateAttributesCache = new WeakMap();
|
|
227
|
+
const computeStoredPrivateAttributes = (model)=>new Set(union(strapi?.config?.get('api.responses.privateAttributes', []) ?? [], getOr([], 'options.privateAttributes', model)));
|
|
228
|
+
const getStoredPrivateAttributesSet = (model)=>{
|
|
229
|
+
const cacheable = typeof model === 'object' && model !== null && strapi?.config != null;
|
|
230
|
+
if (!cacheable) {
|
|
231
|
+
return computeStoredPrivateAttributes(model);
|
|
232
|
+
}
|
|
233
|
+
let cached = storedPrivateAttributesCache.get(model);
|
|
234
|
+
if (cached === undefined) {
|
|
235
|
+
cached = computeStoredPrivateAttributes(model);
|
|
236
|
+
storedPrivateAttributesCache.set(model, cached);
|
|
237
|
+
}
|
|
238
|
+
return cached;
|
|
239
|
+
};
|
|
240
|
+
// Set iteration order is insertion order, which matches what `union` returned before.
|
|
241
|
+
const getStoredPrivateAttributes = (model)=>Array.from(getStoredPrivateAttributesSet(model));
|
|
207
242
|
const getPrivateAttributes = (model)=>{
|
|
208
243
|
return ___default.union(getStoredPrivateAttributes(model), ___default.keys(___default.pickBy(model.attributes, (attr)=>!!attr.private)));
|
|
209
244
|
};
|
|
@@ -211,7 +246,9 @@ const isPrivateAttribute = (model, attributeName)=>{
|
|
|
211
246
|
if (model?.attributes?.[attributeName]?.private === true) {
|
|
212
247
|
return true;
|
|
213
248
|
}
|
|
214
|
-
|
|
249
|
+
const storedPrivateAttributes = getStoredPrivateAttributesSet(model);
|
|
250
|
+
// The set is empty for the overwhelming majority of models, so check size before hashing.
|
|
251
|
+
return storedPrivateAttributes.size !== 0 && storedPrivateAttributes.has(attributeName);
|
|
215
252
|
};
|
|
216
253
|
const isScalarAttribute = (attribute)=>{
|
|
217
254
|
return attribute && ![
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.mjs","sources":["../src/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, getOr, union, snakeCase } from 'lodash/fp';\nimport type {\n Model,\n Kind,\n Attribute,\n RelationalAttribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n WithRequired,\n} from './types';\n\nconst SINGLE_TYPE = 'singleType';\nconst COLLECTION_TYPE = 'collectionType';\n\nconst ID_ATTRIBUTE = 'id';\nconst DOC_ID_ATTRIBUTE = 'documentId';\n\nconst PUBLISHED_AT_ATTRIBUTE = 'publishedAt';\nconst FIRST_PUBLISHED_AT_ATTRIBUTE = 'firstPublishedAt';\nconst CREATED_BY_ATTRIBUTE = 'createdBy';\nconst UPDATED_BY_ATTRIBUTE = 'updatedBy';\n\nconst CREATED_AT_ATTRIBUTE = 'createdAt';\nconst UPDATED_AT_ATTRIBUTE = 'updatedAt';\n\nconst constants = {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n SINGLE_TYPE,\n COLLECTION_TYPE,\n};\n\n/** ID-like fields accepted at root level and on relations/media/components (validate/sanitize traversal). */\nconst ID_FIELDS: string[] = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n/** Keys accepted on morphTo relation payloads (e.g. __type). */\nconst MORPH_TO_KEYS: string[] = ['__type'];\n/** Keys accepted on dynamic zone component payloads (e.g. __component). */\nconst DYNAMIC_ZONE_KEYS: string[] = ['__component'];\n/** Relation operation keys (connect, disconnect, set, options). */\nconst RELATION_OPERATION_KEYS: string[] = ['connect', 'disconnect', 'set', 'options'];\n\n/**\n * Reserved attribute names that cannot be used by user-defined content-type fields.\n * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES: string[] = [\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n // V6: we will need to add first_published_at when it becomes the default behaviour\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n/**\n * Reserved attribute names that only conflict when draftAndPublish is enabled.\n * `status` is the v5 Document Service / REST query parameter for draft/published filtering.\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH: string[] = ['status'];\n\n/** Reserved model (collection) names that cannot be used by user-defined content-types. */\n// use snake_case\nconst RESERVED_MODEL_NAMES: string[] = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nconst matchesReservedName = (snakeCaseName: string, list: string[]): boolean => {\n if (list.includes(snakeCaseName)) {\n return true;\n }\n\n return list\n .filter((entry) => entry.endsWith('*'))\n .map((entry) => entry.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix));\n};\n\ninterface IsReservedAttributeNameOptions {\n /** When true, draft-and-publish-specific names (e.g. `status`) are also reserved. Defaults to true. */\n draftAndPublish?: boolean;\n}\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedAttributeName = (\n name: string,\n { draftAndPublish = true }: IsReservedAttributeNameOptions = {}\n): boolean => {\n const snakeCaseName = snakeCase(name);\n\n if (matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES)) {\n return true;\n }\n\n if (\n draftAndPublish &&\n matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedModelName = (name: string): boolean => {\n return matchesReservedName(snakeCase(name), RESERVED_MODEL_NAMES);\n};\n\nconst getReservedAttributeNames = ({\n draftAndPublish = true,\n}: IsReservedAttributeNameOptions = {}): string[] => {\n return draftAndPublish\n ? [...RESERVED_ATTRIBUTE_NAMES, ...RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH]\n : [...RESERVED_ATTRIBUTE_NAMES];\n};\n\nconst getReservedModelNames = (): string[] => [...RESERVED_MODEL_NAMES];\n\nconst findDraftAndPublishReservedAttributeNames = (attributeNames: Iterable<string>): string[] => {\n return [...attributeNames].filter((name) =>\n matchesReservedName(snakeCase(name), RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n );\n};\n\nconst getDraftAndPublishReservedAttributeWarning = (uid: string, attributeName: string): string =>\n `The attribute name '${attributeName}' on content type '${uid}' is reserved when 'draftAndPublish' is enabled. It conflicts with the Document Service / REST 'status' query parameter. Rename the attribute or disable the 'draftAndPublish' option.`;\n\nconst getDraftAndPublishEnableBlockedMessage = (attributeNames: string[]): string =>\n `Cannot enable draft and publish while the following attribute names are reserved: ${attributeNames.join(', ')}. Rename them or remove them first.`;\n\nconst getTimestamps = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_AT_ATTRIBUTE);\n }\n\n if (has(UPDATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_AT_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getCreatorFields = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_BY_ATTRIBUTE);\n }\n\n if (has(UPDATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_BY_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getNonWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n const nonWritableAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.writable === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonWritableAttributes,\n ]);\n};\n\nconst getWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n return _.difference(Object.keys(model.attributes), getNonWritableAttributes(model));\n};\n\nconst isWritableAttribute = (model: Model, attributeName: string) => {\n return getWritableAttributes(model).includes(attributeName);\n};\n\nconst getNonVisibleAttributes = (model: Model) => {\n const nonVisibleAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.visible === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonVisibleAttributes,\n ]);\n};\n\nconst getVisibleAttributes = (model: Model) => {\n return _.difference(_.keys(model.attributes), getNonVisibleAttributes(model));\n};\n\nconst isVisibleAttribute = (model: Model, attributeName: string) => {\n return getVisibleAttributes(model).includes(attributeName);\n};\n\nconst getOptions = (model: Model) =>\n _.assign({ draftAndPublish: false }, _.get(model, 'options', {}));\n\nconst hasDraftAndPublish = (model: Model) =>\n _.get(model, 'options.draftAndPublish', false) === true;\n\nconst hasFirstPublishedAtField = (model: Model) =>\n strapi.config.get('features.future.experimental_firstPublishedAt', false) &&\n hasDraftAndPublish(model);\n\nconst isDraft = <T extends object>(data: T, model: Model) =>\n hasDraftAndPublish(model) && _.get(data, PUBLISHED_AT_ATTRIBUTE) === null;\n\nconst isSchema = (data: unknown): data is Model => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'modelType' in data &&\n typeof data.modelType === 'string' &&\n ['component', 'contentType'].includes(data.modelType)\n );\n};\n\nconst isComponentSchema = (data: unknown): data is Model & { modelType: 'component' } => {\n return isSchema(data) && data.modelType === 'component';\n};\n\nconst isContentTypeSchema = (data: unknown): data is Model & { modelType: 'contentType' } => {\n return isSchema(data) && data.modelType === 'contentType';\n};\n\nconst isSingleType = ({ kind = COLLECTION_TYPE }) => kind === SINGLE_TYPE;\nconst isCollectionType = ({ kind = COLLECTION_TYPE }) => kind === COLLECTION_TYPE;\nconst isKind = (kind: Kind) => (model: Model) => model.kind === kind;\n\nconst getStoredPrivateAttributes = (model: Model) =>\n union(\n (strapi?.config?.get('api.responses.privateAttributes', []) ?? []) as Array<string>,\n getOr([], 'options.privateAttributes', model)\n );\n\nconst getPrivateAttributes = (model: Model) => {\n return _.union(\n getStoredPrivateAttributes(model),\n _.keys(_.pickBy(model.attributes, (attr) => !!attr.private))\n );\n};\n\nconst isPrivateAttribute = (model: Model, attributeName: string) => {\n if (model?.attributes?.[attributeName]?.private === true) {\n return true;\n }\n return getStoredPrivateAttributes(model).includes(attributeName);\n};\n\nconst isScalarAttribute = (attribute?: Attribute) => {\n return attribute && !['media', 'component', 'relation', 'dynamiczone'].includes(attribute.type);\n};\n\nconst getDoesAttributeRequireValidation = (attribute: Attribute) => {\n return (\n attribute.required ||\n attribute.unique ||\n Object.prototype.hasOwnProperty.call(attribute, 'max') ||\n Object.prototype.hasOwnProperty.call(attribute, 'min') ||\n Object.prototype.hasOwnProperty.call(attribute, 'maxLength') ||\n Object.prototype.hasOwnProperty.call(attribute, 'minLength')\n );\n};\nconst isMediaAttribute = (attribute?: Attribute) => attribute?.type === 'media';\nconst isRelationalAttribute = (attribute?: Attribute): attribute is RelationalAttribute =>\n attribute?.type === 'relation';\n\nconst HAS_RELATION_REORDERING = ['manyToMany', 'manyToOne', 'oneToMany'];\nconst hasRelationReordering = (attribute?: Attribute) =>\n isRelationalAttribute(attribute) && HAS_RELATION_REORDERING.includes(attribute.relation);\n\nconst isComponentAttribute = (\n attribute?: Attribute\n): attribute is ComponentAttribute | DynamicZoneAttribute =>\n !!attribute && ['component', 'dynamiczone'].includes(attribute.type);\n\nconst isDynamicZoneAttribute = (attribute?: Attribute): attribute is DynamicZoneAttribute =>\n !!attribute && attribute.type === 'dynamiczone';\nconst isMorphToRelationalAttribute = (attribute?: Attribute) => {\n return (\n !!attribute && isRelationalAttribute(attribute) && attribute.relation?.startsWith?.('morphTo')\n );\n};\n\nconst getComponentAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isComponentAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getMediaAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isMediaAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getScalarAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isScalarAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getRelationalAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isRelationalAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\n/**\n * Checks if an attribute is of type `type`\n * @param {object} attribute\n * @param {string} type\n */\nconst isTypedAttribute = (attribute: Attribute, type: string) => {\n return _.has(attribute, 'type') && attribute.type === type;\n};\n\n/**\n * Returns a route prefix for a contentType\n * @param {object} contentType\n * @returns {string}\n */\nconst getContentTypeRoutePrefix = (contentType: WithRequired<Model, 'info'>) => {\n return isSingleType(contentType)\n ? _.kebabCase(contentType.info.singularName)\n : _.kebabCase(contentType.info.pluralName);\n};\n\nexport {\n isSchema,\n isContentTypeSchema,\n isComponentSchema,\n isScalarAttribute,\n isMediaAttribute,\n isRelationalAttribute,\n hasRelationReordering,\n isComponentAttribute,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isTypedAttribute,\n getPrivateAttributes,\n isPrivateAttribute,\n constants,\n ID_FIELDS,\n MORPH_TO_KEYS,\n DYNAMIC_ZONE_KEYS,\n RELATION_OPERATION_KEYS,\n RESERVED_ATTRIBUTE_NAMES,\n RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH,\n RESERVED_MODEL_NAMES,\n isReservedAttributeName,\n isReservedModelName,\n getReservedAttributeNames,\n getReservedModelNames,\n findDraftAndPublishReservedAttributeNames,\n getDraftAndPublishReservedAttributeWarning,\n getDraftAndPublishEnableBlockedMessage,\n getNonWritableAttributes,\n getComponentAttributes,\n getMediaAttributes,\n getScalarAttributes,\n getRelationalAttributes,\n getWritableAttributes,\n isWritableAttribute,\n getNonVisibleAttributes,\n getVisibleAttributes,\n getTimestamps,\n getCreatorFields,\n isVisibleAttribute,\n getOptions,\n isDraft,\n hasDraftAndPublish,\n hasFirstPublishedAtField,\n isSingleType,\n isCollectionType,\n isKind,\n getContentTypeRoutePrefix,\n getDoesAttributeRequireValidation,\n};\n"],"names":["SINGLE_TYPE","COLLECTION_TYPE","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","constants","ID_FIELDS","MORPH_TO_KEYS","DYNAMIC_ZONE_KEYS","RELATION_OPERATION_KEYS","RESERVED_ATTRIBUTE_NAMES","RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH","RESERVED_MODEL_NAMES","matchesReservedName","snakeCaseName","list","includes","filter","entry","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName","name","draftAndPublish","snakeCase","isReservedModelName","getReservedAttributeNames","getReservedModelNames","findDraftAndPublishReservedAttributeNames","attributeNames","getDraftAndPublishReservedAttributeWarning","uid","attributeName","getDraftAndPublishEnableBlockedMessage","join","getTimestamps","model","attributes","has","push","getCreatorFields","getNonWritableAttributes","nonWritableAttributes","_","reduce","acc","attr","attrName","writable","concat","uniq","getWritableAttributes","difference","Object","keys","isWritableAttribute","getNonVisibleAttributes","nonVisibleAttributes","visible","getVisibleAttributes","isVisibleAttribute","getOptions","assign","get","hasDraftAndPublish","hasFirstPublishedAtField","strapi","config","isDraft","data","isSchema","modelType","isComponentSchema","isContentTypeSchema","isSingleType","kind","isCollectionType","isKind","getStoredPrivateAttributes","union","getOr","getPrivateAttributes","pickBy","private","isPrivateAttribute","isScalarAttribute","attribute","type","getDoesAttributeRequireValidation","required","unique","prototype","hasOwnProperty","call","isMediaAttribute","isRelationalAttribute","HAS_RELATION_REORDERING","hasRelationReordering","relation","isComponentAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","getComponentAttributes","schema","getMediaAttributes","getScalarAttributes","getRelationalAttributes","isTypedAttribute","getContentTypeRoutePrefix","contentType","kebabCase","info","singularName","pluralName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-types.mjs","sources":["../src/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, getOr, union, snakeCase } from 'lodash/fp';\nimport type {\n Model,\n Kind,\n Attribute,\n RelationalAttribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n WithRequired,\n} from './types';\n\nconst SINGLE_TYPE = 'singleType';\nconst COLLECTION_TYPE = 'collectionType';\n\nconst ID_ATTRIBUTE = 'id';\nconst DOC_ID_ATTRIBUTE = 'documentId';\n\nconst PUBLISHED_AT_ATTRIBUTE = 'publishedAt';\nconst FIRST_PUBLISHED_AT_ATTRIBUTE = 'firstPublishedAt';\nconst CREATED_BY_ATTRIBUTE = 'createdBy';\nconst UPDATED_BY_ATTRIBUTE = 'updatedBy';\n\nconst CREATED_AT_ATTRIBUTE = 'createdAt';\nconst UPDATED_AT_ATTRIBUTE = 'updatedAt';\n\nconst constants = {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n SINGLE_TYPE,\n COLLECTION_TYPE,\n};\n\n/** ID-like fields accepted at root level and on relations/media/components (validate/sanitize traversal). */\nconst ID_FIELDS: string[] = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n/** Keys accepted on morphTo relation payloads (e.g. __type). */\nconst MORPH_TO_KEYS: string[] = ['__type'];\n/** Keys accepted on dynamic zone component payloads (e.g. __component). */\nconst DYNAMIC_ZONE_KEYS: string[] = ['__component'];\n/** Relation operation keys (connect, disconnect, set, options). */\nconst RELATION_OPERATION_KEYS: string[] = ['connect', 'disconnect', 'set', 'options'];\n\n/**\n * Reserved attribute names that cannot be used by user-defined content-type fields.\n * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES: string[] = [\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n // V6: we will need to add first_published_at when it becomes the default behaviour\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n/**\n * Reserved attribute names that only conflict when draftAndPublish is enabled.\n * `status` is the v5 Document Service / REST query parameter for draft/published filtering.\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH: string[] = ['status'];\n\n/** Reserved model (collection) names that cannot be used by user-defined content-types. */\n// use snake_case\nconst RESERVED_MODEL_NAMES: string[] = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nconst matchesReservedName = (snakeCaseName: string, list: string[]): boolean => {\n if (list.includes(snakeCaseName)) {\n return true;\n }\n\n return list\n .filter((entry) => entry.endsWith('*'))\n .map((entry) => entry.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix));\n};\n\ninterface IsReservedAttributeNameOptions {\n /** When true, draft-and-publish-specific names (e.g. `status`) are also reserved. Defaults to true. */\n draftAndPublish?: boolean;\n}\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedAttributeName = (\n name: string,\n { draftAndPublish = true }: IsReservedAttributeNameOptions = {}\n): boolean => {\n const snakeCaseName = snakeCase(name);\n\n if (matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES)) {\n return true;\n }\n\n if (\n draftAndPublish &&\n matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedModelName = (name: string): boolean => {\n return matchesReservedName(snakeCase(name), RESERVED_MODEL_NAMES);\n};\n\nconst getReservedAttributeNames = ({\n draftAndPublish = true,\n}: IsReservedAttributeNameOptions = {}): string[] => {\n return draftAndPublish\n ? [...RESERVED_ATTRIBUTE_NAMES, ...RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH]\n : [...RESERVED_ATTRIBUTE_NAMES];\n};\n\nconst getReservedModelNames = (): string[] => [...RESERVED_MODEL_NAMES];\n\nconst findDraftAndPublishReservedAttributeNames = (attributeNames: Iterable<string>): string[] => {\n return [...attributeNames].filter((name) =>\n matchesReservedName(snakeCase(name), RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n );\n};\n\nconst getDraftAndPublishReservedAttributeWarning = (uid: string, attributeName: string): string =>\n `The attribute name '${attributeName}' on content type '${uid}' is reserved when 'draftAndPublish' is enabled. It conflicts with the Document Service / REST 'status' query parameter. Rename the attribute or disable the 'draftAndPublish' option.`;\n\nconst getDraftAndPublishEnableBlockedMessage = (attributeNames: string[]): string =>\n `Cannot enable draft and publish while the following attribute names are reserved: ${attributeNames.join(', ')}. Rename them or remove them first.`;\n\nconst getTimestamps = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_AT_ATTRIBUTE);\n }\n\n if (has(UPDATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_AT_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getCreatorFields = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_BY_ATTRIBUTE);\n }\n\n if (has(UPDATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_BY_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getNonWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n const nonWritableAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.writable === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonWritableAttributes,\n ]);\n};\n\nconst getWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n return _.difference(Object.keys(model.attributes), getNonWritableAttributes(model));\n};\n\nconst isWritableAttribute = (model: Model, attributeName: string) => {\n return getWritableAttributes(model).includes(attributeName);\n};\n\nconst getNonVisibleAttributes = (model: Model) => {\n const nonVisibleAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.visible === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonVisibleAttributes,\n ]);\n};\n\nconst getVisibleAttributes = (model: Model) => {\n return _.difference(_.keys(model.attributes), getNonVisibleAttributes(model));\n};\n\nconst isVisibleAttribute = (model: Model, attributeName: string) => {\n return getVisibleAttributes(model).includes(attributeName);\n};\n\nconst getOptions = (model: Model) =>\n _.assign({ draftAndPublish: false }, _.get(model, 'options', {}));\n\nconst hasDraftAndPublish = (model: Model) =>\n _.get(model, 'options.draftAndPublish', false) === true;\n\nconst hasFirstPublishedAtField = (model: Model) =>\n strapi.config.get('features.future.experimental_firstPublishedAt', false) &&\n hasDraftAndPublish(model);\n\nconst isDraft = <T extends object>(data: T, model: Model) =>\n hasDraftAndPublish(model) && _.get(data, PUBLISHED_AT_ATTRIBUTE) === null;\n\nconst isSchema = (data: unknown): data is Model => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'modelType' in data &&\n typeof data.modelType === 'string' &&\n ['component', 'contentType'].includes(data.modelType)\n );\n};\n\nconst isComponentSchema = (data: unknown): data is Model & { modelType: 'component' } => {\n return isSchema(data) && data.modelType === 'component';\n};\n\nconst isContentTypeSchema = (data: unknown): data is Model & { modelType: 'contentType' } => {\n return isSchema(data) && data.modelType === 'contentType';\n};\n\nconst isSingleType = ({ kind = COLLECTION_TYPE }) => kind === SINGLE_TYPE;\nconst isCollectionType = ({ kind = COLLECTION_TYPE }) => kind === COLLECTION_TYPE;\nconst isKind = (kind: Kind) => (model: Model) => model.kind === kind;\n\n/**\n * Memo of each model's \"stored\" private attributes — those declared in\n * `api.responses.privateAttributes` config or in the model's `options.privateAttributes`,\n * as opposed to attributes flagged `private: true` individually.\n *\n * `isPrivateAttribute` is called once per key, per node, per traversal, per entity, and\n * recomputing this set every time dominated response sanitization: a 25-entity page made\n * 48,605 calls, each doing two lodash path lookups plus a fresh `union()` allocation, all\n * returning the same answer.\n *\n * Keyed on the model object rather than its uid, so a rebuilt schema is a distinct key and\n * the entry cannot go stale. Deliberately NOT stored on the schema itself: a\n * `privateAttributes` getter used to live there and was removed in 2023 (2fa8f30371)\n * because it polluted schema serialization, and because it was only ever attached by\n * `createContentType`, so components never got one.\n *\n * Both inputs are fixed for a model's lifetime — `api.responses.privateAttributes` is\n * boot configuration and is never written at runtime, and `options.privateAttributes`\n * comes from the schema definition. The cache is only populated once `strapi.config` is\n * available so that a lookup during early boot cannot record an empty set permanently.\n */\nconst storedPrivateAttributesCache = new WeakMap<object, Set<string>>();\n\nconst computeStoredPrivateAttributes = (model: Model): Set<string> =>\n new Set(\n union(\n (strapi?.config?.get('api.responses.privateAttributes', []) ?? []) as Array<string>,\n getOr([], 'options.privateAttributes', model) as Array<string>\n )\n );\n\nconst getStoredPrivateAttributesSet = (model: Model): Set<string> => {\n const cacheable = typeof model === 'object' && model !== null && strapi?.config != null;\n\n if (!cacheable) {\n return computeStoredPrivateAttributes(model);\n }\n\n let cached = storedPrivateAttributesCache.get(model as object);\n\n if (cached === undefined) {\n cached = computeStoredPrivateAttributes(model);\n storedPrivateAttributesCache.set(model as object, cached);\n }\n\n return cached;\n};\n\n// Set iteration order is insertion order, which matches what `union` returned before.\nconst getStoredPrivateAttributes = (model: Model) =>\n Array.from(getStoredPrivateAttributesSet(model));\n\nconst getPrivateAttributes = (model: Model) => {\n return _.union(\n getStoredPrivateAttributes(model),\n _.keys(_.pickBy(model.attributes, (attr) => !!attr.private))\n );\n};\n\nconst isPrivateAttribute = (model: Model, attributeName: string) => {\n if (model?.attributes?.[attributeName]?.private === true) {\n return true;\n }\n\n const storedPrivateAttributes = getStoredPrivateAttributesSet(model);\n\n // The set is empty for the overwhelming majority of models, so check size before hashing.\n return storedPrivateAttributes.size !== 0 && storedPrivateAttributes.has(attributeName);\n};\n\nconst isScalarAttribute = (attribute?: Attribute) => {\n return attribute && !['media', 'component', 'relation', 'dynamiczone'].includes(attribute.type);\n};\n\nconst getDoesAttributeRequireValidation = (attribute: Attribute) => {\n return (\n attribute.required ||\n attribute.unique ||\n Object.prototype.hasOwnProperty.call(attribute, 'max') ||\n Object.prototype.hasOwnProperty.call(attribute, 'min') ||\n Object.prototype.hasOwnProperty.call(attribute, 'maxLength') ||\n Object.prototype.hasOwnProperty.call(attribute, 'minLength')\n );\n};\nconst isMediaAttribute = (attribute?: Attribute) => attribute?.type === 'media';\nconst isRelationalAttribute = (attribute?: Attribute): attribute is RelationalAttribute =>\n attribute?.type === 'relation';\n\nconst HAS_RELATION_REORDERING = ['manyToMany', 'manyToOne', 'oneToMany'];\nconst hasRelationReordering = (attribute?: Attribute) =>\n isRelationalAttribute(attribute) && HAS_RELATION_REORDERING.includes(attribute.relation);\n\nconst isComponentAttribute = (\n attribute?: Attribute\n): attribute is ComponentAttribute | DynamicZoneAttribute =>\n !!attribute && ['component', 'dynamiczone'].includes(attribute.type);\n\nconst isDynamicZoneAttribute = (attribute?: Attribute): attribute is DynamicZoneAttribute =>\n !!attribute && attribute.type === 'dynamiczone';\nconst isMorphToRelationalAttribute = (attribute?: Attribute) => {\n return (\n !!attribute && isRelationalAttribute(attribute) && attribute.relation?.startsWith?.('morphTo')\n );\n};\n\nconst getComponentAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isComponentAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getMediaAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isMediaAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getScalarAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isScalarAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getRelationalAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isRelationalAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\n/**\n * Checks if an attribute is of type `type`\n * @param {object} attribute\n * @param {string} type\n */\nconst isTypedAttribute = (attribute: Attribute, type: string) => {\n return _.has(attribute, 'type') && attribute.type === type;\n};\n\n/**\n * Returns a route prefix for a contentType\n * @param {object} contentType\n * @returns {string}\n */\nconst getContentTypeRoutePrefix = (contentType: WithRequired<Model, 'info'>) => {\n return isSingleType(contentType)\n ? _.kebabCase(contentType.info.singularName)\n : _.kebabCase(contentType.info.pluralName);\n};\n\nexport {\n isSchema,\n isContentTypeSchema,\n isComponentSchema,\n isScalarAttribute,\n isMediaAttribute,\n isRelationalAttribute,\n hasRelationReordering,\n isComponentAttribute,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isTypedAttribute,\n getPrivateAttributes,\n isPrivateAttribute,\n constants,\n ID_FIELDS,\n MORPH_TO_KEYS,\n DYNAMIC_ZONE_KEYS,\n RELATION_OPERATION_KEYS,\n RESERVED_ATTRIBUTE_NAMES,\n RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH,\n RESERVED_MODEL_NAMES,\n isReservedAttributeName,\n isReservedModelName,\n getReservedAttributeNames,\n getReservedModelNames,\n findDraftAndPublishReservedAttributeNames,\n getDraftAndPublishReservedAttributeWarning,\n getDraftAndPublishEnableBlockedMessage,\n getNonWritableAttributes,\n getComponentAttributes,\n getMediaAttributes,\n getScalarAttributes,\n getRelationalAttributes,\n getWritableAttributes,\n isWritableAttribute,\n getNonVisibleAttributes,\n getVisibleAttributes,\n getTimestamps,\n getCreatorFields,\n isVisibleAttribute,\n getOptions,\n isDraft,\n hasDraftAndPublish,\n hasFirstPublishedAtField,\n isSingleType,\n isCollectionType,\n isKind,\n getContentTypeRoutePrefix,\n getDoesAttributeRequireValidation,\n};\n"],"names":["SINGLE_TYPE","COLLECTION_TYPE","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","constants","ID_FIELDS","MORPH_TO_KEYS","DYNAMIC_ZONE_KEYS","RELATION_OPERATION_KEYS","RESERVED_ATTRIBUTE_NAMES","RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH","RESERVED_MODEL_NAMES","matchesReservedName","snakeCaseName","list","includes","filter","entry","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName","name","draftAndPublish","snakeCase","isReservedModelName","getReservedAttributeNames","getReservedModelNames","findDraftAndPublishReservedAttributeNames","attributeNames","getDraftAndPublishReservedAttributeWarning","uid","attributeName","getDraftAndPublishEnableBlockedMessage","join","getTimestamps","model","attributes","has","push","getCreatorFields","getNonWritableAttributes","nonWritableAttributes","_","reduce","acc","attr","attrName","writable","concat","uniq","getWritableAttributes","difference","Object","keys","isWritableAttribute","getNonVisibleAttributes","nonVisibleAttributes","visible","getVisibleAttributes","isVisibleAttribute","getOptions","assign","get","hasDraftAndPublish","hasFirstPublishedAtField","strapi","config","isDraft","data","isSchema","modelType","isComponentSchema","isContentTypeSchema","isSingleType","kind","isCollectionType","isKind","storedPrivateAttributesCache","WeakMap","computeStoredPrivateAttributes","Set","union","getOr","getStoredPrivateAttributesSet","cacheable","cached","undefined","set","getStoredPrivateAttributes","Array","from","getPrivateAttributes","pickBy","private","isPrivateAttribute","storedPrivateAttributes","size","isScalarAttribute","attribute","type","getDoesAttributeRequireValidation","required","unique","prototype","hasOwnProperty","call","isMediaAttribute","isRelationalAttribute","HAS_RELATION_REORDERING","hasRelationReordering","relation","isComponentAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","getComponentAttributes","schema","getMediaAttributes","getScalarAttributes","getRelationalAttributes","isTypedAttribute","getContentTypeRoutePrefix","contentType","kebabCase","info","singularName","pluralName"],"mappings":";;;AAYA,MAAMA,WAAAA,GAAc,YAAA;AACpB,MAAMC,eAAAA,GAAkB,gBAAA;AAExB,MAAMC,YAAAA,GAAe,IAAA;AACrB,MAAMC,gBAAAA,GAAmB,YAAA;AAEzB,MAAMC,sBAAAA,GAAyB,aAAA;AAC/B,MAAMC,4BAAAA,GAA+B,kBAAA;AACrC,MAAMC,oBAAAA,GAAuB,WAAA;AAC7B,MAAMC,oBAAAA,GAAuB,WAAA;AAE7B,MAAMC,oBAAAA,GAAuB,WAAA;AAC7B,MAAMC,oBAAAA,GAAuB,WAAA;AAE7B,MAAMC,SAAAA,GAAY;AAChBR,IAAAA,YAAAA;AACAC,IAAAA,gBAAAA;AACAC,IAAAA,sBAAAA;AACAC,IAAAA,4BAAAA;AACAC,IAAAA,oBAAAA;AACAC,IAAAA,oBAAAA;AACAC,IAAAA,oBAAAA;AACAC,IAAAA,oBAAAA;AACAT,IAAAA,WAAAA;AACAC,IAAAA;AACF;AAEA,oHACMU,SAAAA,GAAsB;AAACT,IAAAA,YAAAA;AAAcC,IAAAA;AAAiB;AAC5D,uEACMS,aAAAA,GAA0B;AAAC,IAAA;AAAS;AAC1C,kFACMC,iBAAAA,GAA8B;AAAC,IAAA;AAAc;AACnD,0EACMC,uBAAAA,GAAoC;AAAC,IAAA,SAAA;AAAW,IAAA,YAAA;AAAc,IAAA,KAAA;AAAO,IAAA;AAAU;AAErF;;;AAGC;AAED,MAAMC,wBAAAA,GAAqC;;AAEzC,IAAA,IAAA;AACA,IAAA,aAAA;;AAGA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,cAAA;;AAEA,IAAA,eAAA;AACA,IAAA,eAAA;;AAEA,IAAA,YAAA;AACA,IAAA,YAAA;;AAGA,IAAA,UAAA;AACA,IAAA,eAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,aAAA;AACA,IAAA,eAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD;AAED;;;AAGC;AAED,MAAMC,sCAAAA,GAAmD;AAAC,IAAA;AAAS;AAEnE;AAEA,MAAMC,oBAAAA,GAAiC;AACrC,IAAA,SAAA;AACA,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD;AAED,MAAMC,mBAAAA,GAAsB,CAACC,aAAAA,EAAuBC,IAAAA,GAAAA;IAClD,IAAIA,IAAAA,CAAKC,QAAQ,CAACF,aAAAA,CAAAA,EAAgB;QAChC,OAAO,IAAA;AACT,IAAA;IAEA,OAAOC,IAAAA,CACJE,MAAM,CAAC,CAACC,KAAAA,GAAUA,MAAMC,QAAQ,CAAC,GAAA,CAAA,CAAA,CACjCC,GAAG,CAAC,CAACF,QAAUA,KAAAA,CAAMG,KAAK,CAAC,CAAA,EAAG,EAAC,CAAA,CAAA,CAC/BC,IAAI,CAAC,CAACC,MAAAA,GAAWT,aAAAA,CAAcU,UAAU,CAACD,MAAAA,CAAAA,CAAAA;AAC/C,CAAA;AAOA;AACA,MAAME,uBAAAA,GAA0B,CAC9BC,IAAAA,EACA,EAAEC,kBAAkB,IAAI,EAAkC,GAAG,EAAE,GAAA;AAE/D,IAAA,MAAMb,gBAAgBc,SAAAA,CAAUF,IAAAA,CAAAA;IAEhC,IAAIb,mBAAAA,CAAoBC,eAAeJ,wBAAAA,CAAAA,EAA2B;QAChE,OAAO,IAAA;AACT,IAAA;IAEA,IACEiB,eAAAA,IACAd,mBAAAA,CAAoBC,aAAAA,EAAeH,sCAAAA,CAAAA,EACnC;QACA,OAAO,IAAA;AACT,IAAA;IAEA,OAAO,KAAA;AACT;AAEA;AACA,MAAMkB,sBAAsB,CAACH,IAAAA,GAAAA;IAC3B,OAAOb,mBAAAA,CAAoBe,UAAUF,IAAAA,CAAAA,EAAOd,oBAAAA,CAAAA;AAC9C;AAEA,MAAMkB,yBAAAA,GAA4B,CAAC,EACjCH,eAAAA,GAAkB,IAAI,EACS,GAAG,EAAE,GAAA;AACpC,IAAA,OAAOA,eAAAA,GACH;AAAIjB,QAAAA,GAAAA,wBAAAA;AAA6BC,QAAAA,GAAAA;KAAuC,GACxE;AAAID,QAAAA,GAAAA;AAAyB,KAAA;AACnC;AAEA,MAAMqB,wBAAwB,IAAgB;AAAInB,QAAAA,GAAAA;AAAqB;AAEvE,MAAMoB,4CAA4C,CAACC,cAAAA,GAAAA;IACjD,OAAO;AAAIA,QAAAA,GAAAA;AAAe,KAAA,CAAChB,MAAM,CAAC,CAACS,IAAAA,GACjCb,mBAAAA,CAAoBe,UAAUF,IAAAA,CAAAA,EAAOf,sCAAAA,CAAAA,CAAAA;AAEzC;AAEA,MAAMuB,0CAAAA,GAA6C,CAACC,GAAAA,EAAaC,aAAAA,GAC/D,CAAC,oBAAoB,EAAEA,aAAAA,CAAc,mBAAmB,EAAED,GAAAA,CAAI,sLAAsL;AAEtP,MAAME,sCAAAA,GAAyC,CAACJ,cAAAA,GAC9C,CAAC,kFAAkF,EAAEA,cAAAA,CAAeK,IAAI,CAAC,IAAA,CAAA,CAAM,mCAAmC;AAEpJ,MAAMC,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,MAAMC,aAAuB,EAAE;AAE/B,IAAA,IAAIC,GAAAA,CAAIvC,oBAAAA,EAAsBqC,KAAAA,CAAMC,UAAU,CAAA,EAAG;AAC/CA,QAAAA,UAAAA,CAAWE,IAAI,CAACxC,oBAAAA,CAAAA;AAClB,IAAA;AAEA,IAAA,IAAIuC,GAAAA,CAAItC,oBAAAA,EAAsBoC,KAAAA,CAAMC,UAAU,CAAA,EAAG;AAC/CA,QAAAA,UAAAA,CAAWE,IAAI,CAACvC,oBAAAA,CAAAA;AAClB,IAAA;IAEA,OAAOqC,UAAAA;AACT;AAEA,MAAMG,mBAAmB,CAACJ,KAAAA,GAAAA;AACxB,IAAA,MAAMC,aAAuB,EAAE;AAE/B,IAAA,IAAIC,GAAAA,CAAIzC,oBAAAA,EAAsBuC,KAAAA,CAAMC,UAAU,CAAA,EAAG;AAC/CA,QAAAA,UAAAA,CAAWE,IAAI,CAAC1C,oBAAAA,CAAAA;AAClB,IAAA;AAEA,IAAA,IAAIyC,GAAAA,CAAIxC,oBAAAA,EAAsBsC,KAAAA,CAAMC,UAAU,CAAA,EAAG;AAC/CA,QAAAA,UAAAA,CAAWE,IAAI,CAACzC,oBAAAA,CAAAA;AAClB,IAAA;IAEA,OAAOuC,UAAAA;AACT;AAEA,MAAMI,2BAA2B,CAACL,KAAAA,GAAAA;IAChC,IAAI,CAACA,KAAAA,EAAO,OAAO,EAAE;IAErB,MAAMM,qBAAAA,GAAwBC,WAAEC,MAAM,CACpCR,MAAMC,UAAU,EAChB,CAACQ,GAAAA,EAAKC,IAAAA,EAAMC,WAAcD,IAAAA,CAAKE,QAAQ,KAAK,KAAA,GAAQH,GAAAA,CAAII,MAAM,CAACF,QAAAA,CAAAA,GAAYF,KAC3E,EAAE,CAAA;IAGJ,OAAOF,UAAAA,CAAEO,IAAI,CAAC;AACZzD,QAAAA,YAAAA;AACAC,QAAAA,gBAAAA;WACGyC,aAAAA,CAAcC,KAAAA,CAAAA;AACdM,QAAAA,GAAAA;AACJ,KAAA,CAAA;AACH;AAEA,MAAMS,wBAAwB,CAACf,KAAAA,GAAAA;IAC7B,IAAI,CAACA,KAAAA,EAAO,OAAO,EAAE;IAErB,OAAOO,UAAAA,CAAES,UAAU,CAACC,MAAAA,CAAOC,IAAI,CAAClB,KAAAA,CAAMC,UAAU,CAAA,EAAGI,wBAAAA,CAAyBL,KAAAA,CAAAA,CAAAA;AAC9E;AAEA,MAAMmB,mBAAAA,GAAsB,CAACnB,KAAAA,EAAcJ,aAAAA,GAAAA;IACzC,OAAOmB,qBAAAA,CAAsBf,KAAAA,CAAAA,CAAOxB,QAAQ,CAACoB,aAAAA,CAAAA;AAC/C;AAEA,MAAMwB,0BAA0B,CAACpB,KAAAA,GAAAA;IAC/B,MAAMqB,oBAAAA,GAAuBd,WAAEC,MAAM,CACnCR,MAAMC,UAAU,EAChB,CAACQ,GAAAA,EAAKC,IAAAA,EAAMC,WAAcD,IAAAA,CAAKY,OAAO,KAAK,KAAA,GAAQb,GAAAA,CAAII,MAAM,CAACF,QAAAA,CAAAA,GAAYF,KAC1E,EAAE,CAAA;IAGJ,OAAOF,UAAAA,CAAEO,IAAI,CAAC;AACZzD,QAAAA,YAAAA;AACAC,QAAAA,gBAAAA;AACAC,QAAAA,sBAAAA;WACGwC,aAAAA,CAAcC,KAAAA,CAAAA;AACdqB,QAAAA,GAAAA;AACJ,KAAA,CAAA;AACH;AAEA,MAAME,uBAAuB,CAACvB,KAAAA,GAAAA;IAC5B,OAAOO,UAAAA,CAAES,UAAU,CAACT,UAAAA,CAAEW,IAAI,CAAClB,KAAAA,CAAMC,UAAU,CAAA,EAAGmB,uBAAAA,CAAwBpB,KAAAA,CAAAA,CAAAA;AACxE;AAEA,MAAMwB,kBAAAA,GAAqB,CAACxB,KAAAA,EAAcJ,aAAAA,GAAAA;IACxC,OAAO2B,oBAAAA,CAAqBvB,KAAAA,CAAAA,CAAOxB,QAAQ,CAACoB,aAAAA,CAAAA;AAC9C;AAEA,MAAM6B,UAAAA,GAAa,CAACzB,KAAAA,GAClBO,UAAAA,CAAEmB,MAAM,CAAC;QAAEvC,eAAAA,EAAiB;AAAM,KAAA,EAAGoB,UAAAA,CAAEoB,GAAG,CAAC3B,KAAAA,EAAO,WAAW,EAAC,CAAA;AAEhE,MAAM4B,kBAAAA,GAAqB,CAAC5B,KAAAA,GAC1BO,UAAAA,CAAEoB,GAAG,CAAC3B,KAAAA,EAAO,2BAA2B,KAAA,CAAA,KAAW;AAErD,MAAM6B,wBAAAA,GAA2B,CAAC7B,KAAAA,GAChC8B,MAAAA,CAAOC,MAAM,CAACJ,GAAG,CAAC,+CAAA,EAAiD,KAAA,CAAA,IACnEC,kBAAAA,CAAmB5B,KAAAA;AAErB,MAAMgC,OAAAA,GAAU,CAAmBC,IAAAA,EAASjC,KAAAA,GAC1C4B,kBAAAA,CAAmB5B,UAAUO,UAAAA,CAAEoB,GAAG,CAACM,IAAAA,EAAM1E,sBAAAA,CAAAA,KAA4B;AAEvE,MAAM2E,WAAW,CAACD,IAAAA,GAAAA;IAChB,OACE,OAAOA,IAAAA,KAAS,QAAA,IAChBA,IAAAA,KAAS,IAAA,IACT,WAAA,IAAeA,IAAAA,IACf,OAAOA,IAAAA,CAAKE,SAAS,KAAK,QAAA,IAC1B;AAAC,QAAA,WAAA;AAAa,QAAA;KAAc,CAAC3D,QAAQ,CAACyD,IAAAA,CAAKE,SAAS,CAAA;AAExD;AAEA,MAAMC,oBAAoB,CAACH,IAAAA,GAAAA;AACzB,IAAA,OAAOC,QAAAA,CAASD,IAAAA,CAAAA,IAASA,IAAAA,CAAKE,SAAS,KAAK,WAAA;AAC9C;AAEA,MAAME,sBAAsB,CAACJ,IAAAA,GAAAA;AAC3B,IAAA,OAAOC,QAAAA,CAASD,IAAAA,CAAAA,IAASA,IAAAA,CAAKE,SAAS,KAAK,aAAA;AAC9C;AAEA,MAAMG,eAAe,CAAC,EAAEC,OAAOnF,eAAe,EAAE,GAAKmF,IAAAA,KAASpF;AAC9D,MAAMqF,mBAAmB,CAAC,EAAED,OAAOnF,eAAe,EAAE,GAAKmF,IAAAA,KAASnF;AAClE,MAAMqF,SAAS,CAACF,IAAAA,GAAe,CAACvC,KAAAA,GAAiBA,KAAAA,CAAMuC,IAAI,KAAKA;AAEhE;;;;;;;;;;;;;;;;;;;;IAqBA,MAAMG,+BAA+B,IAAIC,OAAAA,EAAAA;AAEzC,MAAMC,iCAAiC,CAAC5C,KAAAA,GACtC,IAAI6C,GAAAA,CACFC,MACGhB,MAAAA,EAAQC,MAAAA,EAAQJ,GAAAA,CAAI,iCAAA,EAAmC,EAAE,CAAA,IAAK,EAAE,EACjEoB,KAAAA,CAAM,EAAE,EAAE,2BAAA,EAA6B/C,KAAAA,CAAAA,CAAAA,CAAAA;AAI7C,MAAMgD,gCAAgC,CAAChD,KAAAA,GAAAA;AACrC,IAAA,MAAMiD,YAAY,OAAOjD,KAAAA,KAAU,YAAYA,KAAAA,KAAU,IAAA,IAAQ8B,QAAQC,MAAAA,IAAU,IAAA;AAEnF,IAAA,IAAI,CAACkB,SAAAA,EAAW;AACd,QAAA,OAAOL,8BAAAA,CAA+B5C,KAAAA,CAAAA;AACxC,IAAA;IAEA,IAAIkD,MAAAA,GAASR,4BAAAA,CAA6Bf,GAAG,CAAC3B,KAAAA,CAAAA;AAE9C,IAAA,IAAIkD,WAAWC,SAAAA,EAAW;AACxBD,QAAAA,MAAAA,GAASN,8BAAAA,CAA+B5C,KAAAA,CAAAA;QACxC0C,4BAAAA,CAA6BU,GAAG,CAACpD,KAAAA,EAAiBkD,MAAAA,CAAAA;AACpD,IAAA;IAEA,OAAOA,MAAAA;AACT,CAAA;AAEA;AACA,MAAMG,6BAA6B,CAACrD,KAAAA,GAClCsD,KAAAA,CAAMC,IAAI,CAACP,6BAAAA,CAA8BhD,KAAAA,CAAAA,CAAAA;AAE3C,MAAMwD,uBAAuB,CAACxD,KAAAA,GAAAA;AAC5B,IAAA,OAAOO,WAAEuC,KAAK,CACZO,2BAA2BrD,KAAAA,CAAAA,EAC3BO,UAAAA,CAAEW,IAAI,CAACX,UAAAA,CAAEkD,MAAM,CAACzD,KAAAA,CAAMC,UAAU,EAAE,CAACS,OAAS,CAAC,CAACA,KAAKgD,OAAO,CAAA,CAAA,CAAA;AAE9D;AAEA,MAAMC,kBAAAA,GAAqB,CAAC3D,KAAAA,EAAcJ,aAAAA,GAAAA;AACxC,IAAA,IAAII,OAAOC,UAAAA,GAAaL,aAAAA,CAAc,EAAE8D,YAAY,IAAA,EAAM;QACxD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAME,0BAA0BZ,6BAAAA,CAA8BhD,KAAAA,CAAAA;;AAG9D,IAAA,OAAO4D,wBAAwBC,IAAI,KAAK,CAAA,IAAKD,uBAAAA,CAAwB1D,GAAG,CAACN,aAAAA,CAAAA;AAC3E;AAEA,MAAMkE,oBAAoB,CAACC,SAAAA,GAAAA;AACzB,IAAA,OAAOA,aAAa,CAAC;AAAC,QAAA,OAAA;AAAS,QAAA,WAAA;AAAa,QAAA,UAAA;AAAY,QAAA;KAAc,CAACvF,QAAQ,CAACuF,SAAAA,CAAUC,IAAI,CAAA;AAChG;AAEA,MAAMC,oCAAoC,CAACF,SAAAA,GAAAA;AACzC,IAAA,OACEA,UAAUG,QAAQ,IAClBH,UAAUI,MAAM,IAChBlD,OAAOmD,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,SAAAA,EAAW,UAChD9C,MAAAA,CAAOmD,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,WAAW,KAAA,CAAA,IAChD9C,MAAAA,CAAOmD,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,SAAAA,EAAW,WAAA,CAAA,IAChD9C,OAAOmD,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,SAAAA,EAAW,WAAA,CAAA;AAEpD;AACA,MAAMQ,gBAAAA,GAAmB,CAACR,SAAAA,GAA0BA,SAAAA,EAAWC,IAAAA,KAAS;AACxE,MAAMQ,qBAAAA,GAAwB,CAACT,SAAAA,GAC7BA,SAAAA,EAAWC,IAAAA,KAAS;AAEtB,MAAMS,uBAAAA,GAA0B;AAAC,IAAA,YAAA;AAAc,IAAA,WAAA;AAAa,IAAA;AAAY,CAAA;AACxE,MAAMC,qBAAAA,GAAwB,CAACX,SAAAA,GAC7BS,qBAAAA,CAAsBT,cAAcU,uBAAAA,CAAwBjG,QAAQ,CAACuF,SAAAA,CAAUY,QAAQ;AAEzF,MAAMC,oBAAAA,GAAuB,CAC3Bb,SAAAA,GAEA,CAAC,CAACA,SAAAA,IAAa;AAAC,QAAA,WAAA;AAAa,QAAA;KAAc,CAACvF,QAAQ,CAACuF,SAAAA,CAAUC,IAAI;AAErE,MAAMa,sBAAAA,GAAyB,CAACd,SAAAA,GAC9B,CAAC,CAACA,SAAAA,IAAaA,SAAAA,CAAUC,IAAI,KAAK;AACpC,MAAMc,+BAA+B,CAACf,SAAAA,GAAAA;IACpC,OACE,CAAC,CAACA,SAAAA,IAAaS,qBAAAA,CAAsBT,cAAcA,SAAAA,CAAUY,QAAQ,EAAE3F,UAAAA,GAAa,SAAA,CAAA;AAExF;AAEA,MAAM+F,yBAAyB,CAACC,MAAAA,GAAAA;IAC9B,OAAOzE,UAAAA,CAAEC,MAAM,CACbwE,MAAAA,CAAO/E,UAAU,EACjB,CAACQ,KAAKC,IAAAA,EAAMC,QAAAA,GAAAA;AACV,QAAA,IAAIiE,oBAAAA,CAAqBlE,IAAAA,CAAAA,EAAOD,GAAAA,CAAIN,IAAI,CAACQ,QAAAA,CAAAA;QACzC,OAAOF,GAAAA;AACT,IAAA,CAAA,EACA,EAAE,CAAA;AAEN;AAEA,MAAMwE,qBAAqB,CAACD,MAAAA,GAAAA;IAC1B,OAAOzE,UAAAA,CAAEC,MAAM,CACbwE,MAAAA,CAAO/E,UAAU,EACjB,CAACQ,KAAKC,IAAAA,EAAMC,QAAAA,GAAAA;AACV,QAAA,IAAI4D,gBAAAA,CAAiB7D,IAAAA,CAAAA,EAAOD,GAAAA,CAAIN,IAAI,CAACQ,QAAAA,CAAAA;QACrC,OAAOF,GAAAA;AACT,IAAA,CAAA,EACA,EAAE,CAAA;AAEN;AAEA,MAAMyE,sBAAsB,CAACF,MAAAA,GAAAA;IAC3B,OAAOzE,UAAAA,CAAEC,MAAM,CACbwE,MAAAA,CAAO/E,UAAU,EACjB,CAACQ,KAAKC,IAAAA,EAAMC,QAAAA,GAAAA;AACV,QAAA,IAAImD,iBAAAA,CAAkBpD,IAAAA,CAAAA,EAAOD,GAAAA,CAAIN,IAAI,CAACQ,QAAAA,CAAAA;QACtC,OAAOF,GAAAA;AACT,IAAA,CAAA,EACA,EAAE,CAAA;AAEN;AAEA,MAAM0E,0BAA0B,CAACH,MAAAA,GAAAA;IAC/B,OAAOzE,UAAAA,CAAEC,MAAM,CACbwE,MAAAA,CAAO/E,UAAU,EACjB,CAACQ,KAAKC,IAAAA,EAAMC,QAAAA,GAAAA;AACV,QAAA,IAAI6D,qBAAAA,CAAsB9D,IAAAA,CAAAA,EAAOD,GAAAA,CAAIN,IAAI,CAACQ,QAAAA,CAAAA;QAC1C,OAAOF,GAAAA;AACT,IAAA,CAAA,EACA,EAAE,CAAA;AAEN;AAEA;;;;IAKA,MAAM2E,gBAAAA,GAAmB,CAACrB,SAAAA,EAAsBC,IAAAA,GAAAA;AAC9C,IAAA,OAAOzD,WAAEL,GAAG,CAAC6D,WAAW,MAAA,CAAA,IAAWA,SAAAA,CAAUC,IAAI,KAAKA,IAAAA;AACxD;AAEA;;;;IAKA,MAAMqB,4BAA4B,CAACC,WAAAA,GAAAA;AACjC,IAAA,OAAOhD,aAAagD,WAAAA,CAAAA,GAChB/E,UAAAA,CAAEgF,SAAS,CAACD,YAAYE,IAAI,CAACC,YAAY,CAAA,GACzClF,WAAEgF,SAAS,CAACD,WAAAA,CAAYE,IAAI,CAACE,UAAU,CAAA;AAC7C;;;;"}
|
|
@@ -61,7 +61,7 @@ function validateOrder(order) {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
const convertCountQueryParams = (countQuery)=>{
|
|
64
|
-
return parseType({
|
|
64
|
+
return parseType.default({
|
|
65
65
|
type: 'boolean',
|
|
66
66
|
value: countQuery
|
|
67
67
|
});
|
|
@@ -220,7 +220,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
220
220
|
// Try converting strings to regular booleans if possible
|
|
221
221
|
if (___default.default.isString(subPopulate)) {
|
|
222
222
|
try {
|
|
223
|
-
const subPopulateAsBoolean = parseType({
|
|
223
|
+
const subPopulateAsBoolean = parseType.default({
|
|
224
224
|
type: 'boolean',
|
|
225
225
|
value: subPopulate
|
|
226
226
|
});
|
|
@@ -326,7 +326,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
326
326
|
};
|
|
327
327
|
const convertNestedPopulate = (subPopulate, schema)=>{
|
|
328
328
|
if (___default.default.isString(subPopulate)) {
|
|
329
|
-
return parseType({
|
|
329
|
+
return parseType.default({
|
|
330
330
|
type: 'boolean',
|
|
331
331
|
value: subPopulate,
|
|
332
332
|
forceCast: true
|
|
@@ -467,7 +467,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
467
467
|
'$null',
|
|
468
468
|
'$notNull'
|
|
469
469
|
].includes(key)) {
|
|
470
|
-
filters[key] = parseType({
|
|
470
|
+
filters[key] = parseType.default({
|
|
471
471
|
type: 'boolean',
|
|
472
472
|
value: filters[key],
|
|
473
473
|
forceCast: true
|