@aivorynet/slaide 1.0.2 → 1.0.4
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/CHANGELOG.md +27 -1
- package/README.md +29 -8
- package/dist/assets.d.ts +1 -0
- package/dist/assets.js +3 -0
- package/dist/assets.js.map +1 -1
- package/dist/cli.js +70 -5
- package/dist/cli.js.map +1 -1
- package/dist/compiler/compile.d.ts +1 -0
- package/dist/compiler/compile.js +3 -1
- package/dist/compiler/compile.js.map +1 -1
- package/dist/compiler/markdown.d.ts +1 -0
- package/dist/compiler/markdown.js +2 -1
- package/dist/compiler/markdown.js.map +1 -1
- package/dist/desktop/bootstrap.d.ts +31 -0
- package/dist/desktop/bootstrap.js +217 -0
- package/dist/desktop/bootstrap.js.map +1 -0
- package/dist/desktop/paths.d.ts +28 -0
- package/dist/desktop/paths.js +62 -0
- package/dist/desktop/paths.js.map +1 -0
- package/dist/desktop/verify.d.ts +21 -0
- package/dist/desktop/verify.js +78 -0
- package/dist/desktop/verify.js.map +1 -0
- package/dist/engine-entry.js +6 -0
- package/dist/engine-entry.js.map +1 -1
- package/dist/index.js +4 -7
- package/dist/index.js.map +1 -1
- package/dist/master-io.js +12 -0
- package/dist/master-io.js.map +1 -1
- package/dist/parser/parse.d.ts +1 -0
- package/dist/parser/parse.js +3 -2
- package/dist/parser/parse.js.map +1 -1
- package/dist/render/css.js +7 -4
- package/dist/render/css.js.map +1 -1
- package/dist/render/runtime.js +40 -13
- package/dist/render/runtime.js.map +1 -1
- package/dist/update.d.ts +5 -0
- package/dist/update.js +112 -0
- package/dist/update.js.map +1 -0
- package/dist/vocab.d.ts +36 -0
- package/dist/vocab.js +77 -0
- package/dist/vocab.js.map +1 -0
- package/package.json +1 -1
- package/skills/slaide/SKILL.md +1 -1
- package/skills/slaide/grammar.md +183 -0
- package/skills/slaide/reference.md +58 -2
- package/skills/slaide/themes.md +22 -8
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Platform } from './paths.js';
|
|
2
|
+
export interface EnsureOptions {
|
|
3
|
+
/** Skip the download confirmation prompt. */
|
|
4
|
+
yes?: boolean;
|
|
5
|
+
/** Re-download even if the binaries are already present. */
|
|
6
|
+
force?: boolean;
|
|
7
|
+
/** Suppress progress chatter (errors still surface). */
|
|
8
|
+
quiet?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Are the native viewer + engine already installed? */
|
|
11
|
+
export declare function isInstalled(p?: Platform): boolean;
|
|
12
|
+
/** Download + verify + extract the full bundle into ~/.slaide/bin, then register + (Windows) WebView2. */
|
|
13
|
+
export declare function installBinaries(opts?: EnsureOptions): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Ensure the native viewer + engine are installed; download them on first use. Returns the viewer
|
|
16
|
+
* path. Prompts for confirmation when interactive (skip with `yes`); proceeds automatically for an
|
|
17
|
+
* explicit, non-interactive `slaide app` invocation.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureInstalled(opts?: EnsureOptions): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Swap the render-only OSS engine for the Pro superset — the same public, signed download the
|
|
22
|
+
* viewer performs on Sign-in (core/viewer/src/upgrade.rs). Idempotent: a no-op if already Pro.
|
|
23
|
+
* A license still gates editing at runtime; the binary itself is public.
|
|
24
|
+
*/
|
|
25
|
+
export declare function ensureProEngine(opts?: EnsureOptions): Promise<void>;
|
|
26
|
+
/** Launch the native viewer (installing it first if needed). Detaches so the CLI returns. */
|
|
27
|
+
export declare function launchApp(deck: string | undefined, opts?: EnsureOptions): Promise<void>;
|
|
28
|
+
/** Run the engine's `auth` flow (login/logout/status), upgrading to the Pro engine first. */
|
|
29
|
+
export declare function runAuth(sub: string, opts?: EnsureOptions): Promise<number>;
|
|
30
|
+
/** Remove the installed binaries (leaves auth/license caches under ~/.slaide untouched). */
|
|
31
|
+
export declare function uninstall(): void;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// Copyright 2026 AIVory, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// Lazy bootstrap of the native desktop app from the npm CLI. `slaide app` fetches the signed
|
|
4
|
+
// viewer + render-only engine into ~/.slaide/bin on first use, verifies them, registers the
|
|
5
|
+
// `.slaide` file type, and launches. This is the JS analogue of the viewer's own self-upgrade
|
|
6
|
+
// (core/viewer/src/upgrade.rs) — it bootstraps the FIRST binary, which the viewer can't fetch for
|
|
7
|
+
// itself (chicken-and-egg). `slaide auth login` additionally swaps the OSS engine for the Pro
|
|
8
|
+
// superset (same public download the viewer does on Sign-in); a license gates editing at runtime.
|
|
9
|
+
// Editing/Pro source never ships here — only public, signed binaries are pulled. No new deps.
|
|
10
|
+
import { existsSync, mkdirSync, writeFileSync, rmSync, chmodSync, renameSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
14
|
+
import { gunzipSync } from 'node:zlib';
|
|
15
|
+
import { detectPlatform, binDir, distBase, bundleAsset, engineAsset, viewerExe, engineExe, cliExe, } from './paths.js';
|
|
16
|
+
import { verifySha256, verifyMinisign, isPubkeyConfigured } from './verify.js';
|
|
17
|
+
const C = { green: '\x1b[32m', dim: '\x1b[2m', red: '\x1b[31m', bold: '\x1b[1m', reset: '\x1b[0m' };
|
|
18
|
+
function log(opts, msg) {
|
|
19
|
+
if (!opts.quiet)
|
|
20
|
+
console.error(msg);
|
|
21
|
+
}
|
|
22
|
+
/** Are the native viewer + engine already installed? */
|
|
23
|
+
export function isInstalled(p = detectPlatform()) {
|
|
24
|
+
return existsSync(viewerExe(p)) && existsSync(engineExe(p));
|
|
25
|
+
}
|
|
26
|
+
async function fetchBytes(url) {
|
|
27
|
+
const res = await fetch(url, { redirect: 'follow' });
|
|
28
|
+
if (!res.ok)
|
|
29
|
+
throw new Error(`GET ${url} → ${res.status} ${res.statusText}`);
|
|
30
|
+
return Buffer.from(await res.arrayBuffer());
|
|
31
|
+
}
|
|
32
|
+
async function fetchText(url) {
|
|
33
|
+
return (await fetchBytes(url)).toString('utf8');
|
|
34
|
+
}
|
|
35
|
+
async function confirm(question, def) {
|
|
36
|
+
const { createInterface } = await import('node:readline/promises');
|
|
37
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
38
|
+
try {
|
|
39
|
+
const ans = (await rl.question(`${question} ${def ? '[Y/n]' : '[y/N]'} `)).trim();
|
|
40
|
+
return ans ? /^y/i.test(ans) : def;
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
rl.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Verify a downloaded asset. SHA-256 is always enforced. When a signing key is configured, a
|
|
48
|
+
* *published* `.minisig` is verified (invalid → abort); a *missing* one falls back to checksum-only
|
|
49
|
+
* (the unsigned→signed rollout — current releases aren't signed yet). With no key configured,
|
|
50
|
+
* signatures are skipped entirely.
|
|
51
|
+
*/
|
|
52
|
+
async function verifyAsset(base, asset, data, opts) {
|
|
53
|
+
verifySha256(data, await fetchText(`${base}/${asset}.sha256`));
|
|
54
|
+
if (!isPubkeyConfigured()) {
|
|
55
|
+
log(opts, `${C.dim} (signature check disabled — no signing key configured; checksum OK)${C.reset}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
let sig;
|
|
59
|
+
try {
|
|
60
|
+
sig = await fetchText(`${base}/${asset}.minisig`);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
sig = undefined; // not published for this release
|
|
64
|
+
}
|
|
65
|
+
if (sig)
|
|
66
|
+
verifyMinisign(data, sig);
|
|
67
|
+
else
|
|
68
|
+
log(opts, `${C.dim} (no signature published for this release; checksum verified)${C.reset}`);
|
|
69
|
+
}
|
|
70
|
+
/** Best-effort: write the per-user `.slaide` file association (no-op where unimplemented). */
|
|
71
|
+
function register(p) {
|
|
72
|
+
spawnSync(viewerExe(p), ['--register'], { stdio: 'ignore' });
|
|
73
|
+
}
|
|
74
|
+
/** On Windows, make sure the WebView2 Evergreen runtime is present (the viewer needs it). */
|
|
75
|
+
function ensureWebView2(opts) {
|
|
76
|
+
if (process.platform !== 'win32')
|
|
77
|
+
return;
|
|
78
|
+
const key = 'HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\EdgeUpdate\\Clients\\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}';
|
|
79
|
+
const present = spawnSync('reg', ['query', key], { stdio: 'ignore' }).status === 0;
|
|
80
|
+
if (present)
|
|
81
|
+
return;
|
|
82
|
+
log(opts, 'Installing the Microsoft WebView2 runtime…');
|
|
83
|
+
const bs = join(tmpdir(), 'MicrosoftEdgeWebview2Setup.exe');
|
|
84
|
+
try {
|
|
85
|
+
const r = spawnSync('powershell', [
|
|
86
|
+
'-NoProfile',
|
|
87
|
+
'-Command',
|
|
88
|
+
`Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/p/?LinkId=2124703' -OutFile '${bs}' -UseBasicParsing; Start-Process -FilePath '${bs}' -ArgumentList '/silent','/install' -Wait`,
|
|
89
|
+
], { stdio: 'ignore' });
|
|
90
|
+
if (r.status !== 0)
|
|
91
|
+
throw new Error('bootstrapper failed');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
log(opts, `${C.dim} Could not auto-install WebView2; install it from microsoft.com if the viewer won't open.${C.reset}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extract a release archive flat into the bin dir. Windows zips go through PowerShell
|
|
99
|
+
* `Expand-Archive` (matches install.ps1, and sidesteps the GNU-tar `C:`-is-a-remote-host quirk
|
|
100
|
+
* when a user runs from Git Bash); tar.gz uses the system `tar`.
|
|
101
|
+
*/
|
|
102
|
+
function extractBundle(archive, dest, p) {
|
|
103
|
+
mkdirSync(dest, { recursive: true });
|
|
104
|
+
const r = p.os === 'windows'
|
|
105
|
+
? spawnSync('powershell', ['-NoProfile', '-Command', `Expand-Archive -Path '${archive}' -DestinationPath '${dest}' -Force`], { stdio: 'ignore' })
|
|
106
|
+
: spawnSync('tar', ['-xzf', archive, '-C', dest], { stdio: 'ignore' });
|
|
107
|
+
if (r.error || r.status !== 0) {
|
|
108
|
+
throw new Error('could not extract the release archive. Install via the one-liner instead: ' +
|
|
109
|
+
'https://github.com/aivorynet/slaide#install');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Download + verify + extract the full bundle into ~/.slaide/bin, then register + (Windows) WebView2. */
|
|
113
|
+
export async function installBinaries(opts = {}) {
|
|
114
|
+
const p = detectPlatform();
|
|
115
|
+
const base = distBase();
|
|
116
|
+
const asset = bundleAsset(p);
|
|
117
|
+
const dir = binDir();
|
|
118
|
+
const tmp = join(tmpdir(), `slaide-dl-${process.pid}-${asset}`);
|
|
119
|
+
log(opts, `Downloading the Slaide app (${asset})…`);
|
|
120
|
+
const data = await fetchBytes(`${base}/${asset}`);
|
|
121
|
+
log(opts, 'Verifying…');
|
|
122
|
+
await verifyAsset(base, asset, data, opts);
|
|
123
|
+
writeFileSync(tmp, data);
|
|
124
|
+
try {
|
|
125
|
+
log(opts, `Installing to ${dir}…`);
|
|
126
|
+
extractBundle(tmp, dir, p);
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
rmSync(tmp, { force: true });
|
|
130
|
+
}
|
|
131
|
+
if (p.os !== 'windows') {
|
|
132
|
+
for (const exe of [viewerExe(p), engineExe(p), cliExe(p)]) {
|
|
133
|
+
if (existsSync(exe))
|
|
134
|
+
chmodSync(exe, 0o755);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
ensureWebView2(opts);
|
|
138
|
+
register(p);
|
|
139
|
+
log(opts, `${C.green}✓${C.reset} Slaide app installed. ${C.dim}Sign in (top-right) to unlock editing.${C.reset}`);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Ensure the native viewer + engine are installed; download them on first use. Returns the viewer
|
|
143
|
+
* path. Prompts for confirmation when interactive (skip with `yes`); proceeds automatically for an
|
|
144
|
+
* explicit, non-interactive `slaide app` invocation.
|
|
145
|
+
*/
|
|
146
|
+
export async function ensureInstalled(opts = {}) {
|
|
147
|
+
const p = detectPlatform();
|
|
148
|
+
if (isInstalled(p) && !opts.force)
|
|
149
|
+
return viewerExe(p);
|
|
150
|
+
if (!opts.yes && process.stdin.isTTY && process.stdout.isTTY) {
|
|
151
|
+
log(opts, 'The Slaide desktop app (native viewer + engine, ~50 MB) is not installed yet.');
|
|
152
|
+
if (!(await confirm('Download it now?', true))) {
|
|
153
|
+
throw new Error('declined. Install later with `slaide app --install`, or the Node-free one-liner at ' +
|
|
154
|
+
'https://github.com/aivorynet/slaide#install');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
await installBinaries(opts);
|
|
158
|
+
return viewerExe(p);
|
|
159
|
+
}
|
|
160
|
+
/** Ask the engine its edition; true only if it explicitly reports `oss`. */
|
|
161
|
+
function engineIsOss(p) {
|
|
162
|
+
const out = spawnSync(engineExe(p), ['edition'], { encoding: 'utf8' });
|
|
163
|
+
return out.status === 0 && out.stdout.trim() === 'oss';
|
|
164
|
+
}
|
|
165
|
+
function atomicReplace(target, bytes) {
|
|
166
|
+
const tmp = `${target}.upgrade-${process.pid}`;
|
|
167
|
+
writeFileSync(tmp, bytes);
|
|
168
|
+
if (process.platform !== 'win32')
|
|
169
|
+
chmodSync(tmp, 0o755);
|
|
170
|
+
try {
|
|
171
|
+
renameSync(tmp, target);
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
rmSync(tmp, { force: true });
|
|
175
|
+
throw e;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Swap the render-only OSS engine for the Pro superset — the same public, signed download the
|
|
180
|
+
* viewer performs on Sign-in (core/viewer/src/upgrade.rs). Idempotent: a no-op if already Pro.
|
|
181
|
+
* A license still gates editing at runtime; the binary itself is public.
|
|
182
|
+
*/
|
|
183
|
+
export async function ensureProEngine(opts = {}) {
|
|
184
|
+
const p = detectPlatform();
|
|
185
|
+
if (!engineIsOss(p))
|
|
186
|
+
return; // already Pro (or not probeable)
|
|
187
|
+
const base = distBase();
|
|
188
|
+
const asset = engineAsset(p);
|
|
189
|
+
log(opts, 'Fetching the Pro engine…');
|
|
190
|
+
const gz = await fetchBytes(`${base}/${asset}`);
|
|
191
|
+
await verifyAsset(base, asset, gz, opts);
|
|
192
|
+
atomicReplace(engineExe(p), gunzipSync(gz));
|
|
193
|
+
log(opts, `${C.green}✓${C.reset} Pro engine installed.`);
|
|
194
|
+
}
|
|
195
|
+
/** Launch the native viewer (installing it first if needed). Detaches so the CLI returns. */
|
|
196
|
+
export async function launchApp(deck, opts = {}) {
|
|
197
|
+
const viewer = await ensureInstalled(opts);
|
|
198
|
+
const child = spawn(viewer, deck ? [deck] : [], { detached: true, stdio: 'ignore' });
|
|
199
|
+
child.unref();
|
|
200
|
+
}
|
|
201
|
+
/** Run the engine's `auth` flow (login/logout/status), upgrading to the Pro engine first. */
|
|
202
|
+
export async function runAuth(sub, opts = {}) {
|
|
203
|
+
await ensureInstalled(opts);
|
|
204
|
+
if (sub === 'login')
|
|
205
|
+
await ensureProEngine(opts);
|
|
206
|
+
const p = detectPlatform();
|
|
207
|
+
const r = spawnSync(engineExe(p), ['auth', sub], { stdio: 'inherit' });
|
|
208
|
+
return r.status ?? 0;
|
|
209
|
+
}
|
|
210
|
+
/** Remove the installed binaries (leaves auth/license caches under ~/.slaide untouched). */
|
|
211
|
+
export function uninstall() {
|
|
212
|
+
const p = detectPlatform();
|
|
213
|
+
spawnSync(viewerExe(p), ['--unregister'], { stdio: 'ignore' });
|
|
214
|
+
for (const exe of [viewerExe(p), engineExe(p), cliExe(p)])
|
|
215
|
+
rmSync(exe, { force: true });
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/desktop/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface Platform {
|
|
2
|
+
/** Release token for the OS — matches release/package-dist.ts PLATS. */
|
|
3
|
+
os: 'linux' | 'macos' | 'windows';
|
|
4
|
+
/** Release token for the CPU — matches release/package-dist.ts ARCHES. */
|
|
5
|
+
arch: 'x64' | 'arm64';
|
|
6
|
+
/** Executable suffix (`.exe` on Windows, else empty). */
|
|
7
|
+
exe: string;
|
|
8
|
+
/** Bundle archive extension (`zip` on Windows, else `tar.gz`). */
|
|
9
|
+
ext: 'zip' | 'tar.gz';
|
|
10
|
+
}
|
|
11
|
+
/** Map this process's platform/arch onto the release tokens. Throws on an unsupported target. */
|
|
12
|
+
export declare function detectPlatform(): Platform;
|
|
13
|
+
/**
|
|
14
|
+
* The install root, shared with the installers (must match them exactly): `SLAIDE_HOME` if set,
|
|
15
|
+
* else `%LOCALAPPDATA%\Slaide` on Windows (install.ps1) or `~/.slaide` elsewhere (install.sh).
|
|
16
|
+
*/
|
|
17
|
+
export declare function slaideHome(): string;
|
|
18
|
+
/** The bin dir where slaide-view / slaide-engine are installed. */
|
|
19
|
+
export declare function binDir(): string;
|
|
20
|
+
/** Base URL the binaries are fetched from (the GitHub Releases "latest" by default). */
|
|
21
|
+
export declare function distBase(): string;
|
|
22
|
+
/** Full-bundle asset name: `slaide-<os>-<arch>.<ext>` (flat: slaide, slaide-view, slaide-engine[, themes]). */
|
|
23
|
+
export declare function bundleAsset(p?: Platform): string;
|
|
24
|
+
/** Standalone gzipped engine: `slaide-engine-<os>-<arch>[.exe].gz` (the Sign-in self-upgrade asset). */
|
|
25
|
+
export declare function engineAsset(p?: Platform): string;
|
|
26
|
+
export declare function viewerExe(p?: Platform): string;
|
|
27
|
+
export declare function engineExe(p?: Platform): string;
|
|
28
|
+
export declare function cliExe(p?: Platform): string;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Copyright 2026 AIVory, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// Single source of truth for where the native desktop binaries live and how the release
|
|
4
|
+
// assets are named. The npm CLI bootstrap (bootstrap.ts), the native viewer's self-upgrade
|
|
5
|
+
// (core/viewer/src/upgrade.rs), and the installers (pro/installer/install.{sh,ps1}) MUST agree
|
|
6
|
+
// on these names — see release/ASSETS.md. Keep this file in lockstep with release/package-dist.ts.
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
/** Map this process's platform/arch onto the release tokens. Throws on an unsupported target. */
|
|
10
|
+
export function detectPlatform() {
|
|
11
|
+
const os = process.platform === 'win32'
|
|
12
|
+
? 'windows'
|
|
13
|
+
: process.platform === 'darwin'
|
|
14
|
+
? 'macos'
|
|
15
|
+
: process.platform === 'linux'
|
|
16
|
+
? 'linux'
|
|
17
|
+
: null;
|
|
18
|
+
if (!os)
|
|
19
|
+
throw new Error(`unsupported OS for the native viewer: ${process.platform}`);
|
|
20
|
+
const arch = process.arch === 'x64' ? 'x64' : process.arch === 'arm64' ? 'arm64' : null;
|
|
21
|
+
if (!arch)
|
|
22
|
+
throw new Error(`unsupported CPU for the native viewer: ${process.arch}`);
|
|
23
|
+
return { os, arch, exe: os === 'windows' ? '.exe' : '', ext: os === 'windows' ? 'zip' : 'tar.gz' };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The install root, shared with the installers (must match them exactly): `SLAIDE_HOME` if set,
|
|
27
|
+
* else `%LOCALAPPDATA%\Slaide` on Windows (install.ps1) or `~/.slaide` elsewhere (install.sh).
|
|
28
|
+
*/
|
|
29
|
+
export function slaideHome() {
|
|
30
|
+
if (process.env.SLAIDE_HOME && process.env.SLAIDE_HOME.trim())
|
|
31
|
+
return process.env.SLAIDE_HOME;
|
|
32
|
+
if (process.platform === 'win32' && process.env.LOCALAPPDATA)
|
|
33
|
+
return join(process.env.LOCALAPPDATA, 'Slaide');
|
|
34
|
+
return join(homedir(), '.slaide');
|
|
35
|
+
}
|
|
36
|
+
/** The bin dir where slaide-view / slaide-engine are installed. */
|
|
37
|
+
export function binDir() {
|
|
38
|
+
return join(slaideHome(), 'bin');
|
|
39
|
+
}
|
|
40
|
+
/** Base URL the binaries are fetched from (the GitHub Releases "latest" by default). */
|
|
41
|
+
export function distBase() {
|
|
42
|
+
const v = process.env.SLAIDE_DIST_BASE_URL;
|
|
43
|
+
return v && v.trim() ? v.replace(/\/+$/, '') : 'https://github.com/aivorynet/slaide/releases/latest/download';
|
|
44
|
+
}
|
|
45
|
+
/** Full-bundle asset name: `slaide-<os>-<arch>.<ext>` (flat: slaide, slaide-view, slaide-engine[, themes]). */
|
|
46
|
+
export function bundleAsset(p = detectPlatform()) {
|
|
47
|
+
return `slaide-${p.os}-${p.arch}.${p.ext}`;
|
|
48
|
+
}
|
|
49
|
+
/** Standalone gzipped engine: `slaide-engine-<os>-<arch>[.exe].gz` (the Sign-in self-upgrade asset). */
|
|
50
|
+
export function engineAsset(p = detectPlatform()) {
|
|
51
|
+
return `slaide-engine-${p.os}-${p.arch}${p.exe}.gz`;
|
|
52
|
+
}
|
|
53
|
+
export function viewerExe(p = detectPlatform()) {
|
|
54
|
+
return join(binDir(), `slaide-view${p.exe}`);
|
|
55
|
+
}
|
|
56
|
+
export function engineExe(p = detectPlatform()) {
|
|
57
|
+
return join(binDir(), `slaide-engine${p.exe}`);
|
|
58
|
+
}
|
|
59
|
+
export function cliExe(p = detectPlatform()) {
|
|
60
|
+
return join(binDir(), `slaide${p.exe}`);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/desktop/paths.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,wFAAwF;AACxF,2FAA2F;AAC3F,+FAA+F;AAC/F,mGAAmG;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC,iGAAiG;AACjG,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,GACN,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC7B,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,IAAI,CAAC;IACf,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC9F,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC9G,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,8DAA8D,CAAC;AAChH,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,WAAW,CAAC,IAAc,cAAc,EAAE;IACxD,OAAO,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;AAC7C,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,IAAc,cAAc,EAAE;IACxD,OAAO,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc,cAAc,EAAE;IACtD,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,IAAc,cAAc,EAAE;IACtD,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACjD,CAAC;AACD,MAAM,UAAU,MAAM,CAAC,IAAc,cAAc,EAAE;IACnD,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* minisign public key — the base64 key line of `release/keys/slaide-binary-public.txt`, baked in
|
|
3
|
+
* at publish time. The caller (bootstrap.ts) enforces a *present* signature and falls back to
|
|
4
|
+
* checksum-only when none is published (the unsigned→signed rollout; the release pipeline starts
|
|
5
|
+
* attaching `.minisig` once SLAIDE_MINISIGN_KEY is set — see release/SIGNING.md). If reset to a
|
|
6
|
+
* `REPLACE_ME` placeholder, signature checks are skipped entirely.
|
|
7
|
+
*
|
|
8
|
+
* MUST equal SLAIDE_BINARY_PUBKEY in core/viewer/src/upgrade.rs.
|
|
9
|
+
*/
|
|
10
|
+
export declare const BINARY_PUBKEY = "RWSnmndaVYXz9nNyikYjyk9RBl88ftUjABjzVCiIS8chvRgUWoolBv/l";
|
|
11
|
+
/** True once a real minisign key has replaced the placeholder. */
|
|
12
|
+
export declare function isPubkeyConfigured(): boolean;
|
|
13
|
+
/** Verify `data` against a `.sha256` file body (`"<hex> <name>"`). Throws on mismatch. */
|
|
14
|
+
export declare function verifySha256(data: Buffer, shaFile: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Verify a minisign `.minisig` signature over `data` using the embedded trusted key.
|
|
17
|
+
* Supports both the legacy (`Ed`, signs the raw data) and prehashed (`ED`, signs BLAKE2b-512 of
|
|
18
|
+
* the data) algorithms, matching minisign / minisign-verify. Throws if the signature does not
|
|
19
|
+
* verify, the key id disagrees, or the key/sig is malformed.
|
|
20
|
+
*/
|
|
21
|
+
export declare function verifyMinisign(data: Buffer, sigFile: string, pubkeyB64?: string): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Copyright 2026 AIVory, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// Integrity + authenticity checks for downloaded release assets. SHA-256 is always enforced;
|
|
4
|
+
// minisign (Ed25519) is enforced once a real signing key is configured below. This mirrors the
|
|
5
|
+
// native viewer's verifier (core/viewer/src/upgrade.rs) byte-for-byte so the CLI and the viewer
|
|
6
|
+
// trust the same key and reject the same tampering. No third-party deps — node:crypto only.
|
|
7
|
+
import { createHash, createPublicKey, verify as cryptoVerify } from 'node:crypto';
|
|
8
|
+
/**
|
|
9
|
+
* minisign public key — the base64 key line of `release/keys/slaide-binary-public.txt`, baked in
|
|
10
|
+
* at publish time. The caller (bootstrap.ts) enforces a *present* signature and falls back to
|
|
11
|
+
* checksum-only when none is published (the unsigned→signed rollout; the release pipeline starts
|
|
12
|
+
* attaching `.minisig` once SLAIDE_MINISIGN_KEY is set — see release/SIGNING.md). If reset to a
|
|
13
|
+
* `REPLACE_ME` placeholder, signature checks are skipped entirely.
|
|
14
|
+
*
|
|
15
|
+
* MUST equal SLAIDE_BINARY_PUBKEY in core/viewer/src/upgrade.rs.
|
|
16
|
+
*/
|
|
17
|
+
export const BINARY_PUBKEY = 'RWSnmndaVYXz9nNyikYjyk9RBl88ftUjABjzVCiIS8chvRgUWoolBv/l';
|
|
18
|
+
/** True once a real minisign key has replaced the placeholder. */
|
|
19
|
+
export function isPubkeyConfigured() {
|
|
20
|
+
return !BINARY_PUBKEY.includes('REPLACE_ME');
|
|
21
|
+
}
|
|
22
|
+
/** Verify `data` against a `.sha256` file body (`"<hex> <name>"`). Throws on mismatch. */
|
|
23
|
+
export function verifySha256(data, shaFile) {
|
|
24
|
+
const expected = shaFile.trim().split(/\s+/)[0]?.toLowerCase() ?? '';
|
|
25
|
+
if (expected.length !== 64)
|
|
26
|
+
throw new Error('malformed .sha256 file');
|
|
27
|
+
const actual = createHash('sha256').update(data).digest('hex');
|
|
28
|
+
if (actual !== expected)
|
|
29
|
+
throw new Error('checksum mismatch — refusing to install');
|
|
30
|
+
}
|
|
31
|
+
/** Wrap a raw 32-byte Ed25519 public key in a DER SPKI so node:crypto can consume it. */
|
|
32
|
+
function ed25519PublicKey(raw) {
|
|
33
|
+
// SPKI prefix for id-Ed25519 (RFC 8410), followed by the 32-byte key.
|
|
34
|
+
const prefix = Buffer.from('302a300506032b6570032100', 'hex');
|
|
35
|
+
return createPublicKey({ key: Buffer.concat([prefix, raw]), format: 'der', type: 'spki' });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Verify a minisign `.minisig` signature over `data` using the embedded trusted key.
|
|
39
|
+
* Supports both the legacy (`Ed`, signs the raw data) and prehashed (`ED`, signs BLAKE2b-512 of
|
|
40
|
+
* the data) algorithms, matching minisign / minisign-verify. Throws if the signature does not
|
|
41
|
+
* verify, the key id disagrees, or the key/sig is malformed.
|
|
42
|
+
*/
|
|
43
|
+
export function verifyMinisign(data, sigFile, pubkeyB64 = BINARY_PUBKEY) {
|
|
44
|
+
const pub = Buffer.from(pubkeyB64, 'base64');
|
|
45
|
+
if (pub.length !== 42)
|
|
46
|
+
throw new Error('bad trusted pubkey');
|
|
47
|
+
const pubAlg = pub.subarray(0, 2);
|
|
48
|
+
const pubKeyId = pub.subarray(2, 10);
|
|
49
|
+
const pubKey = pub.subarray(10, 42);
|
|
50
|
+
if (pubAlg.toString('latin1') !== 'Ed')
|
|
51
|
+
throw new Error('unexpected trusted pubkey algorithm');
|
|
52
|
+
// The signature line is the first base64 line that is not an `untrusted/trusted comment:` header.
|
|
53
|
+
const sigB64 = sigFile
|
|
54
|
+
.split(/\r?\n/)
|
|
55
|
+
.map((l) => l.trim())
|
|
56
|
+
.find((l) => l.length > 0 && !/^untrusted comment:/i.test(l) && !/^trusted comment:/i.test(l));
|
|
57
|
+
if (!sigB64)
|
|
58
|
+
throw new Error('bad signature file: no signature line');
|
|
59
|
+
const sig = Buffer.from(sigB64, 'base64');
|
|
60
|
+
if (sig.length !== 74)
|
|
61
|
+
throw new Error('bad signature file: wrong length');
|
|
62
|
+
const sigAlg = sig.subarray(0, 2).toString('latin1');
|
|
63
|
+
const sigKeyId = sig.subarray(2, 10);
|
|
64
|
+
const signature = sig.subarray(10, 74);
|
|
65
|
+
if (!sigKeyId.equals(pubKeyId))
|
|
66
|
+
throw new Error('signature key id does not match the trusted key');
|
|
67
|
+
let message;
|
|
68
|
+
if (sigAlg === 'ED')
|
|
69
|
+
message = createHash('blake2b512').update(data).digest(); // prehashed
|
|
70
|
+
else if (sigAlg === 'Ed')
|
|
71
|
+
message = data; // legacy
|
|
72
|
+
else
|
|
73
|
+
throw new Error(`unsupported signature algorithm "${sigAlg}"`);
|
|
74
|
+
if (!cryptoVerify(null, message, ed25519PublicKey(pubKey), signature)) {
|
|
75
|
+
throw new Error('signature does not verify — refusing to install');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/desktop/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/engine-entry.js
CHANGED
|
@@ -14,6 +14,12 @@ const flag = (n) => {
|
|
|
14
14
|
};
|
|
15
15
|
const positional = (n) => args.filter((a) => !a.startsWith('--'))[n];
|
|
16
16
|
async function main() {
|
|
17
|
+
if (cmd === 'edition') {
|
|
18
|
+
// Edition probe for the native viewer: the OSS engine can only render. The viewer reads this
|
|
19
|
+
// to decide whether Sign-in should fetch + swap in the Pro engine (see core/viewer upgrade.rs).
|
|
20
|
+
process.stdout.write('oss\n');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
17
23
|
if (cmd === 'render') {
|
|
18
24
|
const deck = positional(1);
|
|
19
25
|
if (!deck) {
|
package/dist/engine-entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-entry.js","sourceRoot":"","sources":["../src/engine-entry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine-entry.js","sourceRoot":"","sources":["../src/engine-entry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
import { readFileSync, existsSync, statSync } from 'node:fs';
|
|
5
5
|
import { dirname, resolve, extname } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
|
-
import yaml from 'js-yaml';
|
|
8
7
|
import { parseDeck } from './parser/parse.js';
|
|
9
8
|
import { compile } from './compiler/compile.js';
|
|
10
9
|
import { renderHtml } from './render/html.js';
|
|
11
10
|
import { isSlaidec } from './container.js';
|
|
11
|
+
import { ERROR_SEVERITY_CODES } from './vocab.js';
|
|
12
|
+
import { parseMaster } from './master-io.js';
|
|
12
13
|
/** Path-based APIs read real files; a `.slaidec` must be resolved via openDeck() first. */
|
|
13
14
|
function assertNotContainer(deckPath) {
|
|
14
15
|
if (isSlaidec(deckPath)) {
|
|
@@ -25,10 +26,7 @@ function moduleDir() {
|
|
|
25
26
|
}
|
|
26
27
|
export function loadMaster(path) {
|
|
27
28
|
const raw = readFileSync(path, 'utf8');
|
|
28
|
-
|
|
29
|
-
if (!obj || typeof obj !== 'object')
|
|
30
|
-
throw new Error(`Master ${path} is not a valid YAML mapping`);
|
|
31
|
-
return obj;
|
|
29
|
+
return parseMaster(raw);
|
|
32
30
|
}
|
|
33
31
|
/** Resolve the master path referenced in deck headmatter, with a bundled default. */
|
|
34
32
|
export function resolveMasterPath(headmatter, deckDir) {
|
|
@@ -68,7 +66,6 @@ export function compileFile(deckPath) {
|
|
|
68
66
|
const source = readFileSync(deckPath, 'utf8');
|
|
69
67
|
return compileSource(source, dirname(resolve(deckPath)));
|
|
70
68
|
}
|
|
71
|
-
const ERROR_CODES = new Set(['empty-deck', 'no-master', 'unknown-layout']);
|
|
72
69
|
export function validateSource(source, deckDir) {
|
|
73
70
|
let warnings = [];
|
|
74
71
|
try {
|
|
@@ -80,7 +77,7 @@ export function validateSource(source, deckDir) {
|
|
|
80
77
|
}
|
|
81
78
|
const diagnostics = warnings.map((w) => ({
|
|
82
79
|
...w,
|
|
83
|
-
severity:
|
|
80
|
+
severity: ERROR_SEVERITY_CODES.has(w.code) ? 'error' : 'warning',
|
|
84
81
|
}));
|
|
85
82
|
return { ok: !diagnostics.some((d) => d.severity === 'error'), diagnostics };
|
|
86
83
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/master-io.js
CHANGED
|
@@ -44,12 +44,24 @@ function orderKeys(master) {
|
|
|
44
44
|
export function serializeMaster(master) {
|
|
45
45
|
return MASTER_SCHEMA_HEADER + yaml.dump(orderKeys(master), { lineWidth: 200 });
|
|
46
46
|
}
|
|
47
|
+
/** Normalize structured gradient stops ({ color, pos } objects) into CSS fragment strings. */
|
|
48
|
+
function normalizeBgs(m) {
|
|
49
|
+
const bgs = m.backgrounds;
|
|
50
|
+
if (!bgs || typeof bgs !== 'object')
|
|
51
|
+
return;
|
|
52
|
+
for (const bg of Object.values(bgs)) {
|
|
53
|
+
if (bg?.type === 'gradient' && Array.isArray(bg.stops)) {
|
|
54
|
+
bg.stops = bg.stops.map((s) => typeof s === 'string' ? s : `${s.color ?? ''}${s.pos ? ' ' + s.pos : ''}`.trim());
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
47
58
|
/** Parse `*.slaide.yaml` master text into a Master object (inverse of serializeMaster). */
|
|
48
59
|
export function parseMaster(text) {
|
|
49
60
|
const obj = yaml.load(text);
|
|
50
61
|
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
51
62
|
throw new Error('Master YAML is not a valid mapping');
|
|
52
63
|
}
|
|
64
|
+
normalizeBgs(obj);
|
|
53
65
|
return obj;
|
|
54
66
|
}
|
|
55
67
|
//# sourceMappingURL=master-io.js.map
|
package/dist/master-io.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"master-io.js","sourceRoot":"","sources":["../src/master-io.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,yFAAyF;AACzF,4FAA4F;AAC5F,qFAAqF;AACrF,0FAA0F;AAC1F,oFAAoF;AACpF,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,wEAAwE,CAAC;AAE7G;4FAC4F;AAC5F,MAAM,SAAS,GAAsB;IACnC,QAAQ;IACR,MAAM;IACN,aAAa;IACb,QAAQ;IACR,OAAO;IACP,WAAW;IACX,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,aAAa;IACb,SAAS;IACT,UAAU;IACV,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,IAAI;CACL,CAAC;AAEF,yFAAyF;AACzF,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,GAAG,GAAG,MAA4C,CAAC;IACzD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAa,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"master-io.js","sourceRoot":"","sources":["../src/master-io.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,yFAAyF;AACzF,4FAA4F;AAC5F,qFAAqF;AACrF,0FAA0F;AAC1F,oFAAoF;AACpF,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,wEAAwE,CAAC;AAE7G;4FAC4F;AAC5F,MAAM,SAAS,GAAsB;IACnC,QAAQ;IACR,MAAM;IACN,aAAa;IACb,QAAQ;IACR,OAAO;IACP,WAAW;IACX,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,aAAa;IACb,SAAS;IACT,UAAU;IACV,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,IAAI;CACL,CAAC;AAEF,yFAAyF;AACzF,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,GAAG,GAAG,MAA4C,CAAC;IACzD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,8FAA8F;AAC9F,SAAS,YAAY,CAAC,CAAsB;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC;IAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO;IAC5C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAU,EAAE,CAAC;QAC7C,IAAI,EAAE,EAAE,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CACjC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CACjF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,YAAY,CAAC,GAA0B,CAAC,CAAC;IACzC,OAAO,GAAa,CAAC;AACvB,CAAC"}
|
package/dist/parser/parse.d.ts
CHANGED