@sittari/payload-templates 0.2.0 → 0.3.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/README.md +55 -3
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +54 -3
- package/dist/plugin.js.map +1 -1
- package/dist/templateField.d.ts +6 -0
- package/dist/templateField.d.ts.map +1 -0
- package/dist/templateField.js +27 -0
- package/dist/templateField.js.map +1 -0
- package/dist/templateFieldFields.d.ts +4 -0
- package/dist/templateFieldFields.d.ts.map +1 -0
- package/dist/templateFieldFields.js +133 -0
- package/dist/templateFieldFields.js.map +1 -0
- package/dist/templateFieldHook.d.ts +7 -0
- package/dist/templateFieldHook.d.ts.map +1 -0
- package/dist/templateFieldHook.js +135 -0
- package/dist/templateFieldHook.js.map +1 -0
- package/dist/traverseFields.d.ts +7 -0
- package/dist/traverseFields.d.ts.map +1 -0
- package/dist/traverseFields.js +59 -0
- package/dist/traverseFields.js.map +1 -0
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,11 +11,21 @@ pnpm add @sittari/payload-templates
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
import { templatesPlugin } from '@sittari/payload-templates'
|
|
14
|
+
import { templateField, templatesPlugin } from '@sittari/payload-templates'
|
|
15
15
|
import { buildConfig } from 'payload'
|
|
16
16
|
|
|
17
17
|
export default buildConfig({
|
|
18
|
-
collections: [
|
|
18
|
+
collections: [
|
|
19
|
+
{
|
|
20
|
+
slug: 'pages',
|
|
21
|
+
fields: [
|
|
22
|
+
templateField({
|
|
23
|
+
name: 'notFoundContent',
|
|
24
|
+
template: '404',
|
|
25
|
+
}),
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
],
|
|
19
29
|
plugins: [
|
|
20
30
|
templatesPlugin({
|
|
21
31
|
templates: [
|
|
@@ -38,6 +48,46 @@ export default buildConfig({
|
|
|
38
48
|
|
|
39
49
|
The generated document stores editable fields under `data_<name>`—for example, `data_404.heading`. The `title` and `templateType` fields are managed by the plugin and hidden from the admin form.
|
|
40
50
|
|
|
51
|
+
## Template-backed fields
|
|
52
|
+
|
|
53
|
+
`templateField({ name, template })` inserts a registered template's fields as a
|
|
54
|
+
group anywhere Payload fields are accepted, including collections, globals,
|
|
55
|
+
tabs, arrays, and blocks. The plugin throws during configuration when the
|
|
56
|
+
referenced template is not registered.
|
|
57
|
+
|
|
58
|
+
Fields copied into the consuming group are optional, even when the managed
|
|
59
|
+
template requires them. On read, empty local values inherit from the managed
|
|
60
|
+
template:
|
|
61
|
+
|
|
62
|
+
- `undefined`, `null`, `''`, empty arrays, and empty plain objects inherit.
|
|
63
|
+
- `false`, `0`, and whitespace-only strings remain explicit local values.
|
|
64
|
+
- Nested groups and tabs inherit field by field.
|
|
65
|
+
- Arrays and blocks inherit as a whole only when empty. A non-empty local list
|
|
66
|
+
is treated as the complete override.
|
|
67
|
+
|
|
68
|
+
Inheritance is read-time only. Fallback values are not written into the
|
|
69
|
+
consuming document, so later edits to the managed template are reflected on the
|
|
70
|
+
next API read. Admin edit forms receive the raw stored overrides, so an empty
|
|
71
|
+
field remains empty instead of looking like a persisted template value. The
|
|
72
|
+
Admin API inspector still displays resolved values.
|
|
73
|
+
|
|
74
|
+
You can explicitly control resolution for Local API operations through Payload
|
|
75
|
+
request context:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
await payload.findByID({
|
|
79
|
+
collection: 'pages',
|
|
80
|
+
id,
|
|
81
|
+
context: {
|
|
82
|
+
templateFields: 'raw', // or 'resolved'
|
|
83
|
+
},
|
|
84
|
+
})
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
An explicit context mode takes precedence over automatic Admin request
|
|
88
|
+
detection. Template-backed fields cannot be nested inside a template
|
|
89
|
+
definition.
|
|
90
|
+
|
|
41
91
|
## Configuration
|
|
42
92
|
|
|
43
93
|
| Option | Type | Default | Description |
|
|
@@ -58,7 +108,9 @@ On Payload initialization, the plugin creates missing documents, updates labels,
|
|
|
58
108
|
|
|
59
109
|
Collection access prevents normal admin, REST, GraphQL, and access-controlled Local API users from creating or deleting template documents. The identity fields also deny user changes. As with every Payload collection, trusted Local API calls using the default `overrideAccess: true` bypass access control.
|
|
60
110
|
|
|
61
|
-
The package exports `TemplateConfig
|
|
111
|
+
The package exports `TemplateConfig`, `TemplateFieldConfig`, and
|
|
112
|
+
`TemplatesPluginConfig` from both the package root and
|
|
113
|
+
`@sittari/payload-templates/types`.
|
|
62
114
|
|
|
63
115
|
## Fetching a typed template
|
|
64
116
|
|
package/dist/exports/types.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export type { GetPayload, TemplateDocumentFor, TemplateName } from '../getTemplate.js';
|
|
2
|
-
export type { TemplateConfig, TemplatesPluginConfig } from '../types.js';
|
|
2
|
+
export type { TemplateConfig, TemplateFieldConfig, TemplatesPluginConfig, } from '../types.js';
|
|
3
3
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACtF,YAAY,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACtF,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,aAAa,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { createTemplateGetter } from './getTemplate.js';
|
|
2
|
+
export { templateField } from './templateField.js';
|
|
2
3
|
export { templatesPlugin } from './plugin.js';
|
|
3
4
|
export type { GetPayload, TemplateDocumentFor, TemplateName, } from './getTemplate.js';
|
|
4
|
-
export type { TemplateConfig, TemplatesPluginConfig } from './types.js';
|
|
5
|
+
export type { TemplateConfig, TemplateFieldConfig, TemplatesPluginConfig, } from './types.js';
|
|
5
6
|
export { templatesPlugin as default } from './plugin.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,GACb,MAAM,kBAAkB,CAAA;AACzB,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,GACb,MAAM,kBAAkB,CAAA;AACzB,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAY7C,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,MAAM,EACP,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAkB,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAwOvE,eAAO,MAAM,eAAe,GACzB,cAAc,qBAAqB,KAAG,MAuCtC,CAAA;AAEH,eAAe,eAAe,CAAA"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { getTemplateFieldName } from './templateField.js';
|
|
2
|
+
import { makeFieldsOptional } from './templateFieldFields.js';
|
|
3
|
+
import { createTemplateFallbackHook } from './templateFieldHook.js';
|
|
4
|
+
import { fieldsContain, transformBlock, transformFields } from './traverseFields.js';
|
|
1
5
|
const COLLECTION_SLUG = 'templates';
|
|
2
6
|
const DATA_FIELD_PREFIX = 'data_';
|
|
3
7
|
const VALID_TEMPLATE_NAME = /^[A-Za-z0-9_]+$/;
|
|
@@ -8,7 +12,7 @@ const extendOnInit = (incomingConfig, onInit) => async (payload) => {
|
|
|
8
12
|
}
|
|
9
13
|
await onInit(payload);
|
|
10
14
|
};
|
|
11
|
-
const validateTemplates = (templates) => {
|
|
15
|
+
const validateTemplates = (templates, reusableBlocks) => {
|
|
12
16
|
const names = new Set();
|
|
13
17
|
const generatedFieldNames = new Set(['title', 'templateType']);
|
|
14
18
|
for (const template of templates) {
|
|
@@ -24,8 +28,44 @@ const validateTemplates = (templates) => {
|
|
|
24
28
|
}
|
|
25
29
|
names.add(template.name);
|
|
26
30
|
generatedFieldNames.add(fieldName);
|
|
31
|
+
const fieldsWithReusableBlocks = makeFieldsOptional(template.fields, reusableBlocks);
|
|
32
|
+
if (fieldsContain(fieldsWithReusableBlocks, (field) => getTemplateFieldName(field) !== undefined)) {
|
|
33
|
+
throw new Error(`[templatesPlugin] templateField cannot be used inside template "${template.name}" definitions.`);
|
|
34
|
+
}
|
|
27
35
|
}
|
|
28
36
|
};
|
|
37
|
+
const createTemplateFieldTransformer = (templates, reusableBlocks) => {
|
|
38
|
+
const templatesByName = new Map(templates.map((template) => [template.name, template]));
|
|
39
|
+
return (field) => {
|
|
40
|
+
const templateName = getTemplateFieldName(field);
|
|
41
|
+
if (templateName === undefined) {
|
|
42
|
+
return field;
|
|
43
|
+
}
|
|
44
|
+
const template = templatesByName.get(templateName);
|
|
45
|
+
if (!template) {
|
|
46
|
+
const fieldName = 'name' in field ? field.name : '(unnamed)';
|
|
47
|
+
throw new Error(`[templatesPlugin] Unknown template "${templateName}" referenced by field "${fieldName}".`);
|
|
48
|
+
}
|
|
49
|
+
const groupField = field;
|
|
50
|
+
const fields = makeFieldsOptional(template.fields, reusableBlocks);
|
|
51
|
+
const localized = fieldsContain(fields, (templateField) => 'localized' in templateField && templateField.localized === true);
|
|
52
|
+
return {
|
|
53
|
+
...groupField,
|
|
54
|
+
fields,
|
|
55
|
+
hooks: {
|
|
56
|
+
...groupField.hooks,
|
|
57
|
+
afterRead: [
|
|
58
|
+
...(groupField.hooks?.afterRead ?? []),
|
|
59
|
+
createTemplateFallbackHook({
|
|
60
|
+
fields,
|
|
61
|
+
localized,
|
|
62
|
+
template: templateName,
|
|
63
|
+
}),
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
};
|
|
29
69
|
const createTemplateFields = (templates) => [
|
|
30
70
|
{
|
|
31
71
|
name: 'title',
|
|
@@ -132,16 +172,27 @@ export const templatesPlugin = (pluginConfig) => (incomingConfig) => {
|
|
|
132
172
|
if (pluginConfig.enabled === false) {
|
|
133
173
|
return incomingConfig;
|
|
134
174
|
}
|
|
135
|
-
validateTemplates(pluginConfig.templates);
|
|
175
|
+
validateTemplates(pluginConfig.templates, incomingConfig.blocks ?? []);
|
|
136
176
|
if (incomingConfig.collections?.some(({ slug }) => slug === COLLECTION_SLUG)) {
|
|
137
177
|
throw new Error(`[templatesPlugin] A collection with slug "${COLLECTION_SLUG}" already exists.`);
|
|
138
178
|
}
|
|
179
|
+
const transformTemplateField = createTemplateFieldTransformer(pluginConfig.templates, incomingConfig.blocks ?? []);
|
|
180
|
+
const collections = (incomingConfig.collections ?? []).map((collection) => {
|
|
181
|
+
const fields = transformFields(collection.fields, transformTemplateField);
|
|
182
|
+
return fields === collection.fields ? collection : { ...collection, fields };
|
|
183
|
+
});
|
|
184
|
+
const globals = incomingConfig.globals?.map((global) => {
|
|
185
|
+
const fields = transformFields(global.fields, transformTemplateField);
|
|
186
|
+
return fields === global.fields ? global : { ...global, fields };
|
|
187
|
+
});
|
|
139
188
|
return {
|
|
140
189
|
...incomingConfig,
|
|
141
190
|
collections: [
|
|
142
|
-
...
|
|
191
|
+
...collections,
|
|
143
192
|
createTemplatesCollection(pluginConfig.templates),
|
|
144
193
|
],
|
|
194
|
+
globals,
|
|
195
|
+
blocks: incomingConfig.blocks?.map((block) => transformBlock(block, transformTemplateField)),
|
|
145
196
|
onInit: extendOnInit(incomingConfig, (payload) => reconcileTemplates(payload, pluginConfig.templates)),
|
|
146
197
|
};
|
|
147
198
|
};
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Field, GroupField } from 'payload';
|
|
2
|
+
import type { TemplateFieldConfig } from './types.js';
|
|
3
|
+
export declare const TEMPLATE_FIELD_MARKER = "@sittari/payload-templates/template-field";
|
|
4
|
+
export declare const getTemplateFieldName: (field: Field) => string | undefined;
|
|
5
|
+
export declare const templateField: (props: TemplateFieldConfig) => GroupField;
|
|
6
|
+
//# sourceMappingURL=templateField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateField.d.ts","sourceRoot":"","sources":["../src/templateField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAErD,eAAO,MAAM,qBAAqB,8CAA8C,CAAA;AAShF,eAAO,MAAM,oBAAoB,GAAI,OAAO,KAAK,KAAG,MAAM,GAAG,SAW5D,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,OAAO,mBAAmB,KAAG,UAc1D,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const TEMPLATE_FIELD_MARKER = '@sittari/payload-templates/template-field';
|
|
2
|
+
export const getTemplateFieldName = (field) => {
|
|
3
|
+
if (field.type !== 'group') {
|
|
4
|
+
return undefined;
|
|
5
|
+
}
|
|
6
|
+
const templateField = field.custom?.templateField;
|
|
7
|
+
return templateField?.marker === TEMPLATE_FIELD_MARKER &&
|
|
8
|
+
typeof templateField.template === 'string'
|
|
9
|
+
? templateField.template
|
|
10
|
+
: undefined;
|
|
11
|
+
};
|
|
12
|
+
export const templateField = (props) => {
|
|
13
|
+
const { name, template, ...rest } = props;
|
|
14
|
+
return ({
|
|
15
|
+
...rest,
|
|
16
|
+
name,
|
|
17
|
+
type: 'group',
|
|
18
|
+
custom: {
|
|
19
|
+
templateField: {
|
|
20
|
+
marker: TEMPLATE_FIELD_MARKER,
|
|
21
|
+
template,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
fields: [],
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=templateField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateField.js","sourceRoot":"","sources":["../src/templateField.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,qBAAqB,GAAG,2CAA2C,CAAA;AAShF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAY,EAAsB,EAAE;IACvE,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,aAAa,GAAI,KAAK,CAAC,MAA0C,EAAE,aAAa,CAAA;IAEtF,OAAO,aAAa,EAAE,MAAM,KAAK,qBAAqB;QACpD,OAAO,aAAa,CAAC,QAAQ,KAAK,QAAQ;QAC1C,CAAC,CAAC,aAAa,CAAC,QAAQ;QACxB,CAAC,CAAC,SAAS,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAA0B,EAAc,EAAE;IACtE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IACzC,OAAO,CAAC;QACN,GAAG,IAAI;QACP,IAAI;QACJ,IAAI,EAAE,OAAO;QACb,MAAM,EAAE;YACN,aAAa,EAAE;gBACb,MAAM,EAAE,qBAAqB;gBAC7B,QAAQ;aACT;SACF;QACD,MAAM,EAAE,EAAE;KACX,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Block, Field } from 'payload';
|
|
2
|
+
export declare const makeFieldsOptional: (fields: Field[], reusableBlocks?: Block[]) => Field[];
|
|
3
|
+
export declare const mergeTemplateValues: (fields: Field[], localValue: unknown, templateValue: unknown) => unknown;
|
|
4
|
+
//# sourceMappingURL=templateFieldFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateFieldFields.d.ts","sourceRoot":"","sources":["../src/templateFieldFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAO,MAAM,SAAS,CAAA;AAwEhD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,KAAK,EAAE,EACf,iBAAgB,KAAK,EAAO,KAC3B,KAAK,EAIP,CAAA;AA+ID,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,KAAK,EAAE,EACf,YAAY,OAAO,EACnB,eAAe,OAAO,KACrB,OAAkE,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
const cloneBlock = (block, blocks, resolving) => {
|
|
2
|
+
const nestedResolving = new Set(resolving).add(block.slug);
|
|
3
|
+
return {
|
|
4
|
+
...block,
|
|
5
|
+
fields: cloneFields(block.fields, blocks, nestedResolving),
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
const cloneTab = (tab, blocks, resolving) => ({
|
|
9
|
+
...tab,
|
|
10
|
+
fields: cloneFields(tab.fields, blocks, resolving),
|
|
11
|
+
});
|
|
12
|
+
const cloneField = (field, blocks, resolving) => {
|
|
13
|
+
let cloned = {
|
|
14
|
+
...field,
|
|
15
|
+
...('name' in field && field.type !== 'ui' ? { required: false } : {}),
|
|
16
|
+
};
|
|
17
|
+
if ('fields' in cloned && Array.isArray(cloned.fields)) {
|
|
18
|
+
cloned = {
|
|
19
|
+
...cloned,
|
|
20
|
+
fields: cloneFields(cloned.fields, blocks, resolving),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (cloned.type === 'tabs') {
|
|
24
|
+
cloned = {
|
|
25
|
+
...cloned,
|
|
26
|
+
tabs: cloned.tabs.map((tab) => cloneTab(tab, blocks, resolving)),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (cloned.type === 'blocks') {
|
|
30
|
+
cloned = {
|
|
31
|
+
...cloned,
|
|
32
|
+
blocks: cloned.blocks.map((block) => cloneBlock(block, blocks, resolving)),
|
|
33
|
+
blockReferences: cloned.blockReferences?.map((block) => typeof block === 'string'
|
|
34
|
+
? blocks.has(block) && !resolving.has(block)
|
|
35
|
+
? cloneBlock(blocks.get(block), blocks, resolving)
|
|
36
|
+
: block
|
|
37
|
+
: cloneBlock(block, blocks, resolving)),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return cloned;
|
|
41
|
+
};
|
|
42
|
+
const cloneFields = (fields, blocks, resolving) => fields.map((field) => cloneField(field, blocks, resolving));
|
|
43
|
+
export const makeFieldsOptional = (fields, reusableBlocks = []) => cloneFields(fields, new Map(reusableBlocks.map((block) => [block.slug, block])), new Set());
|
|
44
|
+
const isPlainObject = (value) => {
|
|
45
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const prototype = Object.getPrototypeOf(value);
|
|
49
|
+
return prototype === Object.prototype || prototype === null;
|
|
50
|
+
};
|
|
51
|
+
const cloneValue = (value) => {
|
|
52
|
+
if (Array.isArray(value)) {
|
|
53
|
+
return value.map(cloneValue);
|
|
54
|
+
}
|
|
55
|
+
if (isPlainObject(value)) {
|
|
56
|
+
return Object.fromEntries(Object.entries(value).map(([key, childValue]) => [key, cloneValue(childValue)]));
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
};
|
|
60
|
+
const isEmptyValue = (value) => value === undefined ||
|
|
61
|
+
value === null ||
|
|
62
|
+
value === '' ||
|
|
63
|
+
(Array.isArray(value) && value.length === 0) ||
|
|
64
|
+
(isPlainObject(value) && Object.keys(value).length === 0);
|
|
65
|
+
const mergeFieldValue = (field, localValue, templateValue) => {
|
|
66
|
+
if (field.type === 'group') {
|
|
67
|
+
return mergeStructuralValue(field.fields, localValue, templateValue);
|
|
68
|
+
}
|
|
69
|
+
return isEmptyValue(localValue) && templateValue !== undefined
|
|
70
|
+
? cloneValue(templateValue)
|
|
71
|
+
: localValue;
|
|
72
|
+
};
|
|
73
|
+
const mergeLocalizedFieldValue = (field, localValue, templateValue) => {
|
|
74
|
+
if (isEmptyValue(localValue)) {
|
|
75
|
+
return templateValue === undefined ? localValue : cloneValue(templateValue);
|
|
76
|
+
}
|
|
77
|
+
if (!isPlainObject(localValue) || !isPlainObject(templateValue)) {
|
|
78
|
+
return mergeFieldValue(field, localValue, templateValue);
|
|
79
|
+
}
|
|
80
|
+
const result = { ...localValue };
|
|
81
|
+
for (const [locale, localizedTemplateValue] of Object.entries(templateValue)) {
|
|
82
|
+
result[locale] = mergeFieldValue(field, result[locale], localizedTemplateValue);
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
};
|
|
86
|
+
const mergeNamedFields = (fields, localValue, templateValue) => {
|
|
87
|
+
const localData = isPlainObject(localValue) ? localValue : {};
|
|
88
|
+
const templateData = isPlainObject(templateValue) ? templateValue : {};
|
|
89
|
+
let result = { ...localData };
|
|
90
|
+
for (const field of fields) {
|
|
91
|
+
if (field.type === 'row' || field.type === 'collapsible') {
|
|
92
|
+
result = mergeNamedFields(field.fields, result, templateData);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (field.type === 'tabs') {
|
|
96
|
+
for (const tab of field.tabs) {
|
|
97
|
+
if ('name' in tab && typeof tab.name === 'string') {
|
|
98
|
+
result[tab.name] = mergeStructuralValue(tab.fields, result[tab.name], templateData[tab.name]);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
result = mergeNamedFields(tab.fields, result, templateData);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (field.type === 'group' && !('name' in field)) {
|
|
107
|
+
result = mergeNamedFields(field.fields, result, templateData);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (!('name' in field)) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const localFieldValue = result[field.name];
|
|
114
|
+
const templateFieldValue = templateData[field.name];
|
|
115
|
+
if ('localized' in field && field.localized) {
|
|
116
|
+
result[field.name] = mergeLocalizedFieldValue(field, localFieldValue, templateFieldValue);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
result[field.name] = mergeFieldValue(field, localFieldValue, templateFieldValue);
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
};
|
|
123
|
+
const mergeStructuralValue = (fields, localValue, templateValue) => {
|
|
124
|
+
if (isEmptyValue(localValue)) {
|
|
125
|
+
return templateValue === undefined ? localValue : cloneValue(templateValue);
|
|
126
|
+
}
|
|
127
|
+
if (!isPlainObject(localValue) || !isPlainObject(templateValue)) {
|
|
128
|
+
return localValue;
|
|
129
|
+
}
|
|
130
|
+
return mergeNamedFields(fields, localValue, templateValue);
|
|
131
|
+
};
|
|
132
|
+
export const mergeTemplateValues = (fields, localValue, templateValue) => mergeStructuralValue(fields, localValue, templateValue);
|
|
133
|
+
//# sourceMappingURL=templateFieldFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateFieldFields.js","sourceRoot":"","sources":["../src/templateFieldFields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateFieldHook.d.ts","sourceRoot":"","sources":["../src/templateFieldHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAkB,MAAM,SAAS,CAAA;AAyI/D,eAAO,MAAM,0BAA0B,GAAI,kCAIxC;IACD,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB,KAAG,SA+DH,CAAA"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { mergeTemplateValues } from './templateFieldFields.js';
|
|
2
|
+
const CACHE_KEY = '@sittari/payload-templates/template-field-cache';
|
|
3
|
+
const isPathWithinRoute = (pathname, route) => {
|
|
4
|
+
const normalizedRoute = route === '/' ? route : route.replace(/\/+$/, '');
|
|
5
|
+
return pathname === normalizedRoute ||
|
|
6
|
+
(normalizedRoute !== '/' && pathname.startsWith(`${normalizedRoute}/`));
|
|
7
|
+
};
|
|
8
|
+
const isAdminAPIInspector = (pathname, adminRoute) => {
|
|
9
|
+
if (!isPathWithinRoute(pathname, adminRoute)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const normalizedRoute = adminRoute === '/' ? '' : adminRoute.replace(/\/+$/, '');
|
|
13
|
+
const segments = pathname
|
|
14
|
+
.slice(normalizedRoute.length)
|
|
15
|
+
.split('/')
|
|
16
|
+
.filter(Boolean);
|
|
17
|
+
return ((segments[0] === 'collections' && segments.length >= 4) ||
|
|
18
|
+
(segments[0] === 'globals' && segments.length >= 3)) && segments.at(-1) === 'api';
|
|
19
|
+
};
|
|
20
|
+
const getReferrerPathname = (req) => {
|
|
21
|
+
const referrer = req.headers?.get('referer');
|
|
22
|
+
if (!referrer) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return new URL(referrer).pathname;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const shouldResolveTemplateFields = ({ context, req, }) => {
|
|
33
|
+
const mode = context.templateFields;
|
|
34
|
+
if (mode === 'raw') {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (mode === 'resolved') {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
const adminRoute = req.payload.config?.routes?.admin;
|
|
41
|
+
if (!adminRoute) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const requestPathname = req.pathname;
|
|
45
|
+
if (requestPathname &&
|
|
46
|
+
isPathWithinRoute(requestPathname, adminRoute) &&
|
|
47
|
+
!isAdminAPIInspector(requestPathname, adminRoute)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const referrerPathname = getReferrerPathname(req);
|
|
51
|
+
return !(referrerPathname &&
|
|
52
|
+
isPathWithinRoute(referrerPathname, adminRoute) &&
|
|
53
|
+
!isAdminAPIInspector(referrerPathname, adminRoute));
|
|
54
|
+
};
|
|
55
|
+
const getCache = (context) => {
|
|
56
|
+
const existing = context[CACHE_KEY];
|
|
57
|
+
if (existing &&
|
|
58
|
+
typeof existing === 'object' &&
|
|
59
|
+
'lookups' in existing &&
|
|
60
|
+
existing.lookups instanceof Map &&
|
|
61
|
+
'warned' in existing &&
|
|
62
|
+
existing.warned instanceof Set) {
|
|
63
|
+
return existing;
|
|
64
|
+
}
|
|
65
|
+
const cache = {
|
|
66
|
+
lookups: new Map(),
|
|
67
|
+
warned: new Set(),
|
|
68
|
+
};
|
|
69
|
+
context[CACHE_KEY] = cache;
|
|
70
|
+
return cache;
|
|
71
|
+
};
|
|
72
|
+
const localeCacheKey = (locale) => Array.isArray(locale) ? locale.join(',') : String(locale ?? '');
|
|
73
|
+
const getEffectiveLocale = ({ fieldName, req, siblingData, value, }) => {
|
|
74
|
+
if (req.locale !== 'all') {
|
|
75
|
+
return req.locale ?? undefined;
|
|
76
|
+
}
|
|
77
|
+
const localizedValues = siblingData[fieldName];
|
|
78
|
+
if (!localizedValues || typeof localizedValues !== 'object' || Array.isArray(localizedValues)) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return Object.entries(localizedValues).find(([, localizedValue]) => localizedValue === value)?.[0];
|
|
82
|
+
};
|
|
83
|
+
export const createTemplateFallbackHook = ({ fields, localized, template, }) => async ({ context, field, req, siblingData, value, }) => {
|
|
84
|
+
if (!shouldResolveTemplateFields({ context, req })) {
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
const groupField = `data_${template}`;
|
|
88
|
+
const fieldName = 'name' in field && typeof field.name === 'string' ? field.name : '';
|
|
89
|
+
const locale = getEffectiveLocale({
|
|
90
|
+
fieldName,
|
|
91
|
+
req,
|
|
92
|
+
siblingData,
|
|
93
|
+
value,
|
|
94
|
+
});
|
|
95
|
+
const cacheKey = [
|
|
96
|
+
template,
|
|
97
|
+
localized ? 'all' : locale ?? localeCacheKey(req.locale),
|
|
98
|
+
localeCacheKey(req.fallbackLocale),
|
|
99
|
+
].join(':');
|
|
100
|
+
const cache = getCache(context);
|
|
101
|
+
let lookup = cache.lookups.get(cacheKey);
|
|
102
|
+
if (!lookup) {
|
|
103
|
+
const lookupLocale = localized ? 'all' : locale;
|
|
104
|
+
const lookupReq = lookupLocale === 'all' ? { ...req } : req;
|
|
105
|
+
lookup = req.payload.find({
|
|
106
|
+
collection: 'templates',
|
|
107
|
+
depth: 0,
|
|
108
|
+
fallbackLocale: req.fallbackLocale,
|
|
109
|
+
limit: 1,
|
|
110
|
+
...(lookupLocale ? { locale: lookupLocale } : {}),
|
|
111
|
+
overrideAccess: true,
|
|
112
|
+
pagination: false,
|
|
113
|
+
req: lookupReq,
|
|
114
|
+
select: {
|
|
115
|
+
[groupField]: true,
|
|
116
|
+
},
|
|
117
|
+
where: {
|
|
118
|
+
templateType: {
|
|
119
|
+
equals: template,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
}).then(({ docs }) => docs[0]);
|
|
123
|
+
cache.lookups.set(cacheKey, lookup);
|
|
124
|
+
}
|
|
125
|
+
const document = await lookup;
|
|
126
|
+
if (!document) {
|
|
127
|
+
if (!cache.warned.has(template)) {
|
|
128
|
+
cache.warned.add(template);
|
|
129
|
+
req.payload.logger.warn(`[templatesPlugin] Managed template "${template}" is missing; local field values were returned unchanged.`);
|
|
130
|
+
}
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
return mergeTemplateValues(fields, value, document[groupField]);
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=templateFieldHook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateFieldHook.js","sourceRoot":"","sources":["../src/templateFieldHook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Block, Field } from 'payload';
|
|
2
|
+
export type FieldTransformer = (field: Field) => Field;
|
|
3
|
+
export declare const transformBlock: (block: Block, transformer: FieldTransformer) => Block;
|
|
4
|
+
export declare const transformField: (field: Field, transformer: FieldTransformer) => Field;
|
|
5
|
+
export declare const transformFields: (fields: Field[], transformer: FieldTransformer) => Field[];
|
|
6
|
+
export declare const fieldsContain: (fields: Field[], predicate: (field: Field) => boolean) => boolean;
|
|
7
|
+
//# sourceMappingURL=traverseFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../src/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAO,MAAM,SAAS,CAAA;AAEhD,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAA;AAOtD,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,EACZ,aAAa,gBAAgB,KAC5B,KAGF,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,EACZ,aAAa,gBAAgB,KAC5B,KA0CF,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,QAAQ,KAAK,EAAE,EACf,aAAa,gBAAgB,KAC5B,KAAK,EAKP,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,QAAQ,KAAK,EAAE,EACf,WAAW,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,KACnC,OAWF,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const transformTab = (tab, transformer) => {
|
|
2
|
+
const fields = transformFields(tab.fields, transformer);
|
|
3
|
+
return fields === tab.fields ? tab : { ...tab, fields };
|
|
4
|
+
};
|
|
5
|
+
export const transformBlock = (block, transformer) => {
|
|
6
|
+
const fields = transformFields(block.fields, transformer);
|
|
7
|
+
return fields === block.fields ? block : { ...block, fields };
|
|
8
|
+
};
|
|
9
|
+
export const transformField = (field, transformer) => {
|
|
10
|
+
let transformed = transformer(field);
|
|
11
|
+
if ('fields' in transformed && Array.isArray(transformed.fields)) {
|
|
12
|
+
const fields = transformFields(transformed.fields, transformer);
|
|
13
|
+
if (fields !== transformed.fields) {
|
|
14
|
+
transformed = { ...transformed, fields };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (transformed.type === 'tabs') {
|
|
18
|
+
const tabsField = transformed;
|
|
19
|
+
const tabs = tabsField.tabs.map((tab) => transformTab(tab, transformer));
|
|
20
|
+
if (tabs.some((tab, index) => tab !== tabsField.tabs[index])) {
|
|
21
|
+
transformed = {
|
|
22
|
+
...tabsField,
|
|
23
|
+
tabs,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (transformed.type === 'blocks') {
|
|
28
|
+
const blocksField = transformed;
|
|
29
|
+
const blocks = blocksField.blocks.map((block) => transformBlock(block, transformer));
|
|
30
|
+
const blockReferences = blocksField.blockReferences?.map((block) => typeof block === 'string' ? block : transformBlock(block, transformer));
|
|
31
|
+
const blocksChanged = blocks.some((block, index) => block !== blocksField.blocks[index]);
|
|
32
|
+
const referencesChanged = blockReferences?.some((block, index) => block !== blocksField.blockReferences?.[index]) ?? false;
|
|
33
|
+
if (blocksChanged || referencesChanged) {
|
|
34
|
+
transformed = {
|
|
35
|
+
...blocksField,
|
|
36
|
+
blocks,
|
|
37
|
+
blockReferences,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return transformed;
|
|
42
|
+
};
|
|
43
|
+
export const transformFields = (fields, transformer) => {
|
|
44
|
+
const transformed = fields.map((field) => transformField(field, transformer));
|
|
45
|
+
return transformed.some((field, index) => field !== fields[index])
|
|
46
|
+
? transformed
|
|
47
|
+
: fields;
|
|
48
|
+
};
|
|
49
|
+
export const fieldsContain = (fields, predicate) => {
|
|
50
|
+
let found = false;
|
|
51
|
+
transformFields(fields, (field) => {
|
|
52
|
+
if (predicate(field)) {
|
|
53
|
+
found = true;
|
|
54
|
+
}
|
|
55
|
+
return field;
|
|
56
|
+
});
|
|
57
|
+
return found;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=traverseFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverseFields.js","sourceRoot":"","sources":["../src/traverseFields.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import type { Field } from 'payload';
|
|
1
|
+
import type { Field, GroupField } from 'payload';
|
|
2
|
+
export type TemplateFieldConfig = {
|
|
3
|
+
/** Field name used in the consuming collection, global, or block. */
|
|
4
|
+
name: string;
|
|
5
|
+
/** Name of a template registered with templatesPlugin. */
|
|
6
|
+
template: string;
|
|
7
|
+
} & Pick<GroupField, 'label' | 'admin'>;
|
|
2
8
|
export type TemplateConfig = {
|
|
3
9
|
/** Fields editable on this template's managed document. */
|
|
4
10
|
fields: Field[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAA8B,MAAM,SAAS,CAAA;AAE5E,MAAM,MAAM,mBAAmB,GAAG;IAChC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAA;CACjB,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,CAAA;AAEvC,MAAM,MAAM,cAAc,GAAG;IAC3B,2DAA2D;IAC3D,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oEAAoE;IACpE,SAAS,EAAE,cAAc,EAAE,CAAA;CAC5B,CAAA"}
|