@peaske7/readit 0.3.0-rc.0 → 0.3.0-rc.1
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/dist/.vite/manifest.json +1111 -0
- package/dist/assets/_basePickBy-BMMA4Tou.js +1 -0
- package/dist/assets/_baseUniq-D40qku1I.js +1 -0
- package/dist/assets/arc-Ckg65iy8.js +1 -0
- package/dist/assets/architecture-YZFGNWBL-Dv3EY0zV.js +1 -0
- package/dist/assets/architectureDiagram-Q4EWVU46-ClRss4cm.js +36 -0
- package/dist/assets/array-Bjz-wYpJ.js +1 -0
- package/dist/assets/blockDiagram-DXYQGD6D-CBcFvoK1.js +132 -0
- package/dist/assets/c4Diagram-AHTNJAMY-D4d3ZLam.js +10 -0
- package/dist/assets/channel-D9EJxDy_.js +1 -0
- package/dist/assets/chunk-2KRD3SAO-DaFfaCGO.js +1 -0
- package/dist/assets/chunk-336JU56O-yLEQoF0v.js +2 -0
- package/dist/assets/chunk-426QAEUC-Uyzd4wAA.js +1 -0
- package/dist/assets/chunk-4BX2VUAB-DRuTD7x5.js +1 -0
- package/dist/assets/chunk-4TB4RGXK-3xbpIi_o.js +206 -0
- package/dist/assets/chunk-55IACEB6-BExiaAoD.js +1 -0
- package/dist/assets/chunk-5FUZZQ4R-DatVvHnF.js +62 -0
- package/dist/assets/chunk-5PVQY5BW-BKgvrGh8.js +2 -0
- package/dist/assets/chunk-67CJDMHE-DMt8LNEX.js +1 -0
- package/dist/assets/chunk-7N4EOEYR-CzLGefVf.js +1 -0
- package/dist/assets/chunk-AA7GKIK3-B6GFAk4U.js +1 -0
- package/dist/assets/chunk-BSJP7CBP-BK29yehL.js +1 -0
- package/dist/assets/chunk-CIAEETIT-D7hBXImP.js +1 -0
- package/dist/assets/chunk-Dlc7tRH4.js +1 -0
- package/dist/assets/chunk-EDXVE4YY-PYJdlmyH.js +1 -0
- package/dist/assets/chunk-ENJZ2VHE-DUHKBv6x.js +10 -0
- package/dist/assets/chunk-FMBD7UC4-2FWyCCAV.js +15 -0
- package/dist/assets/chunk-FOC6F5B3-DKFHrt4K.js +1 -0
- package/dist/assets/chunk-ICPOFSXX-Bh__D0ec.js +122 -0
- package/dist/assets/chunk-K5T4RW27-D51O7IkG.js +94 -0
- package/dist/assets/chunk-KGLVRYIC-DMHSCH4T.js +1 -0
- package/dist/assets/chunk-LIHQZDEY-C2aANxt9.js +1 -0
- package/dist/assets/chunk-ORNJ4GCN-Db_37NRX.js +1 -0
- package/dist/assets/chunk-OYMX7WX6-BltXOJLJ.js +231 -0
- package/dist/assets/chunk-QZHKN3VN-8Lcg9gti.js +1 -0
- package/dist/assets/chunk-U2HBQHQK-ByS6tilY.js +70 -0
- package/dist/assets/chunk-X2U36JSP-Bm-4Gqg_.js +1 -0
- package/dist/assets/chunk-XPW4576I-Bqbompq4.js +32 -0
- package/dist/assets/chunk-YZCP3GAM-CsC0imPb.js +1 -0
- package/dist/assets/chunk-ZZ45TVLE-CG-CqfPC.js +1 -0
- package/dist/assets/classDiagram-6PBFFD2Q-Jy1uFUk4.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-ChiLl3rR.js +1 -0
- package/dist/assets/clone-BBjvuERA.js +1 -0
- package/dist/assets/cose-bilkent-S5V4N54A-q90QeGKv.js +1 -0
- package/dist/assets/cytoscape.esm-BfXff3fb.js +321 -0
- package/dist/assets/dagre-KV5264BT-BQWiLFJB.js +4 -0
- package/dist/assets/dagre-nn_aIZ2E.js +1 -0
- package/dist/assets/defaultLocale-BwmRmqJp.js +1 -0
- package/dist/assets/diagram-5BDNPKRD-CJa7Y97H.js +10 -0
- package/dist/assets/diagram-G4DWMVQ6-tVQGBWfY.js +24 -0
- package/dist/assets/diagram-MMDJMWI5-CpimFldm.js +43 -0
- package/dist/assets/diagram-TYMM5635-D11WQVgy.js +24 -0
- package/dist/assets/dist-BNz65Ibc.js +1 -0
- package/dist/assets/erDiagram-SMLLAGMA-C2bLd0jS.js +85 -0
- package/dist/assets/flowDiagram-DWJPFMVM-Kw3fOOLT.js +162 -0
- package/dist/assets/ganttDiagram-T4ZO3ILL-fyMhyE2X.js +292 -0
- package/dist/assets/gitGraph-7Q5UKJZL-BGFRt2qs.js +1 -0
- package/dist/assets/gitGraphDiagram-UUTBAWPF-D4JoiOvg.js +106 -0
- package/dist/assets/graphlib-DGcD9J2L.js +1 -0
- package/dist/assets/index-Cow3qpoq.css +2 -0
- package/dist/assets/index-DUf7okYi.js +14 -0
- package/dist/assets/info-OMHHGYJF-DI6-Z9vh.js +1 -0
- package/dist/assets/infoDiagram-42DDH7IO-D1ZkeMBy.js +2 -0
- package/dist/assets/init-TPm5RB77.js +1 -0
- package/dist/assets/isArrayLikeObject-69BLnVNM.js +1 -0
- package/dist/assets/isEmpty-DUS28g5f.js +1 -0
- package/dist/assets/ishikawaDiagram-UXIWVN3A-Dv8hzjZB.js +70 -0
- package/dist/assets/journeyDiagram-VCZTEJTY-COeB7F5r.js +139 -0
- package/dist/assets/kanban-definition-6JOO6SKY-BbYmxCYU.js +89 -0
- package/dist/assets/katex-5SGEXwpi.js +261 -0
- package/dist/assets/line-_v2NGEdn.js +1 -0
- package/dist/assets/linear-CXMqTN8N.js +1 -0
- package/dist/assets/mermaid-config-C8a4L22x.js +1 -0
- package/dist/assets/mermaid-parser.core-CFmphzPP.js +4 -0
- package/dist/assets/mermaid.core-DnHAupTp.js +11 -0
- package/dist/assets/mindmap-definition-QFDTVHPH-D7_lIep7.js +96 -0
- package/dist/assets/ordinal-D7l-8DAO.js +1 -0
- package/dist/assets/packet-4T2RLAQJ-DidW3JFc.js +1 -0
- package/dist/assets/path-BVpCanzE.js +1 -0
- package/dist/assets/pie-ZZUOXDRM-Bff2e5hg.js +1 -0
- package/dist/assets/pieDiagram-DEJITSTG-DDvYHCT_.js +30 -0
- package/dist/assets/quadrantDiagram-34T5L4WZ-DcLcIrdi.js +7 -0
- package/dist/assets/radar-PYXPWWZC-CsdZBH3M.js +1 -0
- package/dist/assets/requirementDiagram-MS252O5E-DLX6ld7D.js +84 -0
- package/dist/assets/rough.esm-BoTisKeL.js +1 -0
- package/dist/assets/sankeyDiagram-XADWPNL6-D-1GtsHM.js +10 -0
- package/dist/assets/sequenceDiagram-FGHM5R23-Bwxs0YQg.js +157 -0
- package/dist/assets/src-CrmkjRpa.js +1 -0
- package/dist/assets/stateDiagram-FHFEXIEX-DW7rOcnQ.js +1 -0
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-Jm-24vQ2.js +1 -0
- package/dist/assets/timeline-definition-GMOUNBTQ-DVdHyzxS.js +120 -0
- package/dist/assets/treeView-SZITEDCU-DPKseaET.js +1 -0
- package/dist/assets/treemap-W4RFUUIX-DH-7GZe_.js +1 -0
- package/dist/assets/vennDiagram-DHZGUBPP-DJaC6xmI.js +34 -0
- package/dist/assets/wardley-RL74JXVD-AgyXyBN5.js +1 -0
- package/dist/assets/wardleyDiagram-NUSXRM2D-CTKERPKv.js +20 -0
- package/dist/assets/xychartDiagram-5P7HB3ND-BuExiLXc.js +7 -0
- package/{index.html → dist/index.html} +2 -1
- package/dist/index.js +2539 -0
- package/package.json +11 -1
- package/.agents/skills/remotion-best-practices/SKILL.md +0 -61
- package/.agents/skills/remotion-best-practices/rules/3d.md +0 -86
- package/.agents/skills/remotion-best-practices/rules/animations.md +0 -27
- package/.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +0 -178
- package/.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +0 -100
- package/.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +0 -108
- package/.agents/skills/remotion-best-practices/rules/assets.md +0 -78
- package/.agents/skills/remotion-best-practices/rules/audio-visualization.md +0 -198
- package/.agents/skills/remotion-best-practices/rules/audio.md +0 -169
- package/.agents/skills/remotion-best-practices/rules/calculate-metadata.md +0 -134
- package/.agents/skills/remotion-best-practices/rules/can-decode.md +0 -75
- package/.agents/skills/remotion-best-practices/rules/charts.md +0 -120
- package/.agents/skills/remotion-best-practices/rules/compositions.md +0 -154
- package/.agents/skills/remotion-best-practices/rules/display-captions.md +0 -184
- package/.agents/skills/remotion-best-practices/rules/extract-frames.md +0 -229
- package/.agents/skills/remotion-best-practices/rules/ffmpeg.md +0 -38
- package/.agents/skills/remotion-best-practices/rules/fonts.md +0 -152
- package/.agents/skills/remotion-best-practices/rules/get-audio-duration.md +0 -58
- package/.agents/skills/remotion-best-practices/rules/get-video-dimensions.md +0 -68
- package/.agents/skills/remotion-best-practices/rules/get-video-duration.md +0 -60
- package/.agents/skills/remotion-best-practices/rules/gifs.md +0 -141
- package/.agents/skills/remotion-best-practices/rules/images.md +0 -134
- package/.agents/skills/remotion-best-practices/rules/import-srt-captions.md +0 -69
- package/.agents/skills/remotion-best-practices/rules/light-leaks.md +0 -73
- package/.agents/skills/remotion-best-practices/rules/lottie.md +0 -70
- package/.agents/skills/remotion-best-practices/rules/maps.md +0 -412
- package/.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.md +0 -34
- package/.agents/skills/remotion-best-practices/rules/measuring-text.md +0 -140
- package/.agents/skills/remotion-best-practices/rules/parameters.md +0 -109
- package/.agents/skills/remotion-best-practices/rules/sequencing.md +0 -118
- package/.agents/skills/remotion-best-practices/rules/sfx.md +0 -26
- package/.agents/skills/remotion-best-practices/rules/subtitles.md +0 -36
- package/.agents/skills/remotion-best-practices/rules/tailwind.md +0 -11
- package/.agents/skills/remotion-best-practices/rules/text-animations.md +0 -20
- package/.agents/skills/remotion-best-practices/rules/timing.md +0 -179
- package/.agents/skills/remotion-best-practices/rules/transcribe-captions.md +0 -70
- package/.agents/skills/remotion-best-practices/rules/transitions.md +0 -197
- package/.agents/skills/remotion-best-practices/rules/transparent-videos.md +0 -106
- package/.agents/skills/remotion-best-practices/rules/trimming.md +0 -51
- package/.agents/skills/remotion-best-practices/rules/videos.md +0 -171
- package/.agents/skills/remotion-best-practices/rules/voiceover.md +0 -99
- package/.agents/skills/simple/SKILL.md +0 -52
- package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -3254
- package/.agents/skills/vercel-react-best-practices/README.md +0 -123
- package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -141
- package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
- package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
- package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
- package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
- package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
- package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
- package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
- package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
- package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
- package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
- package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
- package/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
- package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
- package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
- package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
- package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
- package/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
- package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
- package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
- package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
- package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
- package/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
- package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
- package/.claude/CLAUDE.md +0 -184
- package/.claude/commands/review.md +0 -120
- package/.claude/commands/sync-docs.md +0 -71
- package/.claude/roadmap.md +0 -121
- package/.claude/rules/style-guide.md +0 -830
- package/.claude/settings.json +0 -18
- package/.claude/user-stories.md +0 -333
- package/AGENTS.md +0 -68
- package/Makefile +0 -32
- package/biome.json +0 -79
- package/bun.lock +0 -854
- package/bunfig.toml +0 -2
- package/docs/design.md +0 -563
- package/docs/perf-baseline.md +0 -130
- package/docs/plans/2026-03-13-client-mode-design.md +0 -86
- package/docs/plans/2026-03-13-client-mode-plan.md +0 -605
- package/docs/plans/2026-03-13-keyboard-shortcuts-design.md +0 -129
- package/docs/plans/2026-03-13-keyboard-shortcuts-plan.md +0 -1471
- package/docs/plans/2026-03-13-multi-document-design.md +0 -183
- package/docs/plans/2026-03-13-performance-benchmarks-design.md +0 -121
- package/docs/superpowers/plans/2026-03-26-surgical-pruning.md +0 -1176
- package/docs/superpowers/specs/2026-03-27-go-server-rewrite-design.md +0 -284
- package/e2e/comments.spec.ts +0 -81
- package/e2e/document-load.spec.ts +0 -32
- package/e2e/export.spec.ts +0 -58
- package/e2e/fixtures/sample.md +0 -7
- package/e2e/perf/add-comment.spec.ts +0 -116
- package/e2e/perf/fixtures/generate.ts +0 -327
- package/e2e/perf/initial-load.spec.ts +0 -49
- package/e2e/perf/perf.setup.ts +0 -23
- package/e2e/perf/perf.teardown.ts +0 -9
- package/e2e/perf/screenshot-final.png +0 -0
- package/e2e/perf/scroll.spec.ts +0 -39
- package/e2e/perf/tab-switch.spec.ts +0 -69
- package/e2e/perf/text-selection.spec.ts +0 -119
- package/e2e/perf/utils/metrics.ts +0 -350
- package/e2e/perf/utils/perf-cli.ts +0 -86
- package/e2e/persistence-file.spec.ts +0 -357
- package/e2e/utils/cli.ts +0 -84
- package/e2e/utils/selection.ts +0 -79
- package/go/cmd/readit/main.go +0 -416
- package/go/go.mod +0 -20
- package/go/go.sum +0 -41
- package/go/internal/server/anchor.go +0 -302
- package/go/internal/server/anchor_test.go +0 -111
- package/go/internal/server/comments.go +0 -390
- package/go/internal/server/documents.go +0 -113
- package/go/internal/server/embed.go +0 -17
- package/go/internal/server/headings.go +0 -33
- package/go/internal/server/headings_test.go +0 -75
- package/go/internal/server/htmltext.go +0 -123
- package/go/internal/server/markdown.go +0 -157
- package/go/internal/server/markdown_bench_test.go +0 -42
- package/go/internal/server/markdown_test.go +0 -79
- package/go/internal/server/server.go +0 -453
- package/go/internal/server/server_bench_test.go +0 -122
- package/go/internal/server/settings.go +0 -110
- package/go/internal/server/sse.go +0 -140
- package/go/internal/server/storage.go +0 -275
- package/go/internal/server/storage_test.go +0 -152
- package/go/internal/server/template.go +0 -66
- package/go/internal/server/types.go +0 -101
- package/go/internal/server/watcher.go +0 -74
- package/lefthook.yml +0 -8
- package/nvim-readit/lua/readit/health.lua +0 -64
- package/nvim-readit/lua/readit/init.lua +0 -463
- package/nvim-readit/plugin/readit.lua +0 -19
- package/playwright.config.ts +0 -34
- package/skills-lock.json +0 -20
- package/src/App.svelte +0 -890
- package/src/cli.ts +0 -881
- package/src/components/ActionsMenu.svelte +0 -95
- package/src/components/CommentBadge.svelte +0 -67
- package/src/components/CommentErrorBanner.svelte +0 -33
- package/src/components/CommentInput.svelte +0 -75
- package/src/components/CommentListItem.svelte +0 -95
- package/src/components/CommentManager.svelte +0 -129
- package/src/components/CommentNav.svelte +0 -109
- package/src/components/DocumentViewer.svelte +0 -233
- package/src/components/FloatingComment.svelte +0 -107
- package/src/components/Header.svelte +0 -76
- package/src/components/InlineEditor.svelte +0 -72
- package/src/components/MarginNote.svelte +0 -167
- package/src/components/MarginNotesContainer.svelte +0 -33
- package/src/components/MermaidEnhancer.svelte +0 -218
- package/src/components/MermaidModal.svelte +0 -67
- package/src/components/RawModal.svelte +0 -126
- package/src/components/ReanchorConfirm.svelte +0 -30
- package/src/components/SettingsModal.svelte +0 -220
- package/src/components/ShortcutCapture.svelte +0 -82
- package/src/components/ShortcutList.svelte +0 -145
- package/src/components/TabBar.svelte +0 -52
- package/src/components/TableOfContents.svelte +0 -125
- package/src/components/ui/ActionLink.svelte +0 -40
- package/src/components/ui/Button.svelte +0 -53
- package/src/components/ui/Dialog.svelte +0 -97
- package/src/components/ui/DropdownMenu.svelte +0 -85
- package/src/components/ui/DropdownMenuItem.svelte +0 -38
- package/src/components/ui/DropdownMenuSeparator.svelte +0 -11
- package/src/components/ui/Text.svelte +0 -42
- package/src/env.d.ts +0 -6
- package/src/index.css +0 -859
- package/src/lib/__fixtures__/bench-data.ts +0 -114
- package/src/lib/anchor.bench.ts +0 -91
- package/src/lib/anchor.test.ts +0 -527
- package/src/lib/anchor.ts +0 -381
- package/src/lib/comment-storage.bench.ts +0 -49
- package/src/lib/comment-storage.test.ts +0 -694
- package/src/lib/comment-storage.ts +0 -226
- package/src/lib/export.bench.ts +0 -21
- package/src/lib/export.ts +0 -36
- package/src/lib/fetch-or-throw.test.ts +0 -59
- package/src/lib/fetch-or-throw.ts +0 -12
- package/src/lib/headings.test.ts +0 -103
- package/src/lib/headings.ts +0 -44
- package/src/lib/highlight/core.test.ts +0 -93
- package/src/lib/highlight/dom.ts +0 -187
- package/src/lib/highlight/highlight-registry.ts +0 -221
- package/src/lib/highlight/highlight.bench.ts +0 -92
- package/src/lib/highlight/highlighter.ts +0 -247
- package/src/lib/highlight/resolver.ts +0 -38
- package/src/lib/highlight/types.ts +0 -17
- package/src/lib/html-text.test.ts +0 -162
- package/src/lib/html-text.ts +0 -161
- package/src/lib/i18n/en.ts +0 -124
- package/src/lib/i18n/index.ts +0 -3
- package/src/lib/i18n/ja.ts +0 -126
- package/src/lib/i18n/translations.ts +0 -27
- package/src/lib/i18n/types.ts +0 -130
- package/src/lib/key-lock.test.ts +0 -104
- package/src/lib/key-lock.ts +0 -23
- package/src/lib/margin-layout.bench.ts +0 -61
- package/src/lib/margin-layout.ts +0 -71
- package/src/lib/markdown-renderer.test.ts +0 -154
- package/src/lib/markdown-renderer.ts +0 -178
- package/src/lib/mermaid-config.ts +0 -38
- package/src/lib/mermaid-renderer.ts +0 -162
- package/src/lib/mermaid-worker.ts +0 -60
- package/src/lib/positions.ts +0 -157
- package/src/lib/shortcut-registry.ts +0 -244
- package/src/lib/utils.ts +0 -15
- package/src/main.ts +0 -16
- package/src/schema.ts +0 -92
- package/src/server.ts +0 -1216
- package/src/stores/app.svelte.ts +0 -231
- package/src/stores/locale.svelte.ts +0 -46
- package/src/stores/settings.svelte.ts +0 -90
- package/src/stores/shortcuts.svelte.ts +0 -104
- package/src/stores/ui.svelte.ts +0 -12
- package/src/template.ts +0 -104
- package/src/test-setup.ts +0 -48
- package/svelte.config.js +0 -5
- package/test.md +0 -74
- package/tsconfig.cli.json +0 -12
- package/tsconfig.json +0 -20
- package/vite.config.ts +0 -47
- package/vitest.config.ts +0 -15
- package/vscode-readit/.mcp.json +0 -7
- package/vscode-readit/.vscodeignore +0 -7
- package/vscode-readit/bun.lock +0 -78
- package/vscode-readit/icon.svg +0 -10
- package/vscode-readit/package.json +0 -110
- package/vscode-readit/src/extension.ts +0 -117
- package/vscode-readit/src/server-manager.ts +0 -272
- package/vscode-readit/src/webview-provider.ts +0 -204
- package/vscode-readit/tsconfig.json +0 -20
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import { type ChildProcess, spawn } from "node:child_process";
|
|
2
|
-
import * as net from "node:net";
|
|
3
|
-
import * as vscode from "vscode";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Manages the lifecycle of a readit Bun server process.
|
|
7
|
-
*
|
|
8
|
-
* Spawns `bun dist/index.js <file> --no-open --port <port>` as a child process.
|
|
9
|
-
* Subsequent files are attached via POST /api/documents to the running server.
|
|
10
|
-
* The server is killed when the extension deactivates or the last panel closes.
|
|
11
|
-
*/
|
|
12
|
-
export class ServerManager implements vscode.Disposable {
|
|
13
|
-
private process: ChildProcess | null = null;
|
|
14
|
-
private port: number | null = null;
|
|
15
|
-
private outputChannel: vscode.OutputChannel;
|
|
16
|
-
private startPromise: Promise<number> | null = null;
|
|
17
|
-
|
|
18
|
-
constructor(outputChannel: vscode.OutputChannel) {
|
|
19
|
-
this.outputChannel = outputChannel;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** Returns the port of the running server, or null if not started. */
|
|
23
|
-
getPort(): number | null {
|
|
24
|
-
return this.port;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Returns the base URL of the running server. */
|
|
28
|
-
getBaseUrl(): string | null {
|
|
29
|
-
if (this.port === null) return null;
|
|
30
|
-
return `http://127.0.0.1:${this.port}`;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** True if the server process is running. */
|
|
34
|
-
isRunning(): boolean {
|
|
35
|
-
return this.process !== null && this.process.exitCode === null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Ensures the server is running and the given file is loaded.
|
|
40
|
-
* If the server is not started, spawns it with the file.
|
|
41
|
-
* If already running, attaches the file via the HTTP API.
|
|
42
|
-
* Returns the port number.
|
|
43
|
-
*/
|
|
44
|
-
async ensureRunning(
|
|
45
|
-
filePath: string,
|
|
46
|
-
readitDistDir: string,
|
|
47
|
-
): Promise<number> {
|
|
48
|
-
if (this.startPromise) {
|
|
49
|
-
const port = await this.startPromise;
|
|
50
|
-
await this.attachFile(filePath);
|
|
51
|
-
return port;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (this.isRunning() && this.port !== null) {
|
|
55
|
-
await this.attachFile(filePath);
|
|
56
|
-
return this.port;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return this.start(filePath, readitDistDir);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Starts the Bun server process.
|
|
64
|
-
* Resolves with the port once the server is healthy.
|
|
65
|
-
*/
|
|
66
|
-
private start(filePath: string, readitDistDir: string): Promise<number> {
|
|
67
|
-
this.startPromise = this.doStart(filePath, readitDistDir);
|
|
68
|
-
return this.startPromise;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
private async doStart(
|
|
72
|
-
filePath: string,
|
|
73
|
-
readitDistDir: string,
|
|
74
|
-
): Promise<number> {
|
|
75
|
-
const config = vscode.workspace.getConfiguration("readit");
|
|
76
|
-
const bunPath = config.get<string>("bunPath", "bun");
|
|
77
|
-
const configPort = config.get<number>("serverPort", 0);
|
|
78
|
-
|
|
79
|
-
const port = configPort > 0 ? configPort : await findFreePort();
|
|
80
|
-
|
|
81
|
-
const cliEntry = vscode.Uri.joinPath(
|
|
82
|
-
vscode.Uri.file(readitDistDir),
|
|
83
|
-
"index.js",
|
|
84
|
-
).fsPath;
|
|
85
|
-
|
|
86
|
-
const args = [cliEntry, filePath, "--no-open", "--port", String(port)];
|
|
87
|
-
|
|
88
|
-
this.outputChannel.appendLine(
|
|
89
|
-
`Starting readit server: ${bunPath} ${args.join(" ")}`,
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
return new Promise<number>((resolve, reject) => {
|
|
93
|
-
const child = spawn(bunPath, args, {
|
|
94
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
95
|
-
env: {
|
|
96
|
-
...process.env,
|
|
97
|
-
NODE_ENV: "production",
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
this.process = child;
|
|
102
|
-
let settled = false;
|
|
103
|
-
let timer: NodeJS.Timeout | undefined;
|
|
104
|
-
|
|
105
|
-
const rejectStartup = (message: string) => {
|
|
106
|
-
if (settled) return;
|
|
107
|
-
settled = true;
|
|
108
|
-
if (timer) {
|
|
109
|
-
clearInterval(timer);
|
|
110
|
-
}
|
|
111
|
-
this.cleanup(child);
|
|
112
|
-
reject(new Error(message));
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
child.stdout?.on("data", (data: Buffer) => {
|
|
116
|
-
this.outputChannel.appendLine(data.toString().trimEnd());
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
child.stderr?.on("data", (data: Buffer) => {
|
|
120
|
-
this.outputChannel.appendLine(`[stderr] ${data.toString().trimEnd()}`);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
child.on("error", (err) => {
|
|
124
|
-
this.outputChannel.appendLine(`Server process error: ${err.message}`);
|
|
125
|
-
rejectStartup(
|
|
126
|
-
`Failed to start readit server. Is Bun installed? (${err.message})`,
|
|
127
|
-
);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
const handleProcessExit = (
|
|
131
|
-
code: number | null,
|
|
132
|
-
signal: NodeJS.Signals | null,
|
|
133
|
-
) => {
|
|
134
|
-
this.outputChannel.appendLine(
|
|
135
|
-
`Server process exited with code ${code}${signal ? ` (signal: ${signal})` : ""}`,
|
|
136
|
-
);
|
|
137
|
-
if (!settled) {
|
|
138
|
-
rejectStartup(
|
|
139
|
-
`readit server exited before it became ready (${code === null ? (signal ?? "unknown") : `code ${code}`})`,
|
|
140
|
-
);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
this.cleanup(child);
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
child.on("exit", handleProcessExit);
|
|
147
|
-
|
|
148
|
-
// Poll for server readiness
|
|
149
|
-
const maxWaitMs = 15_000;
|
|
150
|
-
const intervalMs = 200;
|
|
151
|
-
const startTime = Date.now();
|
|
152
|
-
|
|
153
|
-
timer = setInterval(async () => {
|
|
154
|
-
if (Date.now() - startTime > maxWaitMs) {
|
|
155
|
-
clearInterval(timer);
|
|
156
|
-
child.kill("SIGTERM");
|
|
157
|
-
rejectStartup("readit server failed to start within 15 seconds");
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
const res = await fetch(`http://127.0.0.1:${port}/api/health`);
|
|
163
|
-
if (res.ok) {
|
|
164
|
-
clearInterval(timer);
|
|
165
|
-
settled = true;
|
|
166
|
-
this.port = port;
|
|
167
|
-
this.outputChannel.appendLine(`Server ready on port ${port}`);
|
|
168
|
-
resolve(port);
|
|
169
|
-
}
|
|
170
|
-
} catch {
|
|
171
|
-
// Not ready yet, keep polling
|
|
172
|
-
}
|
|
173
|
-
}, intervalMs);
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Attaches a file to the running server via POST /api/documents.
|
|
179
|
-
*/
|
|
180
|
-
private async attachFile(filePath: string): Promise<void> {
|
|
181
|
-
if (this.port === null) return;
|
|
182
|
-
|
|
183
|
-
try {
|
|
184
|
-
const res = await fetch(`http://127.0.0.1:${this.port}/api/documents`, {
|
|
185
|
-
method: "POST",
|
|
186
|
-
headers: { "Content-Type": "application/json" },
|
|
187
|
-
body: JSON.stringify({ path: filePath }),
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
if (!res.ok) {
|
|
191
|
-
const raw = await res.text();
|
|
192
|
-
let errorMessage = res.statusText;
|
|
193
|
-
if (raw) {
|
|
194
|
-
try {
|
|
195
|
-
const data = JSON.parse(raw) as { error?: string };
|
|
196
|
-
errorMessage = data.error ?? raw;
|
|
197
|
-
} catch {
|
|
198
|
-
errorMessage = raw;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
this.outputChannel.appendLine(
|
|
202
|
-
`Failed to attach file ${filePath}: ${errorMessage}`,
|
|
203
|
-
);
|
|
204
|
-
} else {
|
|
205
|
-
const data = (await res.json()) as {
|
|
206
|
-
status?: string;
|
|
207
|
-
fileName?: string;
|
|
208
|
-
};
|
|
209
|
-
this.outputChannel.appendLine(
|
|
210
|
-
`File ${data.fileName ?? filePath}: ${data.status ?? "attached"}`,
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
} catch (err) {
|
|
214
|
-
this.outputChannel.appendLine(
|
|
215
|
-
`Error attaching file: ${err instanceof Error ? err.message : String(err)}`,
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/** Stops the server process. */
|
|
221
|
-
stop(): void {
|
|
222
|
-
const child = this.process;
|
|
223
|
-
if (child) {
|
|
224
|
-
this.outputChannel.appendLine("Stopping readit server...");
|
|
225
|
-
child.kill("SIGTERM");
|
|
226
|
-
let hasExited = false;
|
|
227
|
-
|
|
228
|
-
// Force kill after 3 seconds
|
|
229
|
-
const forceKillTimer = setTimeout(() => {
|
|
230
|
-
if (!hasExited && child.exitCode === null) {
|
|
231
|
-
child.kill("SIGKILL");
|
|
232
|
-
}
|
|
233
|
-
}, 3_000);
|
|
234
|
-
|
|
235
|
-
child.once("exit", () => {
|
|
236
|
-
hasExited = true;
|
|
237
|
-
clearTimeout(forceKillTimer);
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
this.cleanup();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
private cleanup(child?: ChildProcess): void {
|
|
244
|
-
if (child && this.process !== child) {
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
this.process = null;
|
|
248
|
-
this.port = null;
|
|
249
|
-
this.startPromise = null;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
dispose(): void {
|
|
253
|
-
this.stop();
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/** Finds a free TCP port by binding to port 0 and reading the assigned port. */
|
|
258
|
-
function findFreePort(): Promise<number> {
|
|
259
|
-
return new Promise((resolve, reject) => {
|
|
260
|
-
const server = net.createServer();
|
|
261
|
-
server.listen(0, "127.0.0.1", () => {
|
|
262
|
-
const addr = server.address();
|
|
263
|
-
if (addr && typeof addr === "object") {
|
|
264
|
-
const port = addr.port;
|
|
265
|
-
server.close(() => resolve(port));
|
|
266
|
-
} else {
|
|
267
|
-
server.close(() => reject(new Error("Could not determine free port")));
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
server.on("error", reject);
|
|
271
|
-
});
|
|
272
|
-
}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import * as vscode from "vscode";
|
|
3
|
-
import type { ServerManager } from "./server-manager";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Manages readit webview panels.
|
|
7
|
-
*
|
|
8
|
-
* Each panel contains an iframe pointing at the readit server on 127.0.0.1.
|
|
9
|
-
* This preserves the full interactive experience: SSE live-reload, comment
|
|
10
|
-
* CRUD, keyboard shortcuts, and all Svelte reactivity — without duplicating
|
|
11
|
-
* any rendering logic.
|
|
12
|
-
*/
|
|
13
|
-
export class ReaditWebviewProvider implements vscode.Disposable {
|
|
14
|
-
private panels = new Map<string, vscode.WebviewPanel>();
|
|
15
|
-
private disposables: vscode.Disposable[] = [];
|
|
16
|
-
|
|
17
|
-
constructor(
|
|
18
|
-
private readonly extensionUri: vscode.Uri,
|
|
19
|
-
private readonly serverManager: ServerManager,
|
|
20
|
-
private readonly outputChannel: vscode.OutputChannel,
|
|
21
|
-
) {}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Opens (or reveals) a readit preview panel for the given file.
|
|
25
|
-
* @param filePath Absolute path to the markdown file.
|
|
26
|
-
* @param readitDistDir Absolute path to the readit dist/ directory.
|
|
27
|
-
* @param column Which editor column to open the panel in.
|
|
28
|
-
*/
|
|
29
|
-
async openPreview(
|
|
30
|
-
filePath: string,
|
|
31
|
-
readitDistDir: string,
|
|
32
|
-
column: vscode.ViewColumn = vscode.ViewColumn.Active,
|
|
33
|
-
): Promise<void> {
|
|
34
|
-
// If a panel for this file already exists, reveal it
|
|
35
|
-
const existing = this.panels.get(filePath);
|
|
36
|
-
if (existing) {
|
|
37
|
-
existing.reveal(column);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Ensure the server is running with this file loaded
|
|
42
|
-
let port: number;
|
|
43
|
-
try {
|
|
44
|
-
port = await this.serverManager.ensureRunning(filePath, readitDistDir);
|
|
45
|
-
} catch (err) {
|
|
46
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
47
|
-
vscode.window.showErrorMessage(`readit: ${message}`);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const fileName = path.basename(filePath);
|
|
52
|
-
|
|
53
|
-
const panel = vscode.window.createWebviewPanel(
|
|
54
|
-
"readitPreview",
|
|
55
|
-
`readit: ${fileName}`,
|
|
56
|
-
column,
|
|
57
|
-
{
|
|
58
|
-
enableScripts: true,
|
|
59
|
-
retainContextWhenHidden: true,
|
|
60
|
-
localResourceRoots: [this.extensionUri],
|
|
61
|
-
// Allow the webview to access the local readit server
|
|
62
|
-
portMapping: [
|
|
63
|
-
{
|
|
64
|
-
webviewPort: port,
|
|
65
|
-
extensionHostPort: port,
|
|
66
|
-
},
|
|
67
|
-
],
|
|
68
|
-
},
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
panel.iconPath = vscode.Uri.joinPath(this.extensionUri, "icon.svg");
|
|
72
|
-
panel.webview.html = this.getWebviewContent(port, filePath, panel.webview);
|
|
73
|
-
|
|
74
|
-
this.panels.set(filePath, panel);
|
|
75
|
-
|
|
76
|
-
// Clean up when the panel is closed
|
|
77
|
-
panel.onDidDispose(
|
|
78
|
-
() => {
|
|
79
|
-
this.panels.delete(filePath);
|
|
80
|
-
// If no panels remain, stop the server
|
|
81
|
-
if (this.panels.size === 0) {
|
|
82
|
-
this.outputChannel.appendLine("Last panel closed, stopping server.");
|
|
83
|
-
this.serverManager.stop();
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
null,
|
|
87
|
-
this.disposables,
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Generates the HTML content for the webview.
|
|
93
|
-
* Uses an iframe pointing at the local readit server so the full Svelte app
|
|
94
|
-
* runs unmodified — SSE, comments, settings, and all.
|
|
95
|
-
*/
|
|
96
|
-
private getWebviewContent(
|
|
97
|
-
port: number,
|
|
98
|
-
_filePath: string,
|
|
99
|
-
webview: vscode.Webview,
|
|
100
|
-
): string {
|
|
101
|
-
const serverUrl = `http://127.0.0.1:${port}`;
|
|
102
|
-
const nonce = getNonce();
|
|
103
|
-
|
|
104
|
-
// The CSP allows framing the local readit server and running inline scripts
|
|
105
|
-
// with a nonce. The iframe approach means all readit functionality works
|
|
106
|
-
// without any modification to the Svelte frontend.
|
|
107
|
-
const csp = [
|
|
108
|
-
`default-src 'none'`,
|
|
109
|
-
`frame-src http://127.0.0.1:${port}`,
|
|
110
|
-
`style-src 'unsafe-inline'`,
|
|
111
|
-
`script-src 'nonce-${nonce}'`,
|
|
112
|
-
].join("; ");
|
|
113
|
-
|
|
114
|
-
// Use the VS Code webview API to properly resolve the resource
|
|
115
|
-
void webview;
|
|
116
|
-
|
|
117
|
-
return /* html */ `<!DOCTYPE html>
|
|
118
|
-
<html lang="en">
|
|
119
|
-
<head>
|
|
120
|
-
<meta charset="UTF-8" />
|
|
121
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
122
|
-
<meta http-equiv="Content-Security-Policy" content="${csp}" />
|
|
123
|
-
<title>readit</title>
|
|
124
|
-
<style>
|
|
125
|
-
html, body {
|
|
126
|
-
margin: 0;
|
|
127
|
-
padding: 0;
|
|
128
|
-
width: 100%;
|
|
129
|
-
height: 100%;
|
|
130
|
-
overflow: hidden;
|
|
131
|
-
background: var(--vscode-editor-background, #1e1e1e);
|
|
132
|
-
}
|
|
133
|
-
iframe {
|
|
134
|
-
border: none;
|
|
135
|
-
width: 100%;
|
|
136
|
-
height: 100%;
|
|
137
|
-
}
|
|
138
|
-
.loading {
|
|
139
|
-
display: flex;
|
|
140
|
-
align-items: center;
|
|
141
|
-
justify-content: center;
|
|
142
|
-
width: 100%;
|
|
143
|
-
height: 100%;
|
|
144
|
-
color: var(--vscode-foreground, #ccc);
|
|
145
|
-
font-family: var(--vscode-font-family, sans-serif);
|
|
146
|
-
font-size: 14px;
|
|
147
|
-
}
|
|
148
|
-
.loading.hidden {
|
|
149
|
-
display: none;
|
|
150
|
-
}
|
|
151
|
-
</style>
|
|
152
|
-
</head>
|
|
153
|
-
<body>
|
|
154
|
-
<div id="loading" class="loading">Starting readit server...</div>
|
|
155
|
-
<iframe
|
|
156
|
-
id="readit-frame"
|
|
157
|
-
src="${serverUrl}"
|
|
158
|
-
sandbox="allow-scripts allow-same-origin allow-forms allow-popups"
|
|
159
|
-
style="display: none;"
|
|
160
|
-
></iframe>
|
|
161
|
-
<script nonce="${nonce}">
|
|
162
|
-
const iframe = document.getElementById('readit-frame');
|
|
163
|
-
const loading = document.getElementById('loading');
|
|
164
|
-
iframe.addEventListener('load', () => {
|
|
165
|
-
loading.classList.add('hidden');
|
|
166
|
-
iframe.style.display = 'block';
|
|
167
|
-
});
|
|
168
|
-
// Show iframe after a max timeout even if load event doesn't fire
|
|
169
|
-
setTimeout(() => {
|
|
170
|
-
loading.classList.add('hidden');
|
|
171
|
-
iframe.style.display = 'block';
|
|
172
|
-
}, 10000);
|
|
173
|
-
</script>
|
|
174
|
-
</body>
|
|
175
|
-
</html>`;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/** Closes all open panels. */
|
|
179
|
-
closeAll(): void {
|
|
180
|
-
for (const panel of this.panels.values()) {
|
|
181
|
-
panel.dispose();
|
|
182
|
-
}
|
|
183
|
-
this.panels.clear();
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
dispose(): void {
|
|
187
|
-
this.closeAll();
|
|
188
|
-
for (const d of this.disposables) {
|
|
189
|
-
d.dispose();
|
|
190
|
-
}
|
|
191
|
-
this.disposables = [];
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/** Generate a random nonce for CSP inline script tags. */
|
|
196
|
-
function getNonce(): string {
|
|
197
|
-
const chars =
|
|
198
|
-
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
199
|
-
let result = "";
|
|
200
|
-
for (let i = 0; i < 32; i++) {
|
|
201
|
-
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
202
|
-
}
|
|
203
|
-
return result;
|
|
204
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"lib": ["ES2022"],
|
|
5
|
-
"types": ["node"],
|
|
6
|
-
"module": "Node16",
|
|
7
|
-
"moduleResolution": "Node16",
|
|
8
|
-
"strict": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"skipLibCheck": true,
|
|
11
|
-
"resolveJsonModule": true,
|
|
12
|
-
"isolatedModules": true,
|
|
13
|
-
"noEmit": true,
|
|
14
|
-
"rootDir": "src",
|
|
15
|
-
"noUnusedLocals": true,
|
|
16
|
-
"noUnusedParameters": true
|
|
17
|
-
},
|
|
18
|
-
"include": ["src"],
|
|
19
|
-
"exclude": ["node_modules", "dist"]
|
|
20
|
-
}
|