canopycms 0.0.26 → 0.0.28

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 (113) hide show
  1. package/dist/ai/generate.d.ts +3 -0
  2. package/dist/ai/generate.d.ts.map +1 -1
  3. package/dist/ai/generate.js +19 -7
  4. package/dist/ai/generate.js.map +1 -1
  5. package/dist/ai/handler.d.ts.map +1 -1
  6. package/dist/ai/handler.js +1 -0
  7. package/dist/ai/handler.js.map +1 -1
  8. package/dist/ai/json-to-markdown.js +1 -1
  9. package/dist/ai/json-to-markdown.js.map +1 -1
  10. package/dist/api/content.d.ts +10 -4
  11. package/dist/api/content.d.ts.map +1 -1
  12. package/dist/api/content.js +24 -12
  13. package/dist/api/content.js.map +1 -1
  14. package/dist/api/schema.d.ts +42 -42
  15. package/dist/build/generate-ai-content.d.ts.map +1 -1
  16. package/dist/build/generate-ai-content.js +1 -0
  17. package/dist/build/generate-ai-content.js.map +1 -1
  18. package/dist/cli/generate-ai-content.js +313 -157
  19. package/dist/cli/init.js +3 -2
  20. package/dist/client.d.ts +2 -0
  21. package/dist/client.d.ts.map +1 -1
  22. package/dist/client.js +1 -0
  23. package/dist/client.js.map +1 -1
  24. package/dist/config/helpers.d.ts.map +1 -1
  25. package/dist/config/helpers.js +2 -1
  26. package/dist/config/helpers.js.map +1 -1
  27. package/dist/config/schemas/collection.d.ts +14 -14
  28. package/dist/config/schemas/collection.js +1 -1
  29. package/dist/config/schemas/collection.js.map +1 -1
  30. package/dist/config/schemas/config.d.ts +17 -13
  31. package/dist/config/schemas/config.d.ts.map +1 -1
  32. package/dist/config/schemas/config.js +1 -0
  33. package/dist/config/schemas/config.js.map +1 -1
  34. package/dist/config/types.d.ts +7 -2
  35. package/dist/config/types.d.ts.map +1 -1
  36. package/dist/config/types.js.map +1 -1
  37. package/dist/content-listing.d.ts +2 -2
  38. package/dist/content-listing.d.ts.map +1 -1
  39. package/dist/content-listing.js +6 -2
  40. package/dist/content-listing.js.map +1 -1
  41. package/dist/content-reader.d.ts +2 -0
  42. package/dist/content-reader.d.ts.map +1 -1
  43. package/dist/content-reader.js +13 -4
  44. package/dist/content-reader.js.map +1 -1
  45. package/dist/content-store.d.ts +8 -1
  46. package/dist/content-store.d.ts.map +1 -1
  47. package/dist/content-store.js +47 -39
  48. package/dist/content-store.js.map +1 -1
  49. package/dist/editor/CanopyEditor.d.ts.map +1 -1
  50. package/dist/editor/CanopyEditor.js +1 -1
  51. package/dist/editor/CanopyEditor.js.map +1 -1
  52. package/dist/editor/Editor.d.ts +1 -0
  53. package/dist/editor/Editor.d.ts.map +1 -1
  54. package/dist/editor/Editor.js +32 -9
  55. package/dist/editor/Editor.js.map +1 -1
  56. package/dist/editor/components/EntryCreateModal.d.ts +1 -1
  57. package/dist/editor/components/EntryCreateModal.d.ts.map +1 -1
  58. package/dist/editor/editor-utils.d.ts.map +1 -1
  59. package/dist/editor/editor-utils.js +4 -3
  60. package/dist/editor/editor-utils.js.map +1 -1
  61. package/dist/editor/fields/MarkdownField.d.ts.map +1 -1
  62. package/dist/editor/fields/MarkdownField.js +8 -2
  63. package/dist/editor/fields/MarkdownField.js.map +1 -1
  64. package/dist/editor/fields/entry-link/EntryLinkContext.d.ts +20 -0
  65. package/dist/editor/fields/entry-link/EntryLinkContext.d.ts.map +1 -0
  66. package/dist/editor/fields/entry-link/EntryLinkContext.js +12 -0
  67. package/dist/editor/fields/entry-link/EntryLinkContext.js.map +1 -0
  68. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +16 -0
  69. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts.map +1 -0
  70. package/dist/editor/fields/entry-link/InsertEntryLink.js +62 -0
  71. package/dist/editor/fields/entry-link/InsertEntryLink.js.map +1 -0
  72. package/dist/editor/fields/entry-link/index.d.ts +3 -0
  73. package/dist/editor/fields/entry-link/index.d.ts.map +1 -0
  74. package/dist/editor/fields/entry-link/index.js +3 -0
  75. package/dist/editor/fields/entry-link/index.js.map +1 -0
  76. package/dist/editor/hooks/useEntryLinkResolution.d.ts +26 -0
  77. package/dist/editor/hooks/useEntryLinkResolution.d.ts.map +1 -0
  78. package/dist/editor/hooks/useEntryLinkResolution.js +96 -0
  79. package/dist/editor/hooks/useEntryLinkResolution.js.map +1 -0
  80. package/dist/editor/hooks/useEntryManager.d.ts.map +1 -1
  81. package/dist/editor/hooks/useEntryManager.js +4 -1
  82. package/dist/editor/hooks/useEntryManager.js.map +1 -1
  83. package/dist/editor/schema-editor/EntryTypeEditor.d.ts.map +1 -1
  84. package/dist/editor/schema-editor/EntryTypeEditor.js +2 -1
  85. package/dist/editor/schema-editor/EntryTypeEditor.js.map +1 -1
  86. package/dist/entry-link-resolver.d.ts +67 -0
  87. package/dist/entry-link-resolver.d.ts.map +1 -0
  88. package/dist/entry-link-resolver.js +226 -0
  89. package/dist/entry-link-resolver.js.map +1 -0
  90. package/dist/schema/meta-loader.d.ts +1 -1
  91. package/dist/schema/meta-loader.d.ts.map +1 -1
  92. package/dist/schema/meta-loader.js +1 -1
  93. package/dist/schema/meta-loader.js.map +1 -1
  94. package/dist/schema/schema-store.d.ts +21 -21
  95. package/dist/schema/schema-store.js +2 -2
  96. package/dist/schema/schema-store.js.map +1 -1
  97. package/dist/server.d.ts +3 -0
  98. package/dist/server.d.ts.map +1 -1
  99. package/dist/server.js +2 -0
  100. package/dist/server.js.map +1 -1
  101. package/dist/utils/entry-url.d.ts +21 -0
  102. package/dist/utils/entry-url.d.ts.map +1 -0
  103. package/dist/utils/entry-url.js +41 -0
  104. package/dist/utils/entry-url.js.map +1 -0
  105. package/dist/utils/format.d.ts +6 -2
  106. package/dist/utils/format.d.ts.map +1 -1
  107. package/dist/utils/format.js +10 -2
  108. package/dist/utils/format.js.map +1 -1
  109. package/dist/validation/entry-link-validator.d.ts +27 -0
  110. package/dist/validation/entry-link-validator.d.ts.map +1 -0
  111. package/dist/validation/entry-link-validator.js +49 -0
  112. package/dist/validation/entry-link-validator.js.map +1 -0
  113. package/package.json +3 -2
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared entry URL computation — used by both server and client code.
3
+ *
4
+ * This module has NO server-only dependencies (no node:fs, etc.)
5
+ * so it can be safely imported into browser bundles.
6
+ */
7
+ /**
8
+ * Compute a URL path from an entry's collection path and slug.
9
+ *
10
+ * Logic:
11
+ * - Strip the contentRoot prefix (e.g., "content/") from the collection path
12
+ * - Append the slug (unless it's "index", which collapses to the parent path)
13
+ * - Always returns a path starting with "/"
14
+ *
15
+ * Examples:
16
+ * ("content/posts", "hello-world", "content") => "/posts/hello-world"
17
+ * ("content/docs/api", "index", "content") => "/docs/api"
18
+ * ("content", "index", "content") => "/"
19
+ */
20
+ export declare function computeEntryUrl(collection: string, slug: string, contentRoot: string): string;
21
+ //# sourceMappingURL=entry-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-url.d.ts","sourceRoot":"","sources":["../../src/utils/entry-url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAsB7F"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Shared entry URL computation — used by both server and client code.
3
+ *
4
+ * This module has NO server-only dependencies (no node:fs, etc.)
5
+ * so it can be safely imported into browser bundles.
6
+ */
7
+ import { trimSlashes } from '../paths/normalize.js';
8
+ /**
9
+ * Compute a URL path from an entry's collection path and slug.
10
+ *
11
+ * Logic:
12
+ * - Strip the contentRoot prefix (e.g., "content/") from the collection path
13
+ * - Append the slug (unless it's "index", which collapses to the parent path)
14
+ * - Always returns a path starting with "/"
15
+ *
16
+ * Examples:
17
+ * ("content/posts", "hello-world", "content") => "/posts/hello-world"
18
+ * ("content/docs/api", "index", "content") => "/docs/api"
19
+ * ("content", "index", "content") => "/"
20
+ */
21
+ export function computeEntryUrl(collection, slug, contentRoot) {
22
+ const root = trimSlashes(contentRoot);
23
+ // Strip contentRoot prefix
24
+ let stripped = collection;
25
+ if (root && collection.startsWith(`${root}/`)) {
26
+ stripped = collection.slice(root.length + 1);
27
+ }
28
+ else if (collection === root) {
29
+ stripped = '';
30
+ }
31
+ // Build URL segments
32
+ const segments = stripped.split('/').filter(Boolean);
33
+ // Append slug unless it's "index" (index entries collapse to parent)
34
+ if (slug && slug !== 'index') {
35
+ segments.push(slug);
36
+ }
37
+ const path = segments.length > 0 ? `/${segments.join('/')}` : '/';
38
+ // Lowercase to match content-listing.ts and content-tree.ts URL conventions
39
+ return path.toLowerCase();
40
+ }
41
+ //# sourceMappingURL=entry-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-url.js","sourceRoot":"","sources":["../../src/utils/entry-url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,IAAY,EAAE,WAAmB;IACnF,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAErC,2BAA2B;IAC3B,IAAI,QAAQ,GAAG,UAAU,CAAA;IACzB,IAAI,IAAI,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;QAC9C,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;SAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/B,QAAQ,GAAG,EAAE,CAAA;IACf,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEpD,qEAAqE;IACrE,IAAI,IAAI,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IACjE,4EAA4E;IAC5E,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;AAC3B,CAAC"}
@@ -1,8 +1,12 @@
1
1
  import type { ContentFormat } from '../config';
2
2
  /**
3
3
  * Get the file extension for a content format
4
- * @param format - The content format (md, mdx, json)
5
- * @returns The file extension including the dot (e.g., '.md', '.json')
4
+ * @param format - The content format (md, mdx, json, yaml)
5
+ * @returns The file extension including the dot (e.g., '.md', '.json', '.yaml')
6
6
  */
7
7
  export declare const getFormatExtension: (format: ContentFormat) => string;
8
+ /** Returns true for data-only formats (no body/frontmatter separation) */
9
+ export declare const isDataOnlyFormat: (format: ContentFormat) => boolean;
10
+ /** Safely coerce a parsed value to a record, returning {} for non-object values */
11
+ export declare const asRecord: (value: unknown) => Record<string, unknown>;
8
12
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,aAAa,KAAG,MAI1D,CAAA"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,aAAa,KAAG,MAK1D,CAAA;AAED,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,GAAI,QAAQ,aAAa,KAAG,OACjB,CAAA;AAExC,mFAAmF;AACnF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAGxD,CAAA"}
@@ -1,13 +1,21 @@
1
1
  /**
2
2
  * Get the file extension for a content format
3
- * @param format - The content format (md, mdx, json)
4
- * @returns The file extension including the dot (e.g., '.md', '.json')
3
+ * @param format - The content format (md, mdx, json, yaml)
4
+ * @returns The file extension including the dot (e.g., '.md', '.json', '.yaml')
5
5
  */
6
6
  export const getFormatExtension = (format) => {
7
7
  if (format === 'md')
8
8
  return '.md';
9
9
  if (format === 'mdx')
10
10
  return '.mdx';
11
+ if (format === 'yaml')
12
+ return '.yaml';
11
13
  return '.json';
12
14
  };
15
+ /** Returns true for data-only formats (no body/frontmatter separation) */
16
+ export const isDataOnlyFormat = (format) => format === 'json' || format === 'yaml';
17
+ /** Safely coerce a parsed value to a record, returning {} for non-object values */
18
+ export const asRecord = (value) => value && typeof value === 'object' && !Array.isArray(value)
19
+ ? value
20
+ : {};
13
21
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAqB,EAAU,EAAE;IAClE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IACjC,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,MAAM,CAAA;IACnC,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAqB,EAAU,EAAE;IAClE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IACjC,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,MAAM,CAAA;IACnC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,OAAO,CAAA;IACrC,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAqB,EAAW,EAAE,CACjE,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,CAAA;AAExC,mFAAmF;AACnF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAA2B,EAAE,CAClE,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACzD,CAAC,CAAE,KAAiC;IACpC,CAAC,CAAC,EAAE,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * EntryLinkValidator validates that entry:ID patterns in body/markdown fields
3
+ * reference existing entries.
4
+ *
5
+ * Returns warnings (not errors) — saves are never blocked by broken entry links.
6
+ * This parallels ReferenceValidator but operates on inline links in text content
7
+ * rather than structured reference fields.
8
+ */
9
+ import type { ContentIdIndex } from '../content-id-index';
10
+ import type { FieldConfig } from '../config';
11
+ export interface EntryLinkWarning {
12
+ field: string;
13
+ fieldPath: string;
14
+ id: string;
15
+ message: string;
16
+ }
17
+ export interface EntryLinkValidationResult {
18
+ warnings: EntryLinkWarning[];
19
+ }
20
+ /**
21
+ * Validate entry links in body/markdown/mdx fields of the provided data.
22
+ *
23
+ * Scans all markdown, mdx, and rich-text fields for entry:ID patterns
24
+ * and checks that each referenced ID exists in the content index.
25
+ */
26
+ export declare function validateEntryLinks(data: Record<string, unknown>, schema: readonly FieldConfig[], idIndex: ContentIdIndex, bodyContent?: string): EntryLinkValidationResult;
27
+ //# sourceMappingURL=entry-link-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-link-validator.d.ts","sourceRoot":"","sources":["../../src/validation/entry-link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAI5C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,OAAO,EAAE,cAAc,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,yBAAyB,CAoB3B"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * EntryLinkValidator validates that entry:ID patterns in body/markdown fields
3
+ * reference existing entries.
4
+ *
5
+ * Returns warnings (not errors) — saves are never blocked by broken entry links.
6
+ * This parallels ReferenceValidator but operates on inline links in text content
7
+ * rather than structured reference fields.
8
+ */
9
+ import { extractEntryLinkIds } from '../entry-link-resolver.js';
10
+ import { findFieldsByType } from './field-traversal.js';
11
+ /**
12
+ * Validate entry links in body/markdown/mdx fields of the provided data.
13
+ *
14
+ * Scans all markdown, mdx, and rich-text fields for entry:ID patterns
15
+ * and checks that each referenced ID exists in the content index.
16
+ */
17
+ export function validateEntryLinks(data, schema, idIndex, bodyContent) {
18
+ const warnings = [];
19
+ // Check body content (for md/mdx entries, body is separate from data)
20
+ if (bodyContent) {
21
+ checkText(bodyContent, 'body', 'body', idIndex, warnings);
22
+ }
23
+ // Check markdown/mdx/rich-text fields in structured data
24
+ const markdownTypes = ['markdown', 'mdx', 'rich-text'];
25
+ for (const fieldType of markdownTypes) {
26
+ const contexts = findFieldsByType(schema, data, fieldType);
27
+ for (const ctx of contexts) {
28
+ if (typeof ctx.value === 'string' && ctx.value) {
29
+ checkText(ctx.value, ctx.field.name, ctx.path, idIndex, warnings);
30
+ }
31
+ }
32
+ }
33
+ return { warnings };
34
+ }
35
+ function checkText(text, fieldName, fieldPath, idIndex, warnings) {
36
+ const links = extractEntryLinkIds(text);
37
+ for (const link of links) {
38
+ const location = idIndex.findById(link.id);
39
+ if (!location || location.type !== 'entry') {
40
+ warnings.push({
41
+ field: fieldName,
42
+ fieldPath,
43
+ id: link.id,
44
+ message: `Entry link target not found: entry:${link.id}`,
45
+ });
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=entry-link-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-link-validator.js","sourceRoot":"","sources":["../../src/validation/entry-link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAapD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAA6B,EAC7B,MAA8B,EAC9B,OAAuB,EACvB,WAAoB;IAEpB,MAAM,QAAQ,GAAuB,EAAE,CAAA;IAEvC,sEAAsE;IACtE,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED,yDAAyD;IACzD,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAU,CAAA;IAC/D,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;QAC1D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC/C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAED,SAAS,SAAS,CAChB,IAAY,EACZ,SAAiB,EACjB,SAAiB,EACjB,OAAuB,EACvB,QAA4B;IAE5B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,SAAS;gBAChB,SAAS;gBACT,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,sCAAsC,IAAI,CAAC,EAAE,EAAE;aACzD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "@codemirror/language, @lezer/highlight: workaround — @mdxeditor/editor uses cm6-theme-basic-light which peer-requires these but mdxeditor doesn't declare them as dependencies",
3
3
  "name": "canopycms",
4
- "version": "0.0.26",
4
+ "version": "0.0.28",
5
5
  "description": "CanopyCMS core package: schema-driven content, branch-aware editing, and editor UI for Next.js.",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -93,12 +93,13 @@
93
93
  "gray-matter": "^4.0.3",
94
94
  "jiti": "^2.6.1",
95
95
  "minimatch": "^9.0.5",
96
+ "minimist": "^1.2.8",
96
97
  "pathe": "^1.1.2",
97
98
  "react-icons": "^5.5.0",
98
99
  "react-split-pane": "^0.1.92",
99
100
  "short-uuid": "^6.0.3",
100
- "minimist": "^1.2.8",
101
101
  "simple-git": "^3.22.0",
102
+ "yaml": "^2.8.3",
102
103
  "zod": "^3.23.8"
103
104
  },
104
105
  "peerDependencies": {