nebula-cms 0.1.3 → 0.1.5

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 (381) hide show
  1. package/README.md +3 -1
  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/{src → dist}/client/Admin.svelte +20 -11
  6. package/dist/client/Admin.svelte.d.ts +11 -0
  7. package/dist/client/Admin.svelte.d.ts.map +1 -0
  8. package/dist/client/components/BackendPicker.svelte.d.ts +4 -0
  9. package/dist/client/components/BackendPicker.svelte.d.ts.map +1 -0
  10. package/dist/client/components/DraftChip.svelte.d.ts +10 -0
  11. package/dist/client/components/DraftChip.svelte.d.ts.map +1 -0
  12. package/dist/client/components/MetadataForm.svelte.d.ts +12 -0
  13. package/dist/client/components/MetadataForm.svelte.d.ts.map +1 -0
  14. package/dist/client/components/ThemeToggle.svelte.d.ts +19 -0
  15. package/dist/client/components/ThemeToggle.svelte.d.ts.map +1 -0
  16. package/dist/client/components/dialogs/DeleteDraftDialog.svelte.d.ts +11 -0
  17. package/dist/client/components/dialogs/DeleteDraftDialog.svelte.d.ts.map +1 -0
  18. package/{src → dist}/client/components/dialogs/FilenameDialog.svelte +1 -2
  19. package/dist/client/components/dialogs/FilenameDialog.svelte.d.ts +13 -0
  20. package/dist/client/components/dialogs/FilenameDialog.svelte.d.ts.map +1 -0
  21. package/dist/client/components/editor/EditorPane.svelte.d.ts +4 -0
  22. package/dist/client/components/editor/EditorPane.svelte.d.ts.map +1 -0
  23. package/dist/client/components/editor/EditorTabs.svelte.d.ts +8 -0
  24. package/dist/client/components/editor/EditorTabs.svelte.d.ts.map +1 -0
  25. package/dist/client/components/editor/EditorToolbar.svelte.d.ts +4 -0
  26. package/dist/client/components/editor/EditorToolbar.svelte.d.ts.map +1 -0
  27. package/dist/client/components/editor/FormatSelector.svelte.d.ts +4 -0
  28. package/dist/client/components/editor/FormatSelector.svelte.d.ts.map +1 -0
  29. package/dist/client/components/editor/Toolbar.svelte.d.ts +19 -0
  30. package/dist/client/components/editor/Toolbar.svelte.d.ts.map +1 -0
  31. package/dist/client/components/fields/ArrayField.svelte.d.ts +15 -0
  32. package/dist/client/components/fields/ArrayField.svelte.d.ts.map +1 -0
  33. package/dist/client/components/fields/ArrayItem.svelte.d.ts +28 -0
  34. package/dist/client/components/fields/ArrayItem.svelte.d.ts.map +1 -0
  35. package/dist/client/components/fields/BooleanField.svelte.d.ts +16 -0
  36. package/dist/client/components/fields/BooleanField.svelte.d.ts.map +1 -0
  37. package/dist/client/components/fields/DateField.svelte.d.ts +16 -0
  38. package/dist/client/components/fields/DateField.svelte.d.ts.map +1 -0
  39. package/dist/client/components/fields/EnumField.svelte.d.ts +17 -0
  40. package/dist/client/components/fields/EnumField.svelte.d.ts.map +1 -0
  41. package/dist/client/components/fields/FieldWrapper.svelte.d.ts +18 -0
  42. package/dist/client/components/fields/FieldWrapper.svelte.d.ts.map +1 -0
  43. package/dist/client/components/fields/NumberField.svelte.d.ts +16 -0
  44. package/dist/client/components/fields/NumberField.svelte.d.ts.map +1 -0
  45. package/dist/client/components/fields/ObjectField.svelte.d.ts +16 -0
  46. package/dist/client/components/fields/ObjectField.svelte.d.ts.map +1 -0
  47. package/dist/client/components/fields/SchemaField.svelte.d.ts +16 -0
  48. package/dist/client/components/fields/SchemaField.svelte.d.ts.map +1 -0
  49. package/dist/client/components/fields/StringField.svelte.d.ts +16 -0
  50. package/dist/client/components/fields/StringField.svelte.d.ts.map +1 -0
  51. package/{src → dist}/client/components/sidebar/AdminSidebar.svelte +2 -4
  52. package/dist/client/components/sidebar/AdminSidebar.svelte.d.ts +19 -0
  53. package/dist/client/components/sidebar/AdminSidebar.svelte.d.ts.map +1 -0
  54. package/dist/client/components/sidebar/AdminSidebarSort.svelte.d.ts +12 -0
  55. package/dist/client/components/sidebar/AdminSidebarSort.svelte.d.ts.map +1 -0
  56. package/dist/client/css/icons.css +29 -0
  57. package/dist/client/index.d.ts +2 -0
  58. package/dist/client/index.d.ts.map +1 -0
  59. package/dist/client/js/drafts/merge.svelte.d.ts +24 -0
  60. package/dist/client/js/drafts/merge.svelte.d.ts.map +1 -0
  61. package/dist/client/js/drafts/merge.svelte.js +106 -0
  62. package/dist/client/js/drafts/ops.svelte.d.ts +31 -0
  63. package/dist/client/js/drafts/ops.svelte.d.ts.map +1 -0
  64. package/dist/client/js/drafts/ops.svelte.js +182 -0
  65. package/dist/client/js/drafts/storage.d.ts +45 -0
  66. package/dist/client/js/drafts/storage.d.ts.map +1 -0
  67. package/dist/client/js/drafts/storage.js +76 -0
  68. package/dist/client/js/drafts/workers/diff.d.ts +2 -0
  69. package/dist/client/js/drafts/workers/diff.d.ts.map +1 -0
  70. package/dist/client/js/drafts/workers/diff.js +20 -0
  71. package/dist/client/js/editor/editor.svelte.d.ts +124 -0
  72. package/dist/client/js/editor/editor.svelte.d.ts.map +1 -0
  73. package/dist/client/js/editor/editor.svelte.js +294 -0
  74. package/dist/client/js/editor/languages.d.ts +11 -0
  75. package/dist/client/js/editor/languages.d.ts.map +1 -0
  76. package/dist/client/js/editor/languages.js +93 -0
  77. package/dist/client/js/editor/link-wrap.d.ts +6 -0
  78. package/dist/client/js/editor/link-wrap.d.ts.map +1 -0
  79. package/{src/client/js/editor/link-wrap.ts → dist/client/js/editor/link-wrap.js} +17 -24
  80. package/dist/client/js/editor/markdown-shortcuts.d.ts +4 -0
  81. package/dist/client/js/editor/markdown-shortcuts.d.ts.map +1 -0
  82. package/dist/client/js/editor/markdown-shortcuts.js +219 -0
  83. package/dist/client/js/handlers/admin.d.ts +64 -0
  84. package/dist/client/js/handlers/admin.d.ts.map +1 -0
  85. package/dist/client/js/handlers/admin.js +186 -0
  86. package/dist/client/js/state/dialogs.svelte.d.ts +16 -0
  87. package/dist/client/js/state/dialogs.svelte.d.ts.map +1 -0
  88. package/dist/client/js/state/dialogs.svelte.js +28 -0
  89. package/dist/client/js/state/router.svelte.d.ts +44 -0
  90. package/dist/client/js/state/router.svelte.d.ts.map +1 -0
  91. package/dist/client/js/state/router.svelte.js +141 -0
  92. package/dist/client/js/state/schema.svelte.d.ts +51 -0
  93. package/dist/client/js/state/schema.svelte.d.ts.map +1 -0
  94. package/{src/client/js/state/schema.svelte.ts → dist/client/js/state/schema.svelte.js} +55 -70
  95. package/dist/client/js/state/state.svelte.d.ts +68 -0
  96. package/dist/client/js/state/state.svelte.d.ts.map +1 -0
  97. package/dist/client/js/state/state.svelte.js +300 -0
  98. package/dist/client/js/state/theme.svelte.d.ts +24 -0
  99. package/dist/client/js/state/theme.svelte.d.ts.map +1 -0
  100. package/{src/client/js/state/theme.svelte.ts → dist/client/js/state/theme.svelte.js} +54 -91
  101. package/dist/client/js/storage/adapter.d.ts +130 -0
  102. package/dist/client/js/storage/adapter.d.ts.map +1 -0
  103. package/dist/client/js/storage/adapter.js +5 -0
  104. package/dist/client/js/storage/client.d.ts +72 -0
  105. package/dist/client/js/storage/client.d.ts.map +1 -0
  106. package/dist/client/js/storage/client.js +121 -0
  107. package/dist/client/js/storage/db.d.ts +8 -0
  108. package/dist/client/js/storage/db.d.ts.map +1 -0
  109. package/dist/client/js/storage/db.js +35 -0
  110. package/dist/client/js/storage/fsa.d.ts +51 -0
  111. package/dist/client/js/storage/fsa.d.ts.map +1 -0
  112. package/dist/client/js/storage/fsa.js +91 -0
  113. package/dist/client/js/storage/github.d.ts +62 -0
  114. package/dist/client/js/storage/github.d.ts.map +1 -0
  115. package/dist/client/js/storage/github.js +216 -0
  116. package/dist/client/js/storage/storage.d.ts +32 -0
  117. package/dist/client/js/storage/storage.d.ts.map +1 -0
  118. package/dist/client/js/storage/storage.js +68 -0
  119. package/dist/client/js/storage/workers/frontmatter.d.ts +2 -0
  120. package/dist/client/js/storage/workers/frontmatter.d.ts.map +1 -0
  121. package/dist/client/js/storage/workers/frontmatter.js +253 -0
  122. package/dist/client/js/storage/workers/storage.d.ts +2 -0
  123. package/dist/client/js/storage/workers/storage.d.ts.map +1 -0
  124. package/dist/client/js/storage/workers/storage.js +167 -0
  125. package/dist/client/js/storage/workers/toml-parser.d.ts +2 -0
  126. package/dist/client/js/storage/workers/toml-parser.d.ts.map +1 -0
  127. package/dist/client/js/storage/workers/toml-parser.js +75 -0
  128. package/dist/client/js/storage/workers/yaml-parser.d.ts +2 -0
  129. package/dist/client/js/storage/workers/yaml-parser.d.ts.map +1 -0
  130. package/dist/client/js/storage/workers/yaml-parser.js +100 -0
  131. package/dist/client/js/utils/file-types.d.ts +58 -0
  132. package/dist/client/js/utils/file-types.d.ts.map +1 -0
  133. package/{src/client/js/utils/file-types.ts → dist/client/js/utils/file-types.js} +75 -107
  134. package/dist/client/js/utils/format.d.ts +8 -0
  135. package/dist/client/js/utils/format.d.ts.map +1 -0
  136. package/{src/client/js/utils/format.ts → dist/client/js/utils/format.js} +5 -6
  137. package/dist/client/js/utils/frontmatter.d.ts +12 -0
  138. package/dist/client/js/utils/frontmatter.d.ts.map +1 -0
  139. package/dist/client/js/utils/frontmatter.js +29 -0
  140. package/dist/client/js/utils/schema-utils.d.ts +110 -0
  141. package/dist/client/js/utils/schema-utils.d.ts.map +1 -0
  142. package/dist/client/js/utils/schema-utils.js +242 -0
  143. package/dist/client/js/utils/slug.d.ts +8 -0
  144. package/dist/client/js/utils/slug.d.ts.map +1 -0
  145. package/{src/client/js/utils/slug.ts → dist/client/js/utils/slug.js} +6 -7
  146. package/dist/client/js/utils/sort.d.ts +41 -0
  147. package/dist/client/js/utils/sort.d.ts.map +1 -0
  148. package/dist/client/js/utils/sort.js +65 -0
  149. package/dist/client/js/utils/stable-stringify.d.ts +8 -0
  150. package/dist/client/js/utils/stable-stringify.d.ts.map +1 -0
  151. package/dist/client/js/utils/stable-stringify.js +23 -0
  152. package/dist/client/js/utils/url-utils.d.ts +11 -0
  153. package/dist/client/js/utils/url-utils.d.ts.map +1 -0
  154. package/{src/client/js/utils/url-utils.ts → dist/client/js/utils/url-utils.js} +22 -23
  155. package/dist/client/types/browser-apis.d.ts +39 -0
  156. package/dist/types.d.ts +22 -0
  157. package/dist/types.d.ts.map +1 -0
  158. package/dist/types.js +1 -0
  159. package/package.json +13 -3
  160. package/.github/workflows/ci.yml +0 -27
  161. package/.github/workflows/publish.yml +0 -34
  162. package/.mcp.json +0 -12
  163. package/.prettierignore +0 -5
  164. package/.prettierrc.cjs +0 -22
  165. package/AGENTS.md +0 -183
  166. package/playground/astro.config.mjs +0 -7
  167. package/playground/node_modules/.bin/astro +0 -21
  168. package/playground/node_modules/.vite/deps/@astrojs_svelte_client__js.js +0 -85
  169. package/playground/node_modules/.vite/deps/@astrojs_svelte_client__js.js.map +0 -7
  170. package/playground/node_modules/.vite/deps/_metadata.json +0 -184
  171. package/playground/node_modules/.vite/deps/astro___aria-query.js +0 -6776
  172. package/playground/node_modules/.vite/deps/astro___aria-query.js.map +0 -7
  173. package/playground/node_modules/.vite/deps/astro___axobject-query.js +0 -3754
  174. package/playground/node_modules/.vite/deps/astro___axobject-query.js.map +0 -7
  175. package/playground/node_modules/.vite/deps/astro___html-escaper.js +0 -34
  176. package/playground/node_modules/.vite/deps/astro___html-escaper.js.map +0 -7
  177. package/playground/node_modules/.vite/deps/chunk-AJXJMYAF.js +0 -0
  178. package/playground/node_modules/.vite/deps/chunk-AJXJMYAF.js.map +0 -7
  179. package/playground/node_modules/.vite/deps/chunk-BUSYA2B4.js +0 -8
  180. package/playground/node_modules/.vite/deps/chunk-BUSYA2B4.js.map +0 -7
  181. package/playground/node_modules/.vite/deps/chunk-CNYJBM5F.js +0 -21
  182. package/playground/node_modules/.vite/deps/chunk-CNYJBM5F.js.map +0 -7
  183. package/playground/node_modules/.vite/deps/chunk-DBPNBGEI.js +0 -223
  184. package/playground/node_modules/.vite/deps/chunk-DBPNBGEI.js.map +0 -7
  185. package/playground/node_modules/.vite/deps/chunk-FPEUJ7DG.js +0 -27
  186. package/playground/node_modules/.vite/deps/chunk-FPEUJ7DG.js.map +0 -7
  187. package/playground/node_modules/.vite/deps/chunk-MHDZ3SK7.js +0 -1005
  188. package/playground/node_modules/.vite/deps/chunk-MHDZ3SK7.js.map +0 -7
  189. package/playground/node_modules/.vite/deps/chunk-RBDTDTPY.js +0 -204
  190. package/playground/node_modules/.vite/deps/chunk-RBDTDTPY.js.map +0 -7
  191. package/playground/node_modules/.vite/deps/chunk-RJGEXL5C.js +0 -688
  192. package/playground/node_modules/.vite/deps/chunk-RJGEXL5C.js.map +0 -7
  193. package/playground/node_modules/.vite/deps/chunk-YL4MIWGJ.js +0 -5099
  194. package/playground/node_modules/.vite/deps/chunk-YL4MIWGJ.js.map +0 -7
  195. package/playground/node_modules/.vite/deps/chunk-ZOV3DWEJ.js +0 -4376
  196. package/playground/node_modules/.vite/deps/chunk-ZOV3DWEJ.js.map +0 -7
  197. package/playground/node_modules/.vite/deps/chunk-ZP4UNCSN.js +0 -23
  198. package/playground/node_modules/.vite/deps/chunk-ZP4UNCSN.js.map +0 -7
  199. package/playground/node_modules/.vite/deps/chunk-ZREFNRZZ.js +0 -148
  200. package/playground/node_modules/.vite/deps/chunk-ZREFNRZZ.js.map +0 -7
  201. package/playground/node_modules/.vite/deps/package.json +0 -3
  202. package/playground/node_modules/.vite/deps/smol-toml.js +0 -843
  203. package/playground/node_modules/.vite/deps/smol-toml.js.map +0 -7
  204. package/playground/node_modules/.vite/deps/svelte.js +0 -55
  205. package/playground/node_modules/.vite/deps/svelte.js.map +0 -7
  206. package/playground/node_modules/.vite/deps/svelte___clsx.js +0 -9
  207. package/playground/node_modules/.vite/deps/svelte___clsx.js.map +0 -7
  208. package/playground/node_modules/.vite/deps/svelte_animate.js +0 -57
  209. package/playground/node_modules/.vite/deps/svelte_animate.js.map +0 -7
  210. package/playground/node_modules/.vite/deps/svelte_attachments.js +0 -15
  211. package/playground/node_modules/.vite/deps/svelte_attachments.js.map +0 -7
  212. package/playground/node_modules/.vite/deps/svelte_easing.js +0 -67
  213. package/playground/node_modules/.vite/deps/svelte_easing.js.map +0 -7
  214. package/playground/node_modules/.vite/deps/svelte_events.js +0 -11
  215. package/playground/node_modules/.vite/deps/svelte_events.js.map +0 -7
  216. package/playground/node_modules/.vite/deps/svelte_internal.js +0 -5
  217. package/playground/node_modules/.vite/deps/svelte_internal.js.map +0 -7
  218. package/playground/node_modules/.vite/deps/svelte_internal_client.js +0 -402
  219. package/playground/node_modules/.vite/deps/svelte_internal_client.js.map +0 -7
  220. package/playground/node_modules/.vite/deps/svelte_internal_disclose-version.js +0 -10
  221. package/playground/node_modules/.vite/deps/svelte_internal_disclose-version.js.map +0 -7
  222. package/playground/node_modules/.vite/deps/svelte_internal_flags_async.js +0 -8
  223. package/playground/node_modules/.vite/deps/svelte_internal_flags_async.js.map +0 -7
  224. package/playground/node_modules/.vite/deps/svelte_internal_flags_legacy.js +0 -8
  225. package/playground/node_modules/.vite/deps/svelte_internal_flags_legacy.js.map +0 -7
  226. package/playground/node_modules/.vite/deps/svelte_internal_flags_tracing.js +0 -8
  227. package/playground/node_modules/.vite/deps/svelte_internal_flags_tracing.js.map +0 -7
  228. package/playground/node_modules/.vite/deps/svelte_legacy.js +0 -35
  229. package/playground/node_modules/.vite/deps/svelte_legacy.js.map +0 -7
  230. package/playground/node_modules/.vite/deps/svelte_motion.js +0 -545
  231. package/playground/node_modules/.vite/deps/svelte_motion.js.map +0 -7
  232. package/playground/node_modules/.vite/deps/svelte_reactivity.js +0 -29
  233. package/playground/node_modules/.vite/deps/svelte_reactivity.js.map +0 -7
  234. package/playground/node_modules/.vite/deps/svelte_reactivity_window.js +0 -127
  235. package/playground/node_modules/.vite/deps/svelte_reactivity_window.js.map +0 -7
  236. package/playground/node_modules/.vite/deps/svelte_store.js +0 -103
  237. package/playground/node_modules/.vite/deps/svelte_store.js.map +0 -7
  238. package/playground/node_modules/.vite/deps/svelte_transition.js +0 -208
  239. package/playground/node_modules/.vite/deps/svelte_transition.js.map +0 -7
  240. package/playground/package.json +0 -16
  241. package/playground/pnpm-lock.yaml +0 -3167
  242. package/playground/src/content/authors/jane-doe.json +0 -8
  243. package/playground/src/content/config/build.toml +0 -2
  244. package/playground/src/content/courses/web-fundamentals.json +0 -29
  245. package/playground/src/content/docs/advanced.mdx +0 -6
  246. package/playground/src/content/docs/intro.md +0 -6
  247. package/playground/src/content/guides/getting-started.mdx +0 -6
  248. package/playground/src/content/posts/hello-world.md +0 -7
  249. package/playground/src/content/products/t-shirt.json +0 -16
  250. package/playground/src/content/recipes/pancakes.mdoc +0 -8
  251. package/playground/src/content/settings/site.yml +0 -2
  252. package/playground/src/content.config.ts +0 -198
  253. package/playground/src/env.d.ts +0 -1
  254. package/playground/src/pages/index.astro +0 -11
  255. package/playground/src/pages/nebula.astro +0 -14
  256. package/pnpm-workspace.yaml +0 -2
  257. package/scripts/subset-icons.mjs +0 -178
  258. package/src/astro/index.ts +0 -295
  259. package/src/client/js/drafts/merge.svelte.ts +0 -121
  260. package/src/client/js/drafts/ops.svelte.ts +0 -227
  261. package/src/client/js/drafts/storage.ts +0 -108
  262. package/src/client/js/drafts/workers/diff.ts +0 -40
  263. package/src/client/js/editor/editor.svelte.ts +0 -343
  264. package/src/client/js/editor/languages.ts +0 -98
  265. package/src/client/js/editor/markdown-shortcuts.ts +0 -261
  266. package/src/client/js/handlers/admin.ts +0 -246
  267. package/src/client/js/state/dialogs.svelte.ts +0 -35
  268. package/src/client/js/state/router.svelte.ts +0 -156
  269. package/src/client/js/state/state.svelte.ts +0 -334
  270. package/src/client/js/storage/adapter.ts +0 -102
  271. package/src/client/js/storage/client.ts +0 -150
  272. package/src/client/js/storage/db.ts +0 -36
  273. package/src/client/js/storage/fsa.ts +0 -110
  274. package/src/client/js/storage/github.ts +0 -297
  275. package/src/client/js/storage/storage.ts +0 -83
  276. package/src/client/js/storage/workers/frontmatter.ts +0 -320
  277. package/src/client/js/storage/workers/storage.ts +0 -177
  278. package/src/client/js/storage/workers/toml-parser.ts +0 -106
  279. package/src/client/js/storage/workers/yaml-parser.ts +0 -132
  280. package/src/client/js/utils/frontmatter.ts +0 -38
  281. package/src/client/js/utils/schema-utils.ts +0 -295
  282. package/src/client/js/utils/sort.ts +0 -84
  283. package/src/client/js/utils/stable-stringify.ts +0 -27
  284. package/src/types.ts +0 -25
  285. package/svelte.config.js +0 -4
  286. package/tests/astro/build.test.ts +0 -63
  287. package/tests/astro/index.test.ts +0 -689
  288. package/tests/client/components/Admin.test.ts +0 -446
  289. package/tests/client/components/BackendPicker.test.ts +0 -239
  290. package/tests/client/components/DraftChip.test.ts +0 -53
  291. package/tests/client/components/MetadataForm.test.ts +0 -164
  292. package/tests/client/components/dialogs/DeleteDraftDialog.test.ts +0 -91
  293. package/tests/client/components/dialogs/FilenameDialog.test.ts +0 -209
  294. package/tests/client/components/dialogs/dialog-stubs.ts +0 -19
  295. package/tests/client/components/editor/EditorPane.test.ts +0 -100
  296. package/tests/client/components/editor/EditorTabs.test.ts +0 -253
  297. package/tests/client/components/editor/EditorToolbar.test.ts +0 -252
  298. package/tests/client/components/editor/fixtures.ts +0 -31
  299. package/tests/client/components/fields/ArrayField.test.ts +0 -197
  300. package/tests/client/components/fields/BooleanField.test.ts +0 -206
  301. package/tests/client/components/fields/DateField.test.ts +0 -210
  302. package/tests/client/components/fields/EnumField.test.ts +0 -246
  303. package/tests/client/components/fields/NumberField.test.ts +0 -240
  304. package/tests/client/components/fields/ObjectField.test.ts +0 -157
  305. package/tests/client/components/fields/SchemaField.test.ts +0 -190
  306. package/tests/client/components/fields/StringField.test.ts +0 -223
  307. package/tests/client/components/sidebar/AdminSidebar.test.ts +0 -285
  308. package/tests/client/components/sidebar/AdminSidebarSort.test.ts +0 -135
  309. package/tests/client/components/sidebar/sort-mock.ts +0 -23
  310. package/tests/client/js/drafts/fixtures.ts +0 -22
  311. package/tests/client/js/drafts/merge.test.ts +0 -282
  312. package/tests/client/js/drafts/ops.test.ts +0 -658
  313. package/tests/client/js/drafts/storage.test.ts +0 -200
  314. package/tests/client/js/drafts/workers/diff.test.ts +0 -165
  315. package/tests/client/js/editor/editor.test.ts +0 -616
  316. package/tests/client/js/editor/link-wrap.test.ts +0 -225
  317. package/tests/client/js/editor/markdown-shortcuts.test.ts +0 -370
  318. package/tests/client/js/handlers/admin.test.ts +0 -467
  319. package/tests/client/js/state/router.test.ts +0 -619
  320. package/tests/client/js/state/schema.test.ts +0 -266
  321. package/tests/client/js/state/state.test.ts +0 -328
  322. package/tests/client/js/storage/adapter.test.ts +0 -115
  323. package/tests/client/js/storage/client.test.ts +0 -250
  324. package/tests/client/js/storage/db.test.ts +0 -59
  325. package/tests/client/js/storage/fsa.test.ts +0 -284
  326. package/tests/client/js/storage/github.test.ts +0 -349
  327. package/tests/client/js/storage/mock-port.ts +0 -95
  328. package/tests/client/js/storage/storage.test.ts +0 -77
  329. package/tests/client/js/storage/workers/frontmatter.test.ts +0 -479
  330. package/tests/client/js/storage/workers/storage.test.ts +0 -299
  331. package/tests/client/js/storage/workers/toml-parser.test.ts +0 -169
  332. package/tests/client/js/storage/workers/yaml-parser.test.ts +0 -168
  333. package/tests/client/js/utils/file-types.test.ts +0 -268
  334. package/tests/client/js/utils/frontmatter.test.ts +0 -87
  335. package/tests/client/js/utils/schema-utils.test.ts +0 -318
  336. package/tests/client/js/utils/slug.test.ts +0 -58
  337. package/tests/client/js/utils/sort.test.ts +0 -276
  338. package/tests/client/js/utils/stable-stringify.test.ts +0 -68
  339. package/tests/client/js/utils/url-utils.test.ts +0 -70
  340. package/tests/e2e/backend-connection.test.ts +0 -301
  341. package/tests/e2e/draft-lifecycle.test.ts +0 -388
  342. package/tests/e2e/editing.test.ts +0 -355
  343. package/tests/e2e/github-adapter.test.ts +0 -330
  344. package/tests/e2e/helpers/mock-adapter.ts +0 -166
  345. package/tests/e2e/helpers/test-app.ts +0 -155
  346. package/tests/e2e/navigation.test.ts +0 -358
  347. package/tests/e2e/publishing.test.ts +0 -345
  348. package/tests/e2e/unsaved-changes.test.ts +0 -317
  349. package/tests/setup.ts +0 -2
  350. package/tests/stubs/codemirror.ts +0 -197
  351. package/tsconfig.json +0 -19
  352. package/vitest.config.ts +0 -178
  353. /package/{src → dist}/client/components/BackendPicker.svelte +0 -0
  354. /package/{src → dist}/client/components/DraftChip.svelte +0 -0
  355. /package/{src → dist}/client/components/MetadataForm.svelte +0 -0
  356. /package/{src → dist}/client/components/ThemeToggle.svelte +0 -0
  357. /package/{src → dist}/client/components/dialogs/DeleteDraftDialog.svelte +0 -0
  358. /package/{src → dist}/client/components/editor/EditorPane.svelte +0 -0
  359. /package/{src → dist}/client/components/editor/EditorTabs.svelte +0 -0
  360. /package/{src → dist}/client/components/editor/EditorToolbar.svelte +0 -0
  361. /package/{src → dist}/client/components/editor/FormatSelector.svelte +0 -0
  362. /package/{src → dist}/client/components/editor/Toolbar.svelte +0 -0
  363. /package/{src → dist}/client/components/fields/ArrayField.svelte +0 -0
  364. /package/{src → dist}/client/components/fields/ArrayItem.svelte +0 -0
  365. /package/{src → dist}/client/components/fields/BooleanField.svelte +0 -0
  366. /package/{src → dist}/client/components/fields/DateField.svelte +0 -0
  367. /package/{src → dist}/client/components/fields/EnumField.svelte +0 -0
  368. /package/{src → dist}/client/components/fields/FieldWrapper.svelte +0 -0
  369. /package/{src → dist}/client/components/fields/NumberField.svelte +0 -0
  370. /package/{src → dist}/client/components/fields/ObjectField.svelte +0 -0
  371. /package/{src → dist}/client/components/fields/SchemaField.svelte +0 -0
  372. /package/{src → dist}/client/components/fields/StringField.svelte +0 -0
  373. /package/{src → dist}/client/components/sidebar/AdminSidebarSort.svelte +0 -0
  374. /package/{src → dist}/client/css/a11y.css +0 -0
  375. /package/{src → dist}/client/css/btn.css +0 -0
  376. /package/{src → dist}/client/css/dialog.css +0 -0
  377. /package/{src → dist}/client/css/field-input.css +0 -0
  378. /package/{src → dist}/client/css/reset.css +0 -0
  379. /package/{src → dist}/client/css/theme.css +0 -0
  380. /package/{src/client/index.ts → dist/client/index.js} +0 -0
  381. /package/{src → dist}/virtual.d.ts +0 -0
@@ -1,320 +0,0 @@
1
- /*
2
- * Orchestrator Worker
3
- *
4
- * Routes file parsing by category: frontmatter files have their YAML block
5
- * extracted via string manipulation and sent to the YAML parser worker;
6
- * JSON data files are parsed inline; YAML/TOML data files are sent to their
7
- * respective parser workers. Parser workers are lazily spawned on first need.
8
- */
9
-
10
- import { StorageClient } from '../client';
11
- import { getFileCategory, getDataFormat } from '../../utils/file-types';
12
- import { splitFrontmatter } from '../../utils/frontmatter';
13
- import type { FileEntry } from '../adapter';
14
-
15
- /**
16
- * Extracts the raw YAML block from a frontmatter-delimited file (markdown/MDX/Markdoc).
17
- * Delegates BOM stripping, CRLF normalization, and delimiter logic to splitFrontmatter.
18
- * Returns the raw YAML string without parsing it — parsing is delegated to the YAML parser worker.
19
- * @param {string} content - Raw file content
20
- * @return {string | null} The raw YAML string between --- delimiters, or null if none found
21
- */
22
- function extractYamlBlock(content: string): string | null {
23
- const { rawFrontmatter } = splitFrontmatter(content);
24
- return rawFrontmatter.trim() ? rawFrontmatter : null;
25
- }
26
-
27
- /*
28
- //////////////////////////////
29
- // Batch item type for parser worker communication
30
- //////////////////////////////
31
- */
32
-
33
- // A key/content pair for batch parsing requests.
34
- type BatchItem = {
35
- key: string;
36
- content: string;
37
- };
38
-
39
- /*
40
- //////////////////////////////
41
- // Parser worker management
42
- //////////////////////////////
43
- */
44
-
45
- // Lazily-spawned parser workers
46
- let yamlWorker: Worker | null = null;
47
- let tomlWorker: Worker | null = null;
48
-
49
- // Incrementing ID for correlating batch requests with responses
50
- let batchIdCounter = 0;
51
-
52
- // Pending batch response promises keyed by ID
53
- const pendingBatches = new Map<
54
- string,
55
- {
56
- resolve: (results: Record<string, Record<string, unknown>>) => void;
57
- reject: (err: Error) => void;
58
- }
59
- >();
60
-
61
- /**
62
- * Returns the lazily-spawned YAML parser worker, creating it on first call.
63
- * Uses `.js` extension in the URL because svelte-package doesn't rewrite URL strings.
64
- * @return {Worker} The YAML parser worker instance
65
- */
66
- function getYamlWorker(): Worker {
67
- if (!yamlWorker) {
68
- yamlWorker = new Worker(new URL('./yaml-parser.js', import.meta.url), {
69
- type: 'module',
70
- });
71
- yamlWorker.onmessage = handleParserResponse;
72
- yamlWorker.onerror = handleWorkerError;
73
- }
74
- return yamlWorker;
75
- }
76
-
77
- /**
78
- * Returns the lazily-spawned TOML parser worker, creating it on first call.
79
- * Uses `.js` extension in the URL because svelte-package doesn't rewrite URL strings.
80
- * @return {Worker} The TOML parser worker instance
81
- */
82
- function getTomlWorker(): Worker {
83
- if (!tomlWorker) {
84
- tomlWorker = new Worker(new URL('./toml-parser.js', import.meta.url), {
85
- type: 'module',
86
- });
87
- tomlWorker.onmessage = handleParserResponse;
88
- tomlWorker.onerror = handleWorkerError;
89
- }
90
- return tomlWorker;
91
- }
92
-
93
- /**
94
- * Handles fatal errors from parser workers by rejecting all pending batch promises
95
- * so callers don't hang indefinitely waiting for a response that will never arrive.
96
- * @param {ErrorEvent} e - The error event from the worker
97
- * @return {void}
98
- */
99
- function handleWorkerError(e: ErrorEvent): void {
100
- for (const [id, { reject }] of pendingBatches) {
101
- reject(new Error(`Parser worker error: ${e.message}`));
102
- pendingBatches.delete(id);
103
- }
104
- }
105
-
106
- /**
107
- * Handles responses from parser workers by resolving/rejecting the corresponding
108
- * pending batch promise based on the response ID.
109
- * @param {MessageEvent} event - The message event from the parser worker
110
- * @return {void}
111
- */
112
- function handleParserResponse(event: MessageEvent): void {
113
- const { type, id, ok, results, error } = event.data;
114
- // Ignore messages that aren't batch results (e.g. single parse results, stringify results)
115
- if (type !== 'parse-batch-result') return;
116
- const pending = pendingBatches.get(id);
117
- if (!pending) return;
118
- pendingBatches.delete(id);
119
-
120
- if (ok) {
121
- pending.resolve(results);
122
- } else {
123
- pending.reject(new Error(error));
124
- }
125
- }
126
-
127
- /**
128
- * Sends a batch of key/content pairs to a parser worker and returns a promise
129
- * that resolves with the parsed results map. Uses an incrementing ID for
130
- * request/response correlation, following the same pattern as StorageClient.
131
- * @param {Worker} worker - The parser worker to send the batch to
132
- * @param {BatchItem[]} items - Array of key/content pairs to parse
133
- * @return {Promise<Record<string, Record<string, unknown>>>} Map of key to parsed data
134
- */
135
- function sendBatch(
136
- worker: Worker,
137
- items: BatchItem[],
138
- ): Promise<Record<string, Record<string, unknown>>> {
139
- const id = String(++batchIdCounter);
140
- return new Promise((resolve, reject) => {
141
- pendingBatches.set(id, { resolve, reject });
142
- worker.postMessage({ type: 'parse-batch', id, items });
143
- });
144
- }
145
-
146
- /*
147
- //////////////////////////////
148
- // File categorization and parsing
149
- //////////////////////////////
150
- */
151
-
152
- /**
153
- * Processes a list of files by categorizing each file, collecting batch items
154
- * for YAML/TOML parser workers, parsing JSON inline, and assembling the final
155
- * items array with parsed data.
156
- * @param {FileEntry[]} files - The files returned by the storage adapter
157
- * @return {Promise<Array<{ filename: string; data: Record<string, unknown> }>>} Parsed items
158
- */
159
- async function processFiles(
160
- files: FileEntry[],
161
- ): Promise<Array<{ filename: string; data: Record<string, unknown> }>> {
162
- // Inline-parsed results (JSON files)
163
- const inlineResults: Array<{
164
- filename: string;
165
- data: Record<string, unknown>;
166
- }> = [];
167
-
168
- // Batch items for YAML worker (frontmatter YAML blocks + YAML data files)
169
- const yamlBatch: BatchItem[] = [];
170
- // Batch items for TOML worker
171
- const tomlBatch: BatchItem[] = [];
172
- // Files with no frontmatter get empty data
173
- const emptyDataFiles: string[] = [];
174
-
175
- for (const file of files) {
176
- const category = getFileCategory(file.filename);
177
-
178
- if (category === 'frontmatter') {
179
- const yamlBlock = extractYamlBlock(file.content);
180
- if (yamlBlock) {
181
- yamlBatch.push({ key: file.filename, content: yamlBlock });
182
- } else {
183
- // No frontmatter found — include with empty data
184
- emptyDataFiles.push(file.filename);
185
- }
186
- continue;
187
- }
188
-
189
- if (category === 'data') {
190
- const format = getDataFormat(file.filename);
191
-
192
- if (format === 'json') {
193
- try {
194
- const data = JSON.parse(file.content) as Record<string, unknown>;
195
- inlineResults.push({ filename: file.filename, data });
196
- } catch {
197
- // Invalid JSON — include with empty data
198
- inlineResults.push({ filename: file.filename, data: {} });
199
- }
200
- continue;
201
- }
202
-
203
- if (format === 'yaml') {
204
- yamlBatch.push({ key: file.filename, content: file.content });
205
- continue;
206
- }
207
-
208
- if (format === 'toml') {
209
- tomlBatch.push({ key: file.filename, content: file.content });
210
- continue;
211
- }
212
- }
213
-
214
- // Unrecognised file type — include with empty data
215
- emptyDataFiles.push(file.filename);
216
- }
217
-
218
- // Send batches to parser workers in parallel
219
- const promises: Promise<Record<string, Record<string, unknown>>>[] = [];
220
- let yamlPromiseIdx = -1;
221
- let tomlPromiseIdx = -1;
222
-
223
- if (yamlBatch.length > 0) {
224
- yamlPromiseIdx = promises.length;
225
- promises.push(sendBatch(getYamlWorker(), yamlBatch));
226
- }
227
-
228
- if (tomlBatch.length > 0) {
229
- tomlPromiseIdx = promises.length;
230
- promises.push(sendBatch(getTomlWorker(), tomlBatch));
231
- }
232
-
233
- const batchResults = await Promise.all(promises);
234
-
235
- // Assemble final items from all sources
236
- const items: Array<{ filename: string; data: Record<string, unknown> }> = [];
237
-
238
- // Add inline results (JSON)
239
- items.push(...inlineResults);
240
-
241
- // Add YAML results — filenames are derived from the batch result keys
242
- if (yamlPromiseIdx >= 0) {
243
- const yamlResults = batchResults[yamlPromiseIdx];
244
- for (const [filename, data] of Object.entries(yamlResults)) {
245
- items.push({ filename, data });
246
- }
247
- }
248
-
249
- // Add TOML results — filenames are derived from the batch result keys
250
- if (tomlPromiseIdx >= 0) {
251
- const tomlResults = batchResults[tomlPromiseIdx];
252
- for (const [filename, data] of Object.entries(tomlResults)) {
253
- items.push({ filename, data });
254
- }
255
- }
256
-
257
- // Add empty-data files
258
- for (const filename of emptyDataFiles) {
259
- items.push({ filename, data: {} });
260
- }
261
-
262
- return items;
263
- }
264
-
265
- /*
266
- //////////////////////////////
267
- // Main message handler
268
- //////////////////////////////
269
- */
270
-
271
- // Storage client, initialized when the main thread transfers a port
272
- let storageClient: StorageClient | null = null;
273
-
274
- // Handle messages from main thread
275
- self.addEventListener('message', async (event) => {
276
- const { type } = event.data;
277
-
278
- if (type === 'port') {
279
- // Main thread is transferring a MessagePort connected to the storage SharedWorker
280
- const port = event.ports[0];
281
- storageClient = new StorageClient(port);
282
- return;
283
- }
284
-
285
- if (type === 'parse') {
286
- const { collection } = event.data;
287
- if (!storageClient) {
288
- self.postMessage({
289
- type: 'error',
290
- message: 'Storage port not initialized',
291
- });
292
- return;
293
- }
294
-
295
- try {
296
- // Pass extensions from the message, defaulting to markdown for backward compatibility
297
- const extensions: string[] = event.data.extensions ?? ['.md', '.mdx'];
298
- const files: FileEntry[] = await storageClient.listFiles(
299
- collection,
300
- extensions,
301
- );
302
-
303
- const items = await processFiles(files);
304
-
305
- // Sort alphabetically by title, falling back to filename
306
- items.sort((a, b) => {
307
- const aTitle =
308
- typeof a.data.title === 'string' ? a.data.title : a.filename;
309
- const bTitle =
310
- typeof b.data.title === 'string' ? b.data.title : b.filename;
311
- return aTitle.toLowerCase().localeCompare(bTitle.toLowerCase());
312
- });
313
-
314
- self.postMessage({ type: 'result', collection, items });
315
- } catch (err) {
316
- const message = err instanceof Error ? err.message : String(err);
317
- self.postMessage({ type: 'error', message });
318
- }
319
- }
320
- });
@@ -1,177 +0,0 @@
1
- /*
2
- * SharedWorker entry point for storage operations.
3
- * Receives requests over MessagePort, dispatches to the active StorageAdapter,
4
- * and posts responses back to each connected client.
5
- */
6
-
7
- import type {
8
- StorageAdapter,
9
- StorageRequest,
10
- StorageResponse,
11
- } from '../adapter';
12
-
13
- // The single active adapter instance shared across all connected ports
14
- let adapter: StorageAdapter | null = null;
15
-
16
- /**
17
- * Handles a request message and returns the appropriate response.
18
- * @param {StorageRequest} msg - The incoming request message
19
- * @return {Promise<StorageResponse>} The response to send back
20
- */
21
- async function handleMessage(msg: StorageRequest): Promise<StorageResponse> {
22
- switch (msg.type) {
23
- case 'init': {
24
- try {
25
- if (msg.backend.type === 'fsa') {
26
- const { FsaAdapter } = await import('../fsa');
27
- adapter = new FsaAdapter(msg.backend.handle);
28
- } else {
29
- const { GitHubAdapter } = await import('../github');
30
- const gh = new GitHubAdapter(msg.backend.token, msg.backend.repo);
31
- await gh.validate();
32
- adapter = gh;
33
- }
34
- return { type: 'init', ok: true };
35
- } catch (err) {
36
- const error = err instanceof Error ? err.message : String(err);
37
- return { type: 'init', ok: false, error };
38
- }
39
- }
40
-
41
- case 'listFiles': {
42
- if (!adapter)
43
- return {
44
- type: 'listFiles',
45
- ok: false,
46
- error: 'No backend initialized',
47
- };
48
- try {
49
- const files = await adapter.listFiles(msg.collection, msg.extensions);
50
- return { type: 'listFiles', ok: true, files };
51
- } catch (err) {
52
- return {
53
- type: 'listFiles',
54
- ok: false,
55
- error: err instanceof Error ? err.message : String(err),
56
- };
57
- }
58
- }
59
-
60
- case 'readFile': {
61
- if (!adapter)
62
- return { type: 'readFile', ok: false, error: 'No backend initialized' };
63
- try {
64
- const content = await adapter.readFile(msg.collection, msg.filename);
65
- return { type: 'readFile', ok: true, content };
66
- } catch (err) {
67
- return {
68
- type: 'readFile',
69
- ok: false,
70
- error: err instanceof Error ? err.message : String(err),
71
- };
72
- }
73
- }
74
-
75
- case 'writeFile': {
76
- if (!adapter)
77
- return {
78
- type: 'writeFile',
79
- ok: false,
80
- error: 'No backend initialized',
81
- };
82
- try {
83
- await adapter.writeFile(msg.collection, msg.filename, msg.content);
84
- return { type: 'writeFile', ok: true };
85
- } catch (err) {
86
- return {
87
- type: 'writeFile',
88
- ok: false,
89
- error: err instanceof Error ? err.message : String(err),
90
- };
91
- }
92
- }
93
-
94
- case 'writeFiles': {
95
- if (!adapter)
96
- return {
97
- type: 'writeFiles',
98
- ok: false,
99
- error: 'No backend initialized',
100
- };
101
- try {
102
- await adapter.writeFiles(msg.files);
103
- return { type: 'writeFiles', ok: true };
104
- } catch (err) {
105
- return {
106
- type: 'writeFiles',
107
- ok: false,
108
- error: err instanceof Error ? err.message : String(err),
109
- };
110
- }
111
- }
112
-
113
- case 'deleteFile': {
114
- if (!adapter)
115
- return {
116
- type: 'deleteFile',
117
- ok: false,
118
- error: 'No backend initialized',
119
- };
120
- try {
121
- await adapter.deleteFile(msg.collection, msg.filename);
122
- return { type: 'deleteFile', ok: true };
123
- } catch (err) {
124
- return {
125
- type: 'deleteFile',
126
- ok: false,
127
- error: err instanceof Error ? err.message : String(err),
128
- };
129
- }
130
- }
131
-
132
- case 'teardown': {
133
- adapter = null;
134
- return { type: 'teardown', ok: true };
135
- }
136
-
137
- default: {
138
- // Prevents silent hangs if an unrecognized message type arrives
139
- const exhaustive: never = msg;
140
- return {
141
- type: (exhaustive as any).type,
142
- ok: false,
143
- error: 'Unknown message type',
144
- } as StorageResponse;
145
- }
146
- }
147
- }
148
-
149
- /**
150
- * Wires up message handling for a connected port. Passes through `_id` from requests so the StorageClient can correlate responses.
151
- * @param {MessagePort} port - The port to listen on
152
- * @return {void}
153
- */
154
- function setupPort(port: MessagePort): void {
155
- port.addEventListener('message', async (event) => {
156
- const { _id, ...msg } = event.data;
157
-
158
- // Handle port bridging — main thread transfers ports for dedicated workers
159
- if (msg.type === 'connect-port') {
160
- const transferredPort = event.ports[0];
161
- if (transferredPort) setupPort(transferredPort);
162
- return;
163
- }
164
-
165
- const response = await handleMessage(msg as StorageRequest);
166
- port.postMessage({ ...response, _id });
167
- });
168
- port.start();
169
- // Acknowledge the connection so the caller knows the port is ready
170
- port.postMessage({ type: 'port-connected' });
171
- }
172
-
173
- // SharedWorker entry — handle direct connections from Window contexts
174
- self.addEventListener('connect', (event: MessageEvent) => {
175
- const port = (event as any).ports[0] as MessagePort;
176
- setupPort(port);
177
- });
@@ -1,106 +0,0 @@
1
- /*
2
- * TOML parser worker
3
- *
4
- * Runs as a dedicated Worker. Handles three message types — parse, parse-batch,
5
- * stringify — and posts results back to the main thread via self.postMessage.
6
- * All handlers are wrapped in try/catch so errors are returned as structured
7
- * failure messages rather than unhandled rejections.
8
- */
9
-
10
- import { parse, stringify } from 'smol-toml';
11
-
12
- // Inbound message shape for a single TOML parse request.
13
- interface ParseMessage {
14
- type: 'parse';
15
- id: string;
16
- content: string;
17
- }
18
-
19
- // A single item in a batch parse request.
20
- interface BatchItem {
21
- key: string;
22
- content: string;
23
- }
24
-
25
- // Inbound message shape for a batch TOML parse request.
26
- interface ParseBatchMessage {
27
- type: 'parse-batch';
28
- id: string;
29
- items: BatchItem[];
30
- }
31
-
32
- // Inbound message shape for a TOML stringify request.
33
- interface StringifyMessage {
34
- type: 'stringify';
35
- id: string;
36
- data: Record<string, unknown>;
37
- }
38
-
39
- // Union of all inbound message types.
40
- type InboundMessage = ParseMessage | ParseBatchMessage | StringifyMessage;
41
-
42
- /**
43
- * Handles a 'parse' request: parses a single TOML string and posts the result.
44
- * @param {ParseMessage} msg - The inbound parse message
45
- * @return {void}
46
- */
47
- function handleParse(msg: ParseMessage): void {
48
- const { id, content } = msg;
49
- try {
50
- const data = parse(content) as Record<string, unknown>;
51
- self.postMessage({ type: 'parse-result', id, ok: true, data });
52
- } catch (err) {
53
- const error = err instanceof Error ? err.message : String(err);
54
- self.postMessage({ type: 'parse-result', id, ok: false, error });
55
- }
56
- }
57
-
58
- /**
59
- * Handles a 'parse-batch' request: parses multiple TOML strings keyed by
60
- * a caller-supplied key, and posts a single result containing all parsed values.
61
- * @param {ParseBatchMessage} msg - The inbound parse-batch message
62
- * @return {void}
63
- */
64
- function handleParseBatch(msg: ParseBatchMessage): void {
65
- const { id, items } = msg;
66
- try {
67
- const results: Record<string, Record<string, unknown>> = {};
68
- for (const item of items) {
69
- results[item.key] = parse(item.content) as Record<string, unknown>;
70
- }
71
- self.postMessage({ type: 'parse-batch-result', id, ok: true, results });
72
- } catch (err) {
73
- const error = err instanceof Error ? err.message : String(err);
74
- self.postMessage({ type: 'parse-batch-result', id, ok: false, error });
75
- }
76
- }
77
-
78
- /**
79
- * Handles a 'stringify' request: serializes a plain object to a TOML string
80
- * and posts the result.
81
- * @param {StringifyMessage} msg - The inbound stringify message
82
- * @return {void}
83
- */
84
- function handleStringify(msg: StringifyMessage): void {
85
- const { id, data } = msg;
86
- try {
87
- const content = stringify(data);
88
- self.postMessage({ type: 'stringify-result', id, ok: true, content });
89
- } catch (err) {
90
- const error = err instanceof Error ? err.message : String(err);
91
- self.postMessage({ type: 'stringify-result', id, ok: false, error });
92
- }
93
- }
94
-
95
- // Dispatch incoming messages by type
96
- self.addEventListener('message', (event: MessageEvent<InboundMessage>) => {
97
- const msg = event.data;
98
-
99
- if (msg.type === 'parse') {
100
- handleParse(msg);
101
- } else if (msg.type === 'parse-batch') {
102
- handleParseBatch(msg);
103
- } else if (msg.type === 'stringify') {
104
- handleStringify(msg);
105
- }
106
- });