payload 3.80.0-internal.cdd7ef7 → 3.80.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/admin/elements/Nav.d.ts +0 -13
- package/dist/admin/elements/Nav.d.ts.map +1 -1
- package/dist/admin/elements/Nav.js.map +1 -1
- package/dist/admin/functions/index.d.ts +38 -1
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/types.d.ts +4 -5
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/admin/views/folderList.d.ts +56 -0
- package/dist/admin/views/folderList.d.ts.map +1 -0
- package/dist/admin/views/folderList.js +3 -0
- package/dist/admin/views/folderList.js.map +1 -0
- package/dist/admin/views/index.d.ts +3 -1
- package/dist/admin/views/index.d.ts.map +1 -1
- package/dist/admin/views/index.js.map +1 -1
- package/dist/admin/views/list.d.ts +2 -43
- package/dist/admin/views/list.d.ts.map +1 -1
- package/dist/admin/views/list.js.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.js +0 -1
- package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
- package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateConfig.js +0 -7
- package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
- package/dist/collections/config/client.d.ts +1 -3
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +0 -11
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.js +1 -1
- package/dist/collections/config/defaults.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +7 -3
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/types.d.ts +7 -29
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/create.js +17 -17
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/findByID.js +3 -3
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/update.js +1 -1
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +6 -6
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +10 -0
- package/dist/config/client.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +15 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +26 -3
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +12 -26
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/exports/shared.d.ts +3 -2
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +2 -1
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/baseFields/slug/index.d.ts +7 -0
- package/dist/fields/baseFields/slug/index.d.ts.map +1 -1
- package/dist/fields/baseFields/slug/index.js +2 -2
- package/dist/fields/baseFields/slug/index.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +0 -4
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
- package/dist/fields/config/sanitizeJoinField.js +0 -3
- package/dist/fields/config/sanitizeJoinField.js.map +1 -1
- package/dist/folders/addFolderCollection.d.ts +10 -0
- package/dist/folders/addFolderCollection.d.ts.map +1 -0
- package/dist/folders/addFolderCollection.js +26 -0
- package/dist/folders/addFolderCollection.js.map +1 -0
- package/dist/folders/addFolderFieldToCollection.d.ts +8 -0
- package/dist/folders/addFolderFieldToCollection.d.ts.map +1 -0
- package/dist/folders/addFolderFieldToCollection.js +20 -0
- package/dist/folders/addFolderFieldToCollection.js.map +1 -0
- package/dist/folders/buildFolderField.d.ts +8 -0
- package/dist/folders/buildFolderField.d.ts.map +1 -0
- package/dist/folders/buildFolderField.js +87 -0
- package/dist/folders/buildFolderField.js.map +1 -0
- package/dist/folders/constants.d.ts +3 -0
- package/dist/folders/constants.d.ts.map +1 -0
- package/dist/folders/constants.js +4 -0
- package/dist/folders/constants.js.map +1 -0
- package/dist/folders/createFolderCollection.d.ts +11 -0
- package/dist/folders/createFolderCollection.d.ts.map +1 -0
- package/dist/folders/createFolderCollection.js +115 -0
- package/dist/folders/createFolderCollection.js.map +1 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts +8 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts.map +1 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.js +15 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.js.map +1 -0
- package/dist/folders/hooks/dissasociateAfterDelete.d.ts +8 -0
- package/dist/folders/hooks/dissasociateAfterDelete.d.ts.map +1 -0
- package/dist/folders/hooks/dissasociateAfterDelete.js +20 -0
- package/dist/folders/hooks/dissasociateAfterDelete.js.map +1 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts +5 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts.map +1 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.js +107 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.js.map +1 -0
- package/dist/folders/hooks/reparentChildFolder.d.ts +24 -0
- package/dist/folders/hooks/reparentChildFolder.d.ts.map +1 -0
- package/dist/folders/hooks/reparentChildFolder.js +72 -0
- package/dist/folders/hooks/reparentChildFolder.js.map +1 -0
- package/dist/folders/types.d.ts +118 -0
- package/dist/folders/types.d.ts.map +1 -0
- package/dist/folders/types.js +3 -0
- package/dist/folders/types.js.map +1 -0
- package/dist/folders/utils/buildFolderWhereConstraints.d.ts +13 -0
- package/dist/folders/utils/buildFolderWhereConstraints.d.ts.map +1 -0
- package/dist/folders/utils/buildFolderWhereConstraints.js +45 -0
- package/dist/folders/utils/buildFolderWhereConstraints.js.map +1 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.d.ts +12 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.d.ts.map +1 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.js +30 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.js.map +1 -0
- package/dist/folders/utils/getFolderBreadcrumbs.d.ts +14 -0
- package/dist/folders/utils/getFolderBreadcrumbs.d.ts.map +1 -0
- package/dist/folders/utils/getFolderBreadcrumbs.js +45 -0
- package/dist/folders/utils/getFolderBreadcrumbs.js.map +1 -0
- package/dist/folders/utils/getFolderData.d.ts +33 -0
- package/dist/folders/utils/getFolderData.d.ts.map +1 -0
- package/dist/folders/utils/getFolderData.js +88 -0
- package/dist/folders/utils/getFolderData.js.map +1 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts +24 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts.map +1 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js +66 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js.map +1 -0
- package/dist/folders/utils/getOrphanedDocs.d.ts +15 -0
- package/dist/folders/utils/getOrphanedDocs.d.ts.map +1 -0
- package/dist/folders/utils/getOrphanedDocs.js +40 -0
- package/dist/folders/utils/getOrphanedDocs.js.map +1 -0
- package/dist/globals/config/types.d.ts +0 -4
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/globals/operations/update.js +2 -1
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/index.bundled.d.ts +288 -577
- package/dist/index.d.ts +9 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -13
- package/dist/index.js.map +1 -1
- package/dist/preferences/keys.d.ts +4 -8
- package/dist/preferences/keys.d.ts.map +1 -1
- package/dist/preferences/keys.js +4 -7
- package/dist/preferences/keys.js.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.js +7 -1
- package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
- package/dist/utilities/extractID.js +1 -1
- package/dist/utilities/extractID.js.map +1 -1
- package/dist/utilities/formatAdminURL.d.ts +2 -13
- package/dist/utilities/formatAdminURL.d.ts.map +1 -1
- package/dist/utilities/formatAdminURL.js.map +1 -1
- package/dist/versions/saveVersion.d.ts +1 -0
- package/dist/versions/saveVersion.d.ts.map +1 -1
- package/dist/versions/saveVersion.js +16 -66
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/updateLatestVersion.d.ts +24 -0
- package/dist/versions/updateLatestVersion.d.ts.map +1 -0
- package/dist/versions/updateLatestVersion.js +64 -0
- package/dist/versions/updateLatestVersion.js.map +1 -0
- package/package.json +4 -4
- package/dist/admin/views/hierarchyList.d.ts +0 -9
- package/dist/admin/views/hierarchyList.d.ts.map +0 -1
- package/dist/admin/views/hierarchyList.js +0 -3
- package/dist/admin/views/hierarchyList.js.map +0 -1
- package/dist/hierarchy/addHierarchyToCollection.d.ts +0 -8
- package/dist/hierarchy/addHierarchyToCollection.d.ts.map +0 -1
- package/dist/hierarchy/addHierarchyToCollection.js +0 -62
- package/dist/hierarchy/addHierarchyToCollection.js.map +0 -1
- package/dist/hierarchy/buildParentField.d.ts +0 -11
- package/dist/hierarchy/buildParentField.d.ts.map +0 -1
- package/dist/hierarchy/buildParentField.js +0 -42
- package/dist/hierarchy/buildParentField.js.map +0 -1
- package/dist/hierarchy/constants.d.ts +0 -15
- package/dist/hierarchy/constants.d.ts.map +0 -1
- package/dist/hierarchy/constants.js +0 -11
- package/dist/hierarchy/constants.js.map +0 -1
- package/dist/hierarchy/createFolderField.d.ts +0 -39
- package/dist/hierarchy/createFolderField.d.ts.map +0 -1
- package/dist/hierarchy/createFolderField.js +0 -54
- package/dist/hierarchy/createFolderField.js.map +0 -1
- package/dist/hierarchy/createFoldersCollection.d.ts +0 -57
- package/dist/hierarchy/createFoldersCollection.d.ts.map +0 -1
- package/dist/hierarchy/createFoldersCollection.js +0 -63
- package/dist/hierarchy/createFoldersCollection.js.map +0 -1
- package/dist/hierarchy/createTagField.d.ts +0 -44
- package/dist/hierarchy/createTagField.d.ts.map +0 -1
- package/dist/hierarchy/createTagField.js +0 -48
- package/dist/hierarchy/createTagField.js.map +0 -1
- package/dist/hierarchy/createTagsCollection.d.ts +0 -54
- package/dist/hierarchy/createTagsCollection.d.ts.map +0 -1
- package/dist/hierarchy/createTagsCollection.js +0 -56
- package/dist/hierarchy/createTagsCollection.js.map +0 -1
- package/dist/hierarchy/getInitialTreeData.d.ts +0 -27
- package/dist/hierarchy/getInitialTreeData.d.ts.map +0 -1
- package/dist/hierarchy/getInitialTreeData.js +0 -125
- package/dist/hierarchy/getInitialTreeData.js.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterDelete.d.ts +0 -14
- package/dist/hierarchy/hooks/collectionAfterDelete.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterDelete.js +0 -21
- package/dist/hierarchy/hooks/collectionAfterDelete.js.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterRead.d.ts +0 -27
- package/dist/hierarchy/hooks/collectionAfterRead.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterRead.js +0 -64
- package/dist/hierarchy/hooks/collectionAfterRead.js.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeChange.d.ts +0 -19
- package/dist/hierarchy/hooks/collectionBeforeChange.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeChange.js +0 -90
- package/dist/hierarchy/hooks/collectionBeforeChange.js.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts +0 -15
- package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeDelete.js +0 -20
- package/dist/hierarchy/hooks/collectionBeforeDelete.js.map +0 -1
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts +0 -8
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts.map +0 -1
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js +0 -108
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js.map +0 -1
- package/dist/hierarchy/injectHierarchyButton.d.ts +0 -14
- package/dist/hierarchy/injectHierarchyButton.d.ts.map +0 -1
- package/dist/hierarchy/injectHierarchyButton.js +0 -37
- package/dist/hierarchy/injectHierarchyButton.js.map +0 -1
- package/dist/hierarchy/resolveHierarchyCollections.d.ts +0 -23
- package/dist/hierarchy/resolveHierarchyCollections.d.ts.map +0 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +0 -312
- package/dist/hierarchy/resolveHierarchyCollections.js.map +0 -1
- package/dist/hierarchy/sanitizeHierarchyCollection.d.ts +0 -14
- package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +0 -1
- package/dist/hierarchy/sanitizeHierarchyCollection.js +0 -112
- package/dist/hierarchy/sanitizeHierarchyCollection.js.map +0 -1
- package/dist/hierarchy/types.d.ts +0 -137
- package/dist/hierarchy/types.d.ts.map +0 -1
- package/dist/hierarchy/types.js +0 -6
- package/dist/hierarchy/types.js.map +0 -1
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts +0 -71
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts.map +0 -1
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js +0 -65
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js.map +0 -1
- package/dist/hierarchy/utils/computePaths.d.ts +0 -31
- package/dist/hierarchy/utils/computePaths.d.ts.map +0 -1
- package/dist/hierarchy/utils/computePaths.js +0 -371
- package/dist/hierarchy/utils/computePaths.js.map +0 -1
- package/dist/hierarchy/utils/findUseAsTitle.d.ts +0 -6
- package/dist/hierarchy/utils/findUseAsTitle.d.ts.map +0 -1
- package/dist/hierarchy/utils/findUseAsTitle.js +0 -72
- package/dist/hierarchy/utils/findUseAsTitle.js.map +0 -1
- package/dist/hierarchy/utils/getAncestors.d.ts +0 -34
- package/dist/hierarchy/utils/getAncestors.d.ts.map +0 -1
- package/dist/hierarchy/utils/getAncestors.js +0 -94
- package/dist/hierarchy/utils/getAncestors.js.map +0 -1
- package/dist/hierarchy/utils/getLocalizedValue.d.ts +0 -30
- package/dist/hierarchy/utils/getLocalizedValue.d.ts.map +0 -1
- package/dist/hierarchy/utils/getLocalizedValue.js +0 -46
- package/dist/hierarchy/utils/getLocalizedValue.js.map +0 -1
- package/dist/hierarchy/utils/getLocalizedValue.spec.js +0 -250
- package/dist/hierarchy/utils/getLocalizedValue.spec.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hierarchy/utils/getAncestors.ts"],"sourcesContent":["import type { CollectionSlug } from '../../index.js'\nimport type { Document, PayloadRequest } from '../../types/index.js'\n\nimport { findUseAsTitleField } from './findUseAsTitle.js'\nimport { getLocalizedValue } from './getLocalizedValue.js'\n\nexport type Ancestor = {\n id: number | string\n title: string\n}\n\ntype GetAncestorsArgs = {\n /**\n * The collection slug\n */\n collectionSlug: CollectionSlug\n /**\n * The document ID to get ancestors for\n */\n id: number | string\n /**\n * Include the document itself in the returned ancestors (as last item)\n * @default true\n */\n includeSelf?: boolean\n /**\n * The request object\n */\n req: PayloadRequest\n}\n\n/**\n * Get ancestor chain for a hierarchical document.\n * Returns array of {id, title} from root to the document.\n *\n * Uses request context caching for efficiency when called multiple times.\n */\nexport async function getAncestors({\n id,\n collectionSlug,\n includeSelf = true,\n req,\n}: GetAncestorsArgs): Promise<Ancestor[]> {\n const { payload, user } = req\n\n const collectionConfig = payload.collections[collectionSlug]?.config\n if (!collectionConfig) {\n throw new Error(`Collection \"${collectionSlug}\" not found`)\n }\n\n const hierarchyConfig = collectionConfig.hierarchy\n if (!hierarchyConfig) {\n throw new Error(`Collection \"${collectionSlug}\" does not have hierarchy enabled`)\n }\n\n const parentFieldName = hierarchyConfig.parentFieldName\n const { localized: isTitleLocalized, titleFieldName } = findUseAsTitleField(collectionConfig)\n\n // Initialize cache if needed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const context = req.context as any\n if (!context.hierarchyAncestorCache) {\n context.hierarchyAncestorCache = {}\n }\n if (!context.hierarchyAncestorCache[collectionSlug]) {\n context.hierarchyAncestorCache[collectionSlug] = {}\n }\n\n const cache = context.hierarchyAncestorCache[collectionSlug]\n const ancestors: Ancestor[] = []\n\n let currentId: null | number | string = id\n\n while (currentId !== null) {\n const cacheKey: string = `ancestors_${currentId}`\n\n // Check cache first\n let doc: Document = cache[cacheKey]\n\n if (!doc) {\n // Cache miss - fetch document\n try {\n doc = await payload.findByID({\n id: currentId,\n collection: collectionSlug,\n depth: 0,\n overrideAccess: false,\n req,\n select: {\n [parentFieldName]: true,\n [titleFieldName]: true,\n },\n user,\n })\n cache[cacheKey] = doc\n } catch {\n break\n }\n }\n\n if (!doc) {\n break\n }\n\n // Extract title\n const rawTitle: unknown = doc[titleFieldName]\n let title: string\n\n if (isTitleLocalized && rawTitle && typeof rawTitle === 'object' && req.locale) {\n const localizedValue = getLocalizedValue({\n fallbackLocale: req.fallbackLocale,\n fieldType: 'text',\n locale: req.locale,\n value: rawTitle,\n })\n title = localizedValue || String(doc.id || currentId)\n } else if (isTitleLocalized && rawTitle && typeof rawTitle === 'object') {\n // No locale set - use first available value\n const values = Object.values(rawTitle as Record<string, string>)\n title = values[0] || String(doc.id || currentId)\n } else {\n title = String(rawTitle || doc.id || currentId)\n }\n\n ancestors.unshift({ id: currentId, title })\n\n // Get parent ID for next iteration\n const parentValue: unknown = doc[parentFieldName]\n if (!parentValue) {\n break\n }\n\n currentId =\n typeof parentValue === 'object' && parentValue !== null && 'id' in parentValue\n ? (parentValue as { id: number | string }).id\n : (parentValue as number | string)\n }\n\n if (!includeSelf && ancestors.length > 0) {\n ancestors.pop()\n }\n\n return ancestors\n}\n"],"names":["findUseAsTitleField","getLocalizedValue","getAncestors","id","collectionSlug","includeSelf","req","payload","user","collectionConfig","collections","config","Error","hierarchyConfig","hierarchy","parentFieldName","localized","isTitleLocalized","titleFieldName","context","hierarchyAncestorCache","cache","ancestors","currentId","cacheKey","doc","findByID","collection","depth","overrideAccess","select","rawTitle","title","locale","localizedValue","fallbackLocale","fieldType","value","String","values","Object","unshift","parentValue","length","pop"],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { TypedFallbackLocale } from '../../index.js';
|
|
2
|
-
type GetLocalizedValueArgs = {
|
|
3
|
-
/**
|
|
4
|
-
* Fallback locale(s) to use if the requested locale has no value
|
|
5
|
-
*/
|
|
6
|
-
fallbackLocale?: TypedFallbackLocale;
|
|
7
|
-
/**
|
|
8
|
-
* The field type - affects empty value handling for text/textarea fields
|
|
9
|
-
*/
|
|
10
|
-
fieldType?: 'text' | 'textarea' | string;
|
|
11
|
-
/**
|
|
12
|
-
* The requested locale
|
|
13
|
-
*/
|
|
14
|
-
locale: string;
|
|
15
|
-
/**
|
|
16
|
-
* The localized value object (e.g., { en: "Home", es: "", de: "Startseite" })
|
|
17
|
-
* Can also be a non-localized value (string/number), which is returned as-is
|
|
18
|
-
*/
|
|
19
|
-
value: any | Record<string, any>;
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Extracts a value from a localized field object, with fallback locale support.
|
|
23
|
-
* Mirrors Payload's internal afterRead behavior for localized fields.
|
|
24
|
-
*
|
|
25
|
-
* @param args - Configuration for value extraction
|
|
26
|
-
* @returns The field value for the requested locale, or fallback if not available
|
|
27
|
-
*/
|
|
28
|
-
export declare function getLocalizedValue({ fallbackLocale, fieldType, locale, value, }: GetLocalizedValueArgs): any;
|
|
29
|
-
export {};
|
|
30
|
-
//# sourceMappingURL=getLocalizedValue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getLocalizedValue.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/utils/getLocalizedValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,KAAK,qBAAqB,GAAG;IAC3B;;OAEG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAA;IACpC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;IACxC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACjC,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,SAAS,EACT,MAAM,EACN,KAAK,GACN,EAAE,qBAAqB,GAAG,GAAG,CAqD7B"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extracts a value from a localized field object, with fallback locale support.
|
|
3
|
-
* Mirrors Payload's internal afterRead behavior for localized fields.
|
|
4
|
-
*
|
|
5
|
-
* @param args - Configuration for value extraction
|
|
6
|
-
* @returns The field value for the requested locale, or fallback if not available
|
|
7
|
-
*/ export function getLocalizedValue({ fallbackLocale, fieldType, locale, value }) {
|
|
8
|
-
// If value is not an object (non-localized field), return it as-is
|
|
9
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
10
|
-
return value;
|
|
11
|
-
}
|
|
12
|
-
// Get the requested locale's value
|
|
13
|
-
const requestedValue = value[locale];
|
|
14
|
-
// Determine if we should use fallback
|
|
15
|
-
const isNullOrUndefined = typeof requestedValue === 'undefined' || requestedValue === null;
|
|
16
|
-
// For text/textarea fields, empty string also triggers fallback
|
|
17
|
-
const shouldUseFallback = fieldType === 'text' || fieldType === 'textarea' ? requestedValue === '' || isNullOrUndefined : isNullOrUndefined;
|
|
18
|
-
if (!shouldUseFallback) {
|
|
19
|
-
return requestedValue;
|
|
20
|
-
}
|
|
21
|
-
// No fallback configured, return the (potentially empty) requested value
|
|
22
|
-
if (!fallbackLocale || fallbackLocale === 'null' || fallbackLocale === 'none' || fallbackLocale === 'false') {
|
|
23
|
-
return requestedValue;
|
|
24
|
-
}
|
|
25
|
-
// Handle array of fallback locales
|
|
26
|
-
if (Array.isArray(fallbackLocale)) {
|
|
27
|
-
for (const fallbackLoc of fallbackLocale){
|
|
28
|
-
const fallbackValue = value[fallbackLoc];
|
|
29
|
-
// Check if fallback value is non-empty
|
|
30
|
-
if (fallbackValue !== undefined && fallbackValue !== null && fallbackValue !== '') {
|
|
31
|
-
return fallbackValue;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// No fallback had a value, return requested value
|
|
35
|
-
return requestedValue;
|
|
36
|
-
}
|
|
37
|
-
// Single fallback locale
|
|
38
|
-
const fallbackValue = value[fallbackLocale];
|
|
39
|
-
if (fallbackValue !== undefined && fallbackValue !== null && fallbackValue !== '') {
|
|
40
|
-
return fallbackValue;
|
|
41
|
-
}
|
|
42
|
-
// Fallback didn't have a value either, return requested value
|
|
43
|
-
return requestedValue;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
//# sourceMappingURL=getLocalizedValue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hierarchy/utils/getLocalizedValue.ts"],"sourcesContent":["import type { TypedFallbackLocale } from '../../index.js'\n\ntype GetLocalizedValueArgs = {\n /**\n * Fallback locale(s) to use if the requested locale has no value\n */\n fallbackLocale?: TypedFallbackLocale\n /**\n * The field type - affects empty value handling for text/textarea fields\n */\n fieldType?: 'text' | 'textarea' | string\n /**\n * The requested locale\n */\n locale: string\n /**\n * The localized value object (e.g., { en: \"Home\", es: \"\", de: \"Startseite\" })\n * Can also be a non-localized value (string/number), which is returned as-is\n */\n value: any | Record<string, any>\n}\n\n/**\n * Extracts a value from a localized field object, with fallback locale support.\n * Mirrors Payload's internal afterRead behavior for localized fields.\n *\n * @param args - Configuration for value extraction\n * @returns The field value for the requested locale, or fallback if not available\n */\nexport function getLocalizedValue({\n fallbackLocale,\n fieldType,\n locale,\n value,\n}: GetLocalizedValueArgs): any {\n // If value is not an object (non-localized field), return it as-is\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value\n }\n\n // Get the requested locale's value\n const requestedValue = value[locale]\n\n // Determine if we should use fallback\n const isNullOrUndefined = typeof requestedValue === 'undefined' || requestedValue === null\n\n // For text/textarea fields, empty string also triggers fallback\n const shouldUseFallback =\n fieldType === 'text' || fieldType === 'textarea'\n ? requestedValue === '' || isNullOrUndefined\n : isNullOrUndefined\n\n if (!shouldUseFallback) {\n return requestedValue\n }\n\n // No fallback configured, return the (potentially empty) requested value\n if (\n !fallbackLocale ||\n fallbackLocale === 'null' ||\n fallbackLocale === 'none' ||\n fallbackLocale === 'false'\n ) {\n return requestedValue\n }\n\n // Handle array of fallback locales\n if (Array.isArray(fallbackLocale)) {\n for (const fallbackLoc of fallbackLocale) {\n const fallbackValue = value[fallbackLoc]\n // Check if fallback value is non-empty\n if (fallbackValue !== undefined && fallbackValue !== null && fallbackValue !== '') {\n return fallbackValue\n }\n }\n // No fallback had a value, return requested value\n return requestedValue\n }\n\n // Single fallback locale\n const fallbackValue = value[fallbackLocale]\n if (fallbackValue !== undefined && fallbackValue !== null && fallbackValue !== '') {\n return fallbackValue\n }\n\n // Fallback didn't have a value either, return requested value\n return requestedValue\n}\n"],"names":["getLocalizedValue","fallbackLocale","fieldType","locale","value","Array","isArray","requestedValue","isNullOrUndefined","shouldUseFallback","fallbackLoc","fallbackValue","undefined"],"mappings":"AAsBA;;;;;;CAMC,GACD,OAAO,SAASA,kBAAkB,EAChCC,cAAc,EACdC,SAAS,EACTC,MAAM,EACNC,KAAK,EACiB;IACtB,mEAAmE;IACnE,IAAI,CAACA,SAAS,OAAOA,UAAU,YAAYC,MAAMC,OAAO,CAACF,QAAQ;QAC/D,OAAOA;IACT;IAEA,mCAAmC;IACnC,MAAMG,iBAAiBH,KAAK,CAACD,OAAO;IAEpC,sCAAsC;IACtC,MAAMK,oBAAoB,OAAOD,mBAAmB,eAAeA,mBAAmB;IAEtF,gEAAgE;IAChE,MAAME,oBACJP,cAAc,UAAUA,cAAc,aAClCK,mBAAmB,MAAMC,oBACzBA;IAEN,IAAI,CAACC,mBAAmB;QACtB,OAAOF;IACT;IAEA,yEAAyE;IACzE,IACE,CAACN,kBACDA,mBAAmB,UACnBA,mBAAmB,UACnBA,mBAAmB,SACnB;QACA,OAAOM;IACT;IAEA,mCAAmC;IACnC,IAAIF,MAAMC,OAAO,CAACL,iBAAiB;QACjC,KAAK,MAAMS,eAAeT,eAAgB;YACxC,MAAMU,gBAAgBP,KAAK,CAACM,YAAY;YACxC,uCAAuC;YACvC,IAAIC,kBAAkBC,aAAaD,kBAAkB,QAAQA,kBAAkB,IAAI;gBACjF,OAAOA;YACT;QACF;QACA,kDAAkD;QAClD,OAAOJ;IACT;IAEA,yBAAyB;IACzB,MAAMI,gBAAgBP,KAAK,CAACH,eAAe;IAC3C,IAAIU,kBAAkBC,aAAaD,kBAAkB,QAAQA,kBAAkB,IAAI;QACjF,OAAOA;IACT;IAEA,8DAA8D;IAC9D,OAAOJ;AACT"}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { getLocalizedValue } from './getLocalizedValue.js';
|
|
3
|
-
describe('getLocalizedValue', ()=>{
|
|
4
|
-
describe('non-localized values', ()=>{
|
|
5
|
-
it('should return non-object values as-is', ()=>{
|
|
6
|
-
expect(getLocalizedValue({
|
|
7
|
-
locale: 'en',
|
|
8
|
-
value: 'Hello'
|
|
9
|
-
})).toBe('Hello');
|
|
10
|
-
expect(getLocalizedValue({
|
|
11
|
-
locale: 'en',
|
|
12
|
-
value: 123
|
|
13
|
-
})).toBe(123);
|
|
14
|
-
expect(getLocalizedValue({
|
|
15
|
-
locale: 'en',
|
|
16
|
-
value: null
|
|
17
|
-
})).toBe(null);
|
|
18
|
-
});
|
|
19
|
-
it('should return array values as-is', ()=>{
|
|
20
|
-
const arr = [
|
|
21
|
-
1,
|
|
22
|
-
2,
|
|
23
|
-
3
|
|
24
|
-
];
|
|
25
|
-
expect(getLocalizedValue({
|
|
26
|
-
locale: 'en',
|
|
27
|
-
value: arr
|
|
28
|
-
})).toBe(arr);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
describe('localized values without fallback', ()=>{
|
|
32
|
-
it('should return the requested locale value', ()=>{
|
|
33
|
-
const value = {
|
|
34
|
-
en: 'Home',
|
|
35
|
-
es: 'Inicio',
|
|
36
|
-
de: 'Startseite'
|
|
37
|
-
};
|
|
38
|
-
expect(getLocalizedValue({
|
|
39
|
-
locale: 'en',
|
|
40
|
-
value
|
|
41
|
-
})).toBe('Home');
|
|
42
|
-
expect(getLocalizedValue({
|
|
43
|
-
locale: 'es',
|
|
44
|
-
value
|
|
45
|
-
})).toBe('Inicio');
|
|
46
|
-
expect(getLocalizedValue({
|
|
47
|
-
locale: 'de',
|
|
48
|
-
value
|
|
49
|
-
})).toBe('Startseite');
|
|
50
|
-
});
|
|
51
|
-
it('should return undefined for missing locale', ()=>{
|
|
52
|
-
const value = {
|
|
53
|
-
en: 'Home',
|
|
54
|
-
es: 'Inicio'
|
|
55
|
-
};
|
|
56
|
-
expect(getLocalizedValue({
|
|
57
|
-
locale: 'fr',
|
|
58
|
-
value
|
|
59
|
-
})).toBeUndefined();
|
|
60
|
-
});
|
|
61
|
-
it('should return empty string for text fields', ()=>{
|
|
62
|
-
const value = {
|
|
63
|
-
en: 'Home',
|
|
64
|
-
es: ''
|
|
65
|
-
};
|
|
66
|
-
expect(getLocalizedValue({
|
|
67
|
-
locale: 'es',
|
|
68
|
-
value
|
|
69
|
-
})).toBe('');
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
describe('localized values with single fallback', ()=>{
|
|
73
|
-
it('should use fallback when requested locale is undefined', ()=>{
|
|
74
|
-
const value = {
|
|
75
|
-
en: 'Home',
|
|
76
|
-
es: undefined,
|
|
77
|
-
de: 'Startseite'
|
|
78
|
-
};
|
|
79
|
-
expect(getLocalizedValue({
|
|
80
|
-
fallbackLocale: 'en',
|
|
81
|
-
locale: 'es',
|
|
82
|
-
value
|
|
83
|
-
})).toBe('Home');
|
|
84
|
-
});
|
|
85
|
-
it('should use fallback when requested locale is null', ()=>{
|
|
86
|
-
const value = {
|
|
87
|
-
en: 'Home',
|
|
88
|
-
es: null,
|
|
89
|
-
de: 'Startseite'
|
|
90
|
-
};
|
|
91
|
-
expect(getLocalizedValue({
|
|
92
|
-
fallbackLocale: 'en',
|
|
93
|
-
locale: 'es',
|
|
94
|
-
value
|
|
95
|
-
})).toBe('Home');
|
|
96
|
-
});
|
|
97
|
-
it('should use fallback for empty string in text fields', ()=>{
|
|
98
|
-
const value = {
|
|
99
|
-
en: 'Home',
|
|
100
|
-
es: '',
|
|
101
|
-
de: 'Startseite'
|
|
102
|
-
};
|
|
103
|
-
expect(getLocalizedValue({
|
|
104
|
-
fallbackLocale: 'en',
|
|
105
|
-
fieldType: 'text',
|
|
106
|
-
locale: 'es',
|
|
107
|
-
value
|
|
108
|
-
})).toBe('Home');
|
|
109
|
-
});
|
|
110
|
-
it('should NOT use fallback for empty string in non-text fields', ()=>{
|
|
111
|
-
const value = {
|
|
112
|
-
en: 'Home',
|
|
113
|
-
es: '',
|
|
114
|
-
de: 'Startseite'
|
|
115
|
-
};
|
|
116
|
-
expect(getLocalizedValue({
|
|
117
|
-
fallbackLocale: 'en',
|
|
118
|
-
fieldType: 'select',
|
|
119
|
-
locale: 'es',
|
|
120
|
-
value
|
|
121
|
-
})).toBe('');
|
|
122
|
-
});
|
|
123
|
-
it('should return requested value when fallback is disabled', ()=>{
|
|
124
|
-
const value = {
|
|
125
|
-
en: 'Home',
|
|
126
|
-
es: undefined
|
|
127
|
-
};
|
|
128
|
-
expect(getLocalizedValue({
|
|
129
|
-
fallbackLocale: false,
|
|
130
|
-
locale: 'es',
|
|
131
|
-
value
|
|
132
|
-
})).toBeUndefined();
|
|
133
|
-
expect(getLocalizedValue({
|
|
134
|
-
fallbackLocale: 'null',
|
|
135
|
-
locale: 'es',
|
|
136
|
-
value
|
|
137
|
-
})).toBeUndefined();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
describe('localized values with array fallback', ()=>{
|
|
141
|
-
it('should use first available fallback', ()=>{
|
|
142
|
-
const value = {
|
|
143
|
-
en: 'Home',
|
|
144
|
-
es: undefined,
|
|
145
|
-
de: 'Startseite',
|
|
146
|
-
fr: 'Accueil'
|
|
147
|
-
};
|
|
148
|
-
expect(getLocalizedValue({
|
|
149
|
-
fallbackLocale: [
|
|
150
|
-
'es',
|
|
151
|
-
'de',
|
|
152
|
-
'fr'
|
|
153
|
-
],
|
|
154
|
-
locale: 'pt',
|
|
155
|
-
value
|
|
156
|
-
})).toBe('Startseite');
|
|
157
|
-
});
|
|
158
|
-
it('should skip empty fallback values for text fields', ()=>{
|
|
159
|
-
const value = {
|
|
160
|
-
en: 'Home',
|
|
161
|
-
es: '',
|
|
162
|
-
de: 'Startseite',
|
|
163
|
-
fr: 'Accueil'
|
|
164
|
-
};
|
|
165
|
-
expect(getLocalizedValue({
|
|
166
|
-
fallbackLocale: [
|
|
167
|
-
'es',
|
|
168
|
-
'de',
|
|
169
|
-
'fr'
|
|
170
|
-
],
|
|
171
|
-
fieldType: 'text',
|
|
172
|
-
locale: 'pt',
|
|
173
|
-
value
|
|
174
|
-
})).toBe('Startseite');
|
|
175
|
-
});
|
|
176
|
-
it('should return requested value when no fallback has value', ()=>{
|
|
177
|
-
const value = {
|
|
178
|
-
en: 'Home',
|
|
179
|
-
es: undefined,
|
|
180
|
-
de: undefined,
|
|
181
|
-
fr: undefined
|
|
182
|
-
};
|
|
183
|
-
expect(getLocalizedValue({
|
|
184
|
-
fallbackLocale: [
|
|
185
|
-
'es',
|
|
186
|
-
'de',
|
|
187
|
-
'fr'
|
|
188
|
-
],
|
|
189
|
-
locale: 'pt',
|
|
190
|
-
value
|
|
191
|
-
})).toBeUndefined();
|
|
192
|
-
});
|
|
193
|
-
it('should skip null and undefined fallback values', ()=>{
|
|
194
|
-
const value = {
|
|
195
|
-
en: 'Home',
|
|
196
|
-
es: null,
|
|
197
|
-
de: undefined,
|
|
198
|
-
fr: 'Accueil'
|
|
199
|
-
};
|
|
200
|
-
expect(getLocalizedValue({
|
|
201
|
-
fallbackLocale: [
|
|
202
|
-
'es',
|
|
203
|
-
'de',
|
|
204
|
-
'fr'
|
|
205
|
-
],
|
|
206
|
-
locale: 'pt',
|
|
207
|
-
value
|
|
208
|
-
})).toBe('Accueil');
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
describe('edge cases', ()=>{
|
|
212
|
-
it('should handle fallback that also has no value', ()=>{
|
|
213
|
-
const value = {
|
|
214
|
-
en: undefined,
|
|
215
|
-
es: 'Inicio'
|
|
216
|
-
};
|
|
217
|
-
expect(getLocalizedValue({
|
|
218
|
-
fallbackLocale: 'en',
|
|
219
|
-
locale: 'fr',
|
|
220
|
-
value
|
|
221
|
-
})).toBeUndefined();
|
|
222
|
-
});
|
|
223
|
-
it('should not fallback when value exists and is 0', ()=>{
|
|
224
|
-
const value = {
|
|
225
|
-
en: 10,
|
|
226
|
-
es: 0
|
|
227
|
-
};
|
|
228
|
-
expect(getLocalizedValue({
|
|
229
|
-
fallbackLocale: 'en',
|
|
230
|
-
fieldType: 'number',
|
|
231
|
-
locale: 'es',
|
|
232
|
-
value
|
|
233
|
-
})).toBe(0);
|
|
234
|
-
});
|
|
235
|
-
it('should not fallback when value exists and is false', ()=>{
|
|
236
|
-
const value = {
|
|
237
|
-
en: true,
|
|
238
|
-
es: false
|
|
239
|
-
};
|
|
240
|
-
expect(getLocalizedValue({
|
|
241
|
-
fallbackLocale: 'en',
|
|
242
|
-
fieldType: 'checkbox',
|
|
243
|
-
locale: 'es',
|
|
244
|
-
value
|
|
245
|
-
})).toBe(false);
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
//# sourceMappingURL=getLocalizedValue.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hierarchy/utils/getLocalizedValue.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { getLocalizedValue } from './getLocalizedValue.js'\n\ndescribe('getLocalizedValue', () => {\n describe('non-localized values', () => {\n it('should return non-object values as-is', () => {\n expect(getLocalizedValue({ locale: 'en', value: 'Hello' })).toBe('Hello')\n expect(getLocalizedValue({ locale: 'en', value: 123 })).toBe(123)\n expect(getLocalizedValue({ locale: 'en', value: null })).toBe(null)\n })\n\n it('should return array values as-is', () => {\n const arr = [1, 2, 3]\n\n expect(getLocalizedValue({ locale: 'en', value: arr })).toBe(arr)\n })\n })\n\n describe('localized values without fallback', () => {\n it('should return the requested locale value', () => {\n const value = { en: 'Home', es: 'Inicio', de: 'Startseite' }\n\n expect(getLocalizedValue({ locale: 'en', value })).toBe('Home')\n expect(getLocalizedValue({ locale: 'es', value })).toBe('Inicio')\n expect(getLocalizedValue({ locale: 'de', value })).toBe('Startseite')\n })\n\n it('should return undefined for missing locale', () => {\n const value = { en: 'Home', es: 'Inicio' }\n\n expect(getLocalizedValue({ locale: 'fr', value })).toBeUndefined()\n })\n\n it('should return empty string for text fields', () => {\n const value = { en: 'Home', es: '' }\n\n expect(getLocalizedValue({ locale: 'es', value })).toBe('')\n })\n })\n\n describe('localized values with single fallback', () => {\n it('should use fallback when requested locale is undefined', () => {\n const value = { en: 'Home', es: undefined, de: 'Startseite' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'en',\n locale: 'es',\n value,\n }),\n ).toBe('Home')\n })\n\n it('should use fallback when requested locale is null', () => {\n const value = { en: 'Home', es: null, de: 'Startseite' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'en',\n locale: 'es',\n value,\n }),\n ).toBe('Home')\n })\n\n it('should use fallback for empty string in text fields', () => {\n const value = { en: 'Home', es: '', de: 'Startseite' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'en',\n fieldType: 'text',\n locale: 'es',\n value,\n }),\n ).toBe('Home')\n })\n\n it('should NOT use fallback for empty string in non-text fields', () => {\n const value = { en: 'Home', es: '', de: 'Startseite' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'en',\n fieldType: 'select',\n locale: 'es',\n value,\n }),\n ).toBe('')\n })\n\n it('should return requested value when fallback is disabled', () => {\n const value = { en: 'Home', es: undefined }\n\n expect(\n getLocalizedValue({\n fallbackLocale: false,\n locale: 'es',\n value,\n }),\n ).toBeUndefined()\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'null',\n locale: 'es',\n value,\n }),\n ).toBeUndefined()\n })\n })\n\n describe('localized values with array fallback', () => {\n it('should use first available fallback', () => {\n const value = { en: 'Home', es: undefined, de: 'Startseite', fr: 'Accueil' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: ['es', 'de', 'fr'],\n locale: 'pt',\n value,\n }),\n ).toBe('Startseite')\n })\n\n it('should skip empty fallback values for text fields', () => {\n const value = { en: 'Home', es: '', de: 'Startseite', fr: 'Accueil' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: ['es', 'de', 'fr'],\n fieldType: 'text',\n locale: 'pt',\n value,\n }),\n ).toBe('Startseite')\n })\n\n it('should return requested value when no fallback has value', () => {\n const value = { en: 'Home', es: undefined, de: undefined, fr: undefined }\n\n expect(\n getLocalizedValue({\n fallbackLocale: ['es', 'de', 'fr'],\n locale: 'pt',\n value,\n }),\n ).toBeUndefined()\n })\n\n it('should skip null and undefined fallback values', () => {\n const value = { en: 'Home', es: null, de: undefined, fr: 'Accueil' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: ['es', 'de', 'fr'],\n locale: 'pt',\n value,\n }),\n ).toBe('Accueil')\n })\n })\n\n describe('edge cases', () => {\n it('should handle fallback that also has no value', () => {\n const value = { en: undefined, es: 'Inicio' }\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'en',\n locale: 'fr',\n value,\n }),\n ).toBeUndefined()\n })\n\n it('should not fallback when value exists and is 0', () => {\n const value = { en: 10, es: 0 }\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'en',\n fieldType: 'number',\n locale: 'es',\n value,\n }),\n ).toBe(0)\n })\n\n it('should not fallback when value exists and is false', () => {\n const value = { en: true, es: false }\n\n expect(\n getLocalizedValue({\n fallbackLocale: 'en',\n fieldType: 'checkbox',\n locale: 'es',\n value,\n }),\n ).toBe(false)\n })\n })\n})\n"],"names":["describe","expect","it","getLocalizedValue","locale","value","toBe","arr","en","es","de","toBeUndefined","undefined","fallbackLocale","fieldType","fr"],"mappings":"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"}
|