nebula-cms 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.d.ts.map +1 -0
- package/dist/astro/index.js +223 -0
- package/dist/client/Admin.svelte.d.ts +11 -0
- package/dist/client/Admin.svelte.d.ts.map +1 -0
- package/dist/client/components/BackendPicker.svelte.d.ts +4 -0
- package/dist/client/components/BackendPicker.svelte.d.ts.map +1 -0
- package/dist/client/components/DraftChip.svelte.d.ts +10 -0
- package/dist/client/components/DraftChip.svelte.d.ts.map +1 -0
- package/dist/client/components/MetadataForm.svelte.d.ts +12 -0
- package/dist/client/components/MetadataForm.svelte.d.ts.map +1 -0
- package/dist/client/components/ThemeToggle.svelte.d.ts +19 -0
- package/dist/client/components/ThemeToggle.svelte.d.ts.map +1 -0
- package/dist/client/components/dialogs/DeleteDraftDialog.svelte.d.ts +11 -0
- package/dist/client/components/dialogs/DeleteDraftDialog.svelte.d.ts.map +1 -0
- package/dist/client/components/dialogs/FilenameDialog.svelte.d.ts +13 -0
- package/dist/client/components/dialogs/FilenameDialog.svelte.d.ts.map +1 -0
- package/dist/client/components/editor/EditorPane.svelte.d.ts +4 -0
- package/dist/client/components/editor/EditorPane.svelte.d.ts.map +1 -0
- package/dist/client/components/editor/EditorTabs.svelte.d.ts +8 -0
- package/dist/client/components/editor/EditorTabs.svelte.d.ts.map +1 -0
- package/dist/client/components/editor/EditorToolbar.svelte.d.ts +4 -0
- package/dist/client/components/editor/EditorToolbar.svelte.d.ts.map +1 -0
- package/dist/client/components/editor/FormatSelector.svelte.d.ts +4 -0
- package/dist/client/components/editor/FormatSelector.svelte.d.ts.map +1 -0
- package/dist/client/components/editor/Toolbar.svelte.d.ts +19 -0
- package/dist/client/components/editor/Toolbar.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/ArrayField.svelte.d.ts +15 -0
- package/dist/client/components/fields/ArrayField.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/ArrayItem.svelte.d.ts +28 -0
- package/dist/client/components/fields/ArrayItem.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/BooleanField.svelte.d.ts +16 -0
- package/dist/client/components/fields/BooleanField.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/DateField.svelte.d.ts +16 -0
- package/dist/client/components/fields/DateField.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/EnumField.svelte.d.ts +17 -0
- package/dist/client/components/fields/EnumField.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/FieldWrapper.svelte.d.ts +18 -0
- package/dist/client/components/fields/FieldWrapper.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/NumberField.svelte.d.ts +16 -0
- package/dist/client/components/fields/NumberField.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/ObjectField.svelte.d.ts +16 -0
- package/dist/client/components/fields/ObjectField.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/SchemaField.svelte.d.ts +16 -0
- package/dist/client/components/fields/SchemaField.svelte.d.ts.map +1 -0
- package/dist/client/components/fields/StringField.svelte.d.ts +16 -0
- package/dist/client/components/fields/StringField.svelte.d.ts.map +1 -0
- package/dist/client/components/sidebar/AdminSidebar.svelte.d.ts +19 -0
- package/dist/client/components/sidebar/AdminSidebar.svelte.d.ts.map +1 -0
- package/dist/client/components/sidebar/AdminSidebarSort.svelte.d.ts +12 -0
- package/dist/client/components/sidebar/AdminSidebarSort.svelte.d.ts.map +1 -0
- package/dist/client/css/icons.css +29 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/js/drafts/merge.svelte.d.ts +24 -0
- package/dist/client/js/drafts/merge.svelte.d.ts.map +1 -0
- package/dist/client/js/drafts/merge.svelte.js +106 -0
- package/dist/client/js/drafts/ops.svelte.d.ts +31 -0
- package/dist/client/js/drafts/ops.svelte.d.ts.map +1 -0
- package/dist/client/js/drafts/ops.svelte.js +182 -0
- package/dist/client/js/drafts/storage.d.ts +45 -0
- package/dist/client/js/drafts/storage.d.ts.map +1 -0
- package/dist/client/js/drafts/storage.js +76 -0
- package/dist/client/js/drafts/workers/diff.d.ts +2 -0
- package/dist/client/js/drafts/workers/diff.d.ts.map +1 -0
- package/dist/client/js/drafts/workers/diff.js +20 -0
- package/dist/client/js/editor/editor.svelte.d.ts +124 -0
- package/dist/client/js/editor/editor.svelte.d.ts.map +1 -0
- package/dist/client/js/editor/editor.svelte.js +294 -0
- package/dist/client/js/editor/languages.d.ts +11 -0
- package/dist/client/js/editor/languages.d.ts.map +1 -0
- package/dist/client/js/editor/languages.js +93 -0
- package/dist/client/js/editor/link-wrap.d.ts +6 -0
- package/dist/client/js/editor/link-wrap.d.ts.map +1 -0
- package/{src/client/js/editor/link-wrap.ts → dist/client/js/editor/link-wrap.js} +17 -24
- package/dist/client/js/editor/markdown-shortcuts.d.ts +4 -0
- package/dist/client/js/editor/markdown-shortcuts.d.ts.map +1 -0
- package/dist/client/js/editor/markdown-shortcuts.js +219 -0
- package/dist/client/js/handlers/admin.d.ts +64 -0
- package/dist/client/js/handlers/admin.d.ts.map +1 -0
- package/dist/client/js/handlers/admin.js +186 -0
- package/dist/client/js/state/dialogs.svelte.d.ts +16 -0
- package/dist/client/js/state/dialogs.svelte.d.ts.map +1 -0
- package/dist/client/js/state/dialogs.svelte.js +28 -0
- package/dist/client/js/state/router.svelte.d.ts +44 -0
- package/dist/client/js/state/router.svelte.d.ts.map +1 -0
- package/dist/client/js/state/router.svelte.js +135 -0
- package/dist/client/js/state/schema.svelte.d.ts +51 -0
- package/dist/client/js/state/schema.svelte.d.ts.map +1 -0
- package/{src/client/js/state/schema.svelte.ts → dist/client/js/state/schema.svelte.js} +55 -70
- package/dist/client/js/state/state.svelte.d.ts +68 -0
- package/dist/client/js/state/state.svelte.d.ts.map +1 -0
- package/dist/client/js/state/state.svelte.js +291 -0
- package/dist/client/js/state/theme.svelte.d.ts +24 -0
- package/dist/client/js/state/theme.svelte.d.ts.map +1 -0
- package/{src/client/js/state/theme.svelte.ts → dist/client/js/state/theme.svelte.js} +54 -91
- package/dist/client/js/storage/adapter.d.ts +130 -0
- package/dist/client/js/storage/adapter.d.ts.map +1 -0
- package/dist/client/js/storage/adapter.js +5 -0
- package/dist/client/js/storage/client.d.ts +72 -0
- package/dist/client/js/storage/client.d.ts.map +1 -0
- package/dist/client/js/storage/client.js +121 -0
- package/dist/client/js/storage/db.d.ts +8 -0
- package/dist/client/js/storage/db.d.ts.map +1 -0
- package/dist/client/js/storage/db.js +35 -0
- package/dist/client/js/storage/fsa.d.ts +51 -0
- package/dist/client/js/storage/fsa.d.ts.map +1 -0
- package/dist/client/js/storage/fsa.js +91 -0
- package/dist/client/js/storage/github.d.ts +62 -0
- package/dist/client/js/storage/github.d.ts.map +1 -0
- package/dist/client/js/storage/github.js +216 -0
- package/dist/client/js/storage/storage.d.ts +32 -0
- package/dist/client/js/storage/storage.d.ts.map +1 -0
- package/dist/client/js/storage/storage.js +68 -0
- package/dist/client/js/storage/workers/frontmatter.d.ts +2 -0
- package/dist/client/js/storage/workers/frontmatter.d.ts.map +1 -0
- package/dist/client/js/storage/workers/frontmatter.js +253 -0
- package/dist/client/js/storage/workers/storage.d.ts +2 -0
- package/dist/client/js/storage/workers/storage.d.ts.map +1 -0
- package/dist/client/js/storage/workers/storage.js +167 -0
- package/dist/client/js/storage/workers/toml-parser.d.ts +2 -0
- package/dist/client/js/storage/workers/toml-parser.d.ts.map +1 -0
- package/dist/client/js/storage/workers/toml-parser.js +75 -0
- package/dist/client/js/storage/workers/yaml-parser.d.ts +2 -0
- package/dist/client/js/storage/workers/yaml-parser.d.ts.map +1 -0
- package/dist/client/js/storage/workers/yaml-parser.js +100 -0
- package/dist/client/js/utils/file-types.d.ts +58 -0
- package/dist/client/js/utils/file-types.d.ts.map +1 -0
- package/{src/client/js/utils/file-types.ts → dist/client/js/utils/file-types.js} +75 -107
- package/dist/client/js/utils/format.d.ts +8 -0
- package/dist/client/js/utils/format.d.ts.map +1 -0
- package/{src/client/js/utils/format.ts → dist/client/js/utils/format.js} +5 -6
- package/dist/client/js/utils/frontmatter.d.ts +12 -0
- package/dist/client/js/utils/frontmatter.d.ts.map +1 -0
- package/dist/client/js/utils/frontmatter.js +29 -0
- package/dist/client/js/utils/schema-utils.d.ts +110 -0
- package/dist/client/js/utils/schema-utils.d.ts.map +1 -0
- package/dist/client/js/utils/schema-utils.js +242 -0
- package/dist/client/js/utils/slug.d.ts +8 -0
- package/dist/client/js/utils/slug.d.ts.map +1 -0
- package/{src/client/js/utils/slug.ts → dist/client/js/utils/slug.js} +6 -7
- package/dist/client/js/utils/sort.d.ts +41 -0
- package/dist/client/js/utils/sort.d.ts.map +1 -0
- package/dist/client/js/utils/sort.js +65 -0
- package/dist/client/js/utils/stable-stringify.d.ts +8 -0
- package/dist/client/js/utils/stable-stringify.d.ts.map +1 -0
- package/dist/client/js/utils/stable-stringify.js +23 -0
- package/dist/client/js/utils/url-utils.d.ts +11 -0
- package/dist/client/js/utils/url-utils.d.ts.map +1 -0
- package/{src/client/js/utils/url-utils.ts → dist/client/js/utils/url-utils.js} +22 -23
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +4 -1
- package/.github/workflows/ci.yml +0 -27
- package/.github/workflows/publish.yml +0 -34
- package/.mcp.json +0 -12
- package/.prettierignore +0 -5
- package/.prettierrc.cjs +0 -22
- package/AGENTS.md +0 -183
- package/playground/astro.config.mjs +0 -7
- package/playground/node_modules/.bin/astro +0 -21
- package/playground/node_modules/.vite/deps/@astrojs_svelte_client__js.js +0 -85
- package/playground/node_modules/.vite/deps/@astrojs_svelte_client__js.js.map +0 -7
- package/playground/node_modules/.vite/deps/_metadata.json +0 -184
- package/playground/node_modules/.vite/deps/astro___aria-query.js +0 -6776
- package/playground/node_modules/.vite/deps/astro___aria-query.js.map +0 -7
- package/playground/node_modules/.vite/deps/astro___axobject-query.js +0 -3754
- package/playground/node_modules/.vite/deps/astro___axobject-query.js.map +0 -7
- package/playground/node_modules/.vite/deps/astro___html-escaper.js +0 -34
- package/playground/node_modules/.vite/deps/astro___html-escaper.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-AJXJMYAF.js +0 -0
- package/playground/node_modules/.vite/deps/chunk-AJXJMYAF.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-BUSYA2B4.js +0 -8
- package/playground/node_modules/.vite/deps/chunk-BUSYA2B4.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-CNYJBM5F.js +0 -21
- package/playground/node_modules/.vite/deps/chunk-CNYJBM5F.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-DBPNBGEI.js +0 -223
- package/playground/node_modules/.vite/deps/chunk-DBPNBGEI.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-FPEUJ7DG.js +0 -27
- package/playground/node_modules/.vite/deps/chunk-FPEUJ7DG.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-MHDZ3SK7.js +0 -1005
- package/playground/node_modules/.vite/deps/chunk-MHDZ3SK7.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-RBDTDTPY.js +0 -204
- package/playground/node_modules/.vite/deps/chunk-RBDTDTPY.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-RJGEXL5C.js +0 -688
- package/playground/node_modules/.vite/deps/chunk-RJGEXL5C.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-YL4MIWGJ.js +0 -5099
- package/playground/node_modules/.vite/deps/chunk-YL4MIWGJ.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-ZOV3DWEJ.js +0 -4376
- package/playground/node_modules/.vite/deps/chunk-ZOV3DWEJ.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-ZP4UNCSN.js +0 -23
- package/playground/node_modules/.vite/deps/chunk-ZP4UNCSN.js.map +0 -7
- package/playground/node_modules/.vite/deps/chunk-ZREFNRZZ.js +0 -148
- package/playground/node_modules/.vite/deps/chunk-ZREFNRZZ.js.map +0 -7
- package/playground/node_modules/.vite/deps/package.json +0 -3
- package/playground/node_modules/.vite/deps/smol-toml.js +0 -843
- package/playground/node_modules/.vite/deps/smol-toml.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte.js +0 -55
- package/playground/node_modules/.vite/deps/svelte.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte___clsx.js +0 -9
- package/playground/node_modules/.vite/deps/svelte___clsx.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_animate.js +0 -57
- package/playground/node_modules/.vite/deps/svelte_animate.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_attachments.js +0 -15
- package/playground/node_modules/.vite/deps/svelte_attachments.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_easing.js +0 -67
- package/playground/node_modules/.vite/deps/svelte_easing.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_events.js +0 -11
- package/playground/node_modules/.vite/deps/svelte_events.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_internal.js +0 -5
- package/playground/node_modules/.vite/deps/svelte_internal.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_internal_client.js +0 -402
- package/playground/node_modules/.vite/deps/svelte_internal_client.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_internal_disclose-version.js +0 -10
- package/playground/node_modules/.vite/deps/svelte_internal_disclose-version.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_internal_flags_async.js +0 -8
- package/playground/node_modules/.vite/deps/svelte_internal_flags_async.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_internal_flags_legacy.js +0 -8
- package/playground/node_modules/.vite/deps/svelte_internal_flags_legacy.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_internal_flags_tracing.js +0 -8
- package/playground/node_modules/.vite/deps/svelte_internal_flags_tracing.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_legacy.js +0 -35
- package/playground/node_modules/.vite/deps/svelte_legacy.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_motion.js +0 -545
- package/playground/node_modules/.vite/deps/svelte_motion.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_reactivity.js +0 -29
- package/playground/node_modules/.vite/deps/svelte_reactivity.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_reactivity_window.js +0 -127
- package/playground/node_modules/.vite/deps/svelte_reactivity_window.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_store.js +0 -103
- package/playground/node_modules/.vite/deps/svelte_store.js.map +0 -7
- package/playground/node_modules/.vite/deps/svelte_transition.js +0 -208
- package/playground/node_modules/.vite/deps/svelte_transition.js.map +0 -7
- package/playground/package.json +0 -16
- package/playground/pnpm-lock.yaml +0 -3167
- package/playground/src/content/authors/jane-doe.json +0 -8
- package/playground/src/content/config/build.toml +0 -2
- package/playground/src/content/courses/web-fundamentals.json +0 -29
- package/playground/src/content/docs/advanced.mdx +0 -6
- package/playground/src/content/docs/intro.md +0 -6
- package/playground/src/content/guides/getting-started.mdx +0 -6
- package/playground/src/content/posts/hello-world.md +0 -7
- package/playground/src/content/products/t-shirt.json +0 -16
- package/playground/src/content/recipes/pancakes.mdoc +0 -8
- package/playground/src/content/settings/site.yml +0 -2
- package/playground/src/content.config.ts +0 -198
- package/playground/src/env.d.ts +0 -1
- package/playground/src/pages/index.astro +0 -11
- package/playground/src/pages/nebula.astro +0 -14
- package/pnpm-workspace.yaml +0 -2
- package/scripts/subset-icons.mjs +0 -178
- package/src/astro/index.ts +0 -295
- package/src/client/js/drafts/merge.svelte.ts +0 -121
- package/src/client/js/drafts/ops.svelte.ts +0 -227
- package/src/client/js/drafts/storage.ts +0 -108
- package/src/client/js/drafts/workers/diff.ts +0 -40
- package/src/client/js/editor/editor.svelte.ts +0 -343
- package/src/client/js/editor/languages.ts +0 -98
- package/src/client/js/editor/markdown-shortcuts.ts +0 -261
- package/src/client/js/handlers/admin.ts +0 -246
- package/src/client/js/state/dialogs.svelte.ts +0 -35
- package/src/client/js/state/router.svelte.ts +0 -156
- package/src/client/js/state/state.svelte.ts +0 -334
- package/src/client/js/storage/adapter.ts +0 -102
- package/src/client/js/storage/client.ts +0 -150
- package/src/client/js/storage/db.ts +0 -36
- package/src/client/js/storage/fsa.ts +0 -110
- package/src/client/js/storage/github.ts +0 -297
- package/src/client/js/storage/storage.ts +0 -83
- package/src/client/js/storage/workers/frontmatter.ts +0 -320
- package/src/client/js/storage/workers/storage.ts +0 -177
- package/src/client/js/storage/workers/toml-parser.ts +0 -106
- package/src/client/js/storage/workers/yaml-parser.ts +0 -132
- package/src/client/js/utils/frontmatter.ts +0 -38
- package/src/client/js/utils/schema-utils.ts +0 -295
- package/src/client/js/utils/sort.ts +0 -84
- package/src/client/js/utils/stable-stringify.ts +0 -27
- package/src/types.ts +0 -25
- package/svelte.config.js +0 -4
- package/tests/astro/build.test.ts +0 -63
- package/tests/astro/index.test.ts +0 -689
- package/tests/client/components/Admin.test.ts +0 -446
- package/tests/client/components/BackendPicker.test.ts +0 -239
- package/tests/client/components/DraftChip.test.ts +0 -53
- package/tests/client/components/MetadataForm.test.ts +0 -164
- package/tests/client/components/dialogs/DeleteDraftDialog.test.ts +0 -91
- package/tests/client/components/dialogs/FilenameDialog.test.ts +0 -209
- package/tests/client/components/dialogs/dialog-stubs.ts +0 -19
- package/tests/client/components/editor/EditorPane.test.ts +0 -100
- package/tests/client/components/editor/EditorTabs.test.ts +0 -253
- package/tests/client/components/editor/EditorToolbar.test.ts +0 -252
- package/tests/client/components/editor/fixtures.ts +0 -31
- package/tests/client/components/fields/ArrayField.test.ts +0 -197
- package/tests/client/components/fields/BooleanField.test.ts +0 -206
- package/tests/client/components/fields/DateField.test.ts +0 -210
- package/tests/client/components/fields/EnumField.test.ts +0 -246
- package/tests/client/components/fields/NumberField.test.ts +0 -240
- package/tests/client/components/fields/ObjectField.test.ts +0 -157
- package/tests/client/components/fields/SchemaField.test.ts +0 -190
- package/tests/client/components/fields/StringField.test.ts +0 -223
- package/tests/client/components/sidebar/AdminSidebar.test.ts +0 -285
- package/tests/client/components/sidebar/AdminSidebarSort.test.ts +0 -135
- package/tests/client/components/sidebar/sort-mock.ts +0 -23
- package/tests/client/js/drafts/fixtures.ts +0 -22
- package/tests/client/js/drafts/merge.test.ts +0 -282
- package/tests/client/js/drafts/ops.test.ts +0 -658
- package/tests/client/js/drafts/storage.test.ts +0 -200
- package/tests/client/js/drafts/workers/diff.test.ts +0 -165
- package/tests/client/js/editor/editor.test.ts +0 -616
- package/tests/client/js/editor/link-wrap.test.ts +0 -225
- package/tests/client/js/editor/markdown-shortcuts.test.ts +0 -370
- package/tests/client/js/handlers/admin.test.ts +0 -467
- package/tests/client/js/state/router.test.ts +0 -619
- package/tests/client/js/state/schema.test.ts +0 -266
- package/tests/client/js/state/state.test.ts +0 -328
- package/tests/client/js/storage/adapter.test.ts +0 -115
- package/tests/client/js/storage/client.test.ts +0 -250
- package/tests/client/js/storage/db.test.ts +0 -59
- package/tests/client/js/storage/fsa.test.ts +0 -284
- package/tests/client/js/storage/github.test.ts +0 -349
- package/tests/client/js/storage/mock-port.ts +0 -95
- package/tests/client/js/storage/storage.test.ts +0 -77
- package/tests/client/js/storage/workers/frontmatter.test.ts +0 -479
- package/tests/client/js/storage/workers/storage.test.ts +0 -299
- package/tests/client/js/storage/workers/toml-parser.test.ts +0 -169
- package/tests/client/js/storage/workers/yaml-parser.test.ts +0 -168
- package/tests/client/js/utils/file-types.test.ts +0 -268
- package/tests/client/js/utils/frontmatter.test.ts +0 -87
- package/tests/client/js/utils/schema-utils.test.ts +0 -318
- package/tests/client/js/utils/slug.test.ts +0 -58
- package/tests/client/js/utils/sort.test.ts +0 -276
- package/tests/client/js/utils/stable-stringify.test.ts +0 -68
- package/tests/client/js/utils/url-utils.test.ts +0 -70
- package/tests/e2e/backend-connection.test.ts +0 -301
- package/tests/e2e/draft-lifecycle.test.ts +0 -388
- package/tests/e2e/editing.test.ts +0 -355
- package/tests/e2e/github-adapter.test.ts +0 -330
- package/tests/e2e/helpers/mock-adapter.ts +0 -166
- package/tests/e2e/helpers/test-app.ts +0 -155
- package/tests/e2e/navigation.test.ts +0 -358
- package/tests/e2e/publishing.test.ts +0 -345
- package/tests/e2e/unsaved-changes.test.ts +0 -317
- package/tests/setup.ts +0 -2
- package/tests/stubs/codemirror.ts +0 -197
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -178
- /package/{src → dist}/client/Admin.svelte +0 -0
- /package/{src → dist}/client/components/BackendPicker.svelte +0 -0
- /package/{src → dist}/client/components/DraftChip.svelte +0 -0
- /package/{src → dist}/client/components/MetadataForm.svelte +0 -0
- /package/{src → dist}/client/components/ThemeToggle.svelte +0 -0
- /package/{src → dist}/client/components/dialogs/DeleteDraftDialog.svelte +0 -0
- /package/{src → dist}/client/components/dialogs/FilenameDialog.svelte +0 -0
- /package/{src → dist}/client/components/editor/EditorPane.svelte +0 -0
- /package/{src → dist}/client/components/editor/EditorTabs.svelte +0 -0
- /package/{src → dist}/client/components/editor/EditorToolbar.svelte +0 -0
- /package/{src → dist}/client/components/editor/FormatSelector.svelte +0 -0
- /package/{src → dist}/client/components/editor/Toolbar.svelte +0 -0
- /package/{src → dist}/client/components/fields/ArrayField.svelte +0 -0
- /package/{src → dist}/client/components/fields/ArrayItem.svelte +0 -0
- /package/{src → dist}/client/components/fields/BooleanField.svelte +0 -0
- /package/{src → dist}/client/components/fields/DateField.svelte +0 -0
- /package/{src → dist}/client/components/fields/EnumField.svelte +0 -0
- /package/{src → dist}/client/components/fields/FieldWrapper.svelte +0 -0
- /package/{src → dist}/client/components/fields/NumberField.svelte +0 -0
- /package/{src → dist}/client/components/fields/ObjectField.svelte +0 -0
- /package/{src → dist}/client/components/fields/SchemaField.svelte +0 -0
- /package/{src → dist}/client/components/fields/StringField.svelte +0 -0
- /package/{src → dist}/client/components/sidebar/AdminSidebar.svelte +0 -0
- /package/{src → dist}/client/components/sidebar/AdminSidebarSort.svelte +0 -0
- /package/{src → dist}/client/css/a11y.css +0 -0
- /package/{src → dist}/client/css/btn.css +0 -0
- /package/{src → dist}/client/css/dialog.css +0 -0
- /package/{src → dist}/client/css/field-input.css +0 -0
- /package/{src → dist}/client/css/reset.css +0 -0
- /package/{src → dist}/client/css/theme.css +0 -0
- /package/{src/client/index.ts → dist/client/index.js} +0 -0
- /package/{src → dist}/virtual.d.ts +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* YAML Parser Worker
|
|
3
|
+
*
|
|
4
|
+
* Handles YAML parsing and serialization on behalf of the main thread.
|
|
5
|
+
* Messages are dispatched by type: 'parse', 'parse-batch', 'stringify'.
|
|
6
|
+
* Each handler wraps its logic in try/catch and always posts a typed result.
|
|
7
|
+
*/
|
|
8
|
+
import { load, dump } from 'js-yaml';
|
|
9
|
+
/*
|
|
10
|
+
//////////////////////////////
|
|
11
|
+
// Message handler
|
|
12
|
+
//////////////////////////////
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Handles a single YAML parse request. Parses the provided content string
|
|
16
|
+
* and posts a parse-result message with the resulting data object or error.
|
|
17
|
+
* @param {ParseMessage} msg - The inbound parse message
|
|
18
|
+
* @return {void}
|
|
19
|
+
*/
|
|
20
|
+
function handleParse(msg) {
|
|
21
|
+
try {
|
|
22
|
+
const data = load(msg.content);
|
|
23
|
+
self.postMessage({ type: 'parse-result', id: msg.id, ok: true, data });
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
27
|
+
self.postMessage({ type: 'parse-result', id: msg.id, ok: false, error });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Handles a batch YAML parse request. Iterates over all items, parses each
|
|
32
|
+
* one, and posts a parse-batch-result with a key-to-data results map.
|
|
33
|
+
* If any item fails to parse, the entire batch result is marked as failed.
|
|
34
|
+
* @param {ParseBatchMessage} msg - The inbound parse-batch message
|
|
35
|
+
* @return {void}
|
|
36
|
+
*/
|
|
37
|
+
function handleParseBatch(msg) {
|
|
38
|
+
try {
|
|
39
|
+
const results = {};
|
|
40
|
+
for (const item of msg.items) {
|
|
41
|
+
results[item.key] = load(item.content);
|
|
42
|
+
}
|
|
43
|
+
self.postMessage({
|
|
44
|
+
type: 'parse-batch-result',
|
|
45
|
+
id: msg.id,
|
|
46
|
+
ok: true,
|
|
47
|
+
results,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
52
|
+
self.postMessage({
|
|
53
|
+
type: 'parse-batch-result',
|
|
54
|
+
id: msg.id,
|
|
55
|
+
ok: false,
|
|
56
|
+
error,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Handles a YAML stringify request. Serializes the provided data object to
|
|
62
|
+
* a YAML string and posts a stringify-result message with the content.
|
|
63
|
+
* lineWidth: -1 disables js-yaml's automatic line folding so long values
|
|
64
|
+
* are not wrapped across lines, which would corrupt multi-line string values.
|
|
65
|
+
* @param {StringifyMessage} msg - The inbound stringify message
|
|
66
|
+
* @return {void}
|
|
67
|
+
*/
|
|
68
|
+
function handleStringify(msg) {
|
|
69
|
+
try {
|
|
70
|
+
const content = dump(msg.data, { lineWidth: -1 });
|
|
71
|
+
self.postMessage({
|
|
72
|
+
type: 'stringify-result',
|
|
73
|
+
id: msg.id,
|
|
74
|
+
ok: true,
|
|
75
|
+
content,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
80
|
+
self.postMessage({
|
|
81
|
+
type: 'stringify-result',
|
|
82
|
+
id: msg.id,
|
|
83
|
+
ok: false,
|
|
84
|
+
error,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Listen for messages from the main thread and dispatch by type
|
|
89
|
+
self.addEventListener('message', (event) => {
|
|
90
|
+
const msg = event.data;
|
|
91
|
+
if (msg.type === 'parse') {
|
|
92
|
+
handleParse(msg);
|
|
93
|
+
}
|
|
94
|
+
else if (msg.type === 'parse-batch') {
|
|
95
|
+
handleParseBatch(msg);
|
|
96
|
+
}
|
|
97
|
+
else if (msg.type === 'stringify') {
|
|
98
|
+
handleStringify(msg);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type FileTypeConfig = {
|
|
2
|
+
extensions: string[];
|
|
3
|
+
hasBody: boolean;
|
|
4
|
+
category: 'frontmatter' | 'data';
|
|
5
|
+
dataFormat?: 'json' | 'yaml' | 'toml';
|
|
6
|
+
};
|
|
7
|
+
export declare const FILE_TYPES: Record<string, FileTypeConfig>;
|
|
8
|
+
/**
|
|
9
|
+
* Resolves a schema's `files` array of type identifiers to a flat list of file extensions.
|
|
10
|
+
* Used by storage adapters for file discovery filtering.
|
|
11
|
+
* @param {Record<string, unknown>} schema - A collection JSON Schema with an optional `files` array
|
|
12
|
+
* @return {string[]} Ordered list of extensions (e.g. ['.md', '.markdown', '.json'])
|
|
13
|
+
*/
|
|
14
|
+
export declare function getExtensionsForSchema(schema: Record<string, unknown>): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Returns whether a file should show the body editor panel.
|
|
17
|
+
* True for markdown, MDX, and Markdoc files; false for pure data files.
|
|
18
|
+
* @param {string} filename - The filename to check
|
|
19
|
+
* @return {boolean} True if the file type has a body editor
|
|
20
|
+
*/
|
|
21
|
+
export declare function hasBodyEditor(filename: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Returns the category of a file based on its extension.
|
|
24
|
+
* Used to determine whether to render frontmatter fields or data-only fields.
|
|
25
|
+
* @param {string} filename - The filename to categorise
|
|
26
|
+
* @return {'frontmatter' | 'data' | null} The file category, or null for unrecognised extensions
|
|
27
|
+
*/
|
|
28
|
+
export declare function getFileCategory(filename: string): 'frontmatter' | 'data' | null;
|
|
29
|
+
/**
|
|
30
|
+
* Returns the serialization format for a data file.
|
|
31
|
+
* Returns null for frontmatter files and unrecognised extensions.
|
|
32
|
+
* @param {string} filename - The filename to inspect
|
|
33
|
+
* @return {'json' | 'yaml' | 'toml' | null} The data format, or null if not a data file
|
|
34
|
+
*/
|
|
35
|
+
export declare function getDataFormat(filename: string): 'json' | 'yaml' | 'toml' | null;
|
|
36
|
+
/**
|
|
37
|
+
* Strips the file extension from a filename when the extension is a known type.
|
|
38
|
+
* Returns the filename unchanged if the extension is not recognised.
|
|
39
|
+
* Used for generating URL slugs from filenames.
|
|
40
|
+
* @param {string} filename - The filename to strip the extension from
|
|
41
|
+
* @return {string} The filename without its known extension, or the original filename
|
|
42
|
+
*/
|
|
43
|
+
export declare function stripExtension(filename: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the default (first) file extension for a given type identifier.
|
|
46
|
+
* Used when creating new files to pick the canonical extension for a format.
|
|
47
|
+
* @param {string} type - A type identifier (e.g. 'md', 'yaml', 'toml')
|
|
48
|
+
* @return {string | null} The default extension including the leading dot, or null for unknown types
|
|
49
|
+
*/
|
|
50
|
+
export declare function getDefaultExtension(type: string): string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Returns the type identifier for a given filename by looking up its extension.
|
|
53
|
+
* Used when the active file's type must be determined for the format selector.
|
|
54
|
+
* @param {string} filename - The filename to look up
|
|
55
|
+
* @return {string | null} The type identifier (e.g. 'md', 'yaml'), or null for unrecognised extensions
|
|
56
|
+
*/
|
|
57
|
+
export declare function getTypeForFilename(filename: string): string | null;
|
|
58
|
+
//# sourceMappingURL=file-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-types.d.ts","sourceRoot":"","sources":["../../../../src/client/js/utils/file-types.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG;IAE3B,UAAU,EAAE,MAAM,EAAE,CAAC;IAErB,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC;IAEjC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CACvC,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAkCrD,CAAC;AA6CF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,EAAE,CAYV;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,GACf,aAAa,GAAG,MAAM,GAAG,IAAI,CAG/B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAElE"}
|
|
@@ -4,158 +4,128 @@
|
|
|
4
4
|
* (storage adapters, orchestrator worker, editor, publish handler) derive
|
|
5
5
|
* extension lists, category, and serialization format from this registry.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
// Configuration for a single supported file type.
|
|
9
|
-
export type FileTypeConfig = {
|
|
10
|
-
// All file extensions associated with this type, first entry is the default.
|
|
11
|
-
extensions: string[];
|
|
12
|
-
// Whether this type has a body editor (markdown/MDX/Markdoc).
|
|
13
|
-
hasBody: boolean;
|
|
14
|
-
// Whether the file holds frontmatter+body or pure data.
|
|
15
|
-
category: 'frontmatter' | 'data';
|
|
16
|
-
// For data files, which serialization format to use.
|
|
17
|
-
dataFormat?: 'json' | 'yaml' | 'toml';
|
|
18
|
-
};
|
|
19
|
-
|
|
20
7
|
// Registry mapping type identifiers (as used in schema `files` arrays) to their config.
|
|
21
|
-
export const FILE_TYPES
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
8
|
+
export const FILE_TYPES = {
|
|
9
|
+
md: {
|
|
10
|
+
extensions: ['.md', '.markdown'],
|
|
11
|
+
hasBody: true,
|
|
12
|
+
category: 'frontmatter',
|
|
13
|
+
},
|
|
14
|
+
mdx: {
|
|
15
|
+
extensions: ['.mdx'],
|
|
16
|
+
hasBody: true,
|
|
17
|
+
category: 'frontmatter',
|
|
18
|
+
},
|
|
19
|
+
markdoc: {
|
|
20
|
+
extensions: ['.mdoc', '.markdoc'],
|
|
21
|
+
hasBody: true,
|
|
22
|
+
category: 'frontmatter',
|
|
23
|
+
},
|
|
24
|
+
json: {
|
|
25
|
+
extensions: ['.json'],
|
|
26
|
+
hasBody: false,
|
|
27
|
+
category: 'data',
|
|
28
|
+
dataFormat: 'json',
|
|
29
|
+
},
|
|
30
|
+
yaml: {
|
|
31
|
+
extensions: ['.yml', '.yaml'],
|
|
32
|
+
hasBody: false,
|
|
33
|
+
category: 'data',
|
|
34
|
+
dataFormat: 'yaml',
|
|
35
|
+
},
|
|
36
|
+
toml: {
|
|
37
|
+
extensions: ['.toml'],
|
|
38
|
+
hasBody: false,
|
|
39
|
+
category: 'data',
|
|
40
|
+
dataFormat: 'toml',
|
|
41
|
+
},
|
|
55
42
|
};
|
|
56
|
-
|
|
57
43
|
/*
|
|
58
44
|
//////////////////////////////
|
|
59
45
|
// Extension reverse-lookup map
|
|
60
46
|
// Built once at module load for O(1) extension-to-config lookups.
|
|
61
47
|
//////////////////////////////
|
|
62
48
|
*/
|
|
63
|
-
|
|
64
49
|
// Maps each known extension to its FileTypeConfig.
|
|
65
|
-
const extensionMap = new Map
|
|
66
|
-
|
|
50
|
+
const extensionMap = new Map();
|
|
67
51
|
// Maps each known extension to its type identifier (e.g. '.md' -> 'md').
|
|
68
|
-
const extensionToTypeID = new Map
|
|
69
|
-
|
|
52
|
+
const extensionToTypeID = new Map();
|
|
70
53
|
for (const [typeId, config] of Object.entries(FILE_TYPES)) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
54
|
+
for (const ext of config.extensions) {
|
|
55
|
+
extensionMap.set(ext, config);
|
|
56
|
+
extensionToTypeID.set(ext, typeId);
|
|
57
|
+
}
|
|
75
58
|
}
|
|
76
|
-
|
|
77
59
|
/*
|
|
78
60
|
//////////////////////////////
|
|
79
61
|
// Helper: extract extension
|
|
80
62
|
//////////////////////////////
|
|
81
63
|
*/
|
|
82
|
-
|
|
83
64
|
/**
|
|
84
65
|
* Extracts the last dot-prefixed extension from a filename, or an empty string if none.
|
|
85
66
|
* @param {string} filename - The filename to extract the extension from
|
|
86
67
|
* @return {string} The extension including the leading dot (e.g. '.md'), or ''
|
|
87
68
|
*/
|
|
88
|
-
function getExtension(filename
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
69
|
+
function getExtension(filename) {
|
|
70
|
+
const idx = filename.lastIndexOf('.');
|
|
71
|
+
if (idx === -1)
|
|
72
|
+
return '';
|
|
73
|
+
return filename.slice(idx);
|
|
92
74
|
}
|
|
93
|
-
|
|
94
75
|
/*
|
|
95
76
|
//////////////////////////////
|
|
96
77
|
// Exported helpers
|
|
97
78
|
//////////////////////////////
|
|
98
79
|
*/
|
|
99
|
-
|
|
100
80
|
/**
|
|
101
81
|
* Resolves a schema's `files` array of type identifiers to a flat list of file extensions.
|
|
102
82
|
* Used by storage adapters for file discovery filtering.
|
|
103
83
|
* @param {Record<string, unknown>} schema - A collection JSON Schema with an optional `files` array
|
|
104
84
|
* @return {string[]} Ordered list of extensions (e.g. ['.md', '.markdown', '.json'])
|
|
105
85
|
*/
|
|
106
|
-
export function getExtensionsForSchema(
|
|
107
|
-
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
extensions.push(...config.extensions);
|
|
86
|
+
export function getExtensionsForSchema(schema) {
|
|
87
|
+
const files = schema['files'];
|
|
88
|
+
if (!Array.isArray(files))
|
|
89
|
+
return [];
|
|
90
|
+
const extensions = [];
|
|
91
|
+
for (const typeId of files) {
|
|
92
|
+
const config = FILE_TYPES[typeId];
|
|
93
|
+
if (config) {
|
|
94
|
+
extensions.push(...config.extensions);
|
|
95
|
+
}
|
|
117
96
|
}
|
|
118
|
-
|
|
119
|
-
return extensions;
|
|
97
|
+
return extensions;
|
|
120
98
|
}
|
|
121
|
-
|
|
122
99
|
/**
|
|
123
100
|
* Returns whether a file should show the body editor panel.
|
|
124
101
|
* True for markdown, MDX, and Markdoc files; false for pure data files.
|
|
125
102
|
* @param {string} filename - The filename to check
|
|
126
103
|
* @return {boolean} True if the file type has a body editor
|
|
127
104
|
*/
|
|
128
|
-
export function hasBodyEditor(filename
|
|
129
|
-
|
|
130
|
-
|
|
105
|
+
export function hasBodyEditor(filename) {
|
|
106
|
+
const config = extensionMap.get(getExtension(filename));
|
|
107
|
+
return config?.hasBody ?? false;
|
|
131
108
|
}
|
|
132
|
-
|
|
133
109
|
/**
|
|
134
110
|
* Returns the category of a file based on its extension.
|
|
135
111
|
* Used to determine whether to render frontmatter fields or data-only fields.
|
|
136
112
|
* @param {string} filename - The filename to categorise
|
|
137
113
|
* @return {'frontmatter' | 'data' | null} The file category, or null for unrecognised extensions
|
|
138
114
|
*/
|
|
139
|
-
export function getFileCategory(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const config = extensionMap.get(getExtension(filename));
|
|
143
|
-
return config?.category ?? null;
|
|
115
|
+
export function getFileCategory(filename) {
|
|
116
|
+
const config = extensionMap.get(getExtension(filename));
|
|
117
|
+
return config?.category ?? null;
|
|
144
118
|
}
|
|
145
|
-
|
|
146
119
|
/**
|
|
147
120
|
* Returns the serialization format for a data file.
|
|
148
121
|
* Returns null for frontmatter files and unrecognised extensions.
|
|
149
122
|
* @param {string} filename - The filename to inspect
|
|
150
123
|
* @return {'json' | 'yaml' | 'toml' | null} The data format, or null if not a data file
|
|
151
124
|
*/
|
|
152
|
-
export function getDataFormat(
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const config = extensionMap.get(getExtension(filename));
|
|
156
|
-
return config?.dataFormat ?? null;
|
|
125
|
+
export function getDataFormat(filename) {
|
|
126
|
+
const config = extensionMap.get(getExtension(filename));
|
|
127
|
+
return config?.dataFormat ?? null;
|
|
157
128
|
}
|
|
158
|
-
|
|
159
129
|
/**
|
|
160
130
|
* Strips the file extension from a filename when the extension is a known type.
|
|
161
131
|
* Returns the filename unchanged if the extension is not recognised.
|
|
@@ -163,30 +133,28 @@ export function getDataFormat(
|
|
|
163
133
|
* @param {string} filename - The filename to strip the extension from
|
|
164
134
|
* @return {string} The filename without its known extension, or the original filename
|
|
165
135
|
*/
|
|
166
|
-
export function stripExtension(filename
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
136
|
+
export function stripExtension(filename) {
|
|
137
|
+
const ext = getExtension(filename);
|
|
138
|
+
if (ext && extensionMap.has(ext)) {
|
|
139
|
+
return filename.slice(0, filename.length - ext.length);
|
|
140
|
+
}
|
|
141
|
+
return filename;
|
|
172
142
|
}
|
|
173
|
-
|
|
174
143
|
/**
|
|
175
144
|
* Returns the default (first) file extension for a given type identifier.
|
|
176
145
|
* Used when creating new files to pick the canonical extension for a format.
|
|
177
146
|
* @param {string} type - A type identifier (e.g. 'md', 'yaml', 'toml')
|
|
178
147
|
* @return {string | null} The default extension including the leading dot, or null for unknown types
|
|
179
148
|
*/
|
|
180
|
-
export function getDefaultExtension(type
|
|
181
|
-
|
|
149
|
+
export function getDefaultExtension(type) {
|
|
150
|
+
return FILE_TYPES[type]?.extensions[0] ?? null;
|
|
182
151
|
}
|
|
183
|
-
|
|
184
152
|
/**
|
|
185
153
|
* Returns the type identifier for a given filename by looking up its extension.
|
|
186
154
|
* Used when the active file's type must be determined for the format selector.
|
|
187
155
|
* @param {string} filename - The filename to look up
|
|
188
156
|
* @return {string | null} The type identifier (e.g. 'md', 'yaml'), or null for unrecognised extensions
|
|
189
157
|
*/
|
|
190
|
-
export function getTypeForFilename(filename
|
|
191
|
-
|
|
158
|
+
export function getTypeForFilename(filename) {
|
|
159
|
+
return extensionToTypeID.get(getExtension(filename)) ?? null;
|
|
192
160
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a property name string to Title Case for display in form labels.
|
|
3
|
+
* Splits on camelCase boundaries, hyphens, and underscores, then capitalizes each word.
|
|
4
|
+
* @param {string} str - The raw property name to convert (e.g., "firstName", "last-name", "zip_code")
|
|
5
|
+
* @return {string} The title-cased display string (e.g., "First Name", "Last Name", "Zip Code")
|
|
6
|
+
*/
|
|
7
|
+
export declare function toTitleCase(str: string): string;
|
|
8
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/client/js/utils/format.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C"}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Display formatting utilities for property names and labels.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
/**
|
|
6
5
|
* Converts a property name string to Title Case for display in form labels.
|
|
7
6
|
* Splits on camelCase boundaries, hyphens, and underscores, then capitalizes each word.
|
|
8
7
|
* @param {string} str - The raw property name to convert (e.g., "firstName", "last-name", "zip_code")
|
|
9
8
|
* @return {string} The title-cased display string (e.g., "First Name", "Last Name", "Zip Code")
|
|
10
9
|
*/
|
|
11
|
-
export function toTitleCase(str
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
export function toTitleCase(str) {
|
|
11
|
+
return str
|
|
12
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
13
|
+
.replace(/[-_]/g, ' ')
|
|
14
|
+
.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
16
15
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type SplitResult = {
|
|
2
|
+
rawFrontmatter: string;
|
|
3
|
+
body: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Splits a markdown/MDX file into raw YAML frontmatter and body content.
|
|
7
|
+
* Handles BOM stripping, CRLF normalization, and horizontal rule rejection.
|
|
8
|
+
* @param {string} content - Raw file content
|
|
9
|
+
* @return {SplitResult} The separated frontmatter and body strings
|
|
10
|
+
*/
|
|
11
|
+
export declare function splitFrontmatter(content: string): SplitResult;
|
|
12
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../../../src/client/js/utils/frontmatter.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAyB7D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits a markdown/MDX file into raw YAML frontmatter and body content.
|
|
3
|
+
* Handles BOM stripping, CRLF normalization, and horizontal rule rejection.
|
|
4
|
+
* @param {string} content - Raw file content
|
|
5
|
+
* @return {SplitResult} The separated frontmatter and body strings
|
|
6
|
+
*/
|
|
7
|
+
export function splitFrontmatter(content) {
|
|
8
|
+
let str = content.startsWith('\uFEFF') ? content.slice(1) : content;
|
|
9
|
+
str = str.replace(/\r\n/g, '\n');
|
|
10
|
+
// Reject horizontal rules (----) and content not starting with frontmatter delimiter
|
|
11
|
+
if (str.startsWith('----') || !str.startsWith('---\n')) {
|
|
12
|
+
return { rawFrontmatter: '', body: str };
|
|
13
|
+
}
|
|
14
|
+
const closeIndex = str.indexOf('\n---\n', 3);
|
|
15
|
+
if (closeIndex === -1) {
|
|
16
|
+
// Check for --- at end of file with no trailing newline
|
|
17
|
+
if (str.endsWith('\n---')) {
|
|
18
|
+
return {
|
|
19
|
+
rawFrontmatter: str.slice(4, str.length - 4),
|
|
20
|
+
body: '',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return { rawFrontmatter: '', body: str };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
rawFrontmatter: str.slice(4, closeIndex),
|
|
27
|
+
body: str.slice(closeIndex + 5),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export type SchemaNode = Record<string, unknown>;
|
|
2
|
+
/**
|
|
3
|
+
* Discriminated union describing the resolved type of a schema field. All variants carry an optional `nullable` flag set when the field was expressed as `anyOf: [<type>, { type: 'null' }]`.
|
|
4
|
+
*/
|
|
5
|
+
export type FieldType = {
|
|
6
|
+
kind: 'string';
|
|
7
|
+
nullable?: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'number';
|
|
10
|
+
nullable?: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'boolean';
|
|
13
|
+
nullable?: boolean;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'date';
|
|
16
|
+
nullable?: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'enum';
|
|
19
|
+
options: string[];
|
|
20
|
+
nullable?: boolean;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'array';
|
|
23
|
+
nullable?: boolean;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'object';
|
|
26
|
+
nullable?: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'unknown';
|
|
29
|
+
nullable?: boolean;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* A path segment used to address nested values. Strings address object keys; numbers address array indices.
|
|
33
|
+
*/
|
|
34
|
+
export type PathSegment = string | number;
|
|
35
|
+
/**
|
|
36
|
+
* Resolves a JSON Schema node to a `FieldType` discriminated union.
|
|
37
|
+
* Handles anyOf nullable unwrapping, enum detection, and date-time format.
|
|
38
|
+
* @param {SchemaNode} schema - The JSON Schema node to resolve
|
|
39
|
+
* @return {FieldType} The resolved field type descriptor
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveFieldType(schema: SchemaNode): FieldType;
|
|
42
|
+
/**
|
|
43
|
+
* Scans an object schema's properties for `tab` arrays and returns a sorted, deduplicated list of all tab names found.
|
|
44
|
+
* @param {SchemaNode} schema - A JSON Schema node with an optional `properties` map
|
|
45
|
+
* @return {string[]} Sorted, deduplicated list of tab names
|
|
46
|
+
*/
|
|
47
|
+
export declare function extractTabs(schema: SchemaNode): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Returns a type-appropriate default value for a given JSON Schema node.
|
|
50
|
+
* Honors `schema.default` when present, returns null for nullable types, and recurses into object properties.
|
|
51
|
+
* @param {SchemaNode} schema - The JSON Schema node to generate a default value for
|
|
52
|
+
* @return {unknown} A default value appropriate for the schema type
|
|
53
|
+
*/
|
|
54
|
+
export declare function createDefaultValue(schema: SchemaNode): unknown;
|
|
55
|
+
/**
|
|
56
|
+
* Reads a deeply nested value from an object by following path segments.
|
|
57
|
+
* Returns `undefined` if any segment along the path is missing.
|
|
58
|
+
* @param {unknown} obj - The root object to traverse
|
|
59
|
+
* @param {PathSegment[]} path - Ordered path segments (string keys or numeric indices)
|
|
60
|
+
* @return {unknown} The value at the resolved path, or undefined if any segment is missing
|
|
61
|
+
*/
|
|
62
|
+
export declare function getByPath(obj: unknown, path: PathSegment[]): unknown;
|
|
63
|
+
/**
|
|
64
|
+
* Sets a deeply nested value in an object by following path segments, creating intermediate objects as needed.
|
|
65
|
+
* @param {unknown} obj - The root object to mutate
|
|
66
|
+
* @param {PathSegment[]} path - Ordered path segments (string keys or numeric indices)
|
|
67
|
+
* @param {unknown} value - The value to assign at the resolved path
|
|
68
|
+
* @return {void}
|
|
69
|
+
*/
|
|
70
|
+
export declare function setByPath(obj: unknown, path: PathSegment[], value: unknown): void;
|
|
71
|
+
/**
|
|
72
|
+
* Returns property names from a schema that belong to the given tab.
|
|
73
|
+
* When `tab` is `null`, all property names are returned (no filtering — every field appears in the catch-all Metadata view).
|
|
74
|
+
* @param {SchemaNode} schema - A JSON Schema node with an optional `properties` map
|
|
75
|
+
* @param {string | null} tab - Tab name to filter by, or `null` to return all fields
|
|
76
|
+
* @return {string[]} Array of property names belonging to the specified tab
|
|
77
|
+
*/
|
|
78
|
+
export declare function getFieldsForTab(schema: SchemaNode, tab: string | null): string[];
|
|
79
|
+
/**
|
|
80
|
+
* Extracts the `properties` map from a schema node, with a safe cast.
|
|
81
|
+
* @param {SchemaNode} schema - A JSON Schema node
|
|
82
|
+
* @return {Record<string, SchemaNode> | undefined} The properties map, or undefined if absent
|
|
83
|
+
*/
|
|
84
|
+
export declare function getProperties(schema: SchemaNode): Record<string, SchemaNode> | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Extracts the `required` array from a schema node, returning an empty array if absent.
|
|
87
|
+
* @param {SchemaNode} schema - A JSON Schema node
|
|
88
|
+
* @return {string[]} Array of required property names
|
|
89
|
+
*/
|
|
90
|
+
export declare function getRequiredFields(schema: SchemaNode): string[];
|
|
91
|
+
/**
|
|
92
|
+
* Returns whether a schema node is marked as read-only.
|
|
93
|
+
* @param {SchemaNode} schema - A JSON Schema node
|
|
94
|
+
* @return {boolean} True if the schema has readOnly set to true
|
|
95
|
+
*/
|
|
96
|
+
export declare function isReadOnly(schema: SchemaNode): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Returns whether a schema node was unwrapped from a nullable anyOf and flagged as nullable by SchemaField.
|
|
99
|
+
* @param {SchemaNode} schema - A JSON Schema node (possibly annotated with _nullable)
|
|
100
|
+
* @return {boolean} True if the schema has the _nullable annotation
|
|
101
|
+
*/
|
|
102
|
+
export declare function isNullable(schema: SchemaNode): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Returns the display label for a schema field — the schema title if present, otherwise the property name converted to title case.
|
|
105
|
+
* @param {SchemaNode} schema - A JSON Schema node
|
|
106
|
+
* @param {string} name - The raw property name used as a fallback
|
|
107
|
+
* @return {string} The human-readable label
|
|
108
|
+
*/
|
|
109
|
+
export declare function getLabel(schema: SchemaNode, name: string): string;
|
|
110
|
+
//# sourceMappingURL=schema-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-utils.d.ts","sourceRoot":"","sources":["../../../../src/client/js/utils/schema-utils.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAQ1C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAgC9D;AAQD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAgBxD;AAQD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CA+B9D;AAQD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAOpE;AAQD;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,WAAW,EAAE,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CAeN;AAQD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,GAAG,IAAI,GACjB,MAAM,EAAE,CAiBV;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,GACjB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAExC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAI9D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE"}
|