@aphexcms/cms-core 9.2.2 → 9.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/cli/generate-types.d.ts +9 -1
  2. package/dist/cli/generate-types.d.ts.map +1 -1
  3. package/dist/cli/generate-types.js +23 -17
  4. package/dist/cli/generate-types.js.map +1 -1
  5. package/dist/cli/index.js +22 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/migrate.d.ts +10 -0
  8. package/dist/cli/migrate.d.ts.map +1 -0
  9. package/dist/cli/migrate.js +105 -0
  10. package/dist/cli/migrate.js.map +1 -0
  11. package/dist/components/AdminApp.svelte +12 -0
  12. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  13. package/dist/components/admin/DocumentVersionPanel.svelte +3 -0
  14. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  15. package/dist/components/admin/MediaBrowser.svelte +0 -1
  16. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  17. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +3 -0
  18. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -1
  19. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte +3 -1
  20. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte.d.ts.map +1 -1
  21. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +3 -0
  22. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -1
  23. package/dist/components/admin/fields/richtext/RichtextField.svelte +8 -20
  24. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -1
  25. package/dist/components/admin/fields/richtext/block-defaults.d.ts +4 -0
  26. package/dist/components/admin/fields/richtext/block-defaults.d.ts.map +1 -0
  27. package/dist/components/admin/fields/richtext/block-defaults.js +8 -0
  28. package/dist/field-validation/utils.d.ts +15 -0
  29. package/dist/field-validation/utils.d.ts.map +1 -1
  30. package/dist/field-validation/utils.js +74 -0
  31. package/dist/graphql/resolvers.d.ts.map +1 -1
  32. package/dist/graphql/resolvers.js +9 -10
  33. package/dist/graphql/schema.d.ts.map +1 -1
  34. package/dist/graphql/schema.js +18 -19
  35. package/dist/lib/components/admin/fields/richtext/block-defaults.d.ts +4 -0
  36. package/dist/lib/components/admin/fields/richtext/block-defaults.d.ts.map +1 -0
  37. package/dist/lib/components/admin/fields/richtext/block-defaults.js +9 -0
  38. package/dist/lib/components/admin/fields/richtext/block-defaults.js.map +1 -0
  39. package/dist/lib/field-validation/utils.d.ts +15 -0
  40. package/dist/lib/field-validation/utils.d.ts.map +1 -1
  41. package/dist/lib/field-validation/utils.js +74 -0
  42. package/dist/lib/field-validation/utils.js.map +1 -1
  43. package/dist/lib/graphql/resolvers.d.ts.map +1 -1
  44. package/dist/lib/graphql/resolvers.js +9 -10
  45. package/dist/lib/graphql/resolvers.js.map +1 -1
  46. package/dist/lib/graphql/schema.d.ts.map +1 -1
  47. package/dist/lib/graphql/schema.js +18 -19
  48. package/dist/lib/graphql/schema.js.map +1 -1
  49. package/dist/lib/mcp/tools.d.ts +28 -0
  50. package/dist/lib/mcp/tools.d.ts.map +1 -0
  51. package/dist/lib/mcp/tools.js +505 -0
  52. package/dist/lib/mcp/tools.js.map +1 -0
  53. package/dist/lib/routes/mcp.d.ts +5 -0
  54. package/dist/lib/routes/mcp.d.ts.map +1 -0
  55. package/dist/lib/routes/mcp.js +72 -0
  56. package/dist/lib/routes/mcp.js.map +1 -0
  57. package/dist/lib/schema-utils/validator.d.ts +6 -0
  58. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  59. package/dist/lib/schema-utils/validator.js +21 -15
  60. package/dist/lib/schema-utils/validator.js.map +1 -1
  61. package/dist/lib/server/index.d.ts +2 -1
  62. package/dist/lib/server/index.d.ts.map +1 -1
  63. package/dist/lib/server/index.js +4 -1
  64. package/dist/lib/server/index.js.map +1 -1
  65. package/dist/lib/utils/string-case.d.ts +21 -0
  66. package/dist/lib/utils/string-case.d.ts.map +1 -0
  67. package/dist/lib/utils/string-case.js +26 -0
  68. package/dist/lib/utils/string-case.js.map +1 -0
  69. package/dist/lib/vite/index.d.ts.map +1 -1
  70. package/dist/lib/vite/index.js +12 -1
  71. package/dist/lib/vite/index.js.map +1 -1
  72. package/dist/mcp/tools.d.ts +28 -0
  73. package/dist/mcp/tools.d.ts.map +1 -0
  74. package/dist/mcp/tools.js +504 -0
  75. package/dist/routes/mcp.d.ts +5 -0
  76. package/dist/routes/mcp.d.ts.map +1 -0
  77. package/dist/routes/mcp.js +71 -0
  78. package/dist/schema-utils/validator.d.ts +6 -0
  79. package/dist/schema-utils/validator.d.ts.map +1 -1
  80. package/dist/schema-utils/validator.js +21 -15
  81. package/dist/server/index.d.ts +2 -1
  82. package/dist/server/index.d.ts.map +1 -1
  83. package/dist/server/index.js +4 -1
  84. package/dist/utils/string-case.d.ts +21 -0
  85. package/dist/utils/string-case.d.ts.map +1 -0
  86. package/dist/utils/string-case.js +25 -0
  87. package/dist/vite/index.d.ts.map +1 -1
  88. package/dist/vite/index.js +12 -1
  89. package/package.json +4 -2
@@ -15,6 +15,21 @@ export interface DocumentValidationResult {
15
15
  * Check if a field is required based on its validation rules
16
16
  */
17
17
  export declare function isFieldRequired(field: Field): boolean;
18
+ /**
19
+ * Structural (shape) validation for a field's stored value — the depth=0 write
20
+ * shape. This catches a caller (notably an AI agent over MCP) sending the wrong
21
+ * JSON shape that presence/required checks would miss: a slug as `{ current }`
22
+ * (Sanity's convention — AphexCMS stores slugs as plain strings), or a
23
+ * reference/image missing its `_ref`. Runs before the user's Rule validation
24
+ * and only when a value is meaningfully present (absent/empty is a required-ness
25
+ * concern, handled separately), so optional and half-filled fields are left
26
+ * alone. Returns an error message, or null when the shape is acceptable.
27
+ *
28
+ * Intentionally conservative: only unambiguous mismatches error, and empty
29
+ * placeholders (`''`, an image with no `asset`) are treated as absent so the
30
+ * admin's in-progress edit states don't trip it.
31
+ */
32
+ export declare function validateValueShape(field: Field, value: unknown): string | null;
18
33
  /**
19
34
  * Validate a field value against its validation rules
20
35
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CAiID;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,CAqDnC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmC9E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CA6ID;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,CAqDnC"}
@@ -18,6 +18,69 @@ export function isFieldRequired(field) {
18
18
  return false;
19
19
  }
20
20
  }
21
+ function describeValue(value) {
22
+ if (Array.isArray(value))
23
+ return 'an array';
24
+ if (value === null)
25
+ return 'null';
26
+ if (typeof value === 'object')
27
+ return 'an object';
28
+ return `a ${typeof value}`;
29
+ }
30
+ const isPlainObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
31
+ /**
32
+ * Structural (shape) validation for a field's stored value — the depth=0 write
33
+ * shape. This catches a caller (notably an AI agent over MCP) sending the wrong
34
+ * JSON shape that presence/required checks would miss: a slug as `{ current }`
35
+ * (Sanity's convention — AphexCMS stores slugs as plain strings), or a
36
+ * reference/image missing its `_ref`. Runs before the user's Rule validation
37
+ * and only when a value is meaningfully present (absent/empty is a required-ness
38
+ * concern, handled separately), so optional and half-filled fields are left
39
+ * alone. Returns an error message, or null when the shape is acceptable.
40
+ *
41
+ * Intentionally conservative: only unambiguous mismatches error, and empty
42
+ * placeholders (`''`, an image with no `asset`) are treated as absent so the
43
+ * admin's in-progress edit states don't trip it.
44
+ */
45
+ export function validateValueShape(field, value) {
46
+ // Absent (or an empty-string placeholder for a non-string field) → shape is
47
+ // irrelevant here; presence is enforced by Rule().required().
48
+ if (value === null || value === undefined)
49
+ return null;
50
+ switch (field.type) {
51
+ case 'string':
52
+ case 'text':
53
+ case 'slug':
54
+ case 'url':
55
+ return typeof value === 'string' ? null : `expected a string, got ${describeValue(value)}`;
56
+ case 'reference':
57
+ if (value === '')
58
+ return null;
59
+ return isPlainObject(value) && typeof value._ref === 'string'
60
+ ? null
61
+ : `expected a reference object { _type: 'reference', _ref: '<documentId>' }, got ${describeValue(value)}`;
62
+ case 'image':
63
+ case 'file': {
64
+ if (value === '')
65
+ return null;
66
+ if (!isPlainObject(value))
67
+ return `expected an ${field.type} object { _type: '${field.type}', asset: { _type: 'reference', _ref: '<assetId>' } }, got ${describeValue(value)}`;
68
+ // An object with no asset yet is a valid empty/in-progress state.
69
+ if (value.asset === undefined || value.asset === null)
70
+ return null;
71
+ return isPlainObject(value.asset) && typeof value.asset._ref === 'string'
72
+ ? null
73
+ : `${field.type} asset must be { _type: 'reference', _ref: '<assetId>' }`;
74
+ }
75
+ case 'array':
76
+ return Array.isArray(value) ? null : `expected an array, got ${describeValue(value)}`;
77
+ case 'object':
78
+ return isPlainObject(value) ? null : `expected an object, got ${describeValue(value)}`;
79
+ default:
80
+ // number/boolean/date/datetime — left to existing auto-rules / user rules.
81
+ return null;
82
+ }
83
+ }
21
84
  /**
22
85
  * Validate a field value against its validation rules
23
86
  */
@@ -28,6 +91,17 @@ export async function validateField(field, value, context = {}) {
28
91
  hasValidation: !!field.validation
29
92
  });
30
93
  const allErrors = [];
94
+ // Structural shape check first: if the value is the wrong JSON shape (e.g. a
95
+ // slug sent as `{ current }`, or a reference without `_ref`), report that and
96
+ // stop — the type-assuming auto-rules and user rules below expect the correct
97
+ // primitive/shape and would otherwise throw or emit confusing errors.
98
+ const shapeError = validateValueShape(field, value);
99
+ if (shapeError) {
100
+ return {
101
+ isValid: false,
102
+ errors: [{ level: 'error', message: `Field "${field.name}" ${shapeError}` }]
103
+ };
104
+ }
31
105
  // Add automatic validation for date/datetime/url fields based on type
32
106
  if (field.type === 'date') {
33
107
  const dateField = field;
@@ -1 +1 @@
1
- {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../src/lib/graphql/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AA4H1D,wBAAgB,eAAe,CAC9B,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,UAAU,EAAE,EACzB,kBAAkB,GAAE,OAAO,GAAG,WAAyB,uBA2tBvD"}
1
+ {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../src/lib/graphql/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AAyH1D,wBAAgB,eAAe,CAC9B,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,UAAU,EAAE,EACzB,kBAAkB,GAAE,OAAO,GAAG,WAAyB,uBA4tBvD"}
@@ -2,9 +2,7 @@ import { GraphQLError } from 'graphql';
2
2
  import { authToContext } from '../local-api/auth-helpers.js';
3
3
  import { getDefaultValueForFieldType } from '../utils/field-defaults.js';
4
4
  import { cmsLogger } from '../utils/logger.js';
5
- function capitalizeFirst(str) {
6
- return str.charAt(0).toUpperCase() + str.slice(1);
7
- }
5
+ import { toPascalCase, toCamelCase } from '../utils/string-case.js';
8
6
  // Normalize null/undefined field values to type-appropriate defaults (recursive)
9
7
  function normalizeDocumentFields(data, schemaType, allSchemaTypes) {
10
8
  if (!data)
@@ -130,7 +128,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
130
128
  // Generate reference field resolvers for all types
131
129
  function generateReferenceFieldResolvers() {
132
130
  schemaTypes.forEach((schemaType) => {
133
- const typeName = capitalizeFirst(schemaType.name);
131
+ const typeName = toPascalCase(schemaType.name);
134
132
  function processFields(fields, currentTypeName) {
135
133
  fields.forEach((field) => {
136
134
  // Handle reference fields
@@ -244,7 +242,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
244
242
  }
245
243
  // Handle nested objects
246
244
  if (field.type === 'object' && field.fields) {
247
- const nestedTypeName = capitalizeFirst(`${schemaType.name}${field.name}Object`);
245
+ const nestedTypeName = toPascalCase(`${schemaType.name}${field.name}Object`);
248
246
  processFields(field.fields, nestedTypeName);
249
247
  }
250
248
  });
@@ -262,11 +260,11 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
262
260
  if (field.type === 'array' && field.of && field.of.length > 1) {
263
261
  const validTypes = field.of.filter((item) => schemaTypes.find((s) => s.name === item.type));
264
262
  if (validTypes.length > 1) {
265
- const unionName = `${capitalizeFirst(parentName)}${capitalizeFirst(field.name)}Item`;
263
+ const unionName = `${toPascalCase(parentName)}${toPascalCase(field.name)}Item`;
266
264
  resolvers[unionName] = {
267
265
  __resolveType(obj) {
268
266
  if (obj._type) {
269
- return capitalizeFirst(obj._type);
267
+ return toPascalCase(obj._type);
270
268
  }
271
269
  return null;
272
270
  }
@@ -286,7 +284,8 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
286
284
  // Generate resolvers for each document type
287
285
  const documentTypes = schemaTypes.filter((type) => type.type === 'document');
288
286
  documentTypes.forEach((schemaType) => {
289
- const typeName = capitalizeFirst(schemaType.name);
287
+ const typeName = toPascalCase(schemaType.name);
288
+ const fieldName = toCamelCase(schemaType.name);
290
289
  // Singleton resolvers: no-arg query, no-id mutations.
291
290
  // Schema/codegen already differs for singletons (see schema.ts) — the
292
291
  // resolver just delegates to the singleton-aware CollectionAPI methods.
@@ -306,7 +305,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
306
305
  ...normalizedData
307
306
  };
308
307
  };
309
- resolvers.Query[schemaType.name] = async (_, args, context) => {
308
+ resolvers.Query[fieldName] = async (_, args, context) => {
310
309
  try {
311
310
  const { localAPI, auth } = context;
312
311
  const apiContext = authToContext(auth);
@@ -404,7 +403,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
404
403
  return; // skip the regular per-type resolvers below for singletons
405
404
  }
406
405
  // Single document resolver: page(id: "123", perspective: "draft")
407
- resolvers.Query[schemaType.name] = async (_, args, context) => {
406
+ resolvers.Query[fieldName] = async (_, args, context) => {
408
407
  try {
409
408
  const { localAPI, auth } = context;
410
409
  const apiContext = authToContext(auth);
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lib/graphql/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,kBAAkB,CAAC;AA0YnG,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CA2FvE"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lib/graphql/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,kBAAkB,CAAC;AAyYnG,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CA2FvE"}
@@ -1,6 +1,4 @@
1
- function capitalizeFirst(str) {
2
- return str.charAt(0).toUpperCase() + str.slice(1);
3
- }
1
+ import { toPascalCase, toCamelCase } from '../utils/string-case.js';
4
2
  function generateGraphQLField(field, schemaTypes, parentName = '') {
5
3
  const nullability = isFieldRequired(field) ? '!' : '';
6
4
  const fieldType = getGraphQLType(field, schemaTypes, parentName);
@@ -44,7 +42,7 @@ function handleArrayField(field, schemaTypes, parentName = '') {
44
42
  const refItem = refItems[0];
45
43
  const to = refItem.to;
46
44
  if (to && to.length === 1) {
47
- return `[${capitalizeFirst(to[0].type)}]`;
45
+ return `[${toPascalCase(to[0].type)}]`;
48
46
  }
49
47
  return '[JSON]';
50
48
  }
@@ -56,22 +54,22 @@ function handleArrayField(field, schemaTypes, parentName = '') {
56
54
  // If array contains only one type
57
55
  if (validTypes.length === 1) {
58
56
  const itemType = validTypes[0];
59
- return `[${capitalizeFirst(itemType.type)}]`;
57
+ return `[${toPascalCase(itemType.type)}]`;
60
58
  }
61
59
  // For multiple types in array, create union type with parent prefix
62
- const unionName = `${capitalizeFirst(parentName)}${capitalizeFirst(field.name)}Item`;
60
+ const unionName = `${toPascalCase(parentName)}${toPascalCase(field.name)}Item`;
63
61
  return `[${unionName}]`;
64
62
  }
65
63
  function handleObjectField(field, _schemaTypes, parentName = '') {
66
64
  if (field.fields && field.fields.length > 0) {
67
65
  // Inline object - create a unique type name with parent prefix
68
- return capitalizeFirst(`${parentName}${field.name}Object`);
66
+ return toPascalCase(`${parentName}${field.name}Object`);
69
67
  }
70
68
  return 'String'; // JSON string fallback
71
69
  }
72
70
  function handleReferenceField(field) {
73
71
  if (field.to && field.to.length === 1) {
74
- return capitalizeFirst(field.to[0].type);
72
+ return toPascalCase(field.to[0].type);
75
73
  }
76
74
  return 'String'; // ID reference for MVP
77
75
  }
@@ -82,7 +80,7 @@ function isFieldRequired(field) {
82
80
  return field.validation.toString().includes('required');
83
81
  }
84
82
  function generateObjectType(schemaType, allSchemaTypes) {
85
- const typeName = capitalizeFirst(schemaType.name);
83
+ const typeName = toPascalCase(schemaType.name);
86
84
  const fields = schemaType.fields
87
85
  .map((field) => generateGraphQLField(field, allSchemaTypes, schemaType.name))
88
86
  .join('\n');
@@ -91,7 +89,7 @@ ${fields}
91
89
  }`;
92
90
  }
93
91
  function generateDocumentType(schemaType, allSchemaTypes) {
94
- const typeName = capitalizeFirst(schemaType.name);
92
+ const typeName = toPascalCase(schemaType.name);
95
93
  const customFields = schemaType.fields
96
94
  .map((field) => generateGraphQLField(field, allSchemaTypes, schemaType.name))
97
95
  .join('\n');
@@ -111,7 +109,7 @@ function generateInlineObjectTypes(schemaTypes) {
111
109
  fields.forEach((field) => {
112
110
  if (field.type === 'object' && field.fields) {
113
111
  const objectField = field;
114
- const typeName = capitalizeFirst(`${parentName}${field.name}Object`);
112
+ const typeName = toPascalCase(`${parentName}${field.name}Object`);
115
113
  const fieldDefs = objectField.fields
116
114
  .map((f) => generateGraphQLField(f, schemaTypes, `${parentName}${field.name}`))
117
115
  .join('\n');
@@ -127,8 +125,8 @@ ${fieldDefs}
127
125
  // Only create union for types that exist in schemaTypes
128
126
  const validTypes = arrayField.of.filter((item) => schemaTypes.find((s) => s.name === item.type));
129
127
  if (validTypes.length > 1) {
130
- const unionName = `${capitalizeFirst(parentName)}${capitalizeFirst(field.name)}Item`;
131
- const unionTypes = validTypes.map((item) => capitalizeFirst(item.type)).join(' | ');
128
+ const unionName = `${toPascalCase(parentName)}${toPascalCase(field.name)}Item`;
129
+ const unionTypes = validTypes.map((item) => toPascalCase(item.type)).join(' | ');
132
130
  inlineTypes.push(`union ${unionName} = ${unionTypes}`);
133
131
  }
134
132
  }
@@ -186,7 +184,7 @@ input IDFilter {
186
184
  }
187
185
  // Generate where input type for a specific document type
188
186
  function generateWhereInputType(schemaType, _allSchemaTypes) {
189
- const typeName = capitalizeFirst(schemaType.name);
187
+ const typeName = toPascalCase(schemaType.name);
190
188
  const whereTypeName = `${typeName}WhereInput`;
191
189
  // Generate field filters
192
190
  const fieldFilters = [];
@@ -223,7 +221,7 @@ function getFilterType(field) {
223
221
  }
224
222
  // Generate data input type for mutations
225
223
  function generateDataInputType(schemaType, allSchemaTypes) {
226
- const typeName = capitalizeFirst(schemaType.name);
224
+ const typeName = toPascalCase(schemaType.name);
227
225
  const inputTypeName = `${typeName}DataInput`;
228
226
  const fields = [];
229
227
  schemaType.fields.forEach((field) => {
@@ -268,16 +266,17 @@ function generateQueryFields(schemaTypes) {
268
266
  const documentTypes = schemaTypes.filter((type) => type.type === 'document');
269
267
  return documentTypes
270
268
  .map((schemaType) => {
271
- const typeName = capitalizeFirst(schemaType.name);
269
+ const typeName = toPascalCase(schemaType.name);
272
270
  // Singletons resolve to a single canonical row — no id arg, no
273
271
  // `all` query. Lazy-creates on first access via the resolver.
272
+ const fieldName = toCamelCase(schemaType.name);
274
273
  if (schemaType.singleton) {
275
274
  return ` # Get the ${schemaType.name} singleton (lazy-creates an empty draft on first access)
276
- ${schemaType.name}(perspective: String, depth: Int): ${typeName}!`;
275
+ ${fieldName}(perspective: String, depth: Int): ${typeName}!`;
277
276
  }
278
277
  const whereInputType = `${typeName}WhereInput`;
279
278
  return ` # Get a single ${schemaType.name} by ID
280
- ${schemaType.name}(id: ID!, perspective: String, depth: Int): ${typeName}
279
+ ${fieldName}(id: ID!, perspective: String, depth: Int): ${typeName}
281
280
 
282
281
  # Get all ${schemaType.name} documents with filtering
283
282
  all${typeName}(
@@ -295,7 +294,7 @@ function generateMutationFields(schemaTypes) {
295
294
  const documentTypes = schemaTypes.filter((type) => type.type === 'document');
296
295
  return documentTypes
297
296
  .map((schemaType) => {
298
- const typeName = capitalizeFirst(schemaType.name);
297
+ const typeName = toPascalCase(schemaType.name);
299
298
  const dataInputType = `${typeName}DataInput`;
300
299
  // Singletons skip create/delete/all: there's only ever one row, with
301
300
  // a deterministic id, so update/publish/unpublish operate on it
@@ -0,0 +1,4 @@
1
+ export declare const DEFAULT_BLOCK_STYLES: string[];
2
+ export declare const DEFAULT_BLOCK_DECORATORS: string[];
3
+ export declare const DEFAULT_BLOCK_LISTS: string[];
4
+ //# sourceMappingURL=block-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/components/admin/fields/richtext/block-defaults.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,oBAAoB,UAA+D,CAAC;AAEjG,eAAO,MAAM,wBAAwB,UAA0D,CAAC;AAEhG,eAAO,MAAM,mBAAmB,UAAuB,CAAC"}
@@ -0,0 +1,9 @@
1
+ // Default Portable Text block config, applied when a `{ type: 'block' }` in a
2
+ // schema omits its own `styles` / `marks.decorators` / `lists`. Single source of
3
+ // truth: the editor (RichtextField.svelte) and the MCP schema guide
4
+ // (mcp/tools.ts → portableTextGuide) both import these, so what the agent is told
5
+ // matches what the editor actually offers. Plain constants — no Svelte.
6
+ export const DEFAULT_BLOCK_STYLES = ['normal', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote'];
7
+ export const DEFAULT_BLOCK_DECORATORS = ['strong', 'em', 'underline', 'strike-through', 'code'];
8
+ export const DEFAULT_BLOCK_LISTS = ['bullet', 'number'];
9
+ //# sourceMappingURL=block-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-defaults.js","sourceRoot":"","sources":["../../../../../../src/lib/components/admin/fields/richtext/block-defaults.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iFAAiF;AACjF,oEAAoE;AACpE,kFAAkF;AAClF,wEAAwE;AAExE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AAEjG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;AAEhG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC"}
@@ -15,6 +15,21 @@ export interface DocumentValidationResult {
15
15
  * Check if a field is required based on its validation rules
16
16
  */
17
17
  export declare function isFieldRequired(field: Field): boolean;
18
+ /**
19
+ * Structural (shape) validation for a field's stored value — the depth=0 write
20
+ * shape. This catches a caller (notably an AI agent over MCP) sending the wrong
21
+ * JSON shape that presence/required checks would miss: a slug as `{ current }`
22
+ * (Sanity's convention — AphexCMS stores slugs as plain strings), or a
23
+ * reference/image missing its `_ref`. Runs before the user's Rule validation
24
+ * and only when a value is meaningfully present (absent/empty is a required-ness
25
+ * concern, handled separately), so optional and half-filled fields are left
26
+ * alone. Returns an error message, or null when the shape is acceptable.
27
+ *
28
+ * Intentionally conservative: only unambiguous mismatches error, and empty
29
+ * placeholders (`''`, an image with no `asset`) are treated as absent so the
30
+ * admin's in-progress edit states don't trip it.
31
+ */
32
+ export declare function validateValueShape(field: Field, value: unknown): string | null;
18
33
  /**
19
34
  * Validate a field value against its validation rules
20
35
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CAiID;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,CAqDnC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmC9E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CA6ID;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,CAqDnC"}
@@ -18,6 +18,69 @@ export function isFieldRequired(field) {
18
18
  return false;
19
19
  }
20
20
  }
21
+ function describeValue(value) {
22
+ if (Array.isArray(value))
23
+ return 'an array';
24
+ if (value === null)
25
+ return 'null';
26
+ if (typeof value === 'object')
27
+ return 'an object';
28
+ return `a ${typeof value}`;
29
+ }
30
+ const isPlainObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
31
+ /**
32
+ * Structural (shape) validation for a field's stored value — the depth=0 write
33
+ * shape. This catches a caller (notably an AI agent over MCP) sending the wrong
34
+ * JSON shape that presence/required checks would miss: a slug as `{ current }`
35
+ * (Sanity's convention — AphexCMS stores slugs as plain strings), or a
36
+ * reference/image missing its `_ref`. Runs before the user's Rule validation
37
+ * and only when a value is meaningfully present (absent/empty is a required-ness
38
+ * concern, handled separately), so optional and half-filled fields are left
39
+ * alone. Returns an error message, or null when the shape is acceptable.
40
+ *
41
+ * Intentionally conservative: only unambiguous mismatches error, and empty
42
+ * placeholders (`''`, an image with no `asset`) are treated as absent so the
43
+ * admin's in-progress edit states don't trip it.
44
+ */
45
+ export function validateValueShape(field, value) {
46
+ // Absent (or an empty-string placeholder for a non-string field) → shape is
47
+ // irrelevant here; presence is enforced by Rule().required().
48
+ if (value === null || value === undefined)
49
+ return null;
50
+ switch (field.type) {
51
+ case 'string':
52
+ case 'text':
53
+ case 'slug':
54
+ case 'url':
55
+ return typeof value === 'string' ? null : `expected a string, got ${describeValue(value)}`;
56
+ case 'reference':
57
+ if (value === '')
58
+ return null;
59
+ return isPlainObject(value) && typeof value._ref === 'string'
60
+ ? null
61
+ : `expected a reference object { _type: 'reference', _ref: '<documentId>' }, got ${describeValue(value)}`;
62
+ case 'image':
63
+ case 'file': {
64
+ if (value === '')
65
+ return null;
66
+ if (!isPlainObject(value))
67
+ return `expected an ${field.type} object { _type: '${field.type}', asset: { _type: 'reference', _ref: '<assetId>' } }, got ${describeValue(value)}`;
68
+ // An object with no asset yet is a valid empty/in-progress state.
69
+ if (value.asset === undefined || value.asset === null)
70
+ return null;
71
+ return isPlainObject(value.asset) && typeof value.asset._ref === 'string'
72
+ ? null
73
+ : `${field.type} asset must be { _type: 'reference', _ref: '<assetId>' }`;
74
+ }
75
+ case 'array':
76
+ return Array.isArray(value) ? null : `expected an array, got ${describeValue(value)}`;
77
+ case 'object':
78
+ return isPlainObject(value) ? null : `expected an object, got ${describeValue(value)}`;
79
+ default:
80
+ // number/boolean/date/datetime — left to existing auto-rules / user rules.
81
+ return null;
82
+ }
83
+ }
21
84
  /**
22
85
  * Validate a field value against its validation rules
23
86
  */
@@ -28,6 +91,17 @@ export async function validateField(field, value, context = {}) {
28
91
  hasValidation: !!field.validation
29
92
  });
30
93
  const allErrors = [];
94
+ // Structural shape check first: if the value is the wrong JSON shape (e.g. a
95
+ // slug sent as `{ current }`, or a reference without `_ref`), report that and
96
+ // stop — the type-assuming auto-rules and user rules below expect the correct
97
+ // primitive/shape and would otherwise throw or emit confusing errors.
98
+ const shapeError = validateValueShape(field, value);
99
+ if (shapeError) {
100
+ return {
101
+ isValid: false,
102
+ errors: [{ level: 'error', message: `Field "${field.name}" ${shapeError}` }]
103
+ };
104
+ }
31
105
  // Add automatic validation for date/datetime/url fields based on type
32
106
  if (field.type === 'date') {
33
107
  const dateField = field;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../src/lib/graphql/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AA4H1D,wBAAgB,eAAe,CAC9B,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,UAAU,EAAE,EACzB,kBAAkB,GAAE,OAAO,GAAG,WAAyB,uBA2tBvD"}
1
+ {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../src/lib/graphql/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AAyH1D,wBAAgB,eAAe,CAC9B,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,UAAU,EAAE,EACzB,kBAAkB,GAAE,OAAO,GAAG,WAAyB,uBA4tBvD"}
@@ -2,9 +2,7 @@ import { GraphQLError } from 'graphql';
2
2
  import { authToContext } from '../local-api/auth-helpers.js';
3
3
  import { getDefaultValueForFieldType } from '../utils/field-defaults.js';
4
4
  import { cmsLogger } from '../utils/logger.js';
5
- function capitalizeFirst(str) {
6
- return str.charAt(0).toUpperCase() + str.slice(1);
7
- }
5
+ import { toPascalCase, toCamelCase } from '../utils/string-case.js';
8
6
  // Normalize null/undefined field values to type-appropriate defaults (recursive)
9
7
  function normalizeDocumentFields(data, schemaType, allSchemaTypes) {
10
8
  if (!data)
@@ -130,7 +128,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
130
128
  // Generate reference field resolvers for all types
131
129
  function generateReferenceFieldResolvers() {
132
130
  schemaTypes.forEach((schemaType) => {
133
- const typeName = capitalizeFirst(schemaType.name);
131
+ const typeName = toPascalCase(schemaType.name);
134
132
  function processFields(fields, currentTypeName) {
135
133
  fields.forEach((field) => {
136
134
  // Handle reference fields
@@ -244,7 +242,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
244
242
  }
245
243
  // Handle nested objects
246
244
  if (field.type === 'object' && field.fields) {
247
- const nestedTypeName = capitalizeFirst(`${schemaType.name}${field.name}Object`);
245
+ const nestedTypeName = toPascalCase(`${schemaType.name}${field.name}Object`);
248
246
  processFields(field.fields, nestedTypeName);
249
247
  }
250
248
  });
@@ -262,11 +260,11 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
262
260
  if (field.type === 'array' && field.of && field.of.length > 1) {
263
261
  const validTypes = field.of.filter((item) => schemaTypes.find((s) => s.name === item.type));
264
262
  if (validTypes.length > 1) {
265
- const unionName = `${capitalizeFirst(parentName)}${capitalizeFirst(field.name)}Item`;
263
+ const unionName = `${toPascalCase(parentName)}${toPascalCase(field.name)}Item`;
266
264
  resolvers[unionName] = {
267
265
  __resolveType(obj) {
268
266
  if (obj._type) {
269
- return capitalizeFirst(obj._type);
267
+ return toPascalCase(obj._type);
270
268
  }
271
269
  return null;
272
270
  }
@@ -286,7 +284,8 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
286
284
  // Generate resolvers for each document type
287
285
  const documentTypes = schemaTypes.filter((type) => type.type === 'document');
288
286
  documentTypes.forEach((schemaType) => {
289
- const typeName = capitalizeFirst(schemaType.name);
287
+ const typeName = toPascalCase(schemaType.name);
288
+ const fieldName = toCamelCase(schemaType.name);
290
289
  // Singleton resolvers: no-arg query, no-id mutations.
291
290
  // Schema/codegen already differs for singletons (see schema.ts) — the
292
291
  // resolver just delegates to the singleton-aware CollectionAPI methods.
@@ -306,7 +305,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
306
305
  ...normalizedData
307
306
  };
308
307
  };
309
- resolvers.Query[schemaType.name] = async (_, args, context) => {
308
+ resolvers.Query[fieldName] = async (_, args, context) => {
310
309
  try {
311
310
  const { localAPI, auth } = context;
312
311
  const apiContext = authToContext(auth);
@@ -404,7 +403,7 @@ export function createResolvers(cms, schemaTypes, defaultPerspective = 'publishe
404
403
  return; // skip the regular per-type resolvers below for singletons
405
404
  }
406
405
  // Single document resolver: page(id: "123", perspective: "draft")
407
- resolvers.Query[schemaType.name] = async (_, args, context) => {
406
+ resolvers.Query[fieldName] = async (_, args, context) => {
408
407
  try {
409
408
  const { localAPI, auth } = context;
410
409
  const apiContext = authToContext(auth);