nebula-cms 0.1.0 → 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.
Files changed (386) hide show
  1. package/README.md +2 -0
  2. package/dist/astro/index.d.ts +43 -0
  3. package/dist/astro/index.d.ts.map +1 -0
  4. package/dist/astro/index.js +223 -0
  5. package/dist/client/Admin.svelte.d.ts +11 -0
  6. package/dist/client/Admin.svelte.d.ts.map +1 -0
  7. package/dist/client/components/BackendPicker.svelte.d.ts +4 -0
  8. package/dist/client/components/BackendPicker.svelte.d.ts.map +1 -0
  9. package/dist/client/components/DraftChip.svelte.d.ts +10 -0
  10. package/dist/client/components/DraftChip.svelte.d.ts.map +1 -0
  11. package/dist/client/components/MetadataForm.svelte.d.ts +12 -0
  12. package/dist/client/components/MetadataForm.svelte.d.ts.map +1 -0
  13. package/dist/client/components/ThemeToggle.svelte.d.ts +19 -0
  14. package/dist/client/components/ThemeToggle.svelte.d.ts.map +1 -0
  15. package/dist/client/components/dialogs/DeleteDraftDialog.svelte.d.ts +11 -0
  16. package/dist/client/components/dialogs/DeleteDraftDialog.svelte.d.ts.map +1 -0
  17. package/dist/client/components/dialogs/FilenameDialog.svelte.d.ts +13 -0
  18. package/dist/client/components/dialogs/FilenameDialog.svelte.d.ts.map +1 -0
  19. package/dist/client/components/editor/EditorPane.svelte.d.ts +4 -0
  20. package/dist/client/components/editor/EditorPane.svelte.d.ts.map +1 -0
  21. package/dist/client/components/editor/EditorTabs.svelte.d.ts +8 -0
  22. package/dist/client/components/editor/EditorTabs.svelte.d.ts.map +1 -0
  23. package/dist/client/components/editor/EditorToolbar.svelte.d.ts +4 -0
  24. package/dist/client/components/editor/EditorToolbar.svelte.d.ts.map +1 -0
  25. package/dist/client/components/editor/FormatSelector.svelte.d.ts +4 -0
  26. package/dist/client/components/editor/FormatSelector.svelte.d.ts.map +1 -0
  27. package/dist/client/components/editor/Toolbar.svelte.d.ts +19 -0
  28. package/dist/client/components/editor/Toolbar.svelte.d.ts.map +1 -0
  29. package/dist/client/components/fields/ArrayField.svelte.d.ts +15 -0
  30. package/dist/client/components/fields/ArrayField.svelte.d.ts.map +1 -0
  31. package/dist/client/components/fields/ArrayItem.svelte.d.ts +28 -0
  32. package/dist/client/components/fields/ArrayItem.svelte.d.ts.map +1 -0
  33. package/dist/client/components/fields/BooleanField.svelte.d.ts +16 -0
  34. package/dist/client/components/fields/BooleanField.svelte.d.ts.map +1 -0
  35. package/dist/client/components/fields/DateField.svelte.d.ts +16 -0
  36. package/dist/client/components/fields/DateField.svelte.d.ts.map +1 -0
  37. package/dist/client/components/fields/EnumField.svelte.d.ts +17 -0
  38. package/dist/client/components/fields/EnumField.svelte.d.ts.map +1 -0
  39. package/dist/client/components/fields/FieldWrapper.svelte.d.ts +18 -0
  40. package/dist/client/components/fields/FieldWrapper.svelte.d.ts.map +1 -0
  41. package/dist/client/components/fields/NumberField.svelte.d.ts +16 -0
  42. package/dist/client/components/fields/NumberField.svelte.d.ts.map +1 -0
  43. package/dist/client/components/fields/ObjectField.svelte.d.ts +16 -0
  44. package/dist/client/components/fields/ObjectField.svelte.d.ts.map +1 -0
  45. package/dist/client/components/fields/SchemaField.svelte.d.ts +16 -0
  46. package/dist/client/components/fields/SchemaField.svelte.d.ts.map +1 -0
  47. package/dist/client/components/fields/StringField.svelte.d.ts +16 -0
  48. package/dist/client/components/fields/StringField.svelte.d.ts.map +1 -0
  49. package/dist/client/components/sidebar/AdminSidebar.svelte.d.ts +19 -0
  50. package/dist/client/components/sidebar/AdminSidebar.svelte.d.ts.map +1 -0
  51. package/dist/client/components/sidebar/AdminSidebarSort.svelte.d.ts +12 -0
  52. package/dist/client/components/sidebar/AdminSidebarSort.svelte.d.ts.map +1 -0
  53. package/dist/client/css/icons.css +29 -0
  54. package/dist/client/index.d.ts +2 -0
  55. package/dist/client/index.d.ts.map +1 -0
  56. package/dist/client/js/drafts/merge.svelte.d.ts +24 -0
  57. package/dist/client/js/drafts/merge.svelte.d.ts.map +1 -0
  58. package/dist/client/js/drafts/merge.svelte.js +106 -0
  59. package/dist/client/js/drafts/ops.svelte.d.ts +31 -0
  60. package/dist/client/js/drafts/ops.svelte.d.ts.map +1 -0
  61. package/dist/client/js/drafts/ops.svelte.js +182 -0
  62. package/dist/client/js/drafts/storage.d.ts +45 -0
  63. package/dist/client/js/drafts/storage.d.ts.map +1 -0
  64. package/dist/client/js/drafts/storage.js +76 -0
  65. package/dist/client/js/drafts/workers/diff.d.ts +2 -0
  66. package/dist/client/js/drafts/workers/diff.d.ts.map +1 -0
  67. package/dist/client/js/drafts/workers/diff.js +20 -0
  68. package/dist/client/js/editor/editor.svelte.d.ts +124 -0
  69. package/dist/client/js/editor/editor.svelte.d.ts.map +1 -0
  70. package/dist/client/js/editor/editor.svelte.js +294 -0
  71. package/dist/client/js/editor/languages.d.ts +11 -0
  72. package/dist/client/js/editor/languages.d.ts.map +1 -0
  73. package/dist/client/js/editor/languages.js +93 -0
  74. package/dist/client/js/editor/link-wrap.d.ts +6 -0
  75. package/dist/client/js/editor/link-wrap.d.ts.map +1 -0
  76. package/{src/client/js/editor/link-wrap.ts → dist/client/js/editor/link-wrap.js} +17 -24
  77. package/dist/client/js/editor/markdown-shortcuts.d.ts +4 -0
  78. package/dist/client/js/editor/markdown-shortcuts.d.ts.map +1 -0
  79. package/dist/client/js/editor/markdown-shortcuts.js +219 -0
  80. package/dist/client/js/handlers/admin.d.ts +64 -0
  81. package/dist/client/js/handlers/admin.d.ts.map +1 -0
  82. package/dist/client/js/handlers/admin.js +186 -0
  83. package/dist/client/js/state/dialogs.svelte.d.ts +16 -0
  84. package/dist/client/js/state/dialogs.svelte.d.ts.map +1 -0
  85. package/dist/client/js/state/dialogs.svelte.js +28 -0
  86. package/dist/client/js/state/router.svelte.d.ts +44 -0
  87. package/dist/client/js/state/router.svelte.d.ts.map +1 -0
  88. package/dist/client/js/state/router.svelte.js +135 -0
  89. package/dist/client/js/state/schema.svelte.d.ts +51 -0
  90. package/dist/client/js/state/schema.svelte.d.ts.map +1 -0
  91. package/{src/client/js/state/schema.svelte.ts → dist/client/js/state/schema.svelte.js} +55 -70
  92. package/dist/client/js/state/state.svelte.d.ts +68 -0
  93. package/dist/client/js/state/state.svelte.d.ts.map +1 -0
  94. package/dist/client/js/state/state.svelte.js +291 -0
  95. package/dist/client/js/state/theme.svelte.d.ts +24 -0
  96. package/dist/client/js/state/theme.svelte.d.ts.map +1 -0
  97. package/{src/client/js/state/theme.svelte.ts → dist/client/js/state/theme.svelte.js} +54 -91
  98. package/dist/client/js/storage/adapter.d.ts +130 -0
  99. package/dist/client/js/storage/adapter.d.ts.map +1 -0
  100. package/dist/client/js/storage/adapter.js +5 -0
  101. package/dist/client/js/storage/client.d.ts +72 -0
  102. package/dist/client/js/storage/client.d.ts.map +1 -0
  103. package/dist/client/js/storage/client.js +121 -0
  104. package/dist/client/js/storage/db.d.ts +8 -0
  105. package/dist/client/js/storage/db.d.ts.map +1 -0
  106. package/dist/client/js/storage/db.js +35 -0
  107. package/dist/client/js/storage/fsa.d.ts +51 -0
  108. package/dist/client/js/storage/fsa.d.ts.map +1 -0
  109. package/dist/client/js/storage/fsa.js +91 -0
  110. package/dist/client/js/storage/github.d.ts +62 -0
  111. package/dist/client/js/storage/github.d.ts.map +1 -0
  112. package/dist/client/js/storage/github.js +216 -0
  113. package/dist/client/js/storage/storage.d.ts +32 -0
  114. package/dist/client/js/storage/storage.d.ts.map +1 -0
  115. package/dist/client/js/storage/storage.js +68 -0
  116. package/dist/client/js/storage/workers/frontmatter.d.ts +2 -0
  117. package/dist/client/js/storage/workers/frontmatter.d.ts.map +1 -0
  118. package/dist/client/js/storage/workers/frontmatter.js +253 -0
  119. package/dist/client/js/storage/workers/storage.d.ts +2 -0
  120. package/dist/client/js/storage/workers/storage.d.ts.map +1 -0
  121. package/dist/client/js/storage/workers/storage.js +167 -0
  122. package/dist/client/js/storage/workers/toml-parser.d.ts +2 -0
  123. package/dist/client/js/storage/workers/toml-parser.d.ts.map +1 -0
  124. package/dist/client/js/storage/workers/toml-parser.js +75 -0
  125. package/dist/client/js/storage/workers/yaml-parser.d.ts +2 -0
  126. package/dist/client/js/storage/workers/yaml-parser.d.ts.map +1 -0
  127. package/dist/client/js/storage/workers/yaml-parser.js +100 -0
  128. package/dist/client/js/utils/file-types.d.ts +58 -0
  129. package/dist/client/js/utils/file-types.d.ts.map +1 -0
  130. package/{src/client/js/utils/file-types.ts → dist/client/js/utils/file-types.js} +75 -107
  131. package/dist/client/js/utils/format.d.ts +8 -0
  132. package/dist/client/js/utils/format.d.ts.map +1 -0
  133. package/{src/client/js/utils/format.ts → dist/client/js/utils/format.js} +5 -6
  134. package/dist/client/js/utils/frontmatter.d.ts +12 -0
  135. package/dist/client/js/utils/frontmatter.d.ts.map +1 -0
  136. package/dist/client/js/utils/frontmatter.js +29 -0
  137. package/dist/client/js/utils/schema-utils.d.ts +110 -0
  138. package/dist/client/js/utils/schema-utils.d.ts.map +1 -0
  139. package/dist/client/js/utils/schema-utils.js +242 -0
  140. package/dist/client/js/utils/slug.d.ts +8 -0
  141. package/dist/client/js/utils/slug.d.ts.map +1 -0
  142. package/{src/client/js/utils/slug.ts → dist/client/js/utils/slug.js} +6 -7
  143. package/dist/client/js/utils/sort.d.ts +41 -0
  144. package/dist/client/js/utils/sort.d.ts.map +1 -0
  145. package/dist/client/js/utils/sort.js +65 -0
  146. package/dist/client/js/utils/stable-stringify.d.ts +8 -0
  147. package/dist/client/js/utils/stable-stringify.d.ts.map +1 -0
  148. package/dist/client/js/utils/stable-stringify.js +23 -0
  149. package/dist/client/js/utils/url-utils.d.ts +11 -0
  150. package/dist/client/js/utils/url-utils.d.ts.map +1 -0
  151. package/{src/client/js/utils/url-utils.ts → dist/client/js/utils/url-utils.js} +22 -23
  152. package/dist/types.d.ts +22 -0
  153. package/dist/types.d.ts.map +1 -0
  154. package/dist/types.js +1 -0
  155. package/package.json +8 -1
  156. package/.claude/settings.local.json +0 -42
  157. package/.github/workflows/ci.yml +0 -31
  158. package/.mcp.json +0 -12
  159. package/.prettierignore +0 -5
  160. package/.prettierrc.cjs +0 -22
  161. package/AGENTS.md +0 -183
  162. package/playground/.claude/settings.local.json +0 -5
  163. package/playground/astro.config.mjs +0 -7
  164. package/playground/node_modules/.bin/astro +0 -21
  165. package/playground/node_modules/.bin/rollup +0 -21
  166. package/playground/node_modules/.bin/tsc +0 -21
  167. package/playground/node_modules/.bin/tsserver +0 -21
  168. package/playground/node_modules/.bin/vite +0 -21
  169. package/playground/node_modules/.vite/_svelte_metadata.json +0 -1
  170. package/playground/node_modules/.vite/deps/@astrojs_svelte_client__js.js +0 -80
  171. package/playground/node_modules/.vite/deps/@astrojs_svelte_client__js.js.map +0 -7
  172. package/playground/node_modules/.vite/deps/_metadata.json +0 -184
  173. package/playground/node_modules/.vite/deps/astro___aria-query.js +0 -6776
  174. package/playground/node_modules/.vite/deps/astro___aria-query.js.map +0 -7
  175. package/playground/node_modules/.vite/deps/astro___axobject-query.js +0 -3754
  176. package/playground/node_modules/.vite/deps/astro___axobject-query.js.map +0 -7
  177. package/playground/node_modules/.vite/deps/astro___html-escaper.js +0 -34
  178. package/playground/node_modules/.vite/deps/astro___html-escaper.js.map +0 -7
  179. package/playground/node_modules/.vite/deps/chunk-AJXJMYAF.js +0 -0
  180. package/playground/node_modules/.vite/deps/chunk-AJXJMYAF.js.map +0 -7
  181. package/playground/node_modules/.vite/deps/chunk-ALJIOON6.js +0 -1005
  182. package/playground/node_modules/.vite/deps/chunk-ALJIOON6.js.map +0 -7
  183. package/playground/node_modules/.vite/deps/chunk-BUSYA2B4.js +0 -8
  184. package/playground/node_modules/.vite/deps/chunk-BUSYA2B4.js.map +0 -7
  185. package/playground/node_modules/.vite/deps/chunk-CNYJBM5F.js +0 -21
  186. package/playground/node_modules/.vite/deps/chunk-CNYJBM5F.js.map +0 -7
  187. package/playground/node_modules/.vite/deps/chunk-DBPNBGEI.js +0 -223
  188. package/playground/node_modules/.vite/deps/chunk-DBPNBGEI.js.map +0 -7
  189. package/playground/node_modules/.vite/deps/chunk-G3C2FXJT.js +0 -204
  190. package/playground/node_modules/.vite/deps/chunk-G3C2FXJT.js.map +0 -7
  191. package/playground/node_modules/.vite/deps/chunk-GKDKFWC5.js +0 -27
  192. package/playground/node_modules/.vite/deps/chunk-GKDKFWC5.js.map +0 -7
  193. package/playground/node_modules/.vite/deps/chunk-HNCLEOC5.js +0 -4376
  194. package/playground/node_modules/.vite/deps/chunk-HNCLEOC5.js.map +0 -7
  195. package/playground/node_modules/.vite/deps/chunk-JICYXBFU.js +0 -688
  196. package/playground/node_modules/.vite/deps/chunk-JICYXBFU.js.map +0 -7
  197. package/playground/node_modules/.vite/deps/chunk-KCUTL6DD.js +0 -5099
  198. package/playground/node_modules/.vite/deps/chunk-KCUTL6DD.js.map +0 -7
  199. package/playground/node_modules/.vite/deps/chunk-ZP4UNCSN.js +0 -23
  200. package/playground/node_modules/.vite/deps/chunk-ZP4UNCSN.js.map +0 -7
  201. package/playground/node_modules/.vite/deps/chunk-ZREFNRZZ.js +0 -148
  202. package/playground/node_modules/.vite/deps/chunk-ZREFNRZZ.js.map +0 -7
  203. package/playground/node_modules/.vite/deps/package.json +0 -3
  204. package/playground/node_modules/.vite/deps/smol-toml.js +0 -843
  205. package/playground/node_modules/.vite/deps/smol-toml.js.map +0 -7
  206. package/playground/node_modules/.vite/deps/svelte.js +0 -55
  207. package/playground/node_modules/.vite/deps/svelte.js.map +0 -7
  208. package/playground/node_modules/.vite/deps/svelte___clsx.js +0 -9
  209. package/playground/node_modules/.vite/deps/svelte___clsx.js.map +0 -7
  210. package/playground/node_modules/.vite/deps/svelte_animate.js +0 -57
  211. package/playground/node_modules/.vite/deps/svelte_animate.js.map +0 -7
  212. package/playground/node_modules/.vite/deps/svelte_attachments.js +0 -15
  213. package/playground/node_modules/.vite/deps/svelte_attachments.js.map +0 -7
  214. package/playground/node_modules/.vite/deps/svelte_easing.js +0 -67
  215. package/playground/node_modules/.vite/deps/svelte_easing.js.map +0 -7
  216. package/playground/node_modules/.vite/deps/svelte_events.js +0 -11
  217. package/playground/node_modules/.vite/deps/svelte_events.js.map +0 -7
  218. package/playground/node_modules/.vite/deps/svelte_internal.js +0 -5
  219. package/playground/node_modules/.vite/deps/svelte_internal.js.map +0 -7
  220. package/playground/node_modules/.vite/deps/svelte_internal_client.js +0 -402
  221. package/playground/node_modules/.vite/deps/svelte_internal_client.js.map +0 -7
  222. package/playground/node_modules/.vite/deps/svelte_internal_disclose-version.js +0 -10
  223. package/playground/node_modules/.vite/deps/svelte_internal_disclose-version.js.map +0 -7
  224. package/playground/node_modules/.vite/deps/svelte_internal_flags_async.js +0 -8
  225. package/playground/node_modules/.vite/deps/svelte_internal_flags_async.js.map +0 -7
  226. package/playground/node_modules/.vite/deps/svelte_internal_flags_legacy.js +0 -8
  227. package/playground/node_modules/.vite/deps/svelte_internal_flags_legacy.js.map +0 -7
  228. package/playground/node_modules/.vite/deps/svelte_internal_flags_tracing.js +0 -8
  229. package/playground/node_modules/.vite/deps/svelte_internal_flags_tracing.js.map +0 -7
  230. package/playground/node_modules/.vite/deps/svelte_legacy.js +0 -35
  231. package/playground/node_modules/.vite/deps/svelte_legacy.js.map +0 -7
  232. package/playground/node_modules/.vite/deps/svelte_motion.js +0 -545
  233. package/playground/node_modules/.vite/deps/svelte_motion.js.map +0 -7
  234. package/playground/node_modules/.vite/deps/svelte_reactivity.js +0 -29
  235. package/playground/node_modules/.vite/deps/svelte_reactivity.js.map +0 -7
  236. package/playground/node_modules/.vite/deps/svelte_reactivity_window.js +0 -127
  237. package/playground/node_modules/.vite/deps/svelte_reactivity_window.js.map +0 -7
  238. package/playground/node_modules/.vite/deps/svelte_store.js +0 -103
  239. package/playground/node_modules/.vite/deps/svelte_store.js.map +0 -7
  240. package/playground/node_modules/.vite/deps/svelte_transition.js +0 -208
  241. package/playground/node_modules/.vite/deps/svelte_transition.js.map +0 -7
  242. package/playground/package.json +0 -16
  243. package/playground/pnpm-lock.yaml +0 -3167
  244. package/playground/src/content/authors/jane-doe.json +0 -8
  245. package/playground/src/content/config/build.toml +0 -2
  246. package/playground/src/content/courses/web-fundamentals.json +0 -29
  247. package/playground/src/content/docs/advanced.mdx +0 -6
  248. package/playground/src/content/docs/intro.md +0 -6
  249. package/playground/src/content/guides/getting-started.mdx +0 -6
  250. package/playground/src/content/posts/hello-world.md +0 -7
  251. package/playground/src/content/products/t-shirt.json +0 -16
  252. package/playground/src/content/recipes/pancakes.mdoc +0 -8
  253. package/playground/src/content/settings/site.yml +0 -2
  254. package/playground/src/content.config.ts +0 -198
  255. package/playground/src/env.d.ts +0 -1
  256. package/playground/src/pages/index.astro +0 -11
  257. package/playground/src/pages/nebula.astro +0 -14
  258. package/pnpm-workspace.yaml +0 -2
  259. package/scripts/subset-icons.mjs +0 -178
  260. package/src/astro/index.ts +0 -295
  261. package/src/client/js/drafts/merge.svelte.ts +0 -121
  262. package/src/client/js/drafts/ops.svelte.ts +0 -227
  263. package/src/client/js/drafts/storage.ts +0 -108
  264. package/src/client/js/drafts/workers/diff.ts +0 -40
  265. package/src/client/js/editor/editor.svelte.ts +0 -343
  266. package/src/client/js/editor/languages.ts +0 -98
  267. package/src/client/js/editor/markdown-shortcuts.ts +0 -261
  268. package/src/client/js/handlers/admin.ts +0 -246
  269. package/src/client/js/state/dialogs.svelte.ts +0 -35
  270. package/src/client/js/state/router.svelte.ts +0 -156
  271. package/src/client/js/state/state.svelte.ts +0 -334
  272. package/src/client/js/storage/adapter.ts +0 -102
  273. package/src/client/js/storage/client.ts +0 -150
  274. package/src/client/js/storage/db.ts +0 -36
  275. package/src/client/js/storage/fsa.ts +0 -110
  276. package/src/client/js/storage/github.ts +0 -297
  277. package/src/client/js/storage/storage.ts +0 -83
  278. package/src/client/js/storage/workers/frontmatter.ts +0 -320
  279. package/src/client/js/storage/workers/storage.ts +0 -177
  280. package/src/client/js/storage/workers/toml-parser.ts +0 -106
  281. package/src/client/js/storage/workers/yaml-parser.ts +0 -132
  282. package/src/client/js/utils/frontmatter.ts +0 -38
  283. package/src/client/js/utils/schema-utils.ts +0 -295
  284. package/src/client/js/utils/sort.ts +0 -84
  285. package/src/client/js/utils/stable-stringify.ts +0 -27
  286. package/src/types.ts +0 -25
  287. package/svelte.config.js +0 -4
  288. package/tests/astro/build.test.ts +0 -63
  289. package/tests/astro/index.test.ts +0 -689
  290. package/tests/client/components/Admin.test.ts +0 -446
  291. package/tests/client/components/BackendPicker.test.ts +0 -239
  292. package/tests/client/components/DraftChip.test.ts +0 -53
  293. package/tests/client/components/MetadataForm.test.ts +0 -164
  294. package/tests/client/components/dialogs/DeleteDraftDialog.test.ts +0 -91
  295. package/tests/client/components/dialogs/FilenameDialog.test.ts +0 -209
  296. package/tests/client/components/dialogs/dialog-stubs.ts +0 -19
  297. package/tests/client/components/editor/EditorPane.test.ts +0 -100
  298. package/tests/client/components/editor/EditorTabs.test.ts +0 -253
  299. package/tests/client/components/editor/EditorToolbar.test.ts +0 -252
  300. package/tests/client/components/editor/fixtures.ts +0 -31
  301. package/tests/client/components/fields/ArrayField.test.ts +0 -197
  302. package/tests/client/components/fields/BooleanField.test.ts +0 -206
  303. package/tests/client/components/fields/DateField.test.ts +0 -210
  304. package/tests/client/components/fields/EnumField.test.ts +0 -246
  305. package/tests/client/components/fields/NumberField.test.ts +0 -240
  306. package/tests/client/components/fields/ObjectField.test.ts +0 -157
  307. package/tests/client/components/fields/SchemaField.test.ts +0 -190
  308. package/tests/client/components/fields/StringField.test.ts +0 -223
  309. package/tests/client/components/sidebar/AdminSidebar.test.ts +0 -285
  310. package/tests/client/components/sidebar/AdminSidebarSort.test.ts +0 -135
  311. package/tests/client/components/sidebar/sort-mock.ts +0 -23
  312. package/tests/client/js/drafts/fixtures.ts +0 -22
  313. package/tests/client/js/drafts/merge.test.ts +0 -282
  314. package/tests/client/js/drafts/ops.test.ts +0 -658
  315. package/tests/client/js/drafts/storage.test.ts +0 -200
  316. package/tests/client/js/drafts/workers/diff.test.ts +0 -165
  317. package/tests/client/js/editor/editor.test.ts +0 -616
  318. package/tests/client/js/editor/link-wrap.test.ts +0 -225
  319. package/tests/client/js/editor/markdown-shortcuts.test.ts +0 -370
  320. package/tests/client/js/handlers/admin.test.ts +0 -467
  321. package/tests/client/js/state/router.test.ts +0 -619
  322. package/tests/client/js/state/schema.test.ts +0 -266
  323. package/tests/client/js/state/state.test.ts +0 -328
  324. package/tests/client/js/storage/adapter.test.ts +0 -115
  325. package/tests/client/js/storage/client.test.ts +0 -250
  326. package/tests/client/js/storage/db.test.ts +0 -59
  327. package/tests/client/js/storage/fsa.test.ts +0 -284
  328. package/tests/client/js/storage/github.test.ts +0 -349
  329. package/tests/client/js/storage/mock-port.ts +0 -95
  330. package/tests/client/js/storage/storage.test.ts +0 -77
  331. package/tests/client/js/storage/workers/frontmatter.test.ts +0 -479
  332. package/tests/client/js/storage/workers/storage.test.ts +0 -299
  333. package/tests/client/js/storage/workers/toml-parser.test.ts +0 -169
  334. package/tests/client/js/storage/workers/yaml-parser.test.ts +0 -168
  335. package/tests/client/js/utils/file-types.test.ts +0 -268
  336. package/tests/client/js/utils/frontmatter.test.ts +0 -87
  337. package/tests/client/js/utils/schema-utils.test.ts +0 -318
  338. package/tests/client/js/utils/slug.test.ts +0 -58
  339. package/tests/client/js/utils/sort.test.ts +0 -276
  340. package/tests/client/js/utils/stable-stringify.test.ts +0 -68
  341. package/tests/client/js/utils/url-utils.test.ts +0 -70
  342. package/tests/e2e/backend-connection.test.ts +0 -301
  343. package/tests/e2e/draft-lifecycle.test.ts +0 -388
  344. package/tests/e2e/editing.test.ts +0 -355
  345. package/tests/e2e/github-adapter.test.ts +0 -330
  346. package/tests/e2e/helpers/mock-adapter.ts +0 -166
  347. package/tests/e2e/helpers/test-app.ts +0 -155
  348. package/tests/e2e/navigation.test.ts +0 -358
  349. package/tests/e2e/publishing.test.ts +0 -345
  350. package/tests/e2e/unsaved-changes.test.ts +0 -317
  351. package/tests/setup.ts +0 -2
  352. package/tests/stubs/codemirror.ts +0 -197
  353. package/tsconfig.json +0 -19
  354. package/vitest.config.ts +0 -178
  355. /package/{src → dist}/client/Admin.svelte +0 -0
  356. /package/{src → dist}/client/components/BackendPicker.svelte +0 -0
  357. /package/{src → dist}/client/components/DraftChip.svelte +0 -0
  358. /package/{src → dist}/client/components/MetadataForm.svelte +0 -0
  359. /package/{src → dist}/client/components/ThemeToggle.svelte +0 -0
  360. /package/{src → dist}/client/components/dialogs/DeleteDraftDialog.svelte +0 -0
  361. /package/{src → dist}/client/components/dialogs/FilenameDialog.svelte +0 -0
  362. /package/{src → dist}/client/components/editor/EditorPane.svelte +0 -0
  363. /package/{src → dist}/client/components/editor/EditorTabs.svelte +0 -0
  364. /package/{src → dist}/client/components/editor/EditorToolbar.svelte +0 -0
  365. /package/{src → dist}/client/components/editor/FormatSelector.svelte +0 -0
  366. /package/{src → dist}/client/components/editor/Toolbar.svelte +0 -0
  367. /package/{src → dist}/client/components/fields/ArrayField.svelte +0 -0
  368. /package/{src → dist}/client/components/fields/ArrayItem.svelte +0 -0
  369. /package/{src → dist}/client/components/fields/BooleanField.svelte +0 -0
  370. /package/{src → dist}/client/components/fields/DateField.svelte +0 -0
  371. /package/{src → dist}/client/components/fields/EnumField.svelte +0 -0
  372. /package/{src → dist}/client/components/fields/FieldWrapper.svelte +0 -0
  373. /package/{src → dist}/client/components/fields/NumberField.svelte +0 -0
  374. /package/{src → dist}/client/components/fields/ObjectField.svelte +0 -0
  375. /package/{src → dist}/client/components/fields/SchemaField.svelte +0 -0
  376. /package/{src → dist}/client/components/fields/StringField.svelte +0 -0
  377. /package/{src → dist}/client/components/sidebar/AdminSidebar.svelte +0 -0
  378. /package/{src → dist}/client/components/sidebar/AdminSidebarSort.svelte +0 -0
  379. /package/{src → dist}/client/css/a11y.css +0 -0
  380. /package/{src → dist}/client/css/btn.css +0 -0
  381. /package/{src → dist}/client/css/dialog.css +0 -0
  382. /package/{src → dist}/client/css/field-input.css +0 -0
  383. /package/{src → dist}/client/css/reset.css +0 -0
  384. /package/{src → dist}/client/css/theme.css +0 -0
  385. /package/{src/client/index.ts → dist/client/index.js} +0 -0
  386. /package/{src → dist}/virtual.d.ts +0 -0
@@ -1,115 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
-
3
- //////////////////////////////
4
- // adapter.ts type-export tests
5
- //
6
- // adapter.ts is a pure type/interface file — there is no runtime code to
7
- // exercise. These tests confirm that the named exports are importable and
8
- // that the module resolves without errors, providing a compile-time
9
- // regression guard.
10
- //////////////////////////////
11
-
12
- import type {
13
- FileEntry,
14
- FileWrite,
15
- StorageAdapter,
16
- StorageRequest,
17
- StorageResponse,
18
- } from '../../../../src/client/js/storage/adapter';
19
-
20
- describe('adapter type exports', () => {
21
- it('FileEntry type is usable as a value shape', () => {
22
- // Constructing a conformant object validates the type at compile time
23
- const entry: FileEntry = { filename: 'post.md', content: '# Hello' };
24
- expect(entry.filename).toBe('post.md');
25
- expect(entry.content).toBe('# Hello');
26
- });
27
-
28
- it('FileWrite type is usable as a value shape', () => {
29
- const write: FileWrite = {
30
- collection: 'posts',
31
- filename: 'post.md',
32
- content: '# Hello',
33
- };
34
- expect(write.collection).toBe('posts');
35
- });
36
-
37
- it('StorageAdapter interface shape has the expected method names', () => {
38
- // Verify the interface contract can be satisfied by a plain object
39
- const adapter: StorageAdapter = {
40
- listFiles: async () => [],
41
- readFile: async () => '',
42
- writeFile: async () => undefined,
43
- writeFiles: async () => undefined,
44
- deleteFile: async () => undefined,
45
- };
46
- expect(typeof adapter.listFiles).toBe('function');
47
- expect(typeof adapter.readFile).toBe('function');
48
- expect(typeof adapter.writeFile).toBe('function');
49
- expect(typeof adapter.writeFiles).toBe('function');
50
- expect(typeof adapter.deleteFile).toBe('function');
51
- });
52
-
53
- it('StorageRequest union members resolve without type errors', () => {
54
- const init: StorageRequest = {
55
- type: 'init',
56
- backend: { type: 'github', token: 'tok', repo: 'owner/repo' },
57
- };
58
- const list: StorageRequest = {
59
- type: 'listFiles',
60
- collection: 'posts',
61
- extensions: ['.md', '.mdx'],
62
- };
63
- const read: StorageRequest = {
64
- type: 'readFile',
65
- collection: 'posts',
66
- filename: 'a.md',
67
- };
68
- const write: StorageRequest = {
69
- type: 'writeFile',
70
- collection: 'posts',
71
- filename: 'a.md',
72
- content: 'body',
73
- };
74
- const writeMany: StorageRequest = {
75
- type: 'writeFiles',
76
- files: [{ collection: 'posts', filename: 'a.md', content: 'body' }],
77
- };
78
- const del: StorageRequest = {
79
- type: 'deleteFile',
80
- collection: 'posts',
81
- filename: 'old.md',
82
- };
83
- const teardown: StorageRequest = { type: 'teardown' };
84
-
85
- expect(init.type).toBe('init');
86
- expect(list.type).toBe('listFiles');
87
- expect(read.type).toBe('readFile');
88
- expect(write.type).toBe('writeFile');
89
- expect(writeMany.type).toBe('writeFiles');
90
- expect(del.type).toBe('deleteFile');
91
- expect(teardown.type).toBe('teardown');
92
- });
93
-
94
- it('StorageResponse union members resolve without type errors', () => {
95
- const ok: StorageResponse = { type: 'init', ok: true };
96
- const fail: StorageResponse = {
97
- type: 'init',
98
- ok: false,
99
- error: 'bad token',
100
- };
101
- const delOk: StorageResponse = { type: 'deleteFile', ok: true };
102
- const delFail: StorageResponse = {
103
- type: 'deleteFile',
104
- ok: false,
105
- error: 'not found',
106
- };
107
- const portConn: StorageResponse = { type: 'port-connected' };
108
-
109
- expect(ok.type).toBe('init');
110
- expect(fail.ok).toBe(false);
111
- expect(delOk.type).toBe('deleteFile');
112
- expect(delFail.ok).toBe(false);
113
- expect(portConn.type).toBe('port-connected');
114
- });
115
- });
@@ -1,250 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
-
3
- //////////////////////////////
4
- // StorageClient tests
5
- //
6
- // StorageClient wraps a MessagePort with request/response correlation.
7
- // We simulate the port with a plain EventTarget + a manual postMessage spy
8
- // so we can fire synthetic message events and verify that calls are
9
- // matched back to their originating promise.
10
- //////////////////////////////
11
-
12
- import { StorageClient } from '../../../../src/client/js/storage/client';
13
- import type { StorageResponse } from '../../../../src/client/js/storage/adapter';
14
- import { makeClientMockPort as makeMockPort } from './mock-port';
15
-
16
- // ── Tests ─────────────────────────────────────────────────────────────────────
17
-
18
- describe('StorageClient', () => {
19
- let postSpy: ReturnType<typeof vi.fn>;
20
- let respond: (data: StorageResponse & { _id?: string }) => void;
21
- let client: StorageClient;
22
-
23
- beforeEach(() => {
24
- const mock = makeMockPort();
25
- postSpy = mock.postSpy;
26
- respond = mock.respond;
27
- client = new StorageClient(mock.port);
28
- });
29
-
30
- it('calls port.start() in the constructor', () => {
31
- const mock = makeMockPort();
32
- // start() is called during construction
33
- new StorageClient(mock.port);
34
- expect(
35
- (mock.port.start as ReturnType<typeof vi.fn>).mock.calls.length,
36
- ).toBe(1);
37
- });
38
-
39
- describe('init', () => {
40
- it('sends an init message and resolves when a matching ok response arrives', async () => {
41
- const promise = client.init({
42
- type: 'init',
43
- backend: { type: 'github', token: 'tok', repo: 'owner/repo' },
44
- });
45
-
46
- // Grab the _id from the sent message
47
- const sentMsg = postSpy.mock.calls[0][0] as { _id: string };
48
- respond({ type: 'init', ok: true, _id: sentMsg._id } as any);
49
-
50
- await expect(promise).resolves.toBeUndefined();
51
- });
52
-
53
- it('rejects when the worker responds with ok: false', async () => {
54
- const promise = client.init({
55
- type: 'init',
56
- backend: { type: 'github', token: 'tok', repo: 'owner/repo' },
57
- });
58
-
59
- const sentMsg = postSpy.mock.calls[0][0] as { _id: string };
60
- respond({
61
- type: 'init',
62
- ok: false,
63
- error: 'bad credentials',
64
- _id: sentMsg._id,
65
- } as any);
66
-
67
- await expect(promise).rejects.toThrow('bad credentials');
68
- });
69
- });
70
-
71
- describe('listFiles', () => {
72
- it('resolves with the files array from the worker response', async () => {
73
- const files = [{ filename: 'a.md', content: 'A' }];
74
- const promise = client.listFiles('posts', ['.md', '.mdx']);
75
-
76
- const sentMsg = postSpy.mock.calls[0][0] as {
77
- _id: string;
78
- type: string;
79
- collection: string;
80
- extensions: string[];
81
- };
82
- expect(sentMsg.type).toBe('listFiles');
83
- expect(sentMsg.collection).toBe('posts');
84
- expect(sentMsg.extensions).toEqual(['.md', '.mdx']);
85
-
86
- respond({
87
- type: 'listFiles',
88
- ok: true,
89
- files,
90
- _id: sentMsg._id,
91
- } as any);
92
-
93
- const result = await promise;
94
- expect(result).toEqual(files);
95
- });
96
-
97
- it('rejects on error response', async () => {
98
- const promise = client.listFiles('posts', ['.md', '.mdx']);
99
- const sentMsg = postSpy.mock.calls[0][0] as { _id: string };
100
- respond({
101
- type: 'listFiles',
102
- ok: false,
103
- error: 'storage error',
104
- _id: sentMsg._id,
105
- } as any);
106
- await expect(promise).rejects.toThrow('storage error');
107
- });
108
- });
109
-
110
- describe('deleteFile', () => {
111
- it('resolves when the worker responds with ok: true', async () => {
112
- const promise = client.deleteFile('posts', 'old.md');
113
- const sentMsg = postSpy.mock.calls[0][0] as {
114
- _id: string;
115
- type: string;
116
- collection: string;
117
- filename: string;
118
- };
119
- expect(sentMsg.type).toBe('deleteFile');
120
- expect(sentMsg.collection).toBe('posts');
121
- expect(sentMsg.filename).toBe('old.md');
122
- respond({ type: 'deleteFile', ok: true, _id: sentMsg._id } as any);
123
- await expect(promise).resolves.toBeUndefined();
124
- });
125
-
126
- it('rejects on error response', async () => {
127
- const promise = client.deleteFile('posts', 'missing.md');
128
- const sentMsg = postSpy.mock.calls[0][0] as { _id: string };
129
- respond({
130
- type: 'deleteFile',
131
- ok: false,
132
- error: 'File not found',
133
- _id: sentMsg._id,
134
- } as any);
135
- await expect(promise).rejects.toThrow('File not found');
136
- });
137
- });
138
-
139
- describe('readFile', () => {
140
- it('resolves with the content from the worker response', async () => {
141
- const promise = client.readFile('posts', 'hello.md');
142
-
143
- const sentMsg = postSpy.mock.calls[0][0] as {
144
- _id: string;
145
- collection: string;
146
- filename: string;
147
- };
148
- expect(sentMsg.collection).toBe('posts');
149
- expect(sentMsg.filename).toBe('hello.md');
150
-
151
- respond({
152
- type: 'readFile',
153
- ok: true,
154
- content: '# Hello',
155
- _id: sentMsg._id,
156
- } as any);
157
-
158
- const result = await promise;
159
- expect(result).toBe('# Hello');
160
- });
161
- });
162
-
163
- describe('writeFile', () => {
164
- it('resolves when the worker responds with ok: true', async () => {
165
- const promise = client.writeFile('posts', 'test.md', 'body');
166
- const sentMsg = postSpy.mock.calls[0][0] as { _id: string };
167
- respond({ type: 'writeFile', ok: true, _id: sentMsg._id } as any);
168
- await expect(promise).resolves.toBeUndefined();
169
- });
170
- });
171
-
172
- describe('writeFiles', () => {
173
- it('sends the files array and resolves on ok response', async () => {
174
- const files = [
175
- { collection: 'posts', filename: 'a.md', content: 'A' },
176
- { collection: 'posts', filename: 'b.md', content: 'B' },
177
- ];
178
- const promise = client.writeFiles(files);
179
-
180
- const sentMsg = postSpy.mock.calls[0][0] as {
181
- _id: string;
182
- type: string;
183
- files: typeof files;
184
- };
185
- expect(sentMsg.type).toBe('writeFiles');
186
- expect(sentMsg.files).toEqual(files);
187
-
188
- respond({ type: 'writeFiles', ok: true, _id: sentMsg._id } as any);
189
- await expect(promise).resolves.toBeUndefined();
190
- });
191
- });
192
-
193
- describe('teardown', () => {
194
- it('sends a teardown message and resolves on ok response', async () => {
195
- const promise = client.teardown();
196
- const sentMsg = postSpy.mock.calls[0][0] as {
197
- _id: string;
198
- type: string;
199
- };
200
- expect(sentMsg.type).toBe('teardown');
201
- respond({ type: 'teardown', ok: true, _id: sentMsg._id } as any);
202
- await expect(promise).resolves.toBeUndefined();
203
- });
204
- });
205
-
206
- describe('message correlation', () => {
207
- it('ignores broadcast messages without an _id', async () => {
208
- // port-connected has no _id and should not reject any pending promise
209
- const promise = client.listFiles('posts', ['.md', '.mdx']);
210
- respond({ type: 'port-connected' } as any);
211
- // Promise should still be pending — resolve it now with a proper response
212
- const sentMsg = postSpy.mock.calls[0][0] as { _id: string };
213
- respond({
214
- type: 'listFiles',
215
- ok: true,
216
- files: [],
217
- _id: sentMsg._id,
218
- } as any);
219
- await expect(promise).resolves.toEqual([]);
220
- });
221
-
222
- it('increments _id for each request so concurrent calls are independent', async () => {
223
- const p1 = client.listFiles('posts', ['.md', '.mdx']);
224
- const p2 = client.readFile('posts', 'a.md');
225
-
226
- const msg1 = postSpy.mock.calls[0][0] as { _id: string };
227
- const msg2 = postSpy.mock.calls[1][0] as { _id: string };
228
- expect(msg1._id).not.toBe(msg2._id);
229
-
230
- // Resolve in reverse order to prove there's no ordering dependency
231
- respond({
232
- type: 'readFile',
233
- ok: true,
234
- content: 'content',
235
- _id: msg2._id,
236
- } as any);
237
- respond({
238
- type: 'listFiles',
239
- ok: true,
240
- files: [{ filename: 'x.md', content: 'x' }],
241
- _id: msg1._id,
242
- } as any);
243
-
244
- const list = await p1;
245
- const read = await p2;
246
- expect(list[0].filename).toBe('x.md');
247
- expect(read).toBe('content');
248
- });
249
- });
250
- });
@@ -1,59 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
-
3
- //////////////////////////////
4
- // openDB tests
5
- //
6
- // Uses fake-indexeddb (polyfilled via the setup file) to exercise the
7
- // actual IDB open/upgrade logic in a Node.js environment.
8
- //////////////////////////////
9
-
10
- import { openDB } from '../../../../src/client/js/storage/db';
11
-
12
- describe('openDB', () => {
13
- it('resolves to an IDBDatabase instance', async () => {
14
- const db = await openDB();
15
- expect(db).toBeDefined();
16
- expect(typeof db.transaction).toBe('function');
17
- });
18
-
19
- it('creates a "handles" object store', async () => {
20
- const db = await openDB();
21
- expect(db.objectStoreNames.contains('handles')).toBe(true);
22
- });
23
-
24
- it('creates a "drafts" object store', async () => {
25
- const db = await openDB();
26
- expect(db.objectStoreNames.contains('drafts')).toBe(true);
27
- });
28
-
29
- it('returns a usable database that can perform readwrite transactions on "handles"', async () => {
30
- const db = await openDB();
31
- // A successful transaction confirms the store was created with correct configuration
32
- await new Promise<void>((resolve, reject) => {
33
- const tx = db.transaction('handles', 'readwrite');
34
- tx.objectStore('handles').put({ test: true }, 'probe-key');
35
- tx.oncomplete = () => resolve();
36
- tx.onerror = () => reject(tx.error);
37
- });
38
- });
39
-
40
- it('returns a usable database that can perform readwrite transactions on "drafts"', async () => {
41
- const db = await openDB();
42
- // The drafts store uses { keyPath: 'id' }, so the object must include an id field
43
- await new Promise<void>((resolve, reject) => {
44
- const tx = db.transaction('drafts', 'readwrite');
45
- tx.objectStore('drafts').put({ id: 'probe-draft', data: 'x' });
46
- tx.oncomplete = () => resolve();
47
- tx.onerror = () => reject(tx.error);
48
- });
49
- });
50
-
51
- it('subsequent calls return a database with the same stores', async () => {
52
- const db1 = await openDB();
53
- const db2 = await openDB();
54
- expect(db2.objectStoreNames.contains('handles')).toBe(true);
55
- expect(db2.objectStoreNames.contains('drafts')).toBe(true);
56
- db1.close();
57
- db2.close();
58
- });
59
- });