diff --git a/.github/package-impact-map.md b/.github/package-impact-map.md index 303c8f330b..1a55f0427a 100644 --- a/.github/package-impact-map.md +++ b/.github/package-impact-map.md @@ -9,7 +9,7 @@ Source of truth for which repo paths should trigger CI and release workflows for - **CI gates compatibility.** A change to SuperDoc core should run the CI of every dependent package — that's how breakage in `@superdoc-dev/react` or `@superdoc-dev/sdk` gets caught before it ships. CI paths follow *compatibility* impact. - **Release gates artifact changes.** A package should only publish a new version when its own published artifact actually changes. Release paths follow *artifact* impact. -These two are not the same. `template-builder` and `esign` externalize `superdoc` in their builds and declare it as a `peerDependency`, so a core change doesn't change their tarballs → CI broad, release narrow. CLI bundles core into platform binaries, so a core change does change the CLI tarball → both broad. +These two are not the same. `template-builder` and `esign` externalize `superdoc` in their builds and declare it as both a dependency and peer dependency, so a core change inside the declared range doesn't change their tarballs → CI broad, release narrow. CLI bundles core into platform binaries, so a core change does change the CLI tarball → both broad. ## Surfaces @@ -49,7 +49,7 @@ These two are not the same. `template-builder` and `esign` externalize `superdoc ## Why each classification -- **`template-builder` and `esign`** externalize `superdoc` in their Vite build (`rollupOptions.external`) and declare it as a `peerDependency`. A SuperDoc core change does not change the wrapper's published bundle — consumers receive the new core through their own `npm install`. Release-on-core is pure version noise; CI-on-core remains necessary to catch breaking API changes. +- **`template-builder` and `esign`** externalize `superdoc` in their Vite build (`rollupOptions.external`) and declare it in **both** `dependencies` and `peerDependencies`. The `dependencies` entry preserves auto-install for customers who use the wrapper as their SuperDoc entrypoint; the `peerDependencies` entry signals the singleton contract for apps that also install SuperDoc directly. A SuperDoc core change inside the declared range does not change the wrapper's published bundle or manifest, so release-on-core is pure version noise; CI-on-core remains necessary to catch breaking API changes. - **`react`** externalizes `superdoc` in its Vite build the same way, and declares `superdoc` in **both** `dependencies` and `peerDependencies`. The `dependencies` entry preserves auto-install for every consumer (zero-break regardless of package manager); the `peerDependencies` entry signals the singleton contract and aligns the manifest with template-builder/esign. Because the `dependencies` entry still pins via lockfiles, existing consumers only pick up a new core version when react republishes, so release-on-core stays correct *today*. The unlock for release-narrow is to remove `superdoc` from `dependencies` entirely — that is a breaking change and tracked as a separate decision. - **CLI / SDK** bundle engine behavior into platform-specific native binaries (see `apps/cli/.releaserc.cjs` and `packages/sdk/.releaserc.cjs` — both use `patch-commit-filter.cjs` to expand release analysis into core paths). The published artifact genuinely changes when core changes. - **MCP** depends on SDK via `workspace:*` and imports engine/session code directly. Its current release trigger (`apps/mcp/**` only) causes it to lag SDK releases. Expand to match SDK's release paths. @@ -61,6 +61,6 @@ These two are not the same. `template-builder` and `esign` externalize `superdoc ## Notes - `packages/ai/**` has been removed from all release and CI triggers. `@superdoc-dev/ai` is being deprecated; npm-side deprecation is a separate operational step. -- When SuperDoc core ships a breaking API change, `template-builder` and `esign` must be manually updated and released. Their `peerDependencies` version bump is the signal; semantic-release won't auto-trigger on upstream changes for them. -- `@superdoc-dev/react` declares `superdoc` in both `dependencies` and `peerDependencies` to preserve zero-break install semantics while still signaling the singleton contract. Removing `superdoc` from `dependencies` is the unlock for release-narrow and is tracked as a separate decision. +- When SuperDoc core ships a breaking API change, `template-builder` and `esign` must be manually updated and released. Their dependency and peer-dependency floor bump is the signal; semantic-release won't auto-trigger on upstream changes for them. +- `@superdoc-dev/react`, `@superdoc-dev/template-builder`, and `@superdoc-dev/esign` declare `superdoc` in both `dependencies` and `peerDependencies` to preserve automatic install semantics while still signaling the singleton contract. Removing `superdoc` from `dependencies` is the unlock for release-narrow and is tracked as a separate decision. - When editing a release or CI workflow, its `paths:` filter must match the corresponding row in this map. Workflow-lint rules should enforce this. diff --git a/.github/workflows/promote-stable.yml b/.github/workflows/promote-stable.yml index 061e582f89..f41a000c91 100644 --- a/.github/workflows/promote-stable.yml +++ b/.github/workflows/promote-stable.yml @@ -71,6 +71,7 @@ jobs: if git merge --no-ff --no-edit "origin/${SOURCE_BRANCH}"; then MERGE_STATUS="clean" else +<<<<<<< HEAD # Auto-resolve release artifact conflicts: keep stable's version. # npm/PyPI already have stable's published version; downgrading to # main's track would break the next stable release. Mirrors the @@ -84,6 +85,62 @@ jobs: ;; esac done +======= + normalize_json_without_keys() { + python3 -c 'import json, sys; data = json.load(sys.stdin); [data.pop(key, None) for key in sys.argv[1:]]; sys.stdout.write(json.dumps(data, sort_keys=True, separators=(",", ":")))' "$@" + } + + release_artifact_only_conflict() { + local f="$1" + local tmpdir + local status + tmpdir="$(mktemp -d)" + + case "$f" in + package.json|*/package.json) + git show ":2:${f}" | normalize_json_without_keys version > "${tmpdir}/ours" || { rm -rf "${tmpdir}"; return 1; } + git show ":3:${f}" | normalize_json_without_keys version > "${tmpdir}/theirs" || { rm -rf "${tmpdir}"; return 1; } + ;; + pyproject.toml|*/pyproject.toml) + git show ":2:${f}" | sed -E '/^[[:space:]]*version[[:space:]]*=/d' > "${tmpdir}/ours" || { rm -rf "${tmpdir}"; return 1; } + git show ":3:${f}" | sed -E '/^[[:space:]]*version[[:space:]]*=/d' > "${tmpdir}/theirs" || { rm -rf "${tmpdir}"; return 1; } + ;; + version.json|*/version.json) + git show ":2:${f}" | normalize_json_without_keys version sdkVersion > "${tmpdir}/ours" || { rm -rf "${tmpdir}"; return 1; } + git show ":3:${f}" | normalize_json_without_keys version sdkVersion > "${tmpdir}/theirs" || { rm -rf "${tmpdir}"; return 1; } + ;; + *) + rm -rf "${tmpdir}" + return 1 + ;; + esac + + cmp -s "${tmpdir}/ours" "${tmpdir}/theirs" + status=$? + rm -rf "${tmpdir}" + return "${status}" + } + + # Auto-resolve release artifact conflicts only when the conflict is + # version-only: keep stable's version, but never drop dependency, + # script, export, or package metadata changes from main. + # npm/PyPI already have stable's published version; downgrading to + # main's track would break the next stable release. Mirrors the + # auto-resolve in sync-patches.yml, biased the other direction. + while read -r f; do + case "$f" in + package.json|*/package.json|pyproject.toml|*/pyproject.toml|version.json|*/version.json) + if release_artifact_only_conflict "$f"; then + echo " Auto-resolving $f (version-only; keeping stable's version)" + git checkout --ours "$f" + git add "$f" + else + echo " Leaving $f unresolved (contains non-version changes)" + fi + ;; + esac + done < <(git diff --name-only --diff-filter=U) +>>>>>>> origin/stable if [ -z "$(git diff --name-only --diff-filter=U)" ]; then MERGE_STATUS="auto_resolved" @@ -141,7 +198,11 @@ jobs: - creates \`${BRANCH_NAME}\` from \`${BASE_BRANCH}\` - merges \`${SOURCE_BRANCH}\` into the candidate branch +<<<<<<< HEAD - release artifact conflicts (package.json, pyproject.toml, version.json) auto-resolved to keep stable's published version +======= + - version-only release artifact conflicts (package.json, pyproject.toml, version.json) auto-resolved to keep stable's published version +>>>>>>> origin/stable --- _Auto-created by promote-stable workflow._ diff --git a/.github/workflows/release-react.yml b/.github/workflows/release-react.yml index a669b88ad5..2d48819b0c 100644 --- a/.github/workflows/release-react.yml +++ b/.github/workflows/release-react.yml @@ -36,6 +36,8 @@ concurrency: jobs: release: + # Stable publishes must go through release-stable.yml. + if: ${{ github.event_name != 'workflow_dispatch' || github.ref_name != 'stable' }} runs-on: ubuntu-24.04 steps: - name: Generate token diff --git a/.github/workflows/release-superdoc.yml b/.github/workflows/release-superdoc.yml index 0a8cd3df9f..6ac97ea010 100644 --- a/.github/workflows/release-superdoc.yml +++ b/.github/workflows/release-superdoc.yml @@ -40,6 +40,8 @@ concurrency: jobs: release: + # Stable publishes must go through release-stable.yml; PR previews are still allowed. + if: ${{ github.event_name != 'workflow_dispatch' || github.ref_name != 'stable' || inputs.pr_number }} runs-on: ubuntu-24.04 steps: - name: Generate token diff --git a/.github/workflows/release-vscode-ext.yml b/.github/workflows/release-vscode-ext.yml index e378ac9654..f5d06be2b8 100644 --- a/.github/workflows/release-vscode-ext.yml +++ b/.github/workflows/release-vscode-ext.yml @@ -34,6 +34,8 @@ concurrency: jobs: release: + # Stable publishes must go through release-stable.yml. + if: ${{ github.event_name != 'workflow_dispatch' || github.ref_name != 'stable' }} runs-on: ubuntu-latest steps: - name: Generate token diff --git a/demos/contract-templates/src/main.ts b/demos/contract-templates/src/main.ts index 5842f201f4..759a3c4e06 100644 --- a/demos/contract-templates/src/main.ts +++ b/demos/contract-templates/src/main.ts @@ -38,10 +38,15 @@ */ import { SuperDoc } from 'superdoc'; +<<<<<<< HEAD import { createSuperDocUI } from 'superdoc/ui'; import 'superdoc/style.css'; import './style.css'; import { attachFieldChip } from './field-chip.js'; +======= +import 'superdoc/style.css'; +import './style.css'; +>>>>>>> origin/stable type NodeKind = 'block' | 'inline'; type LockMode = 'unlocked' | 'sdtLocked' | 'contentLocked' | 'sdtContentLocked'; @@ -199,10 +204,13 @@ const state = { values: {} as Record, versions: {} as Record, expandedClause: null as ClauseId | null, +<<<<<<< HEAD /** UI controller; created in `initialize`, disposed by `teardown`. */ ui: null as ReturnType | null, /** Field-chip detach handle; created in `initialize`, called by `teardown`. */ fieldChipTeardown: null as (() => void) | null, +======= +>>>>>>> origin/stable }; const statusEl = qs('#status'); @@ -262,6 +270,7 @@ async function initialize(instance: DemoSuperDoc): Promise { readStateFromDocument(); renderPanels(); refreshSummary(); +<<<<<<< HEAD // Contextual smart-field chip (SD-3157). Plain TS — uses the // public `superdoc/ui` controller directly, no framework. The chip @@ -280,6 +289,8 @@ async function initialize(instance: DemoSuperDoc): Promise { valueFor: (key) => state.values[key as FieldKey], }); +======= +>>>>>>> origin/stable setStatus('Ready'); setBusy(false); } @@ -522,6 +533,7 @@ function escapeAttr(s: string): string { doc: () => state.editor?.doc ?? null, }; +<<<<<<< HEAD const teardown = () => { // Order matters: detach the field chip first (it relies on the UI // controller for `getRect`), then destroy the UI controller, then @@ -541,5 +553,8 @@ const teardown = () => { state.ui = null; superdoc.destroy(); }; +======= +const teardown = () => superdoc.destroy(); +>>>>>>> origin/stable window.addEventListener('beforeunload', teardown); if (import.meta.hot) import.meta.hot.dispose(teardown); diff --git a/demos/contract-templates/src/style.css b/demos/contract-templates/src/style.css index f47b9ce68e..257bfdc193 100644 --- a/demos/contract-templates/src/style.css +++ b/demos/contract-templates/src/style.css @@ -267,6 +267,7 @@ input:focus { color: var(--demo-text-muted); font-weight: 600; } +<<<<<<< HEAD /* * Contextual smart-field chip (SD-3157). Floats over the active smart- @@ -301,3 +302,5 @@ input:focus { color: var(--demo-text, #18181b); font-weight: 400; } +======= +>>>>>>> origin/stable diff --git a/devtools/visual-testing/pnpm-lock.yaml b/devtools/visual-testing/pnpm-lock.yaml index f323ab8edb..15007c6c94 100644 --- a/devtools/visual-testing/pnpm-lock.yaml +++ b/devtools/visual-testing/pnpm-lock.yaml @@ -50,7 +50,7 @@ importers: version: 5.2.8 superdoc: specifier: file:../../../../packages/superdoc/superdoc.tgz - version: file:../../packages/superdoc/superdoc.tgz(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(pdfjs-dist@4.6.82)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19) + version: file:../../packages/superdoc/superdoc.tgz(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-transform@1.11.0)(prosemirror-view@1.41.5)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19) vue: specifier: ^3.5.13 version: 3.5.27(typescript@5.9.3) @@ -705,10 +705,6 @@ packages: '@lifeomic/attempt@3.1.0': resolution: {integrity: sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==} - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1085,6 +1081,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/minimatch@6.0.0': resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. @@ -1095,6 +1094,12 @@ packages: '@types/pngjs@6.0.5': resolution: {integrity: sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@vitejs/plugin-vue@5.2.4': resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1131,70 +1136,38 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vue/compiler-core@3.5.25': - resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} - '@vue/compiler-core@3.5.27': resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} - '@vue/compiler-dom@3.5.25': - resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} - '@vue/compiler-dom@3.5.27': resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} - '@vue/compiler-sfc@3.5.25': - resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} - '@vue/compiler-sfc@3.5.27': resolution: {integrity: sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==} - '@vue/compiler-ssr@3.5.25': - resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} - '@vue/compiler-ssr@3.5.27': resolution: {integrity: sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==} '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/reactivity@3.5.25': - resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} - '@vue/reactivity@3.5.27': resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} - '@vue/runtime-core@3.5.25': - resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} - '@vue/runtime-core@3.5.27': resolution: {integrity: sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==} - '@vue/runtime-dom@3.5.25': - resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} - '@vue/runtime-dom@3.5.27': resolution: {integrity: sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==} - '@vue/server-renderer@3.5.25': - resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} - peerDependencies: - vue: 3.5.25 - '@vue/server-renderer@3.5.27': resolution: {integrity: sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==} peerDependencies: vue: 3.5.27 - '@vue/shared@3.5.25': - resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} - '@vue/shared@3.5.27': resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1205,10 +1178,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -1216,22 +1185,10 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - aproba@2.1.0: - resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1271,10 +1228,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -1287,10 +1240,6 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1298,19 +1247,12 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1342,10 +1284,6 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -1353,13 +1291,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1368,13 +1299,6 @@ packages: resolution: {integrity: sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==} engines: {node: '>=12'} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -1512,10 +1436,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1529,11 +1449,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - get-tsconfig@4.13.3: resolution: {integrity: sha512-vp8Cj/+9Q/ibZUrq1rhy8mCTQpCk31A3uu9wc1C50yAb3x2pFHOsGdAZQ7jD86ARayyxZUViYeIztW+GE8dcrg==} @@ -1564,9 +1479,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -1575,10 +1487,6 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -1606,10 +1514,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1695,10 +1599,6 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} @@ -1710,10 +1610,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - minimatch@10.1.2: resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} engines: {node: 20 || >=22} @@ -1721,29 +1617,9 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nan@2.25.0: - resolution: {integrity: sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1752,28 +1628,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1815,10 +1669,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path2d@0.2.2: - resolution: {integrity: sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==} - engines: {node: '>=6'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1826,10 +1676,6 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} - pdfjs-dist@4.6.82: - resolution: {integrity: sha512-BUOryeRFwvbLe0lOU6NhkJNuVQUp06WxlJVVCsxdmJ4y5cU3O3s3/0DunVdK1PMm7v2MUw52qKYaidhDH1Z9+w==} - engines: {node: '>=18'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1895,10 +1741,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -1914,11 +1756,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rollup-plugin-copy@3.5.0: resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} engines: {node: '>=8.3'} @@ -1931,25 +1768,10 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1961,15 +1783,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -1984,17 +1797,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2006,13 +1808,31 @@ packages: resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} superdoc@file:../../packages/superdoc/superdoc.tgz: - resolution: {integrity: sha512-/p1mQ0yQx2FFvpmr6YJ//J/Tz/SoW4a40WWzOpjD7+yBXdcOQbT93KU3tkDRIPcTGk93DHdHXkeseWemSTwZNg==, tarball: file:../../packages/superdoc/superdoc.tgz} - version: 1.23.0 + resolution: {integrity: sha512-dKJSGVcDAofGOzCV883PoCD6NBzIGzQ84c1dqhcZP+XhG+oUOgORNIBxc4PxwsYD+u5eIqe9ikQ0MMWOrvtnCw==, tarball: file:../../packages/superdoc/superdoc.tgz} + version: 1.32.0 peerDependencies: '@hocuspocus/provider': ^2.13.6 pdfjs-dist: ^5.4.296 + prosemirror-model: ^1.25.0 + prosemirror-state: ^1.4.0 + prosemirror-transform: ^1.9.0 + prosemirror-view: ^1.33.0 + react: '>=16.8.0' y-prosemirror: ^1.3.7 yjs: ^13.6.19 + peerDependenciesMeta: + pdfjs-dist: + optional: true + prosemirror-model: + optional: true + prosemirror-state: + optional: true + prosemirror-transform: + optional: true + prosemirror-view: + optional: true + react: + optional: true supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -2021,11 +1841,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -2063,9 +1878,6 @@ packages: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -2097,11 +1909,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true vite-node@3.2.4: @@ -2188,14 +1998,6 @@ packages: '@vue/composition-api': optional: true - vue@3.5.25: - resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - vue@3.5.27: resolution: {integrity: sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==} peerDependencies: @@ -2208,9 +2010,6 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -2227,9 +2026,6 @@ packages: resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} engines: {node: '>=20'} - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2240,9 +2036,6 @@ packages: engines: {node: '>=8'} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -2291,9 +2084,6 @@ packages: peerDependencies: yjs: ^13.5.6 - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yjs@13.6.19: resolution: {integrity: sha512-GNKw4mEUn5yWU2QPHRx8jppxmCm9KzbBhB4qJLUJFiiYD0g/tDVgXQ7aPkyh01YO28kbs2J/BEbWBagjuWyejw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -3095,22 +2885,6 @@ snapshots: '@lifeomic/attempt@3.1.0': {} - '@mapbox/node-pre-gyp@1.0.11': - dependencies: - detect-libc: 2.1.2 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.7.4 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3560,6 +3334,10 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/minimatch@6.0.0': dependencies: minimatch: 10.1.2 @@ -3572,6 +3350,12 @@ snapshots: dependencies: '@types/node': 22.19.9 + '@types/unist@3.0.3': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.19.9 + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@22.19.9)(tsx@4.21.0))(vue@3.5.27(typescript@5.9.3))': dependencies: vite: 6.4.1(@types/node@22.19.9)(tsx@4.21.0) @@ -3619,14 +3403,6 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vue/compiler-core@3.5.25': - dependencies: - '@babel/parser': 7.29.0 - '@vue/shared': 3.5.25 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-core@3.5.27': dependencies: '@babel/parser': 7.29.0 @@ -3635,28 +3411,11 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.25': - dependencies: - '@vue/compiler-core': 3.5.25 - '@vue/shared': 3.5.25 - '@vue/compiler-dom@3.5.27': dependencies: '@vue/compiler-core': 3.5.27 '@vue/shared': 3.5.27 - '@vue/compiler-sfc@3.5.25': - dependencies: - '@babel/parser': 7.29.0 - '@vue/compiler-core': 3.5.25 - '@vue/compiler-dom': 3.5.25 - '@vue/compiler-ssr': 3.5.25 - '@vue/shared': 3.5.25 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.6 - source-map-js: 1.2.1 - '@vue/compiler-sfc@3.5.27': dependencies: '@babel/parser': 7.29.0 @@ -3669,11 +3428,6 @@ snapshots: postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.25': - dependencies: - '@vue/compiler-dom': 3.5.25 - '@vue/shared': 3.5.25 - '@vue/compiler-ssr@3.5.27': dependencies: '@vue/compiler-dom': 3.5.27 @@ -3681,31 +3435,15 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/reactivity@3.5.25': - dependencies: - '@vue/shared': 3.5.25 - '@vue/reactivity@3.5.27': dependencies: '@vue/shared': 3.5.27 - '@vue/runtime-core@3.5.25': - dependencies: - '@vue/reactivity': 3.5.25 - '@vue/shared': 3.5.25 - '@vue/runtime-core@3.5.27': dependencies: '@vue/reactivity': 3.5.27 '@vue/shared': 3.5.27 - '@vue/runtime-dom@3.5.25': - dependencies: - '@vue/reactivity': 3.5.25 - '@vue/runtime-core': 3.5.25 - '@vue/shared': 3.5.25 - csstype: 3.2.3 - '@vue/runtime-dom@3.5.27': dependencies: '@vue/reactivity': 3.5.27 @@ -3713,38 +3451,20 @@ snapshots: '@vue/shared': 3.5.27 csstype: 3.2.3 - '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': - dependencies: - '@vue/compiler-ssr': 3.5.25 - '@vue/shared': 3.5.25 - vue: 3.5.25(typescript@5.9.3) - '@vue/server-renderer@3.5.27(vue@3.5.27(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.27 '@vue/shared': 3.5.27 vue: 3.5.27(typescript@5.9.3) - '@vue/shared@3.5.25': {} - '@vue/shared@3.5.27': {} - abbrev@1.1.1: - optional: true - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 acorn@8.15.0: {} - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - agent-base@7.1.4: {} ajv@6.12.6: @@ -3754,22 +3474,10 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-regex@5.0.1: - optional: true - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - aproba@2.1.0: - optional: true - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - optional: true - argparse@2.0.1: {} array-union@2.1.0: {} @@ -3799,16 +3507,6 @@ snapshots: callsites@3.1.0: {} - canvas@2.11.2: - dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.25.0 - simple-get: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -3824,25 +3522,16 @@ snapshots: check-error@2.1.3: {} - chownr@2.0.0: - optional: true - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - color-support@1.1.3: - optional: true - colorette@1.4.0: {} concat-map@0.0.1: {} - console-control-strings@1.1.0: - optional: true - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3880,32 +3569,16 @@ snapshots: decimal.js@10.6.0: {} - decompress-response@4.2.1: - dependencies: - mimic-response: 2.1.0 - optional: true - deep-eql@5.0.2: {} deep-is@0.1.4: {} - delegates@1.0.0: - optional: true - - detect-libc@2.1.2: - optional: true - dir-glob@3.0.1: dependencies: path-type: 4.0.0 dotenv@17.2.4: {} - emoji-regex@8.0.0: - optional: true - - entities@4.5.0: {} - entities@6.0.1: {} entities@7.0.1: {} @@ -4108,11 +3781,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - optional: true - fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -4121,19 +3789,6 @@ snapshots: fsevents@2.3.3: optional: true - gauge@3.0.2: - dependencies: - aproba: 2.1.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - optional: true - get-tsconfig@4.13.3: dependencies: resolve-pkg-maps: 1.0.0 @@ -4172,9 +3827,6 @@ snapshots: has-flag@4.0.0: {} - has-unicode@2.0.1: - optional: true - html-encoding-sniffer@6.0.0: dependencies: '@exodus/bytes': 1.11.0 @@ -4188,14 +3840,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -4221,9 +3865,6 @@ snapshots: is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: - optional: true - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -4313,11 +3954,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - optional: true - mdn-data@2.12.2: {} merge2@1.4.1: {} @@ -4327,9 +3963,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mimic-response@2.1.0: - optional: true - minimatch@10.1.2: dependencies: '@isaacs/brace-expansion': 5.0.1 @@ -4338,53 +3971,12 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - optional: true - - minipass@5.0.0: - optional: true - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - optional: true - - mkdirp@1.0.4: - optional: true - ms@2.1.3: {} - nan@2.25.0: - optional: true - nanoid@3.3.11: {} natural-compare@1.4.0: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - optional: true - - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - optional: true - - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - optional: true - - object-assign@4.1.1: - optional: true - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -4424,32 +4016,21 @@ snapshots: path-type@4.0.0: {} - path2d@0.2.2: - optional: true - pathe@2.0.3: {} pathval@2.0.1: {} - pdfjs-dist@4.6.82: - optionalDependencies: - canvas: 2.11.2 - path2d: 0.2.2 - transitivePeerDependencies: - - encoding - - supports-color - picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.3: {} - pinia@2.3.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)): + pinia@2.3.1(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.25(typescript@5.9.3) - vue-demi: 0.14.10(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.27(typescript@5.9.3) + vue-demi: 0.14.10(vue@3.5.27(typescript@5.9.3)) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -4501,13 +4082,6 @@ snapshots: queue-microtask@1.2.3: {} - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - optional: true - require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -4516,11 +4090,6 @@ snapshots: reusify@1.1.0: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - optional: true - rollup-plugin-copy@3.5.0: dependencies: '@types/fs-extra': 8.1.5 @@ -4564,22 +4133,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.2.1: - optional: true - saxes@6.0.0: dependencies: xmlchars: 2.2.0 - semver@6.3.1: - optional: true - - semver@7.7.4: - optional: true - - set-blocking@2.0.0: - optional: true - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4588,19 +4145,6 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: - optional: true - - simple-concat@1.0.1: - optional: true - - simple-get@3.1.1: - dependencies: - decompress-response: 4.2.1 - once: 1.4.0 - simple-concat: 1.0.1 - optional: true - slash@3.0.0: {} source-map-js@1.2.1: {} @@ -4609,23 +4153,6 @@ snapshots: std-env@3.10.0: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - optional: true - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - optional: true - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - optional: true - strip-json-comments@3.1.1: {} strip-literal@3.1.0: @@ -4634,21 +4161,27 @@ snapshots: strnum@2.1.2: {} - superdoc@file:../../packages/superdoc/superdoc.tgz(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(pdfjs-dist@4.6.82)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19): + superdoc@file:../../packages/superdoc/superdoc.tgz(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-transform@1.11.0)(prosemirror-view@1.41.5)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19): dependencies: '@hocuspocus/provider': 2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) + '@types/mdast': 4.0.4 + '@types/ws': 8.18.1 buffer-crc32: 1.0.0 eventemitter3: 5.0.4 jsdom: 27.4.0 konva: 10.2.0 - pdfjs-dist: 4.6.82 - pinia: 2.3.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) + pinia: 2.3.1(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3)) rollup-plugin-copy: 3.5.0 uuid: 9.0.1 - vue: 3.5.25(typescript@5.9.3) + vue: 3.5.27(typescript@5.9.3) y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) y-websocket: 3.0.0(yjs@13.6.19) yjs: 13.6.19 + optionalDependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.5 transitivePeerDependencies: - '@noble/hashes' - '@vue/composition-api' @@ -4664,16 +4197,6 @@ snapshots: symbol-tree@3.2.4: {} - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - optional: true - tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -4703,9 +4226,6 @@ snapshots: dependencies: tldts: 7.0.22 - tr46@0.0.3: - optional: true - tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -4733,9 +4253,6 @@ snapshots: dependencies: punycode: 2.3.1 - util-deprecate@1.0.2: - optional: true - uuid@9.0.1: {} vite-node@3.2.4(@types/node@22.19.9)(tsx@4.21.0): @@ -4814,19 +4331,9 @@ snapshots: - tsx - yaml - vue-demi@0.14.10(vue@3.5.25(typescript@5.9.3)): - dependencies: - vue: 3.5.25(typescript@5.9.3) - - vue@3.5.25(typescript@5.9.3): + vue-demi@0.14.10(vue@3.5.27(typescript@5.9.3)): dependencies: - '@vue/compiler-dom': 3.5.25 - '@vue/compiler-sfc': 3.5.25 - '@vue/runtime-dom': 3.5.25 - '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) - '@vue/shared': 3.5.25 - optionalDependencies: - typescript: 5.9.3 + vue: 3.5.27(typescript@5.9.3) vue@3.5.27(typescript@5.9.3): dependencies: @@ -4842,9 +4349,6 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - webidl-conversions@3.0.1: - optional: true - webidl-conversions@8.0.1: {} whatwg-mimetype@4.0.0: {} @@ -4856,12 +4360,6 @@ snapshots: tr46: 6.0.0 webidl-conversions: 8.0.1 - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - optional: true - which@2.0.2: dependencies: isexe: 2.0.0 @@ -4871,11 +4369,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - optional: true - word-wrap@1.2.5: {} wrappy@1.0.2: {} @@ -4906,9 +4399,6 @@ snapshots: y-protocols: 1.0.7(yjs@13.6.19) yjs: 13.6.19 - yallist@4.0.0: - optional: true - yjs@13.6.19: dependencies: lib0: 0.2.117 diff --git a/packages/esign/.releaserc.cjs b/packages/esign/.releaserc.cjs index 0a2637b43b..49a4aa1aa3 100644 --- a/packages/esign/.releaserc.cjs +++ b/packages/esign/.releaserc.cjs @@ -6,10 +6,10 @@ const { /* * Release narrow: esign externalizes `superdoc` in its build, so a core - * change does not alter the published esign tarball (consumers get the new - * core via their own peerDependencies install). Only commits touching - * packages/esign/** should trigger a release. See - * .github/package-impact-map.md. + * change inside the declared dependency/peer range does not alter the + * published esign tarball. Consumers pick up eligible core versions through + * package manager resolution. Only commits touching packages/esign/** should + * trigger a release. See .github/package-impact-map.md. */ const branch = process.env.GITHUB_REF_NAME || process.env.CI_COMMIT_BRANCH; diff --git a/packages/esign/package.json b/packages/esign/package.json index 98fd1b79f1..91d23478af 100644 --- a/packages/esign/package.json +++ b/packages/esign/package.json @@ -46,6 +46,9 @@ ], "author": "SuperDoc Team", "license": "AGPL-3.0", + "dependencies": { + "superdoc": "^1.33.1" + }, "bugs": { "url": "https://github.com/superdoc-dev/superdoc/issues" }, @@ -53,7 +56,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "superdoc": "^1.28.0" + "superdoc": "^1.33.1" }, "devDependencies": { "@testing-library/jest-dom": "catalog:", @@ -66,7 +69,6 @@ "eslint-plugin-react-hooks": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "superdoc": "workspace:*", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-dts": "catalog:", diff --git a/packages/esign/src/types.ts b/packages/esign/src/types.ts index 565c96d1b0..a7da617caa 100644 --- a/packages/esign/src/types.ts +++ b/packages/esign/src/types.ts @@ -56,8 +56,8 @@ export interface SubmitConfig { component?: React.ComponentType; } -export interface PdfModuleConfig { - pdfLib: any; +export interface PdfModuleConfig extends Record { + pdfLib: object; workerSrc?: string; setWorker?: boolean; textLayer?: boolean; diff --git a/packages/super-editor/src/editors/v1/extensions/text-align/text-align.js b/packages/super-editor/src/editors/v1/extensions/text-align/text-align.js index 7f410692d2..7fe809d242 100644 --- a/packages/super-editor/src/editors/v1/extensions/text-align/text-align.js +++ b/packages/super-editor/src/editors/v1/extensions/text-align/text-align.js @@ -41,13 +41,18 @@ export const TextAlign = Extension.create({ */ setTextAlign: (alignment) => +<<<<<<< HEAD ({ commands, state }) => { +======= + ({ commands, state, tr, dispatch }) => { +>>>>>>> origin/stable const containsAlignment = this.options.alignments.includes(alignment); if (!containsAlignment) return false; const $from = state?.selection?.$from; let paragraphNode = null; let paragraphDepth = -1; +<<<<<<< HEAD if ($from) { for (let depth = $from.depth; depth >= 0; depth--) { const nodeAtDepth = $from.node(depth); @@ -69,6 +74,59 @@ export const TextAlign = Extension.create({ const storedAlignment = mapDisplayAlignmentToStoredJustification(alignment, paragraphProperties?.rightToLeft); return commands.updateAttributes('paragraph', { 'paragraphProperties.justification': storedAlignment }); +======= + if (!state?.doc || !state?.selection || !tr) { + const paragraphProperties = getSelectionParagraphProperties(this.editor, state); + const storedAlignment = mapDisplayAlignmentToStoredJustification( + alignment, + paragraphProperties?.rightToLeft, + ); + return commands.updateAttributes('paragraph', { 'paragraphProperties.justification': storedAlignment }); + } + + const visitedPositions = new Set(); + let touched = false; + + const updateParagraph = (node, pos) => { + if (node.type.name !== 'paragraph') return true; + if (visitedPositions.has(pos)) return false; + visitedPositions.add(pos); + + const paragraphProperties = this.editor + ? calculateResolvedParagraphProperties(this.editor, node, state.doc.resolve(pos)) + : (node.attrs?.paragraphProperties ?? {}); + const storedAlignment = mapDisplayAlignmentToStoredJustification( + alignment, + paragraphProperties?.rightToLeft, + ); + const existingParagraphProperties = node.attrs?.paragraphProperties ?? {}; + + if (existingParagraphProperties.justification === storedAlignment) return false; + + tr.setNodeMarkup(pos, undefined, { + ...node.attrs, + paragraphProperties: { + ...existingParagraphProperties, + justification: storedAlignment, + }, + }); + touched = true; + return false; + }; + + state.selection.ranges.forEach((range) => { + if (range.$from.pos === range.$to.pos) { + const paragraph = getParagraphAtSelection(range.$from); + if (paragraph) updateParagraph(paragraph.node, paragraph.pos); + return; + } + + state.doc.nodesBetween(range.$from.pos, range.$to.pos, updateParagraph); + }); + + if (touched && dispatch) dispatch(tr); + return true; +>>>>>>> origin/stable }, /** @@ -94,3 +152,21 @@ export const TextAlign = Extension.create({ }; }, }); + +function getSelectionParagraphProperties(editor, state) { + const paragraph = getParagraphAtSelection(state?.selection?.$from); + if (!paragraph) return {}; + if (!editor || !state?.doc) return paragraph.node?.attrs?.paragraphProperties ?? {}; + return calculateResolvedParagraphProperties(editor, paragraph.node, state.doc.resolve(paragraph.pos)); +} + +function getParagraphAtSelection($pos) { + if (!$pos) return null; + for (let depth = $pos.depth; depth >= 0; depth--) { + const node = $pos.node(depth); + if (node?.type?.name === 'paragraph') { + return { node, pos: depth > 0 ? $pos.before(depth) : 0 }; + } + } + return null; +} diff --git a/packages/super-editor/src/editors/v1/extensions/text-align/text-align.test.js b/packages/super-editor/src/editors/v1/extensions/text-align/text-align.test.js index 24b66c9e53..ba32d626f6 100644 --- a/packages/super-editor/src/editors/v1/extensions/text-align/text-align.test.js +++ b/packages/super-editor/src/editors/v1/extensions/text-align/text-align.test.js @@ -144,6 +144,55 @@ describe('TextAlign extension', () => { }); }); +<<<<<<< HEAD +======= + it('maps alignment per paragraph for mixed LTR/RTL selections', () => { + const ltrParagraph = { + type: { name: 'paragraph' }, + attrs: { paragraphProperties: { rightToLeft: false, justification: 'center' } }, + }; + const rtlParagraph = { + type: { name: 'paragraph' }, + attrs: { paragraphProperties: { rightToLeft: true, justification: 'center' } }, + }; + const state = { + doc: { + resolve: vi.fn((pos) => ({ pos })), + nodesBetween: vi.fn((_from, _to, callback) => { + callback(ltrParagraph, 1); + callback(rtlParagraph, 10); + }), + }, + selection: { + ranges: [ + { + $from: { pos: 1 }, + $to: { pos: 20 }, + }, + ], + }, + }; + const tr = { setNodeMarkup: vi.fn() }; + const dispatch = vi.fn(); + + const result = commands.setTextAlign('left')({ + commands: { updateAttributes: vi.fn(() => true) }, + state, + tr, + dispatch, + }); + + expect(result).toBe(true); + expect(tr.setNodeMarkup).toHaveBeenNthCalledWith(1, 1, undefined, { + paragraphProperties: { rightToLeft: false, justification: 'left' }, + }); + expect(tr.setNodeMarkup).toHaveBeenNthCalledWith(2, 10, undefined, { + paragraphProperties: { rightToLeft: true, justification: 'right' }, + }); + expect(dispatch).toHaveBeenCalledWith(tr); + }); + +>>>>>>> origin/stable it('returns false for unsupported alignment values', () => { const updateAttributes = vi.fn(() => true); diff --git a/packages/superdoc/src/stores/comments-store.js b/packages/superdoc/src/stores/comments-store.js index 5dcc1f2e59..8314e7b999 100644 --- a/packages/superdoc/src/stores/comments-store.js +++ b/packages/superdoc/src/stores/comments-store.js @@ -718,6 +718,7 @@ export const useCommentsStore = defineStore('comments', () => { }); } } +<<<<<<< HEAD } }; @@ -752,6 +753,8 @@ export const useCommentsStore = defineStore('comments', () => { params.trackedChangeStoryLabel = ''; params.trackedChangeAnchorKey = buildBodyTrackedChangeAnchorKey(params.changeId ?? changeId); handleTrackedChangeUpdate({ superdoc, params, broadcastChanges }); +======= +>>>>>>> origin/stable } }; diff --git a/packages/superdoc/src/ui.barrel.test.ts b/packages/superdoc/src/ui.barrel.test.ts index 36d353f063..dd140b74c0 100644 --- a/packages/superdoc/src/ui.barrel.test.ts +++ b/packages/superdoc/src/ui.barrel.test.ts @@ -49,6 +49,7 @@ describe('superdoc/ui public barrel (SD-3156)', () => { expect(BARREL_TEXT).toMatch(/type\s+ViewportGetRectInput\b/); }); }); +<<<<<<< HEAD describe('superdoc/ui public barrel (SD-3157)', () => { it('re-exports ContentControlsSlice', () => { @@ -59,3 +60,5 @@ describe('superdoc/ui public barrel (SD-3157)', () => { expect(BARREL_TEXT).toMatch(/type\s+ContentControlsHandle\b/); }); }); +======= +>>>>>>> origin/stable diff --git a/packages/superdoc/src/ui.d.ts b/packages/superdoc/src/ui.d.ts index d4b3efa810..834f46095e 100644 --- a/packages/superdoc/src/ui.d.ts +++ b/packages/superdoc/src/ui.d.ts @@ -10,8 +10,11 @@ export { type CommentsListQuery, type CommentsListResult, type CommentsSlice, +<<<<<<< HEAD type ContentControlsHandle, type ContentControlsSlice, +======= +>>>>>>> origin/stable type ContentControlViewportAddress, type ContextMenuContribution, type ContextMenuItem, diff --git a/packages/template-builder/.releaserc.cjs b/packages/template-builder/.releaserc.cjs index c48172cb4a..9483401fa1 100644 --- a/packages/template-builder/.releaserc.cjs +++ b/packages/template-builder/.releaserc.cjs @@ -6,10 +6,11 @@ const { /* * Release narrow: template-builder externalizes `superdoc` in its build, so a - * core change does not alter the published template-builder tarball - * (consumers get the new core via their own peerDependencies install). Only - * commits touching packages/template-builder/** should trigger a release. - * See .github/package-impact-map.md. + * core change inside the declared dependency/peer range does not alter the + * published template-builder tarball. Consumers pick up eligible core versions + * through package manager resolution. Only commits touching + * packages/template-builder/** should trigger a release. See + * .github/package-impact-map.md. */ const branch = process.env.GITHUB_REF_NAME || process.env.CI_COMMIT_BRANCH; diff --git a/packages/template-builder/package.json b/packages/template-builder/package.json index 8686683bd9..8693f6e966 100644 --- a/packages/template-builder/package.json +++ b/packages/template-builder/package.json @@ -46,6 +46,9 @@ ], "author": "SuperDoc Team", "license": "AGPL-3.0", + "dependencies": { + "superdoc": "^1.33.1" + }, "bugs": { "url": "https://github.com/superdoc-dev/superdoc/issues" }, @@ -53,7 +56,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "superdoc": "^1.31.1" + "superdoc": "^1.33.1" }, "devDependencies": { "@testing-library/jest-dom": "catalog:", @@ -66,7 +69,6 @@ "eslint-plugin-react-hooks": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "superdoc": "workspace:*", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-dts": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55ee1e4d6d..869ae1a9a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1847,7 +1847,7 @@ importers: dependencies: '@y/hub': specifier: ^0.2.8 - version: 0.2.18 + version: 0.2.15 '@y/y': specifier: ^14.0.0-rc.1 version: 14.0.0-rc.7 @@ -2398,6 +2398,10 @@ importers: version: 3.2.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/debug@4.1.13)(@types/node@25.6.0)(esbuild@0.27.7)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.3))(less@4.4.2)(sass@1.97.3)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) packages/esign: + dependencies: + superdoc: + specifier: workspace:* + version: link:../superdoc devDependencies: '@testing-library/jest-dom': specifier: 'catalog:' @@ -2432,9 +2436,6 @@ importers: react-dom: specifier: 'catalog:' version: 19.2.4(react@19.2.4) - superdoc: - specifier: workspace:* - version: link:../superdoc typescript: specifier: 'catalog:' version: 5.9.3 @@ -3161,6 +3162,10 @@ importers: version: 14.2.6 packages/template-builder: + dependencies: + superdoc: + specifier: workspace:* + version: link:../superdoc devDependencies: '@testing-library/jest-dom': specifier: 'catalog:' @@ -3195,9 +3200,6 @@ importers: react-dom: specifier: 'catalog:' version: 19.2.4(react@19.2.4) - superdoc: - specifier: workspace:* - version: link:../superdoc typescript: specifier: 'catalog:' version: 5.9.3 @@ -11525,8 +11527,8 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@y/hub@0.2.18': - resolution: {integrity: sha512-eVVPsSpZHzh7UcT8Abzac2BakJiOIbXaXbkc0OG66MfrAUVVPsisy/ACKui1uMh7HSGbuV9Lt9newMa+sJL3lA==} + '@y/hub@0.2.15': + resolution: {integrity: sha512-T7EpmyMIP2houhHBqx2AcZhz7jXsT55EHD7K/zhtupNtfSja3FEmycQ6Pyfoo826W7DVCQZg7ETm3BRdI1qzzQ==} engines: {node: '>=22.0.0', npm: '>=8.0.0'} hasBin: true @@ -11536,8 +11538,8 @@ packages: peerDependencies: '@y/y': '*' - '@y/y@14.0.0-rc.13': - resolution: {integrity: sha512-9wlH/0aooyHGtzeMdWydzzNV59bXW0YaFn31UM1t62nBHM4nXeE9zmH6pruV3qSVn2mS1Z7lGsqArHTr8kP+BQ==} + '@y/y@14.0.0-rc.10': + resolution: {integrity: sha512-4WtOOBDy74iJX5whMoFcCP5sxAYwoLOt74lVt/sFVXGROAPKiaOHN6kemkg3Ye81anXoFPtdqZ0oZT5J1nWEZw==} engines: {node: '>=22.0.0', npm: '>=8.0.0'} '@y/y@14.0.0-rc.7': @@ -16520,8 +16522,8 @@ packages: engines: {node: '>=16'} hasBin: true - lib0@1.0.0-rc.12: - resolution: {integrity: sha512-zCJU7AuEdpWEFCKXjbX5iWmHgUSc9xlIOehMfW/RrPxf27yZ7VxflAVMhBAkmwhci78MANpJkcHGcXW1pB23iQ==} + lib0@1.0.0-rc.10: + resolution: {integrity: sha512-kvtB8XIFzhTK4uKswr2dZjn2HvH8hIgv7LR8FHM6nD4SSAHXAApBe6g7pv3AW86FCItQtjD8Jjs3tSNWjPB8ew==} engines: {node: '>=16'} hasBin: true @@ -20167,7 +20169,6 @@ packages: rolldown-vite@7.3.1: resolution: {integrity: sha512-LYzdNAjRHhF2yA4JUQm/QyARyi216N2rpJ0lJZb8E9FU2y5v6Vk+xq/U4XBOxMefpWixT5H3TslmAHm1rqIq2w==} engines: {node: ^20.19.0 || >=22.12.0} - deprecated: Use this package to migrate from Vite 7 to Vite 8. For the most recent updates, migrate to Vite 8 once you're ready. hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 @@ -33901,11 +33902,11 @@ snapshots: '@xtuc/long@4.2.2': {} - '@y/hub@0.2.18': + '@y/hub@0.2.15': dependencies: - '@y/protocols': 1.0.6-rc.1(@y/y@14.0.0-rc.13) - '@y/y': 14.0.0-rc.13 - lib0: 1.0.0-rc.12 + '@y/protocols': 1.0.6-rc.1(@y/y@14.0.0-rc.10) + '@y/y': 14.0.0-rc.10 + lib0: 1.0.0-rc.10 minio: 8.0.7 pino: 10.3.1 postgres: 3.4.8 @@ -33914,18 +33915,18 @@ snapshots: transitivePeerDependencies: - '@node-rs/xxhash' - '@y/protocols@1.0.6-rc.1(@y/y@14.0.0-rc.13)': + '@y/protocols@1.0.6-rc.1(@y/y@14.0.0-rc.10)': dependencies: - '@y/y': 14.0.0-rc.13 - lib0: 1.0.0-rc.12 + '@y/y': 14.0.0-rc.10 + lib0: 1.0.0-rc.10 - '@y/y@14.0.0-rc.13': + '@y/y@14.0.0-rc.10': dependencies: - lib0: 1.0.0-rc.12 + lib0: 1.0.0-rc.10 '@y/y@14.0.0-rc.7': dependencies: - lib0: 1.0.0-rc.12 + lib0: 1.0.0-rc.10 '@yarnpkg/lockfile@1.1.0': {} @@ -39956,7 +39957,7 @@ snapshots: dependencies: isomorphic.js: 0.2.5 - lib0@1.0.0-rc.12: {} + lib0@1.0.0-rc.10: {} license-webpack-plugin@4.0.2(webpack@5.105.2(esbuild@0.27.3)): dependencies: @@ -46418,7 +46419,7 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 ts-interface-checker: 0.1.13 super-regex@1.1.0: diff --git a/scripts/__tests__/release-local.test.mjs b/scripts/__tests__/release-local.test.mjs index c9d40c80ab..52663494a3 100644 --- a/scripts/__tests__/release-local.test.mjs +++ b/scripts/__tests__/release-local.test.mjs @@ -299,6 +299,7 @@ test('stable release workflows serialize on the shared release-stable concurrenc `${file}: stable releases are driven by release-stable.yml; this workflow only fires on main`, ); } +<<<<<<< HEAD }); test('stable-to-main sync waits for stable release completion', async () => { @@ -370,6 +371,8 @@ test('stable-to-main sync preserves stable release ancestry', async () => { workflow.includes("This PR must be merged with GitHub's merge-commit option"), '.github/workflows/sync-patches.yml: generated PRs must warn reviewers not to squash away stable ancestry', ); +======= +>>>>>>> origin/stable }); test('MCP releaserc builds the package before publish so the tarball ships dist/', async () => { diff --git a/tests/behavior/tests/toolbar/alignment-mixed-direction.spec.ts b/tests/behavior/tests/toolbar/alignment-mixed-direction.spec.ts new file mode 100644 index 0000000000..bfc5d1e195 --- /dev/null +++ b/tests/behavior/tests/toolbar/alignment-mixed-direction.spec.ts @@ -0,0 +1,33 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { test, type SuperDocFixture } from '../../fixtures/superdoc.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const DOC = path.resolve(__dirname, 'fixtures/mixed-ltr-rtl-alignment-repro.docx'); + +test.use({ config: { toolbar: 'full', showSelection: true } }); + +async function clickAlignment(superdoc: SuperDocFixture, ariaLabel: string): Promise { + await superdoc.page.locator('[data-item="btn-textAlign"]').click(); + await superdoc.waitForStable(); + await superdoc.page.locator(`[data-item="btn-textAlign-option"][aria-label="${ariaLabel}"]`).click(); + await superdoc.waitForStable(); +} + +test('Align Left across mixed LTR/RTL paragraphs maps stored justification per paragraph', async ({ superdoc }) => { + await superdoc.loadDocument(DOC); + await superdoc.waitForStable(); + + await superdoc.page.evaluate(() => { + const editor = (window as any).editor; + const docSize = editor.state.doc.content.size; + editor.commands.setTextSelection({ from: 1, to: docSize - 1 }); + }); + await superdoc.waitForStable(); + + await clickAlignment(superdoc, 'Align left'); + await superdoc.waitForStable(); + + await superdoc.assertTextAlignment('LTR CENTER paragraph', 'left'); + await superdoc.assertTextAlignment('RTL CENTER paragraph', 'right'); +}); diff --git a/tests/behavior/tests/toolbar/fixtures/mixed-ltr-rtl-alignment-repro.docx b/tests/behavior/tests/toolbar/fixtures/mixed-ltr-rtl-alignment-repro.docx new file mode 100644 index 0000000000..14ea316b05 Binary files /dev/null and b/tests/behavior/tests/toolbar/fixtures/mixed-ltr-rtl-alignment-repro.docx differ