@strapi/strapi 4.25.2 → 4.25.4
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/Strapi.js +3 -3
- package/dist/Strapi.js.map +1 -1
- package/dist/commands/actions/routes/list/action.js +2 -2
- package/dist/commands/actions/routes/list/action.js.map +1 -1
- package/dist/commands/utils/helpers.js +2 -2
- package/dist/commands/utils/helpers.js.map +1 -1
- package/dist/core/app-configuration/index.js +2 -2
- package/dist/core/app-configuration/index.js.map +1 -1
- package/dist/core/domain/content-type/index.js +4 -4
- package/dist/core/domain/content-type/index.js.map +1 -1
- package/dist/core/loaders/apis.js +2 -2
- package/dist/core/loaders/apis.js.map +1 -1
- package/dist/core/loaders/plugins/get-enabled-plugins.js +8 -8
- package/dist/core/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/core/loaders/plugins/get-user-plugins-config.js +2 -2
- package/dist/core/loaders/plugins/get-user-plugins-config.js.map +1 -1
- package/dist/core/loaders/plugins/index.js +6 -6
- package/dist/core/loaders/plugins/index.js.map +1 -1
- package/dist/core/registries/apis.js +2 -2
- package/dist/core/registries/apis.js.map +1 -1
- package/dist/core/registries/content-types.js +3 -3
- package/dist/core/registries/content-types.js.map +1 -1
- package/dist/core/registries/controllers.js +3 -3
- package/dist/core/registries/controllers.js.map +1 -1
- package/dist/core/registries/custom-fields.js +4 -4
- package/dist/core/registries/custom-fields.js.map +1 -1
- package/dist/core/registries/hooks.js +2 -2
- package/dist/core/registries/hooks.js.map +1 -1
- package/dist/core/registries/middlewares.js +3 -3
- package/dist/core/registries/middlewares.js.map +1 -1
- package/dist/core/registries/modules.js +3 -3
- package/dist/core/registries/modules.js.map +1 -1
- package/dist/core/registries/plugins.js +2 -2
- package/dist/core/registries/plugins.js.map +1 -1
- package/dist/core/registries/policies.js +3 -3
- package/dist/core/registries/policies.js.map +1 -1
- package/dist/core/registries/services.js +3 -3
- package/dist/core/registries/services.js.map +1 -1
- package/dist/core-api/controller/collection-type.js +3 -3
- package/dist/core-api/controller/collection-type.js.map +1 -1
- package/dist/core-api/controller/index.js +2 -2
- package/dist/core-api/controller/index.js.map +1 -1
- package/dist/core-api/controller/single-type.js +2 -2
- package/dist/core-api/controller/single-type.js.map +1 -1
- package/dist/core-api/controller/transform.js +7 -7
- package/dist/core-api/controller/transform.js.map +1 -1
- package/dist/core-api/service/collection-type.js +2 -2
- package/dist/core-api/service/collection-type.js.map +1 -1
- package/dist/core-api/service/pagination.js +10 -10
- package/dist/core-api/service/pagination.js.map +1 -1
- package/dist/core-api/service/single-type.js +2 -2
- package/dist/core-api/service/single-type.js.map +1 -1
- package/dist/ee/index.js +3 -3
- package/dist/ee/index.js.map +1 -1
- package/dist/factories.js +4 -4
- package/dist/factories.js.map +1 -1
- package/dist/load/filepath-to-prop-path.d.ts +1 -1
- package/dist/load/filepath-to-prop-path.d.ts.map +1 -1
- package/dist/load/filepath-to-prop-path.js +27 -6
- package/dist/load/filepath-to-prop-path.js.map +1 -1
- package/dist/load/filepath-to-prop-path.mjs +25 -5
- package/dist/load/filepath-to-prop-path.mjs.map +1 -1
- package/dist/load/load-files.js +2 -2
- package/dist/load/load-files.js.map +1 -1
- package/dist/load/load-files.mjs +2 -2
- package/dist/load/load-files.mjs.map +1 -1
- package/dist/middlewares/body.js +2 -2
- package/dist/middlewares/body.js.map +1 -1
- package/dist/middlewares/public/index.js +4 -4
- package/dist/middlewares/public/index.js.map +1 -1
- package/dist/middlewares/responses.js +2 -2
- package/dist/middlewares/responses.js.map +1 -1
- package/dist/middlewares/security.js +3 -3
- package/dist/middlewares/security.js.map +1 -1
- package/dist/middlewares/session.js +2 -2
- package/dist/middlewares/session.js.map +1 -1
- package/dist/services/auth/index.js +3 -3
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/core-store.js +3 -3
- package/dist/services/core-store.js.map +1 -1
- package/dist/services/cron.js +3 -3
- package/dist/services/cron.js.map +1 -1
- package/dist/services/entity-service/attributes/transforms.js +3 -3
- package/dist/services/entity-service/attributes/transforms.js.map +1 -1
- package/dist/services/entity-service/components.js +18 -18
- package/dist/services/entity-service/components.js.map +1 -1
- package/dist/services/entity-service/params.js +2 -2
- package/dist/services/entity-service/params.js.map +1 -1
- package/dist/services/entity-validator/index.js +19 -19
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/server/compose-endpoint.js +7 -7
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/koa.js +3 -3
- package/dist/services/server/koa.js.map +1 -1
- package/dist/services/server/middleware.js +3 -3
- package/dist/services/server/middleware.js.map +1 -1
- package/dist/services/server/routing.js +2 -2
- package/dist/services/server/routing.js.map +1 -1
- package/dist/services/utils/dynamic-zones.js +5 -5
- package/dist/services/utils/dynamic-zones.js.map +1 -1
- package/dist/utils/cron.js +3 -3
- package/dist/utils/cron.js.map +1 -1
- package/dist/utils/is-initialized.js +3 -3
- package/dist/utils/is-initialized.js.map +1 -1
- package/dist/utils/startup-logger.js +4 -4
- package/dist/utils/startup-logger.js.map +1 -1
- package/dist/utils/startup-logger.mjs +3 -3
- package/dist/utils/startup-logger.mjs.map +1 -1
- package/package.json +21 -21
- package/dist/load/glob.d.ts +0 -7
- package/dist/load/glob.d.ts.map +0 -1
- package/dist/load/glob.js +0 -15
- package/dist/load/glob.js.map +0 -1
- package/dist/load/glob.mjs +0 -14
- package/dist/load/glob.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const fp = require("lodash/fp");
|
|
4
4
|
const strapiUtils = require("@strapi/utils");
|
|
5
5
|
function isEntry(property) {
|
|
6
|
-
return property === null ||
|
|
6
|
+
return property === null || fp.isPlainObject(property) || Array.isArray(property);
|
|
7
7
|
}
|
|
8
8
|
function isDZEntries(property) {
|
|
9
9
|
return Array.isArray(property);
|
|
@@ -16,7 +16,7 @@ const parseBody = (ctx) => {
|
|
|
16
16
|
return { data };
|
|
17
17
|
};
|
|
18
18
|
const transformResponse = (resource, meta = {}, opts = {}) => {
|
|
19
|
-
if (
|
|
19
|
+
if (fp.isNil(resource)) {
|
|
20
20
|
return resource;
|
|
21
21
|
}
|
|
22
22
|
return {
|
|
@@ -29,20 +29,20 @@ function transformComponent(data, component) {
|
|
|
29
29
|
return data.map((datum) => transformComponent(datum, component));
|
|
30
30
|
}
|
|
31
31
|
const res = transformEntry(data, component);
|
|
32
|
-
if (
|
|
32
|
+
if (fp.isNil(res)) {
|
|
33
33
|
return res;
|
|
34
34
|
}
|
|
35
35
|
const { id, attributes } = res;
|
|
36
36
|
return { id, ...attributes };
|
|
37
37
|
}
|
|
38
38
|
function transformEntry(entry, type) {
|
|
39
|
-
if (
|
|
39
|
+
if (fp.isNil(entry)) {
|
|
40
40
|
return entry;
|
|
41
41
|
}
|
|
42
42
|
if (Array.isArray(entry)) {
|
|
43
43
|
return entry.map((singleEntry) => transformEntry(singleEntry, type));
|
|
44
44
|
}
|
|
45
|
-
if (!
|
|
45
|
+
if (!fp.isPlainObject(entry)) {
|
|
46
46
|
throw new Error("Entry must be an object");
|
|
47
47
|
}
|
|
48
48
|
const { id, ...properties } = entry;
|
|
@@ -59,7 +59,7 @@ function transformEntry(entry, type) {
|
|
|
59
59
|
} else if (attribute && attribute.type === "component" && isEntry(property)) {
|
|
60
60
|
attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);
|
|
61
61
|
} else if (attribute && attribute.type === "dynamiczone" && isDZEntries(property)) {
|
|
62
|
-
if (
|
|
62
|
+
if (fp.isNil(property)) {
|
|
63
63
|
attributeValues[key] = property;
|
|
64
64
|
}
|
|
65
65
|
attributeValues[key] = property.map((subProperty) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isNil, isPlainObject } from 'lodash/fp';\nimport { parseMultipartData } from '@strapi/utils';\nimport type Koa from 'koa';\nimport type { Common, Schema, UID } from '@strapi/types';\n\ntype TransformedEntry = {\n id: string;\n attributes: Record<string, unknown>;\n meta?: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\nconst parseBody = (ctx: Koa.Context) => {\n if (ctx.is('multipart')) {\n return parseMultipartData(ctx);\n }\n\n const { data } = ctx.request.body || {};\n\n return { data };\n};\n\nconst transformResponse = (\n resource: any,\n meta: unknown = {},\n opts: { contentType?: Schema.ContentType | Schema.Component } = {}\n) => {\n if (isNil(resource)) {\n return resource;\n }\n\n return {\n data: transformEntry(resource, opts?.contentType),\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Schema.Component\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Schema.Component\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (isNil(res)) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Schema.ContentType | Schema.Component\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Schema.ContentType | Schema.Component\n): TransformedEntry | TransformedEntry[] | null {\n if (isNil(entry)) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(\n property,\n strapi.contentType(attribute.target as Common.UID.ContentType)\n );\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (isNil(property)) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n attributes: attributeValues,\n // NOTE: not necessary for now\n // meta: {},\n };\n}\n\nexport { parseBody, transformResponse };\n"],"names":["isPlainObject","parseMultipartData","isNil"],"mappings":";;;;AAqBA,SAAS,QAAQ,UAAgD;AAC/D,SAAO,aAAa,QAAQA,
|
|
1
|
+
{"version":3,"file":"transform.js","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isNil, isPlainObject } from 'lodash/fp';\nimport { parseMultipartData } from '@strapi/utils';\nimport type Koa from 'koa';\nimport type { Common, Schema, UID } from '@strapi/types';\n\ntype TransformedEntry = {\n id: string;\n attributes: Record<string, unknown>;\n meta?: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\nconst parseBody = (ctx: Koa.Context) => {\n if (ctx.is('multipart')) {\n return parseMultipartData(ctx);\n }\n\n const { data } = ctx.request.body || {};\n\n return { data };\n};\n\nconst transformResponse = (\n resource: any,\n meta: unknown = {},\n opts: { contentType?: Schema.ContentType | Schema.Component } = {}\n) => {\n if (isNil(resource)) {\n return resource;\n }\n\n return {\n data: transformEntry(resource, opts?.contentType),\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Schema.Component\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Schema.Component\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (isNil(res)) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Schema.ContentType | Schema.Component\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Schema.ContentType | Schema.Component\n): TransformedEntry | TransformedEntry[] | null {\n if (isNil(entry)) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(\n property,\n strapi.contentType(attribute.target as Common.UID.ContentType)\n );\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (isNil(property)) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n attributes: attributeValues,\n // NOTE: not necessary for now\n // meta: {},\n };\n}\n\nexport { parseBody, transformResponse };\n"],"names":["isPlainObject","parseMultipartData","isNil"],"mappings":";;;;AAqBA,SAAS,QAAQ,UAAgD;AAC/D,SAAO,aAAa,QAAQA,iBAAc,QAAQ,KAAK,MAAM,QAAQ,QAAQ;AAC/E;AAEA,SAAS,YAAY,UAA2E;AACvF,SAAA,MAAM,QAAQ,QAAQ;AAC/B;AAEM,MAAA,YAAY,CAAC,QAAqB;AAClC,MAAA,IAAI,GAAG,WAAW,GAAG;AACvB,WAAOC,YAAAA,mBAAmB,GAAG;AAAA,EAC/B;AAEA,QAAM,EAAE,KAAK,IAAI,IAAI,QAAQ,QAAQ,CAAA;AAErC,SAAO,EAAE,KAAK;AAChB;AAEM,MAAA,oBAAoB,CACxB,UACA,OAAgB,CAAA,GAChB,OAAgE,CAAA,MAC7D;AACC,MAAAC,GAAAA,MAAM,QAAQ,GAAG;AACZ,WAAA;AAAA,EACT;AAEO,SAAA;AAAA,IACL,MAAM,eAAe,UAAU,MAAM,WAAW;AAAA,IAChD;AAAA,EAAA;AAEJ;AAMA,SAAS,mBACP,MACA,WACsD;AAClD,MAAA,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,CAAC,UAAU,mBAAmB,OAAO,SAAS,CAAC;AAAA,EACjE;AAEM,QAAA,MAAM,eAAe,MAAM,SAAS;AAEtC,MAAAA,GAAAA,MAAM,GAAG,GAAG;AACP,WAAA;AAAA,EACT;AAEM,QAAA,EAAE,IAAI,WAAe,IAAA;AACpB,SAAA,EAAE,IAAI,GAAG;AAClB;AAMA,SAAS,eACP,OACA,MAC8C;AAC1C,MAAAA,GAAAA,MAAM,KAAK,GAAG;AACT,WAAA;AAAA,EACT;AAEI,MAAA,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,gBAAgB,eAAe,aAAa,IAAI,CAAC;AAAA,EACrE;AAEI,MAAA,CAACF,GAAAA,cAAc,KAAK,GAAG;AACnB,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,QAAM,EAAE,IAAI,GAAG,WAAA,IAAe;AAE9B,QAAM,kBAA2C,CAAA;AAEjD,aAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AACnC,UAAA,WAAW,WAAW,GAAG;AAC/B,UAAM,YAAY,QAAQ,KAAK,WAAW,GAAG;AAEzC,QAAA,aAAa,UAAU,SAAS,cAAc,QAAQ,QAAQ,KAAK,YAAY,WAAW;AAC5F,YAAM,OAAO;AAAA,QACX;AAAA,QACA,OAAO,YAAY,UAAU,MAAgC;AAAA,MAAA;AAG/C,sBAAA,GAAG,IAAI,EAAE;IAAK,WACrB,aAAa,UAAU,SAAS,eAAe,QAAQ,QAAQ,GAAG;AAC3D,sBAAA,GAAG,IAAI,mBAAmB,UAAU,OAAO,WAAW,UAAU,SAAS,CAAC;AAAA,IAAA,WACjF,aAAa,UAAU,SAAS,iBAAiB,YAAY,QAAQ,GAAG;AAC7E,UAAAE,GAAAA,MAAM,QAAQ,GAAG;AACnB,wBAAgB,GAAG,IAAI;AAAA,MACzB;AAEA,sBAAgB,GAAG,IAAI,SAAS,IAAI,CAAC,gBAAgB;AACnD,eAAO,mBAAmB,aAAa,OAAO,WAAW,YAAY,WAAW,CAAC;AAAA,MAAA,CAClF;AAAA,IAAA,WACQ,aAAa,UAAU,SAAS,WAAW,QAAQ,QAAQ,GAAG;AACvE,YAAM,OAAO,eAAe,UAAU,OAAO,YAAY,qBAAqB,CAAC;AAE/D,sBAAA,GAAG,IAAI,EAAE;IAAK,OACzB;AACL,sBAAgB,GAAG,IAAI;AAAA,IACzB;AAAA,EACF;AAEO,SAAA;AAAA,IACL;AAAA,IACA,YAAY;AAAA;AAAA;AAAA,EAAA;AAIhB;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const
|
|
2
|
+
const fp = require("lodash/fp");
|
|
3
3
|
const strapiUtils = require("@strapi/utils");
|
|
4
4
|
const pagination = require("./pagination.js");
|
|
5
5
|
const getFetchParams = require("./get-fetch-params.js");
|
|
@@ -8,7 +8,7 @@ const {
|
|
|
8
8
|
constants: { PUBLISHED_AT_ATTRIBUTE }
|
|
9
9
|
} = strapiUtils.contentTypes;
|
|
10
10
|
const setPublishedAt = (data) => {
|
|
11
|
-
data[PUBLISHED_AT_ATTRIBUTE] =
|
|
11
|
+
data[PUBLISHED_AT_ATTRIBUTE] = fp.propOr(/* @__PURE__ */ new Date(), PUBLISHED_AT_ATTRIBUTE, data);
|
|
12
12
|
};
|
|
13
13
|
const createCollectionTypeService = ({
|
|
14
14
|
contentType
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-type.js","sources":["../../../src/core-api/service/collection-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { CoreApi, Schema, Entity } from '@strapi/types';\n\nimport {\n getPaginationInfo,\n convertPagedToStartLimit,\n shouldCount,\n transformPaginationResponse,\n} from './pagination';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypes;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n *\n * Returns a collection type service to handle default core-api actions\n */\nconst createCollectionTypeService = ({\n contentType,\n}: {\n contentType: Schema.CollectionType;\n}): CoreApi.Service.CollectionType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n\n async find(params = {}) {\n const fetchParams = this.getFetchParams(params);\n\n const paginationInfo = getPaginationInfo(fetchParams);\n\n const results = await strapi.entityService?.findMany(uid, {\n ...fetchParams,\n ...convertPagedToStartLimit(paginationInfo),\n });\n\n if (shouldCount(fetchParams)) {\n const count = await strapi.entityService?.count(uid, { ...fetchParams, ...paginationInfo });\n\n if (typeof count !== 'number') {\n throw new Error('Count should be a number');\n }\n\n return {\n results,\n pagination: transformPaginationResponse(paginationInfo, count),\n };\n }\n\n return {\n results,\n pagination: paginationInfo,\n };\n },\n\n findOne(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.findOne(uid, entityId, this.getFetchParams(params));\n },\n\n create(params = { data: {} }) {\n const { data } = params;\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n\n return strapi.entityService?.create(uid, { ...params, data });\n },\n\n update(entityId: Entity.ID, params = { data: {} }) {\n const { data } = params;\n\n return strapi.entityService?.update(uid, entityId, { ...params, data });\n },\n\n delete(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.delete(uid, entityId, params);\n },\n };\n};\n\nexport default createCollectionTypeService;\n"],"names":["contentTypes","propOr","getFetchParams","getPaginationInfo","convertPagedToStartLimit","shouldCount","transformPaginationResponse"],"mappings":";;;;;AAYA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAuB;AACtC,IAAIA;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAIC,
|
|
1
|
+
{"version":3,"file":"collection-type.js","sources":["../../../src/core-api/service/collection-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { CoreApi, Schema, Entity } from '@strapi/types';\n\nimport {\n getPaginationInfo,\n convertPagedToStartLimit,\n shouldCount,\n transformPaginationResponse,\n} from './pagination';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypes;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n *\n * Returns a collection type service to handle default core-api actions\n */\nconst createCollectionTypeService = ({\n contentType,\n}: {\n contentType: Schema.CollectionType;\n}): CoreApi.Service.CollectionType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n\n async find(params = {}) {\n const fetchParams = this.getFetchParams(params);\n\n const paginationInfo = getPaginationInfo(fetchParams);\n\n const results = await strapi.entityService?.findMany(uid, {\n ...fetchParams,\n ...convertPagedToStartLimit(paginationInfo),\n });\n\n if (shouldCount(fetchParams)) {\n const count = await strapi.entityService?.count(uid, { ...fetchParams, ...paginationInfo });\n\n if (typeof count !== 'number') {\n throw new Error('Count should be a number');\n }\n\n return {\n results,\n pagination: transformPaginationResponse(paginationInfo, count),\n };\n }\n\n return {\n results,\n pagination: paginationInfo,\n };\n },\n\n findOne(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.findOne(uid, entityId, this.getFetchParams(params));\n },\n\n create(params = { data: {} }) {\n const { data } = params;\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n\n return strapi.entityService?.create(uid, { ...params, data });\n },\n\n update(entityId: Entity.ID, params = { data: {} }) {\n const { data } = params;\n\n return strapi.entityService?.update(uid, entityId, { ...params, data });\n },\n\n delete(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.delete(uid, entityId, params);\n },\n };\n};\n\nexport default createCollectionTypeService;\n"],"names":["contentTypes","propOr","getFetchParams","getPaginationInfo","convertPagedToStartLimit","shouldCount","transformPaginationResponse"],"mappings":";;;;;AAYA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAuB;AACtC,IAAIA;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAIC,GAAA,2BAAW,QAAQ,wBAAwB,IAAI;AAChF;AAMA,MAAM,8BAA8B,CAAC;AAAA,EACnC;AACF,MAEsC;AAC9B,QAAA,EAAE,IAAQ,IAAA;AAEJ,SAAA;AAAA,IAAA,gBACVC,eAAA;AAAA,IAEA,MAAM,KAAK,SAAS,IAAI;AAChB,YAAA,cAAc,KAAK,eAAe,MAAM;AAExC,YAAA,iBAAiBC,6BAAkB,WAAW;AAEpD,YAAM,UAAU,MAAM,OAAO,eAAe,SAAS,KAAK;AAAA,QACxD,GAAG;AAAA,QACH,GAAGC,WAAAA,yBAAyB,cAAc;AAAA,MAAA,CAC3C;AAEG,UAAAC,WAAAA,YAAY,WAAW,GAAG;AACtB,cAAA,QAAQ,MAAM,OAAO,eAAe,MAAM,KAAK,EAAE,GAAG,aAAa,GAAG,eAAA,CAAgB;AAEtF,YAAA,OAAO,UAAU,UAAU;AACvB,gBAAA,IAAI,MAAM,0BAA0B;AAAA,QAC5C;AAEO,eAAA;AAAA,UACL;AAAA,UACA,YAAYC,WAAAA,4BAA4B,gBAAgB,KAAK;AAAA,QAAA;AAAA,MAEjE;AAEO,aAAA;AAAA,QACL;AAAA,QACA,YAAY;AAAA,MAAA;AAAA,IAEhB;AAAA,IAEA,QAAQ,UAAqB,SAAS,IAAI;AACjC,aAAA,OAAO,eAAe,QAAQ,KAAK,UAAU,KAAK,eAAe,MAAM,CAAC;AAAA,IACjF;AAAA,IAEA,OAAO,SAAS,EAAE,MAAM,MAAM;AACtB,YAAA,EAAE,KAAS,IAAA;AAEb,UAAA,mBAAmB,WAAW,GAAG;AACnC,uBAAe,IAAI;AAAA,MACrB;AAEO,aAAA,OAAO,eAAe,OAAO,KAAK,EAAE,GAAG,QAAQ,MAAM;AAAA,IAC9D;AAAA,IAEA,OAAO,UAAqB,SAAS,EAAE,MAAM,MAAM;AAC3C,YAAA,EAAE,KAAS,IAAA;AAEV,aAAA,OAAO,eAAe,OAAO,KAAK,UAAU,EAAE,GAAG,QAAQ,KAAA,CAAM;AAAA,IACxE;AAAA,IAEA,OAAO,UAAqB,SAAS,IAAI;AACvC,aAAO,OAAO,eAAe,OAAO,KAAK,UAAU,MAAM;AAAA,IAC3D;AAAA,EAAA;AAEJ;;"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const fp = require("lodash/fp");
|
|
4
4
|
const strapiUtils = require("@strapi/utils");
|
|
5
5
|
const getLimitConfigDefaults = () => ({
|
|
6
|
-
defaultLimit:
|
|
7
|
-
maxLimit:
|
|
6
|
+
defaultLimit: fp.toNumber(strapi.config.get("api.rest.defaultLimit", 25)),
|
|
7
|
+
maxLimit: fp.toNumber(strapi.config.get("api.rest.maxLimit")) || null
|
|
8
8
|
});
|
|
9
9
|
const shouldApplyMaxLimit = (limit, maxLimit, { isPagedPagination: isPagedPagination2 = false } = {}) => !isPagedPagination2 && limit === -1 || maxLimit !== null && limit > maxLimit;
|
|
10
10
|
const shouldCount = (params) => {
|
|
11
|
-
if (
|
|
11
|
+
if (fp.has("pagination.withCount", params)) {
|
|
12
12
|
const withCount = params.pagination?.withCount;
|
|
13
13
|
if (typeof withCount === "boolean") {
|
|
14
14
|
return withCount;
|
|
@@ -28,8 +28,8 @@ const shouldCount = (params) => {
|
|
|
28
28
|
}
|
|
29
29
|
return Boolean(strapi.config.get("api.rest.withCount", true));
|
|
30
30
|
};
|
|
31
|
-
const isOffsetPagination = (pagination) =>
|
|
32
|
-
const isPagedPagination = (pagination) =>
|
|
31
|
+
const isOffsetPagination = (pagination) => fp.has("start", pagination) || fp.has("limit", pagination);
|
|
32
|
+
const isPagedPagination = (pagination) => fp.has("page", pagination) || fp.has("pageSize", pagination);
|
|
33
33
|
const getPaginationInfo = (params) => {
|
|
34
34
|
const { defaultLimit, maxLimit } = getLimitConfigDefaults();
|
|
35
35
|
const { pagination } = params;
|
|
@@ -47,15 +47,15 @@ const getPaginationInfo = (params) => {
|
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
if (isPagedPagination(pagination)) {
|
|
50
|
-
const pageSize =
|
|
50
|
+
const pageSize = fp.isUndefined(pagination.pageSize) ? defaultLimit : Math.max(1, fp.toNumber(pagination.pageSize));
|
|
51
51
|
return {
|
|
52
|
-
page: Math.max(1,
|
|
52
|
+
page: Math.max(1, fp.toNumber(pagination.page || 1)),
|
|
53
53
|
pageSize: typeof maxLimit === "number" && shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true }) ? maxLimit : Math.max(1, pageSize)
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
|
-
const limit =
|
|
56
|
+
const limit = fp.isUndefined(pagination.limit) ? defaultLimit : fp.toNumber(pagination.limit);
|
|
57
57
|
return {
|
|
58
|
-
start: Math.max(0,
|
|
58
|
+
start: Math.max(0, fp.toNumber(pagination.start || 0)),
|
|
59
59
|
limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit)
|
|
60
60
|
};
|
|
61
61
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, toNumber, isUndefined } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\n/**\n * Should maxLimit be used as the limit or not\n */\nconst shouldApplyMaxLimit = (\n limit: number,\n maxLimit: number | null,\n { isPagedPagination = false } = {}\n) => (!isPagedPagination && limit === -1) || (maxLimit !== null && limit > maxLimit);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination);\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { pagination } = params;\n\n const isPaged = isPagedPagination(pagination);\n const isOffset = isOffsetPagination(pagination);\n\n if (isOffset && isPaged) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Expected either start/limit or page/pageSize'\n );\n }\n\n if (!isOffset && !isPaged) {\n return {\n page: 1,\n pageSize: defaultLimit,\n };\n }\n\n if (isPagedPagination(pagination)) {\n const pageSize = isUndefined(pagination.pageSize)\n ? defaultLimit\n : Math.max(1, toNumber(pagination.pageSize));\n\n return {\n page: Math.max(1, toNumber(pagination.page || 1)),\n pageSize:\n typeof maxLimit === 'number' &&\n shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })\n ? maxLimit\n : Math.max(1, pageSize),\n };\n }\n\n const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);\n\n return {\n start: Math.max(0, toNumber(pagination.start || 0)),\n limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),\n };\n};\n\nconst convertPagedToStartLimit = (paginationInfo: PaginationInfo) => {\n if ('page' in paginationInfo) {\n const { page, pageSize } = paginationInfo;\n return {\n start: (page - 1) * pageSize,\n limit: pageSize,\n };\n }\n\n return paginationInfo;\n};\n\nconst transformPaginationResponse = (paginationInfo: PaginationInfo, count: number) => {\n if ('page' in paginationInfo) {\n return {\n ...paginationInfo,\n pageCount: Math.ceil(count / paginationInfo.pageSize),\n total: count,\n };\n }\n\n return {\n ...paginationInfo,\n total: count,\n };\n};\n\nexport { getPaginationInfo, convertPagedToStartLimit, transformPaginationResponse, shouldCount };\n"],"names":["toNumber","isPagedPagination","has","errors","isUndefined"],"mappings":";;;;AAgCA,MAAM,yBAAyB,OAAO;AAAA,EACpC,cAAcA,
|
|
1
|
+
{"version":3,"file":"pagination.js","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, toNumber, isUndefined } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\n/**\n * Should maxLimit be used as the limit or not\n */\nconst shouldApplyMaxLimit = (\n limit: number,\n maxLimit: number | null,\n { isPagedPagination = false } = {}\n) => (!isPagedPagination && limit === -1) || (maxLimit !== null && limit > maxLimit);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination);\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { pagination } = params;\n\n const isPaged = isPagedPagination(pagination);\n const isOffset = isOffsetPagination(pagination);\n\n if (isOffset && isPaged) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Expected either start/limit or page/pageSize'\n );\n }\n\n if (!isOffset && !isPaged) {\n return {\n page: 1,\n pageSize: defaultLimit,\n };\n }\n\n if (isPagedPagination(pagination)) {\n const pageSize = isUndefined(pagination.pageSize)\n ? defaultLimit\n : Math.max(1, toNumber(pagination.pageSize));\n\n return {\n page: Math.max(1, toNumber(pagination.page || 1)),\n pageSize:\n typeof maxLimit === 'number' &&\n shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })\n ? maxLimit\n : Math.max(1, pageSize),\n };\n }\n\n const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);\n\n return {\n start: Math.max(0, toNumber(pagination.start || 0)),\n limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),\n };\n};\n\nconst convertPagedToStartLimit = (paginationInfo: PaginationInfo) => {\n if ('page' in paginationInfo) {\n const { page, pageSize } = paginationInfo;\n return {\n start: (page - 1) * pageSize,\n limit: pageSize,\n };\n }\n\n return paginationInfo;\n};\n\nconst transformPaginationResponse = (paginationInfo: PaginationInfo, count: number) => {\n if ('page' in paginationInfo) {\n return {\n ...paginationInfo,\n pageCount: Math.ceil(count / paginationInfo.pageSize),\n total: count,\n };\n }\n\n return {\n ...paginationInfo,\n total: count,\n };\n};\n\nexport { getPaginationInfo, convertPagedToStartLimit, transformPaginationResponse, shouldCount };\n"],"names":["toNumber","isPagedPagination","has","errors","isUndefined"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const
|
|
2
|
+
const fp = require("lodash/fp");
|
|
3
3
|
const strapiUtils = require("@strapi/utils");
|
|
4
4
|
const getFetchParams = require("./get-fetch-params.js");
|
|
5
5
|
const {
|
|
@@ -7,7 +7,7 @@ const {
|
|
|
7
7
|
constants: { PUBLISHED_AT_ATTRIBUTE }
|
|
8
8
|
} = strapiUtils.contentTypes;
|
|
9
9
|
const setPublishedAt = (data) => {
|
|
10
|
-
data[PUBLISHED_AT_ATTRIBUTE] =
|
|
10
|
+
data[PUBLISHED_AT_ATTRIBUTE] = fp.propOr(/* @__PURE__ */ new Date(), PUBLISHED_AT_ATTRIBUTE, data);
|
|
11
11
|
};
|
|
12
12
|
const createSingleTypeService = ({
|
|
13
13
|
contentType
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-type.js","sources":["../../../src/core-api/service/single-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport type { CoreApi, Schema, Common } from '@strapi/types';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypeUtils;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n * Returns a single type service to handle default core-api actions\n */\nconst createSingleTypeService = ({\n contentType,\n}: {\n contentType: Schema.SingleType;\n}): CoreApi.Service.SingleType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n /**\n * Returns singleType content\n */\n find(params = {}) {\n return (\n strapi.entityService?.findMany(uid as Common.UID.SingleType, this.getFetchParams(params)) ??\n null\n );\n },\n\n /**\n * Creates or updates a singleType content\n *\n * @return {Promise}\n */\n async createOrUpdate({ data, ...params } = { data: {} }) {\n const entity = await this.find({ ...params, publicationState: 'preview' });\n\n if (!entity) {\n const count = await strapi.query(uid).count();\n if (count >= 1) {\n throw new errors.ValidationError('singleType.alreadyExists');\n }\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n return strapi.entityService?.create(uid, { ...params, data });\n }\n\n return strapi.entityService?.update(uid, entity.id, { ...params, data });\n },\n\n /**\n * Deletes the singleType content\n *\n * @return {Promise}\n */\n async delete(params = {}) {\n const entity = await this.find(params);\n\n if (!entity) return;\n\n return strapi.entityService?.delete(uid, entity.id);\n },\n };\n};\n\nexport default createSingleTypeService;\n"],"names":["contentTypeUtils","propOr","getFetchParams","errors"],"mappings":";;;;AAKA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAuB;AACtC,IAAIA;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAIC,
|
|
1
|
+
{"version":3,"file":"single-type.js","sources":["../../../src/core-api/service/single-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport type { CoreApi, Schema, Common } from '@strapi/types';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypeUtils;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n * Returns a single type service to handle default core-api actions\n */\nconst createSingleTypeService = ({\n contentType,\n}: {\n contentType: Schema.SingleType;\n}): CoreApi.Service.SingleType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n /**\n * Returns singleType content\n */\n find(params = {}) {\n return (\n strapi.entityService?.findMany(uid as Common.UID.SingleType, this.getFetchParams(params)) ??\n null\n );\n },\n\n /**\n * Creates or updates a singleType content\n *\n * @return {Promise}\n */\n async createOrUpdate({ data, ...params } = { data: {} }) {\n const entity = await this.find({ ...params, publicationState: 'preview' });\n\n if (!entity) {\n const count = await strapi.query(uid).count();\n if (count >= 1) {\n throw new errors.ValidationError('singleType.alreadyExists');\n }\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n return strapi.entityService?.create(uid, { ...params, data });\n }\n\n return strapi.entityService?.update(uid, entity.id, { ...params, data });\n },\n\n /**\n * Deletes the singleType content\n *\n * @return {Promise}\n */\n async delete(params = {}) {\n const entity = await this.find(params);\n\n if (!entity) return;\n\n return strapi.entityService?.delete(uid, entity.id);\n },\n };\n};\n\nexport default createSingleTypeService;\n"],"names":["contentTypeUtils","propOr","getFetchParams","errors"],"mappings":";;;;AAKA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAuB;AACtC,IAAIA;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAIC,GAAA,2BAAW,QAAQ,wBAAwB,IAAI;AAChF;AAKA,MAAM,0BAA0B,CAAC;AAAA,EAC/B;AACF,MAEkC;AAC1B,QAAA,EAAE,IAAQ,IAAA;AAEJ,SAAA;AAAA,IAAA,gBACVC,eAAA;AAAA;AAAA;AAAA;AAAA,IAIA,KAAK,SAAS,IAAI;AAEd,aAAA,OAAO,eAAe,SAAS,KAA8B,KAAK,eAAe,MAAM,CAAC,KACxF;AAAA,IAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,eAAe,EAAE,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,CAAA,KAAM;AACjD,YAAA,SAAS,MAAM,KAAK,KAAK,EAAE,GAAG,QAAQ,kBAAkB,UAAA,CAAW;AAEzE,UAAI,CAAC,QAAQ;AACX,cAAM,QAAQ,MAAM,OAAO,MAAM,GAAG,EAAE;AACtC,YAAI,SAAS,GAAG;AACR,gBAAA,IAAIC,YAAO,OAAA,gBAAgB,0BAA0B;AAAA,QAC7D;AAEI,YAAA,mBAAmB,WAAW,GAAG;AACnC,yBAAe,IAAI;AAAA,QACrB;AACO,eAAA,OAAO,eAAe,OAAO,KAAK,EAAE,GAAG,QAAQ,MAAM;AAAA,MAC9D;AAEO,aAAA,OAAO,eAAe,OAAO,KAAK,OAAO,IAAI,EAAE,GAAG,QAAQ,KAAA,CAAM;AAAA,IACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,OAAO,SAAS,IAAI;AACxB,YAAM,SAAS,MAAM,KAAK,KAAK,MAAM;AAErC,UAAI,CAAC;AAAQ;AAEb,aAAO,OAAO,eAAe,OAAO,KAAK,OAAO,EAAE;AAAA,IACpD;AAAA,EAAA;AAEJ;;"}
|
package/dist/ee/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const
|
|
2
|
+
const fp = require("lodash/fp");
|
|
3
3
|
const license = require("./license.js");
|
|
4
4
|
const cron = require("../utils/cron.js");
|
|
5
5
|
const ONE_MINUTE = 1e3 * 60;
|
|
@@ -10,7 +10,7 @@ const ee = {
|
|
|
10
10
|
const disable = (message) => {
|
|
11
11
|
const shouldEmitEvent = ee.enabled !== false;
|
|
12
12
|
ee.logger?.warn(`${message} Switching to CE.`);
|
|
13
|
-
ee.licenseInfo =
|
|
13
|
+
ee.licenseInfo = fp.pick("licenseKey", ee.licenseInfo);
|
|
14
14
|
ee.enabled = false;
|
|
15
15
|
if (shouldEmitEvent) {
|
|
16
16
|
strapi.eventHub.emit("ee.disable");
|
|
@@ -73,7 +73,7 @@ const onlineUpdate = async ({ strapi: strapi2 }) => {
|
|
|
73
73
|
if (license$1) {
|
|
74
74
|
try {
|
|
75
75
|
const newLicenseInfo = license.verifyLicense(license$1);
|
|
76
|
-
const licenseInfoChanged = !
|
|
76
|
+
const licenseInfoChanged = !fp.isEqual(newLicenseInfo.features, ee.licenseInfo.features) || newLicenseInfo.seats !== ee.licenseInfo.seats || newLicenseInfo.type !== ee.licenseInfo.type;
|
|
77
77
|
ee.licenseInfo = newLicenseInfo;
|
|
78
78
|
const wasEnabled = ee.enabled;
|
|
79
79
|
validateInfo();
|
package/dist/ee/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/ee/index.ts"],"sourcesContent":["import { pick, isEqual } from 'lodash/fp';\nimport type { Logger } from '@strapi/logger';\nimport type { Strapi } from '@strapi/types';\n\nimport { readLicense, verifyLicense, fetchLicense, LicenseCheckError } from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {},\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key for potential re-enabling during a later check\n ee.licenseInfo = pick('licenseKey', ee.licenseInfo);\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Strapi }) => {\n const { get, commit, rollback } = (await strapi.db?.transaction()) as any;\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db!.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch (error) {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n strapi.cron.add({ [shiftCronExpression('0 0 */12 * * *')]: onlineUpdate });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["pick","license","readLicense","verifyLicense","strapi","get","result","LicenseCheckError","fetchLicense","isEqual","shiftCronExpression"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/ee/index.ts"],"sourcesContent":["import { pick, isEqual } from 'lodash/fp';\nimport type { Logger } from '@strapi/logger';\nimport type { Strapi } from '@strapi/types';\n\nimport { readLicense, verifyLicense, fetchLicense, LicenseCheckError } from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {},\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key for potential re-enabling during a later check\n ee.licenseInfo = pick('licenseKey', ee.licenseInfo);\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Strapi }) => {\n const { get, commit, rollback } = (await strapi.db?.transaction()) as any;\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db!.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch (error) {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n strapi.cron.add({ [shiftCronExpression('0 0 */12 * * *')]: onlineUpdate });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["pick","license","readLicense","verifyLicense","strapi","get","result","LicenseCheckError","fetchLicense","isEqual","shiftCronExpression"],"mappings":"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"}
|
package/dist/factories.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const fp = require("lodash/fp");
|
|
4
4
|
const index = require("./core-api/controller/index.js");
|
|
5
5
|
const index$1 = require("./core-api/service/index.js");
|
|
6
6
|
const index$2 = require("./core-api/routes/index.js");
|
|
@@ -66,9 +66,9 @@ function createCoreRouter(uid, cfg) {
|
|
|
66
66
|
const defaultRoute = defaultRoutes[routeName];
|
|
67
67
|
Object.assign(defaultRoute.config, config[routeName] || {});
|
|
68
68
|
});
|
|
69
|
-
const selectedRoutes =
|
|
70
|
-
(routes2) => except ?
|
|
71
|
-
(routes2) => only ?
|
|
69
|
+
const selectedRoutes = fp.pipe(
|
|
70
|
+
(routes2) => except ? fp.omit(except, routes2) : routes2,
|
|
71
|
+
(routes2) => only ? fp.pick(only, routes2) : routes2
|
|
72
72
|
)(defaultRoutes);
|
|
73
73
|
routes = Object.values(selectedRoutes);
|
|
74
74
|
}
|
package/dist/factories.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factories.js","sources":["../src/factories.ts"],"sourcesContent":["import { pipe, omit, pick } from 'lodash/fp';\nimport type { Strapi, Common, CoreApi, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { createService } from './core-api/service';\nimport { createRoutes } from './core-api/routes';\n\nconst symbols = {\n CustomController: Symbol('StrapiCustomCoreController'),\n} as const;\n\ntype WithStrapiCallback<T> = T | (<S extends { strapi: Strapi }>(params: S) => T);\n\n// Content type is proxied to allow for dynamic content type updates\nconst getContentTypeProxy = (strapi: Strapi, uid: Common.UID.ContentType) => {\n return new Proxy(strapi.contentType(uid), {\n get(target, prop) {\n const contentType = strapi.contentType(uid);\n if (prop in contentType) {\n return contentType[prop as keyof typeof contentType];\n }\n },\n });\n};\n\nconst createCoreController = <\n TUID extends Common.UID.ContentType,\n TController extends CoreApi.Controller.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Controller.Extendable<TUID> & TController>>\n) => {\n return ({ strapi }: { strapi: Strapi }): TController & CoreApi.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseController) as Array<keyof typeof baseController>) {\n if (userCtrl[methodName] === undefined) {\n userCtrl[methodName] = baseController[methodName];\n }\n }\n\n Object.setPrototypeOf(userCtrl, baseController);\n\n const isCustom = typeof cfg !== 'undefined';\n if (isCustom) {\n Object.defineProperty(userCtrl, symbols.CustomController, {\n writable: false,\n configurable: false,\n enumerable: false,\n });\n }\n\n return userCtrl;\n };\n};\n\nfunction createCoreService<\n TUID extends Common.UID.ContentType,\n TService extends CoreApi.Service.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Service.Extendable<TUID> & TService>>\n) {\n return ({ strapi }: { strapi: Strapi }): TService & CoreApi.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userService = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseService) as Array<keyof typeof baseService>) {\n if (userService[methodName] === undefined) {\n userService[methodName] = baseService[methodName];\n }\n }\n\n Object.setPrototypeOf(userService, baseService);\n return userService;\n };\n}\n\nfunction createCoreRouter<T extends Common.UID.ContentType>(\n uid: T,\n cfg?: CoreApi.Router.RouterConfig<T>\n): CoreApi.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: CoreApi.Router.Route[];\n\n return {\n type,\n prefix,\n get routes() {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n Object.assign(defaultRoute.config, config[routeName] || {});\n });\n\n const selectedRoutes = pipe(\n (routes) => (except ? omit(except, routes) : routes),\n (routes) => (only ? pick(only, routes) : routes)\n )(defaultRoutes);\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst isCustomController = <T extends Common.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport { createCoreController, createCoreService, createCoreRouter, isCustomController };\n"],"names":["strapi","createController","createService","createRoutes","pipe","routes","omit","pick"],"mappings":";;;;;;AAOA,MAAM,UAAU;AAAA,EACd,kBAAkB,OAAO,4BAA4B;AACvD;AAKA,MAAM,sBAAsB,CAACA,SAAgB,QAAgC;AAC3E,SAAO,IAAI,MAAMA,QAAO,YAAY,GAAG,GAAG;AAAA,IACxC,IAAI,QAAQ,MAAM;AACV,YAAA,cAAcA,QAAO,YAAY,GAAG;AAC1C,UAAI,QAAQ,aAAa;AACvB,eAAO,YAAY,IAAgC;AAAA,MACrD;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEM,MAAA,uBAAuB,CAI3B,KACA,QACG;AACH,SAAO,CAAC,EAAE,QAAAA,cAAqF;AACvF,UAAA,iBAAiBC,uBAAiB,EAAE,aAAa,oBAAoBD,SAAQ,GAAG,GAAG;AAEnF,UAAA,WAAW,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAQ,CAAA,IAAI,OAAQ;AAEvE,eAAW,cAAc,OAAO,KAAK,cAAc,GAAyC;AACtF,UAAA,SAAS,UAAU,MAAM,QAAW;AAC7B,iBAAA,UAAU,IAAI,eAAe,UAAU;AAAA,MAClD;AAAA,IACF;AAEO,WAAA,eAAe,UAAU,cAAc;AAExC,UAAA,WAAW,OAAO,QAAQ;AAChC,QAAI,UAAU;AACL,aAAA,eAAe,UAAU,QAAQ,kBAAkB;AAAA,QACxD,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,MAAA,CACb;AAAA,IACH;AAEO,WAAA;AAAA,EAAA;AAEX;AAEA,SAAS,kBAIP,KACA,KACA;AACA,SAAO,CAAC,EAAE,QAAAA,cAA+E;AACjF,UAAA,cAAcE,sBAAc,EAAE,aAAa,oBAAoBF,SAAQ,GAAG,GAAG;AAE7E,UAAA,cAAc,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAQ,CAAA,IAAI,OAAQ;AAE1E,eAAW,cAAc,OAAO,KAAK,WAAW,GAAsC;AAChF,UAAA,YAAY,UAAU,MAAM,QAAW;AAC7B,oBAAA,UAAU,IAAI,YAAY,UAAU;AAAA,MAClD;AAAA,IACF;AAEO,WAAA,eAAe,aAAa,WAAW;AACvC,WAAA;AAAA,EAAA;AAEX;AAEA,SAAS,iBACP,KACA,KACuB;AACjB,QAAA,EAAE,QAAQ,SAAS,CAAA,GAAI,MAAM,QAAQ,OAAO,cAAA,IAAkB,OAAO;AACvE,MAAA;AAEG,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,SAAS;AACX,UAAI,CAAC,QAAQ;AACL,cAAA,cAAc,OAAO,YAAY,GAAG;AAE1C,cAAM,gBAAgBG,QAAAA,aAAa,EAAE,YAAa,CAAA;AAC5C,cAAA,OAAO,OAAO,KAAK,aAAa;AAEjC,aAAA,QAAQ,CAAC,cAAc;AACpB,gBAAA,eAAe,cAAc,SAAS;AAE5C,iBAAO,OAAO,aAAa,QAAQ,OAAO,SAAS,KAAK,CAAA,CAAE;AAAA,QAAA,CAC3D;AAED,cAAM,iBAAiBC,
|
|
1
|
+
{"version":3,"file":"factories.js","sources":["../src/factories.ts"],"sourcesContent":["import { pipe, omit, pick } from 'lodash/fp';\nimport type { Strapi, Common, CoreApi, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { createService } from './core-api/service';\nimport { createRoutes } from './core-api/routes';\n\nconst symbols = {\n CustomController: Symbol('StrapiCustomCoreController'),\n} as const;\n\ntype WithStrapiCallback<T> = T | (<S extends { strapi: Strapi }>(params: S) => T);\n\n// Content type is proxied to allow for dynamic content type updates\nconst getContentTypeProxy = (strapi: Strapi, uid: Common.UID.ContentType) => {\n return new Proxy(strapi.contentType(uid), {\n get(target, prop) {\n const contentType = strapi.contentType(uid);\n if (prop in contentType) {\n return contentType[prop as keyof typeof contentType];\n }\n },\n });\n};\n\nconst createCoreController = <\n TUID extends Common.UID.ContentType,\n TController extends CoreApi.Controller.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Controller.Extendable<TUID> & TController>>\n) => {\n return ({ strapi }: { strapi: Strapi }): TController & CoreApi.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseController) as Array<keyof typeof baseController>) {\n if (userCtrl[methodName] === undefined) {\n userCtrl[methodName] = baseController[methodName];\n }\n }\n\n Object.setPrototypeOf(userCtrl, baseController);\n\n const isCustom = typeof cfg !== 'undefined';\n if (isCustom) {\n Object.defineProperty(userCtrl, symbols.CustomController, {\n writable: false,\n configurable: false,\n enumerable: false,\n });\n }\n\n return userCtrl;\n };\n};\n\nfunction createCoreService<\n TUID extends Common.UID.ContentType,\n TService extends CoreApi.Service.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Service.Extendable<TUID> & TService>>\n) {\n return ({ strapi }: { strapi: Strapi }): TService & CoreApi.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userService = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseService) as Array<keyof typeof baseService>) {\n if (userService[methodName] === undefined) {\n userService[methodName] = baseService[methodName];\n }\n }\n\n Object.setPrototypeOf(userService, baseService);\n return userService;\n };\n}\n\nfunction createCoreRouter<T extends Common.UID.ContentType>(\n uid: T,\n cfg?: CoreApi.Router.RouterConfig<T>\n): CoreApi.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: CoreApi.Router.Route[];\n\n return {\n type,\n prefix,\n get routes() {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n Object.assign(defaultRoute.config, config[routeName] || {});\n });\n\n const selectedRoutes = pipe(\n (routes) => (except ? omit(except, routes) : routes),\n (routes) => (only ? pick(only, routes) : routes)\n )(defaultRoutes);\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst isCustomController = <T extends Common.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport { createCoreController, createCoreService, createCoreRouter, isCustomController };\n"],"names":["strapi","createController","createService","createRoutes","pipe","routes","omit","pick"],"mappings":";;;;;;AAOA,MAAM,UAAU;AAAA,EACd,kBAAkB,OAAO,4BAA4B;AACvD;AAKA,MAAM,sBAAsB,CAACA,SAAgB,QAAgC;AAC3E,SAAO,IAAI,MAAMA,QAAO,YAAY,GAAG,GAAG;AAAA,IACxC,IAAI,QAAQ,MAAM;AACV,YAAA,cAAcA,QAAO,YAAY,GAAG;AAC1C,UAAI,QAAQ,aAAa;AACvB,eAAO,YAAY,IAAgC;AAAA,MACrD;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEM,MAAA,uBAAuB,CAI3B,KACA,QACG;AACH,SAAO,CAAC,EAAE,QAAAA,cAAqF;AACvF,UAAA,iBAAiBC,uBAAiB,EAAE,aAAa,oBAAoBD,SAAQ,GAAG,GAAG;AAEnF,UAAA,WAAW,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAQ,CAAA,IAAI,OAAQ;AAEvE,eAAW,cAAc,OAAO,KAAK,cAAc,GAAyC;AACtF,UAAA,SAAS,UAAU,MAAM,QAAW;AAC7B,iBAAA,UAAU,IAAI,eAAe,UAAU;AAAA,MAClD;AAAA,IACF;AAEO,WAAA,eAAe,UAAU,cAAc;AAExC,UAAA,WAAW,OAAO,QAAQ;AAChC,QAAI,UAAU;AACL,aAAA,eAAe,UAAU,QAAQ,kBAAkB;AAAA,QACxD,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,MAAA,CACb;AAAA,IACH;AAEO,WAAA;AAAA,EAAA;AAEX;AAEA,SAAS,kBAIP,KACA,KACA;AACA,SAAO,CAAC,EAAE,QAAAA,cAA+E;AACjF,UAAA,cAAcE,sBAAc,EAAE,aAAa,oBAAoBF,SAAQ,GAAG,GAAG;AAE7E,UAAA,cAAc,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAQ,CAAA,IAAI,OAAQ;AAE1E,eAAW,cAAc,OAAO,KAAK,WAAW,GAAsC;AAChF,UAAA,YAAY,UAAU,MAAM,QAAW;AAC7B,oBAAA,UAAU,IAAI,YAAY,UAAU;AAAA,MAClD;AAAA,IACF;AAEO,WAAA,eAAe,aAAa,WAAW;AACvC,WAAA;AAAA,EAAA;AAEX;AAEA,SAAS,iBACP,KACA,KACuB;AACjB,QAAA,EAAE,QAAQ,SAAS,CAAA,GAAI,MAAM,QAAQ,OAAO,cAAA,IAAkB,OAAO;AACvE,MAAA;AAEG,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,SAAS;AACX,UAAI,CAAC,QAAQ;AACL,cAAA,cAAc,OAAO,YAAY,GAAG;AAE1C,cAAM,gBAAgBG,QAAAA,aAAa,EAAE,YAAa,CAAA;AAC5C,cAAA,OAAO,OAAO,KAAK,aAAa;AAEjC,aAAA,QAAQ,CAAC,cAAc;AACpB,gBAAA,eAAe,cAAc,SAAS;AAE5C,iBAAO,OAAO,aAAa,QAAQ,OAAO,SAAS,KAAK,CAAA,CAAE;AAAA,QAAA,CAC3D;AAED,cAAM,iBAAiBC,GAAA;AAAA,UACrB,CAACC,YAAY,SAASC,GAAAA,KAAK,QAAQD,OAAM,IAAIA;AAAAA,UAC7C,CAACA,YAAY,OAAOE,GAAAA,KAAK,MAAMF,OAAM,IAAIA;AAAAA,UACzC,aAAa;AAEN,iBAAA,OAAO,OAAO,cAAc;AAAA,MACvC;AAEO,aAAA;AAAA,IACT;AAAA,EAAA;AAEJ;AAEM,MAAA,qBAAqB,CAA8B,eAA2B;AAClF,SAAO,QAAQ,oBAAoB;AACrC;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Returns a path (as an array) from a file path
|
|
3
3
|
*/
|
|
4
|
-
declare const _default: (
|
|
4
|
+
declare const _default: (entryPath: string, useFileNameAsKey?: boolean) => string[];
|
|
5
5
|
export default _default;
|
|
6
6
|
//# sourceMappingURL=filepath-to-prop-path.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filepath-to-prop-path.d.ts","sourceRoot":"","sources":["../../src/load/filepath-to-prop-path.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filepath-to-prop-path.d.ts","sourceRoot":"","sources":["../../src/load/filepath-to-prop-path.ts"],"names":[],"mappings":"AAGA;;GAEG;oCACwB,MAAM,qBAAoB,OAAO,KAAU,MAAM,EAAE;AAA9E,wBAqBE"}
|
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const fp = require("lodash/fp");
|
|
3
4
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
5
|
+
const path__default = /* @__PURE__ */ _interopDefault(path);
|
|
6
|
+
const fp__default = /* @__PURE__ */ _interopDefault(fp);
|
|
7
|
+
const filePathToPath = (entryPath, useFileNameAsKey = true) => {
|
|
8
|
+
const transform = fp__default.default.pipe(
|
|
9
|
+
// Remove the relative path prefixes: './' for posix (and some win32) and ".\" for win32
|
|
10
|
+
removeRelativePrefix,
|
|
11
|
+
// Remove the path metadata and extensions
|
|
12
|
+
fp__default.default.replace(/(\.settings|\.json|\.js)/g, ""),
|
|
13
|
+
// Transform to lowercase
|
|
14
|
+
// Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as "/"
|
|
15
|
+
fp__default.default.toLower,
|
|
16
|
+
// Split the cleaned path by matching every possible separator (either "/" or "\" depending on the OS)
|
|
17
|
+
fp__default.default.split(new RegExp(`[\\${path__default.default.win32.sep}|${path__default.default.posix.sep}]`, "g")),
|
|
18
|
+
// Make sure to remove leading '.' from the different path parts
|
|
19
|
+
fp__default.default.map(fp__default.default.trimCharsStart(".")),
|
|
20
|
+
// join + split in case some '.' characters are still present in different parts of the path
|
|
21
|
+
fp__default.default.join("."),
|
|
22
|
+
fp__default.default.split("."),
|
|
23
|
+
// Remove the last portion of the path array if the file name shouldn't be used as a key
|
|
24
|
+
useFileNameAsKey ? fp__default.default.identity : fp__default.default.slice(0, -1)
|
|
25
|
+
);
|
|
26
|
+
return transform(entryPath);
|
|
27
|
+
};
|
|
28
|
+
const removeRelativePrefix = (filePath) => {
|
|
29
|
+
return filePath.startsWith(`.${path__default.default.win32.sep}`) || filePath.startsWith(`.${path__default.default.posix.sep}`) ? filePath.slice(2) : filePath;
|
|
9
30
|
};
|
|
10
31
|
module.exports = filePathToPath;
|
|
11
32
|
//# sourceMappingURL=filepath-to-prop-path.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filepath-to-prop-path.js","sources":["../../src/load/filepath-to-prop-path.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"filepath-to-prop-path.js","sources":["../../src/load/filepath-to-prop-path.ts"],"sourcesContent":["import path from 'node:path';\nimport fp from 'lodash/fp';\n\n/**\n * Returns a path (as an array) from a file path\n */\nexport default (entryPath: string, useFileNameAsKey: boolean = true): string[] => {\n const transform = fp.pipe(\n // Remove the relative path prefixes: './' for posix (and some win32) and \".\\\" for win32\n removeRelativePrefix,\n // Remove the path metadata and extensions\n fp.replace(/(\\.settings|\\.json|\\.js)/g, ''),\n // Transform to lowercase\n // Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as \"/\"\n fp.toLower,\n // Split the cleaned path by matching every possible separator (either \"/\" or \"\\\" depending on the OS)\n fp.split(new RegExp(`[\\\\${path.win32.sep}|${path.posix.sep}]`, 'g')),\n // Make sure to remove leading '.' from the different path parts\n fp.map(fp.trimCharsStart('.')),\n // join + split in case some '.' characters are still present in different parts of the path\n fp.join('.'),\n fp.split('.'),\n // Remove the last portion of the path array if the file name shouldn't be used as a key\n useFileNameAsKey ? fp.identity : fp.slice(0, -1)\n );\n\n return transform(entryPath) as string[];\n};\n\nconst removeRelativePrefix = (filePath: string) => {\n return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`)\n ? filePath.slice(2)\n : filePath;\n};\n"],"names":["fp","path"],"mappings":";;;;;;AAMA,MAAA,iBAAe,CAAC,WAAmB,mBAA4B,SAAmB;AAChF,QAAM,YAAYA,YAAAA,QAAG;AAAA;AAAA,IAEnB;AAAA;AAAA,IAEAA,oBAAG,QAAQ,6BAA6B,EAAE;AAAA;AAAA;AAAA,IAG1CA,YAAAA,QAAG;AAAA;AAAA,IAEHA,YAAG,QAAA,MAAM,IAAI,OAAO,MAAMC,cAAK,QAAA,MAAM,GAAG,IAAIA,cAAK,QAAA,MAAM,GAAG,KAAK,GAAG,CAAC;AAAA;AAAA,IAEnED,YAAAA,QAAG,IAAIA,YAAAA,QAAG,eAAe,GAAG,CAAC;AAAA;AAAA,IAE7BA,YAAA,QAAG,KAAK,GAAG;AAAA,IACXA,YAAA,QAAG,MAAM,GAAG;AAAA;AAAA,IAEZ,mBAAmBA,YAAG,QAAA,WAAWA,YAAAA,QAAG,MAAM,GAAG,EAAE;AAAA,EAAA;AAGjD,SAAO,UAAU,SAAS;AAC5B;AAEA,MAAM,uBAAuB,CAAC,aAAqB;AACjD,SAAO,SAAS,WAAW,IAAIC,cAAAA,QAAK,MAAM,GAAG,EAAE,KAAK,SAAS,WAAW,IAAIA,cAAAA,QAAK,MAAM,GAAG,EAAE,IACxF,SAAS,MAAM,CAAC,IAChB;AACN;;"}
|
|
@@ -1,8 +1,28 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fp from "lodash/fp";
|
|
3
|
+
const filePathToPath = (entryPath, useFileNameAsKey = true) => {
|
|
4
|
+
const transform = fp.pipe(
|
|
5
|
+
// Remove the relative path prefixes: './' for posix (and some win32) and ".\" for win32
|
|
6
|
+
removeRelativePrefix,
|
|
7
|
+
// Remove the path metadata and extensions
|
|
8
|
+
fp.replace(/(\.settings|\.json|\.js)/g, ""),
|
|
9
|
+
// Transform to lowercase
|
|
10
|
+
// Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as "/"
|
|
11
|
+
fp.toLower,
|
|
12
|
+
// Split the cleaned path by matching every possible separator (either "/" or "\" depending on the OS)
|
|
13
|
+
fp.split(new RegExp(`[\\${path.win32.sep}|${path.posix.sep}]`, "g")),
|
|
14
|
+
// Make sure to remove leading '.' from the different path parts
|
|
15
|
+
fp.map(fp.trimCharsStart(".")),
|
|
16
|
+
// join + split in case some '.' characters are still present in different parts of the path
|
|
17
|
+
fp.join("."),
|
|
18
|
+
fp.split("."),
|
|
19
|
+
// Remove the last portion of the path array if the file name shouldn't be used as a key
|
|
20
|
+
useFileNameAsKey ? fp.identity : fp.slice(0, -1)
|
|
21
|
+
);
|
|
22
|
+
return transform(entryPath);
|
|
23
|
+
};
|
|
24
|
+
const removeRelativePrefix = (filePath) => {
|
|
25
|
+
return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`) ? filePath.slice(2) : filePath;
|
|
6
26
|
};
|
|
7
27
|
export {
|
|
8
28
|
filePathToPath as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filepath-to-prop-path.mjs","sources":["../../src/load/filepath-to-prop-path.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"filepath-to-prop-path.mjs","sources":["../../src/load/filepath-to-prop-path.ts"],"sourcesContent":["import path from 'node:path';\nimport fp from 'lodash/fp';\n\n/**\n * Returns a path (as an array) from a file path\n */\nexport default (entryPath: string, useFileNameAsKey: boolean = true): string[] => {\n const transform = fp.pipe(\n // Remove the relative path prefixes: './' for posix (and some win32) and \".\\\" for win32\n removeRelativePrefix,\n // Remove the path metadata and extensions\n fp.replace(/(\\.settings|\\.json|\\.js)/g, ''),\n // Transform to lowercase\n // Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as \"/\"\n fp.toLower,\n // Split the cleaned path by matching every possible separator (either \"/\" or \"\\\" depending on the OS)\n fp.split(new RegExp(`[\\\\${path.win32.sep}|${path.posix.sep}]`, 'g')),\n // Make sure to remove leading '.' from the different path parts\n fp.map(fp.trimCharsStart('.')),\n // join + split in case some '.' characters are still present in different parts of the path\n fp.join('.'),\n fp.split('.'),\n // Remove the last portion of the path array if the file name shouldn't be used as a key\n useFileNameAsKey ? fp.identity : fp.slice(0, -1)\n );\n\n return transform(entryPath) as string[];\n};\n\nconst removeRelativePrefix = (filePath: string) => {\n return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`)\n ? filePath.slice(2)\n : filePath;\n};\n"],"names":[],"mappings":";;AAMA,MAAA,iBAAe,CAAC,WAAmB,mBAA4B,SAAmB;AAChF,QAAM,YAAY,GAAG;AAAA;AAAA,IAEnB;AAAA;AAAA,IAEA,GAAG,QAAQ,6BAA6B,EAAE;AAAA;AAAA;AAAA,IAG1C,GAAG;AAAA;AAAA,IAEH,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,GAAG,CAAC;AAAA;AAAA,IAEnE,GAAG,IAAI,GAAG,eAAe,GAAG,CAAC;AAAA;AAAA,IAE7B,GAAG,KAAK,GAAG;AAAA,IACX,GAAG,MAAM,GAAG;AAAA;AAAA,IAEZ,mBAAmB,GAAG,WAAW,GAAG,MAAM,GAAG,EAAE;AAAA,EAAA;AAGjD,SAAO,UAAU,SAAS;AAC5B;AAEA,MAAM,uBAAuB,CAAC,aAAqB;AACjD,SAAO,SAAS,WAAW,IAAI,KAAK,MAAM,GAAG,EAAE,KAAK,SAAS,WAAW,IAAI,KAAK,MAAM,GAAG,EAAE,IACxF,SAAS,MAAM,CAAC,IAChB;AACN;"}
|
package/dist/load/load-files.js
CHANGED
|
@@ -3,7 +3,7 @@ const path = require("path");
|
|
|
3
3
|
const _ = require("lodash");
|
|
4
4
|
const fse = require("fs-extra");
|
|
5
5
|
const strapiUtils = require("@strapi/utils");
|
|
6
|
-
const glob = require("
|
|
6
|
+
const glob = require("glob");
|
|
7
7
|
const filepathToPropPath = require("./filepath-to-prop-path.js");
|
|
8
8
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
9
9
|
const path__default = /* @__PURE__ */ _interopDefault(path);
|
|
@@ -11,7 +11,7 @@ const ___default = /* @__PURE__ */ _interopDefault(_);
|
|
|
11
11
|
const fse__default = /* @__PURE__ */ _interopDefault(fse);
|
|
12
12
|
async function loadFiles(dir, pattern, { requireFn = strapiUtils.importDefault, shouldUseFileNameAsKey = (_2) => true, globArgs = {} } = {}) {
|
|
13
13
|
const root = {};
|
|
14
|
-
const files = await glob(pattern, { cwd: dir, ...globArgs });
|
|
14
|
+
const files = await glob.glob(pattern, { cwd: dir, ...globArgs });
|
|
15
15
|
for (const file of files) {
|
|
16
16
|
const absolutePath = path__default.default.resolve(dir, file);
|
|
17
17
|
delete require.cache[absolutePath];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-files.js","sources":["../../src/load/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport glob from '
|
|
1
|
+
{"version":3,"file":"load-files.js","sources":["../../src/load/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport { glob } from 'glob';\nimport filePathToPath from './filepath-to-prop-path';\n\n/**\n * Returns an Object build from a list of files matching a glob pattern in a directory\n * It builds a tree structure resembling the folder structure in dir\n */\nexport default async function loadFiles<T extends object>(\n dir: string,\n pattern: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n { requireFn = importDefault, shouldUseFileNameAsKey = (_: any) => true, globArgs = {} } = {}\n): Promise<T> {\n const root = {};\n const files = await glob(pattern, { cwd: dir, ...globArgs });\n\n for (const file of files) {\n const absolutePath = path.resolve(dir, file);\n\n // load module\n delete require.cache[absolutePath];\n let mod;\n\n if (path.extname(absolutePath) === '.json') {\n mod = await fse.readJson(absolutePath);\n } else {\n mod = requireFn(absolutePath);\n }\n\n Object.defineProperty(mod, '__filename__', {\n enumerable: true,\n configurable: false,\n writable: false,\n value: path.basename(file),\n });\n\n const propPath = filePathToPath(file, shouldUseFileNameAsKey(file));\n\n if (propPath.length === 0) _.merge(root, mod);\n _.merge(root, _.setWith({}, propPath, mod, Object));\n }\n\n return root as T;\n}\n"],"names":["importDefault","_","glob","path","fse","filePathToPath"],"mappings":";;;;;;;;;;;AAYA,eAA8B,UAC5B,KACA,SAEA,EAAE,YAAYA,YAAAA,eAAe,yBAAyB,CAACC,OAAW,MAAM,WAAW,CAAG,EAAA,IAAI,CAAA,GAC9E;AACZ,QAAM,OAAO,CAAA;AACP,QAAA,QAAQ,MAAMC,KAAAA,KAAK,SAAS,EAAE,KAAK,KAAK,GAAG,SAAA,CAAU;AAE3D,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAeC,cAAA,QAAK,QAAQ,KAAK,IAAI;AAGpC,WAAA,QAAQ,MAAM,YAAY;AAC7B,QAAA;AAEJ,QAAIA,sBAAK,QAAQ,YAAY,MAAM,SAAS;AACpC,YAAA,MAAMC,aAAAA,QAAI,SAAS,YAAY;AAAA,IAAA,OAChC;AACL,YAAM,UAAU,YAAY;AAAA,IAC9B;AAEO,WAAA,eAAe,KAAK,gBAAgB;AAAA,MACzC,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAOD,cAAAA,QAAK,SAAS,IAAI;AAAA,IAAA,CAC1B;AAED,UAAM,WAAWE,mBAAe,MAAM,uBAAuB,IAAI,CAAC;AAElE,QAAI,SAAS,WAAW;AAAKJ,iBAAAA,QAAA,MAAM,MAAM,GAAG;AAC1CA,uBAAA,MAAM,MAAMA,mBAAE,QAAQ,CAAI,GAAA,UAAU,KAAK,MAAM,CAAC;AAAA,EACpD;AAEO,SAAA;AACT;;"}
|
package/dist/load/load-files.mjs
CHANGED
|
@@ -2,11 +2,11 @@ import path from "path";
|
|
|
2
2
|
import _ from "lodash";
|
|
3
3
|
import fse from "fs-extra";
|
|
4
4
|
import { importDefault } from "@strapi/utils";
|
|
5
|
-
import
|
|
5
|
+
import { glob } from "glob";
|
|
6
6
|
import filePathToPath from "./filepath-to-prop-path.mjs";
|
|
7
7
|
async function loadFiles(dir, pattern, { requireFn = importDefault, shouldUseFileNameAsKey = (_2) => true, globArgs = {} } = {}) {
|
|
8
8
|
const root = {};
|
|
9
|
-
const files = await
|
|
9
|
+
const files = await glob(pattern, { cwd: dir, ...globArgs });
|
|
10
10
|
for (const file of files) {
|
|
11
11
|
const absolutePath = path.resolve(dir, file);
|
|
12
12
|
delete require.cache[absolutePath];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-files.mjs","sources":["../../src/load/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport glob from '
|
|
1
|
+
{"version":3,"file":"load-files.mjs","sources":["../../src/load/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport { glob } from 'glob';\nimport filePathToPath from './filepath-to-prop-path';\n\n/**\n * Returns an Object build from a list of files matching a glob pattern in a directory\n * It builds a tree structure resembling the folder structure in dir\n */\nexport default async function loadFiles<T extends object>(\n dir: string,\n pattern: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n { requireFn = importDefault, shouldUseFileNameAsKey = (_: any) => true, globArgs = {} } = {}\n): Promise<T> {\n const root = {};\n const files = await glob(pattern, { cwd: dir, ...globArgs });\n\n for (const file of files) {\n const absolutePath = path.resolve(dir, file);\n\n // load module\n delete require.cache[absolutePath];\n let mod;\n\n if (path.extname(absolutePath) === '.json') {\n mod = await fse.readJson(absolutePath);\n } else {\n mod = requireFn(absolutePath);\n }\n\n Object.defineProperty(mod, '__filename__', {\n enumerable: true,\n configurable: false,\n writable: false,\n value: path.basename(file),\n });\n\n const propPath = filePathToPath(file, shouldUseFileNameAsKey(file));\n\n if (propPath.length === 0) _.merge(root, mod);\n _.merge(root, _.setWith({}, propPath, mod, Object));\n }\n\n return root as T;\n}\n"],"names":["_"],"mappings":";;;;;;AAYA,eAA8B,UAC5B,KACA,SAEA,EAAE,YAAY,eAAe,yBAAyB,CAACA,OAAW,MAAM,WAAW,CAAG,EAAA,IAAI,CAAA,GAC9E;AACZ,QAAM,OAAO,CAAA;AACP,QAAA,QAAQ,MAAM,KAAK,SAAS,EAAE,KAAK,KAAK,GAAG,SAAA,CAAU;AAE3D,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAe,KAAK,QAAQ,KAAK,IAAI;AAGpC,WAAA,QAAQ,MAAM,YAAY;AAC7B,QAAA;AAEJ,QAAI,KAAK,QAAQ,YAAY,MAAM,SAAS;AACpC,YAAA,MAAM,IAAI,SAAS,YAAY;AAAA,IAAA,OAChC;AACL,YAAM,UAAU,YAAY;AAAA,IAC9B;AAEO,WAAA,eAAe,KAAK,gBAAgB;AAAA,MACzC,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAO,KAAK,SAAS,IAAI;AAAA,IAAA,CAC1B;AAED,UAAM,WAAW,eAAe,MAAM,uBAAuB,IAAI,CAAC;AAElE,QAAI,SAAS,WAAW;AAAK,QAAA,MAAM,MAAM,GAAG;AAC1C,MAAA,MAAM,MAAM,EAAE,QAAQ,CAAI,GAAA,UAAU,KAAK,MAAM,CAAC;AAAA,EACpD;AAEO,SAAA;AACT;"}
|
package/dist/middlewares/body.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const fse = require("fs-extra");
|
|
4
|
-
const
|
|
4
|
+
const fp = require("lodash/fp");
|
|
5
5
|
const body = require("koa-body");
|
|
6
6
|
const mime = require("mime-types");
|
|
7
7
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
@@ -21,7 +21,7 @@ function getFiles(ctx) {
|
|
|
21
21
|
return ctx?.request?.files?.files;
|
|
22
22
|
}
|
|
23
23
|
const bodyMiddleware = (config, { strapi }) => {
|
|
24
|
-
const bodyConfig =
|
|
24
|
+
const bodyConfig = fp.defaultsDeep(defaults, config);
|
|
25
25
|
let gqlEndpoint;
|
|
26
26
|
if (strapi.plugin("graphql")) {
|
|
27
27
|
const { config: gqlConfig } = strapi.plugin("graphql");
|