@strapi/utils 5.48.0 → 5.49.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/async.js +5 -1
- package/dist/async.js.map +1 -1
- package/dist/content-types.js +21 -17
- package/dist/content-types.js.map +1 -1
- package/dist/convert-query-params.js +21 -17
- package/dist/convert-query-params.js.map +1 -1
- package/dist/env-helper.js +12 -8
- package/dist/env-helper.js.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/install-id.js +6 -2
- package/dist/install-id.js.map +1 -1
- package/dist/package-manager.js +7 -2
- package/dist/package-manager.js.map +1 -1
- package/dist/parse-type.js +4 -3
- package/dist/parse-type.js.map +1 -1
- package/dist/primitives/objects.js +6 -2
- package/dist/primitives/objects.js.map +1 -1
- package/dist/primitives/strings.js +10 -5
- package/dist/primitives/strings.js.map +1 -1
- package/dist/sort-query.js +5 -1
- package/dist/sort-query.js.map +1 -1
- package/dist/traverse/query-populate.d.ts.map +1 -1
- package/dist/traverse/query-populate.js +24 -0
- package/dist/traverse/query-populate.js.map +1 -1
- package/dist/traverse/query-populate.mjs +24 -0
- package/dist/traverse/query-populate.mjs.map +1 -1
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs.map +1 -1
- package/dist/validation/route-validators/query-params.js +3 -2
- package/dist/validation/route-validators/query-params.js.map +1 -1
- package/dist/validators.js +3 -2
- package/dist/validators.js.map +1 -1
- package/dist/yup.js +10 -6
- package/dist/yup.js.map +1 -1
- package/dist/zod.js +3 -2
- package/dist/zod.js.map +1 -1
- package/package.json +4 -4
package/dist/env-helper.js
CHANGED
|
@@ -2,32 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
8
|
+
|
|
5
9
|
function envFn(key, defaultValue) {
|
|
6
|
-
return
|
|
10
|
+
return ___default.default.has(process.env, key) ? process.env[key] : defaultValue;
|
|
7
11
|
}
|
|
8
12
|
function getKey(key) {
|
|
9
13
|
return process.env[key] ?? '';
|
|
10
14
|
}
|
|
11
15
|
function int(key, defaultValue) {
|
|
12
|
-
if (!
|
|
16
|
+
if (!___default.default.has(process.env, key)) {
|
|
13
17
|
return defaultValue;
|
|
14
18
|
}
|
|
15
19
|
return parseInt(getKey(key), 10);
|
|
16
20
|
}
|
|
17
21
|
function float(key, defaultValue) {
|
|
18
|
-
if (!
|
|
22
|
+
if (!___default.default.has(process.env, key)) {
|
|
19
23
|
return defaultValue;
|
|
20
24
|
}
|
|
21
25
|
return parseFloat(getKey(key));
|
|
22
26
|
}
|
|
23
27
|
function bool(key, defaultValue) {
|
|
24
|
-
if (!
|
|
28
|
+
if (!___default.default.has(process.env, key)) {
|
|
25
29
|
return defaultValue;
|
|
26
30
|
}
|
|
27
31
|
return getKey(key) === 'true';
|
|
28
32
|
}
|
|
29
33
|
function json(key, defaultValue) {
|
|
30
|
-
if (!
|
|
34
|
+
if (!___default.default.has(process.env, key)) {
|
|
31
35
|
return defaultValue;
|
|
32
36
|
}
|
|
33
37
|
try {
|
|
@@ -40,7 +44,7 @@ function json(key, defaultValue) {
|
|
|
40
44
|
}
|
|
41
45
|
}
|
|
42
46
|
function array(key, defaultValue) {
|
|
43
|
-
if (!
|
|
47
|
+
if (!___default.default.has(process.env, key)) {
|
|
44
48
|
return defaultValue;
|
|
45
49
|
}
|
|
46
50
|
let value = getKey(key);
|
|
@@ -48,11 +52,11 @@ function array(key, defaultValue) {
|
|
|
48
52
|
value = value.substring(1, value.length - 1);
|
|
49
53
|
}
|
|
50
54
|
return value.split(',').map((v)=>{
|
|
51
|
-
return
|
|
55
|
+
return ___default.default.trim(___default.default.trim(v, ' '), '"');
|
|
52
56
|
});
|
|
53
57
|
}
|
|
54
58
|
function date(key, defaultValue) {
|
|
55
|
-
if (!
|
|
59
|
+
if (!___default.default.has(process.env, key)) {
|
|
56
60
|
return defaultValue;
|
|
57
61
|
}
|
|
58
62
|
return new Date(getKey(key));
|
package/dist/env-helper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-helper.js","sources":["../src/env-helper.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport type Env = typeof envFn & typeof utils;\n\nfunction envFn(key: string): string | undefined;\nfunction envFn(key: string, defaultValue: string): string;\nfunction envFn<T>(key: string, defaultValue: T): string | T;\nfunction envFn(key: string, defaultValue?: any): any {\n return _.has(process.env, key) ? process.env[key] : defaultValue;\n}\n\nfunction getKey(key: string) {\n return process.env[key] ?? '';\n}\n\nfunction int(key: string, defaultValue: number): number;\nfunction int(key: string, defaultValue?: number | undefined): number | undefined;\nfunction int(key: string, defaultValue?: number | undefined): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseInt(getKey(key), 10);\n}\n\nfunction float(key: string, defaultValue: number): number;\nfunction float(key: string, defaultValue?: number | undefined): number | undefined;\nfunction float(key: string, defaultValue?: number): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseFloat(getKey(key));\n}\n\nfunction bool(key: string, defaultValue: boolean): boolean;\nfunction bool(key: string, defaultValue?: boolean | undefined): boolean | undefined;\nfunction bool(key: string, defaultValue?: boolean): boolean | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return getKey(key) === 'true';\n}\n\nfunction json<T extends object>(key: string, defaultValue: T): T;\nfunction json<T extends object>(key: string, defaultValue?: T | undefined): T | undefined;\nfunction json(key: string, defaultValue?: object) {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n try {\n return JSON.parse(getKey(key));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Invalid json environment variable ${key}: ${error.message}`);\n }\n\n throw error;\n }\n}\n\nfunction array(key: string, defaultValue: string[]): string[];\nfunction array(key: string, defaultValue?: string[] | undefined): string[] | undefined;\nfunction array(key: string, defaultValue?: string[]): string[] | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n let value = getKey(key);\n\n if (value.startsWith('[') && value.endsWith(']')) {\n value = value.substring(1, value.length - 1);\n }\n\n return value.split(',').map((v) => {\n return _.trim(_.trim(v, ' '), '\"');\n });\n}\n\nfunction date(key: string, defaultValue: Date): Date;\nfunction date(key: string, defaultValue?: Date | undefined): Date | undefined;\nfunction date(key: string, defaultValue?: Date): Date | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return new Date(getKey(key));\n}\n\n/**\n * Gets a value from env that matches oneOf provided values\n * @param {string} key\n * @param {string[]} expectedValues\n * @param {string|undefined} defaultValue\n * @returns {string|undefined}\n */\nfunction oneOf<T extends string, TDefault extends T = T>(\n key: string,\n expectedValues: T[],\n defaultValue: TDefault\n): T;\nfunction oneOf<T extends string, TDefault extends T = T>(\n key: string,\n expectedValues: T[],\n defaultValue?: TDefault | undefined\n): T | undefined;\nfunction oneOf(key: string, expectedValues?: string[], defaultValue?: string) {\n if (!expectedValues) {\n throw new Error(`env.oneOf requires expectedValues`);\n }\n\n if (defaultValue && !expectedValues.includes(defaultValue)) {\n throw new Error(`env.oneOf requires defaultValue to be included in expectedValues`);\n }\n\n const rawValue = env(key, defaultValue);\n if (rawValue !== undefined && expectedValues.includes(rawValue)) {\n return rawValue;\n }\n\n return defaultValue;\n}\n\nconst utils = {\n int,\n float,\n bool,\n json,\n array,\n date,\n oneOf,\n};\n\nconst env: Env = Object.assign(envFn, utils);\n\nexport default env;\n"],"names":["envFn","key","defaultValue","_","has","process","env","getKey","int","parseInt","float","parseFloat","bool","json","JSON","parse","error","Error","message","array","value","startsWith","endsWith","substring","length","split","map","v","trim","date","Date","oneOf","expectedValues","includes","rawValue","undefined","utils","Object","assign"],"mappings":"
|
|
1
|
+
{"version":3,"file":"env-helper.js","sources":["../src/env-helper.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport type Env = typeof envFn & typeof utils;\n\nfunction envFn(key: string): string | undefined;\nfunction envFn(key: string, defaultValue: string): string;\nfunction envFn<T>(key: string, defaultValue: T): string | T;\nfunction envFn(key: string, defaultValue?: any): any {\n return _.has(process.env, key) ? process.env[key] : defaultValue;\n}\n\nfunction getKey(key: string) {\n return process.env[key] ?? '';\n}\n\nfunction int(key: string, defaultValue: number): number;\nfunction int(key: string, defaultValue?: number | undefined): number | undefined;\nfunction int(key: string, defaultValue?: number | undefined): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseInt(getKey(key), 10);\n}\n\nfunction float(key: string, defaultValue: number): number;\nfunction float(key: string, defaultValue?: number | undefined): number | undefined;\nfunction float(key: string, defaultValue?: number): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseFloat(getKey(key));\n}\n\nfunction bool(key: string, defaultValue: boolean): boolean;\nfunction bool(key: string, defaultValue?: boolean | undefined): boolean | undefined;\nfunction bool(key: string, defaultValue?: boolean): boolean | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return getKey(key) === 'true';\n}\n\nfunction json<T extends object>(key: string, defaultValue: T): T;\nfunction json<T extends object>(key: string, defaultValue?: T | undefined): T | undefined;\nfunction json(key: string, defaultValue?: object) {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n try {\n return JSON.parse(getKey(key));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Invalid json environment variable ${key}: ${error.message}`);\n }\n\n throw error;\n }\n}\n\nfunction array(key: string, defaultValue: string[]): string[];\nfunction array(key: string, defaultValue?: string[] | undefined): string[] | undefined;\nfunction array(key: string, defaultValue?: string[]): string[] | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n let value = getKey(key);\n\n if (value.startsWith('[') && value.endsWith(']')) {\n value = value.substring(1, value.length - 1);\n }\n\n return value.split(',').map((v) => {\n return _.trim(_.trim(v, ' '), '\"');\n });\n}\n\nfunction date(key: string, defaultValue: Date): Date;\nfunction date(key: string, defaultValue?: Date | undefined): Date | undefined;\nfunction date(key: string, defaultValue?: Date): Date | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return new Date(getKey(key));\n}\n\n/**\n * Gets a value from env that matches oneOf provided values\n * @param {string} key\n * @param {string[]} expectedValues\n * @param {string|undefined} defaultValue\n * @returns {string|undefined}\n */\nfunction oneOf<T extends string, TDefault extends T = T>(\n key: string,\n expectedValues: T[],\n defaultValue: TDefault\n): T;\nfunction oneOf<T extends string, TDefault extends T = T>(\n key: string,\n expectedValues: T[],\n defaultValue?: TDefault | undefined\n): T | undefined;\nfunction oneOf(key: string, expectedValues?: string[], defaultValue?: string) {\n if (!expectedValues) {\n throw new Error(`env.oneOf requires expectedValues`);\n }\n\n if (defaultValue && !expectedValues.includes(defaultValue)) {\n throw new Error(`env.oneOf requires defaultValue to be included in expectedValues`);\n }\n\n const rawValue = env(key, defaultValue);\n if (rawValue !== undefined && expectedValues.includes(rawValue)) {\n return rawValue;\n }\n\n return defaultValue;\n}\n\nconst utils = {\n int,\n float,\n bool,\n json,\n array,\n date,\n oneOf,\n};\n\nconst env: Env = Object.assign(envFn, utils);\n\nexport default env;\n"],"names":["envFn","key","defaultValue","_","has","process","env","getKey","int","parseInt","float","parseFloat","bool","json","JSON","parse","error","Error","message","array","value","startsWith","endsWith","substring","length","split","map","v","trim","date","Date","oneOf","expectedValues","includes","rawValue","undefined","utils","Object","assign"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -42,7 +42,8 @@ var publicationFilter = require('./publication-filter.js');
|
|
|
42
42
|
var hasPublishedVersionParam = require('./has-published-version-param.js');
|
|
43
43
|
var z = require('zod/v4');
|
|
44
44
|
|
|
45
|
-
function
|
|
45
|
+
function _interopNamespace(e) {
|
|
46
|
+
if (e && e.__esModule) return e;
|
|
46
47
|
var n = Object.create(null);
|
|
47
48
|
if (e) {
|
|
48
49
|
Object.keys(e).forEach(function (k) {
|
|
@@ -59,7 +60,7 @@ function _interopNamespaceDefault(e) {
|
|
|
59
60
|
return Object.freeze(n);
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
var z__namespace = /*#__PURE__*/
|
|
63
|
+
var z__namespace = /*#__PURE__*/_interopNamespace(z);
|
|
63
64
|
|
|
64
65
|
|
|
65
66
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/install-id.js
CHANGED
|
@@ -3,13 +3,17 @@
|
|
|
3
3
|
var crypto = require('crypto');
|
|
4
4
|
var nodeMachineId = require('node-machine-id');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
9
|
+
|
|
6
10
|
const generateInstallId = (projectId, installId)=>{
|
|
7
11
|
if (installId) return installId;
|
|
8
12
|
try {
|
|
9
13
|
const machineId = nodeMachineId.machineIdSync();
|
|
10
|
-
return projectId ?
|
|
14
|
+
return projectId ? crypto__default.default.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex') : crypto__default.default.randomUUID();
|
|
11
15
|
} catch (error) {
|
|
12
|
-
return
|
|
16
|
+
return crypto__default.default.randomUUID();
|
|
13
17
|
}
|
|
14
18
|
};
|
|
15
19
|
|
package/dist/install-id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-id.js","sources":["../src/install-id.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport const generateInstallId = (projectId: string, installId: string) => {\n if (installId) return installId;\n try {\n const machineId = machineIdSync();\n return projectId\n ? crypto.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex')\n : crypto.randomUUID();\n } catch (error) {\n return crypto.randomUUID();\n }\n};\n"],"names":["generateInstallId","projectId","installId","machineId","machineIdSync","crypto","createHash","update","digest","randomUUID","error"],"mappings":"
|
|
1
|
+
{"version":3,"file":"install-id.js","sources":["../src/install-id.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport const generateInstallId = (projectId: string, installId: string) => {\n if (installId) return installId;\n try {\n const machineId = machineIdSync();\n return projectId\n ? crypto.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex')\n : crypto.randomUUID();\n } catch (error) {\n return crypto.randomUUID();\n }\n};\n"],"names":["generateInstallId","projectId","installId","machineId","machineIdSync","crypto","createHash","update","digest","randomUUID","error"],"mappings":";;;;;;;;;AAGO,MAAMA,iBAAAA,GAAoB,CAACC,SAAAA,EAAmBC,SAAAA,GAAAA;AACnD,IAAA,IAAIA,WAAW,OAAOA,SAAAA;IACtB,IAAI;AACF,QAAA,MAAMC,SAAAA,GAAYC,2BAAAA,EAAAA;AAClB,QAAA,OAAOH,YACHI,uBAAAA,CAAOC,UAAU,CAAC,QAAA,CAAA,CAAUC,MAAM,CAAC,CAAA,EAAGJ,SAAAA,CAAU,CAAC,EAAEF,SAAAA,CAAAA,CAAW,CAAA,CAAEO,MAAM,CAAC,KAAA,CAAA,GACvEH,wBAAOI,UAAU,EAAA;AACvB,IAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,QAAA,OAAOL,wBAAOI,UAAU,EAAA;AAC1B,IAAA;AACF;;;;"}
|
package/dist/package-manager.js
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
var execa = require('execa');
|
|
4
4
|
var preferredPM = require('preferred-pm');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var execa__default = /*#__PURE__*/_interopDefault(execa);
|
|
9
|
+
var preferredPM__default = /*#__PURE__*/_interopDefault(preferredPM);
|
|
10
|
+
|
|
6
11
|
const SUPPORTED_PACKAGE_MANAGERS = [
|
|
7
12
|
'npm',
|
|
8
13
|
'yarn',
|
|
@@ -10,7 +15,7 @@ const SUPPORTED_PACKAGE_MANAGERS = [
|
|
|
10
15
|
];
|
|
11
16
|
const DEFAULT_PACKAGE_MANAGER = 'npm';
|
|
12
17
|
const getPreferred = async (pkgPath)=>{
|
|
13
|
-
const pm = await
|
|
18
|
+
const pm = await preferredPM__default.default(pkgPath);
|
|
14
19
|
const hasPackageManager = pm !== undefined;
|
|
15
20
|
if (!hasPackageManager) {
|
|
16
21
|
throw new Error(`Couldn't find a package manager in your project.`);
|
|
@@ -23,7 +28,7 @@ const getPreferred = async (pkgPath)=>{
|
|
|
23
28
|
return pm.name;
|
|
24
29
|
};
|
|
25
30
|
const installDependencies = (path, packageManager, options = {})=>{
|
|
26
|
-
return
|
|
31
|
+
return execa__default.default(packageManager, [
|
|
27
32
|
'install'
|
|
28
33
|
], {
|
|
29
34
|
...options,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.js","sources":["../src/package-manager.ts"],"sourcesContent":["import execa from 'execa';\nimport preferredPM from 'preferred-pm';\n\nimport type { Options as ProcessOptions } from 'execa';\n\nconst SUPPORTED_PACKAGE_MANAGERS = ['npm', 'yarn', 'pnpm'] as const;\nconst DEFAULT_PACKAGE_MANAGER = 'npm' as const;\n\ntype SupportedPackageManagerName = (typeof SUPPORTED_PACKAGE_MANAGERS)[number];\n\nexport const getPreferred = async (pkgPath: string): Promise<SupportedPackageManagerName> => {\n const pm = await preferredPM(pkgPath);\n\n const hasPackageManager = pm !== undefined;\n if (!hasPackageManager) {\n throw new Error(`Couldn't find a package manager in your project.`);\n }\n\n const isPackageManagerSupported = (SUPPORTED_PACKAGE_MANAGERS as readonly string[]).includes(\n pm.name\n );\n if (!isPackageManagerSupported) {\n process.emitWarning(\n `We detected your package manager (${pm.name} v${pm.version}), but it's not officially supported by Strapi yet. Defaulting to npm instead.`\n );\n\n return DEFAULT_PACKAGE_MANAGER;\n }\n\n return pm.name as SupportedPackageManagerName;\n};\n\nexport const installDependencies = (\n path: string,\n packageManager: SupportedPackageManagerName,\n options: ProcessOptions<string> = {}\n) => {\n return execa(packageManager, ['install'], { ...options, cwd: path, stdin: 'ignore' });\n};\n"],"names":["SUPPORTED_PACKAGE_MANAGERS","DEFAULT_PACKAGE_MANAGER","getPreferred","pkgPath","pm","preferredPM","hasPackageManager","undefined","Error","isPackageManagerSupported","includes","name","process","emitWarning","version","installDependencies","path","packageManager","options","execa","cwd","stdin"],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-manager.js","sources":["../src/package-manager.ts"],"sourcesContent":["import execa from 'execa';\nimport preferredPM from 'preferred-pm';\n\nimport type { Options as ProcessOptions } from 'execa';\n\nconst SUPPORTED_PACKAGE_MANAGERS = ['npm', 'yarn', 'pnpm'] as const;\nconst DEFAULT_PACKAGE_MANAGER = 'npm' as const;\n\ntype SupportedPackageManagerName = (typeof SUPPORTED_PACKAGE_MANAGERS)[number];\n\nexport const getPreferred = async (pkgPath: string): Promise<SupportedPackageManagerName> => {\n const pm = await preferredPM(pkgPath);\n\n const hasPackageManager = pm !== undefined;\n if (!hasPackageManager) {\n throw new Error(`Couldn't find a package manager in your project.`);\n }\n\n const isPackageManagerSupported = (SUPPORTED_PACKAGE_MANAGERS as readonly string[]).includes(\n pm.name\n );\n if (!isPackageManagerSupported) {\n process.emitWarning(\n `We detected your package manager (${pm.name} v${pm.version}), but it's not officially supported by Strapi yet. Defaulting to npm instead.`\n );\n\n return DEFAULT_PACKAGE_MANAGER;\n }\n\n return pm.name as SupportedPackageManagerName;\n};\n\nexport const installDependencies = (\n path: string,\n packageManager: SupportedPackageManagerName,\n options: ProcessOptions<string> = {}\n) => {\n return execa(packageManager, ['install'], { ...options, cwd: path, stdin: 'ignore' });\n};\n"],"names":["SUPPORTED_PACKAGE_MANAGERS","DEFAULT_PACKAGE_MANAGER","getPreferred","pkgPath","pm","preferredPM","hasPackageManager","undefined","Error","isPackageManagerSupported","includes","name","process","emitWarning","version","installDependencies","path","packageManager","options","execa","cwd","stdin"],"mappings":";;;;;;;;;;AAKA,MAAMA,0BAAAA,GAA6B;AAAC,IAAA,KAAA;AAAO,IAAA,MAAA;AAAQ,IAAA;AAAO,CAAA;AAC1D,MAAMC,uBAAAA,GAA0B,KAAA;AAIzB,MAAMC,eAAe,OAAOC,OAAAA,GAAAA;IACjC,MAAMC,EAAAA,GAAK,MAAMC,4BAAAA,CAAYF,OAAAA,CAAAA;AAE7B,IAAA,MAAMG,oBAAoBF,EAAAA,KAAOG,SAAAA;AACjC,IAAA,IAAI,CAACD,iBAAAA,EAAmB;AACtB,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,gDAAgD,CAAC,CAAA;AACpE,IAAA;AAEA,IAAA,MAAMC,4BAA4B,0BAACT,CAAiDU,QAAQ,CAC1FN,GAAGO,IAAI,CAAA;AAET,IAAA,IAAI,CAACF,yBAAAA,EAA2B;AAC9BG,QAAAA,OAAAA,CAAQC,WAAW,CACjB,CAAC,kCAAkC,EAAET,EAAAA,CAAGO,IAAI,CAAC,EAAE,EAAEP,EAAAA,CAAGU,OAAO,CAAC,8EAA8E,CAAC,CAAA;QAG7I,OAAOb,uBAAAA;AACT,IAAA;AAEA,IAAA,OAAOG,GAAGO,IAAI;AAChB;MAEaI,mBAAAA,GAAsB,CACjCC,MACAC,cAAAA,EACAC,OAAAA,GAAkC,EAAE,GAAA;AAEpC,IAAA,OAAOC,uBAAMF,cAAAA,EAAgB;AAAC,QAAA;KAAU,EAAE;AAAE,QAAA,GAAGC,OAAO;QAAEE,GAAAA,EAAKJ,IAAAA;QAAMK,KAAAA,EAAO;AAAS,KAAA,CAAA;AACrF;;;;;"}
|
package/dist/parse-type.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
var dates = require('date-fns');
|
|
5
5
|
|
|
6
|
-
function
|
|
6
|
+
function _interopNamespace(e) {
|
|
7
|
+
if (e && e.__esModule) return e;
|
|
7
8
|
var n = Object.create(null);
|
|
8
9
|
if (e) {
|
|
9
10
|
Object.keys(e).forEach(function (k) {
|
|
@@ -20,8 +21,8 @@ function _interopNamespaceDefault(e) {
|
|
|
20
21
|
return Object.freeze(n);
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
var ___namespace = /*#__PURE__*/
|
|
24
|
-
var dates__namespace = /*#__PURE__*/
|
|
24
|
+
var ___namespace = /*#__PURE__*/_interopNamespace(_);
|
|
25
|
+
var dates__namespace = /*#__PURE__*/_interopNamespace(dates);
|
|
25
26
|
|
|
26
27
|
const timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;
|
|
27
28
|
const isDate = (v)=>{
|
package/dist/parse-type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-type.js","sources":["../src/parse-type.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch (error) {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n"],"names":["timeRegex","isDate","v","dates","parseTime","value","format","Error","result","match","hours","minutes","seconds","fraction","fractionPart","_","padEnd","slice","parseDate","date","parseISO","isValid","error","parseDateTimeOrTimestamp","milliUnixDate","parse","Date","parseBoolean","options","forceCast","includes","Boolean","parseType","type","toNumber"],"mappings":"
|
|
1
|
+
{"version":3,"file":"parse-type.js","sources":["../src/parse-type.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch (error) {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n"],"names":["timeRegex","isDate","v","dates","parseTime","value","format","Error","result","match","hours","minutes","seconds","fraction","fractionPart","_","padEnd","slice","parseDate","date","parseISO","isValid","error","parseDateTimeOrTimestamp","milliUnixDate","parse","Date","parseBoolean","options","forceCast","includes","Boolean","parseType","type","toNumber"],"mappings":"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"}
|
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
8
|
+
|
|
9
|
+
const keysDeep = (obj, path = [])=>!___default.default.isObject(obj) ? [
|
|
6
10
|
path.join('.')
|
|
7
|
-
] :
|
|
11
|
+
] : ___default.default.reduce(obj, (acc, next, key)=>___default.default.concat(acc, keysDeep(next, [
|
|
8
12
|
...path,
|
|
9
13
|
key
|
|
10
14
|
])), []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objects.js","sources":["../../src/primitives/objects.ts"],"sourcesContent":["import _ from 'lodash';\n\nconst keysDeep = (obj: object, path: string[] = []): string[] =>\n !_.isObject(obj)\n ? [path.join('.')]\n : _.reduce(\n obj,\n (acc, next, key) => _.concat(acc, keysDeep(next, [...path, key])),\n [] as string[]\n );\n\nexport { keysDeep };\n"],"names":["keysDeep","obj","path","_","isObject","join","reduce","acc","next","key","concat"],"mappings":"
|
|
1
|
+
{"version":3,"file":"objects.js","sources":["../../src/primitives/objects.ts"],"sourcesContent":["import _ from 'lodash';\n\nconst keysDeep = (obj: object, path: string[] = []): string[] =>\n !_.isObject(obj)\n ? [path.join('.')]\n : _.reduce(\n obj,\n (acc, next, key) => _.concat(acc, keysDeep(next, [...path, key])),\n [] as string[]\n );\n\nexport { keysDeep };\n"],"names":["keysDeep","obj","path","_","isObject","join","reduce","acc","next","key","concat"],"mappings":";;;;;;;;AAEA,MAAMA,QAAAA,GAAW,CAACC,GAAAA,EAAaC,IAAAA,GAAiB,EAAE,GAChD,CAACC,kBAAAA,CAAEC,QAAQ,CAACH,GAAAA,CAAAA,GACR;AAACC,QAAAA,IAAAA,CAAKG,IAAI,CAAC,GAAA;AAAK,KAAA,GAChBF,kBAAAA,CAAEG,MAAM,CACNL,GAAAA,EACA,CAACM,GAAAA,EAAKC,IAAAA,EAAMC,GAAAA,GAAQN,kBAAAA,CAAEO,MAAM,CAACH,GAAAA,EAAKP,SAASQ,IAAAA,EAAM;AAAIN,YAAAA,GAAAA,IAAAA;AAAMO,YAAAA;AAAI,SAAA,CAAA,CAAA,EAC/D,EAAE;;;;"}
|
|
@@ -4,20 +4,25 @@ var _ = require('lodash');
|
|
|
4
4
|
var fp = require('lodash/fp');
|
|
5
5
|
var slugify = require('@sindresorhus/slugify');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
10
|
+
var slugify__default = /*#__PURE__*/_interopDefault(slugify);
|
|
11
|
+
|
|
7
12
|
const nameToSlug = (name, options = {
|
|
8
13
|
separator: '-'
|
|
9
|
-
})=>
|
|
10
|
-
const nameToCollectionName = (name)=>
|
|
14
|
+
})=>slugify__default.default(name, options);
|
|
15
|
+
const nameToCollectionName = (name)=>slugify__default.default(name, {
|
|
11
16
|
separator: '_'
|
|
12
17
|
});
|
|
13
|
-
const toRegressedEnumValue = (value)=>
|
|
18
|
+
const toRegressedEnumValue = (value)=>slugify__default.default(value, {
|
|
14
19
|
decamelize: false,
|
|
15
20
|
lowercase: false,
|
|
16
21
|
separator: '_'
|
|
17
22
|
});
|
|
18
23
|
const getCommonPath = (...paths)=>{
|
|
19
|
-
const [segments, ...otherSegments] = paths.map((it)=>
|
|
20
|
-
return
|
|
24
|
+
const [segments, ...otherSegments] = paths.map((it)=>___default.default.split(it, '/'));
|
|
25
|
+
return ___default.default.join(___default.default.takeWhile(segments, (str, index)=>otherSegments.every((it)=>it[index] === str)), '/');
|
|
21
26
|
};
|
|
22
27
|
const isEqual = (a, b)=>String(a) === String(b);
|
|
23
28
|
const isCamelCase = (value)=>/^[a-z][a-zA-Z0-9]+$/.test(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strings.js","sources":["../../src/primitives/strings.ts"],"sourcesContent":["import _, { kebabCase } from 'lodash';\nimport { trimChars, trimCharsEnd, trimCharsStart } from 'lodash/fp';\nimport slugify from '@sindresorhus/slugify';\n\nconst nameToSlug = (name: string, options: slugify.Options = { separator: '-' }) =>\n slugify(name, options);\n\nconst nameToCollectionName = (name: string) => slugify(name, { separator: '_' });\n\nconst toRegressedEnumValue = (value: string) =>\n slugify(value, {\n decamelize: false,\n lowercase: false,\n separator: '_',\n });\n\nconst getCommonPath = (...paths: string[]) => {\n const [segments, ...otherSegments] = paths.map((it) => _.split(it, '/'));\n return _.join(\n _.takeWhile(segments, (str, index) => otherSegments.every((it) => it[index] === str)),\n '/'\n );\n};\n\nconst isEqual = (a: unknown, b: unknown) => String(a) === String(b);\nconst isCamelCase = (value: string) => /^[a-z][a-zA-Z0-9]+$/.test(value);\nconst isKebabCase = (value: string) => /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/.test(value);\nconst startsWithANumber = (value: string) => /^[0-9]/.test(value);\n\nconst joinBy = (joint: string, ...args: string[]) => {\n const trim = trimChars(joint);\n const trimEnd = trimCharsEnd(joint);\n const trimStart = trimCharsStart(joint);\n\n return args.reduce((url, path, index) => {\n if (args.length === 1) return path;\n if (index === 0) return trimEnd(path);\n if (index === args.length - 1) return url + joint + trimStart(path);\n return url + joint + trim(path);\n }, '');\n};\n\nconst toKebabCase = (value: string) => kebabCase(value);\n\nexport {\n nameToSlug,\n nameToCollectionName,\n getCommonPath,\n isEqual,\n isCamelCase,\n isKebabCase,\n toKebabCase,\n toRegressedEnumValue,\n startsWithANumber,\n joinBy,\n};\n"],"names":["nameToSlug","name","options","separator","slugify","nameToCollectionName","toRegressedEnumValue","value","decamelize","lowercase","getCommonPath","paths","segments","otherSegments","map","it","_","split","join","takeWhile","str","index","every","isEqual","a","b","String","isCamelCase","test","isKebabCase","startsWithANumber","joinBy","joint","args","trim","trimChars","trimEnd","trimCharsEnd","trimStart","trimCharsStart","reduce","url","path","length","toKebabCase","kebabCase"],"mappings":"
|
|
1
|
+
{"version":3,"file":"strings.js","sources":["../../src/primitives/strings.ts"],"sourcesContent":["import _, { kebabCase } from 'lodash';\nimport { trimChars, trimCharsEnd, trimCharsStart } from 'lodash/fp';\nimport slugify from '@sindresorhus/slugify';\n\nconst nameToSlug = (name: string, options: slugify.Options = { separator: '-' }) =>\n slugify(name, options);\n\nconst nameToCollectionName = (name: string) => slugify(name, { separator: '_' });\n\nconst toRegressedEnumValue = (value: string) =>\n slugify(value, {\n decamelize: false,\n lowercase: false,\n separator: '_',\n });\n\nconst getCommonPath = (...paths: string[]) => {\n const [segments, ...otherSegments] = paths.map((it) => _.split(it, '/'));\n return _.join(\n _.takeWhile(segments, (str, index) => otherSegments.every((it) => it[index] === str)),\n '/'\n );\n};\n\nconst isEqual = (a: unknown, b: unknown) => String(a) === String(b);\nconst isCamelCase = (value: string) => /^[a-z][a-zA-Z0-9]+$/.test(value);\nconst isKebabCase = (value: string) => /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/.test(value);\nconst startsWithANumber = (value: string) => /^[0-9]/.test(value);\n\nconst joinBy = (joint: string, ...args: string[]) => {\n const trim = trimChars(joint);\n const trimEnd = trimCharsEnd(joint);\n const trimStart = trimCharsStart(joint);\n\n return args.reduce((url, path, index) => {\n if (args.length === 1) return path;\n if (index === 0) return trimEnd(path);\n if (index === args.length - 1) return url + joint + trimStart(path);\n return url + joint + trim(path);\n }, '');\n};\n\nconst toKebabCase = (value: string) => kebabCase(value);\n\nexport {\n nameToSlug,\n nameToCollectionName,\n getCommonPath,\n isEqual,\n isCamelCase,\n isKebabCase,\n toKebabCase,\n toRegressedEnumValue,\n startsWithANumber,\n joinBy,\n};\n"],"names":["nameToSlug","name","options","separator","slugify","nameToCollectionName","toRegressedEnumValue","value","decamelize","lowercase","getCommonPath","paths","segments","otherSegments","map","it","_","split","join","takeWhile","str","index","every","isEqual","a","b","String","isCamelCase","test","isKebabCase","startsWithANumber","joinBy","joint","args","trim","trimChars","trimEnd","trimCharsEnd","trimStart","trimCharsStart","reduce","url","path","length","toKebabCase","kebabCase"],"mappings":";;;;;;;;;;;AAIA,MAAMA,UAAAA,GAAa,CAACC,IAAAA,EAAcC,OAAAA,GAA2B;IAAEC,SAAAA,EAAW;AAAI,CAAC,GAC7EC,yBAAQH,IAAAA,EAAMC,OAAAA;AAEhB,MAAMG,oBAAAA,GAAuB,CAACJ,IAAAA,GAAiBG,wBAAAA,CAAQH,IAAAA,EAAM;QAAEE,SAAAA,EAAW;AAAI,KAAA;AAE9E,MAAMG,oBAAAA,GAAuB,CAACC,KAAAA,GAC5BH,wBAAAA,CAAQG,KAAAA,EAAO;QACbC,UAAAA,EAAY,KAAA;QACZC,SAAAA,EAAW,KAAA;QACXN,SAAAA,EAAW;AACb,KAAA;AAEF,MAAMO,aAAAA,GAAgB,CAAC,GAAGC,KAAAA,GAAAA;AACxB,IAAA,MAAM,CAACC,QAAAA,EAAU,GAAGC,aAAAA,CAAc,GAAGF,KAAAA,CAAMG,GAAG,CAAC,CAACC,EAAAA,GAAOC,kBAAAA,CAAEC,KAAK,CAACF,EAAAA,EAAI,GAAA,CAAA,CAAA;AACnE,IAAA,OAAOC,mBAAEE,IAAI,CACXF,mBAAEG,SAAS,CAACP,UAAU,CAACQ,GAAAA,EAAKC,QAAUR,aAAAA,CAAcS,KAAK,CAAC,CAACP,EAAAA,GAAOA,EAAE,CAACM,KAAAA,CAAM,KAAKD,GAAAA,CAAAA,CAAAA,EAChF,GAAA,CAAA;AAEJ;AAEA,MAAMG,UAAU,CAACC,CAAAA,EAAYC,CAAAA,GAAeC,MAAAA,CAAOF,OAAOE,MAAAA,CAAOD,CAAAA;AACjE,MAAME,WAAAA,GAAc,CAACpB,KAAAA,GAAkB,qBAAA,CAAsBqB,IAAI,CAACrB,KAAAA;AAClE,MAAMsB,WAAAA,GAAc,CAACtB,KAAAA,GAAkB,iCAAA,CAAkCqB,IAAI,CAACrB,KAAAA;AAC9E,MAAMuB,iBAAAA,GAAoB,CAACvB,KAAAA,GAAkB,QAAA,CAASqB,IAAI,CAACrB,KAAAA;AAE3D,MAAMwB,MAAAA,GAAS,CAACC,KAAAA,EAAe,GAAGC,IAAAA,GAAAA;AAChC,IAAA,MAAMC,OAAOC,YAAAA,CAAUH,KAAAA,CAAAA;AACvB,IAAA,MAAMI,UAAUC,eAAAA,CAAaL,KAAAA,CAAAA;AAC7B,IAAA,MAAMM,YAAYC,iBAAAA,CAAeP,KAAAA,CAAAA;AAEjC,IAAA,OAAOC,IAAAA,CAAKO,MAAM,CAAC,CAACC,KAAKC,IAAAA,EAAMrB,KAAAA,GAAAA;AAC7B,QAAA,IAAIY,IAAAA,CAAKU,MAAM,KAAK,CAAA,EAAG,OAAOD,IAAAA;QAC9B,IAAIrB,KAAAA,KAAU,CAAA,EAAG,OAAOe,OAAAA,CAAQM,IAAAA,CAAAA;QAChC,IAAIrB,KAAAA,KAAUY,KAAKU,MAAM,GAAG,GAAG,OAAOF,GAAAA,GAAMT,QAAQM,SAAAA,CAAUI,IAAAA,CAAAA;QAC9D,OAAOD,GAAAA,GAAMT,QAAQE,IAAAA,CAAKQ,IAAAA,CAAAA;IAC5B,CAAA,EAAG,EAAA,CAAA;AACL;AAEA,MAAME,WAAAA,GAAc,CAACrC,KAAAA,GAAkBsC,WAAAA,CAAUtC,KAAAA;;;;;;;;;;;;;"}
|
package/dist/sort-query.js
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
8
|
+
|
|
9
|
+
const isPlainObject = (value)=>___default.default.isPlainObject(value);
|
|
6
10
|
/**
|
|
7
11
|
* Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).
|
|
8
12
|
*/ function getMeaningfulSortSegments(sort) {
|
package/dist/sort-query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-query.js","sources":["../src/sort-query.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport type SortOrder = 'asc' | 'desc';\n\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\nexport type SortParams = string | string[] | SortParamsObject | SortParamsObject[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\n/**\n * Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).\n */\nexport function getMeaningfulSortSegments(sort: string): string[] {\n return sort\n .split(',')\n .map((segment) => segment.trim())\n .filter((segment) => {\n if (segment.length === 0) {\n return false;\n }\n\n const [field] = segment.split(':');\n return field.trim().length > 0;\n });\n}\n\n/**\n * Whether a nested sort object ({ field: 'asc' } or { relation: { name: 'desc' } }) specifies\n * at least one field to sort on. Empty objects and keys with blank orders are treated as no sort.\n */\nfunction hasMeaningfulSortObject(sort: SortParamsObject): boolean {\n return Object.keys(sort).some((key) => {\n const order = sort[key];\n\n if (typeof order === 'string') {\n return order.length > 0;\n }\n\n if (isPlainObject(order)) {\n return hasMeaningfulSortObject(order as SortParamsObject);\n }\n\n return false;\n });\n}\n\n/** Whether a REST-style sort string contains at least one meaningful segment. */\nfunction hasMeaningfulStringSort(sort: string): boolean {\n return getMeaningfulSortSegments(sort).length > 0;\n}\n\n/**\n * Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so\n * populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs\n * `sort[]` with strictNullHandling parses to `[null]`).\n */\nexport function hasSort(sort?: unknown): sort is SortParams {\n if (sort === undefined || sort === null) {\n return false;\n }\n\n if (typeof sort === 'string') {\n return hasMeaningfulStringSort(sort);\n }\n\n if (Array.isArray(sort)) {\n if (sort.length === 0) {\n return false;\n }\n\n return sort.some((item) => {\n if (typeof item === 'string') {\n return hasMeaningfulStringSort(item);\n }\n\n if (isPlainObject(item)) {\n return hasMeaningfulSortObject(item as SortParamsObject);\n }\n\n return false;\n });\n }\n\n if (isPlainObject(sort)) {\n return hasMeaningfulSortObject(sort as SortParamsObject);\n }\n\n return false;\n}\n"],"names":["isPlainObject","value","_","getMeaningfulSortSegments","sort","split","map","segment","trim","filter","length","field","hasMeaningfulSortObject","Object","keys","some","key","order","hasMeaningfulStringSort","hasSort","undefined","Array","isArray","item"],"mappings":"
|
|
1
|
+
{"version":3,"file":"sort-query.js","sources":["../src/sort-query.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport type SortOrder = 'asc' | 'desc';\n\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\nexport type SortParams = string | string[] | SortParamsObject | SortParamsObject[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\n/**\n * Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).\n */\nexport function getMeaningfulSortSegments(sort: string): string[] {\n return sort\n .split(',')\n .map((segment) => segment.trim())\n .filter((segment) => {\n if (segment.length === 0) {\n return false;\n }\n\n const [field] = segment.split(':');\n return field.trim().length > 0;\n });\n}\n\n/**\n * Whether a nested sort object ({ field: 'asc' } or { relation: { name: 'desc' } }) specifies\n * at least one field to sort on. Empty objects and keys with blank orders are treated as no sort.\n */\nfunction hasMeaningfulSortObject(sort: SortParamsObject): boolean {\n return Object.keys(sort).some((key) => {\n const order = sort[key];\n\n if (typeof order === 'string') {\n return order.length > 0;\n }\n\n if (isPlainObject(order)) {\n return hasMeaningfulSortObject(order as SortParamsObject);\n }\n\n return false;\n });\n}\n\n/** Whether a REST-style sort string contains at least one meaningful segment. */\nfunction hasMeaningfulStringSort(sort: string): boolean {\n return getMeaningfulSortSegments(sort).length > 0;\n}\n\n/**\n * Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so\n * populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs\n * `sort[]` with strictNullHandling parses to `[null]`).\n */\nexport function hasSort(sort?: unknown): sort is SortParams {\n if (sort === undefined || sort === null) {\n return false;\n }\n\n if (typeof sort === 'string') {\n return hasMeaningfulStringSort(sort);\n }\n\n if (Array.isArray(sort)) {\n if (sort.length === 0) {\n return false;\n }\n\n return sort.some((item) => {\n if (typeof item === 'string') {\n return hasMeaningfulStringSort(item);\n }\n\n if (isPlainObject(item)) {\n return hasMeaningfulSortObject(item as SortParamsObject);\n }\n\n return false;\n });\n }\n\n if (isPlainObject(sort)) {\n return hasMeaningfulSortObject(sort as SortParamsObject);\n }\n\n return false;\n}\n"],"names":["isPlainObject","value","_","getMeaningfulSortSegments","sort","split","map","segment","trim","filter","length","field","hasMeaningfulSortObject","Object","keys","some","key","order","hasMeaningfulStringSort","hasSort","undefined","Array","isArray","item"],"mappings":";;;;;;;;AAUA,MAAMA,aAAAA,GAAgB,CAACC,KAAAA,GAAqDC,kBAAAA,CAAEF,aAAa,CAACC,KAAAA,CAAAA;AAE5F;;IAGO,SAASE,yBAAAA,CAA0BC,IAAY,EAAA;AACpD,IAAA,OAAOA,IAAAA,CACJC,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,OAAAA,GAAYA,OAAAA,CAAQC,IAAI,EAAA,CAAA,CAC7BC,MAAM,CAAC,CAACF,OAAAA,GAAAA;QACP,IAAIA,OAAAA,CAAQG,MAAM,KAAK,CAAA,EAAG;YACxB,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,MAAM,CAACC,KAAAA,CAAM,GAAGJ,OAAAA,CAAQF,KAAK,CAAC,GAAA,CAAA;AAC9B,QAAA,OAAOM,KAAAA,CAAMH,IAAI,EAAA,CAAGE,MAAM,GAAG,CAAA;AAC/B,IAAA,CAAA,CAAA;AACJ;AAEA;;;IAIA,SAASE,wBAAwBR,IAAsB,EAAA;AACrD,IAAA,OAAOS,OAAOC,IAAI,CAACV,IAAAA,CAAAA,CAAMW,IAAI,CAAC,CAACC,GAAAA,GAAAA;QAC7B,MAAMC,KAAAA,GAAQb,IAAI,CAACY,GAAAA,CAAI;QAEvB,IAAI,OAAOC,UAAU,QAAA,EAAU;YAC7B,OAAOA,KAAAA,CAAMP,MAAM,GAAG,CAAA;AACxB,QAAA;AAEA,QAAA,IAAIV,cAAciB,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAOL,uBAAAA,CAAwBK,KAAAA,CAAAA;AACjC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA,CAAA;AACF;AAEA,kFACA,SAASC,uBAAAA,CAAwBd,IAAY,EAAA;IAC3C,OAAOD,yBAAAA,CAA0BC,IAAAA,CAAAA,CAAMM,MAAM,GAAG,CAAA;AAClD;AAEA;;;;IAKO,SAASS,OAAAA,CAAQf,IAAc,EAAA;IACpC,IAAIA,IAAAA,KAASgB,SAAAA,IAAahB,IAAAA,KAAS,IAAA,EAAM;QACvC,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,QAAA,OAAOc,uBAAAA,CAAwBd,IAAAA,CAAAA;AACjC,IAAA;IAEA,IAAIiB,KAAAA,CAAMC,OAAO,CAAClB,IAAAA,CAAAA,EAAO;QACvB,IAAIA,IAAAA,CAAKM,MAAM,KAAK,CAAA,EAAG;YACrB,OAAO,KAAA;AACT,QAAA;QAEA,OAAON,IAAAA,CAAKW,IAAI,CAAC,CAACQ,IAAAA,GAAAA;YAChB,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,gBAAA,OAAOL,uBAAAA,CAAwBK,IAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAIvB,cAAcuB,IAAAA,CAAAA,EAAO;AACvB,gBAAA,OAAOX,uBAAAA,CAAwBW,IAAAA,CAAAA;AACjC,YAAA;YAEA,OAAO,KAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,IAAIvB,cAAcI,IAAAA,CAAAA,EAAO;AACvB,QAAA,OAAOQ,uBAAAA,CAAwBR,IAAAA,CAAAA;AACjC,IAAA;IAEA,OAAO,KAAA;AACT;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-populate.d.ts","sourceRoot":"","sources":["../../src/traverse/query-populate.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"query-populate.d.ts","sourceRoot":"","sources":["../../src/traverse/query-populate.ts"],"names":[],"mappings":";;AAuUA,wBAAwC"}
|
|
@@ -3,7 +3,29 @@
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
4
|
var factory = require('./factory.js');
|
|
5
5
|
var contentTypes = require('../content-types.js');
|
|
6
|
+
var errors = require('../errors.js');
|
|
6
7
|
|
|
8
|
+
const DEFAULT_QS_ARRAY_LIMIT = 100;
|
|
9
|
+
/**
|
|
10
|
+
* Detects objects with consecutive numeric string keys and string values — the shape `qs`
|
|
11
|
+
* produces when indexed array notation exceeds `arrayLimit` (see #25632).
|
|
12
|
+
*/ const isQsArrayLimitPopulateObject = (value)=>{
|
|
13
|
+
if (!fp.isObject(value) || fp.isArray(value)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const keys = Object.keys(value);
|
|
17
|
+
if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const hasConsecutiveNumericKeys = keys.every((key, index)=>key === String(index));
|
|
21
|
+
if (!hasConsecutiveNumericKeys) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return Object.values(value).every((entry)=>typeof entry === 'string');
|
|
25
|
+
};
|
|
26
|
+
const throwQsArrayLimitPopulateError = (entryCount)=>{
|
|
27
|
+
throw new errors.ValidationError(`Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` + 'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.');
|
|
28
|
+
};
|
|
7
29
|
const isKeyword = (keyword)=>{
|
|
8
30
|
return ({ key, attribute })=>{
|
|
9
31
|
return !attribute && keyword === key;
|
|
@@ -29,6 +51,8 @@ const populate = factory().intercept(isPopulateString, async (visitor, options,
|
|
|
29
51
|
.intercept(isStringArray, async (visitor, options, populate, { recurse })=>{
|
|
30
52
|
const paths = await Promise.all(populate.map((subClause)=>recurse(visitor, options, subClause)));
|
|
31
53
|
return paths.filter((item)=>!fp.isNil(item));
|
|
54
|
+
}).intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate)=>{
|
|
55
|
+
throwQsArrayLimitPopulateError(Object.keys(populate).length);
|
|
32
56
|
})// for wildcard, generate custom utilities to modify the values
|
|
33
57
|
.parse(isWildcard, ()=>({
|
|
34
58
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-populate.js","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import {\n curry,\n isString,\n isArray,\n isEmpty,\n split,\n isObject,\n trim,\n constant,\n isNil,\n identity,\n cloneDeep,\n join,\n first,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const [result] = objectPopulateToPaths(traversedPopulate);\n\n return result;\n })\n // Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const paths = await Promise.all(\n populate.map((subClause) => recurse(visitor, options, subClause))\n );\n\n return paths.filter((item) => !isNil(item));\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = split('.');\n const recompose = join('.');\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute, parent }) => {\n // We don't want to recurse using traversePopulate for query keywords.\n // Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).\n //\n // When a keyword name (e.g. 'filters') also exists as an attribute in the schema,\n // we still treat it as a keyword if we're inside a nested populate context\n // (parent is an attribute). This prevents the traverse from recursing into\n // component/relation attributes named 'filters' with query filter data,\n // which would cause \"Invalid key\" validation errors (issue #21338).\n //\n // The attribute can still be populated explicitly via `populate: { filters: true }`.\n return ['sort', 'filters', 'fields'].includes(key) && (!attribute || !!parent?.attribute);\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, newValue);\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (isNil(value) || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string) {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n traverse((value as { populate: PopulateObject }).populate, currentPath);\n }\n }\n }\n\n traverse(input, '');\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["isKeyword","keyword","key","attribute","isWildcard","value","isPopulateString","isString","isStringArray","isArray","every","isObj","isObject","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","result","objectPopulateToPaths","paths","Promise","all","map","subClause","filter","item","isNil","parse","transform","identity","get","_key","data","set","keys","constant","remove","undefined","tokenize","split","recompose","join","trim","root","isEmpty","v","first","rest","cloneDeep","ignored","Object","ignore","parent","includes","on","path","schema","getModel","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","object","length","forEach","clause"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-populate.js","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import {\n curry,\n isString,\n isArray,\n isEmpty,\n split,\n isObject,\n trim,\n constant,\n isNil,\n identity,\n cloneDeep,\n join,\n first,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\nimport { ValidationError } from '../errors';\n\nconst DEFAULT_QS_ARRAY_LIMIT = 100;\n\n/**\n * Detects objects with consecutive numeric string keys and string values — the shape `qs`\n * produces when indexed array notation exceeds `arrayLimit` (see #25632).\n */\nconst isQsArrayLimitPopulateObject = (value: unknown): value is Record<string, string> => {\n if (!isObject(value) || isArray(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {\n return false;\n }\n\n const hasConsecutiveNumericKeys = keys.every((key, index) => key === String(index));\n\n if (!hasConsecutiveNumericKeys) {\n return false;\n }\n\n return Object.values(value).every((entry) => typeof entry === 'string');\n};\n\nconst throwQsArrayLimitPopulateError = (entryCount: number) => {\n throw new ValidationError(\n `Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` +\n 'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.'\n );\n};\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const [result] = objectPopulateToPaths(traversedPopulate);\n\n return result;\n })\n // Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const paths = await Promise.all(\n populate.map((subClause) => recurse(visitor, options, subClause))\n );\n\n return paths.filter((item) => !isNil(item));\n })\n .intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate) => {\n throwQsArrayLimitPopulateError(Object.keys(populate).length);\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = split('.');\n const recompose = join('.');\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute, parent }) => {\n // We don't want to recurse using traversePopulate for query keywords.\n // Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).\n //\n // When a keyword name (e.g. 'filters') also exists as an attribute in the schema,\n // we still treat it as a keyword if we're inside a nested populate context\n // (parent is an attribute). This prevents the traverse from recursing into\n // component/relation attributes named 'filters' with query filter data,\n // which would cause \"Invalid key\" validation errors (issue #21338).\n //\n // The attribute can still be populated explicitly via `populate: { filters: true }`.\n return ['sort', 'filters', 'fields'].includes(key) && (!attribute || !!parent?.attribute);\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, newValue);\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (isNil(value) || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string) {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n traverse((value as { populate: PopulateObject }).populate, currentPath);\n }\n }\n }\n\n traverse(input, '');\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["DEFAULT_QS_ARRAY_LIMIT","isQsArrayLimitPopulateObject","value","isObject","isArray","keys","Object","length","hasConsecutiveNumericKeys","every","key","index","String","values","entry","throwQsArrayLimitPopulateError","entryCount","ValidationError","isKeyword","keyword","attribute","isWildcard","isPopulateString","isString","isStringArray","isObj","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","result","objectPopulateToPaths","paths","Promise","all","map","subClause","filter","item","isNil","_visitor","_options","parse","transform","identity","get","_key","data","set","constant","remove","undefined","tokenize","split","recompose","join","trim","root","isEmpty","v","first","rest","cloneDeep","ignored","ignore","parent","includes","on","path","schema","getModel","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","object","forEach","clause"],"mappings":"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"}
|
|
@@ -1,7 +1,29 @@
|
|
|
1
1
|
import { isNil, identity, constant, isString, split, join, trim, first, isEmpty, cloneDeep, isObject, curry, isArray } from 'lodash/fp';
|
|
2
2
|
import traverseFactory from './factory.mjs';
|
|
3
3
|
import { isMorphToRelationalAttribute } from '../content-types.mjs';
|
|
4
|
+
import { ValidationError } from '../errors.mjs';
|
|
4
5
|
|
|
6
|
+
const DEFAULT_QS_ARRAY_LIMIT = 100;
|
|
7
|
+
/**
|
|
8
|
+
* Detects objects with consecutive numeric string keys and string values — the shape `qs`
|
|
9
|
+
* produces when indexed array notation exceeds `arrayLimit` (see #25632).
|
|
10
|
+
*/ const isQsArrayLimitPopulateObject = (value)=>{
|
|
11
|
+
if (!isObject(value) || isArray(value)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const keys = Object.keys(value);
|
|
15
|
+
if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const hasConsecutiveNumericKeys = keys.every((key, index)=>key === String(index));
|
|
19
|
+
if (!hasConsecutiveNumericKeys) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return Object.values(value).every((entry)=>typeof entry === 'string');
|
|
23
|
+
};
|
|
24
|
+
const throwQsArrayLimitPopulateError = (entryCount)=>{
|
|
25
|
+
throw new ValidationError(`Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` + 'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.');
|
|
26
|
+
};
|
|
5
27
|
const isKeyword = (keyword)=>{
|
|
6
28
|
return ({ key, attribute })=>{
|
|
7
29
|
return !attribute && keyword === key;
|
|
@@ -27,6 +49,8 @@ const populate = traverseFactory().intercept(isPopulateString, async (visitor, o
|
|
|
27
49
|
.intercept(isStringArray, async (visitor, options, populate, { recurse })=>{
|
|
28
50
|
const paths = await Promise.all(populate.map((subClause)=>recurse(visitor, options, subClause)));
|
|
29
51
|
return paths.filter((item)=>!isNil(item));
|
|
52
|
+
}).intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate)=>{
|
|
53
|
+
throwQsArrayLimitPopulateError(Object.keys(populate).length);
|
|
30
54
|
})// for wildcard, generate custom utilities to modify the values
|
|
31
55
|
.parse(isWildcard, ()=>({
|
|
32
56
|
/**
|