@bendyline/squisq 2.0.1 → 2.2.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.
- package/LICENSE +21 -0
- package/NOTICE.md +24 -0
- package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
- package/dist/{Doc-ylqWKDc_.d.ts → Doc-BubIpWsp.d.ts} +160 -3
- package/dist/{ImageEditDoc-D828IXJ1.d.ts → ImageEditDoc-CGxk5CHc.d.ts} +1 -1
- package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
- package/dist/chunk-2L55443L.js +0 -0
- package/dist/chunk-2ZWIXGAC.js +214 -0
- package/dist/{chunk-2PWOO4ZE.js → chunk-32R2RZAO.js} +72 -3
- package/dist/chunk-3IGPAPQ7.js +645 -0
- package/dist/{chunk-QE7TWGVT.js → chunk-4VOD55SX.js} +0 -1
- package/dist/{chunk-3E5F2XMR.js → chunk-67L6WRJN.js} +0 -1
- package/dist/{chunk-5DKBFXPY.js → chunk-6ECMNUIP.js} +26 -18
- package/dist/{chunk-X6DUONGT.js → chunk-7ARJZYQY.js} +280 -128
- package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
- package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
- package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
- package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
- package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
- package/dist/chunk-BCCXTMN5.js +699 -0
- package/dist/{chunk-W4O2TX5I.js → chunk-C33GTPUZ.js} +579 -4
- package/dist/{chunk-MMPBOUK7.js → chunk-CB45YGAM.js} +7 -2
- package/dist/{chunk-CY2R2VPR.js → chunk-DYPMOPIW.js} +18 -2
- package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
- package/dist/{chunk-5UYI3RJB.js → chunk-FDYDYL77.js} +54 -40
- package/dist/{chunk-TFJVXUHH.js → chunk-I2O6W7DX.js} +1513 -79
- package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
- package/dist/chunk-OPO5K4DZ.js +241 -0
- package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
- package/dist/chunk-QKPXHDLR.js +0 -0
- package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
- package/dist/{chunk-PXLVXTLW.js → chunk-RS5AP3J4.js} +72 -15
- package/dist/chunk-WV5ARNDA.js +0 -0
- package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
- package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
- package/dist/chunk-XWNNA3KE.js +0 -0
- package/dist/chunk-YZNGMV3G.js +0 -0
- package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
- package/dist/doc/index.d.ts +166 -12
- package/dist/doc/index.js +36 -17
- package/dist/generate/index.d.ts +2 -2
- package/dist/generate/index.js +2 -3
- package/dist/icons/index.js +3 -4
- package/dist/icons/inlineIconMarker.js +1 -2
- package/dist/imageEdit/index.d.ts +48 -17
- package/dist/imageEdit/index.js +3 -4
- package/dist/index.d.ts +13 -12
- package/dist/index.js +118 -33
- package/dist/jsonForm/index.d.ts +10 -3
- package/dist/jsonForm/index.js +8 -7
- package/dist/markdown/index.d.ts +75 -11
- package/dist/markdown/index.js +32 -7
- package/dist/materializePageSection-wSLA2A1g.d.ts +223 -0
- package/dist/narration/index.d.ts +16 -3
- package/dist/narration/index.js +13 -14
- package/dist/random/index.d.ts +11 -2
- package/dist/random/index.js +2 -3
- package/dist/recommend/index.d.ts +1 -1
- package/dist/recommend/index.js +3 -4
- package/dist/schemas/index.d.ts +31 -6
- package/dist/schemas/index.js +43 -6
- package/dist/spatial/index.d.ts +2 -1
- package/dist/spatial/index.js +1 -2
- package/dist/storage/index.d.ts +4 -2
- package/dist/storage/index.js +1 -2
- package/dist/{themeLibrary-RjVgLpUi.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
- package/dist/timing/index.js +3 -4
- package/dist/transform/index.d.ts +9 -10
- package/dist/transform/index.js +6 -7
- package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
- package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
- package/dist/versions/index.d.ts +14 -11
- package/dist/versions/index.js +2 -3
- package/package.json +4 -2
- package/dist/chunk-2PWOO4ZE.js.map +0 -1
- package/dist/chunk-2UQOHYE2.js.map +0 -1
- package/dist/chunk-3E5F2XMR.js.map +0 -1
- package/dist/chunk-4X3JQXNM.js.map +0 -1
- package/dist/chunk-5DKBFXPY.js.map +0 -1
- package/dist/chunk-5J4HKRJF.js.map +0 -1
- package/dist/chunk-5UYI3RJB.js.map +0 -1
- package/dist/chunk-66QO7XFB.js.map +0 -1
- package/dist/chunk-AMIR72JP.js +0 -380
- package/dist/chunk-AMIR72JP.js.map +0 -1
- package/dist/chunk-CY2R2VPR.js.map +0 -1
- package/dist/chunk-DBS6RIFL.js.map +0 -1
- package/dist/chunk-DNJKBAI7.js +0 -1
- package/dist/chunk-DNJKBAI7.js.map +0 -1
- package/dist/chunk-ET53IIEP.js +0 -1
- package/dist/chunk-ET53IIEP.js.map +0 -1
- package/dist/chunk-FVJUUTEM.js +0 -74
- package/dist/chunk-FVJUUTEM.js.map +0 -1
- package/dist/chunk-FVTQSNR7.js.map +0 -1
- package/dist/chunk-GZY66SDN.js.map +0 -1
- package/dist/chunk-JOQYPRDZ.js.map +0 -1
- package/dist/chunk-MMPBOUK7.js.map +0 -1
- package/dist/chunk-PGGGKYWG.js +0 -1
- package/dist/chunk-PGGGKYWG.js.map +0 -1
- package/dist/chunk-PXLVXTLW.js.map +0 -1
- package/dist/chunk-Q7LROV2H.js.map +0 -1
- package/dist/chunk-QE7TWGVT.js.map +0 -1
- package/dist/chunk-R2GC6RLD.js +0 -344
- package/dist/chunk-R2GC6RLD.js.map +0 -1
- package/dist/chunk-R2YZTCLO.js.map +0 -1
- package/dist/chunk-S7A5D7ZJ.js +0 -174
- package/dist/chunk-S7A5D7ZJ.js.map +0 -1
- package/dist/chunk-TFJVXUHH.js.map +0 -1
- package/dist/chunk-TUWMK62B.js.map +0 -1
- package/dist/chunk-V543AI2F.js +0 -1
- package/dist/chunk-V543AI2F.js.map +0 -1
- package/dist/chunk-VR7UPJ7C.js.map +0 -1
- package/dist/chunk-W4O2TX5I.js.map +0 -1
- package/dist/chunk-X6DUONGT.js.map +0 -1
- package/dist/chunk-ZLQKNOZQ.js +0 -1
- package/dist/chunk-ZLQKNOZQ.js.map +0 -1
- package/dist/doc/index.js.map +0 -1
- package/dist/generate/index.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/icons/inlineIconMarker.js.map +0 -1
- package/dist/imageEdit/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jsonForm/index.js.map +0 -1
- package/dist/markdown/index.js.map +0 -1
- package/dist/narration/index.js.map +0 -1
- package/dist/random/index.js.map +0 -1
- package/dist/recommend/index.js.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/spatial/index.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/timing/index.js.map +0 -1
- package/dist/transform/index.js.map +0 -1
- package/dist/versions/index.js.map +0 -1
- package/src/__tests__/animationUtils.test.ts +0 -117
- package/src/__tests__/annotationCoercion.test.ts +0 -243
- package/src/__tests__/applyNarrationTiming.test.ts +0 -190
- package/src/__tests__/applyRenderStyle.test.ts +0 -146
- package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
- package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
- package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
- package/src/__tests__/asciiDiagramParse.test.ts +0 -233
- package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
- package/src/__tests__/asciiDiagramRender.test.ts +0 -162
- package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
- package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
- package/src/__tests__/asciiTimelineParse.test.ts +0 -205
- package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
- package/src/__tests__/asciiTimelineRender.test.ts +0 -376
- package/src/__tests__/atmosphereLayers.test.ts +0 -108
- package/src/__tests__/attrTokens.test.ts +0 -167
- package/src/__tests__/colorUtils.test.ts +0 -112
- package/src/__tests__/contentContainer.test.ts +0 -325
- package/src/__tests__/contentExtractor.test.ts +0 -243
- package/src/__tests__/coverBlock.test.ts +0 -310
- package/src/__tests__/customTemplateSample.test.ts +0 -144
- package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
- package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
- package/src/__tests__/dataTable.test.ts +0 -145
- package/src/__tests__/diagramBlock.test.ts +0 -122
- package/src/__tests__/diagramLayout.test.ts +0 -134
- package/src/__tests__/diagramText.test.ts +0 -26
- package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
- package/src/__tests__/drawing.test.ts +0 -109
- package/src/__tests__/drawingBlock.test.ts +0 -124
- package/src/__tests__/drawingLayout.test.ts +0 -171
- package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
- package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
- package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
- package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
- package/src/__tests__/geohash.test.ts +0 -110
- package/src/__tests__/getLayers.test.ts +0 -243
- package/src/__tests__/getLayersFallback.test.ts +0 -103
- package/src/__tests__/haversine.test.ts +0 -63
- package/src/__tests__/iconResolve.test.ts +0 -122
- package/src/__tests__/imageEditExportSvg.test.ts +0 -70
- package/src/__tests__/imageEditState.test.ts +0 -74
- package/src/__tests__/imageEditVersions.test.ts +0 -243
- package/src/__tests__/inferDocumentTitle.test.ts +0 -50
- package/src/__tests__/inlineIconMarker.test.ts +0 -36
- package/src/__tests__/inputDescriptors.test.ts +0 -162
- package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
- package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
- package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
- package/src/__tests__/jsonForm.pointer.test.ts +0 -149
- package/src/__tests__/jsonForm.tokens.test.ts +0 -84
- package/src/__tests__/layoutBlock.test.ts +0 -83
- package/src/__tests__/layoutLayout.test.ts +0 -169
- package/src/__tests__/localForageAdapter.test.ts +0 -155
- package/src/__tests__/majorApiTypes.test.ts +0 -18
- package/src/__tests__/markdown.test.ts +0 -1009
- package/src/__tests__/markdownIcons.test.ts +0 -104
- package/src/__tests__/markdownSanitize.test.ts +0 -81
- package/src/__tests__/markdownToDoc.test.ts +0 -957
- package/src/__tests__/matchFontFamily.test.ts +0 -114
- package/src/__tests__/materializeBlockLayers.test.ts +0 -135
- package/src/__tests__/materializeTestUtils.ts +0 -17
- package/src/__tests__/mediaAnnotations.test.ts +0 -91
- package/src/__tests__/mediaSchedule.test.ts +0 -118
- package/src/__tests__/narrationAlign.test.ts +0 -150
- package/src/__tests__/narrationFeatures.test.ts +0 -71
- package/src/__tests__/narrationNuclei.test.ts +0 -45
- package/src/__tests__/narrationPacing.test.ts +0 -189
- package/src/__tests__/narrationScript.test.ts +0 -149
- package/src/__tests__/narrationSessionRepro.test.ts +0 -62
- package/src/__tests__/narrationSidecar.test.ts +0 -88
- package/src/__tests__/narrationSyllables.test.ts +0 -65
- package/src/__tests__/narrationTestSignals.ts +0 -167
- package/src/__tests__/narrationVad.test.ts +0 -66
- package/src/__tests__/pandocAttrParse.test.ts +0 -187
- package/src/__tests__/recommendTemplates.test.ts +0 -183
- package/src/__tests__/resolveDocTheme.test.ts +0 -69
- package/src/__tests__/rootExports.test.ts +0 -61
- package/src/__tests__/scopedContentContainer.test.ts +0 -109
- package/src/__tests__/seededRandom.test.ts +0 -142
- package/src/__tests__/shapeGeometry.test.ts +0 -138
- package/src/__tests__/shapeVocabulary.test.ts +0 -133
- package/src/__tests__/storage.test.ts +0 -60
- package/src/__tests__/structuredData.test.ts +0 -249
- package/src/__tests__/surface.test.ts +0 -68
- package/src/__tests__/templateAnnotationParse.test.ts +0 -160
- package/src/__tests__/templateInputs.test.ts +0 -69
- package/src/__tests__/templateMetadata.test.ts +0 -32
- package/src/__tests__/templates.test.ts +0 -710
- package/src/__tests__/themeCompile.test.ts +0 -225
- package/src/__tests__/themeValidator.test.ts +0 -131
- package/src/__tests__/timing.test.ts +0 -167
- package/src/__tests__/transformProvenance.test.ts +0 -160
- package/src/__tests__/transformV2.test.ts +0 -163
- package/src/__tests__/transitionNormalize.test.ts +0 -61
- package/src/__tests__/treeviewBattle.test.ts +0 -76
- package/src/__tests__/treeviewDetect.test.ts +0 -168
- package/src/__tests__/treeviewParse.test.ts +0 -118
- package/src/__tests__/treeviewPipeline.test.ts +0 -183
- package/src/__tests__/treeviewRender.test.ts +0 -91
- package/src/__tests__/validateDoc.test.ts +0 -260
- package/src/__tests__/versions.test.ts +0 -459
- package/src/doc/annotationBlocks.ts +0 -117
- package/src/doc/applyNarrationTiming.ts +0 -244
- package/src/doc/asciiDiagram/chars.ts +0 -210
- package/src/doc/asciiDiagram/detect.ts +0 -175
- package/src/doc/asciiDiagram/index.ts +0 -38
- package/src/doc/asciiDiagram/mapping.ts +0 -225
- package/src/doc/asciiDiagram/parse.ts +0 -1095
- package/src/doc/asciiDiagram/render.ts +0 -963
- package/src/doc/asciiDiagram/repair.ts +0 -400
- package/src/doc/asciiDiagram/types.ts +0 -65
- package/src/doc/asciiTimeline/detect.ts +0 -138
- package/src/doc/asciiTimeline/index.ts +0 -26
- package/src/doc/asciiTimeline/mapping.ts +0 -43
- package/src/doc/asciiTimeline/parse.ts +0 -870
- package/src/doc/asciiTimeline/render.ts +0 -427
- package/src/doc/asciiTimeline/types.ts +0 -73
- package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
- package/src/doc/audioMapping.ts +0 -442
- package/src/doc/customTemplatesFrontmatter.ts +0 -273
- package/src/doc/customThemesFrontmatter.ts +0 -95
- package/src/doc/docToMarkdown.ts +0 -284
- package/src/doc/index.ts +0 -127
- package/src/doc/markdownToDoc.ts +0 -1054
- package/src/doc/materializeBlockLayers.ts +0 -304
- package/src/doc/mediaAnnotations.ts +0 -120
- package/src/doc/resolveDocTheme.ts +0 -56
- package/src/doc/standaloneAnnotation.ts +0 -58
- package/src/doc/structuredData.ts +0 -301
- package/src/doc/templateInputs.ts +0 -423
- package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
- package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
- package/src/doc/templates/accentImage.ts +0 -362
- package/src/doc/templates/captionUtils.ts +0 -56
- package/src/doc/templates/comparisonBar.ts +0 -173
- package/src/doc/templates/coverBlock.ts +0 -255
- package/src/doc/templates/customTemplate.ts +0 -51
- package/src/doc/templates/dataTable.ts +0 -102
- package/src/doc/templates/dateEvent.ts +0 -147
- package/src/doc/templates/definitionCard.ts +0 -140
- package/src/doc/templates/diagramBlock.ts +0 -403
- package/src/doc/templates/diagramLayout.ts +0 -159
- package/src/doc/templates/drawingBlock.ts +0 -325
- package/src/doc/templates/drawingLayout.ts +0 -539
- package/src/doc/templates/factCard.ts +0 -146
- package/src/doc/templates/fallbackBlock.ts +0 -123
- package/src/doc/templates/featureBlock.ts +0 -209
- package/src/doc/templates/fullBleedQuote.ts +0 -83
- package/src/doc/templates/imageWithCaption.ts +0 -186
- package/src/doc/templates/index.ts +0 -642
- package/src/doc/templates/inputDescriptors.ts +0 -451
- package/src/doc/templates/layoutBlock.ts +0 -43
- package/src/doc/templates/layoutLayout.ts +0 -243
- package/src/doc/templates/listBlock.ts +0 -207
- package/src/doc/templates/mapBlock.ts +0 -138
- package/src/doc/templates/metadata.ts +0 -130
- package/src/doc/templates/persistentLayers.ts +0 -526
- package/src/doc/templates/photoGrid.ts +0 -190
- package/src/doc/templates/pullQuote.ts +0 -141
- package/src/doc/templates/quoteBlock.ts +0 -141
- package/src/doc/templates/registry.ts +0 -88
- package/src/doc/templates/sectionHeader.ts +0 -120
- package/src/doc/templates/statHighlight.ts +0 -146
- package/src/doc/templates/templateNames.ts +0 -22
- package/src/doc/templates/timelineBlock.ts +0 -613
- package/src/doc/templates/titleBlock.ts +0 -150
- package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
- package/src/doc/templates/tokens/resolveTokens.ts +0 -453
- package/src/doc/templates/treeBlock.ts +0 -131
- package/src/doc/templates/twoColumn.ts +0 -263
- package/src/doc/templates/videoPullQuote.ts +0 -142
- package/src/doc/templates/videoWithCaption.ts +0 -135
- package/src/doc/treeview/chars.ts +0 -72
- package/src/doc/treeview/detect.ts +0 -145
- package/src/doc/treeview/index.ts +0 -30
- package/src/doc/treeview/mapping.ts +0 -95
- package/src/doc/treeview/parse.ts +0 -201
- package/src/doc/treeview/render.ts +0 -41
- package/src/doc/treeview/types.ts +0 -43
- package/src/doc/utils/animationUtils.ts +0 -399
- package/src/doc/utils/applyRenderStyle.ts +0 -106
- package/src/doc/utils/diagramText.ts +0 -78
- package/src/doc/utils/imageTreatment.ts +0 -70
- package/src/doc/utils/nearest.ts +0 -59
- package/src/doc/utils/shapeGeometry.ts +0 -614
- package/src/doc/utils/themeUtils.ts +0 -243
- package/src/doc/validate.ts +0 -575
- package/src/generate/contentExtractor.ts +0 -921
- package/src/generate/index.ts +0 -18
- package/src/generate/templateMapper.ts +0 -177
- package/src/icons/iconData.ts +0 -31
- package/src/icons/index.ts +0 -26
- package/src/icons/inlineIconMarker.ts +0 -73
- package/src/icons/resolve.ts +0 -139
- package/src/imageEdit/ImageEditVersionManager.ts +0 -73
- package/src/imageEdit/export.ts +0 -410
- package/src/imageEdit/index.ts +0 -72
- package/src/imageEdit/persistence.ts +0 -113
- package/src/imageEdit/state.ts +0 -112
- package/src/imageEdit/versionPaths.ts +0 -44
- package/src/imageEdit/versions.ts +0 -152
- package/src/index.ts +0 -15
- package/src/internal/immutable.ts +0 -58
- package/src/jsonForm/chooseControl.ts +0 -88
- package/src/jsonForm/evaluateWhen.ts +0 -59
- package/src/jsonForm/index.ts +0 -32
- package/src/jsonForm/inferSchema.ts +0 -25
- package/src/jsonForm/pointer.ts +0 -154
- package/src/jsonForm/tokens.ts +0 -78
- package/src/jsonForm/types.ts +0 -167
- package/src/markdown/annotationCoercion.ts +0 -295
- package/src/markdown/attrTokens.ts +0 -243
- package/src/markdown/convert.ts +0 -1353
- package/src/markdown/htmlParse.ts +0 -212
- package/src/markdown/index.ts +0 -152
- package/src/markdown/parse.ts +0 -103
- package/src/markdown/sanitize.ts +0 -318
- package/src/markdown/stringify.ts +0 -207
- package/src/markdown/types.ts +0 -710
- package/src/markdown/utils.ts +0 -459
- package/src/narration/align.ts +0 -514
- package/src/narration/features.ts +0 -231
- package/src/narration/index.ts +0 -86
- package/src/narration/nuclei.ts +0 -118
- package/src/narration/pacing.ts +0 -211
- package/src/narration/script.ts +0 -239
- package/src/narration/session.ts +0 -100
- package/src/narration/sidecar.ts +0 -187
- package/src/narration/syllables.ts +0 -85
- package/src/narration/trace.ts +0 -50
- package/src/narration/types.ts +0 -299
- package/src/narration/vad.ts +0 -131
- package/src/ngeohash.d.ts +0 -11
- package/src/random/SeededRandom.ts +0 -127
- package/src/random/index.ts +0 -1
- package/src/recommend/index.ts +0 -16
- package/src/recommend/numberHighlight.ts +0 -25
- package/src/recommend/templates.ts +0 -393
- package/src/schemas/BlockTemplates.ts +0 -1046
- package/src/schemas/CustomTemplates.ts +0 -126
- package/src/schemas/Doc.ts +0 -1052
- package/src/schemas/ImageEditDoc.ts +0 -102
- package/src/schemas/LayoutStrategy.ts +0 -178
- package/src/schemas/Media.ts +0 -179
- package/src/schemas/MediaProvider.ts +0 -70
- package/src/schemas/Theme.ts +0 -406
- package/src/schemas/Transitions.ts +0 -224
- package/src/schemas/Types.ts +0 -15
- package/src/schemas/Viewport.ts +0 -91
- package/src/schemas/colorUtils.ts +0 -219
- package/src/schemas/fontStacks.ts +0 -339
- package/src/schemas/index.ts +0 -29
- package/src/schemas/themeCompile.ts +0 -237
- package/src/schemas/themeConstants.ts +0 -2
- package/src/schemas/themeLibrary.ts +0 -60
- package/src/schemas/themeValidator.ts +0 -426
- package/src/schemas/themes/bold.json +0 -48
- package/src/schemas/themes/cinematic.json +0 -111
- package/src/schemas/themes/documentary.json +0 -96
- package/src/schemas/themes/gezellig.json +0 -93
- package/src/schemas/themes/index.ts +0 -53
- package/src/schemas/themes/magazine.json +0 -89
- package/src/schemas/themes/minimalist.json +0 -45
- package/src/schemas/themes/morning-light.json +0 -85
- package/src/schemas/themes/standard-dark.json +0 -85
- package/src/schemas/themes/standard.json +0 -74
- package/src/schemas/themes/tech-dark.json +0 -101
- package/src/schemas/themes/warm-earth.json +0 -50
- package/src/spatial/Geohash.ts +0 -196
- package/src/spatial/Haversine.ts +0 -59
- package/src/spatial/index.ts +0 -2
- package/src/storage/ContentContainer.ts +0 -220
- package/src/storage/LocalForageAdapter.ts +0 -103
- package/src/storage/LocalStorageAdapter.ts +0 -57
- package/src/storage/MediaProviderFromContainer.ts +0 -92
- package/src/storage/MemoryStorageAdapter.ts +0 -37
- package/src/storage/ScopedContentContainer.ts +0 -143
- package/src/storage/Storage.ts +0 -28
- package/src/storage/index.ts +0 -9
- package/src/timing/index.ts +0 -17
- package/src/timing/narrationTiming.ts +0 -220
- package/src/timing/readingTime.ts +0 -94
- package/src/transform/applyTransform.ts +0 -122
- package/src/transform/blockAnalyzer.ts +0 -181
- package/src/transform/index.ts +0 -23
- package/src/transform/registry.ts +0 -198
- package/src/transform/styles/dataDriven.ts +0 -17
- package/src/transform/styles/documentary.ts +0 -17
- package/src/transform/styles/index.ts +0 -5
- package/src/transform/styles/magazine.ts +0 -18
- package/src/transform/styles/minimal.ts +0 -17
- package/src/transform/styles/narrative.ts +0 -18
- package/src/transform/templateSelector.ts +0 -389
- package/src/transform/timingAllocator.ts +0 -257
- package/src/transform/types.ts +0 -151
- package/src/versions/DocumentVersionManager.ts +0 -70
- package/src/versions/gitignore.ts +0 -34
- package/src/versions/index.ts +0 -56
- package/src/versions/operations.ts +0 -144
- package/src/versions/paths.ts +0 -51
- package/src/versions/snapshotStore.ts +0 -202
- package/src/versions/timestamp.ts +0 -48
- package/src/versions/types.ts +0 -93
package/src/transform/types.ts
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Transform Types
|
|
3
|
-
*
|
|
4
|
-
* Defines the type system for doc block transforms — algorithms that take
|
|
5
|
-
* an existing Doc and produce a new Doc with blocks optimized for visual
|
|
6
|
-
* presentation. Transforms are read-only on the input and deterministic.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { Doc } from '../schemas/Doc.js';
|
|
10
|
-
import type { ExtractionType } from '../generate/contentExtractor.js';
|
|
11
|
-
import type { ColorScheme } from '../schemas/BlockTemplates.js';
|
|
12
|
-
|
|
13
|
-
// ── Style identification ─────────────────────────────────────────
|
|
14
|
-
|
|
15
|
-
/** Identifier for a built-in or caller-registered transform style. */
|
|
16
|
-
export type TransformStyleId = string;
|
|
17
|
-
|
|
18
|
-
/** Summary info for UI dropdowns (mirrors getThemeSummaries pattern). */
|
|
19
|
-
export interface TransformStyleSummary {
|
|
20
|
-
id: TransformStyleId;
|
|
21
|
-
name: string;
|
|
22
|
-
description: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// ── Style configuration ──────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
/** Declarative configuration controlling how a style transforms content. */
|
|
28
|
-
export interface TransformStyleConfig {
|
|
29
|
-
/** Unique style identifier. */
|
|
30
|
-
id: TransformStyleId;
|
|
31
|
-
/** Human-readable name for UI display. */
|
|
32
|
-
name: string;
|
|
33
|
-
/** Short description for UI tooltips. */
|
|
34
|
-
description: string;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Minimum confidence for extracted elements to become template blocks (0–1).
|
|
38
|
-
* Higher values = fewer but higher-quality transformations.
|
|
39
|
-
*/
|
|
40
|
-
minConfidence: number;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Maximum fraction of blocks that get transformed (0–1).
|
|
44
|
-
* 0.2 = light touch, 0.8 = aggressive restructuring.
|
|
45
|
-
*/
|
|
46
|
-
transformRatio: number;
|
|
47
|
-
|
|
48
|
-
/** Which extraction types this style prefers, in priority order. */
|
|
49
|
-
preferredTypes: ExtractionType[];
|
|
50
|
-
|
|
51
|
-
/** Color schemes to rotate through on template blocks. */
|
|
52
|
-
colorSchemes: ColorScheme[];
|
|
53
|
-
|
|
54
|
-
/** Whether to insert sectionHeader blocks between groups. */
|
|
55
|
-
insertSectionHeaders: boolean;
|
|
56
|
-
|
|
57
|
-
/** Whether to interleave imageWithCaption blocks when images are available. */
|
|
58
|
-
interleaveImages: boolean;
|
|
59
|
-
|
|
60
|
-
/** Maximum template blocks promoted per source section. */
|
|
61
|
-
blocksPerSection: { max: number };
|
|
62
|
-
|
|
63
|
-
/** Transition style preference for transformed blocks. */
|
|
64
|
-
transitionStyle: 'cut' | 'fade' | 'dissolve' | 'mixed';
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Per-style extraction→template remapping. Falls back to the fixed
|
|
68
|
-
* default map in `generate/templateMapper.ts` for unmapped types.
|
|
69
|
-
* Only text-compatible targets are honored (see
|
|
70
|
-
* `translateTemplateBlock`) — an unknown pairing keeps the default.
|
|
71
|
-
*/
|
|
72
|
-
templateMap?: Partial<Record<ExtractionType, string>>;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Theme this style pairs best with. Consumers (CLI, editor preview)
|
|
76
|
-
* apply it only when the doc doesn't already declare a `themeId`.
|
|
77
|
-
*/
|
|
78
|
-
suggestedThemeId?: string;
|
|
79
|
-
|
|
80
|
-
/** Optional opening/closing beats added around the transformed doc. */
|
|
81
|
-
pacing?: {
|
|
82
|
-
/** Prepend a `title` block built from the doc's title. */
|
|
83
|
-
intro?: boolean;
|
|
84
|
-
/** Append a closing beat (best unused quote/impact line, else a sectionHeader). */
|
|
85
|
-
outro?: boolean;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Duration-based slide budget (folded in from the since-removed
|
|
90
|
-
* `generateSlideshow`): caps promoted template blocks at roughly
|
|
91
|
-
* `slidesPerMinute` of doc duration (default: uncapped — only
|
|
92
|
-
* `transformRatio` applies).
|
|
93
|
-
*/
|
|
94
|
-
budget?: {
|
|
95
|
-
/** Target promoted blocks per minute of content (e.g. 5). */
|
|
96
|
-
slidesPerMinute?: number;
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** Built-in id or a call-scoped declarative style definition. */
|
|
101
|
-
export type TransformStyleInput = TransformStyleId | TransformStyleConfig;
|
|
102
|
-
|
|
103
|
-
/** Explicit caller-owned registry for custom transform styles. */
|
|
104
|
-
export interface TransformStyleRegistry {
|
|
105
|
-
register(style: TransformStyleConfig): void;
|
|
106
|
-
unregister(id: string): boolean;
|
|
107
|
-
get(id: string): TransformStyleConfig | undefined;
|
|
108
|
-
list(): TransformStyleConfig[];
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ── Transform options ────────────────────────────────────────────
|
|
112
|
-
|
|
113
|
-
/** Image metadata for image interleaving. */
|
|
114
|
-
export interface TransformImage {
|
|
115
|
-
/** Image source path or URL. */
|
|
116
|
-
src: string;
|
|
117
|
-
/** Alt text for accessibility. */
|
|
118
|
-
alt?: string;
|
|
119
|
-
/** Photo credit. */
|
|
120
|
-
credit?: string;
|
|
121
|
-
/** License identifier. */
|
|
122
|
-
license?: string;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/** Options passed to `applyTransform()`. */
|
|
126
|
-
export interface TransformOptions {
|
|
127
|
-
/** Deterministic seed. Default: hash of doc.articleId. */
|
|
128
|
-
seed?: number;
|
|
129
|
-
/** Available images for image interleaving / accent images. */
|
|
130
|
-
images?: TransformImage[];
|
|
131
|
-
/** Theme ID to embed in the output Doc. */
|
|
132
|
-
themeId?: string;
|
|
133
|
-
/** Override specific style config values. */
|
|
134
|
-
overrides?: Partial<TransformStyleConfig>;
|
|
135
|
-
/** Caller-owned registry used when `style` is an id. */
|
|
136
|
-
registry?: TransformStyleRegistry;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// ── Transform result ─────────────────────────────────────────────
|
|
140
|
-
|
|
141
|
-
/** Result of applying a transform. */
|
|
142
|
-
export interface TransformResult {
|
|
143
|
-
/** The transformed Doc. Input doc is NOT mutated. */
|
|
144
|
-
doc: Doc;
|
|
145
|
-
/** Statistics about what changed. */
|
|
146
|
-
stats: {
|
|
147
|
-
totalInputBlocks: number;
|
|
148
|
-
transformedBlocks: number;
|
|
149
|
-
insertedBlocks: number;
|
|
150
|
-
};
|
|
151
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Convenience wrapper around the version operations that captures a
|
|
3
|
-
* {@link ContentContainer} reference and an optional basename override.
|
|
4
|
-
*
|
|
5
|
-
* Hosts that prefer a stable handle (e.g. to pass into a UI component)
|
|
6
|
-
* use this; everything it does is also reachable as a free function.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { ContentContainer } from '../storage/ContentContainer.js';
|
|
10
|
-
import {
|
|
11
|
-
coalesceVersions,
|
|
12
|
-
listVersions,
|
|
13
|
-
pruneVersions,
|
|
14
|
-
readVersion,
|
|
15
|
-
revertToVersion,
|
|
16
|
-
saveVersion,
|
|
17
|
-
} from './operations.js';
|
|
18
|
-
import type {
|
|
19
|
-
CoalesceOptions,
|
|
20
|
-
PrunePolicy,
|
|
21
|
-
RevertOptions,
|
|
22
|
-
SaveVersionOptions,
|
|
23
|
-
SaveVersionResult,
|
|
24
|
-
Version,
|
|
25
|
-
} from './types.js';
|
|
26
|
-
|
|
27
|
-
export interface DocumentVersionManagerOptions {
|
|
28
|
-
/**
|
|
29
|
-
* Override the document basename used in version filenames. Defaults to
|
|
30
|
-
* the basename of `container.getDocumentPath()` resolved at call time.
|
|
31
|
-
*/
|
|
32
|
-
basename?: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class DocumentVersionManager {
|
|
36
|
-
private readonly container: ContentContainer;
|
|
37
|
-
private readonly basename: string | undefined;
|
|
38
|
-
|
|
39
|
-
constructor(container: ContentContainer, options: DocumentVersionManagerOptions = {}) {
|
|
40
|
-
this.container = container;
|
|
41
|
-
this.basename = options.basename;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
saveVersion(options: SaveVersionOptions = {}): Promise<SaveVersionResult> {
|
|
45
|
-
return saveVersion(this.container, { basename: this.basename, ...options });
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
listVersions(): Promise<Version[]> {
|
|
49
|
-
return listVersions(this.container, this.basename);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
readVersion(version: Version | string): Promise<string | null> {
|
|
53
|
-
return readVersion(this.container, version);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
revertToVersion(
|
|
57
|
-
version: Version | string,
|
|
58
|
-
options?: RevertOptions,
|
|
59
|
-
): Promise<{ reverted: boolean; snapshotted: Version | null }> {
|
|
60
|
-
return revertToVersion(this.container, version, options);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
pruneVersions(policy: PrunePolicy): Promise<Version[]> {
|
|
64
|
-
return pruneVersions(this.container, policy, this.basename);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
coalesceVersions(options?: CoalesceOptions): Promise<Version[]> {
|
|
68
|
-
return coalesceVersions(this.container, options, this.basename);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Keep version snapshots out of Git when a ContentContainer is persisted
|
|
3
|
-
* as a real folder (typically a `<basename>_files/` sidecar).
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { ContentContainer } from '../storage/ContentContainer.js';
|
|
7
|
-
|
|
8
|
-
const decoder = new TextDecoder();
|
|
9
|
-
const encoder = new TextEncoder();
|
|
10
|
-
|
|
11
|
-
const GITIGNORE_PATH = '.gitignore';
|
|
12
|
-
const VERSIONS_IGNORE_RULE = '.versions/';
|
|
13
|
-
const EQUIVALENT_VERSIONS_RULE = /^(!?)\/?\.versions\/?$/;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Ensure the container-root `.gitignore` ignores its `.versions/` folder.
|
|
17
|
-
* Existing rules and newline style are preserved.
|
|
18
|
-
*/
|
|
19
|
-
export async function ensureVersionsGitIgnored(container: ContentContainer): Promise<void> {
|
|
20
|
-
const data = await container.readFile(GITIGNORE_PATH);
|
|
21
|
-
const existing = data ? decoder.decode(data) : '';
|
|
22
|
-
|
|
23
|
-
let alreadyIgnored = false;
|
|
24
|
-
for (const line of existing.split(/\r?\n/)) {
|
|
25
|
-
const match = EQUIVALENT_VERSIONS_RULE.exec(line.trim());
|
|
26
|
-
if (match) alreadyIgnored = match[1] !== '!';
|
|
27
|
-
}
|
|
28
|
-
if (alreadyIgnored) return;
|
|
29
|
-
|
|
30
|
-
const newline = existing.includes('\r\n') ? '\r\n' : '\n';
|
|
31
|
-
const separator = existing.length > 0 && !existing.endsWith('\n') ? newline : '';
|
|
32
|
-
const next = `${existing}${separator}${VERSIONS_IGNORE_RULE}${newline}`;
|
|
33
|
-
await container.writeFile(GITIGNORE_PATH, encoder.encode(next), 'text/plain');
|
|
34
|
-
}
|
package/src/versions/index.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Document version history for Squisq.
|
|
3
|
-
*
|
|
4
|
-
* Snapshots of the primary markdown document live inside the same
|
|
5
|
-
* {@link ContentContainer} at `.versions/<basename>.<timestamp>.md`.
|
|
6
|
-
* When a snapshot is retained, the container root also gets a `.gitignore`
|
|
7
|
-
* rule for `.versions/`, preserving any existing ignore rules.
|
|
8
|
-
* Hosts call {@link DocumentVersionManager.saveVersion} (or the
|
|
9
|
-
* underlying {@link saveVersion}) when they want to stamp a new version;
|
|
10
|
-
* the editor's auto-save effect calls it on idle. Either way, snapshots
|
|
11
|
-
* are written only when the document differs from the latest one.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```ts
|
|
15
|
-
* import { DocumentVersionManager } from '@bendyline/squisq/versions';
|
|
16
|
-
*
|
|
17
|
-
* const versioning = new DocumentVersionManager(container);
|
|
18
|
-
* const result = await versioning.saveVersion();
|
|
19
|
-
* if (result.saved) console.log('Stamped', result.version);
|
|
20
|
-
*
|
|
21
|
-
* const history = await versioning.listVersions();
|
|
22
|
-
* await versioning.revertToVersion(history[0]);
|
|
23
|
-
* await versioning.pruneVersions({ type: 'keep-last-n', n: 50 });
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
export type {
|
|
28
|
-
Version,
|
|
29
|
-
SaveVersionOptions,
|
|
30
|
-
SaveVersionResult,
|
|
31
|
-
PrunePolicy,
|
|
32
|
-
RevertOptions,
|
|
33
|
-
CoalesceOptions,
|
|
34
|
-
} from './types.js';
|
|
35
|
-
|
|
36
|
-
export {
|
|
37
|
-
saveVersion,
|
|
38
|
-
listVersions,
|
|
39
|
-
readVersion,
|
|
40
|
-
revertToVersion,
|
|
41
|
-
pruneVersions,
|
|
42
|
-
coalesceVersions,
|
|
43
|
-
} from './operations.js';
|
|
44
|
-
|
|
45
|
-
export {
|
|
46
|
-
DocumentVersionManager,
|
|
47
|
-
type DocumentVersionManagerOptions,
|
|
48
|
-
} from './DocumentVersionManager.js';
|
|
49
|
-
|
|
50
|
-
export {
|
|
51
|
-
formatVersionTimestamp,
|
|
52
|
-
parseVersionTimestamp,
|
|
53
|
-
VERSION_TIMESTAMP_PATTERN,
|
|
54
|
-
} from './timestamp.js';
|
|
55
|
-
|
|
56
|
-
export { VERSIONS_PREFIX, getDocBasename, buildVersionPath, parseVersionPath } from './paths.js';
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure-ish version operations against a {@link ContentContainer}.
|
|
3
|
-
*
|
|
4
|
-
* These functions are the canonical implementation. {@link DocumentVersionManager}
|
|
5
|
-
* is a thin wrapper that captures a container reference for ergonomics.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { ContentContainer } from '../storage/ContentContainer.js';
|
|
9
|
-
import { DOCUMENT_VERSION_PATHS, getDocBasename } from './paths.js';
|
|
10
|
-
import {
|
|
11
|
-
coalesceSnapshots,
|
|
12
|
-
listSnapshots,
|
|
13
|
-
pruneSnapshots,
|
|
14
|
-
readTextSnapshot,
|
|
15
|
-
saveTextSnapshot,
|
|
16
|
-
} from './snapshotStore.js';
|
|
17
|
-
import type {
|
|
18
|
-
CoalesceOptions,
|
|
19
|
-
PrunePolicy,
|
|
20
|
-
RevertOptions,
|
|
21
|
-
SaveVersionOptions,
|
|
22
|
-
SaveVersionResult,
|
|
23
|
-
Version,
|
|
24
|
-
} from './types.js';
|
|
25
|
-
|
|
26
|
-
async function resolveBasename(
|
|
27
|
-
container: ContentContainer,
|
|
28
|
-
override: string | undefined,
|
|
29
|
-
): Promise<string | null> {
|
|
30
|
-
if (override) return override;
|
|
31
|
-
const docPath = await container.getDocumentPath();
|
|
32
|
-
if (!docPath) return null;
|
|
33
|
-
return getDocBasename(docPath);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async function resolveDocPath(container: ContentContainer): Promise<string> {
|
|
37
|
-
// Default to `index.md` when the container has no document yet — matches
|
|
38
|
-
// `MemoryContentContainer.writeDocument`'s default.
|
|
39
|
-
const docPath = await container.getDocumentPath();
|
|
40
|
-
return docPath ?? 'index.md';
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* List all snapshots in the container, newest-first.
|
|
45
|
-
*
|
|
46
|
-
* @param basename Optional filter: when set, only versions whose basename
|
|
47
|
-
* matches are returned.
|
|
48
|
-
*/
|
|
49
|
-
export async function listVersions(
|
|
50
|
-
container: ContentContainer,
|
|
51
|
-
basename?: string,
|
|
52
|
-
): Promise<Version[]> {
|
|
53
|
-
return listSnapshots(container, DOCUMENT_VERSION_PATHS, basename);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Read the markdown content of a snapshot. Returns null if the snapshot
|
|
58
|
-
* doesn't exist.
|
|
59
|
-
*/
|
|
60
|
-
export async function readVersion(
|
|
61
|
-
container: ContentContainer,
|
|
62
|
-
version: Version | string,
|
|
63
|
-
): Promise<string | null> {
|
|
64
|
-
return readTextSnapshot(container, version);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Save a new snapshot of the document if its content differs from the
|
|
69
|
-
* latest existing snapshot.
|
|
70
|
-
*/
|
|
71
|
-
export async function saveVersion(
|
|
72
|
-
container: ContentContainer,
|
|
73
|
-
options: SaveVersionOptions = {},
|
|
74
|
-
): Promise<SaveVersionResult> {
|
|
75
|
-
const content = options.content ?? (await container.readDocument());
|
|
76
|
-
if (content === null || content === undefined) {
|
|
77
|
-
return { saved: false, version: null, reason: 'no-document' };
|
|
78
|
-
}
|
|
79
|
-
if (content.length === 0) {
|
|
80
|
-
return { saved: false, version: null, reason: 'empty' };
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const basename = await resolveBasename(container, options.basename);
|
|
84
|
-
if (!basename) {
|
|
85
|
-
return { saved: false, version: null, reason: 'no-document' };
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return saveTextSnapshot(container, DOCUMENT_VERSION_PATHS, {
|
|
89
|
-
content,
|
|
90
|
-
basename,
|
|
91
|
-
mimeType: 'text/markdown',
|
|
92
|
-
now: options.now,
|
|
93
|
-
force: options.force,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Revert the document to a prior snapshot. By default, the *current*
|
|
99
|
-
* document is snapshotted first so the revert is itself recoverable.
|
|
100
|
-
*/
|
|
101
|
-
export async function revertToVersion(
|
|
102
|
-
container: ContentContainer,
|
|
103
|
-
version: Version | string,
|
|
104
|
-
options: RevertOptions = {},
|
|
105
|
-
): Promise<{ reverted: boolean; snapshotted: Version | null }> {
|
|
106
|
-
const content = await readVersion(container, version);
|
|
107
|
-
if (content === null) {
|
|
108
|
-
return { reverted: false, snapshotted: null };
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
let snapshotted: Version | null = null;
|
|
112
|
-
if (options.snapshotCurrent !== false) {
|
|
113
|
-
const result = await saveVersion(container);
|
|
114
|
-
snapshotted = result.version;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const docPath = await resolveDocPath(container);
|
|
118
|
-
await container.writeDocument(content, docPath);
|
|
119
|
-
return { reverted: true, snapshotted };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Delete snapshots that don't satisfy the policy. Returns the deleted
|
|
124
|
-
* versions in their original (newest-first) order.
|
|
125
|
-
*/
|
|
126
|
-
export async function pruneVersions(
|
|
127
|
-
container: ContentContainer,
|
|
128
|
-
policy: PrunePolicy,
|
|
129
|
-
basename?: string,
|
|
130
|
-
): Promise<Version[]> {
|
|
131
|
-
return pruneSnapshots(container, DOCUMENT_VERSION_PATHS, policy, basename);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Collapse adjacent snapshots that occurred close together — keeping the
|
|
136
|
-
* newer one — to keep history readable across rapid edits.
|
|
137
|
-
*/
|
|
138
|
-
export async function coalesceVersions(
|
|
139
|
-
container: ContentContainer,
|
|
140
|
-
options: CoalesceOptions = {},
|
|
141
|
-
basename?: string,
|
|
142
|
-
): Promise<Version[]> {
|
|
143
|
-
return coalesceSnapshots(container, DOCUMENT_VERSION_PATHS, options, basename);
|
|
144
|
-
}
|
package/src/versions/paths.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Path conventions for version snapshots.
|
|
3
|
-
*
|
|
4
|
-
* Snapshots live at `<VERSIONS_PREFIX><basename>.<timestamp>[<-suffix>].md`.
|
|
5
|
-
* The optional numeric suffix (`-2`, `-3`, ...) is appended only when two
|
|
6
|
-
* snapshots collide on the same UTC second.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
buildSnapshotPath,
|
|
11
|
-
parseSnapshotPath,
|
|
12
|
-
type SnapshotPathStrategy,
|
|
13
|
-
} from './snapshotStore.js';
|
|
14
|
-
|
|
15
|
-
/** Subfolder (inside the ContentContainer) that holds version snapshots. */
|
|
16
|
-
export const VERSIONS_PREFIX = '.versions/';
|
|
17
|
-
|
|
18
|
-
/** Internal strategy shared with the generic snapshot store. */
|
|
19
|
-
export const DOCUMENT_VERSION_PATHS: SnapshotPathStrategy = Object.freeze({
|
|
20
|
-
prefix: VERSIONS_PREFIX,
|
|
21
|
-
extension: 'md',
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Strip the directory and extension from a document path to produce the
|
|
26
|
-
* basename used in version filenames. `subdir/index.md` -> `index`.
|
|
27
|
-
*/
|
|
28
|
-
export function getDocBasename(documentPath: string): string {
|
|
29
|
-
const slash = documentPath.lastIndexOf('/');
|
|
30
|
-
const file = slash >= 0 ? documentPath.slice(slash + 1) : documentPath;
|
|
31
|
-
const dot = file.lastIndexOf('.');
|
|
32
|
-
return dot > 0 ? file.slice(0, dot) : file;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Build a version snapshot path. Optionally append a collision suffix
|
|
37
|
-
* (e.g. `2`, `3`) when two saves land on the same UTC second.
|
|
38
|
-
*/
|
|
39
|
-
export function buildVersionPath(basename: string, date: Date, collision = 0): string {
|
|
40
|
-
return buildSnapshotPath(DOCUMENT_VERSION_PATHS, basename, date, collision);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Parse a version snapshot path. Returns null if it doesn't match the
|
|
45
|
-
* convention (so unrelated files stored under `.versions/` are ignored).
|
|
46
|
-
*/
|
|
47
|
-
export function parseVersionPath(
|
|
48
|
-
path: string,
|
|
49
|
-
): { basename: string; timestamp: Date; collision: number } | null {
|
|
50
|
-
return parseSnapshotPath(DOCUMENT_VERSION_PATHS, path);
|
|
51
|
-
}
|