payload 3.68.3 → 3.68.5
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/fields/hooks/afterChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js +3 -2
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/utilities/formatAdminURL.d.ts +19 -4
- package/dist/utilities/formatAdminURL.d.ts.map +1 -1
- package/dist/utilities/formatAdminURL.js +21 -12
- package/dist/utilities/formatAdminURL.js.map +1 -1
- package/dist/utilities/formatAdminURL.spec.js +169 -0
- package/dist/utilities/formatAdminURL.spec.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/afterChange/promise.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,KAAK,EAAS,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAOrE,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,IAAI,GAAG,yBAAyB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,UAAU,CAAA;IACf,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,IAAI,GAAG,qBAAqB,CAAA;IACpC,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,UAAU,CAAA;IACvB,kBAAkB,EAAE,UAAU,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,UAAU,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;CACvC,CAAA;AAKD,eAAO,MAAM,OAAO,yOAoBjB,IAAI,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/afterChange/promise.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,KAAK,EAAS,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAOrE,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,IAAI,GAAG,yBAAyB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,UAAU,CAAA;IACf,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,IAAI,GAAG,qBAAqB,CAAA;IACpC,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,UAAU,CAAA;IACvB,kBAAkB,EAAE,UAAU,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,UAAU,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;CACvC,CAAA;AAKD,eAAO,MAAM,OAAO,yOAoBjB,IAAI,KAAG,OAAO,CAAC,IAAI,CAsTrB,CAAA"}
|
|
@@ -16,6 +16,7 @@ export const promise = async ({ blockData, collection, context, data, doc, field
|
|
|
16
16
|
const schemaPathSegments = schemaPath ? schemaPath.split('.') : [];
|
|
17
17
|
const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : [];
|
|
18
18
|
const getNestedValue = (data, path)=>path.reduce((acc, key)=>acc && acc[key] !== undefined ? acc[key] : undefined, data);
|
|
19
|
+
const previousValData = previousSiblingDoc && Object.keys(previousSiblingDoc).length > 0 ? previousSiblingDoc : previousDoc;
|
|
19
20
|
if (fieldAffectsData(field)) {
|
|
20
21
|
// Execute hooks
|
|
21
22
|
if ('hooks' in field && field.hooks?.afterChange) {
|
|
@@ -33,7 +34,7 @@ export const promise = async ({ blockData, collection, context, data, doc, field
|
|
|
33
34
|
path: pathSegments,
|
|
34
35
|
previousDoc,
|
|
35
36
|
previousSiblingDoc,
|
|
36
|
-
previousValue: getNestedValue(
|
|
37
|
+
previousValue: getNestedValue(previousValData, pathSegments) ?? previousValData?.[field.name],
|
|
37
38
|
req,
|
|
38
39
|
schemaPath: schemaPathSegments,
|
|
39
40
|
siblingData,
|
|
@@ -103,7 +104,7 @@ export const promise = async ({ blockData, collection, context, data, doc, field
|
|
|
103
104
|
parentPath: path + '.' + rowIndex,
|
|
104
105
|
parentSchemaPath: schemaPath + '.' + block.slug,
|
|
105
106
|
previousDoc,
|
|
106
|
-
previousSiblingDoc:
|
|
107
|
+
previousSiblingDoc: previousValData?.[field.name]?.[rowIndex] || {},
|
|
107
108
|
req,
|
|
108
109
|
siblingData: siblingData?.[field.name]?.[rowIndex] || {},
|
|
109
110
|
siblingDoc: row ? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/hooks/afterChange/promise.ts"],"sourcesContent":["import type { RichTextAdapter } from '../../../admin/RichText.js'\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { RequestContext } from '../../../index.js'\nimport type { JsonObject, PayloadRequest } from '../../../types/index.js'\nimport type { Block, Field, TabAsField } from '../../config/types.js'\n\nimport { MissingEditorProp } from '../../../errors/index.js'\nimport { fieldAffectsData, tabHasName } from '../../config/types.js'\nimport { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n data: JsonObject\n doc: JsonObject\n field: Field | TabAsField\n fieldIndex: number\n global: null | SanitizedGlobalConfig\n operation: 'create' | 'update'\n parentIndexPath: string\n parentIsLocalized: boolean\n parentPath: string\n parentSchemaPath: string\n previousDoc: JsonObject\n previousSiblingDoc: JsonObject\n req: PayloadRequest\n siblingData: JsonObject\n siblingDoc: JsonObject\n siblingFields?: (Field | TabAsField)[]\n}\n\n// This function is responsible for the following actions, in order:\n// - Execute field hooks\n\nexport const promise = async ({\n blockData,\n collection,\n context,\n data,\n doc,\n field,\n fieldIndex,\n global,\n operation,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n previousDoc,\n previousSiblingDoc,\n req,\n siblingData,\n siblingDoc,\n siblingFields,\n}: Args): Promise<void> => {\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: fieldIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n const pathSegments = path ? path.split('.') : []\n const schemaPathSegments = schemaPath ? schemaPath.split('.') : []\n const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : []\n const getNestedValue = (data: JsonObject, path: string[]) =>\n path.reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined), data)\n\n if (fieldAffectsData(field)) {\n // Execute hooks\n if ('hooks' in field && field.hooks?.afterChange) {\n for (const hook of field.hooks.afterChange) {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n data,\n field,\n global,\n indexPath: indexPathSegments,\n operation,\n originalDoc: doc,\n path: pathSegments,\n previousDoc,\n previousSiblingDoc,\n previousValue: getNestedValue(previousDoc, pathSegments) ?? previousDoc?.[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n siblingFields: siblingFields!,\n value: getNestedValue(siblingDoc, pathSegments) ?? siblingDoc?.[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name] = hookedValue\n }\n }\n }\n }\n\n // Traverse subfields\n switch (field.type) {\n case 'array': {\n const rows = siblingDoc[field.name]\n\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n rows.forEach((row, rowIndex) => {\n promises.push(\n traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: previousDoc?.[field.name]?.[rowIndex] || ({} as JsonObject),\n req,\n siblingData: siblingData?.[field.name]?.[rowIndex] || {},\n siblingDoc: row ? { ...row } : {},\n }),\n )\n })\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'blocks': {\n const rows = siblingDoc[field.name]\n\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n\n rows.forEach((row, rowIndex) => {\n const blockTypeToMatch = (row as JsonObject).blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n ((field.blockReferences ?? field.blocks).find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n if (block) {\n promises.push(\n traverseFields({\n blockData: siblingData?.[field.name]?.[rowIndex],\n collection,\n context,\n data,\n doc,\n fields: block.fields,\n global,\n operation,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n previousDoc,\n previousSiblingDoc: previousDoc?.[field.name]?.[rowIndex] || ({} as JsonObject),\n req,\n siblingData: siblingData?.[field.name]?.[rowIndex] || {},\n siblingDoc: row ? { ...row } : {},\n }),\n )\n }\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'collapsible':\n case 'row': {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: { ...previousSiblingDoc },\n req,\n siblingData: siblingData || {},\n siblingDoc: { ...siblingDoc },\n })\n\n break\n }\n\n case 'group': {\n if (fieldAffectsData(field)) {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: (previousDoc?.[field.name] as JsonObject) || {},\n req,\n siblingData: (siblingData?.[field.name] as JsonObject) || {},\n siblingDoc: (siblingDoc?.[field.name] as JsonObject) || {},\n })\n } else {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: { ...previousSiblingDoc },\n req,\n siblingData: siblingData || {},\n siblingDoc: { ...siblingDoc },\n })\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof field.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = field.editor\n\n if (editor?.hooks?.afterChange?.length) {\n for (const hook of editor.hooks.afterChange) {\n const hookedValue = await hook({\n collection,\n context,\n data,\n field,\n global,\n indexPath: indexPathSegments,\n operation,\n originalDoc: doc,\n parentIsLocalized,\n path: pathSegments,\n previousDoc,\n previousSiblingDoc,\n previousValue: previousDoc?.[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n value: siblingDoc?.[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name] = hookedValue\n }\n }\n }\n break\n }\n\n case 'tab': {\n let tabSiblingData = siblingData\n let tabSiblingDoc = siblingDoc\n let tabPreviousSiblingDoc = siblingDoc\n\n const isNamedTab = tabHasName(field)\n\n if (isNamedTab) {\n tabSiblingData = (siblingData?.[field.name] ?? {}) as JsonObject\n tabSiblingDoc = (siblingDoc?.[field.name] ?? {}) as JsonObject\n tabPreviousSiblingDoc = (previousDoc?.[field.name] ?? {}) as JsonObject\n }\n\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: isNamedTab ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedTab ? path : parentPath,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: tabPreviousSiblingDoc,\n req,\n siblingData: tabSiblingData,\n siblingDoc: tabSiblingDoc,\n })\n\n break\n }\n\n case 'tabs': {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n global,\n operation,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: { ...previousSiblingDoc },\n req,\n siblingData: siblingData || {},\n siblingDoc: { ...siblingDoc },\n })\n\n break\n }\n\n default: {\n break\n }\n }\n}\n"],"names":["MissingEditorProp","fieldAffectsData","tabHasName","getFieldPathsModified","getFieldPaths","traverseFields","promise","blockData","collection","context","data","doc","field","fieldIndex","global","operation","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","previousDoc","previousSiblingDoc","req","siblingData","siblingDoc","siblingFields","indexPath","path","schemaPath","index","pathSegments","split","schemaPathSegments","indexPathSegments","filter","Boolean","map","Number","getNestedValue","reduce","acc","key","undefined","hooks","afterChange","hook","hookedValue","originalDoc","previousValue","name","value","type","rows","Array","isArray","promises","forEach","row","rowIndex","push","fields","localized","Promise","all","blockTypeToMatch","blockType","block","payload","blocks","blockReferences","find","curBlock","slug","editor","Error","length","tabSiblingData","tabSiblingDoc","tabPreviousSiblingDoc","isNamedTab","tabs","tab"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/fields/hooks/afterChange/promise.ts"],"sourcesContent":["import type { RichTextAdapter } from '../../../admin/RichText.js'\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { RequestContext } from '../../../index.js'\nimport type { JsonObject, PayloadRequest } from '../../../types/index.js'\nimport type { Block, Field, TabAsField } from '../../config/types.js'\n\nimport { MissingEditorProp } from '../../../errors/index.js'\nimport { fieldAffectsData, tabHasName } from '../../config/types.js'\nimport { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n data: JsonObject\n doc: JsonObject\n field: Field | TabAsField\n fieldIndex: number\n global: null | SanitizedGlobalConfig\n operation: 'create' | 'update'\n parentIndexPath: string\n parentIsLocalized: boolean\n parentPath: string\n parentSchemaPath: string\n previousDoc: JsonObject\n previousSiblingDoc: JsonObject\n req: PayloadRequest\n siblingData: JsonObject\n siblingDoc: JsonObject\n siblingFields?: (Field | TabAsField)[]\n}\n\n// This function is responsible for the following actions, in order:\n// - Execute field hooks\n\nexport const promise = async ({\n blockData,\n collection,\n context,\n data,\n doc,\n field,\n fieldIndex,\n global,\n operation,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n previousDoc,\n previousSiblingDoc,\n req,\n siblingData,\n siblingDoc,\n siblingFields,\n}: Args): Promise<void> => {\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: fieldIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n const pathSegments = path ? path.split('.') : []\n const schemaPathSegments = schemaPath ? schemaPath.split('.') : []\n const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : []\n const getNestedValue = (data: JsonObject, path: string[]) =>\n path.reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined), data)\n const previousValData =\n previousSiblingDoc && Object.keys(previousSiblingDoc).length > 0\n ? previousSiblingDoc\n : previousDoc\n\n if (fieldAffectsData(field)) {\n // Execute hooks\n if ('hooks' in field && field.hooks?.afterChange) {\n for (const hook of field.hooks.afterChange) {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n data,\n field,\n global,\n indexPath: indexPathSegments,\n operation,\n originalDoc: doc,\n path: pathSegments,\n previousDoc,\n previousSiblingDoc,\n previousValue:\n getNestedValue(previousValData, pathSegments) ?? previousValData?.[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n siblingFields: siblingFields!,\n value: getNestedValue(siblingDoc, pathSegments) ?? siblingDoc?.[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name] = hookedValue\n }\n }\n }\n }\n\n // Traverse subfields\n switch (field.type) {\n case 'array': {\n const rows = siblingDoc[field.name]\n\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n rows.forEach((row, rowIndex) => {\n promises.push(\n traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: previousDoc?.[field.name]?.[rowIndex] || ({} as JsonObject),\n req,\n siblingData: siblingData?.[field.name]?.[rowIndex] || {},\n siblingDoc: row ? { ...row } : {},\n }),\n )\n })\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'blocks': {\n const rows = siblingDoc[field.name]\n\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n\n rows.forEach((row, rowIndex) => {\n const blockTypeToMatch = (row as JsonObject).blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n ((field.blockReferences ?? field.blocks).find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n if (block) {\n promises.push(\n traverseFields({\n blockData: siblingData?.[field.name]?.[rowIndex],\n collection,\n context,\n data,\n doc,\n fields: block.fields,\n global,\n operation,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n previousDoc,\n previousSiblingDoc: previousValData?.[field.name]?.[rowIndex] || ({} as JsonObject),\n req,\n siblingData: siblingData?.[field.name]?.[rowIndex] || {},\n siblingDoc: row ? { ...row } : {},\n }),\n )\n }\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'collapsible':\n case 'row': {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: { ...previousSiblingDoc },\n req,\n siblingData: siblingData || {},\n siblingDoc: { ...siblingDoc },\n })\n\n break\n }\n\n case 'group': {\n if (fieldAffectsData(field)) {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: (previousDoc?.[field.name] as JsonObject) || {},\n req,\n siblingData: (siblingData?.[field.name] as JsonObject) || {},\n siblingDoc: (siblingDoc?.[field.name] as JsonObject) || {},\n })\n } else {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: { ...previousSiblingDoc },\n req,\n siblingData: siblingData || {},\n siblingDoc: { ...siblingDoc },\n })\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof field.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = field.editor\n\n if (editor?.hooks?.afterChange?.length) {\n for (const hook of editor.hooks.afterChange) {\n const hookedValue = await hook({\n collection,\n context,\n data,\n field,\n global,\n indexPath: indexPathSegments,\n operation,\n originalDoc: doc,\n parentIsLocalized,\n path: pathSegments,\n previousDoc,\n previousSiblingDoc,\n previousValue: previousDoc?.[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n value: siblingDoc?.[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name] = hookedValue\n }\n }\n }\n break\n }\n\n case 'tab': {\n let tabSiblingData = siblingData\n let tabSiblingDoc = siblingDoc\n let tabPreviousSiblingDoc = siblingDoc\n\n const isNamedTab = tabHasName(field)\n\n if (isNamedTab) {\n tabSiblingData = (siblingData?.[field.name] ?? {}) as JsonObject\n tabSiblingDoc = (siblingDoc?.[field.name] ?? {}) as JsonObject\n tabPreviousSiblingDoc = (previousDoc?.[field.name] ?? {}) as JsonObject\n }\n\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.fields,\n global,\n operation,\n parentIndexPath: isNamedTab ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedTab ? path : parentPath,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: tabPreviousSiblingDoc,\n req,\n siblingData: tabSiblingData,\n siblingDoc: tabSiblingDoc,\n })\n\n break\n }\n\n case 'tabs': {\n await traverseFields({\n blockData,\n collection,\n context,\n data,\n doc,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n global,\n operation,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n previousDoc,\n previousSiblingDoc: { ...previousSiblingDoc },\n req,\n siblingData: siblingData || {},\n siblingDoc: { ...siblingDoc },\n })\n\n break\n }\n\n default: {\n break\n }\n }\n}\n"],"names":["MissingEditorProp","fieldAffectsData","tabHasName","getFieldPathsModified","getFieldPaths","traverseFields","promise","blockData","collection","context","data","doc","field","fieldIndex","global","operation","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","previousDoc","previousSiblingDoc","req","siblingData","siblingDoc","siblingFields","indexPath","path","schemaPath","index","pathSegments","split","schemaPathSegments","indexPathSegments","filter","Boolean","map","Number","getNestedValue","reduce","acc","key","undefined","previousValData","Object","keys","length","hooks","afterChange","hook","hookedValue","originalDoc","previousValue","name","value","type","rows","Array","isArray","promises","forEach","row","rowIndex","push","fields","localized","Promise","all","blockTypeToMatch","blockType","block","payload","blocks","blockReferences","find","curBlock","slug","editor","Error","tabSiblingData","tabSiblingDoc","tabPreviousSiblingDoc","isNamedTab","tabs","tab"],"mappings":"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"}
|
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import type { Config } from '../config/types.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* This function builds correct URLs for admin panel routing.
|
|
4
|
+
* Its primary responsibilities are:
|
|
5
|
+
* 1. Read from your `routes.admin` config and appropriately handle `"/"` admin paths
|
|
6
|
+
* 2. Prepend the `basePath` from your Next.js config, if specified
|
|
7
|
+
* 3. Return relative or absolute URLs, as needed
|
|
8
|
+
*/
|
|
3
9
|
export declare const formatAdminURL: (args: {
|
|
4
10
|
adminRoute: NonNullable<Config["routes"]>["admin"];
|
|
11
|
+
/**
|
|
12
|
+
* The subpath of your application, if specified.
|
|
13
|
+
* @see https://nextjs.org/docs/app/api-reference/config/next-config-js/basePath
|
|
14
|
+
* @example '/docs'
|
|
15
|
+
*/
|
|
5
16
|
basePath?: string;
|
|
6
|
-
path
|
|
7
|
-
|
|
8
|
-
|
|
17
|
+
path?: "" | `/${string}` | null;
|
|
18
|
+
/**
|
|
19
|
+
* Return a relative URL, e.g. ignore `serverURL`.
|
|
20
|
+
* Useful for route-matching, etc.
|
|
21
|
+
*/
|
|
22
|
+
relative?: boolean;
|
|
23
|
+
} & Pick<Config, "serverURL">) => string;
|
|
9
24
|
//# sourceMappingURL=formatAdminURL.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatAdminURL.d.ts","sourceRoot":"","sources":["../../src/utilities/formatAdminURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD
|
|
1
|
+
{"version":3,"file":"formatAdminURL.d.ts","sourceRoot":"","sources":["../../src/utilities/formatAdminURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,SACnB;IACJ,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAClD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,KAC5B,MAoBF,CAAA"}
|
|
@@ -1,16 +1,25 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
/**
|
|
2
|
+
* This function builds correct URLs for admin panel routing.
|
|
3
|
+
* Its primary responsibilities are:
|
|
4
|
+
* 1. Read from your `routes.admin` config and appropriately handle `"/"` admin paths
|
|
5
|
+
* 2. Prepend the `basePath` from your Next.js config, if specified
|
|
6
|
+
* 3. Return relative or absolute URLs, as needed
|
|
7
|
+
*/ export const formatAdminURL = (args)=>{
|
|
8
|
+
const { adminRoute, basePath = '', path = '', relative = false, serverURL } = args;
|
|
9
|
+
const pathSegments = [
|
|
10
|
+
basePath
|
|
11
|
+
];
|
|
12
|
+
if (adminRoute && adminRoute !== '/') {
|
|
13
|
+
pathSegments.push(adminRoute);
|
|
12
14
|
}
|
|
13
|
-
|
|
15
|
+
if (path && !(adminRoute === '/' && !path)) {
|
|
16
|
+
pathSegments.push(path);
|
|
17
|
+
}
|
|
18
|
+
const pathname = pathSegments.join('') || '/';
|
|
19
|
+
if (relative || !serverURL) {
|
|
20
|
+
return pathname;
|
|
21
|
+
}
|
|
22
|
+
return new URL(pathname, serverURL).toString();
|
|
14
23
|
};
|
|
15
24
|
|
|
16
25
|
//# sourceMappingURL=formatAdminURL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/formatAdminURL.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/formatAdminURL.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\n/**\n * This function builds correct URLs for admin panel routing.\n * Its primary responsibilities are:\n * 1. Read from your `routes.admin` config and appropriately handle `\"/\"` admin paths\n * 2. Prepend the `basePath` from your Next.js config, if specified\n * 3. Return relative or absolute URLs, as needed\n */\nexport const formatAdminURL = (\n args: {\n adminRoute: NonNullable<Config['routes']>['admin']\n /**\n * The subpath of your application, if specified.\n * @see https://nextjs.org/docs/app/api-reference/config/next-config-js/basePath\n * @example '/docs'\n */\n basePath?: string\n path?: '' | `/${string}` | null\n /**\n * Return a relative URL, e.g. ignore `serverURL`.\n * Useful for route-matching, etc.\n */\n relative?: boolean\n } & Pick<Config, 'serverURL'>,\n): string => {\n const { adminRoute, basePath = '', path = '', relative = false, serverURL } = args\n\n const pathSegments = [basePath]\n\n if (adminRoute && adminRoute !== '/') {\n pathSegments.push(adminRoute)\n }\n\n if (path && !(adminRoute === '/' && !path)) {\n pathSegments.push(path)\n }\n\n const pathname = pathSegments.join('') || '/'\n\n if (relative || !serverURL) {\n return pathname\n }\n\n return new URL(pathname, serverURL).toString()\n}\n"],"names":["formatAdminURL","args","adminRoute","basePath","path","relative","serverURL","pathSegments","push","pathname","join","URL","toString"],"mappings":"AAEA;;;;;;CAMC,GACD,OAAO,MAAMA,iBAAiB,CAC5BC;IAgBA,MAAM,EAAEC,UAAU,EAAEC,WAAW,EAAE,EAAEC,OAAO,EAAE,EAAEC,WAAW,KAAK,EAAEC,SAAS,EAAE,GAAGL;IAE9E,MAAMM,eAAe;QAACJ;KAAS;IAE/B,IAAID,cAAcA,eAAe,KAAK;QACpCK,aAAaC,IAAI,CAACN;IACpB;IAEA,IAAIE,QAAQ,CAAEF,CAAAA,eAAe,OAAO,CAACE,IAAG,GAAI;QAC1CG,aAAaC,IAAI,CAACJ;IACpB;IAEA,MAAMK,WAAWF,aAAaG,IAAI,CAAC,OAAO;IAE1C,IAAIL,YAAY,CAACC,WAAW;QAC1B,OAAOG;IACT;IAEA,OAAO,IAAIE,IAAIF,UAAUH,WAAWM,QAAQ;AAC9C,EAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { formatAdminURL } from './formatAdminURL.js';
|
|
2
|
+
describe('formatAdminURL', ()=>{
|
|
3
|
+
const serverURL = 'https://example.com';
|
|
4
|
+
const defaultAdminRoute = '/admin';
|
|
5
|
+
const rootAdminRoute = '/';
|
|
6
|
+
const dummyPath = '/collections/posts';
|
|
7
|
+
describe('relative URLs', ()=>{
|
|
8
|
+
it('should ignore `serverURL` when relative=true', ()=>{
|
|
9
|
+
const result = formatAdminURL({
|
|
10
|
+
adminRoute: defaultAdminRoute,
|
|
11
|
+
path: dummyPath,
|
|
12
|
+
serverURL,
|
|
13
|
+
relative: true
|
|
14
|
+
});
|
|
15
|
+
expect(result).toBe(`${defaultAdminRoute}${dummyPath}`);
|
|
16
|
+
});
|
|
17
|
+
it('should force relative URL when `serverURL` is omitted', ()=>{
|
|
18
|
+
const result = formatAdminURL({
|
|
19
|
+
adminRoute: defaultAdminRoute,
|
|
20
|
+
path: dummyPath,
|
|
21
|
+
relative: false
|
|
22
|
+
});
|
|
23
|
+
expect(result).toBe(`${defaultAdminRoute}${dummyPath}`);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('absolute URLs', ()=>{
|
|
27
|
+
it('should return absolute URL with serverURL', ()=>{
|
|
28
|
+
const result = formatAdminURL({
|
|
29
|
+
adminRoute: defaultAdminRoute,
|
|
30
|
+
path: dummyPath,
|
|
31
|
+
serverURL
|
|
32
|
+
});
|
|
33
|
+
expect(result).toBe(`${serverURL}${defaultAdminRoute}${dummyPath}`);
|
|
34
|
+
});
|
|
35
|
+
it('should handle serverURL with trailing slash', ()=>{
|
|
36
|
+
const result = formatAdminURL({
|
|
37
|
+
adminRoute: defaultAdminRoute,
|
|
38
|
+
path: '/collections/posts',
|
|
39
|
+
serverURL: 'https://example.com/'
|
|
40
|
+
});
|
|
41
|
+
expect(result).toBe('https://example.com/admin/collections/posts');
|
|
42
|
+
});
|
|
43
|
+
it('should handle serverURL with subdirectory', ()=>{
|
|
44
|
+
const result = formatAdminURL({
|
|
45
|
+
adminRoute: defaultAdminRoute,
|
|
46
|
+
path: '/collections/posts',
|
|
47
|
+
serverURL: 'https://example.com/api/v1'
|
|
48
|
+
});
|
|
49
|
+
expect(result).toBe('https://example.com/admin/collections/posts');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('admin route handling', ()=>{
|
|
53
|
+
it('should return relative URL for adminRoute="/", no path, no `serverURL`', ()=>{
|
|
54
|
+
const result = formatAdminURL({
|
|
55
|
+
adminRoute: rootAdminRoute,
|
|
56
|
+
relative: true
|
|
57
|
+
});
|
|
58
|
+
expect(result).toBe('/');
|
|
59
|
+
});
|
|
60
|
+
it('should handle relative URL for adminRoute="/", with path, no `serverURL`', ()=>{
|
|
61
|
+
const result = formatAdminURL({
|
|
62
|
+
adminRoute: rootAdminRoute,
|
|
63
|
+
path: dummyPath,
|
|
64
|
+
relative: true
|
|
65
|
+
});
|
|
66
|
+
expect(result).toBe(dummyPath);
|
|
67
|
+
});
|
|
68
|
+
it('should return absolute URL for adminRoute="/", no path, with `serverURL`', ()=>{
|
|
69
|
+
const result = formatAdminURL({
|
|
70
|
+
adminRoute: rootAdminRoute,
|
|
71
|
+
serverURL
|
|
72
|
+
});
|
|
73
|
+
expect(result).toBe('https://example.com/');
|
|
74
|
+
});
|
|
75
|
+
it('should handle absolute URL for adminRoute="/", with path and `serverURL`', ()=>{
|
|
76
|
+
const result = formatAdminURL({
|
|
77
|
+
adminRoute: rootAdminRoute,
|
|
78
|
+
serverURL,
|
|
79
|
+
path: dummyPath
|
|
80
|
+
});
|
|
81
|
+
expect(result).toBe(`${serverURL}${dummyPath}`);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('base path handling', ()=>{
|
|
85
|
+
it('should include basePath in URL', ()=>{
|
|
86
|
+
const result = formatAdminURL({
|
|
87
|
+
adminRoute: defaultAdminRoute,
|
|
88
|
+
basePath: '/v1',
|
|
89
|
+
path: dummyPath,
|
|
90
|
+
serverURL
|
|
91
|
+
});
|
|
92
|
+
expect(result).toBe(`${serverURL}/v1${defaultAdminRoute}${dummyPath}`);
|
|
93
|
+
});
|
|
94
|
+
it('should handle basePath with adminRoute="/"', ()=>{
|
|
95
|
+
const result = formatAdminURL({
|
|
96
|
+
adminRoute: rootAdminRoute,
|
|
97
|
+
basePath: '/v1',
|
|
98
|
+
serverURL
|
|
99
|
+
});
|
|
100
|
+
expect(result).toBe(`${serverURL}/v1`);
|
|
101
|
+
});
|
|
102
|
+
it('should handle basePath with no adminRoute', ()=>{
|
|
103
|
+
const result = formatAdminURL({
|
|
104
|
+
adminRoute: undefined,
|
|
105
|
+
basePath: '/v1',
|
|
106
|
+
path: dummyPath,
|
|
107
|
+
serverURL
|
|
108
|
+
});
|
|
109
|
+
expect(result).toBe(`${serverURL}/v1${dummyPath}`);
|
|
110
|
+
});
|
|
111
|
+
it('should handle empty basePath', ()=>{
|
|
112
|
+
const result = formatAdminURL({
|
|
113
|
+
adminRoute: defaultAdminRoute,
|
|
114
|
+
basePath: '',
|
|
115
|
+
path: dummyPath,
|
|
116
|
+
serverURL
|
|
117
|
+
});
|
|
118
|
+
expect(result).toBe(`${serverURL}${defaultAdminRoute}${dummyPath}`);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('path handling', ()=>{
|
|
122
|
+
it('should handle empty string path', ()=>{
|
|
123
|
+
const result = formatAdminURL({
|
|
124
|
+
adminRoute: defaultAdminRoute,
|
|
125
|
+
path: '',
|
|
126
|
+
serverURL
|
|
127
|
+
});
|
|
128
|
+
expect(result).toBe(`${serverURL}${defaultAdminRoute}`);
|
|
129
|
+
});
|
|
130
|
+
it('should handle null path', ()=>{
|
|
131
|
+
const result = formatAdminURL({
|
|
132
|
+
adminRoute: defaultAdminRoute,
|
|
133
|
+
path: null,
|
|
134
|
+
serverURL
|
|
135
|
+
});
|
|
136
|
+
expect(result).toBe(`${serverURL}${defaultAdminRoute}`);
|
|
137
|
+
});
|
|
138
|
+
it('should handle undefined path', ()=>{
|
|
139
|
+
const result = formatAdminURL({
|
|
140
|
+
adminRoute: defaultAdminRoute,
|
|
141
|
+
path: undefined,
|
|
142
|
+
serverURL
|
|
143
|
+
});
|
|
144
|
+
expect(result).toBe(`${serverURL}${defaultAdminRoute}`);
|
|
145
|
+
});
|
|
146
|
+
it('should handle path with query parameters', ()=>{
|
|
147
|
+
const path = `${dummyPath}?page=2`;
|
|
148
|
+
const result = formatAdminURL({
|
|
149
|
+
adminRoute: defaultAdminRoute,
|
|
150
|
+
path,
|
|
151
|
+
serverURL
|
|
152
|
+
});
|
|
153
|
+
expect(result).toBe(`${serverURL}${defaultAdminRoute}${path}`);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('edge cases', ()=>{
|
|
157
|
+
it('should return "/" when given minimal args', ()=>{
|
|
158
|
+
const result = formatAdminURL({
|
|
159
|
+
adminRoute: undefined,
|
|
160
|
+
basePath: '',
|
|
161
|
+
path: '',
|
|
162
|
+
relative: true
|
|
163
|
+
});
|
|
164
|
+
expect(result).toBe('/');
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
//# sourceMappingURL=formatAdminURL.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/formatAdminURL.spec.ts"],"sourcesContent":["import { formatAdminURL } from './formatAdminURL.js'\n\ndescribe('formatAdminURL', () => {\n const serverURL = 'https://example.com'\n\n const defaultAdminRoute = '/admin'\n const rootAdminRoute = '/'\n\n const dummyPath = '/collections/posts'\n\n describe('relative URLs', () => {\n it('should ignore `serverURL` when relative=true', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: dummyPath,\n serverURL,\n relative: true,\n })\n\n expect(result).toBe(`${defaultAdminRoute}${dummyPath}`)\n })\n\n it('should force relative URL when `serverURL` is omitted', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: dummyPath,\n relative: false,\n })\n\n expect(result).toBe(`${defaultAdminRoute}${dummyPath}`)\n })\n })\n\n describe('absolute URLs', () => {\n it('should return absolute URL with serverURL', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: dummyPath,\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}${defaultAdminRoute}${dummyPath}`)\n })\n\n it('should handle serverURL with trailing slash', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: '/collections/posts',\n serverURL: 'https://example.com/',\n })\n\n expect(result).toBe('https://example.com/admin/collections/posts')\n })\n\n it('should handle serverURL with subdirectory', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: '/collections/posts',\n serverURL: 'https://example.com/api/v1',\n })\n\n expect(result).toBe('https://example.com/admin/collections/posts')\n })\n })\n\n describe('admin route handling', () => {\n it('should return relative URL for adminRoute=\"/\", no path, no `serverURL`', () => {\n const result = formatAdminURL({\n adminRoute: rootAdminRoute,\n relative: true,\n })\n\n expect(result).toBe('/')\n })\n\n it('should handle relative URL for adminRoute=\"/\", with path, no `serverURL`', () => {\n const result = formatAdminURL({\n adminRoute: rootAdminRoute,\n path: dummyPath,\n relative: true,\n })\n\n expect(result).toBe(dummyPath)\n })\n\n it('should return absolute URL for adminRoute=\"/\", no path, with `serverURL`', () => {\n const result = formatAdminURL({\n adminRoute: rootAdminRoute,\n serverURL,\n })\n\n expect(result).toBe('https://example.com/')\n })\n\n it('should handle absolute URL for adminRoute=\"/\", with path and `serverURL`', () => {\n const result = formatAdminURL({\n adminRoute: rootAdminRoute,\n serverURL,\n path: dummyPath,\n })\n\n expect(result).toBe(`${serverURL}${dummyPath}`)\n })\n })\n\n describe('base path handling', () => {\n it('should include basePath in URL', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n basePath: '/v1',\n path: dummyPath,\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}/v1${defaultAdminRoute}${dummyPath}`)\n })\n\n it('should handle basePath with adminRoute=\"/\"', () => {\n const result = formatAdminURL({\n adminRoute: rootAdminRoute,\n basePath: '/v1',\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}/v1`)\n })\n\n it('should handle basePath with no adminRoute', () => {\n const result = formatAdminURL({\n adminRoute: undefined,\n basePath: '/v1',\n path: dummyPath,\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}/v1${dummyPath}`)\n })\n\n it('should handle empty basePath', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n basePath: '',\n path: dummyPath,\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}${defaultAdminRoute}${dummyPath}`)\n })\n })\n\n describe('path handling', () => {\n it('should handle empty string path', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: '',\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}${defaultAdminRoute}`)\n })\n\n it('should handle null path', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: null,\n serverURL,\n })\n expect(result).toBe(`${serverURL}${defaultAdminRoute}`)\n })\n\n it('should handle undefined path', () => {\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path: undefined,\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}${defaultAdminRoute}`)\n })\n\n it('should handle path with query parameters', () => {\n const path = `${dummyPath}?page=2`\n\n const result = formatAdminURL({\n adminRoute: defaultAdminRoute,\n path,\n serverURL,\n })\n\n expect(result).toBe(`${serverURL}${defaultAdminRoute}${path}`)\n })\n })\n\n describe('edge cases', () => {\n it('should return \"/\" when given minimal args', () => {\n const result = formatAdminURL({\n adminRoute: undefined,\n basePath: '',\n path: '',\n relative: true,\n })\n\n expect(result).toBe('/')\n })\n })\n})\n"],"names":["formatAdminURL","describe","serverURL","defaultAdminRoute","rootAdminRoute","dummyPath","it","result","adminRoute","path","relative","expect","toBe","basePath","undefined"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "payload",
|
|
3
|
-
"version": "3.68.
|
|
3
|
+
"version": "3.68.5",
|
|
4
4
|
"description": "Node, React, Headless CMS and Application Framework built on Next.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"admin panel",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"undici": "7.10.0",
|
|
107
107
|
"uuid": "10.0.0",
|
|
108
108
|
"ws": "^8.16.0",
|
|
109
|
-
"@payloadcms/translations": "3.68.
|
|
109
|
+
"@payloadcms/translations": "3.68.5"
|
|
110
110
|
},
|
|
111
111
|
"devDependencies": {
|
|
112
112
|
"@hyrious/esbuild-plugin-commonjs": "0.2.6",
|