@reviseio/engine 0.0.0-stage → 3.0.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.
Files changed (78) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/FONT-LICENSE-HAN-EXT-B.txt +91 -0
  3. package/FONT-LICENSE-KATEX.txt +95 -0
  4. package/FONT-LICENSE-LIBERATION.txt +102 -0
  5. package/FONT-LICENSE-NOTO-MULTILINGUAL.txt +93 -0
  6. package/FONT-LICENSE-NOTO-SANS-SC.txt +93 -0
  7. package/FONT-LICENSE-NOTO.txt +94 -0
  8. package/FONT-LICENSE-SOURCE-CODE-PRO.txt +94 -0
  9. package/FONT-LICENSE-SOURCE-SERIF-4.txt +93 -0
  10. package/LICENSE +141 -0
  11. package/README.md +11 -2
  12. package/THIRD-PARTY-NOTICES.md +3376 -0
  13. package/assets/historyMaterializeWorker-Kl0syEbc.js +618 -0
  14. package/chunks/AgentHtmlConverter-CnnB8-WI.js +379 -0
  15. package/chunks/AgentPageRenderViews-BTLjPZJQ.js +2 -0
  16. package/chunks/AgentPageRenderer-DLgUGrGy.js +180 -0
  17. package/chunks/BidiText-Bkp4Y90s.js +160 -0
  18. package/chunks/BlockDiff-B6-aJxHo.js +42 -0
  19. package/chunks/CanvasRenderer-C1Vegx9Y.js +110 -0
  20. package/chunks/ColorParserFull-BKH72fK8.js +446 -0
  21. package/chunks/DocumentCompare-C8295s35.js +6 -0
  22. package/chunks/DocumentLayout-CsU5MR-3.js +12 -0
  23. package/chunks/DocumentLayoutEngine-C62pyGVf.js +218 -0
  24. package/chunks/DocumentMutator-Bat_oLBQ.js +13 -0
  25. package/chunks/DocumentScrubber-BZQn_z92.js +21 -0
  26. package/chunks/DocumentSession-BDcazSEv.js +1 -0
  27. package/chunks/DocumentStylesheet-CEEt18sr.js +7 -0
  28. package/chunks/DocxConverter-BC31uYIL.js +1236 -0
  29. package/chunks/DocxGraft-L10HXM3U.js +8 -0
  30. package/chunks/HorizontalRuleOrnaments-gmUZ3R7Q.js +3 -0
  31. package/chunks/HtmlConverter-C5ihhZ6G.js +267 -0
  32. package/chunks/ListNumbering-Qlu6AuRZ.js +23 -0
  33. package/chunks/MarkdownConverter-DofaSeC4.js +57 -0
  34. package/chunks/MathRenderer-Bz9WEVvF.js +68 -0
  35. package/chunks/OdtConverter-c1fTWoAt.js +125 -0
  36. package/chunks/OfficeImportShared-CrOpHpJ-.js +30 -0
  37. package/chunks/PageNumeralFonts-BWzI061X.js +5 -0
  38. package/chunks/ParagraphDiffAnalysis-DrmStvmz.js +36 -0
  39. package/chunks/PdfConverter-DX7fsRH5.js +457 -0
  40. package/chunks/RtfConverter-hbJ2529G.js +186 -0
  41. package/chunks/TableBorders-DVhdvo6f.js +32 -0
  42. package/chunks/TableGrid-DbroRucl.js +12 -0
  43. package/chunks/TextDecoding-IPbuUqcC.js +2 -0
  44. package/chunks/TextFileDecoder-BZBBejlR.js +10 -0
  45. package/chunks/TxtConverter-YHv5FXWb.js +14 -0
  46. package/chunks/Typography-B4gndEdB.js +28 -0
  47. package/chunks/UnicodeUtils-CXtusU4g.js +10 -0
  48. package/chunks/XmlConverter-BRRluy9k.js +55 -0
  49. package/chunks/_commonjsHelpers-DaMA6jEr.js +2 -0
  50. package/chunks/_revise-sdk-lazy-harfbuzz-CDWdjF9f.js +1 -0
  51. package/chunks/base64-Di1bxoXD.js +1 -0
  52. package/chunks/browser-module-CFmqfGkE.js +1791 -0
  53. package/chunks/bundle.min-DRpfgV69.js +782 -0
  54. package/chunks/capture-i_dPkQIS.js +11 -0
  55. package/chunks/carrier-pYM9xf6x.js +6 -0
  56. package/chunks/chromeImageLayout-BiQ3Iz1-.js +18 -0
  57. package/chunks/engine-LMUnxdm2.js +520 -0
  58. package/chunks/footnoteFlatten-EE85Hjre.js +6 -0
  59. package/chunks/graftExport-G-dG7Vcc.js +104 -0
  60. package/chunks/html2canvas.esm-CntiHiYW.js +997 -0
  61. package/chunks/index-BLb10wQt.js +1002 -0
  62. package/chunks/index-BWdRWxoH.js +1807 -0
  63. package/chunks/index.es-CI0QPo8w.js +780 -0
  64. package/chunks/jspdf.es.min-DU74zN8b.js +1792 -0
  65. package/chunks/jszip.min-CPW0h1Kx.js +476 -0
  66. package/chunks/katex-DWj8TvwO.js +1462 -0
  67. package/chunks/pdf-BLWDCiFF.js +1828 -0
  68. package/chunks/purify.es-BwLardii.js +107 -0
  69. package/chunks/serverDocumentSession-DGDU5Lh3.js +1011 -0
  70. package/chunks/signatures-DTNDS2PH.js +21 -0
  71. package/chunks/suggestionAuthorship-B-IuLQlE.js +1 -0
  72. package/chunks/web-tree-sitter-BXGZGnNj.js +2 -0
  73. package/chunks/xmlScan-DXjt2cTS.js +8 -0
  74. package/engine.d.ts +179 -0
  75. package/engine.js +3 -0
  76. package/package.json +64 -4
  77. package/serverToolContract.d.ts +420 -0
  78. package/serverToolInputs.generated.d.ts +264 -0
@@ -0,0 +1,21 @@
1
+ import{r as d,ad as A,a7 as k,bh as x,bi as S}from"./engine-LMUnxdm2.js";const c=2;function s(e){return e===null||typeof e!="object"?JSON.stringify(e)??"null":Array.isArray(e)?`[${e.map(s).join(",")}]`:
2
+ `{${Object.entries(e).filter(([,r])=>r!==void 0).sort(([r],[t])=>r<t?-1:r>t?1:0).map(([r,t])=>`${JSON.stringify(r)}:${s(t)}`).join(",")}}`}function i(e,r=c){if(e===null||typeof e!="object")return e;if(Array.
3
+ isArray(e))return e.map(o=>i(o,r));const t=e;if(t.type==="text")return{...t,marks:(r===1?x:S)(t.marks)};const n={};for(const[o,a]of Object.entries(t))o==="indentLevel"&&t.type==="list-item"&&!a||o==="\
4
+ hasHeader"&&t.type==="table"&&!a||o==="footnoteNumber"&&t.type==="footnote"||(n[o]=i(a,r));if(Array.isArray(n.children)){const o=[];for(const a of n.children){const f=o[o.length-1];if(f&&f.type==="tex\
5
+ t"&&a.type==="text"&&s(f.marks)===s(a.marks)){f.text=`${f.text}${a.text}`;continue}o.push(a)}n.children=o}return n}function u(e){return`${b(e,0).toString(36)}-${b(e,2654435769).toString(36)}`}function b(e,r){
6
+ let t=3735928559^r,n=1103547991^r;for(let o=0;o<e.length;o++){const a=e.charCodeAt(o);t=Math.imul(t^a,2654435761),n=Math.imul(n^a,1597334677)}return t=Math.imul(t^t>>>16,2246822507),t^=Math.imul(n^n>>>
7
+ 13,3266489909),n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(t^t>>>13,3266489909),4294967296*(2097151&n)+(t>>>0)}function j(e,r=c){return s(i(e,r))}function $(e,r=c){return u(j(e,r))}function O(e){const{
8
+ showPageNumbers:r,...t}=d(e.pageLayout);return u(s(t))}function v(e){const r=d(e.pageLayout);return[!0,!1].map(t=>u(s({...r,showPageNumbers:t})))}function p(e){if(e===null||typeof e!="object")return e;
9
+ if(Array.isArray(e))return e.map(p);const r=e;if(r.type==="text"&&r.marks&&typeof r.marks=="object"&&"fontFamily"in r.marks){const n={...r.marks};return delete n.fontFamily,{...r,marks:n}}const t={};for(const[
10
+ n,o]of Object.entries(r))t[n]=p(o);return t}function M(e,r=c){const t=[...e.children.filter(n=>n.type==="footnote"),...e.notes??[]];return u(s(t.map(n=>i(p(n),r))))}function m(e){if(e===null||typeof e!=
11
+ "object")return e;if(Array.isArray(e))return e.map(m);const r={};for(const[t,n]of Object.entries(e))t!=="id"&&(r[t]=m(n));return r}function L(e,r=c){let t=[...e.children.filter(n=>n.type==="header-foo\
12
+ ter"),...e.chrome??[]];return t.length===0&&(e.headers||e.footers)&&(t=k(e.headers,e.footers)),u(s(i({blocks:t.map(n=>m(n)),watermark:e.watermark??null,chromeImages:e.chromeImages??[]},r)))}function N(e,r=c){
13
+ const t=n=>[...n].sort((o,a)=>{const f=s(i(o,r)),g=s(i(a,r));return f<g?-1:f>g?1:0});return u(s(i({sdtWrappers:t(e.sdtWrappers??[]),oxmlRanges:t(e.oxmlRanges??[])},r)))}function I(e,r=c){return u(s(i(
14
+ {stylesXml:e.stylesXml??null,stylesheet:e.stylesheet??null},r)))}function y(e){if(e===null||typeof e!="object")return!1;if(Array.isArray(e))return e.some(y);const r=e;if(r.type==="toc")return!0;const t=r.
15
+ marks;return t&&typeof t=="object"&&typeof t.fieldInstr=="string"?!0:Object.values(r).some(y)}function R(e){const r=[...e.children.filter(n=>n.type==="header-footer"),...e.chrome??[]],t=!!(e.headers?.
16
+ even||e.footers?.even)||r.some(n=>n.slot==="even"&&A(n));return u(s({autoHyphenation:d(e.pageLayout).hyphenationEnabled,evenAndOddHeaders:t,updateFields:y(e.children)}))}function w(e,r=c){return u(s([
17
+ ...e.comments??[]].sort((t,n)=>t.id<n.id?-1:t.id>n.id?1:0).map(t=>i(t,r))))}function F(e){return u(s(e.coreProperties??{}))}const H=["structuralSuggestionRecords","structuralSuggestionRecord","structu\
18
+ ralSuggestionLabel","diffState","suggestionId"];function l(e,r=c){const t={...e,children:[]};for(const n of H)delete t[n];return u(s(i(t,r)))}function h(e,r=c){return u(s(i(e,r)))}function P(e,r=c){const t={};
19
+ for(const n of e.children)if(n.id){if(n.type==="paragraph"){t[n.id]={head:l(n,r),parts:[]};continue}n.type!=="table"&&n.type!=="list"||(t[n.id]={head:l(n,r),parts:n.children.map(o=>({id:o.id??"",signature:h(
20
+ o,r),...n.type==="list"?{head:l(o,r)}:{},...n.type==="table"?{head:l(o,r),cells:(o.children??[]).map(a=>({id:a.id??"",signature:h(a,r)}))}:{}}))})}return t}export{c as C,j as a,$ as b,N as c,R as d,I as e,
21
+ L as f,w as g,F as h,i,s as j,h as k,l,v as m,M as n,P as o,O as p,u as s};
@@ -0,0 +1 @@
1
+ const s="Revise Agent",e="Anonymous";function o(t){const n=t?.trim();return!n||n===s}export{e as A,s as R,o as i};
@@ -0,0 +1,2 @@
1
+ class e{constructor(t){this.endIndex=t,this.childCount=0,this.startIndex=0,this.parent=null,this.type="text"}child(){return this}}class s{static async load(){return new s}}class n{static async init(){}setLanguage(){}parse(t){
2
+ return{rootNode:new e(t.length)}}}export{s as Language,n as Parser};
@@ -0,0 +1,8 @@
1
+ function g(t,r,i=0){const n=h(t,r,i);if(n<0)throw new Error(`graft: <${r}> not found`);const e=d(t,n);if(t[e-2]==="/")return{open:{tag:r,start:n,end:e},contentStart:e,contentEnd:e,children:[]};const f=[];
2
+ let s=e;for(;;){const o=t.indexOf("<",s);if(o<0)throw new Error(`graft: unterminated <${r}>`);if(t.startsWith("<!--",o)){const c=t.indexOf("-->",o);if(c<0)throw new Error("graft: unterminated comment");
3
+ s=c+3;continue}if(t[o+1]==="/"){const c=t.indexOf(">",o),u=t.slice(o+2,c).trim();if(u!==r)throw new Error(`graft: unexpected </${u}> inside <${r}>`);return{open:{tag:r,start:n,end:e},contentStart:e,contentEnd:o,
4
+ children:f}}const a=l(t,o);f.push(a),s=a.end}}function l(t,r){const i=d(t,r),n=t.slice(r+1,i).search(/[\s/>]/),e=t.slice(r+1,r+1+n);if(t[i-2]==="/")return{tag:e,start:r,end:i};let f=1,s=i;for(;f>0;){const o=t.
5
+ indexOf("<",s);if(o<0)throw new Error(`graft: unterminated <${e}>`);if(t.startsWith("<!--",o)){const c=t.indexOf("-->",o);if(c<0)throw new Error("graft: unterminated comment");s=c+3;continue}const a=d(
6
+ t,o);t[o+1]==="/"?(f--,s=a):(t[a-2]==="/"||f++,s=a)}return{tag:e,start:r,end:s}}function d(t,r){let i=r+1,n=null;for(;i<t.length;){const e=t[i];if(n)e===n&&(n=null);else if(e==='"'||e==="'")n=e;else if(e===
7
+ ">")return i+1;i++}throw new Error("graft: unterminated tag")}function h(t,r,i){const n=`<${r}`;let e=t.indexOf(n,i);for(;e>=0;){const f=t[e+n.length];if(f===" "||f===">"||f==="/"||f===" "||f===`
8
+ `||f==="\r")return e;e=t.indexOf(n,e+1)}return-1}export{d as endOfTag,h as findOpenTag,l as scanElement,g as scanElementChildren};
package/engine.d.ts ADDED
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @reviseio/engine: Revise's headless document engine. Node only.
3
+ *
4
+ * Most programs want `revise` (the MIT CLI and library built on it):
5
+ * https://revise.io/developer/docs
6
+ *
7
+ * Peer dependencies: `yjs` (one copy, shared with anything else that touches
8
+ * the document) and `jsdom` (the converters parse XML and HTML with DOM
9
+ * APIs).
10
+ */
11
+ import type { Doc } from "yjs";
12
+ import type {
13
+ ServerDocumentSession,
14
+ ServerDocumentSessionOptions,
15
+ } from "./serverToolContract.js";
16
+
17
+ /** Revise's document model. Opaque here — convert rather than inspect. */
18
+ export interface ReviseDocument {
19
+ type: "doc";
20
+ children: unknown[];
21
+ [key: string]: unknown;
22
+ }
23
+
24
+ /** Formats readable on the server. PDF and images are browser-only. */
25
+ export type ReviseServerFormat =
26
+ | "docx"
27
+ | "odt"
28
+ | "rtf"
29
+ | "markdown"
30
+ | "txt"
31
+ | "html";
32
+
33
+ /** Top-level keys the editor owns inside a shared document. */
34
+ export declare const RESERVED_DOCUMENT_KEYS: readonly string[];
35
+
36
+ /** A document built with the settings the editor requires. */
37
+ export declare function createReviseYDoc(): Doc;
38
+
39
+ /** Throws if a document already uses the editor's reserved keys for
40
+ * something else. */
41
+ export declare function assertUsableSharedDocument(ydoc: Doc): void;
42
+
43
+ /** Install the DOM globals the converters need. Called for you by everything
44
+ * here; exported for hosts importing converters directly. */
45
+ export declare function installDomShims(): Promise<void>;
46
+
47
+ /** Parse .docx, .odt, .rtf, .md, .txt, or .html into the document model. */
48
+ export declare function parseDocument(
49
+ bytes: Uint8Array,
50
+ filename: string,
51
+ ): Promise<ReviseDocument>;
52
+
53
+ /** Serialize the document model back to .docx bytes. With `originalDocx`
54
+ * (the file this document was imported from), untouched content exports
55
+ * byte-for-byte via graft mode; any graft-proof failure falls back to full
56
+ * regeneration. */
57
+ export declare function documentToDocx(
58
+ doc: ReviseDocument,
59
+ options?: { originalDocx?: Uint8Array },
60
+ ): Promise<Uint8Array>;
61
+
62
+ /** Build a room's Yjs document from a file — server-side document creation,
63
+ * so every client simply joins. */
64
+ export declare function fileToYDoc(
65
+ bytes: Uint8Array,
66
+ filename: string,
67
+ ): Promise<Doc>;
68
+
69
+ /** Seed an empty room from a file. Returns false when it already had
70
+ * content, so it is safe to call on every connection — including under a
71
+ * connect race: every seed records a claim, and a room two peers both
72
+ * seeded before syncing is repaired deterministically (on the next call
73
+ * here, or by any live editor session the moment the claims merge). */
74
+ export declare function seedYDocFromFile(
75
+ ydoc: Doc,
76
+ bytes: Uint8Array,
77
+ filename: string,
78
+ ): Promise<boolean>;
79
+
80
+ export interface SeedRaceRepairResult {
81
+ /** Losing seed claims removed. */
82
+ losingClaims: number;
83
+ /** Top-level body blocks removed. */
84
+ removedBlocks: number;
85
+ }
86
+
87
+ /** Detect and repair a double-seed connect race: keep the deterministic
88
+ * winner and delete everything the losing seeds created. Idempotent and
89
+ * convergent — safe on any peer, at any time; null when there is nothing
90
+ * to repair. Editor sessions run this automatically. */
91
+ export declare function repairSeedRace(
92
+ ydoc: Doc,
93
+ ): SeedRaceRepairResult | null;
94
+
95
+ /** Read a room back as the document model. */
96
+ export declare function ydocToDocument(ydoc: Doc): ReviseDocument;
97
+
98
+ /** Export a room straight to .docx. A DOCX-imported room carries its
99
+ * original file inside the document; untouched content exports
100
+ * byte-for-byte. */
101
+ export declare function ydocToDocx(ydoc: Doc): Promise<Uint8Array>;
102
+
103
+ /** Formats `exportDocument` produces on the server. PDF needs a browser;
104
+ * use `tools.export` in the editor. */
105
+ export type ReviseServerExportFormat = "docx" | "html" | "markdown" | "txt";
106
+
107
+ export interface ReviseServerExportOptions {
108
+ format?: ReviseServerExportFormat;
109
+ /** "review" (default) keeps pending tracked changes and comments in a
110
+ * .docx; other formats show the text with changes accepted. "final"
111
+ * accepts every pending change and drops comments first. */
112
+ mode?: "review" | "final";
113
+ /** Document title, used by the HTML export's <title>. */
114
+ title?: string;
115
+ }
116
+
117
+ /** Export a room or a parsed document as a file. A room in review mode
118
+ * keeps DOCX mode (untouched content leaves as the original bytes); a final
119
+ * copy is always regenerated. */
120
+ export declare function exportDocument(
121
+ source: Doc | ReviseDocument,
122
+ options?: ReviseServerExportOptions,
123
+ ): Promise<Uint8Array>;
124
+
125
+ /** DOCX-mode fidelity for a room: "exact" (export reproduces the original
126
+ * file byte-for-byte), "grafted" (original + this document's edits), or
127
+ * "converted" (no usable original; export regenerates). */
128
+ export declare function ydocSourceFidelity(ydoc: Doc): Promise<{
129
+ fidelity: "exact" | "grafted" | "converted";
130
+ regeneratedBlockIds: string[];
131
+ changedDomains: string[];
132
+ convertedReason?:
133
+ | "no-capture"
134
+ | "no-carrier"
135
+ | "carrier-hash-mismatch"
136
+ | "unpaired-capture";
137
+ }>;
138
+
139
+ /** Whether a room already holds a Revise document. */
140
+ export declare function hasDocument(ydoc: Doc): boolean;
141
+
142
+ /** The whole room as one update, for storage. */
143
+ export declare function encodeYDoc(ydoc: Doc): Uint8Array;
144
+
145
+ /** Restore a room from stored bytes. */
146
+ export declare function decodeYDoc(update: Uint8Array): Doc;
147
+
148
+ export type * from "./serverToolContract.js";
149
+
150
+ export declare class ReviseToolError<Name extends string = string> extends Error {
151
+ readonly failure: import("./serverToolContract.js").ReviseToolFailure<Name>;
152
+ readonly callId: string;
153
+ readonly tool: Name;
154
+ readonly code: string;
155
+ constructor(failure: import("./serverToolContract.js").ReviseToolFailure<Name>);
156
+ }
157
+
158
+ /** Bind the canonical deterministic semantic tools to a host-owned Y.Doc.
159
+ * Async: the tool session's mutation engine is loaded on first use, so
160
+ * conversion-only hosts never pay for it. */
161
+ export declare function createServerDocumentSession(
162
+ ydoc: Doc,
163
+ options: ServerDocumentSessionOptions,
164
+ ): Promise<ServerDocumentSession>;
165
+
166
+ export type { ReviseToolName } from "./serverToolInputs.generated.js";
167
+ /** The document model, as `parseDocument` returns it. */
168
+ export type DocRoot = ReviseDocument;
169
+ /** One block of the document model. */
170
+ export interface BlockNode {
171
+ type: string;
172
+ id?: string;
173
+ [key: string]: unknown;
174
+ }
175
+ /** Seed an empty Y.Doc with a document, recording the claim that lets
176
+ * concurrent seeds be repaired. */
177
+ export declare function seedDocRootWithClaim(ydoc: Doc, doc: ReviseDocument): void;
178
+ /** @internal Lazy loaders the `revise` library uses. Not a stable API. */
179
+ export declare const engineModules: Record<string, () => Promise<any>>;
package/engine.js ADDED
@@ -0,0 +1,3 @@
1
+ import{bT as s,bU as a,bV as e,bW as o,bX as c,bS as t,bY as i,bZ as D,j as m,b_ as r,c2 as b,b$ as d,c0 as n,c1 as l}from"./chunks/engine-LMUnxdm2.js";export{s as createReviseYDoc,a as createServerDocumentSession,
2
+ e as decodeYDoc,o as documentToDocx,c as encodeYDoc,t as engineModules,i as exportDocument,D as fileToYDoc,m as installDomShims,r as parseDocument,b as seedDocRootWithClaim,d as seedYDocFromFile,n as ydocSourceFidelity,
3
+ l as ydocToDocument};
package/package.json CHANGED
@@ -1,6 +1,66 @@
1
1
  {
2
2
  "name": "@reviseio/engine",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "3.0.1",
4
+ "reviseBuild": "7ef88f310",
5
+ "description": "Revise's headless document engine: Word-faithful import and export, tracked changes, comments, layout, and agent tools. Free to use; the `revise` package is the API.",
6
+ "keywords": [
7
+ "docx",
8
+ "word",
9
+ "document",
10
+ "tracked-changes",
11
+ "redlines"
12
+ ],
13
+ "type": "module",
14
+ "main": "./engine.js",
15
+ "module": "./engine.js",
16
+ "types": "./engine.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./engine.d.ts",
20
+ "import": "./engine.js"
21
+ },
22
+ "./package.json": "./package.json"
23
+ },
24
+ "files": [
25
+ "engine.js",
26
+ "engine.d.ts",
27
+ "serverToolContract.d.ts",
28
+ "serverToolInputs.generated.d.ts",
29
+ "chunks",
30
+ "assets",
31
+ "README.md",
32
+ "CHANGELOG.md",
33
+ "LICENSE",
34
+ "THIRD-PARTY-NOTICES.md",
35
+ "FONT-LICENSE-HAN-EXT-B.txt",
36
+ "FONT-LICENSE-KATEX.txt",
37
+ "FONT-LICENSE-LIBERATION.txt",
38
+ "FONT-LICENSE-NOTO-MULTILINGUAL.txt",
39
+ "FONT-LICENSE-NOTO-SANS-SC.txt",
40
+ "FONT-LICENSE-NOTO.txt",
41
+ "FONT-LICENSE-SOURCE-CODE-PRO.txt",
42
+ "FONT-LICENSE-SOURCE-SERIF-4.txt"
43
+ ],
44
+ "sideEffects": false,
45
+ "dependencies": {
46
+ "jsdom": "^26.1.0",
47
+ "y-protocols": "^1.0.6"
48
+ },
49
+ "peerDependencies": {
50
+ "yjs": "^13.6.0"
51
+ },
52
+ "engines": {
53
+ "node": ">=20"
54
+ },
55
+ "license": "SEE LICENSE IN LICENSE",
56
+ "homepage": "https://revise.io/developer/docs",
57
+ "bugs": {
58
+ "email": "sdk@revise.io"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public"
62
+ },
63
+ "scripts": {
64
+ "prepublishOnly": "node -e \"if(process.env.REVISE_SDK_VERIFIED_PUBLISH!=='1'){console.error('Refusing to publish: use the audited publish in frontend/ (verify-sdk-tarball.mjs --publish).');process.exit(1)}\""
65
+ }
66
+ }