@sittari/payload-link-field 0.1.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.
Files changed (51) hide show
  1. package/README.md +53 -0
  2. package/dist/admin/LinkField.d.ts +3 -0
  3. package/dist/admin/LinkField.d.ts.map +1 -0
  4. package/dist/admin/LinkField.js +209 -0
  5. package/dist/admin/LinkField.js.map +1 -0
  6. package/dist/admin.css +77 -0
  7. package/dist/exports/client.d.ts +2 -0
  8. package/dist/exports/client.d.ts.map +1 -0
  9. package/dist/exports/client.js +3 -0
  10. package/dist/exports/client.js.map +1 -0
  11. package/dist/exports/types.d.ts +2 -0
  12. package/dist/exports/types.d.ts.map +1 -0
  13. package/dist/exports/types.js +2 -0
  14. package/dist/exports/types.js.map +1 -0
  15. package/dist/hooks/resolveUrl.d.ts +4 -0
  16. package/dist/hooks/resolveUrl.d.ts.map +1 -0
  17. package/dist/hooks/resolveUrl.js +72 -0
  18. package/dist/hooks/resolveUrl.js.map +1 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +4 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/linkField.d.ts +4 -0
  24. package/dist/linkField.d.ts.map +1 -0
  25. package/dist/linkField.js +154 -0
  26. package/dist/linkField.js.map +1 -0
  27. package/dist/plugin.d.ts +4 -0
  28. package/dist/plugin.d.ts.map +1 -0
  29. package/dist/plugin.js +132 -0
  30. package/dist/plugin.js.map +1 -0
  31. package/dist/types.d.ts +52 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +3 -0
  34. package/dist/types.js.map +1 -0
  35. package/dist/utils/getReferenceIdentity.d.ts +11 -0
  36. package/dist/utils/getReferenceIdentity.d.ts.map +1 -0
  37. package/dist/utils/getReferenceIdentity.js +39 -0
  38. package/dist/utils/getReferenceIdentity.js.map +1 -0
  39. package/dist/utils/getReferenceSummary.d.ts +13 -0
  40. package/dist/utils/getReferenceSummary.d.ts.map +1 -0
  41. package/dist/utils/getReferenceSummary.js +86 -0
  42. package/dist/utils/getReferenceSummary.js.map +1 -0
  43. package/dist/utils/traverseFields.d.ts +5 -0
  44. package/dist/utils/traverseFields.d.ts.map +1 -0
  45. package/dist/utils/traverseFields.js +33 -0
  46. package/dist/utils/traverseFields.js.map +1 -0
  47. package/dist/utils/validateUrl.d.ts +3 -0
  48. package/dist/utils/validateUrl.d.ts.map +1 -0
  49. package/dist/utils/validateUrl.js +36 -0
  50. package/dist/utils/validateUrl.js.map +1 -0
  51. package/package.json +69 -0
@@ -0,0 +1,154 @@
1
+ import { LINK_FIELD_ADMIN_COMPONENT, LINK_FIELD_MARKER, } from './types.js';
2
+ import { validateUrl } from './utils/validateUrl.js';
3
+ const SELF_REFERENCE_ERROR = 'A link cannot reference the current document.';
4
+ const getRelationTo = (relationTo) => {
5
+ if (!relationTo) {
6
+ return [];
7
+ }
8
+ return relationTo;
9
+ };
10
+ const isActiveType = (type) => (_, siblingData) => (siblingData?.type ?? 'custom') === type;
11
+ const getReferenceDocumentId = (value) => {
12
+ if (!value || typeof value !== 'object') {
13
+ return value;
14
+ }
15
+ const reference = value;
16
+ if (!('value' in reference) && 'id' in reference) {
17
+ return reference.id;
18
+ }
19
+ if (!reference.value || typeof reference.value !== 'object') {
20
+ return reference.value;
21
+ }
22
+ return reference.value.id;
23
+ };
24
+ const getReferenceRelation = (value, relationTo) => {
25
+ if (value && typeof value === 'object' && 'relationTo' in value) {
26
+ return value.relationTo;
27
+ }
28
+ return typeof relationTo === 'string' ? relationTo : undefined;
29
+ };
30
+ const isSelfReference = ({ collectionSlug, documentId, reference, relationTo, }) => {
31
+ const referenceRelation = getReferenceRelation(reference, relationTo);
32
+ if (!collectionSlug ||
33
+ documentId === undefined ||
34
+ documentId === null ||
35
+ documentId === '' ||
36
+ referenceRelation !== collectionSlug) {
37
+ return false;
38
+ }
39
+ return String(getReferenceDocumentId(reference)) === String(documentId);
40
+ };
41
+ export const linkField = ({ appearance = 'drawer', defaultType = 'custom', label, name, relationTo, required = false, showLabel = true, showNewTab = true, }) => {
42
+ const normalizedRelationTo = getRelationTo(relationTo);
43
+ const customUrlField = {
44
+ name: 'customUrl',
45
+ type: 'text',
46
+ admin: {
47
+ condition: isActiveType('custom'),
48
+ },
49
+ label: 'URL',
50
+ required,
51
+ validate: (value, { siblingData } = {}) => {
52
+ const linkSiblingData = siblingData;
53
+ if (linkSiblingData?.type === 'custom' && required && !value) {
54
+ return 'URL is required.';
55
+ }
56
+ return validateUrl(value);
57
+ },
58
+ };
59
+ const referenceField = {
60
+ name: 'reference',
61
+ type: 'relationship',
62
+ admin: {
63
+ condition: isActiveType('reference'),
64
+ },
65
+ label: 'Document',
66
+ relationTo: normalizedRelationTo,
67
+ required,
68
+ validate: (value, { collectionSlug, id, siblingData } = {}) => {
69
+ const linkSiblingData = siblingData;
70
+ if (linkSiblingData?.type === 'reference' && required && !value) {
71
+ return 'Document reference is required.';
72
+ }
73
+ if (linkSiblingData?.type === 'reference' &&
74
+ isSelfReference({
75
+ collectionSlug,
76
+ documentId: id,
77
+ reference: value,
78
+ relationTo: normalizedRelationTo,
79
+ })) {
80
+ return SELF_REFERENCE_ERROR;
81
+ }
82
+ return true;
83
+ },
84
+ };
85
+ return {
86
+ name,
87
+ type: 'group',
88
+ admin: {
89
+ components: {
90
+ Field: LINK_FIELD_ADMIN_COMPONENT,
91
+ },
92
+ custom: {
93
+ linkField: {
94
+ appearance,
95
+ marker: LINK_FIELD_MARKER,
96
+ showLabel,
97
+ showNewTab,
98
+ },
99
+ },
100
+ },
101
+ fields: [
102
+ {
103
+ name: 'type',
104
+ type: 'radio',
105
+ admin: {
106
+ layout: 'horizontal',
107
+ },
108
+ defaultValue: defaultType,
109
+ options: [
110
+ {
111
+ label: 'Custom URL',
112
+ value: 'custom',
113
+ },
114
+ {
115
+ label: 'Document reference',
116
+ value: 'reference',
117
+ },
118
+ ],
119
+ required: true,
120
+ },
121
+ ...(showLabel
122
+ ? [
123
+ {
124
+ name: 'label',
125
+ type: 'text',
126
+ label: 'Label',
127
+ },
128
+ ]
129
+ : []),
130
+ customUrlField,
131
+ referenceField,
132
+ ...(showNewTab
133
+ ? [
134
+ {
135
+ name: 'newTab',
136
+ type: 'checkbox',
137
+ label: 'Open in new tab',
138
+ },
139
+ ]
140
+ : []),
141
+ {
142
+ name: 'url',
143
+ type: 'text',
144
+ admin: {
145
+ hidden: true,
146
+ },
147
+ hidden: true,
148
+ virtual: true,
149
+ },
150
+ ],
151
+ label,
152
+ };
153
+ };
154
+ //# sourceMappingURL=linkField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkField.js","sourceRoot":"","sources":["../src/linkField.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from 'payload';
2
+ import { type LinkFieldPluginConfig } from './types.js';
3
+ export declare const linkFieldPlugin: (pluginConfig: LinkFieldPluginConfig) => Plugin;
4
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,MAAM,EAAgC,MAAM,SAAS,CAAA;AAG9F,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAA;AAiKnB,eAAO,MAAM,eAAe,GACzB,cAAc,qBAAqB,KAAG,MAqCpC,CAAA"}
package/dist/plugin.js ADDED
@@ -0,0 +1,132 @@
1
+ import { createResolveUrlHook } from './hooks/resolveUrl.js';
2
+ import { LINK_FIELD_MARKER, } from './types.js';
3
+ import { traverseFields } from './utils/traverseFields.js';
4
+ const isGeneratedLinkField = (field) => {
5
+ if (field.type !== 'group') {
6
+ return false;
7
+ }
8
+ const custom = field.admin?.custom;
9
+ return custom?.linkField?.marker === LINK_FIELD_MARKER;
10
+ };
11
+ const isReferenceField = (field) => 'name' in field && field.name === 'reference' && field.type === 'relationship';
12
+ const isUrlField = (field) => 'name' in field && field.name === 'url' && field.type === 'text';
13
+ const hasEmptyRelationTo = (field) => Array.isArray(field.relationTo) && field.relationTo.length === 0;
14
+ const getStringValue = (value) => typeof value === 'string' && value ? value : undefined;
15
+ const getCollectionLabel = (collection) => getStringValue(collection.labels?.singular) ??
16
+ collection.slug;
17
+ const getCollectionUseAsTitle = (collection) => {
18
+ const adminUseAsTitle = getStringValue(collection.admin?.useAsTitle);
19
+ if (adminUseAsTitle) {
20
+ return adminUseAsTitle;
21
+ }
22
+ return getStringValue(collection.useAsSlug);
23
+ };
24
+ const getReferenceSummaryCollections = (collections) => Object.fromEntries((collections ?? []).map((collection) => [
25
+ collection.slug,
26
+ {
27
+ label: getCollectionLabel(collection),
28
+ useAsTitle: getCollectionUseAsTitle(collection),
29
+ },
30
+ ]));
31
+ const getApiRoute = (config) => getStringValue(config.routes?.api) ?? '/api';
32
+ const withSelfReferenceFilter = (existingFilterOptions, ownerCollectionSlug) => {
33
+ if (!ownerCollectionSlug) {
34
+ return existingFilterOptions;
35
+ }
36
+ return async (args) => {
37
+ const hasDocumentId = args.id !== undefined && args.id !== null && args.id !== '';
38
+ const selfFilter = hasDocumentId && args.relationTo === ownerCollectionSlug
39
+ ? {
40
+ id: {
41
+ not_equals: args.id,
42
+ },
43
+ }
44
+ : true;
45
+ if (!existingFilterOptions) {
46
+ return selfFilter;
47
+ }
48
+ const existingFilter = typeof existingFilterOptions === 'function'
49
+ ? await existingFilterOptions(args)
50
+ : existingFilterOptions;
51
+ if (selfFilter === true) {
52
+ return existingFilter;
53
+ }
54
+ if (existingFilter === true) {
55
+ return selfFilter;
56
+ }
57
+ if (!existingFilter) {
58
+ return existingFilter;
59
+ }
60
+ return {
61
+ and: [existingFilter, selfFilter],
62
+ };
63
+ };
64
+ };
65
+ const transformLinkField = ({ allCollectionSlugs, apiRoute, collectionSummaries, field, ownerCollectionSlug, pluginConfig, }) => ({
66
+ ...field,
67
+ admin: {
68
+ ...field.admin,
69
+ custom: {
70
+ ...field.admin?.custom,
71
+ linkField: {
72
+ ...(field.admin?.custom?.linkField ?? {}),
73
+ apiRoute,
74
+ collections: collectionSummaries,
75
+ },
76
+ },
77
+ },
78
+ fields: field.fields.map((childField) => {
79
+ if (isReferenceField(childField)) {
80
+ return {
81
+ ...childField,
82
+ filterOptions: withSelfReferenceFilter(childField.filterOptions, ownerCollectionSlug),
83
+ relationTo: hasEmptyRelationTo(childField) ? allCollectionSlugs : childField.relationTo,
84
+ };
85
+ }
86
+ if (isUrlField(childField)) {
87
+ return {
88
+ ...childField,
89
+ hooks: {
90
+ ...childField.hooks,
91
+ afterRead: [
92
+ ...(childField.hooks?.afterRead ?? []),
93
+ createResolveUrlHook(pluginConfig.resolveDocumentUrl),
94
+ ],
95
+ },
96
+ virtual: true,
97
+ };
98
+ }
99
+ return childField;
100
+ }),
101
+ });
102
+ export const linkFieldPlugin = (pluginConfig) => (incomingConfig) => {
103
+ const allCollectionSlugs = (incomingConfig.collections ?? []).map((collection) => collection.slug);
104
+ const apiRoute = getApiRoute(incomingConfig);
105
+ const collectionSummaries = getReferenceSummaryCollections(incomingConfig.collections);
106
+ const createTransformField = (ownerCollectionSlug) => (field) => {
107
+ if (!isGeneratedLinkField(field)) {
108
+ return field;
109
+ }
110
+ return transformLinkField({
111
+ allCollectionSlugs,
112
+ apiRoute,
113
+ collectionSummaries,
114
+ field,
115
+ ownerCollectionSlug,
116
+ pluginConfig,
117
+ });
118
+ };
119
+ const finalConfig = {
120
+ ...incomingConfig,
121
+ collections: incomingConfig.collections?.map((collection) => ({
122
+ ...collection,
123
+ fields: traverseFields(collection.fields, createTransformField(collection.slug)) ?? [],
124
+ })),
125
+ globals: incomingConfig.globals?.map((global) => ({
126
+ ...global,
127
+ fields: traverseFields(global.fields, createTransformField()) ?? [],
128
+ })),
129
+ };
130
+ return finalConfig;
131
+ };
132
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { CollectionSlug, DefaultDocumentIDType, FieldHookArgs, GroupField, Payload, PayloadRequest } from 'payload';
2
+ import type { ReferenceSummaryCollections } from './utils/getReferenceSummary.js';
3
+ export type LinkFieldAppearance = 'drawer' | 'inline';
4
+ export type LinkFieldType = 'custom' | 'reference';
5
+ export type LinkFieldConfig = {
6
+ appearance?: LinkFieldAppearance;
7
+ defaultType?: LinkFieldType;
8
+ label?: GroupField['label'];
9
+ name: string;
10
+ relationTo?: CollectionSlug | CollectionSlug[];
11
+ required?: boolean;
12
+ showLabel?: boolean;
13
+ showNewTab?: boolean;
14
+ };
15
+ export type LinkFieldPluginConfig = {
16
+ resolveDocumentUrl: ResolveDocumentUrl;
17
+ };
18
+ export type LinkFieldValue = {
19
+ customUrl?: string;
20
+ label?: string;
21
+ newTab?: boolean;
22
+ reference?: unknown;
23
+ type?: LinkFieldType;
24
+ url?: null | string;
25
+ };
26
+ export type ResolveDocumentUrlArgs = {
27
+ collectionSlug: string;
28
+ document: null | Record<string, unknown>;
29
+ documentId: DefaultDocumentIDType;
30
+ fallbackLocale?: false | null | string | string[];
31
+ fieldPath: string;
32
+ locale?: null | string;
33
+ originalDoc?: unknown;
34
+ payload: Payload;
35
+ req: PayloadRequest;
36
+ siblingData: Partial<LinkFieldValue>;
37
+ };
38
+ export type ResolveDocumentUrl = (args: ResolveDocumentUrlArgs) => null | Promise<null | string> | string;
39
+ export type LinkFieldAdminCustom = {
40
+ linkField?: {
41
+ appearance: LinkFieldAppearance;
42
+ apiRoute?: string;
43
+ collections?: ReferenceSummaryCollections;
44
+ marker: typeof LINK_FIELD_MARKER;
45
+ showLabel: boolean;
46
+ showNewTab: boolean;
47
+ };
48
+ };
49
+ export type ResolveUrlHookArgs = FieldHookArgs<any, null | string, LinkFieldValue>;
50
+ export declare const LINK_FIELD_MARKER = "@sittari/payload-link-field";
51
+ export declare const LINK_FIELD_ADMIN_COMPONENT = "@sittari/payload-link-field/client#LinkField";
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,OAAO,EACP,cAAc,EACf,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAA;AAEjF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAErD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAA;AAElD,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,mBAAmB,CAAA;IAChC,WAAW,CAAC,EAAE,aAAa,CAAA;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE,CAAA;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,kBAAkB,EAAE,kBAAkB,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,UAAU,EAAE,qBAAqB,CAAA;IACjC,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;IACjD,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,sBAAsB,KACzB,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,MAAM,CAAA;AAE3C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE;QACV,UAAU,EAAE,mBAAmB,CAAA;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,2BAA2B,CAAA;QACzC,MAAM,EAAE,OAAO,iBAAiB,CAAA;QAChC,SAAS,EAAE,OAAO,CAAA;QAClB,UAAU,EAAE,OAAO,CAAA;KACpB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAC5C,GAAG,EACH,IAAI,GAAG,MAAM,EACb,cAAc,CACf,CAAA;AAED,eAAO,MAAM,iBAAiB,gCAAgC,CAAA;AAE9D,eAAO,MAAM,0BAA0B,iDACS,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ export const LINK_FIELD_MARKER = '@sittari/payload-link-field';
2
+ export const LINK_FIELD_ADMIN_COMPONENT = '@sittari/payload-link-field/client#LinkField';
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,6BAA6B,CAAA;AAE9D,MAAM,CAAC,MAAM,0BAA0B,GACrC,8CAA8C,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { DefaultDocumentIDType } from 'payload';
2
+ export type ReferenceIdentity = {
3
+ collectionSlug: string;
4
+ document: null | Record<string, unknown>;
5
+ documentId: DefaultDocumentIDType;
6
+ };
7
+ export declare const getReferenceIdentity: ({ reference, relationTo, }: {
8
+ reference: unknown;
9
+ relationTo?: string | string[];
10
+ }) => null | ReferenceIdentity;
11
+ //# sourceMappingURL=getReferenceIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getReferenceIdentity.d.ts","sourceRoot":"","sources":["../../src/utils/getReferenceIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAEpD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,UAAU,EAAE,qBAAqB,CAAA;CAClC,CAAA;AA0BD,eAAO,MAAM,oBAAoB,GAAI,4BAGlC;IACD,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC/B,KAAG,IAAI,GAAG,iBA+BV,CAAA"}
@@ -0,0 +1,39 @@
1
+ const isRecord = (value) => typeof value === 'object' && value !== null;
2
+ const getDocumentId = (value) => {
3
+ if (typeof value === 'string' || typeof value === 'number') {
4
+ return value;
5
+ }
6
+ if (isRecord(value)) {
7
+ const id = value.id;
8
+ if (typeof id === 'string' || typeof id === 'number') {
9
+ return id;
10
+ }
11
+ }
12
+ return undefined;
13
+ };
14
+ export const getReferenceIdentity = ({ reference, relationTo, }) => {
15
+ if (!reference) {
16
+ return null;
17
+ }
18
+ const isPolymorphicValue = isRecord(reference) && 'relationTo' in reference && 'value' in reference;
19
+ const relationshipValue = reference;
20
+ const collectionSlug = isPolymorphicValue
21
+ ? relationshipValue.relationTo
22
+ : typeof relationTo === 'string'
23
+ ? relationTo
24
+ : undefined;
25
+ if (typeof collectionSlug !== 'string') {
26
+ return null;
27
+ }
28
+ const value = isPolymorphicValue ? relationshipValue.value : reference;
29
+ const documentId = getDocumentId(value);
30
+ if (documentId === undefined) {
31
+ return null;
32
+ }
33
+ return {
34
+ collectionSlug,
35
+ document: isRecord(value) ? value : null,
36
+ documentId,
37
+ };
38
+ };
39
+ //# sourceMappingURL=getReferenceIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getReferenceIdentity.js","sourceRoot":"","sources":["../../src/utils/getReferenceIdentity.ts"],"names":[],"mappings":"AAaA,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAA;AAE7C,MAAM,aAAa,GAAG,CAAC,KAAc,EAAqC,EAAE;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;QAEnB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EACnC,SAAS,EACT,UAAU,GAIX,EAA4B,EAAE;IAC7B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,kBAAkB,GACtB,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,CAAA;IAE1E,MAAM,iBAAiB,GAAG,SAA8B,CAAA;IACxD,MAAM,cAAc,GAAG,kBAAkB;QACvC,CAAC,CAAC,iBAAiB,CAAC,UAAU;QAC9B,CAAC,CAAC,OAAO,UAAU,KAAK,QAAQ;YAC9B,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,SAAS,CAAA;IAEf,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACtE,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IAEvC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,cAAc;QACd,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACxC,UAAU;KACX,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { CollectionSlug } from 'payload';
2
+ export type ReferenceCollectionSummary = {
3
+ label: string;
4
+ useAsTitle?: string;
5
+ };
6
+ export type ReferenceSummaryCollections = Partial<Record<CollectionSlug | string, ReferenceCollectionSummary>>;
7
+ export declare const getReferenceSummary: ({ collections, reference, relationTo, resolvedDocument, }: {
8
+ collections?: ReferenceSummaryCollections;
9
+ reference: unknown;
10
+ relationTo?: string | string[];
11
+ resolvedDocument?: null | Record<string, unknown>;
12
+ }) => string;
13
+ //# sourceMappingURL=getReferenceSummary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getReferenceSummary.d.ts","sourceRoot":"","sources":["../../src/utils/getReferenceSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,SAAS,CAAA;AAIpE,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG,OAAO,CAC/C,MAAM,CAAC,cAAc,GAAG,MAAM,EAAE,0BAA0B,CAAC,CAC5D,CAAA;AAkFD,eAAO,MAAM,mBAAmB,GAAI,2DAKjC;IACD,WAAW,CAAC,EAAE,2BAA2B,CAAA;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC9B,gBAAgB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClD,KAAG,MAgDH,CAAA"}
@@ -0,0 +1,86 @@
1
+ import { getReferenceIdentity } from './getReferenceIdentity.js';
2
+ const isRecord = (value) => typeof value === 'object' && value !== null;
3
+ const stringifyPrimitive = (value) => {
4
+ if (typeof value === 'string' && value.trim()) {
5
+ return value;
6
+ }
7
+ if (typeof value === 'number') {
8
+ return String(value);
9
+ }
10
+ return undefined;
11
+ };
12
+ const getValueByPath = (document, path) => path.split('.').reduce((currentValue, pathPart) => {
13
+ if (!isRecord(currentValue)) {
14
+ return undefined;
15
+ }
16
+ return currentValue[pathPart];
17
+ }, document);
18
+ const getDisplayValue = (value) => {
19
+ const primitiveValue = stringifyPrimitive(value);
20
+ if (primitiveValue) {
21
+ return primitiveValue;
22
+ }
23
+ if (isRecord(value)) {
24
+ for (const nestedValue of Object.values(value)) {
25
+ const nestedPrimitiveValue = stringifyPrimitive(nestedValue);
26
+ if (nestedPrimitiveValue) {
27
+ return nestedPrimitiveValue;
28
+ }
29
+ }
30
+ }
31
+ return undefined;
32
+ };
33
+ const getDocumentTitle = ({ document, useAsTitle, }) => {
34
+ const titleFields = [useAsTitle, 'title', 'name', 'slug', 'id'].filter((field) => Boolean(field));
35
+ for (const titleField of titleFields) {
36
+ const displayValue = getDisplayValue(getValueByPath(document, titleField));
37
+ if (displayValue) {
38
+ return displayValue;
39
+ }
40
+ }
41
+ return undefined;
42
+ };
43
+ const formatReferenceSummary = ({ collectionLabel, fallbackTitle, title, }) => {
44
+ const documentTitle = title || String(fallbackTitle);
45
+ return collectionLabel ? `${collectionLabel}: ${documentTitle}` : documentTitle;
46
+ };
47
+ export const getReferenceSummary = ({ collections, reference, relationTo, resolvedDocument, }) => {
48
+ if (!reference) {
49
+ return 'No document selected';
50
+ }
51
+ const identity = getReferenceIdentity({
52
+ reference,
53
+ relationTo,
54
+ });
55
+ if (identity) {
56
+ const collectionSummary = collections?.[identity.collectionSlug];
57
+ const document = resolvedDocument ?? identity.document;
58
+ const title = document
59
+ ? getDocumentTitle({
60
+ document,
61
+ useAsTitle: collectionSummary?.useAsTitle,
62
+ })
63
+ : undefined;
64
+ return formatReferenceSummary({
65
+ collectionLabel: collectionSummary?.label ?? identity.collectionSlug,
66
+ fallbackTitle: identity.documentId,
67
+ title,
68
+ });
69
+ }
70
+ if (typeof reference === 'string' || typeof reference === 'number') {
71
+ return String(reference);
72
+ }
73
+ if (isRecord(reference)) {
74
+ const value = 'value' in reference ? reference.value : reference;
75
+ if (typeof value === 'string' || typeof value === 'number') {
76
+ return String(value);
77
+ }
78
+ if (isRecord(value)) {
79
+ return (getDocumentTitle({
80
+ document: value,
81
+ }) ?? 'Selected document');
82
+ }
83
+ }
84
+ return 'Selected document';
85
+ };
86
+ //# sourceMappingURL=getReferenceSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getReferenceSummary.js","sourceRoot":"","sources":["../../src/utils/getReferenceSummary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Field } from 'payload';
2
+ export type FieldTransformer = (field: Field) => Field;
3
+ export declare const traverseField: (field: Field, transformer: FieldTransformer) => Field;
4
+ export declare const traverseFields: (fields: Field[] | undefined, transformer: FieldTransformer) => Field[] | undefined;
5
+ //# sourceMappingURL=traverseFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utils/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,KAAK,EAAO,MAAM,SAAS,CAAA;AAEhD,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAA;AAetD,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,EAAE,aAAa,gBAAgB,KAAG,KA2B3E,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,QAAQ,KAAK,EAAE,GAAG,SAAS,EAC3B,aAAa,gBAAgB,KAC5B,KAAK,EAAE,GAAG,SAAsE,CAAA"}
@@ -0,0 +1,33 @@
1
+ const hasFields = (field) => 'fields' in field && Array.isArray(field.fields);
2
+ const transformTab = (tab, transformer) => ({
3
+ ...tab,
4
+ fields: tab.fields.map((field) => traverseField(field, transformer)),
5
+ });
6
+ const transformBlock = (block, transformer) => ({
7
+ ...block,
8
+ fields: block.fields.map((field) => traverseField(field, transformer)),
9
+ });
10
+ export const traverseField = (field, transformer) => {
11
+ let nextField = field;
12
+ if (hasFields(nextField)) {
13
+ nextField = {
14
+ ...nextField,
15
+ fields: nextField.fields.map((childField) => traverseField(childField, transformer)),
16
+ };
17
+ }
18
+ if (nextField.type === 'tabs') {
19
+ nextField = {
20
+ ...nextField,
21
+ tabs: nextField.tabs.map((tab) => transformTab(tab, transformer)),
22
+ };
23
+ }
24
+ if (nextField.type === 'blocks') {
25
+ nextField = {
26
+ ...nextField,
27
+ blocks: nextField.blocks.map((block) => typeof block === 'string' ? block : transformBlock(block, transformer)),
28
+ };
29
+ }
30
+ return transformer(nextField);
31
+ };
32
+ export const traverseFields = (fields, transformer) => fields?.map((field) => traverseField(field, transformer));
33
+ //# sourceMappingURL=traverseFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverseFields.js","sourceRoot":"","sources":["../../src/utils/traverseFields.ts"],"names":[],"mappings":"AAIA,MAAM,SAAS,GAAG,CAAC,KAAY,EAAwC,EAAE,CACvE,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;AAElD,MAAM,YAAY,GAAG,CAAC,GAAQ,EAAE,WAA6B,EAAO,EAAE,CAAC,CAAC;IACtE,GAAG,GAAG;IACN,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;CACrE,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,KAAY,EAAE,WAA6B,EAAS,EAAE,CAAC,CAAC;IAC9E,GAAG,KAAK;IACR,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;CACvE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAY,EAAE,WAA6B,EAAS,EAAE;IAClF,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACzB,SAAS,GAAG;YACV,GAAG,SAAS;YACZ,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;SAC5E,CAAA;IACZ,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,SAAS,GAAG;YACV,GAAG,SAAS;YACZ,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;SAClE,CAAA;IACH,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChC,SAAS,GAAG;YACV,GAAG,SAAS;YACZ,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACrC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CACvE;SACF,CAAA;IACH,CAAC;IAED,OAAO,WAAW,CAAC,SAAS,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,MAA2B,EAC3B,WAA6B,EACR,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const validateUrl: (value: null | string | undefined) => true | string;
2
+ export declare const isValidUrl: (value: null | string | undefined) => boolean;
3
+ //# sourceMappingURL=validateUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUrl.d.ts","sourceRoot":"","sources":["../../src/utils/validateUrl.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,GAAI,OAAO,IAAI,GAAG,MAAM,GAAG,SAAS,KAAG,IAAI,GAAG,MAwCrE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,IAAI,GAAG,MAAM,GAAG,SAAS,KAAG,OACjC,CAAA"}
@@ -0,0 +1,36 @@
1
+ const UNSAFE_SCHEME_PATTERN = /^[a-z][a-z0-9+.-]*:/i;
2
+ export const validateUrl = (value) => {
3
+ if (!value) {
4
+ return true;
5
+ }
6
+ const trimmed = value.trim();
7
+ if (!trimmed) {
8
+ return true;
9
+ }
10
+ if (trimmed.startsWith('//')) {
11
+ return 'Protocol-relative URLs are not allowed.';
12
+ }
13
+ if (trimmed.startsWith('#')) {
14
+ return true;
15
+ }
16
+ if (trimmed.startsWith('/') || trimmed.startsWith('./') || trimmed.startsWith('../')) {
17
+ return true;
18
+ }
19
+ if (trimmed.startsWith('?')) {
20
+ return true;
21
+ }
22
+ if (UNSAFE_SCHEME_PATTERN.test(trimmed)) {
23
+ try {
24
+ const url = new URL(trimmed);
25
+ return url.protocol === 'http:' || url.protocol === 'https:'
26
+ ? true
27
+ : 'Only http and https URLs are allowed.';
28
+ }
29
+ catch {
30
+ return 'Enter a valid URL.';
31
+ }
32
+ }
33
+ return true;
34
+ };
35
+ export const isValidUrl = (value) => validateUrl(value) === true;
36
+ //# sourceMappingURL=validateUrl.js.map