@sanity/presets 1.0.0 → 1.0.1

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/index.js CHANGED
@@ -1,489 +1,446 @@
1
- import { jsx } from "react/jsx-runtime";
2
1
  import { uuid } from "@sanity/uuid";
2
+ import { useEffect } from "react";
3
3
  import { c } from "react/compiler-runtime";
4
4
  import { useTelemetry } from "@sanity/telemetry/react";
5
- import { useEffect } from "react";
6
5
  import { defineEvent } from "@sanity/telemetry";
7
- import { defineType, defineField, ALL_FIELDS_GROUP, defineArrayMember } from "sanity";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { ALL_FIELDS_GROUP, defineArrayMember, defineField, defineType } from "sanity";
8
8
  import { getImageDimensions } from "@sanity/asset-utils";
9
9
  const PresetsAdded = defineEvent({
10
- name: "Presets Added",
11
- version: 1,
12
- description: "Workspace using presets was accessed"
10
+ name: "Presets Added",
11
+ version: 1,
12
+ description: "Workspace using presets was accessed"
13
13
  }), registries = /* @__PURE__ */ new Map();
14
14
  function registerRegistry(id) {
15
- registries.set(id, {
16
- id,
17
- presets: /* @__PURE__ */ new Set(),
18
- logged: !1
19
- });
15
+ registries.set(id, {
16
+ id,
17
+ presets: /* @__PURE__ */ new Set(),
18
+ logged: !1
19
+ });
20
20
  }
21
21
  function recordPresetUsage(registryId, identifier) {
22
- registries.get(registryId)?.presets.add(identifier);
22
+ registries.get(registryId)?.presets.add(identifier);
23
23
  }
24
24
  function collectPresetsRegistryTelemetry(registryId, telemetry) {
25
- const record = registries.get(registryId);
26
- !record || record.logged || (record.logged = !0, record.presets.size > 0 && telemetry.log(PresetsAdded, {
27
- presetNames: [...record.presets]
28
- }));
25
+ let record = registries.get(registryId);
26
+ !record || record.logged || (record.logged = !0, record.presets.size > 0 && telemetry.log(PresetsAdded, { presetNames: [...record.presets] }));
29
27
  }
28
+ /**
29
+ * A transparent input component wrapper that triggers telemetry collection
30
+ * for the presets registry. Renders the user-provided input component if
31
+ * supplied, otherwise the default input component unchanged.
32
+ *
33
+ * Attached to every schema type produced by a define<Type> function via
34
+ * components.input. The first instance to render for a given registry id
35
+ * submits the PresetsAdded telemetry event; subsequent renders are no-ops.
36
+ */
30
37
  const PresetsTelemetryCollector = (t0) => {
31
- const $ = c(4), {
32
- registryId,
33
- userInput: UserInput,
34
- ...props
35
- } = t0, telemetry = useTelemetry();
36
- let t1, t2;
37
- return $[0] !== registryId || $[1] !== telemetry ? (t1 = () => {
38
- collectPresetsRegistryTelemetry(registryId, telemetry);
39
- }, t2 = [registryId, telemetry], $[0] = registryId, $[1] = telemetry, $[2] = t1, $[3] = t2) : (t1 = $[2], t2 = $[3]), useEffect(t1, t2), UserInput ? /* @__PURE__ */ jsx(UserInput, { ...props }) : props.renderDefault(props);
40
- };
41
- const ctaType = {
42
- name: "cta",
43
- identifier: "core.cta",
44
- schemaType: (config, registry) => {
45
- const {
46
- fields,
47
- ...objectConfig
48
- } = config;
49
- return defineType({
50
- ...objectConfig,
51
- type: "object",
52
- fields: [registry.getPreset("link", {
53
- name: "link",
54
- title: "Link"
55
- }), defineField({
56
- name: "level",
57
- title: "Level",
58
- description: "The importance of the action relative to its siblings: level 1 being the primary action, 2 the secondary action, and so on.",
59
- type: "number",
60
- options: {
61
- layout: "radio",
62
- list: [1, 2, 3]
63
- }
64
- }), ...fields ?? []],
65
- preview: {
66
- select: {
67
- linkType: "link.linkType",
68
- url: "link.url",
69
- referenceTitle: "link.reference.title",
70
- referenceName: "link.reference.name"
71
- },
72
- prepare({
73
- linkType: linkType2,
74
- url,
75
- referenceTitle,
76
- referenceName
77
- }) {
78
- return {
79
- title: linkType2 === "external" ? url || "No URL" : referenceTitle || referenceName || "No reference",
80
- subtitle: "Button"
81
- };
82
- }
83
- }
84
- });
85
- }
86
- }, imageType = {
87
- name: "image",
88
- identifier: "core.image",
89
- schemaType: (config) => {
90
- const {
91
- altText = !0,
92
- caption = !0,
93
- hotspot = !0,
94
- fields,
95
- ...imageConfig
96
- } = config;
97
- return defineType({
98
- ...imageConfig,
99
- type: "image",
100
- // hotspot is the curated default; callers override other image options (accept, sources, storeOriginalFilename) via the map.options hook
101
- options: {
102
- hotspot
103
- },
104
- fields: [...altText ? [defineField({
105
- name: "altText",
106
- title: "Alt text",
107
- description: "Describes the image for screen readers and search engines. Important for accessibility.",
108
- type: "string",
109
- validation: (rule) => rule.warning("Alt text improves accessibility.")
110
- })] : [], ...caption ? [defineField({
111
- name: "caption",
112
- title: "Caption",
113
- type: "text"
114
- })] : [], ...fields ?? []],
115
- preview: {
116
- select: {
117
- title: altText ? "altText" : caption ? "caption" : "asset.originalFilename"
118
- }
119
- }
120
- });
121
- }
38
+ let $ = c(4), { registryId, userInput: UserInput, ...props } = t0, telemetry = useTelemetry(), t1, t2;
39
+ return $[0] !== registryId || $[1] !== telemetry ? (t1 = () => {
40
+ collectPresetsRegistryTelemetry(registryId, telemetry);
41
+ }, t2 = [registryId, telemetry], $[0] = registryId, $[1] = telemetry, $[2] = t1, $[3] = t2) : (t1 = $[2], t2 = $[3]), useEffect(t1, t2), UserInput ? /* @__PURE__ */ jsx(UserInput, { ...props }) : props.renderDefault(props);
122
42
  };
43
+ /**
44
+ * A typed passthrough for defining a preset. Given a `PresetDefinition`, it
45
+ * returns the same value, narrowed to its concrete generic parameters so
46
+ * downstream code can infer the preset's config type from it.
47
+ *
48
+ * This is intentionally lightweight: it performs no work at call time. The
49
+ * registry is responsible for invoking `schemaType` when a preset is
50
+ * instantiated, and for applying `map` hooks to the produced schema type.
51
+ */
52
+ function definePresetType(preset) {
53
+ return preset;
54
+ }
55
+ const ctaType = definePresetType({
56
+ name: "cta",
57
+ identifier: "core.cta",
58
+ schemaType: (config, registry) => {
59
+ let { fields, ...objectConfig } = config;
60
+ return defineType({
61
+ ...objectConfig,
62
+ type: "object",
63
+ fields: [
64
+ registry.getPreset("link", {
65
+ name: "link",
66
+ title: "Link"
67
+ }),
68
+ defineField({
69
+ name: "level",
70
+ title: "Level",
71
+ description: "The importance of the action relative to its siblings: level 1 being the primary action, 2 the secondary action, and so on.",
72
+ type: "number",
73
+ options: {
74
+ layout: "radio",
75
+ list: [
76
+ 1,
77
+ 2,
78
+ 3
79
+ ]
80
+ }
81
+ }),
82
+ ...fields ?? []
83
+ ],
84
+ preview: {
85
+ select: {
86
+ linkType: "link.linkType",
87
+ url: "link.url",
88
+ referenceTitle: "link.reference.title",
89
+ referenceName: "link.reference.name"
90
+ },
91
+ prepare({ linkType, url, referenceTitle, referenceName }) {
92
+ return {
93
+ title: linkType === "external" ? url || "No URL" : referenceTitle || referenceName || "No reference",
94
+ subtitle: "Button"
95
+ };
96
+ }
97
+ }
98
+ });
99
+ }
100
+ }), imageType = definePresetType({
101
+ name: "image",
102
+ identifier: "core.image",
103
+ schemaType: (config) => {
104
+ let { altText = !0, caption = !0, hotspot = !0, fields, ...imageConfig } = config;
105
+ return defineType({
106
+ ...imageConfig,
107
+ type: "image",
108
+ options: { hotspot },
109
+ fields: [
110
+ ...altText ? [defineField({
111
+ name: "altText",
112
+ title: "Alt text",
113
+ description: "Describes the image for screen readers and search engines. Important for accessibility.",
114
+ type: "string",
115
+ validation: (rule) => rule.warning("Alt text improves accessibility.")
116
+ })] : [],
117
+ ...caption ? [defineField({
118
+ name: "caption",
119
+ title: "Caption",
120
+ type: "text"
121
+ })] : [],
122
+ ...fields ?? []
123
+ ],
124
+ preview: { select: { title: altText ? "altText" : caption ? "caption" : "asset.originalFilename" } }
125
+ });
126
+ }
127
+ });
123
128
  function normalizeToTargets(entries) {
124
- return entries.map((entry) => typeof entry == "string" ? {
125
- type: entry
126
- } : entry);
129
+ return entries.map((entry) => typeof entry == "string" ? { type: entry } : entry);
127
130
  }
128
- const linkType = {
129
- name: "link",
130
- identifier: "core.link",
131
- schemaType: ({
132
- to,
133
- fields,
134
- ...objectConfig
135
- }) => {
136
- const referenceTargets = normalizeToTargets(to ?? []);
137
- return defineType({
138
- ...objectConfig,
139
- type: "object",
140
- fields: [defineField({
141
- name: "linkType",
142
- type: "string",
143
- title: "Link Type",
144
- description: "Internal links point to a page in this project. External links point to a full URL.",
145
- initialValue: "internal",
146
- options: {
147
- layout: "radio",
148
- list: [{
149
- title: "Internal",
150
- value: "internal"
151
- }, {
152
- title: "External",
153
- value: "external"
154
- }]
155
- }
156
- }), defineField({
157
- name: "reference",
158
- type: "reference",
159
- title: "Internal Link",
160
- to: referenceTargets,
161
- hidden: ({
162
- parent
163
- }) => parent?.linkType === "external"
164
- }), defineField({
165
- name: "url",
166
- type: "url",
167
- title: "URL",
168
- description: "Full URL including protocol, e.g. https://example.com. Supports http, https, mailto, and tel.",
169
- hidden: ({
170
- parent
171
- }) => parent?.linkType === "internal",
172
- validation: (rule) => rule.uri({
173
- scheme: ["http", "https", "mailto", "tel"]
174
- })
175
- }), defineField({
176
- name: "openInNewTab",
177
- type: "boolean",
178
- title: "Open in New Tab",
179
- initialValue: !1,
180
- hidden: ({
181
- parent
182
- }) => parent?.linkType === "internal"
183
- }), ...fields ?? []],
184
- preview: {
185
- select: {
186
- linkType: "linkType",
187
- url: "url",
188
- referenceTitle: "reference.title",
189
- referenceName: "reference.name"
190
- },
191
- prepare({
192
- linkType: linkType2,
193
- url,
194
- referenceTitle,
195
- referenceName
196
- }) {
197
- return {
198
- title: linkType2 === "external" ? url || "No URL" : referenceTitle || referenceName || "No reference",
199
- subtitle: linkType2 === "external" ? "External link" : "Internal link"
200
- };
201
- }
202
- }
203
- });
204
- }
205
- };
131
+ const linkType = definePresetType({
132
+ name: "link",
133
+ identifier: "core.link",
134
+ schemaType: ({ to, fields, ...objectConfig }) => {
135
+ let referenceTargets = normalizeToTargets(to ?? []);
136
+ return defineType({
137
+ ...objectConfig,
138
+ type: "object",
139
+ fields: [
140
+ defineField({
141
+ name: "linkType",
142
+ type: "string",
143
+ title: "Link Type",
144
+ description: "Internal links point to a page in this project. External links point to a full URL.",
145
+ initialValue: "internal",
146
+ options: {
147
+ layout: "radio",
148
+ list: [{
149
+ title: "Internal",
150
+ value: "internal"
151
+ }, {
152
+ title: "External",
153
+ value: "external"
154
+ }]
155
+ }
156
+ }),
157
+ defineField({
158
+ name: "reference",
159
+ type: "reference",
160
+ title: "Internal Link",
161
+ to: referenceTargets,
162
+ hidden: ({ parent }) => parent?.linkType === "external"
163
+ }),
164
+ defineField({
165
+ name: "url",
166
+ type: "url",
167
+ title: "URL",
168
+ description: "Full URL including protocol, e.g. https://example.com. Supports http, https, mailto, and tel.",
169
+ hidden: ({ parent }) => parent?.linkType === "internal",
170
+ validation: (rule) => rule.uri({ scheme: [
171
+ "http",
172
+ "https",
173
+ "mailto",
174
+ "tel"
175
+ ] })
176
+ }),
177
+ defineField({
178
+ name: "openInNewTab",
179
+ type: "boolean",
180
+ title: "Open in New Tab",
181
+ initialValue: !1,
182
+ hidden: ({ parent }) => parent?.linkType === "internal"
183
+ }),
184
+ ...fields ?? []
185
+ ],
186
+ preview: {
187
+ select: {
188
+ linkType: "linkType",
189
+ url: "url",
190
+ referenceTitle: "reference.title",
191
+ referenceName: "reference.name"
192
+ },
193
+ prepare({ linkType, url, referenceTitle, referenceName }) {
194
+ return {
195
+ title: linkType === "external" ? url || "No URL" : referenceTitle || referenceName || "No reference",
196
+ subtitle: linkType === "external" ? "External link" : "Internal link"
197
+ };
198
+ }
199
+ }
200
+ });
201
+ }
202
+ });
206
203
  function wrapArrayAsPageBuilderBlock(arraySchema) {
207
- const components = "components" in arraySchema ? arraySchema.components : void 0;
208
- return defineArrayMember({
209
- name: arraySchema.name,
210
- title: arraySchema.title,
211
- type: "object",
212
- fields: [defineField({
213
- name: "content",
214
- type: "array",
215
- of: arraySchema.of,
216
- components
217
- })]
218
- });
204
+ let components = "components" in arraySchema ? arraySchema.components : void 0;
205
+ return defineArrayMember({
206
+ name: arraySchema.name,
207
+ title: arraySchema.title,
208
+ type: "object",
209
+ fields: [defineField({
210
+ name: "content",
211
+ type: "array",
212
+ of: arraySchema.of,
213
+ components
214
+ })]
215
+ });
219
216
  }
220
217
  function toPageBuilderArrayMember(block, lookupArrayPreset) {
221
- if (typeof block == "string") {
222
- const arrayPreset = lookupArrayPreset(block);
223
- return arrayPreset ? wrapArrayAsPageBuilderBlock(arrayPreset) : defineArrayMember({
224
- type: block
225
- });
226
- }
227
- return block.type === "array" ? wrapArrayAsPageBuilderBlock(block) : defineArrayMember(block);
218
+ if (typeof block == "string") {
219
+ let arrayPreset = lookupArrayPreset(block);
220
+ return arrayPreset ? wrapArrayAsPageBuilderBlock(arrayPreset) : defineArrayMember({ type: block });
221
+ }
222
+ return block.type === "array" ? wrapArrayAsPageBuilderBlock(block) : defineArrayMember(block);
228
223
  }
229
224
  function defineLazyContentField(blocks, lookupArrayPreset) {
230
- let cached;
231
- return defineField({
232
- name: "content",
233
- title: "Content",
234
- description: "Page sections rendered in order. Add, remove, or reorder blocks to build the page.",
235
- group: "main",
236
- type: "array",
237
- get of() {
238
- return cached ??= blocks.map((block) => toPageBuilderArrayMember(block, lookupArrayPreset)), cached;
239
- }
240
- });
225
+ let cached;
226
+ return defineField({
227
+ name: "content",
228
+ title: "Content",
229
+ description: "Page sections rendered in order. Add, remove, or reorder blocks to build the page.",
230
+ group: "main",
231
+ type: "array",
232
+ get of() {
233
+ return cached ??= blocks.map((block) => toPageBuilderArrayMember(block, lookupArrayPreset)), cached;
234
+ }
235
+ });
241
236
  }
242
- function createPageType({
243
- lookupArrayPreset
244
- }) {
245
- return {
246
- name: "page",
247
- identifier: "core.page",
248
- schemaType: (config, registry) => {
249
- const {
250
- pageBuilderBlocks,
251
- groups,
252
- fields,
253
- ...documentConfig
254
- } = config;
255
- return defineType({
256
- ...documentConfig,
257
- type: "document",
258
- groups: [{
259
- ...ALL_FIELDS_GROUP,
260
- hidden: !0
261
- }, {
262
- name: "main",
263
- title: "Main",
264
- default: !0
265
- }, {
266
- name: "metadata",
267
- title: "Metadata"
268
- }, ...groups ?? []],
269
- fields: [defineField({
270
- name: "name",
271
- title: "Name",
272
- description: "Used as the page title and as the source for the auto-generated slug.",
273
- type: "string",
274
- group: "main",
275
- validation: (rule) => rule.required()
276
- }), defineField({
277
- name: "slug",
278
- title: "Slug",
279
- type: "slug",
280
- group: "main",
281
- options: {
282
- source: "name"
283
- }
284
- }), defineLazyContentField(pageBuilderBlocks ?? [], lookupArrayPreset), registry.getPreset("seo", {
285
- name: "seo",
286
- title: "SEO",
287
- group: "metadata"
288
- }), ...fields ?? []]
289
- });
290
- }
291
- };
237
+ function createPageType({ lookupArrayPreset }) {
238
+ return definePresetType({
239
+ name: "page",
240
+ identifier: "core.page",
241
+ schemaType: (config, registry) => {
242
+ let { pageBuilderBlocks, groups, fields, ...documentConfig } = config;
243
+ return defineType({
244
+ ...documentConfig,
245
+ type: "document",
246
+ groups: [
247
+ {
248
+ ...ALL_FIELDS_GROUP,
249
+ hidden: !0
250
+ },
251
+ {
252
+ name: "main",
253
+ title: "Main",
254
+ default: !0
255
+ },
256
+ {
257
+ name: "metadata",
258
+ title: "Metadata"
259
+ },
260
+ ...groups ?? []
261
+ ],
262
+ fields: [
263
+ defineField({
264
+ name: "name",
265
+ title: "Name",
266
+ description: "Used as the page title and as the source for the auto-generated slug.",
267
+ type: "string",
268
+ group: "main",
269
+ validation: (rule) => rule.required()
270
+ }),
271
+ defineField({
272
+ name: "slug",
273
+ title: "Slug",
274
+ type: "slug",
275
+ group: "main",
276
+ options: { source: "name" }
277
+ }),
278
+ defineLazyContentField(pageBuilderBlocks ?? [], lookupArrayPreset),
279
+ registry.getPreset("seo", {
280
+ name: "seo",
281
+ title: "SEO",
282
+ group: "metadata"
283
+ }),
284
+ ...fields ?? []
285
+ ]
286
+ });
287
+ }
288
+ });
292
289
  }
290
+ createPageType({ lookupArrayPreset: () => void 0 });
293
291
  function resolveObjects(objects) {
294
- if (objects === !1) return {
295
- link: !1,
296
- image: !1,
297
- cta: !1
298
- };
299
- if (objects === !0 || objects === void 0) return {
300
- link: !0,
301
- image: !0,
302
- cta: !0
303
- };
304
- const {
305
- link = !0,
306
- image = !0,
307
- cta = !0
308
- } = objects;
309
- return {
310
- link,
311
- image,
312
- cta
313
- };
292
+ if (objects === !1) return {
293
+ link: !1,
294
+ image: !1,
295
+ cta: !1
296
+ };
297
+ if (objects === !0 || objects === void 0) return {
298
+ link: !0,
299
+ image: !0,
300
+ cta: !0
301
+ };
302
+ let { link = !0, image = !0, cta = !0 } = objects;
303
+ return {
304
+ link,
305
+ image,
306
+ cta
307
+ };
314
308
  }
315
- const richTextType = {
316
- name: "richText",
317
- identifier: "core.richText",
318
- schemaType: (config, registry) => {
319
- const {
320
- objects,
321
- ...arrayConfig
322
- } = config, {
323
- link,
324
- image,
325
- cta
326
- } = resolveObjects(objects), linkAnnotation = link ? registry.getPreset("link", {
327
- name: "link",
328
- title: "Link"
329
- }) : void 0, ctaInline = cta ? registry.getPreset("cta", {
330
- name: "cta",
331
- title: "CTA"
332
- }) : void 0, imageMember = image ? registry.getPreset("image", {
333
- name: "richTextImage",
334
- title: "Image"
335
- }) : void 0, blockMember = defineArrayMember({
336
- type: "block",
337
- marks: {
338
- annotations: linkAnnotation ? [linkAnnotation] : []
339
- },
340
- ...ctaInline && {
341
- of: [ctaInline]
342
- }
343
- });
344
- return defineType({
345
- ...arrayConfig,
346
- type: "array",
347
- of: imageMember ? [blockMember, imageMember] : [blockMember]
348
- });
349
- }
350
- }, seoType = {
351
- name: "seo",
352
- identifier: "core.seo",
353
- schemaType: (config) => {
354
- const {
355
- fields,
356
- ...objectConfig
357
- } = config;
358
- return defineType({
359
- ...objectConfig,
360
- type: "object",
361
- fields: [defineField({
362
- name: "title",
363
- title: "Title",
364
- type: "string",
365
- validation: (rule) => rule.max(70).info("Search engines may truncate this title.")
366
- }), defineField({
367
- name: "description",
368
- title: "Description",
369
- type: "text",
370
- validation: (rule) => rule.max(150).info("Search engines may truncate this description.")
371
- }), defineField({
372
- name: "ogImage",
373
- title: "Open Graph image",
374
- type: "image",
375
- description: "Landscape 1200x630 (1.91:1)",
376
- options: {
377
- hotspot: {
378
- previews: [{
379
- title: "Landscape (1.91:1)",
380
- aspectRatio: 1.91 / 1
381
- }]
382
- }
383
- },
384
- validation: (Rule) => Rule.custom((value) => {
385
- if (!value?.asset?._ref)
386
- return !0;
387
- const {
388
- height,
389
- width
390
- } = getImageDimensions(value.asset?._ref);
391
- return height !== 630 || width !== 1200 ? "Open Graph images are recommended to be exactly 1200x630 (1.91:1) for the best social sharing previews." : !0;
392
- }).warning()
393
- }), ...fields ?? []]
394
- });
395
- }
396
- };
309
+ const richTextType = definePresetType({
310
+ name: "richText",
311
+ identifier: "core.richText",
312
+ schemaType: (config, registry) => {
313
+ let { objects, ...arrayConfig } = config, { link, image, cta } = resolveObjects(objects), linkAnnotation = link ? registry.getPreset("link", {
314
+ name: "link",
315
+ title: "Link"
316
+ }) : void 0, ctaInline = cta ? registry.getPreset("cta", {
317
+ name: "cta",
318
+ title: "CTA"
319
+ }) : void 0, imageMember = image ? registry.getPreset("image", {
320
+ name: "richTextImage",
321
+ title: "Image"
322
+ }) : void 0, blockMember = defineArrayMember({
323
+ type: "block",
324
+ marks: { annotations: linkAnnotation ? [linkAnnotation] : [] },
325
+ ...ctaInline && { of: [ctaInline] }
326
+ });
327
+ return defineType({
328
+ ...arrayConfig,
329
+ type: "array",
330
+ of: imageMember ? [blockMember, imageMember] : [blockMember]
331
+ });
332
+ }
333
+ }), seoType = definePresetType({
334
+ name: "seo",
335
+ identifier: "core.seo",
336
+ schemaType: (config) => {
337
+ let { fields, ...objectConfig } = config;
338
+ return defineType({
339
+ ...objectConfig,
340
+ type: "object",
341
+ fields: [
342
+ defineField({
343
+ name: "title",
344
+ title: "Title",
345
+ type: "string",
346
+ validation: (rule) => rule.max(70).info("Search engines may truncate this title.")
347
+ }),
348
+ defineField({
349
+ name: "description",
350
+ title: "Description",
351
+ type: "text",
352
+ validation: (rule) => rule.max(150).info("Search engines may truncate this description.")
353
+ }),
354
+ defineField({
355
+ name: "ogImage",
356
+ title: "Open Graph image",
357
+ type: "image",
358
+ description: "Landscape 1200x630 (1.91:1)",
359
+ options: { hotspot: { previews: [{
360
+ title: "Landscape (1.91:1)",
361
+ aspectRatio: 1.91 / 1
362
+ }] } },
363
+ validation: (Rule) => Rule.custom((value) => {
364
+ if (!value?.asset?._ref) return !0;
365
+ let { height, width } = getImageDimensions(value.asset?._ref);
366
+ return height !== 630 || width !== 1200 ? "Open Graph images are recommended to be exactly 1200x630 (1.91:1) for the best social sharing previews." : !0;
367
+ }).warning()
368
+ }),
369
+ ...fields ?? []
370
+ ]
371
+ });
372
+ }
373
+ });
397
374
  function createPresetsRegistry(config = {}) {
398
- const registryId = uuid();
399
- registerRegistry(registryId);
400
- const seed = {}, registeredSchemas = /* @__PURE__ */ new Map(), pageTypeWithLookup = createPageType({
401
- lookupArrayPreset: (name) => {
402
- const registered = registeredSchemas.get(name);
403
- return registered?.type === "array" ? registered : void 0;
404
- }
405
- });
406
- return [linkType, ctaType, seoType, imageType, pageTypeWithLookup, richTextType].reduce((registry, preset) => {
407
- const key = getPresetKey(preset.name);
408
- return registry[key] = createDefiner({
409
- registryId,
410
- preset,
411
- config,
412
- registry,
413
- registeredSchemas
414
- }), registry;
415
- }, seed);
375
+ let registryId = uuid();
376
+ registerRegistry(registryId);
377
+ let seed = {}, registeredSchemas = /* @__PURE__ */ new Map();
378
+ return [
379
+ linkType,
380
+ ctaType,
381
+ seoType,
382
+ imageType,
383
+ createPageType({ lookupArrayPreset: (name) => {
384
+ let registered = registeredSchemas.get(name);
385
+ return registered?.type === "array" ? registered : void 0;
386
+ } }),
387
+ richTextType
388
+ ].reduce((registry, preset) => {
389
+ let key = getPresetKey(preset.name);
390
+ return registry[key] = createDefiner({
391
+ registryId,
392
+ preset,
393
+ config,
394
+ registry,
395
+ registeredSchemas
396
+ }), registry;
397
+ }, seed);
416
398
  }
417
399
  function getPresetKey(name) {
418
- return `define${name.charAt(0).toUpperCase()}${name.slice(1)}`;
400
+ return `define${name.charAt(0).toUpperCase()}${name.slice(1)}`;
419
401
  }
420
- function createRegistryContext({
421
- registry
422
- }) {
423
- return {
424
- getPreset: (name, presetConfig) => {
425
- const key = getPresetKey(name), definer = registry[key];
426
- if (!definer)
427
- throw new Error(`Cannot resolve preset "${name}". No such preset in this registry.`);
428
- return definer(presetConfig);
429
- }
430
- };
402
+ function createRegistryContext({ registry }) {
403
+ return { getPreset: (name, presetConfig) => {
404
+ let definer = registry[getPresetKey(name)];
405
+ if (!definer) throw Error(`Cannot resolve preset "${name}". No such preset in this registry.`);
406
+ return definer(presetConfig);
407
+ } };
431
408
  }
432
- function createDefiner({
433
- registryId,
434
- preset,
435
- config,
436
- registry,
437
- registeredSchemas
438
- }) {
439
- return function(userConfig = {}) {
440
- const name = userConfig.name;
441
- if (typeof name != "string" || name.length === 0)
442
- throw new Error(`${getPresetKey(preset.name)}: "name" is required. Pass {name: "yourTypeName"}.`);
443
- recordPresetUsage(registryId, preset.identifier ?? "unnamed");
444
- const registryContext = createRegistryContext({
445
- registry
446
- }), registryDefaults = config[preset.name], mergedConfig = {
447
- ...typeof registryDefaults == "object" && registryDefaults !== null ? registryDefaults : {},
448
- ...userConfig
449
- }, {
450
- map,
451
- ...factoryConfig
452
- } = mergedConfig, schemaType = preset.schemaType(
453
- // oxlint-disable-next-line no-unsafe-type-assertion -- factoryConfig is the merged user config (minus `map`, with `name` injected); its shape matches the factory's expected parameter at runtime
454
- factoryConfig,
455
- registryContext
456
- );
457
- return registeredSchemas.set(name, schemaType), applyMapHooks(addTelemetryComponent(schemaType, registryId), map);
458
- };
409
+ function createDefiner({ registryId, preset, config, registry, registeredSchemas }) {
410
+ return function(userConfig = {}) {
411
+ let name = userConfig.name;
412
+ if (typeof name != "string" || name.length === 0) throw Error(`${getPresetKey(preset.name)}: "name" is required. Pass {name: "yourTypeName"}.`);
413
+ recordPresetUsage(registryId, preset.identifier ?? "unnamed");
414
+ let registryContext = createRegistryContext({ registry }), registryDefaults = config[preset.name], { map, ...factoryConfig } = {
415
+ ...typeof registryDefaults == "object" && registryDefaults ? registryDefaults : {},
416
+ ...userConfig
417
+ }, schemaType = preset.schemaType(factoryConfig, registryContext);
418
+ return registeredSchemas.set(name, schemaType), applyMapHooks(addTelemetryComponent(schemaType, registryId), map);
419
+ };
459
420
  }
460
421
  function applyMapHooks(schemaType, map) {
461
- if (!map || typeof map != "object") return schemaType;
462
- const mappedSchemaType = {};
463
- for (const [configName, configValue] of Object.entries(map))
464
- typeof configValue == "function" && (mappedSchemaType[configName] = configValue(
465
- // oxlint-disable-next-line no-unsafe-type-assertion -- map hooks operate on arbitrary schema type properties
466
- schemaType[configName]
467
- ));
468
- return {
469
- ...schemaType,
470
- ...mappedSchemaType
471
- };
422
+ if (!map || typeof map != "object") return schemaType;
423
+ let mappedSchemaType = {};
424
+ for (let [configName, configValue] of Object.entries(map)) typeof configValue == "function" && (mappedSchemaType[configName] = configValue(schemaType[configName]));
425
+ return {
426
+ ...schemaType,
427
+ ...mappedSchemaType
428
+ };
472
429
  }
473
430
  function addTelemetryComponent(schemaType, registryId) {
474
- const existing = "components" in schemaType ? schemaType.components : void 0, existingInput = existing && "input" in existing && typeof existing.input == "function" ? (
475
- // oxlint-disable-next-line no-unsafe-type-assertion -- presets only produce object/document schema types, whose input components are assignable to ComponentType<InputProps>
476
- existing.input
477
- ) : void 0;
478
- return {
479
- ...schemaType,
480
- components: {
481
- ...existing,
482
- input: (props) => /* @__PURE__ */ jsx(PresetsTelemetryCollector, { ...props, registryId, userInput: existingInput })
483
- }
484
- };
431
+ let existing = "components" in schemaType ? schemaType.components : void 0, existingInput = existing && "input" in existing && typeof existing.input == "function" ? existing.input : void 0;
432
+ return {
433
+ ...schemaType,
434
+ components: {
435
+ ...existing,
436
+ input: (props) => /* @__PURE__ */ jsx(PresetsTelemetryCollector, {
437
+ ...props,
438
+ registryId,
439
+ userInput: existingInput
440
+ })
441
+ }
442
+ };
485
443
  }
486
- export {
487
- createPresetsRegistry
488
- };
489
- //# sourceMappingURL=index.js.map
444
+ export { createPresetsRegistry };
445
+
446
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/__telemetry__/presets.telemetry.ts","../src/telemetry.ts","../src/components/PresetsTelemetryCollector.tsx","../src/presets/cta-type/index.ts","../src/presets/image-type/index.ts","../src/presets/link-type/index.ts","../src/presets/page-type/index.ts","../src/presets/rich-text-type/index.ts","../src/presets/seo-type/index.ts","../src/registry.tsx"],"sourcesContent":["import {defineEvent} from '@sanity/telemetry'\n\ninterface PresetsAddedInfo {\n presetNames: string[]\n}\n\nexport const PresetsAdded = defineEvent<PresetsAddedInfo>({\n name: 'Presets Added',\n version: 1,\n description: 'Workspace using presets was accessed',\n})\n","import {PresetsAdded} from './__telemetry__/presets.telemetry'\n\n/**\n * Minimal interface for the subset of TelemetryLogger we need.\n * Avoids forcing callers to satisfy the full generic TelemetryLogger type.\n */\nexport interface TelemetryLog {\n log(event: unknown, data: unknown): void\n}\n\ninterface RegistryRecord {\n id: string\n presets: Set<string>\n logged: boolean\n}\n\nconst registries = new Map<string, RegistryRecord>()\n\nexport function registerRegistry(id: string): void {\n registries.set(id, {id, presets: new Set(), logged: false})\n}\n\nexport function recordPresetUsage(registryId: string, identifier: string): void {\n registries.get(registryId)?.presets.add(identifier)\n}\n\nexport function collectPresetsRegistryTelemetry(registryId: string, telemetry: TelemetryLog): void {\n const record = registries.get(registryId)\n if (!record || record.logged) return\n record.logged = true\n if (record.presets.size > 0) {\n telemetry.log(PresetsAdded, {presetNames: [...record.presets]})\n }\n}\n\n/** @internal */\nexport function resetRegistries(): void {\n registries.clear()\n}\n","import {useTelemetry} from '@sanity/telemetry/react'\nimport {useEffect, type ComponentType} from 'react'\nimport type {InputProps} from 'sanity'\n\nimport {collectPresetsRegistryTelemetry} from '../telemetry'\n\ntype Props = InputProps & {\n registryId: string\n userInput?: ComponentType<InputProps>\n}\n\n/**\n * A transparent input component wrapper that triggers telemetry collection\n * for the presets registry. Renders the user-provided input component if\n * supplied, otherwise the default input component unchanged.\n *\n * Attached to every schema type produced by a define<Type> function via\n * components.input. The first instance to render for a given registry id\n * submits the PresetsAdded telemetry event; subsequent renders are no-ops.\n */\nexport const PresetsTelemetryCollector: ComponentType<Props> = ({\n registryId,\n userInput: UserInput,\n ...props\n}) => {\n const telemetry = useTelemetry()\n\n useEffect(() => {\n collectPresetsRegistryTelemetry(registryId, telemetry)\n }, [registryId, telemetry])\n\n if (UserInput) {\n return <UserInput {...props} />\n }\n\n return props.renderDefault(props)\n}\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const ctaType = definePresetType<{}, 'object', 'preview'>({\n name: 'cta',\n identifier: 'core.cta',\n schemaType: (config, registry) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n registry.getPreset('link', {name: 'link', title: 'Link'}),\n defineField({\n name: 'level',\n title: 'Level',\n description:\n 'The importance of the action relative to its siblings: level 1 being the primary action, 2 the secondary action, and so on.',\n type: 'number',\n options: {\n layout: 'radio',\n list: [1, 2, 3],\n },\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'link.linkType',\n url: 'link.url',\n referenceTitle: 'link.reference.title',\n referenceName: 'link.reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n return {title, subtitle: 'Button'}\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface ImageTypeConfig {\n altText?: boolean\n caption?: boolean\n hotspot?: boolean\n}\n\nexport const imageType = definePresetType<ImageTypeConfig, 'image', 'preview'>({\n name: 'image',\n identifier: 'core.image',\n schemaType: (config) => {\n const {altText = true, caption = true, hotspot = true, fields, ...imageConfig} = config\n\n return defineType({\n ...imageConfig,\n type: 'image',\n // hotspot is the curated default; callers override other image options (accept, sources, storeOriginalFilename) via the map.options hook\n options: {\n hotspot,\n },\n fields: [\n ...(altText\n ? [\n defineField({\n name: 'altText',\n title: 'Alt text',\n description:\n 'Describes the image for screen readers and search engines. Important for accessibility.',\n type: 'string',\n validation: (rule) => rule.warning('Alt text improves accessibility.'),\n }),\n ]\n : []),\n ...(caption\n ? [\n defineField({\n name: 'caption',\n title: 'Caption',\n type: 'text',\n }),\n ]\n : []),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n title: altText ? 'altText' : caption ? 'caption' : 'asset.originalFilename',\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\ntype LinkToEntry = string | {type: string}\n\nexport interface LinkTypeConfig {\n to?: LinkToEntry[]\n}\n\nfunction normalizeToTargets(entries: LinkToEntry[]): {type: string}[] {\n return entries.map((entry) => (typeof entry === 'string' ? {type: entry} : entry))\n}\n\nexport const linkType = definePresetType<LinkTypeConfig, 'object', 'preview'>({\n name: 'link',\n identifier: 'core.link',\n schemaType: ({to, fields, ...objectConfig}) => {\n const referenceTargets = normalizeToTargets(to ?? [])\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'linkType',\n type: 'string',\n title: 'Link Type',\n description:\n 'Internal links point to a page in this project. External links point to a full URL.',\n initialValue: 'internal',\n options: {\n layout: 'radio',\n list: [\n {title: 'Internal', value: 'internal'},\n {title: 'External', value: 'external'},\n ],\n },\n }),\n defineField({\n name: 'reference',\n type: 'reference',\n title: 'Internal Link',\n to: referenceTargets,\n hidden: ({parent}) => parent?.linkType === 'external',\n }),\n defineField({\n name: 'url',\n type: 'url',\n title: 'URL',\n description:\n 'Full URL including protocol, e.g. https://example.com. Supports http, https, mailto, and tel.',\n hidden: ({parent}) => parent?.linkType === 'internal',\n validation: (rule) =>\n rule.uri({\n scheme: ['http', 'https', 'mailto', 'tel'],\n }),\n }),\n defineField({\n name: 'openInNewTab',\n type: 'boolean',\n title: 'Open in New Tab',\n initialValue: false,\n hidden: ({parent}) => parent?.linkType === 'internal',\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'linkType',\n url: 'url',\n referenceTitle: 'reference.title',\n referenceName: 'reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n\n return {\n title,\n subtitle: linkType === 'external' ? 'External link' : 'Internal link',\n }\n },\n },\n })\n },\n})\n","import {\n ALL_FIELDS_GROUP,\n type ArrayDefinition,\n defineArrayMember,\n defineField,\n defineType,\n type FieldDefinition,\n type SchemaTypeDefinition,\n} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport type PageBuilderBlock = string | (SchemaTypeDefinition & FieldDefinition)\n\ntype LookupArrayPreset = (name: string) => ArrayDefinition | undefined\n\n// Sanity rejects array members whose `type` resolves to another array. Wrap\n// array presets in an object so they can serve as page-builder members.\nfunction wrapArrayAsPageBuilderBlock(arraySchema: ArrayDefinition) {\n const components = 'components' in arraySchema ? arraySchema.components : undefined\n return defineArrayMember({\n name: arraySchema.name,\n title: arraySchema.title,\n type: 'object',\n fields: [\n defineField({\n name: 'content',\n type: 'array',\n of: arraySchema.of,\n components,\n }),\n ],\n })\n}\n\nfunction toPageBuilderArrayMember(block: PageBuilderBlock, lookupArrayPreset: LookupArrayPreset) {\n if (typeof block === 'string') {\n const arrayPreset = lookupArrayPreset(block)\n if (arrayPreset) {\n return wrapArrayAsPageBuilderBlock(arrayPreset)\n }\n return defineArrayMember({type: block})\n }\n if (block.type === 'array') {\n // oxlint-disable-next-line no-unsafe-type-assertion -- discriminating on `type` does not narrow the intersected union\n return wrapArrayAsPageBuilderBlock(block as ArrayDefinition)\n }\n return defineArrayMember(block)\n}\n\n// Defer building `content.of` so by-name references resolve after every\n// `define<X>` has run. Memoised for stable array identity across reads.\nfunction defineLazyContentField(\n blocks: PageBuilderBlock[],\n lookupArrayPreset: LookupArrayPreset,\n): FieldDefinition {\n let cached: ReturnType<typeof toPageBuilderArrayMember>[] | undefined\n return defineField({\n name: 'content',\n title: 'Content',\n description:\n 'Page sections rendered in order. Add, remove, or reorder blocks to build the page.',\n group: 'main',\n type: 'array',\n get of() {\n cached ??= blocks.map((block) => toPageBuilderArrayMember(block, lookupArrayPreset))\n return cached\n },\n })\n}\n\nexport interface PageTypeConfig {\n pageBuilderBlocks?: PageBuilderBlock[]\n}\n\n// `lookupArrayPreset` is closure-injected by the registry to keep it off\n// the public `RegistryContext`. The default `pageType` below uses a no-op.\nexport function createPageType({lookupArrayPreset}: {lookupArrayPreset: LookupArrayPreset}) {\n return definePresetType<PageTypeConfig, 'document'>({\n name: 'page',\n identifier: 'core.page',\n schemaType: (config, registry) => {\n const {pageBuilderBlocks, groups, fields, ...documentConfig} = config\n\n return defineType({\n ...documentConfig,\n type: 'document',\n groups: [\n {\n ...ALL_FIELDS_GROUP,\n hidden: true,\n },\n {\n name: 'main',\n title: 'Main',\n default: true,\n },\n {\n name: 'metadata',\n title: 'Metadata',\n },\n ...(groups ?? []),\n ],\n fields: [\n defineField({\n name: 'name',\n title: 'Name',\n description: 'Used as the page title and as the source for the auto-generated slug.',\n type: 'string',\n group: 'main',\n validation: (rule) => rule.required(),\n }),\n defineField({\n name: 'slug',\n title: 'Slug',\n type: 'slug',\n group: 'main',\n options: {\n source: 'name',\n },\n }),\n defineLazyContentField(pageBuilderBlocks ?? [], lookupArrayPreset),\n registry.getPreset('seo', {\n name: 'seo',\n title: 'SEO',\n group: 'metadata',\n }),\n ...(fields ?? []),\n ],\n })\n },\n })\n}\n\nexport const pageType = createPageType({lookupArrayPreset: () => undefined})\n","import {defineArrayMember, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface RichTextObjectsConfig {\n link?: boolean\n image?: boolean\n cta?: boolean\n}\n\nexport interface RichTextTypeConfig {\n /**\n * Toggle the embedded objects (link annotations, image blocks, inline CTAs).\n * Defaults to all enabled. Pass `false` to disable every object, or an\n * object to toggle individual ones (e.g. `{link: false}`).\n *\n * Each object's options (link `to`, image `altText`, …) are\n * configured on `createPresetsRegistry` and cascade into every rich text\n * field. Use `map.of` for per-field structural changes.\n */\n objects?: boolean | RichTextObjectsConfig\n}\n\nfunction resolveObjects(objects: RichTextTypeConfig['objects']): Required<RichTextObjectsConfig> {\n if (objects === false) return {link: false, image: false, cta: false}\n if (objects === true || objects === undefined) return {link: true, image: true, cta: true}\n const {link = true, image = true, cta = true} = objects\n return {link, image, cta}\n}\n\nexport const richTextType = definePresetType<RichTextTypeConfig, 'array', 'of'>({\n name: 'richText',\n identifier: 'core.richText',\n schemaType: (config, registry) => {\n const {objects, ...arrayConfig} = config\n const {link, image, cta} = resolveObjects(objects)\n\n // The annotation name must be 'link' — Portable Text Editor's built-in link UI keys off this name.\n const linkAnnotation = link\n ? registry.getPreset('link', {name: 'link', title: 'Link'})\n : undefined\n const ctaInline = cta ? registry.getPreset('cta', {name: 'cta', title: 'CTA'}) : undefined\n const imageMember = image\n ? registry.getPreset('image', {name: 'richTextImage', title: 'Image'})\n : undefined\n\n const blockMember = defineArrayMember({\n type: 'block',\n marks: {annotations: linkAnnotation ? [linkAnnotation] : []},\n ...(ctaInline && {of: [ctaInline]}),\n })\n\n return defineType({\n ...arrayConfig,\n type: 'array',\n of: imageMember ? [blockMember, imageMember] : [blockMember],\n })\n },\n})\n","import {getImageDimensions} from '@sanity/asset-utils'\nimport {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const seoType = definePresetType<{}, 'object'>({\n name: 'seo',\n identifier: 'core.seo',\n schemaType: (config) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'title',\n title: 'Title',\n type: 'string',\n validation: (rule) => rule.max(70).info('Search engines may truncate this title.'),\n }),\n defineField({\n name: 'description',\n title: 'Description',\n type: 'text',\n validation: (rule) => rule.max(150).info('Search engines may truncate this description.'),\n }),\n defineField({\n name: 'ogImage',\n title: 'Open Graph image',\n type: 'image',\n description: 'Landscape 1200x630 (1.91:1)',\n options: {\n hotspot: {\n previews: [\n {\n title: 'Landscape (1.91:1)',\n aspectRatio: 1.91 / 1,\n },\n ],\n },\n },\n validation: (Rule) =>\n Rule.custom((value) => {\n if (!value?.asset?._ref) {\n return true\n }\n\n const {height, width} = getImageDimensions(value.asset?._ref)\n\n if (height !== 630 || width !== 1200) {\n return 'Open Graph images are recommended to be exactly 1200x630 (1.91:1) for the best social sharing previews.'\n }\n\n return true\n }).warning(),\n }),\n ...(fields ?? []),\n ],\n })\n },\n})\n","import {uuid} from '@sanity/uuid'\nimport {type ComponentType} from 'react'\nimport type {ArrayDefinition, FieldDefinition, InputProps, SchemaTypeDefinition} from 'sanity'\n\nimport {PresetsTelemetryCollector} from './components/PresetsTelemetryCollector'\nimport type {\n AnyPresetDefinition,\n PresetDefinition,\n RegistryContext,\n UserConfig,\n} from './definePresetType'\nimport {ctaType} from './presets/cta-type'\nimport {imageType, type ImageTypeConfig} from './presets/image-type'\nimport {linkType, type LinkTypeConfig} from './presets/link-type'\nimport {createPageType, pageType, type PageTypeConfig} from './presets/page-type'\nimport {richTextType} from './presets/rich-text-type'\nimport {seoType} from './presets/seo-type'\nimport {recordPresetUsage, registerRegistry} from './telemetry'\n\nexport interface PresetsRegistryConfig {\n link?: LinkTypeConfig\n image?: ImageTypeConfig\n page?: PageTypeConfig\n}\n\ntype DefineFunction<Preset extends AnyPresetDefinition> =\n Preset extends PresetDefinition<infer Context, infer AliasedType, infer LockedProperties>\n ? (\n config: UserConfig<Context, AliasedType, LockedProperties>,\n ) => SchemaTypeDefinition & FieldDefinition\n : never\n\nexport interface PresetsRegistry {\n defineLink: DefineFunction<typeof linkType>\n defineCta: DefineFunction<typeof ctaType>\n defineSeo: DefineFunction<typeof seoType>\n defineImage: DefineFunction<typeof imageType>\n definePage: DefineFunction<typeof pageType>\n defineRichText: DefineFunction<typeof richTextType>\n}\n\nexport function createPresetsRegistry(config: PresetsRegistryConfig = {}): PresetsRegistry {\n const registryId = uuid()\n registerRegistry(registryId)\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- seeding reduce with an empty object that is populated by each iteration\n const seed = {} as DefinerRecord & PresetsRegistry\n\n // Tracks the schema produced under each defined preset name so `pageType`\n // can resolve string references in `pageBuilderBlocks` regardless of\n // definition order, and wrap array-typed presets at the page builder\n // boundary. Closure-injected into `pageType` via `createPageType` so it\n // does not need to live on the public `RegistryContext`.\n const registeredSchemas = new Map<string, SchemaTypeDefinition>()\n const pageTypeWithLookup = createPageType({\n lookupArrayPreset: (name) => {\n const registered = registeredSchemas.get(name)\n // oxlint-disable-next-line no-unsafe-type-assertion -- discriminating on `type` does not narrow the intersected union\n return registered?.type === 'array' ? (registered as ArrayDefinition) : undefined\n },\n })\n\n const systemPresets = [\n linkType,\n ctaType,\n seoType,\n imageType,\n pageTypeWithLookup,\n richTextType,\n ] as const\n\n return systemPresets.reduce((registry, preset) => {\n const key = getPresetKey(preset.name)\n registry[key] = createDefiner({registryId, preset, config, registry, registeredSchemas})\n return registry\n }, seed)\n}\n\nexport function getPresetKey(name: string): string {\n return `define${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\ntype Definer = (config?: Record<string, unknown>) => SchemaTypeDefinition & FieldDefinition\ntype DefinerRecord = Record<string, Definer>\n\nfunction createRegistryContext({registry}: {registry: DefinerRecord}): RegistryContext {\n return {\n getPreset: (name, presetConfig) => {\n const key = getPresetKey(name)\n const definer = registry[key]\n if (!definer) {\n throw new Error(`Cannot resolve preset \"${name}\". No such preset in this registry.`)\n }\n return definer(presetConfig)\n },\n }\n}\n\ninterface CreateDefinerOptions {\n registryId: string\n preset: AnyPresetDefinition\n config: PresetsRegistryConfig\n registry: DefinerRecord\n registeredSchemas: Map<string, SchemaTypeDefinition>\n}\n\nfunction createDefiner({\n registryId,\n preset,\n config,\n registry,\n registeredSchemas,\n}: CreateDefinerOptions): Definer {\n return function define(userConfig = {}) {\n const name = userConfig['name']\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error(\n `${getPresetKey(preset.name)}: \"name\" is required. Pass {name: \"yourTypeName\"}.`,\n )\n }\n\n recordPresetUsage(registryId, preset.identifier ?? 'unnamed')\n\n const registryContext = createRegistryContext({registry})\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- PresetsRegistryConfig is keyed by preset name; dynamic lookup is safe\n const registryDefaults = (config as Record<string, unknown>)[preset.name]\n const mergedConfig: Record<string, unknown> = {\n ...(typeof registryDefaults === 'object' && registryDefaults !== null\n ? registryDefaults\n : {}),\n ...userConfig,\n }\n\n const {map, ...factoryConfig} = mergedConfig\n\n const schemaType = preset.schemaType(\n // oxlint-disable-next-line no-unsafe-type-assertion -- factoryConfig is the merged user config (minus `map`, with `name` injected); its shape matches the factory's expected parameter at runtime\n factoryConfig as unknown as Parameters<AnyPresetDefinition['schemaType']>[0],\n registryContext,\n )\n\n registeredSchemas.set(name, schemaType)\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- runtime value is a valid field definition\n return applyMapHooks(\n addTelemetryComponent(schemaType, registryId),\n map,\n ) as SchemaTypeDefinition & FieldDefinition\n }\n}\n\nfunction applyMapHooks(schemaType: SchemaTypeDefinition, map: unknown): SchemaTypeDefinition {\n if (!map || typeof map !== 'object') return schemaType\n\n const mappedSchemaType: Record<string, unknown> = {}\n\n for (const [configName, configValue] of Object.entries(map)) {\n if (typeof configValue !== 'function') {\n continue\n }\n\n mappedSchemaType[configName] = configValue(\n // oxlint-disable-next-line no-unsafe-type-assertion -- map hooks operate on arbitrary schema type properties\n schemaType[configName as keyof typeof schemaType],\n )\n }\n\n return {...schemaType, ...mappedSchemaType}\n}\n\nfunction addTelemetryComponent(\n schemaType: SchemaTypeDefinition,\n registryId: string,\n): SchemaTypeDefinition {\n const existing = 'components' in schemaType ? schemaType.components : undefined\n const existingInput =\n existing && 'input' in existing && typeof existing.input === 'function'\n ? // oxlint-disable-next-line no-unsafe-type-assertion -- presets only produce object/document schema types, whose input components are assignable to ComponentType<InputProps>\n (existing.input as ComponentType<InputProps>)\n : undefined\n // oxlint-disable-next-line no-unsafe-type-assertion -- spreading a discriminated union loses the discriminant; the runtime shape is still a valid SchemaTypeDefinition\n return {\n ...schemaType,\n components: {\n ...existing,\n input: (props: InputProps) => (\n <PresetsTelemetryCollector {...props} registryId={registryId} userInput={existingInput} />\n ),\n },\n } as SchemaTypeDefinition\n}\n\n// Re-export for consumers that previously used these types.\nexport type {PresetDefinition, AnyPresetDefinition}\n"],"names":["PresetsAdded","defineEvent","name","version","description","registries","Map","registerRegistry","id","set","presets","Set","logged","recordPresetUsage","registryId","identifier","get","add","collectPresetsRegistryTelemetry","telemetry","record","size","log","presetNames","PresetsTelemetryCollector","t0","$","_c","userInput","UserInput","props","useTelemetry","t1","t2","useEffect","renderDefault","ctaType","schemaType","config","registry","fields","objectConfig","defineType","type","getPreset","title","defineField","options","layout","list","preview","select","linkType","url","referenceTitle","referenceName","prepare","subtitle","imageType","altText","caption","hotspot","imageConfig","validation","rule","warning","normalizeToTargets","entries","map","entry","to","referenceTargets","initialValue","value","hidden","parent","uri","scheme","wrapArrayAsPageBuilderBlock","arraySchema","components","undefined","defineArrayMember","of","toPageBuilderArrayMember","block","lookupArrayPreset","arrayPreset","defineLazyContentField","blocks","cached","group","createPageType","pageBuilderBlocks","groups","documentConfig","ALL_FIELDS_GROUP","default","required","source","resolveObjects","objects","link","image","cta","richTextType","arrayConfig","linkAnnotation","ctaInline","imageMember","blockMember","marks","annotations","seoType","max","info","previews","aspectRatio","Rule","custom","asset","_ref","height","width","getImageDimensions","createPresetsRegistry","uuid","seed","registeredSchemas","pageTypeWithLookup","registered","reduce","preset","key","getPresetKey","createDefiner","charAt","toUpperCase","slice","createRegistryContext","presetConfig","definer","Error","userConfig","length","registryContext","registryDefaults","mergedConfig","factoryConfig","applyMapHooks","addTelemetryComponent","mappedSchemaType","configName","configValue","Object","existing","existingInput","input"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["defineEvent","PresetsAddedInfo","presetNames","PresetsAdded","name","version","description","PresetsAdded","TelemetryLog","log","event","data","RegistryRecord","id","presets","Set","logged","registries","Map","registerRegistry","set","recordPresetUsage","registryId","identifier","get","add","collectPresetsRegistryTelemetry","telemetry","record","size","presetNames","resetRegistries","clear","useTelemetry","useEffect","ComponentType","InputProps","collectPresetsRegistryTelemetry","Props","registryId","userInput","PresetsTelemetryCollector","t0","$","_c","UserInput","props","telemetry","t1","t2","renderDefault","FieldDefinition","FieldDefinitionBase","IntrinsicTypeName","SchemaTypeDefinition","PartialSchemaDefinition","RegistryContext","getPreset","presetName","config","Record","ProhibitedProperties","SanitizeProperties","ExcludedProperties","PropertyKey","Omit","Properties","DerivedConfig","Context","AliasedType","LockedProperties","map","input","Key","UserConfig","PresetDefinition","name","identifier","schemaType","registry","definePresetType","preset","AnyPresetDefinition","defineField","defineType","definePresetType","ctaType","name","identifier","schemaType","config","registry","fields","objectConfig","type","getPreset","title","description","options","layout","list","preview","select","linkType","url","referenceTitle","referenceName","prepare","referenceLabel","subtitle","defineField","defineType","definePresetType","ImageTypeConfig","altText","caption","hotspot","imageType","name","identifier","schemaType","config","fields","imageConfig","type","options","title","description","validation","rule","warning","preview","select","defineField","defineType","definePresetType","LinkToEntry","type","LinkTypeConfig","to","normalizeToTargets","entries","map","entry","linkType","name","identifier","schemaType","fields","objectConfig","referenceTargets","title","description","initialValue","options","layout","list","value","hidden","parent","validation","rule","uri","scheme","preview","select","url","referenceTitle","referenceName","prepare","referenceLabel","subtitle","ALL_FIELDS_GROUP","ArrayDefinition","defineArrayMember","defineField","defineType","FieldDefinition","SchemaTypeDefinition","definePresetType","PageBuilderBlock","LookupArrayPreset","name","wrapArrayAsPageBuilderBlock","arraySchema","components","undefined","title","type","fields","of","toPageBuilderArrayMember","block","lookupArrayPreset","arrayPreset","defineLazyContentField","blocks","cached","ReturnType","description","group","map","PageTypeConfig","pageBuilderBlocks","createPageType","identifier","schemaType","config","registry","groups","documentConfig","hidden","default","validation","rule","required","options","source","getPreset","pageType","defineArrayMember","defineType","definePresetType","RichTextObjectsConfig","link","image","cta","RichTextTypeConfig","objects","resolveObjects","Required","undefined","richTextType","name","identifier","schemaType","config","registry","arrayConfig","linkAnnotation","getPreset","title","ctaInline","imageMember","blockMember","type","marks","annotations","of","getImageDimensions","defineField","defineType","definePresetType","seoType","name","identifier","schemaType","config","fields","objectConfig","type","title","validation","rule","max","info","description","options","hotspot","previews","aspectRatio","Rule","custom","value","asset","_ref","height","width","warning","uuid","ComponentType","ArrayDefinition","FieldDefinition","InputProps","SchemaTypeDefinition","PresetsTelemetryCollector","AnyPresetDefinition","PresetDefinition","RegistryContext","UserConfig","ctaType","imageType","ImageTypeConfig","linkType","LinkTypeConfig","createPageType","pageType","PageTypeConfig","richTextType","seoType","recordPresetUsage","registerRegistry","PresetsRegistryConfig","link","image","page","DefineFunction","Preset","config","Context","AliasedType","LockedProperties","PresetsRegistry","defineLink","defineCta","defineSeo","defineImage","definePage","defineRichText","createPresetsRegistry","registryId","seed","DefinerRecord","registeredSchemas","Map","pageTypeWithLookup","lookupArrayPreset","name","registered","get","type","undefined","systemPresets","const","reduce","registry","preset","key","getPresetKey","createDefiner","charAt","toUpperCase","slice","Definer","Record","createRegistryContext","getPreset","presetConfig","definer","Error","CreateDefinerOptions","define","userConfig","length","identifier","registryContext","registryDefaults","mergedConfig","map","factoryConfig","schemaType","Parameters","set","applyMapHooks","addTelemetryComponent","mappedSchemaType","configName","configValue","Object","entries","existing","components","existingInput","input","props"],"sources":["../src/__telemetry__/presets.telemetry.ts","../src/telemetry.ts","../src/components/PresetsTelemetryCollector.tsx","../src/definePresetType.ts","../src/presets/cta-type/index.ts","../src/presets/image-type/index.ts","../src/presets/link-type/index.ts","../src/presets/page-type/index.ts","../src/presets/rich-text-type/index.ts","../src/presets/seo-type/index.ts","../src/registry.tsx"],"sourcesContent":["import {defineEvent} from '@sanity/telemetry'\n\ninterface PresetsAddedInfo {\n presetNames: string[]\n}\n\nexport const PresetsAdded = defineEvent<PresetsAddedInfo>({\n name: 'Presets Added',\n version: 1,\n description: 'Workspace using presets was accessed',\n})\n","import {PresetsAdded} from './__telemetry__/presets.telemetry'\n\n/**\n * Minimal interface for the subset of TelemetryLogger we need.\n * Avoids forcing callers to satisfy the full generic TelemetryLogger type.\n */\nexport interface TelemetryLog {\n log(event: unknown, data: unknown): void\n}\n\ninterface RegistryRecord {\n id: string\n presets: Set<string>\n logged: boolean\n}\n\nconst registries = new Map<string, RegistryRecord>()\n\nexport function registerRegistry(id: string): void {\n registries.set(id, {id, presets: new Set(), logged: false})\n}\n\nexport function recordPresetUsage(registryId: string, identifier: string): void {\n registries.get(registryId)?.presets.add(identifier)\n}\n\nexport function collectPresetsRegistryTelemetry(registryId: string, telemetry: TelemetryLog): void {\n const record = registries.get(registryId)\n if (!record || record.logged) return\n record.logged = true\n if (record.presets.size > 0) {\n telemetry.log(PresetsAdded, {presetNames: [...record.presets]})\n }\n}\n\n/** @internal */\nexport function resetRegistries(): void {\n registries.clear()\n}\n","import {useTelemetry} from '@sanity/telemetry/react'\nimport {useEffect, type ComponentType} from 'react'\nimport type {InputProps} from 'sanity'\n\nimport {collectPresetsRegistryTelemetry} from '../telemetry'\n\ntype Props = InputProps & {\n registryId: string\n userInput?: ComponentType<InputProps>\n}\n\n/**\n * A transparent input component wrapper that triggers telemetry collection\n * for the presets registry. Renders the user-provided input component if\n * supplied, otherwise the default input component unchanged.\n *\n * Attached to every schema type produced by a define<Type> function via\n * components.input. The first instance to render for a given registry id\n * submits the PresetsAdded telemetry event; subsequent renders are no-ops.\n */\nexport const PresetsTelemetryCollector: ComponentType<Props> = ({\n registryId,\n userInput: UserInput,\n ...props\n}) => {\n const telemetry = useTelemetry()\n\n useEffect(() => {\n collectPresetsRegistryTelemetry(registryId, telemetry)\n }, [registryId, telemetry])\n\n if (UserInput) {\n return <UserInput {...props} />\n }\n\n return props.renderDefault(props)\n}\n","import type {\n FieldDefinition,\n FieldDefinitionBase,\n IntrinsicTypeName,\n SchemaTypeDefinition,\n} from 'sanity'\n\nimport type {PartialSchemaDefinition} from './types'\n\nexport interface RegistryContext {\n getPreset: (\n presetName: string,\n config?: Record<string, unknown>,\n ) => SchemaTypeDefinition & FieldDefinition\n}\n\ntype ProhibitedProperties = 'type'\n\ntype SanitizeProperties<Properties, ExcludedProperties extends string | undefined> = [\n ExcludedProperties,\n] extends [PropertyKey]\n ? Omit<Properties, ExcludedProperties>\n : Properties\n\nexport type DerivedConfig<\n Context,\n AliasedType extends IntrinsicTypeName | undefined = undefined,\n LockedProperties extends string | undefined = undefined,\n> = Context &\n FieldDefinitionBase &\n (AliasedType extends string\n ? SanitizeProperties<\n PartialSchemaDefinition<AliasedType>,\n ProhibitedProperties | LockedProperties\n >\n : {}) & {\n map?: AliasedType extends string\n ? {\n [Key in keyof PartialSchemaDefinition<AliasedType>]?: (\n input: PartialSchemaDefinition<AliasedType>[Key],\n ) => PartialSchemaDefinition<AliasedType>[Key]\n }\n : {}\n }\n\n/**\n * The public-facing config shape that a registry's `define<Name>` function\n * accepts at the call site. Includes the full `DerivedConfig` with required\n * `name` (inherited from `FieldDefinitionBase`) and optional `map`.\n */\nexport type UserConfig<\n Context = {},\n AliasedType extends IntrinsicTypeName | undefined = undefined,\n LockedProperties extends string | undefined = undefined,\n> = DerivedConfig<Context, AliasedType, LockedProperties>\n\n/**\n * A preset definition describes how to produce a Sanity schema type.\n *\n * - `name` is the registry key for the preset (it determines the\n * `define<Name>` function and the `PresetsRegistryConfig` key).\n * - `identifier` is an optional stable identifier used for telemetry.\n * - `schemaType` is the factory that produces the Sanity schema type. It\n * receives the merged config (minus `map`) and the registry context, and\n * returns a `SchemaTypeDefinition`.\n */\nexport interface PresetDefinition<\n Context = {},\n AliasedType extends IntrinsicTypeName | undefined = undefined,\n LockedProperties extends string | undefined = undefined,\n> {\n name: string\n identifier?: string\n schemaType: (\n config: Omit<DerivedConfig<Context, AliasedType, LockedProperties>, 'map' | 'name'> & {\n name: string\n },\n registry: RegistryContext,\n ) => SchemaTypeDefinition\n}\n\n/**\n * A typed passthrough for defining a preset. Given a `PresetDefinition`, it\n * returns the same value, narrowed to its concrete generic parameters so\n * downstream code can infer the preset's config type from it.\n *\n * This is intentionally lightweight: it performs no work at call time. The\n * registry is responsible for invoking `schemaType` when a preset is\n * instantiated, and for applying `map` hooks to the produced schema type.\n */\nexport function definePresetType<\n Context = {},\n AliasedType extends IntrinsicTypeName | undefined = undefined,\n LockedProperties extends string | undefined = undefined,\n>(\n preset: PresetDefinition<Context, AliasedType, LockedProperties>,\n): PresetDefinition<Context, AliasedType, LockedProperties> {\n return preset\n}\n\n/**\n * A preset definition with its generic parameters erased, for use in code\n * that handles presets generically (e.g. the registry).\n */\nexport type AnyPresetDefinition = PresetDefinition<any, any, any>\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const ctaType = definePresetType<{}, 'object', 'preview'>({\n name: 'cta',\n identifier: 'core.cta',\n schemaType: (config, registry) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n registry.getPreset('link', {name: 'link', title: 'Link'}),\n defineField({\n name: 'level',\n title: 'Level',\n description:\n 'The importance of the action relative to its siblings: level 1 being the primary action, 2 the secondary action, and so on.',\n type: 'number',\n options: {\n layout: 'radio',\n list: [1, 2, 3],\n },\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'link.linkType',\n url: 'link.url',\n referenceTitle: 'link.reference.title',\n referenceName: 'link.reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n return {title, subtitle: 'Button'}\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface ImageTypeConfig {\n altText?: boolean\n caption?: boolean\n hotspot?: boolean\n}\n\nexport const imageType = definePresetType<ImageTypeConfig, 'image', 'preview'>({\n name: 'image',\n identifier: 'core.image',\n schemaType: (config) => {\n const {altText = true, caption = true, hotspot = true, fields, ...imageConfig} = config\n\n return defineType({\n ...imageConfig,\n type: 'image',\n // hotspot is the curated default; callers override other image options (accept, sources, storeOriginalFilename) via the map.options hook\n options: {\n hotspot,\n },\n fields: [\n ...(altText\n ? [\n defineField({\n name: 'altText',\n title: 'Alt text',\n description:\n 'Describes the image for screen readers and search engines. Important for accessibility.',\n type: 'string',\n validation: (rule) => rule.warning('Alt text improves accessibility.'),\n }),\n ]\n : []),\n ...(caption\n ? [\n defineField({\n name: 'caption',\n title: 'Caption',\n type: 'text',\n }),\n ]\n : []),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n title: altText ? 'altText' : caption ? 'caption' : 'asset.originalFilename',\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\ntype LinkToEntry = string | {type: string}\n\nexport interface LinkTypeConfig {\n to?: LinkToEntry[]\n}\n\nfunction normalizeToTargets(entries: LinkToEntry[]): {type: string}[] {\n return entries.map((entry) => (typeof entry === 'string' ? {type: entry} : entry))\n}\n\nexport const linkType = definePresetType<LinkTypeConfig, 'object', 'preview'>({\n name: 'link',\n identifier: 'core.link',\n schemaType: ({to, fields, ...objectConfig}) => {\n const referenceTargets = normalizeToTargets(to ?? [])\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'linkType',\n type: 'string',\n title: 'Link Type',\n description:\n 'Internal links point to a page in this project. External links point to a full URL.',\n initialValue: 'internal',\n options: {\n layout: 'radio',\n list: [\n {title: 'Internal', value: 'internal'},\n {title: 'External', value: 'external'},\n ],\n },\n }),\n defineField({\n name: 'reference',\n type: 'reference',\n title: 'Internal Link',\n to: referenceTargets,\n hidden: ({parent}) => parent?.linkType === 'external',\n }),\n defineField({\n name: 'url',\n type: 'url',\n title: 'URL',\n description:\n 'Full URL including protocol, e.g. https://example.com. Supports http, https, mailto, and tel.',\n hidden: ({parent}) => parent?.linkType === 'internal',\n validation: (rule) =>\n rule.uri({\n scheme: ['http', 'https', 'mailto', 'tel'],\n }),\n }),\n defineField({\n name: 'openInNewTab',\n type: 'boolean',\n title: 'Open in New Tab',\n initialValue: false,\n hidden: ({parent}) => parent?.linkType === 'internal',\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'linkType',\n url: 'url',\n referenceTitle: 'reference.title',\n referenceName: 'reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n\n return {\n title,\n subtitle: linkType === 'external' ? 'External link' : 'Internal link',\n }\n },\n },\n })\n },\n})\n","import {\n ALL_FIELDS_GROUP,\n type ArrayDefinition,\n defineArrayMember,\n defineField,\n defineType,\n type FieldDefinition,\n type SchemaTypeDefinition,\n} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport type PageBuilderBlock = string | (SchemaTypeDefinition & FieldDefinition)\n\ntype LookupArrayPreset = (name: string) => ArrayDefinition | undefined\n\n// Sanity rejects array members whose `type` resolves to another array. Wrap\n// array presets in an object so they can serve as page-builder members.\nfunction wrapArrayAsPageBuilderBlock(arraySchema: ArrayDefinition) {\n const components = 'components' in arraySchema ? arraySchema.components : undefined\n return defineArrayMember({\n name: arraySchema.name,\n title: arraySchema.title,\n type: 'object',\n fields: [\n defineField({\n name: 'content',\n type: 'array',\n of: arraySchema.of,\n components,\n }),\n ],\n })\n}\n\nfunction toPageBuilderArrayMember(block: PageBuilderBlock, lookupArrayPreset: LookupArrayPreset) {\n if (typeof block === 'string') {\n const arrayPreset = lookupArrayPreset(block)\n if (arrayPreset) {\n return wrapArrayAsPageBuilderBlock(arrayPreset)\n }\n return defineArrayMember({type: block})\n }\n if (block.type === 'array') {\n // oxlint-disable-next-line no-unsafe-type-assertion -- discriminating on `type` does not narrow the intersected union\n return wrapArrayAsPageBuilderBlock(block as ArrayDefinition)\n }\n return defineArrayMember(block)\n}\n\n// Defer building `content.of` so by-name references resolve after every\n// `define<X>` has run. Memoised for stable array identity across reads.\nfunction defineLazyContentField(\n blocks: PageBuilderBlock[],\n lookupArrayPreset: LookupArrayPreset,\n): FieldDefinition {\n let cached: ReturnType<typeof toPageBuilderArrayMember>[] | undefined\n return defineField({\n name: 'content',\n title: 'Content',\n description:\n 'Page sections rendered in order. Add, remove, or reorder blocks to build the page.',\n group: 'main',\n type: 'array',\n get of() {\n cached ??= blocks.map((block) => toPageBuilderArrayMember(block, lookupArrayPreset))\n return cached\n },\n })\n}\n\nexport interface PageTypeConfig {\n pageBuilderBlocks?: PageBuilderBlock[]\n}\n\n// `lookupArrayPreset` is closure-injected by the registry to keep it off\n// the public `RegistryContext`. The default `pageType` below uses a no-op.\nexport function createPageType({lookupArrayPreset}: {lookupArrayPreset: LookupArrayPreset}) {\n return definePresetType<PageTypeConfig, 'document'>({\n name: 'page',\n identifier: 'core.page',\n schemaType: (config, registry) => {\n const {pageBuilderBlocks, groups, fields, ...documentConfig} = config\n\n return defineType({\n ...documentConfig,\n type: 'document',\n groups: [\n {\n ...ALL_FIELDS_GROUP,\n hidden: true,\n },\n {\n name: 'main',\n title: 'Main',\n default: true,\n },\n {\n name: 'metadata',\n title: 'Metadata',\n },\n ...(groups ?? []),\n ],\n fields: [\n defineField({\n name: 'name',\n title: 'Name',\n description: 'Used as the page title and as the source for the auto-generated slug.',\n type: 'string',\n group: 'main',\n validation: (rule) => rule.required(),\n }),\n defineField({\n name: 'slug',\n title: 'Slug',\n type: 'slug',\n group: 'main',\n options: {\n source: 'name',\n },\n }),\n defineLazyContentField(pageBuilderBlocks ?? [], lookupArrayPreset),\n registry.getPreset('seo', {\n name: 'seo',\n title: 'SEO',\n group: 'metadata',\n }),\n ...(fields ?? []),\n ],\n })\n },\n })\n}\n\nexport const pageType = createPageType({lookupArrayPreset: () => undefined})\n","import {defineArrayMember, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface RichTextObjectsConfig {\n link?: boolean\n image?: boolean\n cta?: boolean\n}\n\nexport interface RichTextTypeConfig {\n /**\n * Toggle the embedded objects (link annotations, image blocks, inline CTAs).\n * Defaults to all enabled. Pass `false` to disable every object, or an\n * object to toggle individual ones (e.g. `{link: false}`).\n *\n * Each object's options (link `to`, image `altText`, …) are\n * configured on `createPresetsRegistry` and cascade into every rich text\n * field. Use `map.of` for per-field structural changes.\n */\n objects?: boolean | RichTextObjectsConfig\n}\n\nfunction resolveObjects(objects: RichTextTypeConfig['objects']): Required<RichTextObjectsConfig> {\n if (objects === false) return {link: false, image: false, cta: false}\n if (objects === true || objects === undefined) return {link: true, image: true, cta: true}\n const {link = true, image = true, cta = true} = objects\n return {link, image, cta}\n}\n\nexport const richTextType = definePresetType<RichTextTypeConfig, 'array', 'of'>({\n name: 'richText',\n identifier: 'core.richText',\n schemaType: (config, registry) => {\n const {objects, ...arrayConfig} = config\n const {link, image, cta} = resolveObjects(objects)\n\n // The annotation name must be 'link' — Portable Text Editor's built-in link UI keys off this name.\n const linkAnnotation = link\n ? registry.getPreset('link', {name: 'link', title: 'Link'})\n : undefined\n const ctaInline = cta ? registry.getPreset('cta', {name: 'cta', title: 'CTA'}) : undefined\n const imageMember = image\n ? registry.getPreset('image', {name: 'richTextImage', title: 'Image'})\n : undefined\n\n const blockMember = defineArrayMember({\n type: 'block',\n marks: {annotations: linkAnnotation ? [linkAnnotation] : []},\n ...(ctaInline && {of: [ctaInline]}),\n })\n\n return defineType({\n ...arrayConfig,\n type: 'array',\n of: imageMember ? [blockMember, imageMember] : [blockMember],\n })\n },\n})\n","import {getImageDimensions} from '@sanity/asset-utils'\nimport {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const seoType = definePresetType<{}, 'object'>({\n name: 'seo',\n identifier: 'core.seo',\n schemaType: (config) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'title',\n title: 'Title',\n type: 'string',\n validation: (rule) => rule.max(70).info('Search engines may truncate this title.'),\n }),\n defineField({\n name: 'description',\n title: 'Description',\n type: 'text',\n validation: (rule) => rule.max(150).info('Search engines may truncate this description.'),\n }),\n defineField({\n name: 'ogImage',\n title: 'Open Graph image',\n type: 'image',\n description: 'Landscape 1200x630 (1.91:1)',\n options: {\n hotspot: {\n previews: [\n {\n title: 'Landscape (1.91:1)',\n aspectRatio: 1.91 / 1,\n },\n ],\n },\n },\n validation: (Rule) =>\n Rule.custom((value) => {\n if (!value?.asset?._ref) {\n return true\n }\n\n const {height, width} = getImageDimensions(value.asset?._ref)\n\n if (height !== 630 || width !== 1200) {\n return 'Open Graph images are recommended to be exactly 1200x630 (1.91:1) for the best social sharing previews.'\n }\n\n return true\n }).warning(),\n }),\n ...(fields ?? []),\n ],\n })\n },\n})\n","import {uuid} from '@sanity/uuid'\nimport {type ComponentType} from 'react'\nimport type {ArrayDefinition, FieldDefinition, InputProps, SchemaTypeDefinition} from 'sanity'\n\nimport {PresetsTelemetryCollector} from './components/PresetsTelemetryCollector'\nimport type {\n AnyPresetDefinition,\n PresetDefinition,\n RegistryContext,\n UserConfig,\n} from './definePresetType'\nimport {ctaType} from './presets/cta-type'\nimport {imageType, type ImageTypeConfig} from './presets/image-type'\nimport {linkType, type LinkTypeConfig} from './presets/link-type'\nimport {createPageType, pageType, type PageTypeConfig} from './presets/page-type'\nimport {richTextType} from './presets/rich-text-type'\nimport {seoType} from './presets/seo-type'\nimport {recordPresetUsage, registerRegistry} from './telemetry'\n\nexport interface PresetsRegistryConfig {\n link?: LinkTypeConfig\n image?: ImageTypeConfig\n page?: PageTypeConfig\n}\n\ntype DefineFunction<Preset extends AnyPresetDefinition> =\n Preset extends PresetDefinition<infer Context, infer AliasedType, infer LockedProperties>\n ? (\n config: UserConfig<Context, AliasedType, LockedProperties>,\n ) => SchemaTypeDefinition & FieldDefinition\n : never\n\nexport interface PresetsRegistry {\n defineLink: DefineFunction<typeof linkType>\n defineCta: DefineFunction<typeof ctaType>\n defineSeo: DefineFunction<typeof seoType>\n defineImage: DefineFunction<typeof imageType>\n definePage: DefineFunction<typeof pageType>\n defineRichText: DefineFunction<typeof richTextType>\n}\n\nexport function createPresetsRegistry(config: PresetsRegistryConfig = {}): PresetsRegistry {\n const registryId = uuid()\n registerRegistry(registryId)\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- seeding reduce with an empty object that is populated by each iteration\n const seed = {} as DefinerRecord & PresetsRegistry\n\n // Tracks the schema produced under each defined preset name so `pageType`\n // can resolve string references in `pageBuilderBlocks` regardless of\n // definition order, and wrap array-typed presets at the page builder\n // boundary. Closure-injected into `pageType` via `createPageType` so it\n // does not need to live on the public `RegistryContext`.\n const registeredSchemas = new Map<string, SchemaTypeDefinition>()\n const pageTypeWithLookup = createPageType({\n lookupArrayPreset: (name) => {\n const registered = registeredSchemas.get(name)\n // oxlint-disable-next-line no-unsafe-type-assertion -- discriminating on `type` does not narrow the intersected union\n return registered?.type === 'array' ? (registered as ArrayDefinition) : undefined\n },\n })\n\n const systemPresets = [\n linkType,\n ctaType,\n seoType,\n imageType,\n pageTypeWithLookup,\n richTextType,\n ] as const\n\n return systemPresets.reduce((registry, preset) => {\n const key = getPresetKey(preset.name)\n registry[key] = createDefiner({registryId, preset, config, registry, registeredSchemas})\n return registry\n }, seed)\n}\n\nexport function getPresetKey(name: string): string {\n return `define${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\ntype Definer = (config?: Record<string, unknown>) => SchemaTypeDefinition & FieldDefinition\ntype DefinerRecord = Record<string, Definer>\n\nfunction createRegistryContext({registry}: {registry: DefinerRecord}): RegistryContext {\n return {\n getPreset: (name, presetConfig) => {\n const key = getPresetKey(name)\n const definer = registry[key]\n if (!definer) {\n throw new Error(`Cannot resolve preset \"${name}\". No such preset in this registry.`)\n }\n return definer(presetConfig)\n },\n }\n}\n\ninterface CreateDefinerOptions {\n registryId: string\n preset: AnyPresetDefinition\n config: PresetsRegistryConfig\n registry: DefinerRecord\n registeredSchemas: Map<string, SchemaTypeDefinition>\n}\n\nfunction createDefiner({\n registryId,\n preset,\n config,\n registry,\n registeredSchemas,\n}: CreateDefinerOptions): Definer {\n return function define(userConfig = {}) {\n const name = userConfig['name']\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error(\n `${getPresetKey(preset.name)}: \"name\" is required. Pass {name: \"yourTypeName\"}.`,\n )\n }\n\n recordPresetUsage(registryId, preset.identifier ?? 'unnamed')\n\n const registryContext = createRegistryContext({registry})\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- PresetsRegistryConfig is keyed by preset name; dynamic lookup is safe\n const registryDefaults = (config as Record<string, unknown>)[preset.name]\n const mergedConfig: Record<string, unknown> = {\n ...(typeof registryDefaults === 'object' && registryDefaults !== null\n ? registryDefaults\n : {}),\n ...userConfig,\n }\n\n const {map, ...factoryConfig} = mergedConfig\n\n const schemaType = preset.schemaType(\n // oxlint-disable-next-line no-unsafe-type-assertion -- factoryConfig is the merged user config (minus `map`, with `name` injected); its shape matches the factory's expected parameter at runtime\n factoryConfig as unknown as Parameters<AnyPresetDefinition['schemaType']>[0],\n registryContext,\n )\n\n registeredSchemas.set(name, schemaType)\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- runtime value is a valid field definition\n return applyMapHooks(\n addTelemetryComponent(schemaType, registryId),\n map,\n ) as SchemaTypeDefinition & FieldDefinition\n }\n}\n\nfunction applyMapHooks(schemaType: SchemaTypeDefinition, map: unknown): SchemaTypeDefinition {\n if (!map || typeof map !== 'object') return schemaType\n\n const mappedSchemaType: Record<string, unknown> = {}\n\n for (const [configName, configValue] of Object.entries(map)) {\n if (typeof configValue !== 'function') {\n continue\n }\n\n mappedSchemaType[configName] = configValue(\n // oxlint-disable-next-line no-unsafe-type-assertion -- map hooks operate on arbitrary schema type properties\n schemaType[configName as keyof typeof schemaType],\n )\n }\n\n return {...schemaType, ...mappedSchemaType}\n}\n\nfunction addTelemetryComponent(\n schemaType: SchemaTypeDefinition,\n registryId: string,\n): SchemaTypeDefinition {\n const existing = 'components' in schemaType ? schemaType.components : undefined\n const existingInput =\n existing && 'input' in existing && typeof existing.input === 'function'\n ? // oxlint-disable-next-line no-unsafe-type-assertion -- presets only produce object/document schema types, whose input components are assignable to ComponentType<InputProps>\n (existing.input as ComponentType<InputProps>)\n : undefined\n // oxlint-disable-next-line no-unsafe-type-assertion -- spreading a discriminated union loses the discriminant; the runtime shape is still a valid SchemaTypeDefinition\n return {\n ...schemaType,\n components: {\n ...existing,\n input: (props: InputProps) => (\n <PresetsTelemetryCollector {...props} registryId={registryId} userInput={existingInput} />\n ),\n },\n } as SchemaTypeDefinition\n}\n\n// Re-export for consumers that previously used these types.\nexport type {PresetDefinition, AnyPresetDefinition}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/presets",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Production ready preset patterns for Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
@@ -32,19 +32,20 @@
32
32
  "@sanity/uuid": "^3.0.3"
33
33
  },
34
34
  "devDependencies": {
35
- "@sanity/pkg-utils": "^10.5.8",
35
+ "@sanity/tsconfig": "^2.2.0",
36
+ "@sanity/tsdown-config": "^0.11.0",
36
37
  "@testing-library/jest-dom": "^6.9.1",
37
38
  "@testing-library/react": "^16.3.2",
38
39
  "@types/node": "^24.13.2",
39
40
  "@types/react": "^19.2.17",
40
41
  "@types/react-dom": "^19.2.3",
42
+ "babel-plugin-react-compiler": "^1.0.0",
41
43
  "jsdom": "^29.1.1",
42
44
  "react": "^19.2.7",
43
45
  "react-dom": "^19.2.7",
44
- "sanity": "^6.1.0",
45
- "styled-components": "^6.4.2",
46
- "@repo/package.config": "0.0.0",
47
- "@repo/tsconfig": "0.0.0"
46
+ "sanity": "^6.3.0",
47
+ "styled-components": "^6.4.3",
48
+ "tsdown": "^0.22.3"
48
49
  },
49
50
  "peerDependencies": {
50
51
  "react": "^19.2",
@@ -55,6 +56,6 @@
55
56
  "node": ">=20.19 <22 || >=22.12"
56
57
  },
57
58
  "scripts": {
58
- "build": "pkg build --strict --check --clean"
59
+ "build": "tsdown"
59
60
  }
60
61
  }