@bendyline/squisq 0.1.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/dist/{themeLibrary-DySHPcgj.d.ts → Doc-1hmT1LZl.d.ts} +1 -42
  2. package/dist/MediaProvider-wpSe21B3.d.ts +66 -0
  3. package/dist/__tests__/animationUtils.test.d.ts +2 -0
  4. package/dist/__tests__/animationUtils.test.d.ts.map +1 -0
  5. package/dist/__tests__/animationUtils.test.js +60 -0
  6. package/dist/__tests__/animationUtils.test.js.map +1 -0
  7. package/dist/__tests__/contentContainer.test.d.ts +2 -0
  8. package/dist/__tests__/contentContainer.test.d.ts.map +1 -0
  9. package/dist/__tests__/contentContainer.test.js +234 -0
  10. package/dist/__tests__/contentContainer.test.js.map +1 -0
  11. package/dist/__tests__/contentExtractor.test.d.ts +2 -0
  12. package/dist/__tests__/contentExtractor.test.d.ts.map +1 -0
  13. package/dist/__tests__/contentExtractor.test.js +151 -0
  14. package/dist/__tests__/contentExtractor.test.js.map +1 -0
  15. package/dist/__tests__/geohash.test.d.ts +2 -0
  16. package/dist/__tests__/geohash.test.d.ts.map +1 -0
  17. package/dist/__tests__/geohash.test.js +87 -0
  18. package/dist/__tests__/geohash.test.js.map +1 -0
  19. package/dist/__tests__/getLayers.test.d.ts +2 -0
  20. package/dist/__tests__/getLayers.test.d.ts.map +1 -0
  21. package/dist/__tests__/getLayers.test.js +167 -0
  22. package/dist/__tests__/getLayers.test.js.map +1 -0
  23. package/dist/__tests__/haversine.test.d.ts +2 -0
  24. package/dist/__tests__/haversine.test.d.ts.map +1 -0
  25. package/dist/__tests__/haversine.test.js +56 -0
  26. package/dist/__tests__/haversine.test.js.map +1 -0
  27. package/dist/__tests__/localForageAdapter.test.d.ts +8 -0
  28. package/dist/__tests__/localForageAdapter.test.d.ts.map +1 -0
  29. package/dist/__tests__/localForageAdapter.test.js +130 -0
  30. package/dist/__tests__/localForageAdapter.test.js.map +1 -0
  31. package/dist/__tests__/markdown.test.d.ts +2 -0
  32. package/dist/__tests__/markdown.test.d.ts.map +1 -0
  33. package/dist/__tests__/markdown.test.js +654 -0
  34. package/dist/__tests__/markdown.test.js.map +1 -0
  35. package/dist/__tests__/markdownToDoc.test.d.ts +2 -0
  36. package/dist/__tests__/markdownToDoc.test.d.ts.map +1 -0
  37. package/dist/__tests__/markdownToDoc.test.js +313 -0
  38. package/dist/__tests__/markdownToDoc.test.js.map +1 -0
  39. package/dist/__tests__/seededRandom.test.d.ts +2 -0
  40. package/dist/__tests__/seededRandom.test.d.ts.map +1 -0
  41. package/dist/__tests__/seededRandom.test.js +125 -0
  42. package/dist/__tests__/seededRandom.test.js.map +1 -0
  43. package/dist/__tests__/slideshowGenerator.test.d.ts +2 -0
  44. package/dist/__tests__/slideshowGenerator.test.d.ts.map +1 -0
  45. package/dist/__tests__/slideshowGenerator.test.js +114 -0
  46. package/dist/__tests__/slideshowGenerator.test.js.map +1 -0
  47. package/dist/__tests__/storage.test.d.ts +2 -0
  48. package/dist/__tests__/storage.test.d.ts.map +1 -0
  49. package/dist/__tests__/storage.test.js +51 -0
  50. package/dist/__tests__/storage.test.js.map +1 -0
  51. package/dist/__tests__/templates.test.d.ts +2 -0
  52. package/dist/__tests__/templates.test.d.ts.map +1 -0
  53. package/dist/__tests__/templates.test.js +217 -0
  54. package/dist/__tests__/templates.test.js.map +1 -0
  55. package/dist/__tests__/timing.test.d.ts +2 -0
  56. package/dist/__tests__/timing.test.d.ts.map +1 -0
  57. package/dist/__tests__/timing.test.js +131 -0
  58. package/dist/__tests__/timing.test.js.map +1 -0
  59. package/dist/chunk-3E5F2XMR.js +129 -0
  60. package/dist/chunk-3E5F2XMR.js.map +1 -0
  61. package/dist/chunk-4CRBS35L.js +292 -0
  62. package/dist/chunk-4CRBS35L.js.map +1 -0
  63. package/dist/chunk-6YJPI6VI.js +35 -0
  64. package/dist/chunk-6YJPI6VI.js.map +1 -0
  65. package/dist/chunk-FVTQSNR7.js +100 -0
  66. package/dist/chunk-FVTQSNR7.js.map +1 -0
  67. package/dist/chunk-V543AI2F.js +1 -0
  68. package/dist/chunk-V543AI2F.js.map +1 -0
  69. package/dist/chunk-VP5SZTZ2.js +792 -0
  70. package/dist/chunk-VP5SZTZ2.js.map +1 -0
  71. package/dist/doc/docToMarkdown.d.ts +41 -0
  72. package/dist/doc/docToMarkdown.d.ts.map +1 -0
  73. package/dist/doc/docToMarkdown.js +88 -0
  74. package/dist/doc/docToMarkdown.js.map +1 -0
  75. package/dist/doc/getLayers.d.ts +65 -0
  76. package/dist/doc/getLayers.d.ts.map +1 -0
  77. package/dist/doc/getLayers.js +103 -0
  78. package/dist/doc/getLayers.js.map +1 -0
  79. package/dist/doc/index.d.ts +9 -3
  80. package/dist/doc/index.d.ts.map +1 -0
  81. package/dist/doc/index.js +6 -125
  82. package/dist/doc/index.js.map +1 -1
  83. package/dist/doc/markdownToDoc.d.ts +68 -0
  84. package/dist/doc/markdownToDoc.d.ts.map +1 -0
  85. package/dist/doc/markdownToDoc.js +225 -0
  86. package/dist/doc/markdownToDoc.js.map +1 -0
  87. package/dist/doc/templates/accentImage.d.ts +59 -0
  88. package/dist/doc/templates/accentImage.d.ts.map +1 -0
  89. package/dist/doc/templates/accentImage.js +275 -0
  90. package/dist/doc/templates/accentImage.js.map +1 -0
  91. package/dist/doc/templates/captionUtils.d.ts +20 -0
  92. package/dist/doc/templates/captionUtils.d.ts.map +1 -0
  93. package/dist/doc/templates/captionUtils.js +29 -0
  94. package/dist/doc/templates/captionUtils.js.map +1 -0
  95. package/dist/doc/templates/comparisonBar.d.ts +13 -0
  96. package/dist/doc/templates/comparisonBar.d.ts.map +1 -0
  97. package/dist/doc/templates/comparisonBar.js +127 -0
  98. package/dist/doc/templates/comparisonBar.js.map +1 -0
  99. package/dist/doc/templates/coverBlock.d.ts +51 -0
  100. package/dist/doc/templates/coverBlock.d.ts.map +1 -0
  101. package/dist/doc/templates/coverBlock.js +125 -0
  102. package/dist/doc/templates/coverBlock.js.map +1 -0
  103. package/dist/doc/templates/dateEvent.d.ts +15 -0
  104. package/dist/doc/templates/dateEvent.d.ts.map +1 -0
  105. package/dist/doc/templates/dateEvent.js +110 -0
  106. package/dist/doc/templates/dateEvent.js.map +1 -0
  107. package/dist/doc/templates/definitionCard.d.ts +13 -0
  108. package/dist/doc/templates/definitionCard.d.ts.map +1 -0
  109. package/dist/doc/templates/definitionCard.js +114 -0
  110. package/dist/doc/templates/definitionCard.js.map +1 -0
  111. package/dist/doc/templates/factCard.d.ts +15 -0
  112. package/dist/doc/templates/factCard.d.ts.map +1 -0
  113. package/dist/doc/templates/factCard.js +100 -0
  114. package/dist/doc/templates/factCard.js.map +1 -0
  115. package/dist/doc/templates/fullBleedQuote.d.ts +13 -0
  116. package/dist/doc/templates/fullBleedQuote.d.ts.map +1 -0
  117. package/dist/doc/templates/fullBleedQuote.js +54 -0
  118. package/dist/doc/templates/fullBleedQuote.js.map +1 -0
  119. package/dist/doc/templates/imageWithCaption.d.ts +13 -0
  120. package/dist/doc/templates/imageWithCaption.d.ts.map +1 -0
  121. package/dist/doc/templates/imageWithCaption.js +142 -0
  122. package/dist/doc/templates/imageWithCaption.js.map +1 -0
  123. package/dist/doc/templates/index.d.ts +104 -0
  124. package/dist/doc/templates/index.d.ts.map +1 -0
  125. package/dist/doc/templates/index.js +442 -0
  126. package/dist/doc/templates/index.js.map +1 -0
  127. package/dist/doc/templates/listBlock.d.ts +13 -0
  128. package/dist/doc/templates/listBlock.d.ts.map +1 -0
  129. package/dist/doc/templates/listBlock.js +89 -0
  130. package/dist/doc/templates/listBlock.js.map +1 -0
  131. package/dist/doc/templates/mapBlock.d.ts +17 -0
  132. package/dist/doc/templates/mapBlock.d.ts.map +1 -0
  133. package/dist/doc/templates/mapBlock.js +112 -0
  134. package/dist/doc/templates/mapBlock.js.map +1 -0
  135. package/dist/doc/templates/persistentLayers.d.ts +39 -0
  136. package/dist/doc/templates/persistentLayers.d.ts.map +1 -0
  137. package/dist/doc/templates/persistentLayers.js +447 -0
  138. package/dist/doc/templates/persistentLayers.js.map +1 -0
  139. package/dist/doc/templates/photoGrid.d.ts +20 -0
  140. package/dist/doc/templates/photoGrid.d.ts.map +1 -0
  141. package/dist/doc/templates/photoGrid.js +172 -0
  142. package/dist/doc/templates/photoGrid.js.map +1 -0
  143. package/dist/doc/templates/pullQuote.d.ts +13 -0
  144. package/dist/doc/templates/pullQuote.d.ts.map +1 -0
  145. package/dist/doc/templates/pullQuote.js +109 -0
  146. package/dist/doc/templates/pullQuote.js.map +1 -0
  147. package/dist/doc/templates/quoteBlock.d.ts +15 -0
  148. package/dist/doc/templates/quoteBlock.d.ts.map +1 -0
  149. package/dist/doc/templates/quoteBlock.js +97 -0
  150. package/dist/doc/templates/quoteBlock.js.map +1 -0
  151. package/dist/doc/templates/sectionHeader.d.ts +14 -0
  152. package/dist/doc/templates/sectionHeader.d.ts.map +1 -0
  153. package/dist/doc/templates/sectionHeader.js +96 -0
  154. package/dist/doc/templates/sectionHeader.js.map +1 -0
  155. package/dist/doc/templates/statHighlight.d.ts +15 -0
  156. package/dist/doc/templates/statHighlight.d.ts.map +1 -0
  157. package/dist/doc/templates/statHighlight.js +99 -0
  158. package/dist/doc/templates/statHighlight.js.map +1 -0
  159. package/dist/doc/templates/titleBlock.d.ts +13 -0
  160. package/dist/doc/templates/titleBlock.d.ts.map +1 -0
  161. package/dist/doc/templates/titleBlock.js +92 -0
  162. package/dist/doc/templates/titleBlock.js.map +1 -0
  163. package/dist/doc/templates/twoColumn.d.ts +15 -0
  164. package/dist/doc/templates/twoColumn.d.ts.map +1 -0
  165. package/dist/doc/templates/twoColumn.js +219 -0
  166. package/dist/doc/templates/twoColumn.js.map +1 -0
  167. package/dist/doc/templates/videoPullQuote.d.ts +20 -0
  168. package/dist/doc/templates/videoPullQuote.d.ts.map +1 -0
  169. package/dist/doc/templates/videoPullQuote.js +118 -0
  170. package/dist/doc/templates/videoPullQuote.js.map +1 -0
  171. package/dist/doc/templates/videoWithCaption.d.ts +20 -0
  172. package/dist/doc/templates/videoWithCaption.d.ts.map +1 -0
  173. package/dist/doc/templates/videoWithCaption.js +104 -0
  174. package/dist/doc/templates/videoWithCaption.js.map +1 -0
  175. package/dist/doc/utils/animationUtils.d.ts +34 -0
  176. package/dist/doc/utils/animationUtils.d.ts.map +1 -0
  177. package/dist/doc/utils/animationUtils.js +110 -0
  178. package/dist/doc/utils/animationUtils.js.map +1 -0
  179. package/dist/doc/utils/themeUtils.d.ts +55 -0
  180. package/dist/doc/utils/themeUtils.d.ts.map +1 -0
  181. package/dist/doc/utils/themeUtils.js +109 -0
  182. package/dist/doc/utils/themeUtils.js.map +1 -0
  183. package/dist/generate/contentExtractor.d.ts +112 -0
  184. package/dist/generate/contentExtractor.d.ts.map +1 -0
  185. package/dist/generate/contentExtractor.js +638 -0
  186. package/dist/generate/contentExtractor.js.map +1 -0
  187. package/dist/generate/index.d.ts +7 -0
  188. package/dist/generate/index.d.ts.map +1 -0
  189. package/dist/generate/index.js +4 -0
  190. package/dist/generate/index.js.map +1 -0
  191. package/dist/generate/slideshowGenerator.d.ts +72 -0
  192. package/dist/generate/slideshowGenerator.d.ts.map +1 -0
  193. package/dist/generate/slideshowGenerator.js +159 -0
  194. package/dist/generate/slideshowGenerator.js.map +1 -0
  195. package/dist/generate/templateMapper.d.ts +23 -0
  196. package/dist/generate/templateMapper.d.ts.map +1 -0
  197. package/dist/generate/templateMapper.js +114 -0
  198. package/dist/generate/templateMapper.js.map +1 -0
  199. package/dist/index.d.ts +9 -8
  200. package/dist/index.d.ts.map +1 -0
  201. package/dist/index.js +8 -216
  202. package/dist/index.js.map +1 -1
  203. package/dist/markdown/convert.d.ts +71 -0
  204. package/dist/markdown/convert.d.ts.map +1 -0
  205. package/dist/markdown/convert.js +746 -0
  206. package/dist/markdown/convert.js.map +1 -0
  207. package/dist/markdown/htmlParse.d.ts +26 -0
  208. package/dist/markdown/htmlParse.d.ts.map +1 -0
  209. package/dist/markdown/htmlParse.js +195 -0
  210. package/dist/markdown/htmlParse.js.map +1 -0
  211. package/dist/markdown/index.d.ts +19 -225
  212. package/dist/markdown/index.d.ts.map +1 -0
  213. package/dist/markdown/index.js +33 -32
  214. package/dist/markdown/index.js.map +1 -1
  215. package/dist/markdown/parse.d.ts +27 -0
  216. package/dist/markdown/parse.d.ts.map +1 -0
  217. package/dist/markdown/parse.js +90 -0
  218. package/dist/markdown/parse.js.map +1 -0
  219. package/dist/markdown/stringify.d.ts +32 -0
  220. package/dist/markdown/stringify.d.ts.map +1 -0
  221. package/dist/markdown/stringify.js +108 -0
  222. package/dist/markdown/stringify.js.map +1 -0
  223. package/dist/markdown/types.d.ts +496 -0
  224. package/dist/markdown/types.d.ts.map +1 -0
  225. package/dist/markdown/types.js +17 -0
  226. package/dist/markdown/types.js.map +1 -0
  227. package/dist/markdown/utils.d.ts +78 -0
  228. package/dist/markdown/utils.d.ts.map +1 -0
  229. package/dist/markdown/utils.js +149 -0
  230. package/dist/markdown/utils.js.map +1 -0
  231. package/dist/random/SeededRandom.d.ts +50 -0
  232. package/dist/random/SeededRandom.d.ts.map +1 -0
  233. package/dist/random/SeededRandom.js +115 -0
  234. package/dist/random/SeededRandom.js.map +1 -0
  235. package/dist/random/index.d.ts +2 -0
  236. package/dist/random/index.d.ts.map +1 -0
  237. package/dist/random/index.js +2 -0
  238. package/dist/random/index.js.map +1 -0
  239. package/dist/schemas/BlockTemplates.d.ts +583 -0
  240. package/dist/schemas/BlockTemplates.d.ts.map +1 -0
  241. package/dist/schemas/BlockTemplates.js +72 -0
  242. package/dist/schemas/BlockTemplates.js.map +1 -0
  243. package/dist/schemas/Doc.d.ts +411 -0
  244. package/dist/schemas/Doc.d.ts.map +1 -0
  245. package/dist/schemas/Doc.js +90 -0
  246. package/dist/schemas/Doc.js.map +1 -0
  247. package/dist/schemas/LayoutStrategy.d.ts +84 -0
  248. package/dist/schemas/LayoutStrategy.d.ts.map +1 -0
  249. package/dist/schemas/LayoutStrategy.js +123 -0
  250. package/dist/schemas/LayoutStrategy.js.map +1 -0
  251. package/dist/schemas/MediaProvider.d.ts +65 -0
  252. package/dist/schemas/MediaProvider.d.ts.map +1 -0
  253. package/dist/schemas/MediaProvider.js +13 -0
  254. package/dist/schemas/MediaProvider.js.map +1 -0
  255. package/dist/schemas/Theme.d.ts +163 -0
  256. package/dist/schemas/Theme.d.ts.map +1 -0
  257. package/dist/schemas/Theme.js +62 -0
  258. package/dist/schemas/Theme.js.map +1 -0
  259. package/dist/schemas/Types.d.ts +14 -0
  260. package/dist/schemas/Types.d.ts.map +1 -0
  261. package/dist/schemas/Types.js +5 -0
  262. package/dist/schemas/Types.js.map +1 -0
  263. package/dist/schemas/Viewport.d.ts +74 -0
  264. package/dist/schemas/Viewport.d.ts.map +1 -0
  265. package/dist/schemas/Viewport.js +63 -0
  266. package/dist/schemas/Viewport.js.map +1 -0
  267. package/dist/schemas/index.d.ts +10 -70
  268. package/dist/schemas/index.d.ts.map +1 -0
  269. package/dist/schemas/index.js +7 -60
  270. package/dist/schemas/index.js.map +1 -1
  271. package/dist/schemas/themeLibrary.d.ts +41 -0
  272. package/dist/schemas/themeLibrary.d.ts.map +1 -0
  273. package/dist/schemas/themeLibrary.js +466 -0
  274. package/dist/schemas/themeLibrary.js.map +1 -0
  275. package/dist/spatial/Geohash.d.ts +85 -0
  276. package/dist/spatial/Geohash.d.ts.map +1 -0
  277. package/dist/spatial/Geohash.js +142 -0
  278. package/dist/spatial/Geohash.js.map +1 -0
  279. package/dist/spatial/Haversine.d.ts +24 -0
  280. package/dist/spatial/Haversine.d.ts.map +1 -0
  281. package/dist/spatial/Haversine.js +48 -0
  282. package/dist/spatial/Haversine.js.map +1 -0
  283. package/dist/spatial/index.d.ts +3 -111
  284. package/dist/spatial/index.d.ts.map +1 -0
  285. package/dist/spatial/index.js +2 -24
  286. package/dist/spatial/index.js.map +1 -1
  287. package/dist/storage/ContentContainer.d.ts +87 -0
  288. package/dist/storage/ContentContainer.d.ts.map +1 -0
  289. package/dist/storage/ContentContainer.js +122 -0
  290. package/dist/storage/ContentContainer.js.map +1 -0
  291. package/dist/storage/LocalForageAdapter.d.ts +36 -0
  292. package/dist/storage/LocalForageAdapter.d.ts.map +1 -0
  293. package/dist/storage/LocalForageAdapter.js +82 -0
  294. package/dist/storage/LocalForageAdapter.js.map +1 -0
  295. package/dist/storage/LocalStorageAdapter.d.ts +16 -0
  296. package/dist/storage/LocalStorageAdapter.d.ts.map +1 -0
  297. package/dist/storage/LocalStorageAdapter.js +50 -0
  298. package/dist/storage/LocalStorageAdapter.js.map +1 -0
  299. package/dist/storage/MediaProviderFromContainer.d.ts +21 -0
  300. package/dist/storage/MediaProviderFromContainer.d.ts.map +1 -0
  301. package/dist/storage/MediaProviderFromContainer.js +79 -0
  302. package/dist/storage/MediaProviderFromContainer.js.map +1 -0
  303. package/dist/storage/MemoryStorageAdapter.d.ts +15 -0
  304. package/dist/storage/MemoryStorageAdapter.d.ts.map +1 -0
  305. package/dist/storage/MemoryStorageAdapter.js +34 -0
  306. package/dist/storage/MemoryStorageAdapter.js.map +1 -0
  307. package/dist/storage/Storage.d.ts +23 -0
  308. package/dist/storage/Storage.d.ts.map +1 -0
  309. package/dist/storage/Storage.js +9 -0
  310. package/dist/storage/Storage.js.map +1 -0
  311. package/dist/storage/index.d.ts +9 -91
  312. package/dist/storage/index.d.ts.map +1 -0
  313. package/dist/storage/index.js +5 -10
  314. package/dist/storage/index.js.map +1 -1
  315. package/dist/story/index.d.ts +3 -2
  316. package/dist/themeLibrary-DR1VRo-8.d.ts +44 -0
  317. package/dist/timing/index.d.ts +4 -0
  318. package/dist/timing/index.d.ts.map +1 -0
  319. package/dist/timing/index.js +3 -0
  320. package/dist/timing/index.js.map +1 -0
  321. package/dist/timing/narrationTiming.d.ts +54 -0
  322. package/dist/timing/narrationTiming.d.ts.map +1 -0
  323. package/dist/timing/narrationTiming.js +190 -0
  324. package/dist/timing/narrationTiming.js.map +1 -0
  325. package/dist/timing/readingTime.d.ts +54 -0
  326. package/dist/timing/readingTime.d.ts.map +1 -0
  327. package/dist/timing/readingTime.js +49 -0
  328. package/dist/timing/readingTime.js.map +1 -0
  329. package/package.json +17 -3
  330. package/src/__tests__/contentContainer.test.ts +282 -0
  331. package/src/__tests__/contentExtractor.test.ts +183 -0
  332. package/src/__tests__/seededRandom.test.ts +142 -0
  333. package/src/__tests__/slideshowGenerator.test.ts +128 -0
  334. package/src/__tests__/timing.test.ts +167 -0
  335. package/src/generate/contentExtractor.ts +808 -0
  336. package/src/generate/index.ts +21 -0
  337. package/src/generate/slideshowGenerator.ts +273 -0
  338. package/src/generate/templateMapper.ts +170 -0
  339. package/src/index.ts +3 -0
  340. package/src/random/SeededRandom.ts +127 -0
  341. package/src/random/index.ts +1 -0
  342. package/src/storage/ContentContainer.ts +200 -0
  343. package/src/storage/MediaProviderFromContainer.ts +92 -0
  344. package/src/storage/index.ts +3 -0
  345. package/src/timing/index.ts +17 -0
  346. package/src/timing/narrationTiming.ts +220 -0
  347. package/src/timing/readingTime.ts +94 -0
  348. package/dist/chunk-VJN7UB2Z.js +0 -145
  349. package/dist/chunk-VJN7UB2Z.js.map +0 -1
@@ -0,0 +1,122 @@
1
+ /**
2
+ * ContentContainer — virtual file system for document containers.
3
+ *
4
+ * A Squisq document is more than just markdown: it's a container of files
5
+ * including the primary markdown document, images, audio, timing data, and
6
+ * other media. ContentContainer provides an abstract async file system
7
+ * interface for reading, writing, and listing these files.
8
+ *
9
+ * Paths are forward-slash separated strings relative to the container root
10
+ * (e.g., 'images/hero.jpg', 'index.md'). No leading slash.
11
+ *
12
+ * Implementations:
13
+ * - MemoryContentContainer — in-memory Map (for zip import, tests, transient use)
14
+ * - SlotContentContainer — backed by IndexedDB slot storage (in the site package)
15
+ */
16
+ // ============================================
17
+ // Well-known markdown filenames in priority order
18
+ // ============================================
19
+ const MARKDOWN_PRIORITY = ['index.md', 'doc.md', 'document.md'];
20
+ /**
21
+ * Find the primary markdown path from a list of file entries.
22
+ * Exported for reuse by other ContentContainer implementations.
23
+ */
24
+ export function findDocumentPath(entries) {
25
+ // Only consider root-level files (no '/' in path)
26
+ const rootFiles = entries.filter((e) => !e.path.includes('/'));
27
+ for (const name of MARKDOWN_PRIORITY) {
28
+ if (rootFiles.some((e) => e.path.toLowerCase() === name)) {
29
+ return name;
30
+ }
31
+ }
32
+ // Fallback: first .md file at root
33
+ const firstMd = rootFiles.find((e) => e.path.toLowerCase().endsWith('.md'));
34
+ return firstMd?.path ?? null;
35
+ }
36
+ /**
37
+ * In-memory ContentContainer backed by a Map.
38
+ *
39
+ * Used for zip import (deserialize into memory), tests, and transient operations.
40
+ */
41
+ export class MemoryContentContainer {
42
+ constructor() {
43
+ this.files = new Map();
44
+ }
45
+ async readFile(path) {
46
+ return this.files.get(path)?.data ?? null;
47
+ }
48
+ async writeFile(path, data, mimeType) {
49
+ const buffer = data instanceof ArrayBuffer ? data : data.slice().buffer;
50
+ this.files.set(path, {
51
+ data: buffer,
52
+ mimeType: mimeType ?? guessMimeType(path),
53
+ });
54
+ }
55
+ async removeFile(path) {
56
+ this.files.delete(path);
57
+ }
58
+ async listFiles(prefix) {
59
+ const entries = [];
60
+ for (const [path, file] of this.files) {
61
+ if (prefix && !path.startsWith(prefix))
62
+ continue;
63
+ entries.push({
64
+ path,
65
+ mimeType: file.mimeType,
66
+ size: file.data.byteLength,
67
+ });
68
+ }
69
+ return entries;
70
+ }
71
+ async exists(path) {
72
+ return this.files.has(path);
73
+ }
74
+ async getDocumentPath() {
75
+ return findDocumentPath(await this.listFiles());
76
+ }
77
+ async readDocument() {
78
+ const docPath = await this.getDocumentPath();
79
+ if (!docPath)
80
+ return null;
81
+ const data = await this.readFile(docPath);
82
+ if (!data)
83
+ return null;
84
+ return new TextDecoder().decode(data);
85
+ }
86
+ async writeDocument(markdown, filename) {
87
+ const name = filename ?? 'index.md';
88
+ const data = new TextEncoder().encode(markdown);
89
+ await this.writeFile(name, data, 'text/markdown');
90
+ }
91
+ }
92
+ // ============================================
93
+ // MIME type guessing
94
+ // ============================================
95
+ const EXTENSION_MIME_MAP = {
96
+ '.md': 'text/markdown',
97
+ '.txt': 'text/plain',
98
+ '.json': 'application/json',
99
+ '.jpg': 'image/jpeg',
100
+ '.jpeg': 'image/jpeg',
101
+ '.png': 'image/png',
102
+ '.gif': 'image/gif',
103
+ '.svg': 'image/svg+xml',
104
+ '.webp': 'image/webp',
105
+ '.avif': 'image/avif',
106
+ '.mp4': 'video/mp4',
107
+ '.webm': 'video/webm',
108
+ '.mp3': 'audio/mpeg',
109
+ '.wav': 'audio/wav',
110
+ '.ogg': 'audio/ogg',
111
+ '.css': 'text/css',
112
+ '.html': 'text/html',
113
+ '.js': 'application/javascript',
114
+ };
115
+ function guessMimeType(path) {
116
+ const dot = path.lastIndexOf('.');
117
+ if (dot === -1)
118
+ return 'application/octet-stream';
119
+ const ext = path.slice(dot).toLowerCase();
120
+ return EXTENSION_MIME_MAP[ext] ?? 'application/octet-stream';
121
+ }
122
+ //# sourceMappingURL=ContentContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentContainer.js","sourceRoot":"","sources":["../../src/storage/ContentContainer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * LocalForage adapter - IndexedDB storage with automatic fallbacks.
3
+ *
4
+ * Uses localforage which provides IndexedDB storage with automatic
5
+ * fallbacks to WebSQL and localStorage. This allows storing much more
6
+ * data than raw localStorage (which is limited to ~5MB).
7
+ *
8
+ * Unlike LocalStorageAdapter, this adapter can store binary data
9
+ * (ArrayBuffer, Blob, Uint8Array) natively without JSON serialization.
10
+ *
11
+ * Ported from qualla-internal/shared/services/StorageAdapters.ts with
12
+ * configurable store name and key prefix.
13
+ */
14
+ import type { StorageAdapter } from './Storage.js';
15
+ export interface LocalForageAdapterOptions {
16
+ /** IndexedDB database name (default: 'squisq') */
17
+ name?: string;
18
+ /** IndexedDB object store name (default: 'data') */
19
+ storeName?: string;
20
+ /** Key prefix for namespacing (default: '') */
21
+ prefix?: string;
22
+ /** Human-readable description (default: 'Squisq storage') */
23
+ description?: string;
24
+ }
25
+ export declare class LocalForageAdapter implements StorageAdapter {
26
+ readonly supportsEnumeration = true;
27
+ private store;
28
+ private prefix;
29
+ constructor(options?: LocalForageAdapterOptions);
30
+ get<T>(key: string): Promise<T | null>;
31
+ set<T>(key: string, value: T): Promise<void>;
32
+ remove(key: string): Promise<void>;
33
+ clear(): Promise<void>;
34
+ keys(): Promise<string[]>;
35
+ }
36
+ //# sourceMappingURL=LocalForageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalForageAdapter.d.ts","sourceRoot":"","sources":["../../src/storage/LocalForageAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,yBAAyB;IACxC,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,yBAA8B;IAY7C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAUtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBtB,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAchC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * LocalForage adapter - IndexedDB storage with automatic fallbacks.
3
+ *
4
+ * Uses localforage which provides IndexedDB storage with automatic
5
+ * fallbacks to WebSQL and localStorage. This allows storing much more
6
+ * data than raw localStorage (which is limited to ~5MB).
7
+ *
8
+ * Unlike LocalStorageAdapter, this adapter can store binary data
9
+ * (ArrayBuffer, Blob, Uint8Array) natively without JSON serialization.
10
+ *
11
+ * Ported from qualla-internal/shared/services/StorageAdapters.ts with
12
+ * configurable store name and key prefix.
13
+ */
14
+ import localforage from 'localforage';
15
+ export class LocalForageAdapter {
16
+ constructor(options = {}) {
17
+ this.supportsEnumeration = true;
18
+ const { name = 'squisq', storeName = 'data', prefix = '', description = 'Squisq storage', } = options;
19
+ this.prefix = prefix;
20
+ this.store = localforage.createInstance({ name, storeName, description });
21
+ }
22
+ async get(key) {
23
+ try {
24
+ const value = await this.store.getItem(this.prefix + key);
25
+ return value;
26
+ }
27
+ catch (e) {
28
+ console.warn('[Storage] get (IndexedDB) failed:', key, e);
29
+ return null;
30
+ }
31
+ }
32
+ async set(key, value) {
33
+ try {
34
+ await this.store.setItem(this.prefix + key, value);
35
+ }
36
+ catch (e) {
37
+ console.error('[Storage] set (IndexedDB) failed:', key, e);
38
+ throw e;
39
+ }
40
+ }
41
+ async remove(key) {
42
+ try {
43
+ await this.store.removeItem(this.prefix + key);
44
+ }
45
+ catch (e) {
46
+ console.warn('[Storage] remove (IndexedDB) failed:', key, e);
47
+ }
48
+ }
49
+ async clear() {
50
+ try {
51
+ if (this.prefix) {
52
+ // Only remove keys with our prefix
53
+ const keys = await this.store.keys();
54
+ const keysToRemove = keys.filter((k) => k.startsWith(this.prefix));
55
+ await Promise.all(keysToRemove.map((k) => this.store.removeItem(k)));
56
+ }
57
+ else {
58
+ // No prefix — clear the entire store
59
+ await this.store.clear();
60
+ }
61
+ }
62
+ catch (e) {
63
+ console.error('[Storage] clear (IndexedDB) failed:', e);
64
+ }
65
+ }
66
+ async keys() {
67
+ try {
68
+ const allKeys = await this.store.keys();
69
+ if (this.prefix) {
70
+ return allKeys
71
+ .filter((k) => k.startsWith(this.prefix))
72
+ .map((k) => k.slice(this.prefix.length));
73
+ }
74
+ return allKeys;
75
+ }
76
+ catch (e) {
77
+ console.warn('[Storage] keys (IndexedDB) failed:', e);
78
+ return [];
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=LocalForageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalForageAdapter.js","sourceRoot":"","sources":["../../src/storage/LocalForageAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * localStorage adapter for web browsers.
3
+ * Supports a configurable key prefix to namespace stored data.
4
+ */
5
+ import type { StorageAdapter } from './Storage.js';
6
+ export declare class LocalStorageAdapter implements StorageAdapter {
7
+ readonly supportsEnumeration = true;
8
+ private prefix;
9
+ constructor(prefix?: string);
10
+ get<T>(key: string): Promise<T | null>;
11
+ set<T>(key: string, value: T): Promise<void>;
12
+ remove(key: string): Promise<void>;
13
+ clear(): Promise<void>;
14
+ keys(): Promise<string[]>;
15
+ }
16
+ //# sourceMappingURL=LocalStorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalStorageAdapter.d.ts","sourceRoot":"","sources":["../../src/storage/LocalStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,SAAK;IAIjB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAUtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAUhC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * localStorage adapter for web browsers.
3
+ * Supports a configurable key prefix to namespace stored data.
4
+ */
5
+ export class LocalStorageAdapter {
6
+ constructor(prefix = '') {
7
+ this.supportsEnumeration = true;
8
+ this.prefix = prefix;
9
+ }
10
+ async get(key) {
11
+ try {
12
+ const raw = localStorage.getItem(this.prefix + key);
13
+ if (raw === null)
14
+ return null;
15
+ return JSON.parse(raw);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ async set(key, value) {
22
+ localStorage.setItem(this.prefix + key, JSON.stringify(value));
23
+ }
24
+ async remove(key) {
25
+ localStorage.removeItem(this.prefix + key);
26
+ }
27
+ async clear() {
28
+ const keysToRemove = [];
29
+ for (let i = 0; i < localStorage.length; i++) {
30
+ const k = localStorage.key(i);
31
+ if (k && k.startsWith(this.prefix)) {
32
+ keysToRemove.push(k);
33
+ }
34
+ }
35
+ for (const k of keysToRemove) {
36
+ localStorage.removeItem(k);
37
+ }
38
+ }
39
+ async keys() {
40
+ const result = [];
41
+ for (let i = 0; i < localStorage.length; i++) {
42
+ const k = localStorage.key(i);
43
+ if (k && k.startsWith(this.prefix)) {
44
+ result.push(k.slice(this.prefix.length));
45
+ }
46
+ }
47
+ return result;
48
+ }
49
+ }
50
+ //# sourceMappingURL=LocalStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalStorageAdapter.js","sourceRoot":"","sources":["../../src/storage/LocalStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,mBAAmB;IAI9B,YAAY,MAAM,GAAG,EAAE;QAHd,wBAAmB,GAAG,IAAI,CAAC;QAIlC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACpD,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ;QAChC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MediaProviderFromContainer — bridges ContentContainer to MediaProvider.
3
+ *
4
+ * Creates a MediaProvider that resolves relative paths by reading binary data
5
+ * from a ContentContainer and generating blob URLs. Blob URLs are cached and
6
+ * revoked on dispose().
7
+ *
8
+ * This allows any ContentContainer (memory, slot-backed, zip-loaded) to be
9
+ * used with existing rendering components (DocPlayer, ImageLayer, VideoLayer)
10
+ * that consume MediaProvider.
11
+ */
12
+ import type { MediaProvider } from '../schemas/MediaProvider.js';
13
+ import type { ContentContainer } from './ContentContainer.js';
14
+ /**
15
+ * Create a MediaProvider backed by a ContentContainer.
16
+ *
17
+ * @param container — The ContentContainer to read/write media from
18
+ * @returns A MediaProvider that resolves paths to blob URLs
19
+ */
20
+ export declare function createMediaProviderFromContainer(container: ContentContainer): MediaProvider;
21
+ //# sourceMappingURL=MediaProviderFromContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaProviderFromContainer.d.ts","sourceRoot":"","sources":["../../src/storage/MediaProviderFromContainer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,gBAAgB,GAAG,aAAa,CAsE3F"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * MediaProviderFromContainer — bridges ContentContainer to MediaProvider.
3
+ *
4
+ * Creates a MediaProvider that resolves relative paths by reading binary data
5
+ * from a ContentContainer and generating blob URLs. Blob URLs are cached and
6
+ * revoked on dispose().
7
+ *
8
+ * This allows any ContentContainer (memory, slot-backed, zip-loaded) to be
9
+ * used with existing rendering components (DocPlayer, ImageLayer, VideoLayer)
10
+ * that consume MediaProvider.
11
+ */
12
+ /**
13
+ * Create a MediaProvider backed by a ContentContainer.
14
+ *
15
+ * @param container — The ContentContainer to read/write media from
16
+ * @returns A MediaProvider that resolves paths to blob URLs
17
+ */
18
+ export function createMediaProviderFromContainer(container) {
19
+ const blobUrlCache = new Map();
20
+ return {
21
+ async resolveUrl(relativePath) {
22
+ const cached = blobUrlCache.get(relativePath);
23
+ if (cached)
24
+ return cached;
25
+ const data = await container.readFile(relativePath);
26
+ if (!data)
27
+ return relativePath;
28
+ const entries = await container.listFiles();
29
+ const entry = entries.find((e) => e.path === relativePath);
30
+ const mimeType = entry?.mimeType ?? 'application/octet-stream';
31
+ const blob = new Blob([data], { type: mimeType });
32
+ const url = URL.createObjectURL(blob);
33
+ blobUrlCache.set(relativePath, url);
34
+ return url;
35
+ },
36
+ async listMedia() {
37
+ const entries = await container.listFiles();
38
+ return entries
39
+ .filter((e) => !e.path.toLowerCase().endsWith('.md'))
40
+ .map((e) => ({
41
+ name: e.path,
42
+ mimeType: e.mimeType,
43
+ size: e.size,
44
+ }));
45
+ },
46
+ async addMedia(name, data, mimeType) {
47
+ // Invalidate any cached blob URL for this path before overwriting
48
+ const cached = blobUrlCache.get(name);
49
+ if (cached) {
50
+ URL.revokeObjectURL(cached);
51
+ blobUrlCache.delete(name);
52
+ }
53
+ let buffer;
54
+ if (data instanceof Blob) {
55
+ buffer = await data.arrayBuffer();
56
+ }
57
+ else {
58
+ buffer = data;
59
+ }
60
+ await container.writeFile(name, buffer, mimeType);
61
+ return name;
62
+ },
63
+ async removeMedia(relativePath) {
64
+ const cached = blobUrlCache.get(relativePath);
65
+ if (cached) {
66
+ URL.revokeObjectURL(cached);
67
+ blobUrlCache.delete(relativePath);
68
+ }
69
+ await container.removeFile(relativePath);
70
+ },
71
+ dispose() {
72
+ for (const url of blobUrlCache.values()) {
73
+ URL.revokeObjectURL(url);
74
+ }
75
+ blobUrlCache.clear();
76
+ },
77
+ };
78
+ }
79
+ //# sourceMappingURL=MediaProviderFromContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaProviderFromContainer.js","sourceRoot":"","sources":["../../src/storage/MediaProviderFromContainer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * In-memory storage adapter for testing and SSR environments.
3
+ * Data does not persist across page reloads.
4
+ */
5
+ import type { StorageAdapter } from './Storage.js';
6
+ export declare class MemoryStorageAdapter implements StorageAdapter {
7
+ readonly supportsEnumeration = true;
8
+ private store;
9
+ get<T>(key: string): Promise<T | null>;
10
+ set<T>(key: string, value: T): Promise<void>;
11
+ remove(key: string): Promise<void>;
12
+ clear(): Promise<void>;
13
+ keys(): Promise<string[]>;
14
+ }
15
+ //# sourceMappingURL=MemoryStorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryStorageAdapter.d.ts","sourceRoot":"","sources":["../../src/storage/MemoryStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,qBAAa,oBAAqB,YAAW,cAAc;IACzD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,OAAO,CAAC,KAAK,CAA6B;IAEpC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAUtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGhC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * In-memory storage adapter for testing and SSR environments.
3
+ * Data does not persist across page reloads.
4
+ */
5
+ export class MemoryStorageAdapter {
6
+ constructor() {
7
+ this.supportsEnumeration = true;
8
+ this.store = new Map();
9
+ }
10
+ async get(key) {
11
+ const val = this.store.get(key);
12
+ if (val === undefined)
13
+ return null;
14
+ try {
15
+ return JSON.parse(val);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ async set(key, value) {
22
+ this.store.set(key, JSON.stringify(value));
23
+ }
24
+ async remove(key) {
25
+ this.store.delete(key);
26
+ }
27
+ async clear() {
28
+ this.store.clear();
29
+ }
30
+ async keys() {
31
+ return Array.from(this.store.keys());
32
+ }
33
+ }
34
+ //# sourceMappingURL=MemoryStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryStorageAdapter.js","sourceRoot":"","sources":["../../src/storage/MemoryStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,oBAAoB;IAAjC;QACW,wBAAmB,GAAG,IAAI,CAAC;QAC5B,UAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IA2B5C,CAAC;IAzBC,KAAK,CAAC,GAAG,CAAI,GAAW;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Storage - Abstract persistence interface
3
+ *
4
+ * Defines the contract for persistent storage across different environments.
5
+ * All values are JSON-serialized, so any serializable value can be stored.
6
+ * Keys can be automatically namespaced with a configurable prefix.
7
+ */
8
+ /** Storage adapter interface - implemented by environment-specific adapters */
9
+ export interface StorageAdapter {
10
+ /** Get a value by key, returns null if not found */
11
+ get<T>(key: string): Promise<T | null>;
12
+ /** Set a value for a key */
13
+ set<T>(key: string, value: T): Promise<void>;
14
+ /** Remove a value by key */
15
+ remove(key: string): Promise<void>;
16
+ /** Clear all stored values (within our namespace) */
17
+ clear(): Promise<void>;
18
+ /** Get all keys (within our namespace) */
19
+ keys(): Promise<string[]>;
20
+ /** Check if this adapter supports enumeration */
21
+ readonly supportsEnumeration: boolean;
22
+ }
23
+ //# sourceMappingURL=Storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../src/storage/Storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEvC,4BAA4B;IAC5B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,qDAAqD;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,0CAA0C;IAC1C,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1B,iDAAiD;IACjD,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Storage - Abstract persistence interface
3
+ *
4
+ * Defines the contract for persistent storage across different environments.
5
+ * All values are JSON-serialized, so any serializable value can be stored.
6
+ * Keys can be automatically namespaced with a configurable prefix.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=Storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Storage.js","sourceRoot":"","sources":["../../src/storage/Storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1,91 +1,9 @@
1
- /**
2
- * Storage - Abstract persistence interface
3
- *
4
- * Defines the contract for persistent storage across different environments.
5
- * All values are JSON-serialized, so any serializable value can be stored.
6
- * Keys can be automatically namespaced with a configurable prefix.
7
- */
8
- /** Storage adapter interface - implemented by environment-specific adapters */
9
- interface StorageAdapter {
10
- /** Get a value by key, returns null if not found */
11
- get<T>(key: string): Promise<T | null>;
12
- /** Set a value for a key */
13
- set<T>(key: string, value: T): Promise<void>;
14
- /** Remove a value by key */
15
- remove(key: string): Promise<void>;
16
- /** Clear all stored values (within our namespace) */
17
- clear(): Promise<void>;
18
- /** Get all keys (within our namespace) */
19
- keys(): Promise<string[]>;
20
- /** Check if this adapter supports enumeration */
21
- readonly supportsEnumeration: boolean;
22
- }
23
-
24
- /**
25
- * In-memory storage adapter for testing and SSR environments.
26
- * Data does not persist across page reloads.
27
- */
28
-
29
- declare class MemoryStorageAdapter implements StorageAdapter {
30
- readonly supportsEnumeration = true;
31
- private store;
32
- get<T>(key: string): Promise<T | null>;
33
- set<T>(key: string, value: T): Promise<void>;
34
- remove(key: string): Promise<void>;
35
- clear(): Promise<void>;
36
- keys(): Promise<string[]>;
37
- }
38
-
39
- /**
40
- * localStorage adapter for web browsers.
41
- * Supports a configurable key prefix to namespace stored data.
42
- */
43
-
44
- declare class LocalStorageAdapter implements StorageAdapter {
45
- readonly supportsEnumeration = true;
46
- private prefix;
47
- constructor(prefix?: string);
48
- get<T>(key: string): Promise<T | null>;
49
- set<T>(key: string, value: T): Promise<void>;
50
- remove(key: string): Promise<void>;
51
- clear(): Promise<void>;
52
- keys(): Promise<string[]>;
53
- }
54
-
55
- /**
56
- * LocalForage adapter - IndexedDB storage with automatic fallbacks.
57
- *
58
- * Uses localforage which provides IndexedDB storage with automatic
59
- * fallbacks to WebSQL and localStorage. This allows storing much more
60
- * data than raw localStorage (which is limited to ~5MB).
61
- *
62
- * Unlike LocalStorageAdapter, this adapter can store binary data
63
- * (ArrayBuffer, Blob, Uint8Array) natively without JSON serialization.
64
- *
65
- * Ported from qualla-internal/shared/services/StorageAdapters.ts with
66
- * configurable store name and key prefix.
67
- */
68
-
69
- interface LocalForageAdapterOptions {
70
- /** IndexedDB database name (default: 'squisq') */
71
- name?: string;
72
- /** IndexedDB object store name (default: 'data') */
73
- storeName?: string;
74
- /** Key prefix for namespacing (default: '') */
75
- prefix?: string;
76
- /** Human-readable description (default: 'Squisq storage') */
77
- description?: string;
78
- }
79
- declare class LocalForageAdapter implements StorageAdapter {
80
- readonly supportsEnumeration = true;
81
- private store;
82
- private prefix;
83
- constructor(options?: LocalForageAdapterOptions);
84
- get<T>(key: string): Promise<T | null>;
85
- set<T>(key: string, value: T): Promise<void>;
86
- remove(key: string): Promise<void>;
87
- clear(): Promise<void>;
88
- keys(): Promise<string[]>;
89
- }
90
-
91
- export { LocalForageAdapter, type LocalForageAdapterOptions, LocalStorageAdapter, MemoryStorageAdapter, type StorageAdapter };
1
+ export type { StorageAdapter } from './Storage.js';
2
+ export { MemoryStorageAdapter } from './MemoryStorageAdapter.js';
3
+ export { LocalStorageAdapter } from './LocalStorageAdapter.js';
4
+ export { LocalForageAdapter } from './LocalForageAdapter.js';
5
+ export type { LocalForageAdapterOptions } from './LocalForageAdapter.js';
6
+ export type { ContentContainer, ContentEntry } from './ContentContainer.js';
7
+ export { MemoryContentContainer, findDocumentPath } from './ContentContainer.js';
8
+ export { createMediaProviderFromContainer } from './MediaProviderFromContainer.js';
9
+ //# sourceMappingURL=index.d.ts.map