@psrt/sdk 0.1.0 → 0.1.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @psrt/sdk
2
2
 
3
- Stateless PSRT SDK powered by WebAssembly (Go core).
3
+ TypeScript library for parsing, editing, and compiling PSRT documents.
4
4
 
5
5
  ## Install
6
6
 
@@ -10,28 +10,67 @@ npm install @psrt/sdk
10
10
 
11
11
  ## Usage
12
12
 
13
+ Call `initPsrt()` once at startup, then use the API:
14
+
13
15
  ```typescript
14
- import { initPsrt, parse, compileToHtml, adaptEntriesForWeb } from '@psrt/sdk'
16
+ import { readFileSync } from 'node:fs'
17
+ import { initPsrt, parse, compileToHtml, compileToSvg } from '@psrt/sdk'
15
18
 
16
- await initPsrt('/path/to/psrt.wasm')
19
+ await initPsrt()
17
20
 
21
+ const psrtString = readFileSync('document.psrt', 'utf8')
18
22
  const doc = parse(psrtString)
23
+
19
24
  const html = compileToHtml(doc)
20
- const styles = adaptEntriesForWeb(JSON.stringify(entries), 800, 600, 1)
25
+ const svg = compileToSvg(doc, doc.pages[0]!.name)
21
26
  ```
22
27
 
23
- ## Browser (Vite)
28
+ `initPsrt()` is idempotent — safe to call more than once, but one call at app entry is enough.
24
29
 
25
- Copy `wasm/psrt.wasm` and `wasm/wasm_exec.js` to your `public/` folder, then:
30
+ ## Editor (fluent API)
26
31
 
27
32
  ```typescript
28
- await initPsrt(`${import.meta.env.BASE_URL}wasm/psrt.wasm`)
33
+ import { initPsrt, parse, stringify, transform } from '@psrt/sdk'
34
+
35
+ await initPsrt()
36
+
37
+ const doc = parse(psrtString)
38
+ const pageName = doc.pages[0]!.name
39
+
40
+ const updated = transform(doc)
41
+ .addText(pageName, {
42
+ x: 10,
43
+ y: 20,
44
+ width: 100,
45
+ textSize: 2,
46
+ index: 1,
47
+ content: 'Hello',
48
+ style: {},
49
+ })
50
+ .build()
51
+
52
+ const out = stringify(updated)
53
+ ```
54
+
55
+ ## Live preview styles
56
+
57
+ ```typescript
58
+ import { initPsrt, adaptEntriesForWeb } from '@psrt/sdk'
59
+
60
+ await initPsrt()
61
+
62
+ const styles = adaptEntriesForWeb(entriesJSON, canvasWidth, canvasHeight, zoom)
29
63
  ```
30
64
 
31
65
  ## Exports
32
66
 
33
- - **I/O:** `parse`, `stringify`, `formatDocument`, `resolveDocument`
67
+ - **Init:** `initPsrt`
68
+ - **I/O:** `parse`, `stringify`, `formatDocument`, `resolveDocument`, `resolveDocumentStrict`
34
69
  - **Compile:** `compileToHtml`, `compileToSvg`
35
- - **Preview:** `adaptEntriesForWeb`
70
+ - **Preview:** `adaptEntriesForWeb`, `formatPageDocumentJSON`, `mergePageDocumentPSRT`
36
71
  - **Editor:** `addText`, `setTextContent`, `transform`, …
37
72
  - **Types:** `PsrtDocument`, `Document`, `Page`, `TextBlock`, …
73
+
74
+ ## React
75
+
76
+ See [@psrt/react-image](../react-image/README.md). Call `initPsrt()` once in your app entry before rendering.
package/dist/index.cjs CHANGED
@@ -72,8 +72,12 @@ __export(index_exports, {
72
72
  });
73
73
  module.exports = __toCommonJS(index_exports);
74
74
 
75
+ // src/runtime/boot.ts
76
+ var import_node_fs = require("fs");
77
+ var import_node_path = require("path");
78
+ var import_node_url = require("url");
79
+
75
80
  // src/wasm.ts
76
- var import_meta = {};
77
81
  var decoder = new TextDecoder();
78
82
  var encoder = new TextEncoder();
79
83
  var wasmExports = null;
@@ -100,21 +104,21 @@ function encodeArg(arg) {
100
104
  }
101
105
  function call(name, ...args) {
102
106
  if (!wasmExports) {
103
- throw new Error("PSRT WASM not initialized; call initPsrt() first");
107
+ throw new Error("PSRT is not initialized; call initPsrt() first");
104
108
  }
105
109
  const fn = wasmExports[name];
106
110
  if (!fn) {
107
- throw new Error(`unknown WASM handler: ${name}`);
111
+ throw new Error(`unknown PSRT handler: ${name}`);
108
112
  }
109
113
  const encoded = args.map(encodeArg);
110
114
  return fn(...encoded);
111
115
  }
112
116
  function requireBytes(result) {
113
117
  if (!result.ok) {
114
- throw new Error(result.err ?? "WASM call failed");
118
+ throw new Error(result.err ?? "PSRT call failed");
115
119
  }
116
120
  if (!result.data) {
117
- throw new Error("WASM call returned no data");
121
+ throw new Error("PSRT call returned no data");
118
122
  }
119
123
  return result.data;
120
124
  }
@@ -160,34 +164,31 @@ function invokeCompileToSvg(input, pageName, options) {
160
164
  function wireWasmFromGlobal() {
161
165
  const exp = globalThis.psrtWasm;
162
166
  if (!exp) {
163
- throw new Error("psrtWasm exports not found on globalThis");
167
+ throw new Error("PSRT core exports not found");
164
168
  }
165
169
  wasmExports = exp;
166
170
  }
167
- async function initPsrt(wasmUrl) {
168
- if (wasmExports) {
169
- return;
170
- }
171
- if (globalThis.psrtWasm) {
172
- wireWasmFromGlobal();
173
- return;
174
- }
175
- await loadWasmExec();
176
- const go = new Go();
177
- const url = wasmUrl ?? new URL("../wasm/psrt.wasm", import_meta.url).href;
178
- const response = await fetch(url);
179
- if (!response.ok) {
180
- throw new Error(`failed to fetch WASM: ${response.status}`);
181
- }
182
- const bytes = await response.arrayBuffer();
183
- const { instance } = await WebAssembly.instantiate(bytes, go.importObject);
184
- void go.run(instance);
185
- await waitForExports();
186
- const exp = globalThis.psrtWasm;
187
- if (!exp) {
188
- throw new Error("psrtWasm exports not found after WASM init");
189
- }
190
- wasmExports = exp;
171
+
172
+ // src/runtime/boot.ts
173
+ var import_meta = {};
174
+ var bootPromise = null;
175
+ function isNodeRuntime() {
176
+ return typeof process !== "undefined" && Boolean(process.versions?.node);
177
+ }
178
+ function wasmDir() {
179
+ let dir = (0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(import_meta.url));
180
+ for (; ; ) {
181
+ const candidate = (0, import_node_path.join)(dir, "wasm", "psrt.wasm");
182
+ if ((0, import_node_fs.existsSync)(candidate)) {
183
+ return (0, import_node_path.join)(dir, "wasm");
184
+ }
185
+ const parent = (0, import_node_path.dirname)(dir);
186
+ if (parent === dir) {
187
+ break;
188
+ }
189
+ dir = parent;
190
+ }
191
+ throw new Error("PSRT core binary not found");
191
192
  }
192
193
  function waitForExports() {
193
194
  return new Promise((resolve, reject) => {
@@ -199,7 +200,7 @@ function waitForExports() {
199
200
  }
200
201
  attempts++;
201
202
  if (attempts > 200) {
202
- reject(new Error("timeout waiting for psrtWasm exports"));
203
+ reject(new Error("timeout loading PSRT core"));
203
204
  return;
204
205
  }
205
206
  setTimeout(tick, 10);
@@ -207,15 +208,51 @@ function waitForExports() {
207
208
  tick();
208
209
  });
209
210
  }
210
- async function loadWasmExec() {
211
+ async function loadGoRuntime() {
211
212
  if (typeof globalThis.Go !== "undefined") {
212
213
  return;
213
214
  }
214
- const scriptUrl = new URL("../wasm/wasm_exec.js", import_meta.url).href;
215
- await import(
216
- /* @vite-ignore */
217
- scriptUrl
218
- );
215
+ const scriptPath = (0, import_node_path.join)(wasmDir(), "wasm_exec.js");
216
+ await import((0, import_node_url.pathToFileURL)(scriptPath).href);
217
+ }
218
+ async function loadCoreBytes() {
219
+ if (isNodeRuntime()) {
220
+ const bytes = (0, import_node_fs.readFileSync)((0, import_node_path.join)(wasmDir(), "psrt.wasm"));
221
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
222
+ }
223
+ const url = new URL("../../wasm/psrt.wasm", import_meta.url).href;
224
+ const response = await fetch(url);
225
+ if (!response.ok) {
226
+ throw new Error(`failed to load PSRT core (${response.status})`);
227
+ }
228
+ return response.arrayBuffer();
229
+ }
230
+ async function startCore(bytes) {
231
+ await loadGoRuntime();
232
+ const go = new Go();
233
+ const { instance } = await WebAssembly.instantiate(bytes, go.importObject);
234
+ void go.run(instance);
235
+ await waitForExports();
236
+ wireWasmFromGlobal();
237
+ }
238
+ async function bootCore() {
239
+ if (bootPromise) {
240
+ return bootPromise;
241
+ }
242
+ if (globalThis.psrtWasm) {
243
+ wireWasmFromGlobal();
244
+ return;
245
+ }
246
+ bootPromise = (async () => {
247
+ const bytes = await loadCoreBytes();
248
+ await startCore(bytes);
249
+ })();
250
+ return bootPromise;
251
+ }
252
+
253
+ // src/init.ts
254
+ async function initPsrt() {
255
+ await bootCore();
219
256
  }
220
257
 
221
258
  // src/parse.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/wasm.ts","../src/parse.ts","../src/compile.ts","../src/editor/consts.ts","../src/editor/fonts.ts","../src/editor/pages.ts","../src/editor/text.ts","../src/editor/mask.ts","../src/transformer.ts","../src/gui.ts","../src/editor/style.ts","../src/editor/lookup.ts","../src/resolve.ts"],"sourcesContent":["export { initPsrt } from './wasm.js'\nexport { parse, stringify, formatDocument } from './parse.js'\nexport { compileToHtml, compileToSvg } from './compile.js'\nexport { Transformer, transform } from './transformer.js'\nexport {\n adaptEntriesForWeb,\n formatPageDocumentJSON,\n mergePageDocumentPSRT,\n type WebPreviewStyle,\n} from './gui.js'\nexport * from './editor/index.js'\nexport type {\n CompileOptions,\n Document,\n MaskPositionFields,\n Page,\n PositionFields,\n PsrtDocument,\n PsrtMask,\n PsrtPage,\n PsrtStyle,\n PsrtText,\n TextBlock,\n} from './types.js'\nexport { resolveDocument, resolveDocumentStrict } from './resolve.js'\n","import type { CompileOptions, PsrtDocument, PsrtStyle, WasmResult } from './types.js'\n\nconst decoder = new TextDecoder()\nconst encoder = new TextEncoder()\n\nlet wasmExports: Record<string, (...args: unknown[]) => WasmResult> | null = null\n\nfunction decodeData(data: Uint8Array): string {\n return decoder.decode(data)\n}\n\nfunction encodeDoc(doc: PsrtDocument): Uint8Array {\n return encoder.encode(JSON.stringify(doc))\n}\n\nfunction encodeInput(input: PsrtDocument | string): Uint8Array | string {\n return typeof input === 'string' ? input : encodeDoc(input)\n}\n\nfunction encodeArg(arg: unknown): unknown {\n if (arg === undefined) {\n return undefined\n }\n if (arg instanceof Uint8Array) {\n return arg\n }\n if (typeof arg === 'object' && arg !== null) {\n return encoder.encode(JSON.stringify(arg))\n }\n return arg\n}\n\nfunction call(name: string, ...args: unknown[]): WasmResult {\n if (!wasmExports) {\n throw new Error('PSRT WASM not initialized; call initPsrt() first')\n }\n const fn = wasmExports[name]\n if (!fn) {\n throw new Error(`unknown WASM handler: ${name}`)\n }\n const encoded = args.map(encodeArg)\n return fn(...encoded) as WasmResult\n}\n\nfunction requireBytes(result: WasmResult): Uint8Array {\n if (!result.ok) {\n throw new Error(result.err ?? 'WASM call failed')\n }\n if (!result.data) {\n throw new Error('WASM call returned no data')\n }\n return result.data\n}\n\nfunction parseDocResult(result: WasmResult): PsrtDocument {\n return JSON.parse(decodeData(requireBytes(result))) as PsrtDocument\n}\n\nfunction parseTextResult(result: WasmResult): string {\n return decodeData(requireBytes(result))\n}\n\nfunction parseJSONResult<T>(result: WasmResult): T {\n return JSON.parse(decodeData(requireBytes(result))) as T\n}\n\nexport function invokeDocMutation(\n handler: string,\n doc: PsrtDocument,\n ...extra: unknown[]\n): PsrtDocument {\n return parseDocResult(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeDocQuery<T>(handler: string, doc: PsrtDocument, ...extra: unknown[]): T {\n return parseJSONResult<T>(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeRaw<T>(handler: string, ...args: unknown[]): T {\n return parseJSONResult<T>(call(handler, ...args))\n}\n\nexport function invokeText(handler: string, ...args: unknown[]): string {\n return parseTextResult(call(handler, ...args))\n}\n\nexport function invokeStyleMutation(handler: string, style: PsrtStyle, ...extra: unknown[]): PsrtStyle {\n return parseJSONResult<PsrtStyle>(call(handler, style, ...extra))\n}\n\nexport function invokeParse(psrtString: string): PsrtDocument {\n return parseDocResult(call('parse', psrtString))\n}\n\nexport function invokeStringify(doc: PsrtDocument): string {\n return parseTextResult(call('stringify', encodeDoc(doc)))\n}\n\nexport function invokeFormatDocument(doc: PsrtDocument): string {\n return parseTextResult(call('formatDocument', encodeDoc(doc)))\n}\n\nexport function invokeCompileToHtml(\n input: PsrtDocument | string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToHtml', encodeInput(input), options ?? {}))\n}\n\nexport function invokeCompileToSvg(\n input: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToSvg', encodeInput(input), pageName, options ?? {}))\n}\n\nexport function wireWasmFromGlobal(): void {\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('psrtWasm exports not found on globalThis')\n }\n wasmExports = exp\n}\n\nexport async function initPsrt(wasmUrl?: string): Promise<void> {\n if (wasmExports) {\n return\n }\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n wireWasmFromGlobal()\n return\n }\n await loadWasmExec()\n const go = new Go()\n const url = wasmUrl ?? new URL('../wasm/psrt.wasm', import.meta.url).href\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`failed to fetch WASM: ${response.status}`)\n }\n const bytes = await response.arrayBuffer()\n const { instance } = await WebAssembly.instantiate(bytes, go.importObject)\n void go.run(instance)\n await waitForExports()\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('psrtWasm exports not found after WASM init')\n }\n wasmExports = exp\n}\n\nfunction waitForExports(): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0\n const tick = (): void => {\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n resolve()\n return\n }\n attempts++\n if (attempts > 200) {\n reject(new Error('timeout waiting for psrtWasm exports'))\n return\n }\n setTimeout(tick, 10)\n }\n tick()\n })\n}\n\nasync function loadWasmExec(): Promise<void> {\n if (typeof (globalThis as { Go?: unknown }).Go !== 'undefined') {\n return\n }\n const scriptUrl = new URL('../wasm/wasm_exec.js', import.meta.url).href\n await import(/* @vite-ignore */ scriptUrl)\n}\n\ndeclare class Go {\n importObject: WebAssembly.Imports\n run(instance: WebAssembly.Instance): Promise<void>\n}\n","import { invokeFormatDocument, invokeParse, invokeStringify } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Converts a .psrt string into a typed PsrtDocument. */\nexport function parse(psrtString: string): PsrtDocument {\n return invokeParse(psrtString)\n}\n\n/** Converts a PsrtDocument back to normative .psrt text. */\nexport function stringify(doc: PsrtDocument): string {\n return invokeStringify(doc)\n}\n\n/** Formats a document with editor cleanup rules. */\nexport function formatDocument(doc: PsrtDocument): string {\n return invokeFormatDocument(doc)\n}\n","import { invokeCompileToHtml, invokeCompileToSvg } from './wasm.js'\nimport type { CompileOptions, PsrtDocument } from './types.js'\n\n/** Compiles the document to a self-contained HTML string. */\nexport function compileToHtml(doc: PsrtDocument | string, options?: CompileOptions): string {\n return invokeCompileToHtml(doc, options)\n}\n\n/** Compiles one page of the document to SVG. */\nexport function compileToSvg(\n doc: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return invokeCompileToSvg(doc, pageName, options)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addConst(doc: PsrtDocument, name: string, value: string): PsrtDocument {\n return invokeDocMutation('addConst', doc, name, value)\n}\n\nexport function removeConst(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removeConst', doc, name)\n}\n\nexport function substituteConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('substituteConstReferences', doc, name, value)\n}\n\nexport function revertConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('revertConstReferences', doc, name, value)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('addFont', doc, url)\n}\n\nexport function removeFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('removeFont', doc, url)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument, PsrtPage, PsrtStyle } from '../types.js'\n\nexport function renamePage(doc: PsrtDocument, oldName: string, newName: string): PsrtDocument {\n return invokeDocMutation('renamePage', doc, oldName, newName)\n}\n\nexport function setPagePath(doc: PsrtDocument, pageName: string, path: string): PsrtDocument {\n return invokeDocMutation('setPagePath', doc, pageName, path)\n}\n\nexport function setPageStyle(\n doc: PsrtDocument,\n pageName: string,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setPageStyle', doc, pageName, key, value, partial)\n}\n\nexport function removePageStyleKey(doc: PsrtDocument, pageName: string, key: string): PsrtDocument {\n return invokeDocMutation('removePageStyleKey', doc, pageName, key)\n}\n\nexport function movePage(\n doc: PsrtDocument,\n pageName: string,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('movePage', doc, pageName, before, after)\n}\n\nexport function addPage(\n doc: PsrtDocument,\n page: PsrtPage,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('addPage', doc, page, before, after)\n}\n\nexport function removePage(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removePage', doc, name)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PositionFields, PsrtDocument, PsrtStyle, PsrtText } from '../types.js'\n\nexport function setTextStyle(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setTextStyle', doc, pageName, textIndex, key, value, partial)\n}\n\nexport function removeTextStyleKey(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeTextStyleKey', doc, pageName, textIndex, key)\n}\n\nexport function setTextContent(\n doc: PsrtDocument,\n pageName: string,\n index: number,\n newContent: string,\n appendContent = false\n): PsrtDocument {\n return invokeDocMutation('setTextContent', doc, pageName, index, newContent, appendContent)\n}\n\nexport function addText(\n doc: PsrtDocument,\n pageName: string,\n text: PsrtText,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addText', doc, pageName, text, beforeIndex, afterIndex)\n}\n\nexport function removeText(doc: PsrtDocument, pageName: string, textIndex: number): PsrtDocument {\n return invokeDocMutation('removeText', doc, pageName, textIndex)\n}\n\nexport function reorderTextRelative(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('reorderTextRelative', doc, pageName, textIndex, beforeIndex, afterIndex)\n}\n\nexport function reorderTextTo(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n to: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextTo', doc, pageName, textIndex, to)\n}\n\nexport function reorderTextByDelta(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextByDelta', doc, pageName, textIndex, delta)\n}\n\nexport function setTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n pos: PositionFields\n): PsrtDocument {\n return invokeDocMutation('setTextPosition', doc, pageName, textIndex, pos)\n}\n\nexport function nudgeTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: PositionFields\n): PsrtDocument {\n return invokeDocMutation('nudgeTextPosition', doc, pageName, textIndex, delta)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { MaskPositionFields, PsrtDocument, PsrtMask, PsrtStyle } from '../types.js'\n\nexport function setMaskPosition(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n pos: MaskPositionFields\n): PsrtDocument {\n const posBytes = new TextEncoder().encode(JSON.stringify(pos))\n return invokeDocMutation('setMaskPosition', doc, pageName, maskIndex, posBytes)\n}\n\nexport function addMask(\n doc: PsrtDocument,\n pageName: string,\n mask: PsrtMask,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addMask', doc, pageName, mask, beforeIndex, afterIndex)\n}\n\nexport function removeMask(doc: PsrtDocument, pageName: string, maskIndex: number): PsrtDocument {\n return invokeDocMutation('removeMask', doc, pageName, maskIndex)\n}\n\nexport function setMaskStyle(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setMaskStyle', doc, pageName, maskIndex, key, value, partial)\n}\n\nexport function removeMaskStyleKey(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeMaskStyleKey', doc, pageName, maskIndex, key)\n}\n","import { parse, stringify } from './parse.js'\nimport type { MaskPositionFields, PositionFields, PsrtDocument, PsrtMask, PsrtPage, PsrtStyle, PsrtText } from './types.js'\nimport {\n addConst,\n removeConst,\n substituteConstReferences,\n revertConstReferences,\n} from './editor/consts.js'\nimport { addFont, removeFont } from './editor/fonts.js'\nimport {\n addPage,\n movePage,\n removePage,\n removePageStyleKey,\n renamePage,\n setPagePath,\n setPageStyle,\n} from './editor/pages.js'\nimport {\n addText,\n nudgeTextPosition,\n removeText,\n removeTextStyleKey,\n reorderTextByDelta,\n reorderTextRelative,\n reorderTextTo,\n setTextContent,\n setTextPosition,\n setTextStyle,\n} from './editor/text.js'\nimport {\n addMask,\n removeMask,\n removeMaskStyleKey,\n setMaskPosition,\n setMaskStyle,\n} from './editor/mask.js'\n\n/** Fluent builder for chained PSRT document edits. */\nexport class Transformer {\n private _doc: PsrtDocument\n\n constructor(input: PsrtDocument | string) {\n this._doc = typeof input === 'string' ? parse(input) : structuredClone(input)\n }\n\n /** Read-only view of the current document state. */\n get document(): Readonly<PsrtDocument> {\n return this._doc\n }\n\n addConst(name: string, value: string): this {\n this._doc = addConst(this._doc, name, value)\n return this\n }\n\n removeConst(name: string): this {\n this._doc = removeConst(this._doc, name)\n return this\n }\n\n substituteConstReferences(name: string, value: string): this {\n this._doc = substituteConstReferences(this._doc, name, value)\n return this\n }\n\n revertConstReferences(name: string, value: string): this {\n this._doc = revertConstReferences(this._doc, name, value)\n return this\n }\n\n addFont(url: string): this {\n this._doc = addFont(this._doc, url)\n return this\n }\n\n removeFont(url: string): this {\n this._doc = removeFont(this._doc, url)\n return this\n }\n\n renamePage(oldName: string, newName: string): this {\n this._doc = renamePage(this._doc, oldName, newName)\n return this\n }\n\n setPagePath(pageName: string, path: string): this {\n this._doc = setPagePath(this._doc, pageName, path)\n return this\n }\n\n setPageStyle(pageName: string, key: string, value: string, partial?: PsrtStyle): this {\n this._doc = setPageStyle(this._doc, pageName, key, value, partial)\n return this\n }\n\n removePageStyleKey(pageName: string, key: string): this {\n this._doc = removePageStyleKey(this._doc, pageName, key)\n return this\n }\n\n movePage(pageName: string, before = '', after = ''): this {\n this._doc = movePage(this._doc, pageName, before, after)\n return this\n }\n\n addPage(page: PsrtPage, before = '', after = ''): this {\n this._doc = addPage(this._doc, page, before, after)\n return this\n }\n\n removePage(name: string): this {\n this._doc = removePage(this._doc, name)\n return this\n }\n\n setTextStyle(\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setTextStyle(this._doc, pageName, textIndex, key, value, partial)\n return this\n }\n\n removeTextStyleKey(pageName: string, textIndex: number, key: string): this {\n this._doc = removeTextStyleKey(this._doc, pageName, textIndex, key)\n return this\n }\n\n setTextContent(pageName: string, index: number, content: string, appendContent = false): this {\n this._doc = setTextContent(this._doc, pageName, index, content, appendContent)\n return this\n }\n\n addText(\n pageName: string,\n text: PsrtText,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addText(this._doc, pageName, text, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeText(pageName: string, textIndex: number): this {\n this._doc = removeText(this._doc, pageName, textIndex)\n return this\n }\n\n reorderTextRelative(\n pageName: string,\n textIndex: number,\n beforeIndex = 0,\n afterIndex = 0\n ): this {\n this._doc = reorderTextRelative(this._doc, pageName, textIndex, beforeIndex, afterIndex)\n return this\n }\n\n reorderTextTo(pageName: string, textIndex: number, to: number): this {\n this._doc = reorderTextTo(this._doc, pageName, textIndex, to)\n return this\n }\n\n reorderTextByDelta(pageName: string, textIndex: number, delta: number): this {\n this._doc = reorderTextByDelta(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setTextPosition(pageName: string, textIndex: number, pos: PositionFields): this {\n this._doc = setTextPosition(this._doc, pageName, textIndex, pos)\n return this\n }\n\n nudgeTextPosition(pageName: string, textIndex: number, delta: PositionFields): this {\n this._doc = nudgeTextPosition(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setMaskPosition(pageName: string, maskIndex: number, pos: MaskPositionFields): this {\n this._doc = setMaskPosition(this._doc, pageName, maskIndex, pos)\n return this\n }\n\n addMask(\n pageName: string,\n mask: PsrtMask,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addMask(this._doc, pageName, mask, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeMask(pageName: string, maskIndex: number): this {\n this._doc = removeMask(this._doc, pageName, maskIndex)\n return this\n }\n\n setMaskStyle(\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setMaskStyle(this._doc, pageName, maskIndex, key, value, partial)\n return this\n }\n\n removeMaskStyleKey(pageName: string, maskIndex: number, key: string): this {\n this._doc = removeMaskStyleKey(this._doc, pageName, maskIndex, key)\n return this\n }\n\n /** Returns the accumulated document after the edit chain. */\n build(): PsrtDocument {\n return structuredClone(this._doc)\n }\n\n /** Shortcut: build() + stringify(). */\n buildPsrt(): string {\n return stringify(this.build())\n }\n}\n\nexport function transform(input: PsrtDocument | string): Transformer {\n return new Transformer(input)\n}\n","import { invokeRaw, invokeText } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\nexport interface WebPreviewStyle {\n container: Record<string, string>\n text: Record<string, string>\n hasStroke: boolean\n}\n\n/** Adapts text/mask entries for live web preview CSS (percent → px, stroke → WebKit, etc.). */\nexport function adaptEntriesForWeb(\n entriesJSON: string,\n canvasW: number,\n canvasH: number,\n zoom: number,\n): WebPreviewStyle[] {\n return invokeRaw<WebPreviewStyle[]>('adaptEntriesForWeb', entriesJSON, canvasW, canvasH, zoom)\n}\n\n/** Applies a page PSRT fragment into a full document. */\nexport function mergePageDocumentPSRT(\n fullDocJSON: string,\n pageName: string,\n psrtText: string,\n): PsrtDocument {\n const json = invokeText('mergePageDocumentPSRT', fullDocJSON, pageName, psrtText)\n return JSON.parse(json) as PsrtDocument\n}\n\n/** Formats one page plus document fonts and constants as PSRT text. */\nexport function formatPageDocumentJSON(docJSON: string, pageName: string): string {\n return invokeText('formatPageDocumentJSON', docJSON, pageName)\n}\n","import { invokeStyleMutation } from '../wasm.js'\nimport type { PsrtStyle } from '../types.js'\n\nexport function setStyleKey(style: PsrtStyle, key: string, value: string): PsrtStyle {\n return invokeStyleMutation('setStyleKey', style, key, value) as PsrtStyle\n}\n\nexport function removeStyleKey(style: PsrtStyle, key: string): PsrtStyle {\n return invokeStyleMutation('removeStyleKey', style, key) as PsrtStyle\n}\n\nexport function mergeStyle(style: PsrtStyle, partial: PsrtStyle): PsrtStyle {\n const partialBytes = new TextEncoder().encode(JSON.stringify(partial))\n return invokeStyleMutation('mergeStyle', style, partialBytes) as PsrtStyle\n}\n","import { invokeDocQuery, invokeRaw } from '../wasm.js'\nimport type { PsrtDocument, PsrtMask, PsrtPage, PsrtText } from '../types.js'\n\nexport function findPage(doc: PsrtDocument, name: string): PsrtPage {\n return invokeDocQuery<PsrtPage>('findPage', doc, name)\n}\n\nexport function findPageIndex(doc: PsrtDocument, name: string): number {\n return invokeDocQuery<{ index: number }>('findPageIndex', doc, name).index\n}\n\nexport function findTextByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtText {\n return invokeDocQuery<PsrtText>('findTextByIndex', doc, pageName, index)\n}\n\nexport function findMaskByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtMask {\n return invokeDocQuery<PsrtMask>('findMaskByIndex', doc, pageName, index)\n}\n\nexport function parseTextIndex(s: string): number {\n return invokeRaw<{ index: number }>('parseTextIndex', s).index\n}\n","import { invokeDocMutation } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Expands all @const@ placeholders in styles, content, and URLs. */\nexport function resolveDocument(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocument', doc)\n}\n\n/** Like resolveDocument but throws on invalid style JSON after expansion. */\nexport function resolveDocumentStrict(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocumentStrict', doc)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAEA,IAAM,UAAU,IAAI,YAAY;AAChC,IAAM,UAAU,IAAI,YAAY;AAEhC,IAAI,cAAyE;AAE7E,SAAS,WAAW,MAA0B;AAC5C,SAAO,QAAQ,OAAO,IAAI;AAC5B;AAEA,SAAS,UAAU,KAA+B;AAChD,SAAO,QAAQ,OAAO,KAAK,UAAU,GAAG,CAAC;AAC3C;AAEA,SAAS,YAAY,OAAmD;AACtE,SAAO,OAAO,UAAU,WAAW,QAAQ,UAAU,KAAK;AAC5D;AAEA,SAAS,UAAU,KAAuB;AACxC,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,MAAI,eAAe,YAAY;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,WAAO,QAAQ,OAAO,KAAK,UAAU,GAAG,CAAC;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,KAAK,SAAiB,MAA6B;AAC1D,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,KAAK,YAAY,IAAI;AAC3B,MAAI,CAAC,IAAI;AACP,UAAM,IAAI,MAAM,yBAAyB,IAAI,EAAE;AAAA,EACjD;AACA,QAAM,UAAU,KAAK,IAAI,SAAS;AAClC,SAAO,GAAG,GAAG,OAAO;AACtB;AAEA,SAAS,aAAa,QAAgC;AACpD,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,MAAM,OAAO,OAAO,kBAAkB;AAAA,EAClD;AACA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,eAAe,QAAkC;AACxD,SAAO,KAAK,MAAM,WAAW,aAAa,MAAM,CAAC,CAAC;AACpD;AAEA,SAAS,gBAAgB,QAA4B;AACnD,SAAO,WAAW,aAAa,MAAM,CAAC;AACxC;AAEA,SAAS,gBAAmB,QAAuB;AACjD,SAAO,KAAK,MAAM,WAAW,aAAa,MAAM,CAAC,CAAC;AACpD;AAEO,SAAS,kBACd,SACA,QACG,OACW;AACd,SAAO,eAAe,KAAK,SAAS,UAAU,GAAG,GAAG,GAAG,KAAK,CAAC;AAC/D;AAEO,SAAS,eAAkB,SAAiB,QAAsB,OAAqB;AAC5F,SAAO,gBAAmB,KAAK,SAAS,UAAU,GAAG,GAAG,GAAG,KAAK,CAAC;AACnE;AAEO,SAAS,UAAa,YAAoB,MAAoB;AACnE,SAAO,gBAAmB,KAAK,SAAS,GAAG,IAAI,CAAC;AAClD;AAEO,SAAS,WAAW,YAAoB,MAAyB;AACtE,SAAO,gBAAgB,KAAK,SAAS,GAAG,IAAI,CAAC;AAC/C;AAEO,SAAS,oBAAoB,SAAiB,UAAqB,OAA6B;AACrG,SAAO,gBAA2B,KAAK,SAAS,OAAO,GAAG,KAAK,CAAC;AAClE;AAEO,SAAS,YAAY,YAAkC;AAC5D,SAAO,eAAe,KAAK,SAAS,UAAU,CAAC;AACjD;AAEO,SAAS,gBAAgB,KAA2B;AACzD,SAAO,gBAAgB,KAAK,aAAa,UAAU,GAAG,CAAC,CAAC;AAC1D;AAEO,SAAS,qBAAqB,KAA2B;AAC9D,SAAO,gBAAgB,KAAK,kBAAkB,UAAU,GAAG,CAAC,CAAC;AAC/D;AAEO,SAAS,oBACd,OACA,SACQ;AACR,SAAO,gBAAgB,KAAK,iBAAiB,YAAY,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC;AACjF;AAEO,SAAS,mBACd,OACA,UACA,SACQ;AACR,SAAO,gBAAgB,KAAK,gBAAgB,YAAY,KAAK,GAAG,UAAU,WAAW,CAAC,CAAC,CAAC;AAC1F;AAEO,SAAS,qBAA2B;AACzC,QAAM,MAAO,WACV;AACH,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,gBAAc;AAChB;AAEA,eAAsB,SAAS,SAAiC;AAC9D,MAAI,aAAa;AACf;AAAA,EACF;AACA,MAAK,WAAsC,UAAU;AACnD,uBAAmB;AACnB;AAAA,EACF;AACA,QAAM,aAAa;AACnB,QAAM,KAAK,IAAI,GAAG;AAClB,QAAM,MAAM,WAAW,IAAI,IAAI,qBAAqB,YAAY,GAAG,EAAE;AACrE,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,EAAE;AAAA,EAC5D;AACA,QAAM,QAAQ,MAAM,SAAS,YAAY;AACzC,QAAM,EAAE,SAAS,IAAI,MAAM,YAAY,YAAY,OAAO,GAAG,YAAY;AACzE,OAAK,GAAG,IAAI,QAAQ;AACpB,QAAM,eAAe;AACrB,QAAM,MAAO,WACV;AACH,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,gBAAc;AAChB;AAEA,SAAS,iBAAgC;AACvC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,WAAW;AACf,UAAM,OAAO,MAAY;AACvB,UAAK,WAAsC,UAAU;AACnD,gBAAQ;AACR;AAAA,MACF;AACA;AACA,UAAI,WAAW,KAAK;AAClB,eAAO,IAAI,MAAM,sCAAsC,CAAC;AACxD;AAAA,MACF;AACA,iBAAW,MAAM,EAAE;AAAA,IACrB;AACA,SAAK;AAAA,EACP,CAAC;AACH;AAEA,eAAe,eAA8B;AAC3C,MAAI,OAAQ,WAAgC,OAAO,aAAa;AAC9D;AAAA,EACF;AACA,QAAM,YAAY,IAAI,IAAI,wBAAwB,YAAY,GAAG,EAAE;AACnE,QAAM;AAAA;AAAA,IAA0B;AAAA;AAClC;;;AC9KO,SAAS,MAAM,YAAkC;AACtD,SAAO,YAAY,UAAU;AAC/B;AAGO,SAAS,UAAU,KAA2B;AACnD,SAAO,gBAAgB,GAAG;AAC5B;AAGO,SAAS,eAAe,KAA2B;AACxD,SAAO,qBAAqB,GAAG;AACjC;;;ACZO,SAAS,cAAc,KAA4B,SAAkC;AAC1F,SAAO,oBAAoB,KAAK,OAAO;AACzC;AAGO,SAAS,aACd,KACA,UACA,SACQ;AACR,SAAO,mBAAmB,KAAK,UAAU,OAAO;AAClD;;;ACZO,SAAS,SAAS,KAAmB,MAAc,OAA6B;AACrF,SAAO,kBAAkB,YAAY,KAAK,MAAM,KAAK;AACvD;AAEO,SAAS,YAAY,KAAmB,MAA4B;AACzE,SAAO,kBAAkB,eAAe,KAAK,IAAI;AACnD;AAEO,SAAS,0BACd,KACA,MACA,OACc;AACd,SAAO,kBAAkB,6BAA6B,KAAK,MAAM,KAAK;AACxE;AAEO,SAAS,sBACd,KACA,MACA,OACc;AACd,SAAO,kBAAkB,yBAAyB,KAAK,MAAM,KAAK;AACpE;;;ACtBO,SAAS,QAAQ,KAAmB,KAA2B;AACpE,SAAO,kBAAkB,WAAW,KAAK,GAAG;AAC9C;AAEO,SAAS,WAAW,KAAmB,KAA2B;AACvE,SAAO,kBAAkB,cAAc,KAAK,GAAG;AACjD;;;ACNO,SAAS,WAAW,KAAmB,SAAiB,SAA+B;AAC5F,SAAO,kBAAkB,cAAc,KAAK,SAAS,OAAO;AAC9D;AAEO,SAAS,YAAY,KAAmB,UAAkB,MAA4B;AAC3F,SAAO,kBAAkB,eAAe,KAAK,UAAU,IAAI;AAC7D;AAEO,SAAS,aACd,KACA,UACA,KACA,OACA,SACc;AACd,SAAO,kBAAkB,gBAAgB,KAAK,UAAU,KAAK,OAAO,OAAO;AAC7E;AAEO,SAAS,mBAAmB,KAAmB,UAAkB,KAA2B;AACjG,SAAO,kBAAkB,sBAAsB,KAAK,UAAU,GAAG;AACnE;AAEO,SAAS,SACd,KACA,UACA,SAAS,IACT,QAAQ,IACM;AACd,SAAO,kBAAkB,YAAY,KAAK,UAAU,QAAQ,KAAK;AACnE;AAEO,SAAS,QACd,KACA,MACA,SAAS,IACT,QAAQ,IACM;AACd,SAAO,kBAAkB,WAAW,KAAK,MAAM,QAAQ,KAAK;AAC9D;AAEO,SAAS,WAAW,KAAmB,MAA4B;AACxE,SAAO,kBAAkB,cAAc,KAAK,IAAI;AAClD;;;AC1CO,SAAS,aACd,KACA,UACA,WACA,KACA,OACA,SACc;AACd,SAAO,kBAAkB,gBAAgB,KAAK,UAAU,WAAW,KAAK,OAAO,OAAO;AACxF;AAEO,SAAS,mBACd,KACA,UACA,WACA,KACc;AACd,SAAO,kBAAkB,sBAAsB,KAAK,UAAU,WAAW,GAAG;AAC9E;AAEO,SAAS,eACd,KACA,UACA,OACA,YACA,gBAAgB,OACF;AACd,SAAO,kBAAkB,kBAAkB,KAAK,UAAU,OAAO,YAAY,aAAa;AAC5F;AAEO,SAAS,QACd,KACA,UACA,MACA,cAAc,IACd,aAAa,IACC;AACd,SAAO,kBAAkB,WAAW,KAAK,UAAU,MAAM,aAAa,UAAU;AAClF;AAEO,SAAS,WAAW,KAAmB,UAAkB,WAAiC;AAC/F,SAAO,kBAAkB,cAAc,KAAK,UAAU,SAAS;AACjE;AAEO,SAAS,oBACd,KACA,UACA,WACA,cAAc,IACd,aAAa,IACC;AACd,SAAO,kBAAkB,uBAAuB,KAAK,UAAU,WAAW,aAAa,UAAU;AACnG;AAEO,SAAS,cACd,KACA,UACA,WACA,IACc;AACd,SAAO,kBAAkB,iBAAiB,KAAK,UAAU,WAAW,EAAE;AACxE;AAEO,SAAS,mBACd,KACA,UACA,WACA,OACc;AACd,SAAO,kBAAkB,sBAAsB,KAAK,UAAU,WAAW,KAAK;AAChF;AAEO,SAAS,gBACd,KACA,UACA,WACA,KACc;AACd,SAAO,kBAAkB,mBAAmB,KAAK,UAAU,WAAW,GAAG;AAC3E;AAEO,SAAS,kBACd,KACA,UACA,WACA,OACc;AACd,SAAO,kBAAkB,qBAAqB,KAAK,UAAU,WAAW,KAAK;AAC/E;;;ACxFO,SAAS,gBACd,KACA,UACA,WACA,KACc;AACd,QAAM,WAAW,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,GAAG,CAAC;AAC7D,SAAO,kBAAkB,mBAAmB,KAAK,UAAU,WAAW,QAAQ;AAChF;AAEO,SAAS,QACd,KACA,UACA,MACA,cAAc,IACd,aAAa,IACC;AACd,SAAO,kBAAkB,WAAW,KAAK,UAAU,MAAM,aAAa,UAAU;AAClF;AAEO,SAAS,WAAW,KAAmB,UAAkB,WAAiC;AAC/F,SAAO,kBAAkB,cAAc,KAAK,UAAU,SAAS;AACjE;AAEO,SAAS,aACd,KACA,UACA,WACA,KACA,OACA,SACc;AACd,SAAO,kBAAkB,gBAAgB,KAAK,UAAU,WAAW,KAAK,OAAO,OAAO;AACxF;AAEO,SAAS,mBACd,KACA,UACA,WACA,KACc;AACd,SAAO,kBAAkB,sBAAsB,KAAK,UAAU,WAAW,GAAG;AAC9E;;;ACNO,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EAER,YAAY,OAA8B;AACxC,SAAK,OAAO,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,gBAAgB,KAAK;AAAA,EAC9E;AAAA;AAAA,EAGA,IAAI,WAAmC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,MAAc,OAAqB;AAC1C,SAAK,OAAO,SAAS,KAAK,MAAM,MAAM,KAAK;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAAoB;AAC9B,SAAK,OAAO,YAAY,KAAK,MAAM,IAAI;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,0BAA0B,MAAc,OAAqB;AAC3D,SAAK,OAAO,0BAA0B,KAAK,MAAM,MAAM,KAAK;AAC5D,WAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAc,OAAqB;AACvD,SAAK,OAAO,sBAAsB,KAAK,MAAM,MAAM,KAAK;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,KAAmB;AACzB,SAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,KAAmB;AAC5B,SAAK,OAAO,WAAW,KAAK,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,SAAiB,SAAuB;AACjD,SAAK,OAAO,WAAW,KAAK,MAAM,SAAS,OAAO;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,UAAkB,MAAoB;AAChD,SAAK,OAAO,YAAY,KAAK,MAAM,UAAU,IAAI;AACjD,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,UAAkB,KAAa,OAAe,SAA2B;AACpF,SAAK,OAAO,aAAa,KAAK,MAAM,UAAU,KAAK,OAAO,OAAO;AACjE,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,UAAkB,KAAmB;AACtD,SAAK,OAAO,mBAAmB,KAAK,MAAM,UAAU,GAAG;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,UAAkB,SAAS,IAAI,QAAQ,IAAU;AACxD,SAAK,OAAO,SAAS,KAAK,MAAM,UAAU,QAAQ,KAAK;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAgB,SAAS,IAAI,QAAQ,IAAU;AACrD,SAAK,OAAO,QAAQ,KAAK,MAAM,MAAM,QAAQ,KAAK;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAAoB;AAC7B,SAAK,OAAO,WAAW,KAAK,MAAM,IAAI;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,aACE,UACA,WACA,KACA,OACA,SACM;AACN,SAAK,OAAO,aAAa,KAAK,MAAM,UAAU,WAAW,KAAK,OAAO,OAAO;AAC5E,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,UAAkB,WAAmB,KAAmB;AACzE,SAAK,OAAO,mBAAmB,KAAK,MAAM,UAAU,WAAW,GAAG;AAClE,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,UAAkB,OAAe,SAAiB,gBAAgB,OAAa;AAC5F,SAAK,OAAO,eAAe,KAAK,MAAM,UAAU,OAAO,SAAS,aAAa;AAC7E,WAAO;AAAA,EACT;AAAA,EAEA,QACE,UACA,MACA,MACM;AACN,SAAK,OAAO,QAAQ,KAAK,MAAM,UAAU,MAAM,MAAM,eAAe,IAAI,MAAM,cAAc,EAAE;AAC9F,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,UAAkB,WAAyB;AACpD,SAAK,OAAO,WAAW,KAAK,MAAM,UAAU,SAAS;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,oBACE,UACA,WACA,cAAc,GACd,aAAa,GACP;AACN,SAAK,OAAO,oBAAoB,KAAK,MAAM,UAAU,WAAW,aAAa,UAAU;AACvF,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,UAAkB,WAAmB,IAAkB;AACnE,SAAK,OAAO,cAAc,KAAK,MAAM,UAAU,WAAW,EAAE;AAC5D,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,UAAkB,WAAmB,OAAqB;AAC3E,SAAK,OAAO,mBAAmB,KAAK,MAAM,UAAU,WAAW,KAAK;AACpE,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,UAAkB,WAAmB,KAA2B;AAC9E,SAAK,OAAO,gBAAgB,KAAK,MAAM,UAAU,WAAW,GAAG;AAC/D,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,UAAkB,WAAmB,OAA6B;AAClF,SAAK,OAAO,kBAAkB,KAAK,MAAM,UAAU,WAAW,KAAK;AACnE,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,UAAkB,WAAmB,KAA+B;AAClF,SAAK,OAAO,gBAAgB,KAAK,MAAM,UAAU,WAAW,GAAG;AAC/D,WAAO;AAAA,EACT;AAAA,EAEA,QACE,UACA,MACA,MACM;AACN,SAAK,OAAO,QAAQ,KAAK,MAAM,UAAU,MAAM,MAAM,eAAe,IAAI,MAAM,cAAc,EAAE;AAC9F,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,UAAkB,WAAyB;AACpD,SAAK,OAAO,WAAW,KAAK,MAAM,UAAU,SAAS;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,aACE,UACA,WACA,KACA,OACA,SACM;AACN,SAAK,OAAO,aAAa,KAAK,MAAM,UAAU,WAAW,KAAK,OAAO,OAAO;AAC5E,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,UAAkB,WAAmB,KAAmB;AACzE,SAAK,OAAO,mBAAmB,KAAK,MAAM,UAAU,WAAW,GAAG;AAClE,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAAsB;AACpB,WAAO,gBAAgB,KAAK,IAAI;AAAA,EAClC;AAAA;AAAA,EAGA,YAAoB;AAClB,WAAO,UAAU,KAAK,MAAM,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,UAAU,OAA2C;AACnE,SAAO,IAAI,YAAY,KAAK;AAC9B;;;AC3NO,SAAS,mBACd,aACA,SACA,SACA,MACmB;AACnB,SAAO,UAA6B,sBAAsB,aAAa,SAAS,SAAS,IAAI;AAC/F;AAGO,SAAS,sBACd,aACA,UACA,UACc;AACd,QAAM,OAAO,WAAW,yBAAyB,aAAa,UAAU,QAAQ;AAChF,SAAO,KAAK,MAAM,IAAI;AACxB;AAGO,SAAS,uBAAuB,SAAiB,UAA0B;AAChF,SAAO,WAAW,0BAA0B,SAAS,QAAQ;AAC/D;;;AC7BO,SAAS,YAAY,OAAkB,KAAa,OAA0B;AACnF,SAAO,oBAAoB,eAAe,OAAO,KAAK,KAAK;AAC7D;AAEO,SAAS,eAAe,OAAkB,KAAwB;AACvE,SAAO,oBAAoB,kBAAkB,OAAO,GAAG;AACzD;AAEO,SAAS,WAAW,OAAkB,SAA+B;AAC1E,QAAM,eAAe,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,OAAO,CAAC;AACrE,SAAO,oBAAoB,cAAc,OAAO,YAAY;AAC9D;;;ACXO,SAAS,SAAS,KAAmB,MAAwB;AAClE,SAAO,eAAyB,YAAY,KAAK,IAAI;AACvD;AAEO,SAAS,cAAc,KAAmB,MAAsB;AACrE,SAAO,eAAkC,iBAAiB,KAAK,IAAI,EAAE;AACvE;AAEO,SAAS,gBAAgB,KAAmB,UAAkB,OAAyB;AAC5F,SAAO,eAAyB,mBAAmB,KAAK,UAAU,KAAK;AACzE;AAEO,SAAS,gBAAgB,KAAmB,UAAkB,OAAyB;AAC5F,SAAO,eAAyB,mBAAmB,KAAK,UAAU,KAAK;AACzE;AAEO,SAAS,eAAe,GAAmB;AAChD,SAAO,UAA6B,kBAAkB,CAAC,EAAE;AAC3D;;;ACjBO,SAAS,gBAAgB,KAAiC;AAC/D,SAAO,kBAAkB,mBAAmB,GAAG;AACjD;AAGO,SAAS,sBAAsB,KAAiC;AACrE,SAAO,kBAAkB,yBAAyB,GAAG;AACvD;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/runtime/boot.ts","../src/wasm.ts","../src/init.ts","../src/parse.ts","../src/compile.ts","../src/editor/consts.ts","../src/editor/fonts.ts","../src/editor/pages.ts","../src/editor/text.ts","../src/editor/mask.ts","../src/transformer.ts","../src/gui.ts","../src/editor/style.ts","../src/editor/lookup.ts","../src/resolve.ts"],"sourcesContent":["export { initPsrt } from './init.js'\nexport { parse, stringify, formatDocument } from './parse.js'\nexport { compileToHtml, compileToSvg } from './compile.js'\nexport { Transformer, transform } from './transformer.js'\nexport {\n adaptEntriesForWeb,\n formatPageDocumentJSON,\n mergePageDocumentPSRT,\n type WebPreviewStyle,\n} from './gui.js'\nexport * from './editor/index.js'\nexport type {\n CompileOptions,\n Document,\n MaskPositionFields,\n Page,\n PositionFields,\n PsrtDocument,\n PsrtMask,\n PsrtPage,\n PsrtStyle,\n PsrtText,\n TextBlock,\n} from './types.js'\nexport { resolveDocument, resolveDocumentStrict } from './resolve.js'\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { setWasmExports, wireWasmFromGlobal } from '../wasm.js'\n\ndeclare class Go {\n importObject: WebAssembly.Imports\n run(instance: WebAssembly.Instance): Promise<void>\n}\n\nlet bootPromise: Promise<void> | null = null\n\nexport function isNodeRuntime(): boolean {\n return typeof process !== 'undefined' && Boolean(process.versions?.node)\n}\n\nfunction wasmDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (;;) {\n const candidate = join(dir, 'wasm', 'psrt.wasm')\n if (existsSync(candidate)) {\n return join(dir, 'wasm')\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n throw new Error('PSRT core binary not found')\n}\n\nfunction waitForExports(): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0\n const tick = (): void => {\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n resolve()\n return\n }\n attempts++\n if (attempts > 200) {\n reject(new Error('timeout loading PSRT core'))\n return\n }\n setTimeout(tick, 10)\n }\n tick()\n })\n}\n\nasync function loadGoRuntime(): Promise<void> {\n if (typeof (globalThis as { Go?: unknown }).Go !== 'undefined') {\n return\n }\n const scriptPath = join(wasmDir(), 'wasm_exec.js')\n await import(pathToFileURL(scriptPath).href)\n}\n\nasync function loadCoreBytes(): Promise<ArrayBuffer> {\n if (isNodeRuntime()) {\n const bytes = readFileSync(join(wasmDir(), 'psrt.wasm'))\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)\n }\n const url = new URL('../../wasm/psrt.wasm', import.meta.url).href\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`failed to load PSRT core (${response.status})`)\n }\n return response.arrayBuffer()\n}\n\nasync function startCore(bytes: ArrayBuffer): Promise<void> {\n await loadGoRuntime()\n const go = new Go()\n const { instance } = await WebAssembly.instantiate(bytes, go.importObject)\n void go.run(instance)\n await waitForExports()\n wireWasmFromGlobal()\n}\n\n/** Loads the PSRT core once. */\nexport async function bootCore(): Promise<void> {\n if (bootPromise) {\n return bootPromise\n }\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n wireWasmFromGlobal()\n return\n }\n bootPromise = (async () => {\n const bytes = await loadCoreBytes()\n await startCore(bytes)\n })()\n return bootPromise\n}\n\n/** @internal Test hook — inject pre-started core exports. */\nexport function attachCoreExports(\n exports: Record<string, (...args: unknown[]) => unknown>,\n): void {\n setWasmExports(exports as Record<string, (...args: unknown[]) => import('../types.js').WasmResult>)\n}\n","import type { CompileOptions, PsrtDocument, PsrtStyle, WasmResult } from './types.js'\n\nconst decoder = new TextDecoder()\nconst encoder = new TextEncoder()\n\nlet wasmExports: Record<string, (...args: unknown[]) => WasmResult> | null = null\n\nfunction decodeData(data: Uint8Array): string {\n return decoder.decode(data)\n}\n\nfunction encodeDoc(doc: PsrtDocument): Uint8Array {\n return encoder.encode(JSON.stringify(doc))\n}\n\nfunction encodeInput(input: PsrtDocument | string): Uint8Array | string {\n return typeof input === 'string' ? input : encodeDoc(input)\n}\n\nfunction encodeArg(arg: unknown): unknown {\n if (arg === undefined) {\n return undefined\n }\n if (arg instanceof Uint8Array) {\n return arg\n }\n if (typeof arg === 'object' && arg !== null) {\n return encoder.encode(JSON.stringify(arg))\n }\n return arg\n}\n\nfunction call(name: string, ...args: unknown[]): WasmResult {\n if (!wasmExports) {\n throw new Error('PSRT is not initialized; call initPsrt() first')\n }\n const fn = wasmExports[name]\n if (!fn) {\n throw new Error(`unknown PSRT handler: ${name}`)\n }\n const encoded = args.map(encodeArg)\n return fn(...encoded) as WasmResult\n}\n\nfunction requireBytes(result: WasmResult): Uint8Array {\n if (!result.ok) {\n throw new Error(result.err ?? 'PSRT call failed')\n }\n if (!result.data) {\n throw new Error('PSRT call returned no data')\n }\n return result.data\n}\n\nfunction parseDocResult(result: WasmResult): PsrtDocument {\n return JSON.parse(decodeData(requireBytes(result))) as PsrtDocument\n}\n\nfunction parseTextResult(result: WasmResult): string {\n return decodeData(requireBytes(result))\n}\n\nfunction parseJSONResult<T>(result: WasmResult): T {\n return JSON.parse(decodeData(requireBytes(result))) as T\n}\n\nexport function invokeDocMutation(\n handler: string,\n doc: PsrtDocument,\n ...extra: unknown[]\n): PsrtDocument {\n return parseDocResult(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeDocQuery<T>(handler: string, doc: PsrtDocument, ...extra: unknown[]): T {\n return parseJSONResult<T>(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeRaw<T>(handler: string, ...args: unknown[]): T {\n return parseJSONResult<T>(call(handler, ...args))\n}\n\nexport function invokeText(handler: string, ...args: unknown[]): string {\n return parseTextResult(call(handler, ...args))\n}\n\nexport function invokeStyleMutation(handler: string, style: PsrtStyle, ...extra: unknown[]): PsrtStyle {\n return parseJSONResult<PsrtStyle>(call(handler, style, ...extra))\n}\n\nexport function invokeParse(psrtString: string): PsrtDocument {\n return parseDocResult(call('parse', psrtString))\n}\n\nexport function invokeStringify(doc: PsrtDocument): string {\n return parseTextResult(call('stringify', encodeDoc(doc)))\n}\n\nexport function invokeFormatDocument(doc: PsrtDocument): string {\n return parseTextResult(call('formatDocument', encodeDoc(doc)))\n}\n\nexport function invokeCompileToHtml(\n input: PsrtDocument | string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToHtml', encodeInput(input), options ?? {}))\n}\n\nexport function invokeCompileToSvg(\n input: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToSvg', encodeInput(input), pageName, options ?? {}))\n}\n\nexport function wireWasmFromGlobal(): void {\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('PSRT core exports not found')\n }\n wasmExports = exp\n}\n\n/** @internal */\nexport function setWasmExports(\n exports: Record<string, (...args: unknown[]) => WasmResult>,\n): void {\n wasmExports = exports\n}\n","import { bootCore } from './runtime/boot.js'\n\n/** Initializes PSRT. Call once at app startup before any other SDK API. */\nexport async function initPsrt(): Promise<void> {\n await bootCore()\n}\n","import { invokeFormatDocument, invokeParse, invokeStringify } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Converts a .psrt string into a typed PsrtDocument. */\nexport function parse(psrtString: string): PsrtDocument {\n return invokeParse(psrtString)\n}\n\n/** Converts a PsrtDocument back to normative .psrt text. */\nexport function stringify(doc: PsrtDocument): string {\n return invokeStringify(doc)\n}\n\n/** Formats a document with editor cleanup rules. */\nexport function formatDocument(doc: PsrtDocument): string {\n return invokeFormatDocument(doc)\n}\n","import { invokeCompileToHtml, invokeCompileToSvg } from './wasm.js'\nimport type { CompileOptions, PsrtDocument } from './types.js'\n\n/** Compiles the document to a self-contained HTML string. */\nexport function compileToHtml(doc: PsrtDocument | string, options?: CompileOptions): string {\n return invokeCompileToHtml(doc, options)\n}\n\n/** Compiles one page of the document to SVG. */\nexport function compileToSvg(\n doc: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return invokeCompileToSvg(doc, pageName, options)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addConst(doc: PsrtDocument, name: string, value: string): PsrtDocument {\n return invokeDocMutation('addConst', doc, name, value)\n}\n\nexport function removeConst(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removeConst', doc, name)\n}\n\nexport function substituteConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('substituteConstReferences', doc, name, value)\n}\n\nexport function revertConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('revertConstReferences', doc, name, value)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('addFont', doc, url)\n}\n\nexport function removeFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('removeFont', doc, url)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument, PsrtPage, PsrtStyle } from '../types.js'\n\nexport function renamePage(doc: PsrtDocument, oldName: string, newName: string): PsrtDocument {\n return invokeDocMutation('renamePage', doc, oldName, newName)\n}\n\nexport function setPagePath(doc: PsrtDocument, pageName: string, path: string): PsrtDocument {\n return invokeDocMutation('setPagePath', doc, pageName, path)\n}\n\nexport function setPageStyle(\n doc: PsrtDocument,\n pageName: string,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setPageStyle', doc, pageName, key, value, partial)\n}\n\nexport function removePageStyleKey(doc: PsrtDocument, pageName: string, key: string): PsrtDocument {\n return invokeDocMutation('removePageStyleKey', doc, pageName, key)\n}\n\nexport function movePage(\n doc: PsrtDocument,\n pageName: string,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('movePage', doc, pageName, before, after)\n}\n\nexport function addPage(\n doc: PsrtDocument,\n page: PsrtPage,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('addPage', doc, page, before, after)\n}\n\nexport function removePage(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removePage', doc, name)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PositionFields, PsrtDocument, PsrtStyle, PsrtText } from '../types.js'\n\nexport function setTextStyle(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setTextStyle', doc, pageName, textIndex, key, value, partial)\n}\n\nexport function removeTextStyleKey(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeTextStyleKey', doc, pageName, textIndex, key)\n}\n\nexport function setTextContent(\n doc: PsrtDocument,\n pageName: string,\n index: number,\n newContent: string,\n appendContent = false\n): PsrtDocument {\n return invokeDocMutation('setTextContent', doc, pageName, index, newContent, appendContent)\n}\n\nexport function addText(\n doc: PsrtDocument,\n pageName: string,\n text: PsrtText,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addText', doc, pageName, text, beforeIndex, afterIndex)\n}\n\nexport function removeText(doc: PsrtDocument, pageName: string, textIndex: number): PsrtDocument {\n return invokeDocMutation('removeText', doc, pageName, textIndex)\n}\n\nexport function reorderTextRelative(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('reorderTextRelative', doc, pageName, textIndex, beforeIndex, afterIndex)\n}\n\nexport function reorderTextTo(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n to: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextTo', doc, pageName, textIndex, to)\n}\n\nexport function reorderTextByDelta(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextByDelta', doc, pageName, textIndex, delta)\n}\n\nexport function setTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n pos: PositionFields\n): PsrtDocument {\n return invokeDocMutation('setTextPosition', doc, pageName, textIndex, pos)\n}\n\nexport function nudgeTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: PositionFields\n): PsrtDocument {\n return invokeDocMutation('nudgeTextPosition', doc, pageName, textIndex, delta)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { MaskPositionFields, PsrtDocument, PsrtMask, PsrtStyle } from '../types.js'\n\nexport function setMaskPosition(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n pos: MaskPositionFields\n): PsrtDocument {\n const posBytes = new TextEncoder().encode(JSON.stringify(pos))\n return invokeDocMutation('setMaskPosition', doc, pageName, maskIndex, posBytes)\n}\n\nexport function addMask(\n doc: PsrtDocument,\n pageName: string,\n mask: PsrtMask,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addMask', doc, pageName, mask, beforeIndex, afterIndex)\n}\n\nexport function removeMask(doc: PsrtDocument, pageName: string, maskIndex: number): PsrtDocument {\n return invokeDocMutation('removeMask', doc, pageName, maskIndex)\n}\n\nexport function setMaskStyle(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setMaskStyle', doc, pageName, maskIndex, key, value, partial)\n}\n\nexport function removeMaskStyleKey(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeMaskStyleKey', doc, pageName, maskIndex, key)\n}\n","import { parse, stringify } from './parse.js'\nimport type { MaskPositionFields, PositionFields, PsrtDocument, PsrtMask, PsrtPage, PsrtStyle, PsrtText } from './types.js'\nimport {\n addConst,\n removeConst,\n substituteConstReferences,\n revertConstReferences,\n} from './editor/consts.js'\nimport { addFont, removeFont } from './editor/fonts.js'\nimport {\n addPage,\n movePage,\n removePage,\n removePageStyleKey,\n renamePage,\n setPagePath,\n setPageStyle,\n} from './editor/pages.js'\nimport {\n addText,\n nudgeTextPosition,\n removeText,\n removeTextStyleKey,\n reorderTextByDelta,\n reorderTextRelative,\n reorderTextTo,\n setTextContent,\n setTextPosition,\n setTextStyle,\n} from './editor/text.js'\nimport {\n addMask,\n removeMask,\n removeMaskStyleKey,\n setMaskPosition,\n setMaskStyle,\n} from './editor/mask.js'\n\n/** Fluent builder for chained PSRT document edits. */\nexport class Transformer {\n private _doc: PsrtDocument\n\n constructor(input: PsrtDocument | string) {\n this._doc = typeof input === 'string' ? parse(input) : structuredClone(input)\n }\n\n /** Read-only view of the current document state. */\n get document(): Readonly<PsrtDocument> {\n return this._doc\n }\n\n addConst(name: string, value: string): this {\n this._doc = addConst(this._doc, name, value)\n return this\n }\n\n removeConst(name: string): this {\n this._doc = removeConst(this._doc, name)\n return this\n }\n\n substituteConstReferences(name: string, value: string): this {\n this._doc = substituteConstReferences(this._doc, name, value)\n return this\n }\n\n revertConstReferences(name: string, value: string): this {\n this._doc = revertConstReferences(this._doc, name, value)\n return this\n }\n\n addFont(url: string): this {\n this._doc = addFont(this._doc, url)\n return this\n }\n\n removeFont(url: string): this {\n this._doc = removeFont(this._doc, url)\n return this\n }\n\n renamePage(oldName: string, newName: string): this {\n this._doc = renamePage(this._doc, oldName, newName)\n return this\n }\n\n setPagePath(pageName: string, path: string): this {\n this._doc = setPagePath(this._doc, pageName, path)\n return this\n }\n\n setPageStyle(pageName: string, key: string, value: string, partial?: PsrtStyle): this {\n this._doc = setPageStyle(this._doc, pageName, key, value, partial)\n return this\n }\n\n removePageStyleKey(pageName: string, key: string): this {\n this._doc = removePageStyleKey(this._doc, pageName, key)\n return this\n }\n\n movePage(pageName: string, before = '', after = ''): this {\n this._doc = movePage(this._doc, pageName, before, after)\n return this\n }\n\n addPage(page: PsrtPage, before = '', after = ''): this {\n this._doc = addPage(this._doc, page, before, after)\n return this\n }\n\n removePage(name: string): this {\n this._doc = removePage(this._doc, name)\n return this\n }\n\n setTextStyle(\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setTextStyle(this._doc, pageName, textIndex, key, value, partial)\n return this\n }\n\n removeTextStyleKey(pageName: string, textIndex: number, key: string): this {\n this._doc = removeTextStyleKey(this._doc, pageName, textIndex, key)\n return this\n }\n\n setTextContent(pageName: string, index: number, content: string, appendContent = false): this {\n this._doc = setTextContent(this._doc, pageName, index, content, appendContent)\n return this\n }\n\n addText(\n pageName: string,\n text: PsrtText,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addText(this._doc, pageName, text, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeText(pageName: string, textIndex: number): this {\n this._doc = removeText(this._doc, pageName, textIndex)\n return this\n }\n\n reorderTextRelative(\n pageName: string,\n textIndex: number,\n beforeIndex = 0,\n afterIndex = 0\n ): this {\n this._doc = reorderTextRelative(this._doc, pageName, textIndex, beforeIndex, afterIndex)\n return this\n }\n\n reorderTextTo(pageName: string, textIndex: number, to: number): this {\n this._doc = reorderTextTo(this._doc, pageName, textIndex, to)\n return this\n }\n\n reorderTextByDelta(pageName: string, textIndex: number, delta: number): this {\n this._doc = reorderTextByDelta(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setTextPosition(pageName: string, textIndex: number, pos: PositionFields): this {\n this._doc = setTextPosition(this._doc, pageName, textIndex, pos)\n return this\n }\n\n nudgeTextPosition(pageName: string, textIndex: number, delta: PositionFields): this {\n this._doc = nudgeTextPosition(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setMaskPosition(pageName: string, maskIndex: number, pos: MaskPositionFields): this {\n this._doc = setMaskPosition(this._doc, pageName, maskIndex, pos)\n return this\n }\n\n addMask(\n pageName: string,\n mask: PsrtMask,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addMask(this._doc, pageName, mask, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeMask(pageName: string, maskIndex: number): this {\n this._doc = removeMask(this._doc, pageName, maskIndex)\n return this\n }\n\n setMaskStyle(\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setMaskStyle(this._doc, pageName, maskIndex, key, value, partial)\n return this\n }\n\n removeMaskStyleKey(pageName: string, maskIndex: number, key: string): this {\n this._doc = removeMaskStyleKey(this._doc, pageName, maskIndex, key)\n return this\n }\n\n /** Returns the accumulated document after the edit chain. */\n build(): PsrtDocument {\n return structuredClone(this._doc)\n }\n\n /** Shortcut: build() + stringify(). */\n buildPsrt(): string {\n return stringify(this.build())\n }\n}\n\nexport function transform(input: PsrtDocument | string): Transformer {\n return new Transformer(input)\n}\n","import { invokeRaw, invokeText } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\nexport interface WebPreviewStyle {\n container: Record<string, string>\n text: Record<string, string>\n hasStroke: boolean\n}\n\n/** Adapts text/mask entries for live web preview CSS (percent → px, stroke → WebKit, etc.). */\nexport function adaptEntriesForWeb(\n entriesJSON: string,\n canvasW: number,\n canvasH: number,\n zoom: number,\n): WebPreviewStyle[] {\n return invokeRaw<WebPreviewStyle[]>('adaptEntriesForWeb', entriesJSON, canvasW, canvasH, zoom)\n}\n\n/** Applies a page PSRT fragment into a full document. */\nexport function mergePageDocumentPSRT(\n fullDocJSON: string,\n pageName: string,\n psrtText: string,\n): PsrtDocument {\n const json = invokeText('mergePageDocumentPSRT', fullDocJSON, pageName, psrtText)\n return JSON.parse(json) as PsrtDocument\n}\n\n/** Formats one page plus document fonts and constants as PSRT text. */\nexport function formatPageDocumentJSON(docJSON: string, pageName: string): string {\n return invokeText('formatPageDocumentJSON', docJSON, pageName)\n}\n","import { invokeStyleMutation } from '../wasm.js'\nimport type { PsrtStyle } from '../types.js'\n\nexport function setStyleKey(style: PsrtStyle, key: string, value: string): PsrtStyle {\n return invokeStyleMutation('setStyleKey', style, key, value) as PsrtStyle\n}\n\nexport function removeStyleKey(style: PsrtStyle, key: string): PsrtStyle {\n return invokeStyleMutation('removeStyleKey', style, key) as PsrtStyle\n}\n\nexport function mergeStyle(style: PsrtStyle, partial: PsrtStyle): PsrtStyle {\n const partialBytes = new TextEncoder().encode(JSON.stringify(partial))\n return invokeStyleMutation('mergeStyle', style, partialBytes) as PsrtStyle\n}\n","import { invokeDocQuery, invokeRaw } from '../wasm.js'\nimport type { PsrtDocument, PsrtMask, PsrtPage, PsrtText } from '../types.js'\n\nexport function findPage(doc: PsrtDocument, name: string): PsrtPage {\n return invokeDocQuery<PsrtPage>('findPage', doc, name)\n}\n\nexport function findPageIndex(doc: PsrtDocument, name: string): number {\n return invokeDocQuery<{ index: number }>('findPageIndex', doc, name).index\n}\n\nexport function findTextByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtText {\n return invokeDocQuery<PsrtText>('findTextByIndex', doc, pageName, index)\n}\n\nexport function findMaskByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtMask {\n return invokeDocQuery<PsrtMask>('findMaskByIndex', doc, pageName, index)\n}\n\nexport function parseTextIndex(s: string): number {\n return invokeRaw<{ index: number }>('parseTextIndex', s).index\n}\n","import { invokeDocMutation } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Expands all @const@ placeholders in styles, content, and URLs. */\nexport function resolveDocument(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocument', doc)\n}\n\n/** Like resolveDocument but throws on invalid style JSON after expansion. */\nexport function resolveDocumentStrict(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocumentStrict', doc)\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,6 @@
1
+ /** Initializes PSRT. Call once at app startup before any other SDK API. */
2
+ declare function initPsrt(): Promise<void>;
3
+
1
4
  /** JSON object or compact style string from PSRT. */
2
5
  type PsrtStyle = Record<string, unknown> | string;
3
6
  /** Canonical PSRT document representation. */
@@ -55,8 +58,6 @@ interface CompileOptions {
55
58
  noScript?: boolean;
56
59
  }
57
60
 
58
- declare function initPsrt(wasmUrl?: string): Promise<void>;
59
-
60
61
  /** Converts a .psrt string into a typed PsrtDocument. */
61
62
  declare function parse(psrtString: string): PsrtDocument;
62
63
  /** Converts a PsrtDocument back to normative .psrt text. */
package/dist/index.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ /** Initializes PSRT. Call once at app startup before any other SDK API. */
2
+ declare function initPsrt(): Promise<void>;
3
+
1
4
  /** JSON object or compact style string from PSRT. */
2
5
  type PsrtStyle = Record<string, unknown> | string;
3
6
  /** Canonical PSRT document representation. */
@@ -55,8 +58,6 @@ interface CompileOptions {
55
58
  noScript?: boolean;
56
59
  }
57
60
 
58
- declare function initPsrt(wasmUrl?: string): Promise<void>;
59
-
60
61
  /** Converts a .psrt string into a typed PsrtDocument. */
61
62
  declare function parse(psrtString: string): PsrtDocument;
62
63
  /** Converts a PsrtDocument back to normative .psrt text. */
package/dist/index.js CHANGED
@@ -1,3 +1,8 @@
1
+ // src/runtime/boot.ts
2
+ import { existsSync, readFileSync } from "fs";
3
+ import { dirname, join } from "path";
4
+ import { fileURLToPath, pathToFileURL } from "url";
5
+
1
6
  // src/wasm.ts
2
7
  var decoder = new TextDecoder();
3
8
  var encoder = new TextEncoder();
@@ -25,21 +30,21 @@ function encodeArg(arg) {
25
30
  }
26
31
  function call(name, ...args) {
27
32
  if (!wasmExports) {
28
- throw new Error("PSRT WASM not initialized; call initPsrt() first");
33
+ throw new Error("PSRT is not initialized; call initPsrt() first");
29
34
  }
30
35
  const fn = wasmExports[name];
31
36
  if (!fn) {
32
- throw new Error(`unknown WASM handler: ${name}`);
37
+ throw new Error(`unknown PSRT handler: ${name}`);
33
38
  }
34
39
  const encoded = args.map(encodeArg);
35
40
  return fn(...encoded);
36
41
  }
37
42
  function requireBytes(result) {
38
43
  if (!result.ok) {
39
- throw new Error(result.err ?? "WASM call failed");
44
+ throw new Error(result.err ?? "PSRT call failed");
40
45
  }
41
46
  if (!result.data) {
42
- throw new Error("WASM call returned no data");
47
+ throw new Error("PSRT call returned no data");
43
48
  }
44
49
  return result.data;
45
50
  }
@@ -85,34 +90,30 @@ function invokeCompileToSvg(input, pageName, options) {
85
90
  function wireWasmFromGlobal() {
86
91
  const exp = globalThis.psrtWasm;
87
92
  if (!exp) {
88
- throw new Error("psrtWasm exports not found on globalThis");
93
+ throw new Error("PSRT core exports not found");
89
94
  }
90
95
  wasmExports = exp;
91
96
  }
92
- async function initPsrt(wasmUrl) {
93
- if (wasmExports) {
94
- return;
95
- }
96
- if (globalThis.psrtWasm) {
97
- wireWasmFromGlobal();
98
- return;
99
- }
100
- await loadWasmExec();
101
- const go = new Go();
102
- const url = wasmUrl ?? new URL("../wasm/psrt.wasm", import.meta.url).href;
103
- const response = await fetch(url);
104
- if (!response.ok) {
105
- throw new Error(`failed to fetch WASM: ${response.status}`);
106
- }
107
- const bytes = await response.arrayBuffer();
108
- const { instance } = await WebAssembly.instantiate(bytes, go.importObject);
109
- void go.run(instance);
110
- await waitForExports();
111
- const exp = globalThis.psrtWasm;
112
- if (!exp) {
113
- throw new Error("psrtWasm exports not found after WASM init");
114
- }
115
- wasmExports = exp;
97
+
98
+ // src/runtime/boot.ts
99
+ var bootPromise = null;
100
+ function isNodeRuntime() {
101
+ return typeof process !== "undefined" && Boolean(process.versions?.node);
102
+ }
103
+ function wasmDir() {
104
+ let dir = dirname(fileURLToPath(import.meta.url));
105
+ for (; ; ) {
106
+ const candidate = join(dir, "wasm", "psrt.wasm");
107
+ if (existsSync(candidate)) {
108
+ return join(dir, "wasm");
109
+ }
110
+ const parent = dirname(dir);
111
+ if (parent === dir) {
112
+ break;
113
+ }
114
+ dir = parent;
115
+ }
116
+ throw new Error("PSRT core binary not found");
116
117
  }
117
118
  function waitForExports() {
118
119
  return new Promise((resolve, reject) => {
@@ -124,7 +125,7 @@ function waitForExports() {
124
125
  }
125
126
  attempts++;
126
127
  if (attempts > 200) {
127
- reject(new Error("timeout waiting for psrtWasm exports"));
128
+ reject(new Error("timeout loading PSRT core"));
128
129
  return;
129
130
  }
130
131
  setTimeout(tick, 10);
@@ -132,15 +133,51 @@ function waitForExports() {
132
133
  tick();
133
134
  });
134
135
  }
135
- async function loadWasmExec() {
136
+ async function loadGoRuntime() {
136
137
  if (typeof globalThis.Go !== "undefined") {
137
138
  return;
138
139
  }
139
- const scriptUrl = new URL("../wasm/wasm_exec.js", import.meta.url).href;
140
- await import(
141
- /* @vite-ignore */
142
- scriptUrl
143
- );
140
+ const scriptPath = join(wasmDir(), "wasm_exec.js");
141
+ await import(pathToFileURL(scriptPath).href);
142
+ }
143
+ async function loadCoreBytes() {
144
+ if (isNodeRuntime()) {
145
+ const bytes = readFileSync(join(wasmDir(), "psrt.wasm"));
146
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
147
+ }
148
+ const url = new URL("../../wasm/psrt.wasm", import.meta.url).href;
149
+ const response = await fetch(url);
150
+ if (!response.ok) {
151
+ throw new Error(`failed to load PSRT core (${response.status})`);
152
+ }
153
+ return response.arrayBuffer();
154
+ }
155
+ async function startCore(bytes) {
156
+ await loadGoRuntime();
157
+ const go = new Go();
158
+ const { instance } = await WebAssembly.instantiate(bytes, go.importObject);
159
+ void go.run(instance);
160
+ await waitForExports();
161
+ wireWasmFromGlobal();
162
+ }
163
+ async function bootCore() {
164
+ if (bootPromise) {
165
+ return bootPromise;
166
+ }
167
+ if (globalThis.psrtWasm) {
168
+ wireWasmFromGlobal();
169
+ return;
170
+ }
171
+ bootPromise = (async () => {
172
+ const bytes = await loadCoreBytes();
173
+ await startCore(bytes);
174
+ })();
175
+ return bootPromise;
176
+ }
177
+
178
+ // src/init.ts
179
+ async function initPsrt() {
180
+ await bootCore();
144
181
  }
145
182
 
146
183
  // src/parse.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wasm.ts","../src/parse.ts","../src/compile.ts","../src/editor/consts.ts","../src/editor/fonts.ts","../src/editor/pages.ts","../src/editor/text.ts","../src/editor/mask.ts","../src/transformer.ts","../src/gui.ts","../src/editor/style.ts","../src/editor/lookup.ts","../src/resolve.ts"],"sourcesContent":["import type { CompileOptions, PsrtDocument, PsrtStyle, WasmResult } from './types.js'\n\nconst decoder = new TextDecoder()\nconst encoder = new TextEncoder()\n\nlet wasmExports: Record<string, (...args: unknown[]) => WasmResult> | null = null\n\nfunction decodeData(data: Uint8Array): string {\n return decoder.decode(data)\n}\n\nfunction encodeDoc(doc: PsrtDocument): Uint8Array {\n return encoder.encode(JSON.stringify(doc))\n}\n\nfunction encodeInput(input: PsrtDocument | string): Uint8Array | string {\n return typeof input === 'string' ? input : encodeDoc(input)\n}\n\nfunction encodeArg(arg: unknown): unknown {\n if (arg === undefined) {\n return undefined\n }\n if (arg instanceof Uint8Array) {\n return arg\n }\n if (typeof arg === 'object' && arg !== null) {\n return encoder.encode(JSON.stringify(arg))\n }\n return arg\n}\n\nfunction call(name: string, ...args: unknown[]): WasmResult {\n if (!wasmExports) {\n throw new Error('PSRT WASM not initialized; call initPsrt() first')\n }\n const fn = wasmExports[name]\n if (!fn) {\n throw new Error(`unknown WASM handler: ${name}`)\n }\n const encoded = args.map(encodeArg)\n return fn(...encoded) as WasmResult\n}\n\nfunction requireBytes(result: WasmResult): Uint8Array {\n if (!result.ok) {\n throw new Error(result.err ?? 'WASM call failed')\n }\n if (!result.data) {\n throw new Error('WASM call returned no data')\n }\n return result.data\n}\n\nfunction parseDocResult(result: WasmResult): PsrtDocument {\n return JSON.parse(decodeData(requireBytes(result))) as PsrtDocument\n}\n\nfunction parseTextResult(result: WasmResult): string {\n return decodeData(requireBytes(result))\n}\n\nfunction parseJSONResult<T>(result: WasmResult): T {\n return JSON.parse(decodeData(requireBytes(result))) as T\n}\n\nexport function invokeDocMutation(\n handler: string,\n doc: PsrtDocument,\n ...extra: unknown[]\n): PsrtDocument {\n return parseDocResult(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeDocQuery<T>(handler: string, doc: PsrtDocument, ...extra: unknown[]): T {\n return parseJSONResult<T>(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeRaw<T>(handler: string, ...args: unknown[]): T {\n return parseJSONResult<T>(call(handler, ...args))\n}\n\nexport function invokeText(handler: string, ...args: unknown[]): string {\n return parseTextResult(call(handler, ...args))\n}\n\nexport function invokeStyleMutation(handler: string, style: PsrtStyle, ...extra: unknown[]): PsrtStyle {\n return parseJSONResult<PsrtStyle>(call(handler, style, ...extra))\n}\n\nexport function invokeParse(psrtString: string): PsrtDocument {\n return parseDocResult(call('parse', psrtString))\n}\n\nexport function invokeStringify(doc: PsrtDocument): string {\n return parseTextResult(call('stringify', encodeDoc(doc)))\n}\n\nexport function invokeFormatDocument(doc: PsrtDocument): string {\n return parseTextResult(call('formatDocument', encodeDoc(doc)))\n}\n\nexport function invokeCompileToHtml(\n input: PsrtDocument | string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToHtml', encodeInput(input), options ?? {}))\n}\n\nexport function invokeCompileToSvg(\n input: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToSvg', encodeInput(input), pageName, options ?? {}))\n}\n\nexport function wireWasmFromGlobal(): void {\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('psrtWasm exports not found on globalThis')\n }\n wasmExports = exp\n}\n\nexport async function initPsrt(wasmUrl?: string): Promise<void> {\n if (wasmExports) {\n return\n }\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n wireWasmFromGlobal()\n return\n }\n await loadWasmExec()\n const go = new Go()\n const url = wasmUrl ?? new URL('../wasm/psrt.wasm', import.meta.url).href\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`failed to fetch WASM: ${response.status}`)\n }\n const bytes = await response.arrayBuffer()\n const { instance } = await WebAssembly.instantiate(bytes, go.importObject)\n void go.run(instance)\n await waitForExports()\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('psrtWasm exports not found after WASM init')\n }\n wasmExports = exp\n}\n\nfunction waitForExports(): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0\n const tick = (): void => {\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n resolve()\n return\n }\n attempts++\n if (attempts > 200) {\n reject(new Error('timeout waiting for psrtWasm exports'))\n return\n }\n setTimeout(tick, 10)\n }\n tick()\n })\n}\n\nasync function loadWasmExec(): Promise<void> {\n if (typeof (globalThis as { Go?: unknown }).Go !== 'undefined') {\n return\n }\n const scriptUrl = new URL('../wasm/wasm_exec.js', import.meta.url).href\n await import(/* @vite-ignore */ scriptUrl)\n}\n\ndeclare class Go {\n importObject: WebAssembly.Imports\n run(instance: WebAssembly.Instance): Promise<void>\n}\n","import { invokeFormatDocument, invokeParse, invokeStringify } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Converts a .psrt string into a typed PsrtDocument. */\nexport function parse(psrtString: string): PsrtDocument {\n return invokeParse(psrtString)\n}\n\n/** Converts a PsrtDocument back to normative .psrt text. */\nexport function stringify(doc: PsrtDocument): string {\n return invokeStringify(doc)\n}\n\n/** Formats a document with editor cleanup rules. */\nexport function formatDocument(doc: PsrtDocument): string {\n return invokeFormatDocument(doc)\n}\n","import { invokeCompileToHtml, invokeCompileToSvg } from './wasm.js'\nimport type { CompileOptions, PsrtDocument } from './types.js'\n\n/** Compiles the document to a self-contained HTML string. */\nexport function compileToHtml(doc: PsrtDocument | string, options?: CompileOptions): string {\n return invokeCompileToHtml(doc, options)\n}\n\n/** Compiles one page of the document to SVG. */\nexport function compileToSvg(\n doc: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return invokeCompileToSvg(doc, pageName, options)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addConst(doc: PsrtDocument, name: string, value: string): PsrtDocument {\n return invokeDocMutation('addConst', doc, name, value)\n}\n\nexport function removeConst(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removeConst', doc, name)\n}\n\nexport function substituteConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('substituteConstReferences', doc, name, value)\n}\n\nexport function revertConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('revertConstReferences', doc, name, value)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('addFont', doc, url)\n}\n\nexport function removeFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('removeFont', doc, url)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument, PsrtPage, PsrtStyle } from '../types.js'\n\nexport function renamePage(doc: PsrtDocument, oldName: string, newName: string): PsrtDocument {\n return invokeDocMutation('renamePage', doc, oldName, newName)\n}\n\nexport function setPagePath(doc: PsrtDocument, pageName: string, path: string): PsrtDocument {\n return invokeDocMutation('setPagePath', doc, pageName, path)\n}\n\nexport function setPageStyle(\n doc: PsrtDocument,\n pageName: string,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setPageStyle', doc, pageName, key, value, partial)\n}\n\nexport function removePageStyleKey(doc: PsrtDocument, pageName: string, key: string): PsrtDocument {\n return invokeDocMutation('removePageStyleKey', doc, pageName, key)\n}\n\nexport function movePage(\n doc: PsrtDocument,\n pageName: string,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('movePage', doc, pageName, before, after)\n}\n\nexport function addPage(\n doc: PsrtDocument,\n page: PsrtPage,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('addPage', doc, page, before, after)\n}\n\nexport function removePage(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removePage', doc, name)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PositionFields, PsrtDocument, PsrtStyle, PsrtText } from '../types.js'\n\nexport function setTextStyle(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setTextStyle', doc, pageName, textIndex, key, value, partial)\n}\n\nexport function removeTextStyleKey(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeTextStyleKey', doc, pageName, textIndex, key)\n}\n\nexport function setTextContent(\n doc: PsrtDocument,\n pageName: string,\n index: number,\n newContent: string,\n appendContent = false\n): PsrtDocument {\n return invokeDocMutation('setTextContent', doc, pageName, index, newContent, appendContent)\n}\n\nexport function addText(\n doc: PsrtDocument,\n pageName: string,\n text: PsrtText,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addText', doc, pageName, text, beforeIndex, afterIndex)\n}\n\nexport function removeText(doc: PsrtDocument, pageName: string, textIndex: number): PsrtDocument {\n return invokeDocMutation('removeText', doc, pageName, textIndex)\n}\n\nexport function reorderTextRelative(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('reorderTextRelative', doc, pageName, textIndex, beforeIndex, afterIndex)\n}\n\nexport function reorderTextTo(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n to: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextTo', doc, pageName, textIndex, to)\n}\n\nexport function reorderTextByDelta(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextByDelta', doc, pageName, textIndex, delta)\n}\n\nexport function setTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n pos: PositionFields\n): PsrtDocument {\n return invokeDocMutation('setTextPosition', doc, pageName, textIndex, pos)\n}\n\nexport function nudgeTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: PositionFields\n): PsrtDocument {\n return invokeDocMutation('nudgeTextPosition', doc, pageName, textIndex, delta)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { MaskPositionFields, PsrtDocument, PsrtMask, PsrtStyle } from '../types.js'\n\nexport function setMaskPosition(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n pos: MaskPositionFields\n): PsrtDocument {\n const posBytes = new TextEncoder().encode(JSON.stringify(pos))\n return invokeDocMutation('setMaskPosition', doc, pageName, maskIndex, posBytes)\n}\n\nexport function addMask(\n doc: PsrtDocument,\n pageName: string,\n mask: PsrtMask,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addMask', doc, pageName, mask, beforeIndex, afterIndex)\n}\n\nexport function removeMask(doc: PsrtDocument, pageName: string, maskIndex: number): PsrtDocument {\n return invokeDocMutation('removeMask', doc, pageName, maskIndex)\n}\n\nexport function setMaskStyle(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setMaskStyle', doc, pageName, maskIndex, key, value, partial)\n}\n\nexport function removeMaskStyleKey(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeMaskStyleKey', doc, pageName, maskIndex, key)\n}\n","import { parse, stringify } from './parse.js'\nimport type { MaskPositionFields, PositionFields, PsrtDocument, PsrtMask, PsrtPage, PsrtStyle, PsrtText } from './types.js'\nimport {\n addConst,\n removeConst,\n substituteConstReferences,\n revertConstReferences,\n} from './editor/consts.js'\nimport { addFont, removeFont } from './editor/fonts.js'\nimport {\n addPage,\n movePage,\n removePage,\n removePageStyleKey,\n renamePage,\n setPagePath,\n setPageStyle,\n} from './editor/pages.js'\nimport {\n addText,\n nudgeTextPosition,\n removeText,\n removeTextStyleKey,\n reorderTextByDelta,\n reorderTextRelative,\n reorderTextTo,\n setTextContent,\n setTextPosition,\n setTextStyle,\n} from './editor/text.js'\nimport {\n addMask,\n removeMask,\n removeMaskStyleKey,\n setMaskPosition,\n setMaskStyle,\n} from './editor/mask.js'\n\n/** Fluent builder for chained PSRT document edits. */\nexport class Transformer {\n private _doc: PsrtDocument\n\n constructor(input: PsrtDocument | string) {\n this._doc = typeof input === 'string' ? parse(input) : structuredClone(input)\n }\n\n /** Read-only view of the current document state. */\n get document(): Readonly<PsrtDocument> {\n return this._doc\n }\n\n addConst(name: string, value: string): this {\n this._doc = addConst(this._doc, name, value)\n return this\n }\n\n removeConst(name: string): this {\n this._doc = removeConst(this._doc, name)\n return this\n }\n\n substituteConstReferences(name: string, value: string): this {\n this._doc = substituteConstReferences(this._doc, name, value)\n return this\n }\n\n revertConstReferences(name: string, value: string): this {\n this._doc = revertConstReferences(this._doc, name, value)\n return this\n }\n\n addFont(url: string): this {\n this._doc = addFont(this._doc, url)\n return this\n }\n\n removeFont(url: string): this {\n this._doc = removeFont(this._doc, url)\n return this\n }\n\n renamePage(oldName: string, newName: string): this {\n this._doc = renamePage(this._doc, oldName, newName)\n return this\n }\n\n setPagePath(pageName: string, path: string): this {\n this._doc = setPagePath(this._doc, pageName, path)\n return this\n }\n\n setPageStyle(pageName: string, key: string, value: string, partial?: PsrtStyle): this {\n this._doc = setPageStyle(this._doc, pageName, key, value, partial)\n return this\n }\n\n removePageStyleKey(pageName: string, key: string): this {\n this._doc = removePageStyleKey(this._doc, pageName, key)\n return this\n }\n\n movePage(pageName: string, before = '', after = ''): this {\n this._doc = movePage(this._doc, pageName, before, after)\n return this\n }\n\n addPage(page: PsrtPage, before = '', after = ''): this {\n this._doc = addPage(this._doc, page, before, after)\n return this\n }\n\n removePage(name: string): this {\n this._doc = removePage(this._doc, name)\n return this\n }\n\n setTextStyle(\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setTextStyle(this._doc, pageName, textIndex, key, value, partial)\n return this\n }\n\n removeTextStyleKey(pageName: string, textIndex: number, key: string): this {\n this._doc = removeTextStyleKey(this._doc, pageName, textIndex, key)\n return this\n }\n\n setTextContent(pageName: string, index: number, content: string, appendContent = false): this {\n this._doc = setTextContent(this._doc, pageName, index, content, appendContent)\n return this\n }\n\n addText(\n pageName: string,\n text: PsrtText,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addText(this._doc, pageName, text, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeText(pageName: string, textIndex: number): this {\n this._doc = removeText(this._doc, pageName, textIndex)\n return this\n }\n\n reorderTextRelative(\n pageName: string,\n textIndex: number,\n beforeIndex = 0,\n afterIndex = 0\n ): this {\n this._doc = reorderTextRelative(this._doc, pageName, textIndex, beforeIndex, afterIndex)\n return this\n }\n\n reorderTextTo(pageName: string, textIndex: number, to: number): this {\n this._doc = reorderTextTo(this._doc, pageName, textIndex, to)\n return this\n }\n\n reorderTextByDelta(pageName: string, textIndex: number, delta: number): this {\n this._doc = reorderTextByDelta(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setTextPosition(pageName: string, textIndex: number, pos: PositionFields): this {\n this._doc = setTextPosition(this._doc, pageName, textIndex, pos)\n return this\n }\n\n nudgeTextPosition(pageName: string, textIndex: number, delta: PositionFields): this {\n this._doc = nudgeTextPosition(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setMaskPosition(pageName: string, maskIndex: number, pos: MaskPositionFields): this {\n this._doc = setMaskPosition(this._doc, pageName, maskIndex, pos)\n return this\n }\n\n addMask(\n pageName: string,\n mask: PsrtMask,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addMask(this._doc, pageName, mask, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeMask(pageName: string, maskIndex: number): this {\n this._doc = removeMask(this._doc, pageName, maskIndex)\n return this\n }\n\n setMaskStyle(\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setMaskStyle(this._doc, pageName, maskIndex, key, value, partial)\n return this\n }\n\n removeMaskStyleKey(pageName: string, maskIndex: number, key: string): this {\n this._doc = removeMaskStyleKey(this._doc, pageName, maskIndex, key)\n return this\n }\n\n /** Returns the accumulated document after the edit chain. */\n build(): PsrtDocument {\n return structuredClone(this._doc)\n }\n\n /** Shortcut: build() + stringify(). */\n buildPsrt(): string {\n return stringify(this.build())\n }\n}\n\nexport function transform(input: PsrtDocument | string): Transformer {\n return new Transformer(input)\n}\n","import { invokeRaw, invokeText } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\nexport interface WebPreviewStyle {\n container: Record<string, string>\n text: Record<string, string>\n hasStroke: boolean\n}\n\n/** Adapts text/mask entries for live web preview CSS (percent → px, stroke → WebKit, etc.). */\nexport function adaptEntriesForWeb(\n entriesJSON: string,\n canvasW: number,\n canvasH: number,\n zoom: number,\n): WebPreviewStyle[] {\n return invokeRaw<WebPreviewStyle[]>('adaptEntriesForWeb', entriesJSON, canvasW, canvasH, zoom)\n}\n\n/** Applies a page PSRT fragment into a full document. */\nexport function mergePageDocumentPSRT(\n fullDocJSON: string,\n pageName: string,\n psrtText: string,\n): PsrtDocument {\n const json = invokeText('mergePageDocumentPSRT', fullDocJSON, pageName, psrtText)\n return JSON.parse(json) as PsrtDocument\n}\n\n/** Formats one page plus document fonts and constants as PSRT text. */\nexport function formatPageDocumentJSON(docJSON: string, pageName: string): string {\n return invokeText('formatPageDocumentJSON', docJSON, pageName)\n}\n","import { invokeStyleMutation } from '../wasm.js'\nimport type { PsrtStyle } from '../types.js'\n\nexport function setStyleKey(style: PsrtStyle, key: string, value: string): PsrtStyle {\n return invokeStyleMutation('setStyleKey', style, key, value) as PsrtStyle\n}\n\nexport function removeStyleKey(style: PsrtStyle, key: string): PsrtStyle {\n return invokeStyleMutation('removeStyleKey', style, key) as PsrtStyle\n}\n\nexport function mergeStyle(style: PsrtStyle, partial: PsrtStyle): PsrtStyle {\n const partialBytes = new TextEncoder().encode(JSON.stringify(partial))\n return invokeStyleMutation('mergeStyle', style, partialBytes) as PsrtStyle\n}\n","import { invokeDocQuery, invokeRaw } from '../wasm.js'\nimport type { PsrtDocument, PsrtMask, PsrtPage, PsrtText } from '../types.js'\n\nexport function findPage(doc: PsrtDocument, name: string): PsrtPage {\n return invokeDocQuery<PsrtPage>('findPage', doc, name)\n}\n\nexport function findPageIndex(doc: PsrtDocument, name: string): number {\n return invokeDocQuery<{ index: number }>('findPageIndex', doc, name).index\n}\n\nexport function findTextByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtText {\n return invokeDocQuery<PsrtText>('findTextByIndex', doc, pageName, index)\n}\n\nexport function findMaskByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtMask {\n return invokeDocQuery<PsrtMask>('findMaskByIndex', doc, pageName, index)\n}\n\nexport function parseTextIndex(s: string): number {\n return invokeRaw<{ index: number }>('parseTextIndex', s).index\n}\n","import { invokeDocMutation } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Expands all @const@ placeholders in styles, content, and URLs. */\nexport function resolveDocument(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocument', doc)\n}\n\n/** Like resolveDocument but throws on invalid style JSON after expansion. */\nexport function resolveDocumentStrict(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocumentStrict', doc)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/runtime/boot.ts","../src/wasm.ts","../src/init.ts","../src/parse.ts","../src/compile.ts","../src/editor/consts.ts","../src/editor/fonts.ts","../src/editor/pages.ts","../src/editor/text.ts","../src/editor/mask.ts","../src/transformer.ts","../src/gui.ts","../src/editor/style.ts","../src/editor/lookup.ts","../src/resolve.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { setWasmExports, wireWasmFromGlobal } from '../wasm.js'\n\ndeclare class Go {\n importObject: WebAssembly.Imports\n run(instance: WebAssembly.Instance): Promise<void>\n}\n\nlet bootPromise: Promise<void> | null = null\n\nexport function isNodeRuntime(): boolean {\n return typeof process !== 'undefined' && Boolean(process.versions?.node)\n}\n\nfunction wasmDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (;;) {\n const candidate = join(dir, 'wasm', 'psrt.wasm')\n if (existsSync(candidate)) {\n return join(dir, 'wasm')\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n throw new Error('PSRT core binary not found')\n}\n\nfunction waitForExports(): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0\n const tick = (): void => {\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n resolve()\n return\n }\n attempts++\n if (attempts > 200) {\n reject(new Error('timeout loading PSRT core'))\n return\n }\n setTimeout(tick, 10)\n }\n tick()\n })\n}\n\nasync function loadGoRuntime(): Promise<void> {\n if (typeof (globalThis as { Go?: unknown }).Go !== 'undefined') {\n return\n }\n const scriptPath = join(wasmDir(), 'wasm_exec.js')\n await import(pathToFileURL(scriptPath).href)\n}\n\nasync function loadCoreBytes(): Promise<ArrayBuffer> {\n if (isNodeRuntime()) {\n const bytes = readFileSync(join(wasmDir(), 'psrt.wasm'))\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)\n }\n const url = new URL('../../wasm/psrt.wasm', import.meta.url).href\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`failed to load PSRT core (${response.status})`)\n }\n return response.arrayBuffer()\n}\n\nasync function startCore(bytes: ArrayBuffer): Promise<void> {\n await loadGoRuntime()\n const go = new Go()\n const { instance } = await WebAssembly.instantiate(bytes, go.importObject)\n void go.run(instance)\n await waitForExports()\n wireWasmFromGlobal()\n}\n\n/** Loads the PSRT core once. */\nexport async function bootCore(): Promise<void> {\n if (bootPromise) {\n return bootPromise\n }\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n wireWasmFromGlobal()\n return\n }\n bootPromise = (async () => {\n const bytes = await loadCoreBytes()\n await startCore(bytes)\n })()\n return bootPromise\n}\n\n/** @internal Test hook — inject pre-started core exports. */\nexport function attachCoreExports(\n exports: Record<string, (...args: unknown[]) => unknown>,\n): void {\n setWasmExports(exports as Record<string, (...args: unknown[]) => import('../types.js').WasmResult>)\n}\n","import type { CompileOptions, PsrtDocument, PsrtStyle, WasmResult } from './types.js'\n\nconst decoder = new TextDecoder()\nconst encoder = new TextEncoder()\n\nlet wasmExports: Record<string, (...args: unknown[]) => WasmResult> | null = null\n\nfunction decodeData(data: Uint8Array): string {\n return decoder.decode(data)\n}\n\nfunction encodeDoc(doc: PsrtDocument): Uint8Array {\n return encoder.encode(JSON.stringify(doc))\n}\n\nfunction encodeInput(input: PsrtDocument | string): Uint8Array | string {\n return typeof input === 'string' ? input : encodeDoc(input)\n}\n\nfunction encodeArg(arg: unknown): unknown {\n if (arg === undefined) {\n return undefined\n }\n if (arg instanceof Uint8Array) {\n return arg\n }\n if (typeof arg === 'object' && arg !== null) {\n return encoder.encode(JSON.stringify(arg))\n }\n return arg\n}\n\nfunction call(name: string, ...args: unknown[]): WasmResult {\n if (!wasmExports) {\n throw new Error('PSRT is not initialized; call initPsrt() first')\n }\n const fn = wasmExports[name]\n if (!fn) {\n throw new Error(`unknown PSRT handler: ${name}`)\n }\n const encoded = args.map(encodeArg)\n return fn(...encoded) as WasmResult\n}\n\nfunction requireBytes(result: WasmResult): Uint8Array {\n if (!result.ok) {\n throw new Error(result.err ?? 'PSRT call failed')\n }\n if (!result.data) {\n throw new Error('PSRT call returned no data')\n }\n return result.data\n}\n\nfunction parseDocResult(result: WasmResult): PsrtDocument {\n return JSON.parse(decodeData(requireBytes(result))) as PsrtDocument\n}\n\nfunction parseTextResult(result: WasmResult): string {\n return decodeData(requireBytes(result))\n}\n\nfunction parseJSONResult<T>(result: WasmResult): T {\n return JSON.parse(decodeData(requireBytes(result))) as T\n}\n\nexport function invokeDocMutation(\n handler: string,\n doc: PsrtDocument,\n ...extra: unknown[]\n): PsrtDocument {\n return parseDocResult(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeDocQuery<T>(handler: string, doc: PsrtDocument, ...extra: unknown[]): T {\n return parseJSONResult<T>(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeRaw<T>(handler: string, ...args: unknown[]): T {\n return parseJSONResult<T>(call(handler, ...args))\n}\n\nexport function invokeText(handler: string, ...args: unknown[]): string {\n return parseTextResult(call(handler, ...args))\n}\n\nexport function invokeStyleMutation(handler: string, style: PsrtStyle, ...extra: unknown[]): PsrtStyle {\n return parseJSONResult<PsrtStyle>(call(handler, style, ...extra))\n}\n\nexport function invokeParse(psrtString: string): PsrtDocument {\n return parseDocResult(call('parse', psrtString))\n}\n\nexport function invokeStringify(doc: PsrtDocument): string {\n return parseTextResult(call('stringify', encodeDoc(doc)))\n}\n\nexport function invokeFormatDocument(doc: PsrtDocument): string {\n return parseTextResult(call('formatDocument', encodeDoc(doc)))\n}\n\nexport function invokeCompileToHtml(\n input: PsrtDocument | string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToHtml', encodeInput(input), options ?? {}))\n}\n\nexport function invokeCompileToSvg(\n input: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToSvg', encodeInput(input), pageName, options ?? {}))\n}\n\nexport function wireWasmFromGlobal(): void {\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('PSRT core exports not found')\n }\n wasmExports = exp\n}\n\n/** @internal */\nexport function setWasmExports(\n exports: Record<string, (...args: unknown[]) => WasmResult>,\n): void {\n wasmExports = exports\n}\n","import { bootCore } from './runtime/boot.js'\n\n/** Initializes PSRT. Call once at app startup before any other SDK API. */\nexport async function initPsrt(): Promise<void> {\n await bootCore()\n}\n","import { invokeFormatDocument, invokeParse, invokeStringify } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Converts a .psrt string into a typed PsrtDocument. */\nexport function parse(psrtString: string): PsrtDocument {\n return invokeParse(psrtString)\n}\n\n/** Converts a PsrtDocument back to normative .psrt text. */\nexport function stringify(doc: PsrtDocument): string {\n return invokeStringify(doc)\n}\n\n/** Formats a document with editor cleanup rules. */\nexport function formatDocument(doc: PsrtDocument): string {\n return invokeFormatDocument(doc)\n}\n","import { invokeCompileToHtml, invokeCompileToSvg } from './wasm.js'\nimport type { CompileOptions, PsrtDocument } from './types.js'\n\n/** Compiles the document to a self-contained HTML string. */\nexport function compileToHtml(doc: PsrtDocument | string, options?: CompileOptions): string {\n return invokeCompileToHtml(doc, options)\n}\n\n/** Compiles one page of the document to SVG. */\nexport function compileToSvg(\n doc: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return invokeCompileToSvg(doc, pageName, options)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addConst(doc: PsrtDocument, name: string, value: string): PsrtDocument {\n return invokeDocMutation('addConst', doc, name, value)\n}\n\nexport function removeConst(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removeConst', doc, name)\n}\n\nexport function substituteConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('substituteConstReferences', doc, name, value)\n}\n\nexport function revertConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('revertConstReferences', doc, name, value)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('addFont', doc, url)\n}\n\nexport function removeFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('removeFont', doc, url)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument, PsrtPage, PsrtStyle } from '../types.js'\n\nexport function renamePage(doc: PsrtDocument, oldName: string, newName: string): PsrtDocument {\n return invokeDocMutation('renamePage', doc, oldName, newName)\n}\n\nexport function setPagePath(doc: PsrtDocument, pageName: string, path: string): PsrtDocument {\n return invokeDocMutation('setPagePath', doc, pageName, path)\n}\n\nexport function setPageStyle(\n doc: PsrtDocument,\n pageName: string,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setPageStyle', doc, pageName, key, value, partial)\n}\n\nexport function removePageStyleKey(doc: PsrtDocument, pageName: string, key: string): PsrtDocument {\n return invokeDocMutation('removePageStyleKey', doc, pageName, key)\n}\n\nexport function movePage(\n doc: PsrtDocument,\n pageName: string,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('movePage', doc, pageName, before, after)\n}\n\nexport function addPage(\n doc: PsrtDocument,\n page: PsrtPage,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('addPage', doc, page, before, after)\n}\n\nexport function removePage(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removePage', doc, name)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PositionFields, PsrtDocument, PsrtStyle, PsrtText } from '../types.js'\n\nexport function setTextStyle(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setTextStyle', doc, pageName, textIndex, key, value, partial)\n}\n\nexport function removeTextStyleKey(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeTextStyleKey', doc, pageName, textIndex, key)\n}\n\nexport function setTextContent(\n doc: PsrtDocument,\n pageName: string,\n index: number,\n newContent: string,\n appendContent = false\n): PsrtDocument {\n return invokeDocMutation('setTextContent', doc, pageName, index, newContent, appendContent)\n}\n\nexport function addText(\n doc: PsrtDocument,\n pageName: string,\n text: PsrtText,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addText', doc, pageName, text, beforeIndex, afterIndex)\n}\n\nexport function removeText(doc: PsrtDocument, pageName: string, textIndex: number): PsrtDocument {\n return invokeDocMutation('removeText', doc, pageName, textIndex)\n}\n\nexport function reorderTextRelative(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('reorderTextRelative', doc, pageName, textIndex, beforeIndex, afterIndex)\n}\n\nexport function reorderTextTo(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n to: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextTo', doc, pageName, textIndex, to)\n}\n\nexport function reorderTextByDelta(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextByDelta', doc, pageName, textIndex, delta)\n}\n\nexport function setTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n pos: PositionFields\n): PsrtDocument {\n return invokeDocMutation('setTextPosition', doc, pageName, textIndex, pos)\n}\n\nexport function nudgeTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: PositionFields\n): PsrtDocument {\n return invokeDocMutation('nudgeTextPosition', doc, pageName, textIndex, delta)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { MaskPositionFields, PsrtDocument, PsrtMask, PsrtStyle } from '../types.js'\n\nexport function setMaskPosition(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n pos: MaskPositionFields\n): PsrtDocument {\n const posBytes = new TextEncoder().encode(JSON.stringify(pos))\n return invokeDocMutation('setMaskPosition', doc, pageName, maskIndex, posBytes)\n}\n\nexport function addMask(\n doc: PsrtDocument,\n pageName: string,\n mask: PsrtMask,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addMask', doc, pageName, mask, beforeIndex, afterIndex)\n}\n\nexport function removeMask(doc: PsrtDocument, pageName: string, maskIndex: number): PsrtDocument {\n return invokeDocMutation('removeMask', doc, pageName, maskIndex)\n}\n\nexport function setMaskStyle(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setMaskStyle', doc, pageName, maskIndex, key, value, partial)\n}\n\nexport function removeMaskStyleKey(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeMaskStyleKey', doc, pageName, maskIndex, key)\n}\n","import { parse, stringify } from './parse.js'\nimport type { MaskPositionFields, PositionFields, PsrtDocument, PsrtMask, PsrtPage, PsrtStyle, PsrtText } from './types.js'\nimport {\n addConst,\n removeConst,\n substituteConstReferences,\n revertConstReferences,\n} from './editor/consts.js'\nimport { addFont, removeFont } from './editor/fonts.js'\nimport {\n addPage,\n movePage,\n removePage,\n removePageStyleKey,\n renamePage,\n setPagePath,\n setPageStyle,\n} from './editor/pages.js'\nimport {\n addText,\n nudgeTextPosition,\n removeText,\n removeTextStyleKey,\n reorderTextByDelta,\n reorderTextRelative,\n reorderTextTo,\n setTextContent,\n setTextPosition,\n setTextStyle,\n} from './editor/text.js'\nimport {\n addMask,\n removeMask,\n removeMaskStyleKey,\n setMaskPosition,\n setMaskStyle,\n} from './editor/mask.js'\n\n/** Fluent builder for chained PSRT document edits. */\nexport class Transformer {\n private _doc: PsrtDocument\n\n constructor(input: PsrtDocument | string) {\n this._doc = typeof input === 'string' ? parse(input) : structuredClone(input)\n }\n\n /** Read-only view of the current document state. */\n get document(): Readonly<PsrtDocument> {\n return this._doc\n }\n\n addConst(name: string, value: string): this {\n this._doc = addConst(this._doc, name, value)\n return this\n }\n\n removeConst(name: string): this {\n this._doc = removeConst(this._doc, name)\n return this\n }\n\n substituteConstReferences(name: string, value: string): this {\n this._doc = substituteConstReferences(this._doc, name, value)\n return this\n }\n\n revertConstReferences(name: string, value: string): this {\n this._doc = revertConstReferences(this._doc, name, value)\n return this\n }\n\n addFont(url: string): this {\n this._doc = addFont(this._doc, url)\n return this\n }\n\n removeFont(url: string): this {\n this._doc = removeFont(this._doc, url)\n return this\n }\n\n renamePage(oldName: string, newName: string): this {\n this._doc = renamePage(this._doc, oldName, newName)\n return this\n }\n\n setPagePath(pageName: string, path: string): this {\n this._doc = setPagePath(this._doc, pageName, path)\n return this\n }\n\n setPageStyle(pageName: string, key: string, value: string, partial?: PsrtStyle): this {\n this._doc = setPageStyle(this._doc, pageName, key, value, partial)\n return this\n }\n\n removePageStyleKey(pageName: string, key: string): this {\n this._doc = removePageStyleKey(this._doc, pageName, key)\n return this\n }\n\n movePage(pageName: string, before = '', after = ''): this {\n this._doc = movePage(this._doc, pageName, before, after)\n return this\n }\n\n addPage(page: PsrtPage, before = '', after = ''): this {\n this._doc = addPage(this._doc, page, before, after)\n return this\n }\n\n removePage(name: string): this {\n this._doc = removePage(this._doc, name)\n return this\n }\n\n setTextStyle(\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setTextStyle(this._doc, pageName, textIndex, key, value, partial)\n return this\n }\n\n removeTextStyleKey(pageName: string, textIndex: number, key: string): this {\n this._doc = removeTextStyleKey(this._doc, pageName, textIndex, key)\n return this\n }\n\n setTextContent(pageName: string, index: number, content: string, appendContent = false): this {\n this._doc = setTextContent(this._doc, pageName, index, content, appendContent)\n return this\n }\n\n addText(\n pageName: string,\n text: PsrtText,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addText(this._doc, pageName, text, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeText(pageName: string, textIndex: number): this {\n this._doc = removeText(this._doc, pageName, textIndex)\n return this\n }\n\n reorderTextRelative(\n pageName: string,\n textIndex: number,\n beforeIndex = 0,\n afterIndex = 0\n ): this {\n this._doc = reorderTextRelative(this._doc, pageName, textIndex, beforeIndex, afterIndex)\n return this\n }\n\n reorderTextTo(pageName: string, textIndex: number, to: number): this {\n this._doc = reorderTextTo(this._doc, pageName, textIndex, to)\n return this\n }\n\n reorderTextByDelta(pageName: string, textIndex: number, delta: number): this {\n this._doc = reorderTextByDelta(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setTextPosition(pageName: string, textIndex: number, pos: PositionFields): this {\n this._doc = setTextPosition(this._doc, pageName, textIndex, pos)\n return this\n }\n\n nudgeTextPosition(pageName: string, textIndex: number, delta: PositionFields): this {\n this._doc = nudgeTextPosition(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setMaskPosition(pageName: string, maskIndex: number, pos: MaskPositionFields): this {\n this._doc = setMaskPosition(this._doc, pageName, maskIndex, pos)\n return this\n }\n\n addMask(\n pageName: string,\n mask: PsrtMask,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addMask(this._doc, pageName, mask, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeMask(pageName: string, maskIndex: number): this {\n this._doc = removeMask(this._doc, pageName, maskIndex)\n return this\n }\n\n setMaskStyle(\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setMaskStyle(this._doc, pageName, maskIndex, key, value, partial)\n return this\n }\n\n removeMaskStyleKey(pageName: string, maskIndex: number, key: string): this {\n this._doc = removeMaskStyleKey(this._doc, pageName, maskIndex, key)\n return this\n }\n\n /** Returns the accumulated document after the edit chain. */\n build(): PsrtDocument {\n return structuredClone(this._doc)\n }\n\n /** Shortcut: build() + stringify(). */\n buildPsrt(): string {\n return stringify(this.build())\n }\n}\n\nexport function transform(input: PsrtDocument | string): Transformer {\n return new Transformer(input)\n}\n","import { invokeRaw, invokeText } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\nexport interface WebPreviewStyle {\n container: Record<string, string>\n text: Record<string, string>\n hasStroke: boolean\n}\n\n/** Adapts text/mask entries for live web preview CSS (percent → px, stroke → WebKit, etc.). */\nexport function adaptEntriesForWeb(\n entriesJSON: string,\n canvasW: number,\n canvasH: number,\n zoom: number,\n): WebPreviewStyle[] {\n return invokeRaw<WebPreviewStyle[]>('adaptEntriesForWeb', entriesJSON, canvasW, canvasH, zoom)\n}\n\n/** Applies a page PSRT fragment into a full document. */\nexport function mergePageDocumentPSRT(\n fullDocJSON: string,\n pageName: string,\n psrtText: string,\n): PsrtDocument {\n const json = invokeText('mergePageDocumentPSRT', fullDocJSON, pageName, psrtText)\n return JSON.parse(json) as PsrtDocument\n}\n\n/** Formats one page plus document fonts and constants as PSRT text. */\nexport function formatPageDocumentJSON(docJSON: string, pageName: string): string {\n return invokeText('formatPageDocumentJSON', docJSON, pageName)\n}\n","import { invokeStyleMutation } from '../wasm.js'\nimport type { PsrtStyle } from '../types.js'\n\nexport function setStyleKey(style: PsrtStyle, key: string, value: string): PsrtStyle {\n return invokeStyleMutation('setStyleKey', style, key, value) as PsrtStyle\n}\n\nexport function removeStyleKey(style: PsrtStyle, key: string): PsrtStyle {\n return invokeStyleMutation('removeStyleKey', style, key) as PsrtStyle\n}\n\nexport function mergeStyle(style: PsrtStyle, partial: PsrtStyle): PsrtStyle {\n const partialBytes = new TextEncoder().encode(JSON.stringify(partial))\n return invokeStyleMutation('mergeStyle', style, partialBytes) as PsrtStyle\n}\n","import { invokeDocQuery, invokeRaw } from '../wasm.js'\nimport type { PsrtDocument, PsrtMask, PsrtPage, PsrtText } from '../types.js'\n\nexport function findPage(doc: PsrtDocument, name: string): PsrtPage {\n return invokeDocQuery<PsrtPage>('findPage', doc, name)\n}\n\nexport function findPageIndex(doc: PsrtDocument, name: string): number {\n return invokeDocQuery<{ index: number }>('findPageIndex', doc, name).index\n}\n\nexport function findTextByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtText {\n return invokeDocQuery<PsrtText>('findTextByIndex', doc, pageName, index)\n}\n\nexport function findMaskByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtMask {\n return invokeDocQuery<PsrtMask>('findMaskByIndex', doc, pageName, index)\n}\n\nexport function parseTextIndex(s: string): number {\n return invokeRaw<{ index: number }>('parseTextIndex', s).index\n}\n","import { invokeDocMutation } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Expands all @const@ placeholders in styles, content, and URLs. */\nexport function resolveDocument(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocument', doc)\n}\n\n/** Like resolveDocument but throws on invalid style JSON after expansion. */\nexport function resolveDocumentStrict(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocumentStrict', doc)\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@psrt/sdk",
3
- "version": "0.1.0",
4
- "description": "Stateless PSRT SDK powered by WebAssembly",
3
+ "version": "0.1.1",
4
+ "description": "Stateless PSRT SDK for parsing, editing, and compiling PSRT documents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",
@@ -11,8 +11,7 @@
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.js",
13
13
  "require": "./dist/index.cjs"
14
- },
15
- "./wasm/*": "./wasm/*"
14
+ }
16
15
  },
17
16
  "files": [
18
17
  "dist",