codeboard-studio 0.2.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/LICENSE +21 -0
- package/NOTICE +23 -0
- package/README.md +54 -0
- package/dist/src/animation/camera-plane.d.ts +8 -0
- package/dist/src/animation/camera-plane.d.ts.map +1 -0
- package/dist/src/animation/camera-plane.js +16 -0
- package/dist/src/animation/camera-plane.js.map +1 -0
- package/dist/src/animation/drawing-neighbors.d.ts +4 -0
- package/dist/src/animation/drawing-neighbors.d.ts.map +1 -0
- package/dist/src/animation/drawing-neighbors.js +38 -0
- package/dist/src/animation/drawing-neighbors.js.map +1 -0
- package/dist/src/animation/evaluate.d.ts +17 -0
- package/dist/src/animation/evaluate.d.ts.map +1 -0
- package/dist/src/animation/evaluate.js +70 -0
- package/dist/src/animation/evaluate.js.map +1 -0
- package/dist/src/animation/frame.d.ts +8 -0
- package/dist/src/animation/frame.d.ts.map +1 -0
- package/dist/src/animation/frame.js +16 -0
- package/dist/src/animation/frame.js.map +1 -0
- package/dist/src/animation/ik.d.ts +26 -0
- package/dist/src/animation/ik.d.ts.map +1 -0
- package/dist/src/animation/ik.js +47 -0
- package/dist/src/animation/ik.js.map +1 -0
- package/dist/src/animation/retime.d.ts +4 -0
- package/dist/src/animation/retime.d.ts.map +1 -0
- package/dist/src/animation/retime.js +116 -0
- package/dist/src/animation/retime.js.map +1 -0
- package/dist/src/audio/wav.d.ts +11 -0
- package/dist/src/audio/wav.d.ts.map +1 -0
- package/dist/src/audio/wav.js +58 -0
- package/dist/src/audio/wav.js.map +1 -0
- package/dist/src/authoring-runner.d.ts +2 -0
- package/dist/src/authoring-runner.d.ts.map +1 -0
- package/dist/src/authoring-runner.js +24 -0
- package/dist/src/authoring-runner.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +127 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/core/coordinates.d.ts +16 -0
- package/dist/src/core/coordinates.d.ts.map +1 -0
- package/dist/src/core/coordinates.js +48 -0
- package/dist/src/core/coordinates.js.map +1 -0
- package/dist/src/core/handles.d.ts +93 -0
- package/dist/src/core/handles.d.ts.map +1 -0
- package/dist/src/core/handles.js +190 -0
- package/dist/src/core/handles.js.map +1 -0
- package/dist/src/core/history.d.ts +14 -0
- package/dist/src/core/history.d.ts.map +1 -0
- package/dist/src/core/history.js +80 -0
- package/dist/src/core/history.js.map +1 -0
- package/dist/src/core/inspection.d.ts +51 -0
- package/dist/src/core/inspection.d.ts.map +1 -0
- package/dist/src/core/inspection.js +72 -0
- package/dist/src/core/inspection.js.map +1 -0
- package/dist/src/core/production.d.ts +208 -0
- package/dist/src/core/production.d.ts.map +1 -0
- package/dist/src/core/production.js +894 -0
- package/dist/src/core/production.js.map +1 -0
- package/dist/src/core/project.d.ts +146 -0
- package/dist/src/core/project.d.ts.map +1 -0
- package/dist/src/core/project.js +700 -0
- package/dist/src/core/project.js.map +1 -0
- package/dist/src/drawing/brush-authoring.d.ts +6 -0
- package/dist/src/drawing/brush-authoring.d.ts.map +1 -0
- package/dist/src/drawing/brush-authoring.js +12 -0
- package/dist/src/drawing/brush-authoring.js.map +1 -0
- package/dist/src/drawing/brushes.d.ts +157 -0
- package/dist/src/drawing/brushes.d.ts.map +1 -0
- package/dist/src/drawing/brushes.js +50 -0
- package/dist/src/drawing/brushes.js.map +1 -0
- package/dist/src/drawing/color.d.ts +5 -0
- package/dist/src/drawing/color.d.ts.map +1 -0
- package/dist/src/drawing/color.js +63 -0
- package/dist/src/drawing/color.js.map +1 -0
- package/dist/src/drawing/curves.d.ts +27 -0
- package/dist/src/drawing/curves.d.ts.map +1 -0
- package/dist/src/drawing/curves.js +170 -0
- package/dist/src/drawing/curves.js.map +1 -0
- package/dist/src/drawing/math.d.ts +10 -0
- package/dist/src/drawing/math.d.ts.map +1 -0
- package/dist/src/drawing/math.js +40 -0
- package/dist/src/drawing/math.js.map +1 -0
- package/dist/src/drawing/path-geometry.d.ts +18 -0
- package/dist/src/drawing/path-geometry.d.ts.map +1 -0
- package/dist/src/drawing/path-geometry.js +115 -0
- package/dist/src/drawing/path-geometry.js.map +1 -0
- package/dist/src/drawing/path-sampling.d.ts +10 -0
- package/dist/src/drawing/path-sampling.d.ts.map +1 -0
- package/dist/src/drawing/path-sampling.js +64 -0
- package/dist/src/drawing/path-sampling.js.map +1 -0
- package/dist/src/drawing/path.d.ts +4 -0
- package/dist/src/drawing/path.d.ts.map +1 -0
- package/dist/src/drawing/path.js +27 -0
- package/dist/src/drawing/path.js.map +1 -0
- package/dist/src/drawing/pen-input.d.ts +5 -0
- package/dist/src/drawing/pen-input.d.ts.map +1 -0
- package/dist/src/drawing/pen-input.js +30 -0
- package/dist/src/drawing/pen-input.js.map +1 -0
- package/dist/src/drawing/pixel-selection.d.ts +23 -0
- package/dist/src/drawing/pixel-selection.d.ts.map +1 -0
- package/dist/src/drawing/pixel-selection.js +142 -0
- package/dist/src/drawing/pixel-selection.js.map +1 -0
- package/dist/src/drawing/pixels.d.ts +22 -0
- package/dist/src/drawing/pixels.d.ts.map +1 -0
- package/dist/src/drawing/pixels.js +79 -0
- package/dist/src/drawing/pixels.js.map +1 -0
- package/dist/src/drawing/resource-binary.d.ts +23 -0
- package/dist/src/drawing/resource-binary.d.ts.map +1 -0
- package/dist/src/drawing/resource-binary.js +135 -0
- package/dist/src/drawing/resource-binary.js.map +1 -0
- package/dist/src/drawing/resources.d.ts +51 -0
- package/dist/src/drawing/resources.d.ts.map +1 -0
- package/dist/src/drawing/resources.js +239 -0
- package/dist/src/drawing/resources.js.map +1 -0
- package/dist/src/drawing/stroke-outline.d.ts +5 -0
- package/dist/src/drawing/stroke-outline.d.ts.map +1 -0
- package/dist/src/drawing/stroke-outline.js +53 -0
- package/dist/src/drawing/stroke-outline.js.map +1 -0
- package/dist/src/drawing/swatch.d.ts +6 -0
- package/dist/src/drawing/swatch.d.ts.map +1 -0
- package/dist/src/drawing/swatch.js +15 -0
- package/dist/src/drawing/swatch.js.map +1 -0
- package/dist/src/export/animatic-export.d.ts +11 -0
- package/dist/src/export/animatic-export.d.ts.map +1 -0
- package/dist/src/export/animatic-export.js +52 -0
- package/dist/src/export/animatic-export.js.map +1 -0
- package/dist/src/export/movie-export.d.ts +16 -0
- package/dist/src/export/movie-export.d.ts.map +1 -0
- package/dist/src/export/movie-export.js +108 -0
- package/dist/src/export/movie-export.js.map +1 -0
- package/dist/src/export/sheet-layout.d.ts +27 -0
- package/dist/src/export/sheet-layout.d.ts.map +1 -0
- package/dist/src/export/sheet-layout.js +72 -0
- package/dist/src/export/sheet-layout.js.map +1 -0
- package/dist/src/export/storyboard-export.d.ts +8 -0
- package/dist/src/export/storyboard-export.d.ts.map +1 -0
- package/dist/src/export/storyboard-export.js +76 -0
- package/dist/src/export/storyboard-export.js.map +1 -0
- package/dist/src/index.d.ts +36 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +27 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/model/query.d.ts +6 -0
- package/dist/src/model/query.d.ts.map +1 -0
- package/dist/src/model/query.js +7 -0
- package/dist/src/model/query.js.map +1 -0
- package/dist/src/model/schema.d.ts +754 -0
- package/dist/src/model/schema.d.ts.map +1 -0
- package/dist/src/model/schema.js +205 -0
- package/dist/src/model/schema.js.map +1 -0
- package/dist/src/model/types.d.ts +537 -0
- package/dist/src/model/types.d.ts.map +1 -0
- package/dist/src/model/types.js +8 -0
- package/dist/src/model/types.js.map +1 -0
- package/dist/src/model/validate.d.ts +12 -0
- package/dist/src/model/validate.d.ts.map +1 -0
- package/dist/src/model/validate.js +183 -0
- package/dist/src/model/validate.js.map +1 -0
- package/dist/src/preview/server.d.ts +6 -0
- package/dist/src/preview/server.d.ts.map +1 -0
- package/dist/src/preview/server.js +71 -0
- package/dist/src/preview/server.js.map +1 -0
- package/dist/src/render/annotations.d.ts +4 -0
- package/dist/src/render/annotations.d.ts.map +1 -0
- package/dist/src/render/annotations.js +27 -0
- package/dist/src/render/annotations.js.map +1 -0
- package/dist/src/render/brush-engine.d.ts +14 -0
- package/dist/src/render/brush-engine.d.ts.map +1 -0
- package/dist/src/render/brush-engine.js +230 -0
- package/dist/src/render/brush-engine.js.map +1 -0
- package/dist/src/render/layer-compositor.d.ts +33 -0
- package/dist/src/render/layer-compositor.d.ts.map +1 -0
- package/dist/src/render/layer-compositor.js +296 -0
- package/dist/src/render/layer-compositor.js.map +1 -0
- package/dist/src/render/panel-renderer.d.ts +33 -0
- package/dist/src/render/panel-renderer.d.ts.map +1 -0
- package/dist/src/render/panel-renderer.js +118 -0
- package/dist/src/render/panel-renderer.js.map +1 -0
- package/dist/src/render/png.d.ts +4 -0
- package/dist/src/render/png.d.ts.map +1 -0
- package/dist/src/render/png.js +10 -0
- package/dist/src/render/png.js.map +1 -0
- package/dist/src/render/review.d.ts +42 -0
- package/dist/src/render/review.d.ts.map +1 -0
- package/dist/src/render/review.js +192 -0
- package/dist/src/render/review.js.map +1 -0
- package/dist/src/render/vector-renderer.d.ts +5 -0
- package/dist/src/render/vector-renderer.d.ts.map +1 -0
- package/dist/src/render/vector-renderer.js +98 -0
- package/dist/src/render/vector-renderer.js.map +1 -0
- package/dist/src/starter.d.ts +2 -0
- package/dist/src/starter.d.ts.map +1 -0
- package/dist/src/starter.js +23 -0
- package/dist/src/starter.js.map +1 -0
- package/dist/src/storage/codec.d.ts +20 -0
- package/dist/src/storage/codec.d.ts.map +1 -0
- package/dist/src/storage/codec.js +203 -0
- package/dist/src/storage/codec.js.map +1 -0
- package/dist/src/storage/store.d.ts +89 -0
- package/dist/src/storage/store.d.ts.map +1 -0
- package/dist/src/storage/store.js +392 -0
- package/dist/src/storage/store.js.map +1 -0
- package/dist/src/updates.d.ts +10 -0
- package/dist/src/updates.d.ts.map +1 -0
- package/dist/src/updates.js +134 -0
- package/dist/src/updates.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Panel, StoryboardDocument } from "../model/types.js";
|
|
2
|
+
type Header = Omit<StoryboardDocument, "panels" | "components" | "changes">;
|
|
3
|
+
type PanelInfo = Omit<Panel, "layers" | "motion">;
|
|
4
|
+
/** SQLite owns atomic commits; immutable payloads own numeric and resource bytes. */
|
|
5
|
+
export declare class ProjectStore {
|
|
6
|
+
readonly path: string;
|
|
7
|
+
private db;
|
|
8
|
+
private codec;
|
|
9
|
+
private constructor();
|
|
10
|
+
static open(path: string): ProjectStore;
|
|
11
|
+
static create(path: string): ProjectStore;
|
|
12
|
+
close(): void;
|
|
13
|
+
[Symbol.dispose](): void;
|
|
14
|
+
private snapshot;
|
|
15
|
+
private root;
|
|
16
|
+
private setRoot;
|
|
17
|
+
readHeader(): Header;
|
|
18
|
+
get version(): number;
|
|
19
|
+
listPanels(): PanelInfo[];
|
|
20
|
+
findObjects(query?: {
|
|
21
|
+
panelId?: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
kind?: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
offset?: number;
|
|
26
|
+
}): Record<string, import("node:sqlite").SQLOutputValue>[];
|
|
27
|
+
readPanel(id: string, options?: {
|
|
28
|
+
revision?: string;
|
|
29
|
+
}): Panel;
|
|
30
|
+
/** Render context contains one decoded panel, plus timeline and small project metadata. */
|
|
31
|
+
panelDocument(id: string, options?: {
|
|
32
|
+
revision?: string;
|
|
33
|
+
}): StoryboardDocument;
|
|
34
|
+
readDocument(): StoryboardDocument;
|
|
35
|
+
readAsset(id: string, options?: {
|
|
36
|
+
expectedVersion?: number;
|
|
37
|
+
revision?: string;
|
|
38
|
+
}): Buffer;
|
|
39
|
+
/** Explicit extraction for file-based audio encoders; never writes outside destination. */
|
|
40
|
+
extractAssets(directory: string): void;
|
|
41
|
+
private putPanel;
|
|
42
|
+
save(document: StoryboardDocument, options?: {
|
|
43
|
+
expectedVersion?: number;
|
|
44
|
+
overwrite?: boolean;
|
|
45
|
+
assetRoot?: string;
|
|
46
|
+
readAsset?: (id: string) => Buffer | undefined;
|
|
47
|
+
}): number;
|
|
48
|
+
/** Targeted artwork revision. Topology and timeline edits use the full authoring session. */
|
|
49
|
+
updatePanel(panel: Panel, options: {
|
|
50
|
+
expectedVersion: number;
|
|
51
|
+
actor?: string;
|
|
52
|
+
}): void;
|
|
53
|
+
inspect(): {
|
|
54
|
+
format: string;
|
|
55
|
+
formatVersion: number;
|
|
56
|
+
version: number;
|
|
57
|
+
panels: number;
|
|
58
|
+
payloads: Record<string, import("node:sqlite").SQLOutputValue>[];
|
|
59
|
+
};
|
|
60
|
+
/** Decode only the current panel and, during a transition, its incoming panel. */
|
|
61
|
+
frameDocument(frame: number, options?: {
|
|
62
|
+
revision?: string;
|
|
63
|
+
}): StoryboardDocument;
|
|
64
|
+
private revision;
|
|
65
|
+
/** A named root of references, not a second copy of the project's media. */
|
|
66
|
+
saveRevision(name: string, options: {
|
|
67
|
+
expectedVersion: number;
|
|
68
|
+
}): void;
|
|
69
|
+
listRevisions(options?: {
|
|
70
|
+
limit?: number;
|
|
71
|
+
offset?: number;
|
|
72
|
+
}): {
|
|
73
|
+
name: string;
|
|
74
|
+
version: number;
|
|
75
|
+
createdAt: string;
|
|
76
|
+
panels: number;
|
|
77
|
+
}[];
|
|
78
|
+
readRevision(name: string): StoryboardDocument;
|
|
79
|
+
restoreRevision(name: string, options: {
|
|
80
|
+
expectedVersion: number;
|
|
81
|
+
actor?: string;
|
|
82
|
+
}): void;
|
|
83
|
+
deleteRevision(name: string): void;
|
|
84
|
+
/** Optional maintenance, never part of a small edit. No artwork precision is changed. */
|
|
85
|
+
compact(): void;
|
|
86
|
+
verify(): void;
|
|
87
|
+
}
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/storage/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { pageBounds } from "../model/query.js";
|
|
2
|
+
import { DatabaseSync } from "node:sqlite";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { dirname, resolve, relative, isAbsolute } from "node:path";
|
|
5
|
+
import { storyboardSchema } from "../model/schema.js";
|
|
6
|
+
import { assertUniqueIds, validateRelationships } from "../model/validate.js";
|
|
7
|
+
import { PayloadCodec, digest } from "./codec.js";
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { isDeepStrictEqual } from "node:util";
|
|
10
|
+
import { assertRenderFrame, selectFramePanels } from "../animation/frame.js";
|
|
11
|
+
const APPLICATION_ID = 0x43425244;
|
|
12
|
+
const FORMAT_VERSION = 1;
|
|
13
|
+
function identities(panel) {
|
|
14
|
+
const rows = [{ id: panel.id, name: panel.title, kind: "panel" }];
|
|
15
|
+
const visit = (layers) => {
|
|
16
|
+
for (const l of layers) {
|
|
17
|
+
rows.push({ id: l.id, name: l.name, kind: l.kind });
|
|
18
|
+
for (const k of l.keyframes)
|
|
19
|
+
rows.push({ id: k.id, name: "", kind: "layer-key" });
|
|
20
|
+
if (l.kind === "group")
|
|
21
|
+
visit(l.children);
|
|
22
|
+
else
|
|
23
|
+
for (const e of l.elements)
|
|
24
|
+
rows.push({ id: e.id, name: e.name ?? "", kind: e.kind });
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
visit(panel.layers);
|
|
28
|
+
for (const m of panel.motion)
|
|
29
|
+
rows.push({ id: m.id, name: m.label, kind: "motion" });
|
|
30
|
+
return rows;
|
|
31
|
+
}
|
|
32
|
+
/** SQLite owns atomic commits; immutable payloads own numeric and resource bytes. */
|
|
33
|
+
export class ProjectStore {
|
|
34
|
+
path;
|
|
35
|
+
db;
|
|
36
|
+
codec;
|
|
37
|
+
constructor(path, create) {
|
|
38
|
+
this.path = path;
|
|
39
|
+
if (!create && !existsSync(path))
|
|
40
|
+
throw new Error(`Project does not exist: ${path}`);
|
|
41
|
+
if (create)
|
|
42
|
+
mkdirSync(dirname(resolve(path)), { recursive: true });
|
|
43
|
+
this.db = new DatabaseSync(path);
|
|
44
|
+
try {
|
|
45
|
+
this.db.exec("PRAGMA foreign_keys=ON; PRAGMA busy_timeout=5000; PRAGMA synchronous=FULL; PRAGMA trusted_schema=OFF;");
|
|
46
|
+
const version = Number(this.db.prepare("PRAGMA user_version").get().user_version);
|
|
47
|
+
const app = Number(this.db.prepare("PRAGMA application_id").get().application_id);
|
|
48
|
+
if (version === 0 && app === 0 && create && !this.db.prepare("SELECT name FROM sqlite_master WHERE type='table'").get()) {
|
|
49
|
+
this.db.exec(`BEGIN IMMEDIATE;
|
|
50
|
+
PRAGMA application_id=${APPLICATION_ID}; PRAGMA user_version=${FORMAT_VERSION};
|
|
51
|
+
CREATE TABLE payloads(hash TEXT PRIMARY KEY,kind TEXT NOT NULL,codec TEXT NOT NULL CHECK(codec IN ('br','raw')),raw_size INTEGER NOT NULL CHECK(raw_size>=0),data BLOB NOT NULL);
|
|
52
|
+
CREATE TABLE roots(key TEXT PRIMARY KEY,hash TEXT NOT NULL REFERENCES payloads(hash)) WITHOUT ROWID;
|
|
53
|
+
CREATE TABLE payload_links(parent TEXT NOT NULL REFERENCES payloads(hash) ON DELETE CASCADE,child TEXT NOT NULL REFERENCES payloads(hash) ON DELETE CASCADE,PRIMARY KEY(parent,child)) WITHOUT ROWID;
|
|
54
|
+
CREATE TABLE panels(id TEXT PRIMARY KEY,position INTEGER NOT NULL,info TEXT NOT NULL,hash TEXT NOT NULL REFERENCES payloads(hash)) WITHOUT ROWID;
|
|
55
|
+
CREATE TABLE components(id TEXT PRIMARY KEY,position INTEGER NOT NULL,info TEXT NOT NULL,hash TEXT NOT NULL REFERENCES payloads(hash)) WITHOUT ROWID;
|
|
56
|
+
CREATE TABLE objects(id TEXT PRIMARY KEY,panel_id TEXT NOT NULL REFERENCES panels(id) ON DELETE CASCADE,name TEXT NOT NULL,kind TEXT NOT NULL) WITHOUT ROWID;
|
|
57
|
+
CREATE INDEX objects_panel ON objects(panel_id);
|
|
58
|
+
CREATE TABLE assets(id TEXT PRIMARY KEY,hash TEXT NOT NULL REFERENCES payloads(hash)) WITHOUT ROWID;
|
|
59
|
+
CREATE TABLE changes(position INTEGER PRIMARY KEY,entry TEXT NOT NULL);
|
|
60
|
+
COMMIT;`);
|
|
61
|
+
}
|
|
62
|
+
else if (version !== FORMAT_VERSION || app !== APPLICATION_ID)
|
|
63
|
+
throw new Error(`Unsupported project container (application ${app}, version ${version})`);
|
|
64
|
+
this.codec = new PayloadCodec(this.db);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.db.close();
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
static open(path) { return new ProjectStore(path, false); }
|
|
72
|
+
static create(path) { return new ProjectStore(path, true); }
|
|
73
|
+
close() { this.db.close(); }
|
|
74
|
+
[Symbol.dispose]() { this.close(); }
|
|
75
|
+
snapshot(work) {
|
|
76
|
+
this.db.exec("SAVEPOINT read_snapshot");
|
|
77
|
+
try {
|
|
78
|
+
const result = work();
|
|
79
|
+
this.db.exec("RELEASE read_snapshot");
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.db.exec("ROLLBACK TO read_snapshot; RELEASE read_snapshot");
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
root(key) {
|
|
88
|
+
const row = this.db.prepare("SELECT hash FROM roots WHERE key=?").get(key);
|
|
89
|
+
if (!row)
|
|
90
|
+
throw new Error(`Missing project root: ${key}`);
|
|
91
|
+
return String(row.hash);
|
|
92
|
+
}
|
|
93
|
+
setRoot(key, value) {
|
|
94
|
+
this.db.prepare("INSERT INTO roots VALUES(?,?) ON CONFLICT(key) DO UPDATE SET hash=excluded.hash WHERE hash<>excluded.hash").run(key, this.codec.write(value));
|
|
95
|
+
}
|
|
96
|
+
readHeader() { return this.snapshot(() => storyboardSchema.omit({ panels: true, components: true, changes: true }).parse(this.codec.read(this.root("document")))); }
|
|
97
|
+
get version() { return this.readHeader().version; }
|
|
98
|
+
listPanels() {
|
|
99
|
+
return this.db.prepare("SELECT info FROM panels ORDER BY position").all().map(r => JSON.parse(String(r.info)));
|
|
100
|
+
}
|
|
101
|
+
findObjects(query = {}) {
|
|
102
|
+
const { limit, offset } = pageBounds(query);
|
|
103
|
+
return this.db.prepare("SELECT id,panel_id AS panelId,name,kind FROM objects WHERE (? IS NULL OR panel_id=?) AND (? IS NULL OR instr(lower(name),lower(?))>0) AND (? IS NULL OR kind=?) ORDER BY panel_id,id LIMIT ? OFFSET ?")
|
|
104
|
+
.all(query.panelId ?? null, query.panelId ?? null, query.name ?? null, query.name ?? null, query.kind ?? null, query.kind ?? null, limit, offset);
|
|
105
|
+
}
|
|
106
|
+
readPanel(id, options = {}) {
|
|
107
|
+
return this.snapshot(() => {
|
|
108
|
+
const row = options.revision ? this.revision(options.revision).panels.find(p => p.id === id) : this.db.prepare("SELECT id,info,hash FROM panels WHERE id=?").get(id);
|
|
109
|
+
if (!row)
|
|
110
|
+
throw new Error(`Panel not found: ${id}`);
|
|
111
|
+
const panel = storyboardSchema.shape.panels.element.parse(this.codec.read(String(row.hash)));
|
|
112
|
+
const { layers, motion, ...info } = panel;
|
|
113
|
+
if (panel.id !== id || !isDeepStrictEqual(info, JSON.parse(String(row.info))))
|
|
114
|
+
throw new Error(`Panel index differs from artwork: ${id}`);
|
|
115
|
+
return panel;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/** Render context contains one decoded panel, plus timeline and small project metadata. */
|
|
119
|
+
panelDocument(id, options = {}) {
|
|
120
|
+
return this.snapshot(() => ({ ...options.revision ? this.codec.read(this.revision(options.revision).documentHash) : this.readHeader(), panels: [this.readPanel(id, options)], components: [], changes: [] }));
|
|
121
|
+
}
|
|
122
|
+
readDocument() {
|
|
123
|
+
return this.snapshot(() => {
|
|
124
|
+
const document = storyboardSchema.parse({ ...this.readHeader(), panels: this.listPanels().map(p => this.readPanel(p.id)), components: this.db.prepare("SELECT hash FROM components ORDER BY position").all().map(r => this.codec.read(String(r.hash))), changes: this.db.prepare("SELECT entry FROM changes ORDER BY position").all().map(r => JSON.parse(String(r.entry))) });
|
|
125
|
+
assertUniqueIds(document);
|
|
126
|
+
validateRelationships(document);
|
|
127
|
+
return document;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
readAsset(id, options = {}) {
|
|
131
|
+
return this.snapshot(() => {
|
|
132
|
+
if (options.expectedVersion !== undefined && this.version !== options.expectedVersion)
|
|
133
|
+
throw new Error("Embedded asset source changed since open; reopen the project before reading its assets");
|
|
134
|
+
const row = options.revision ? this.revision(options.revision).assets.find(a => a.id === id) : this.db.prepare("SELECT hash FROM assets WHERE id=?").get(id);
|
|
135
|
+
if (!row)
|
|
136
|
+
throw new Error(`Asset not embedded: ${id}`);
|
|
137
|
+
return this.codec.get(String(row.hash), "asset");
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** Explicit extraction for file-based audio encoders; never writes outside destination. */
|
|
141
|
+
extractAssets(directory) {
|
|
142
|
+
const root = resolve(directory);
|
|
143
|
+
for (const asset of this.readHeader().assets) {
|
|
144
|
+
const target = resolve(root, asset.path), rel = relative(root, target);
|
|
145
|
+
if (!rel || rel.startsWith("..") || isAbsolute(rel))
|
|
146
|
+
throw new Error(`Unsafe asset path: ${asset.path}`);
|
|
147
|
+
const bytes = this.readAsset(asset.id);
|
|
148
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
149
|
+
if (existsSync(target)) {
|
|
150
|
+
if (digest(readFileSync(target)) !== digest(bytes))
|
|
151
|
+
throw new Error(`Refusing to replace a different extracted asset: ${target}`);
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
writeFileSync(target, bytes, { flag: "wx" });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
putPanel(panel, position, hash = this.codec.write(panel)) {
|
|
158
|
+
const { layers, motion, ...info } = panel;
|
|
159
|
+
const prior = this.db.prepare("SELECT hash,position FROM panels WHERE id=?").get(panel.id);
|
|
160
|
+
if (prior?.hash === hash && prior.position === position)
|
|
161
|
+
return;
|
|
162
|
+
this.db.prepare("INSERT INTO panels VALUES(?,?,?,?) ON CONFLICT(id) DO UPDATE SET position=excluded.position,info=excluded.info,hash=excluded.hash").run(panel.id, position, JSON.stringify(info), hash);
|
|
163
|
+
this.db.prepare("DELETE FROM objects WHERE panel_id=?").run(panel.id);
|
|
164
|
+
const insert = this.db.prepare("INSERT INTO objects VALUES(?,?,?,?)");
|
|
165
|
+
for (const item of identities(panel))
|
|
166
|
+
insert.run(item.id, panel.id, item.name, item.kind);
|
|
167
|
+
}
|
|
168
|
+
save(document, options = {}) {
|
|
169
|
+
storyboardSchema.parse(document);
|
|
170
|
+
assertUniqueIds(document);
|
|
171
|
+
validateRelationships(document);
|
|
172
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
173
|
+
try {
|
|
174
|
+
const existing = this.db.prepare("SELECT hash FROM roots WHERE key='document'").get();
|
|
175
|
+
const priorHeader = existing ? this.readHeader() : undefined;
|
|
176
|
+
if (priorHeader && !options.overwrite && priorHeader.version !== options.expectedVersion)
|
|
177
|
+
throw new Error(`Disk version conflict: expected ${options.expectedVersion ?? "new file"}, found ${priorHeader.version}`);
|
|
178
|
+
const writesBefore = Number(this.db.prepare("SELECT total_changes() AS n").get().n);
|
|
179
|
+
const { panels, components, changes, ...header } = document;
|
|
180
|
+
this.setRoot("document", header);
|
|
181
|
+
for (const row of this.db.prepare("SELECT id FROM panels").all())
|
|
182
|
+
if (!panels.some(p => p.id === row.id))
|
|
183
|
+
this.db.prepare("DELETE FROM panels WHERE id=?").run(row.id);
|
|
184
|
+
const encoded = panels.map((panel, position) => ({ panel, position, hash: this.codec.write(panel) }));
|
|
185
|
+
// Release old ownership for every changed panel before transferring IDs between them.
|
|
186
|
+
for (const item of encoded) {
|
|
187
|
+
const prior = this.db.prepare("SELECT hash,position FROM panels WHERE id=?").get(item.panel.id);
|
|
188
|
+
if (prior?.hash !== item.hash || prior.position !== item.position)
|
|
189
|
+
this.db.prepare("DELETE FROM objects WHERE panel_id=?").run(item.panel.id);
|
|
190
|
+
}
|
|
191
|
+
encoded.forEach(({ panel, position, hash }) => this.putPanel(panel, position, hash));
|
|
192
|
+
for (const row of this.db.prepare("SELECT id FROM components").all())
|
|
193
|
+
if (!components.some(c => c.id === row.id))
|
|
194
|
+
this.db.prepare("DELETE FROM components WHERE id=?").run(row.id);
|
|
195
|
+
components.forEach((c, i) => this.db.prepare("INSERT INTO components VALUES(?,?,?,?) ON CONFLICT(id) DO UPDATE SET position=excluded.position,info=excluded.info,hash=excluded.hash WHERE hash<>excluded.hash OR position<>excluded.position").run(c.id, i, JSON.stringify({ id: c.id, name: c.name, version: c.version }), this.codec.write(c)));
|
|
196
|
+
this.db.prepare("DELETE FROM changes WHERE position>=?").run(changes.length);
|
|
197
|
+
changes.forEach((c, i) => this.db.prepare("INSERT INTO changes VALUES(?,?) ON CONFLICT(position) DO UPDATE SET entry=excluded.entry WHERE entry<>excluded.entry").run(i, JSON.stringify(c)));
|
|
198
|
+
for (const row of this.db.prepare("SELECT id FROM assets").all())
|
|
199
|
+
if (!document.assets.some(a => a.id === row.id))
|
|
200
|
+
this.db.prepare("DELETE FROM assets WHERE id=?").run(row.id);
|
|
201
|
+
for (const asset of document.assets) {
|
|
202
|
+
const source = resolve(options.assetRoot ?? dirname(this.path), asset.path);
|
|
203
|
+
const previous = this.db.prepare("SELECT hash FROM assets WHERE id=?").get(asset.id);
|
|
204
|
+
const original = priorHeader?.assets.find(a => a.id === asset.id);
|
|
205
|
+
if (previous && !options.overwrite && !options.readAsset && original?.path === asset.path && original.checksum === asset.checksum)
|
|
206
|
+
continue;
|
|
207
|
+
const portable = !options.assetRoot ? options.readAsset?.(asset.id) : undefined;
|
|
208
|
+
const bytes = portable ?? (existsSync(source) ? readFileSync(source) : previous ? this.readAsset(asset.id) : options.readAsset?.(asset.id));
|
|
209
|
+
if (!bytes)
|
|
210
|
+
throw new Error(`Missing asset ${asset.id}: ${source}`);
|
|
211
|
+
if (asset.checksum && digest(bytes) !== asset.checksum)
|
|
212
|
+
throw new Error(`Asset checksum mismatch: ${asset.id}`);
|
|
213
|
+
this.db.prepare("INSERT INTO assets VALUES(?,?) ON CONFLICT(id) DO UPDATE SET hash=excluded.hash WHERE hash<>excluded.hash").run(asset.id, this.codec.put("asset", bytes));
|
|
214
|
+
}
|
|
215
|
+
const changed = Number(this.db.prepare("SELECT total_changes() AS n").get().n) !== writesBefore;
|
|
216
|
+
if (priorHeader && (changed || options.overwrite) && header.version <= priorHeader.version) {
|
|
217
|
+
header.version = priorHeader.version + 1;
|
|
218
|
+
if (!Number.isSafeInteger(header.version))
|
|
219
|
+
throw new Error("Project version exceeds the safe integer range");
|
|
220
|
+
this.setRoot("document", header);
|
|
221
|
+
}
|
|
222
|
+
this.db.exec("COMMIT");
|
|
223
|
+
return header.version;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
this.db.exec("ROLLBACK");
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/** Targeted artwork revision. Topology and timeline edits use the full authoring session. */
|
|
231
|
+
updatePanel(panel, options) {
|
|
232
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
233
|
+
try {
|
|
234
|
+
const header = this.readHeader(), old = this.readPanel(panel.id), actor = options.actor ?? "agent:local";
|
|
235
|
+
if (header.version !== options.expectedVersion)
|
|
236
|
+
throw new Error(`Disk version conflict: expected ${options.expectedVersion}, found ${header.version}`);
|
|
237
|
+
for (const key of ["id", "shotId", "startFrame", "durationFrames"])
|
|
238
|
+
if (panel[key] !== old[key])
|
|
239
|
+
throw new Error(`Targeted panel revision cannot change ${key}; use project timeline API`);
|
|
240
|
+
const ids = identities(old).map(i => i.id).sort();
|
|
241
|
+
if (JSON.stringify(ids) !== JSON.stringify(identities(panel).map(i => i.id).sort()))
|
|
242
|
+
throw new Error("Targeted panel revision must preserve stable identity topology; use a full authoring session for additions/removals");
|
|
243
|
+
for (const lock of header.locks)
|
|
244
|
+
if (lock.owner !== actor && (lock.targetType === "project" || ids.includes(lock.targetId)))
|
|
245
|
+
throw new Error(`Locked by ${lock.owner}: ${lock.reason}`);
|
|
246
|
+
const parsed = storyboardSchema.shape.panels.element.parse(panel);
|
|
247
|
+
const skeleton = { ...header, panels: this.listPanels().map(p => p.id === panel.id ? parsed : { ...p, layers: [], motion: [] }), components: this.db.prepare("SELECT info FROM components").all().map(r => ({ ...JSON.parse(String(r.info)), layers: [] })), changes: [], comments: header.comments.filter(c => (!c.anchor.layerId || ids.includes(c.anchor.layerId)) && (!c.anchor.elementId || ids.includes(c.anchor.elementId))), locks: header.locks.filter(l => l.targetType !== "layer" || ids.includes(l.targetId)) };
|
|
248
|
+
validateRelationships(skeleton);
|
|
249
|
+
parsed.revision = old.revision + 1;
|
|
250
|
+
const position = Number(this.db.prepare("SELECT position FROM panels WHERE id=?").get(panel.id).position);
|
|
251
|
+
this.putPanel(parsed, position);
|
|
252
|
+
header.version++;
|
|
253
|
+
header.updatedAt = new Date().toISOString();
|
|
254
|
+
this.setRoot("document", header);
|
|
255
|
+
const index = Number(this.db.prepare("SELECT COALESCE(MAX(position),-1)+1 AS n FROM changes").get().n);
|
|
256
|
+
this.db.prepare("INSERT INTO changes VALUES(?,?)").run(index, JSON.stringify({ id: `change:store:${header.version}`, version: header.version, actor, operation: "update panel artwork", targetIds: [panel.id], timestamp: header.updatedAt }));
|
|
257
|
+
this.db.exec("COMMIT");
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
this.db.exec("ROLLBACK");
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
inspect() {
|
|
265
|
+
return { format: "Codeboard SQLite", formatVersion: FORMAT_VERSION, version: this.version, panels: Number(this.db.prepare("SELECT COUNT(*) AS n FROM panels").get().n), payloads: this.db.prepare("SELECT kind,COUNT(*) AS count,SUM(raw_size) AS rawBytes,SUM(length(data)) AS storedBytes FROM payloads GROUP BY kind").all() };
|
|
266
|
+
}
|
|
267
|
+
/** Decode only the current panel and, during a transition, its incoming panel. */
|
|
268
|
+
frameDocument(frame, options = {}) {
|
|
269
|
+
assertRenderFrame(frame);
|
|
270
|
+
return this.snapshot(() => {
|
|
271
|
+
const revision = options.revision ? this.revision(options.revision) : undefined;
|
|
272
|
+
const header = revision ? this.codec.read(revision.documentHash) : this.readHeader();
|
|
273
|
+
const metadata = revision ? revision.panels.map(row => JSON.parse(row.info)) : this.listPanels();
|
|
274
|
+
const { panel, incoming } = selectFramePanels(metadata, frame);
|
|
275
|
+
return { ...header, panels: [panel, ...incoming ? [incoming] : []].map(p => this.readPanel(p.id, options)), components: [], changes: [] };
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
revision(name) {
|
|
279
|
+
if (!name.trim() || name.length > 128)
|
|
280
|
+
throw new Error("Revision name must contain 1–128 characters");
|
|
281
|
+
return this.codec.read(this.root(`revision:${name}`));
|
|
282
|
+
}
|
|
283
|
+
/** A named root of references, not a second copy of the project's media. */
|
|
284
|
+
saveRevision(name, options) {
|
|
285
|
+
if (!name.trim() || name.length > 128)
|
|
286
|
+
throw new Error("Revision name must contain 1–128 characters");
|
|
287
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
288
|
+
try {
|
|
289
|
+
if (this.version !== options.expectedVersion)
|
|
290
|
+
throw new Error("Disk version conflict while recording revision");
|
|
291
|
+
if (this.db.prepare("SELECT 1 FROM roots WHERE key=?").get(`revision:${name}`))
|
|
292
|
+
throw new Error(`Revision already exists: ${name}`);
|
|
293
|
+
const snapshot = { name, version: this.version, createdAt: new Date().toISOString(), documentHash: this.root("document"),
|
|
294
|
+
changesHash: this.codec.write(this.db.prepare("SELECT entry FROM changes ORDER BY position").all().map(r => JSON.parse(String(r.entry)))),
|
|
295
|
+
panels: this.db.prepare("SELECT id,position,info,hash FROM panels ORDER BY position").all(),
|
|
296
|
+
components: this.db.prepare("SELECT id,position,info,hash FROM components ORDER BY position").all(),
|
|
297
|
+
assets: this.db.prepare("SELECT id,hash FROM assets ORDER BY id").all() };
|
|
298
|
+
const hash = this.codec.write(snapshot);
|
|
299
|
+
this.codec.retain(hash, [snapshot.documentHash, snapshot.changesHash, ...snapshot.panels.map(p => p.hash), ...snapshot.components.map(c => c.hash), ...snapshot.assets.map(a => a.hash)]);
|
|
300
|
+
this.db.prepare("INSERT INTO roots VALUES(?,?)").run(`revision:${name}`, hash);
|
|
301
|
+
this.db.exec("COMMIT");
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
this.db.exec("ROLLBACK");
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
listRevisions(options = {}) {
|
|
309
|
+
const { limit, offset } = pageBounds(options);
|
|
310
|
+
return this.snapshot(() => this.db.prepare("SELECT hash FROM roots WHERE key LIKE 'revision:%' ORDER BY key LIMIT ? OFFSET ?")
|
|
311
|
+
.all(limit, offset)
|
|
312
|
+
.map(r => { const s = this.codec.read(String(r.hash)); return { name: s.name, version: s.version, createdAt: s.createdAt, panels: s.panels.length }; }));
|
|
313
|
+
}
|
|
314
|
+
readRevision(name) {
|
|
315
|
+
return this.snapshot(() => {
|
|
316
|
+
const s = this.revision(name), header = this.codec.read(s.documentHash);
|
|
317
|
+
const document = storyboardSchema.parse({ ...header, panels: s.panels.map(p => this.codec.read(p.hash)), components: s.components.map(c => this.codec.read(c.hash)), changes: this.codec.read(s.changesHash) });
|
|
318
|
+
assertUniqueIds(document);
|
|
319
|
+
validateRelationships(document);
|
|
320
|
+
return document;
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
restoreRevision(name, options) {
|
|
324
|
+
const current = this.readHeader(), actor = options.actor ?? "agent:local";
|
|
325
|
+
if (current.version !== options.expectedVersion)
|
|
326
|
+
throw new Error("Disk version conflict while restoring revision");
|
|
327
|
+
const lock = current.locks.find(l => l.owner !== actor);
|
|
328
|
+
if (lock)
|
|
329
|
+
throw new Error(`Locked by ${lock.owner}: ${lock.reason}`);
|
|
330
|
+
const document = this.readRevision(name);
|
|
331
|
+
document.version = current.version + 1;
|
|
332
|
+
document.idCounter = Math.max(current.idCounter, document.idCounter);
|
|
333
|
+
document.updatedAt = new Date().toISOString();
|
|
334
|
+
document.changes = this.db.prepare("SELECT entry FROM changes ORDER BY position").all().map(r => JSON.parse(String(r.entry)));
|
|
335
|
+
document.changes.push({ id: `change:${randomUUID()}`, version: document.version, actor, operation: `restore revision: ${name}`, targetIds: [document.id], timestamp: document.updatedAt });
|
|
336
|
+
this.save(document, { expectedVersion: options.expectedVersion, readAsset: id => this.readAsset(id, { revision: name }) });
|
|
337
|
+
}
|
|
338
|
+
deleteRevision(name) {
|
|
339
|
+
const result = this.db.prepare("DELETE FROM roots WHERE key=?").run(`revision:${name}`);
|
|
340
|
+
if (!result.changes)
|
|
341
|
+
throw new Error(`Revision not found: ${name}`);
|
|
342
|
+
}
|
|
343
|
+
/** Optional maintenance, never part of a small edit. No artwork precision is changed. */
|
|
344
|
+
compact() {
|
|
345
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
346
|
+
try {
|
|
347
|
+
this.db.exec(`
|
|
348
|
+
WITH RECURSIVE live(hash) AS (
|
|
349
|
+
SELECT hash FROM roots UNION SELECT hash FROM panels UNION SELECT hash FROM components UNION SELECT hash FROM assets
|
|
350
|
+
UNION SELECT child FROM payload_links JOIN live ON parent=live.hash
|
|
351
|
+
) DELETE FROM payloads WHERE hash NOT IN (SELECT hash FROM live);`);
|
|
352
|
+
this.db.exec("COMMIT");
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
this.db.exec("ROLLBACK");
|
|
356
|
+
throw error;
|
|
357
|
+
}
|
|
358
|
+
this.db.exec("VACUUM");
|
|
359
|
+
}
|
|
360
|
+
verify() {
|
|
361
|
+
this.snapshot(() => {
|
|
362
|
+
const result = this.db.prepare("PRAGMA integrity_check").get();
|
|
363
|
+
if (result?.integrity_check !== "ok")
|
|
364
|
+
throw new Error(`SQLite integrity failure: ${JSON.stringify(result)}`);
|
|
365
|
+
if (this.db.prepare("PRAGMA foreign_key_check").get())
|
|
366
|
+
throw new Error("Broken project references");
|
|
367
|
+
for (const row of this.db.prepare("SELECT hash FROM payloads").all())
|
|
368
|
+
this.codec.get(String(row.hash));
|
|
369
|
+
const document = this.readDocument();
|
|
370
|
+
for (const panel of document.panels) {
|
|
371
|
+
const indexed = this.db.prepare("SELECT id,name,kind FROM objects WHERE panel_id=?").all(panel.id).map(row => ({ ...row }));
|
|
372
|
+
const expected = new Map(identities(panel).map(item => [item.id, item]));
|
|
373
|
+
if (indexed.length !== expected.size || indexed.some(item => !isDeepStrictEqual(item, expected.get(String(item.id)))))
|
|
374
|
+
throw new Error(`Object index differs from artwork: ${panel.id}`);
|
|
375
|
+
}
|
|
376
|
+
for (const [index, row] of this.db.prepare("SELECT id,info FROM components ORDER BY position").all().entries()) {
|
|
377
|
+
const component = document.components[index];
|
|
378
|
+
if (!component || component.id !== row.id || !isDeepStrictEqual(JSON.parse(String(row.info)), { id: component.id, name: component.name, version: component.version }))
|
|
379
|
+
throw new Error(`Component index differs from artwork: ${row.id}`);
|
|
380
|
+
}
|
|
381
|
+
const assets = this.db.prepare("SELECT id FROM assets").all().map(row => String(row.id)).sort();
|
|
382
|
+
if (!isDeepStrictEqual(assets, document.assets.map(asset => asset.id).sort()))
|
|
383
|
+
throw new Error("Embedded asset index differs from project assets");
|
|
384
|
+
for (const asset of document.assets) {
|
|
385
|
+
const bytes = this.readAsset(asset.id);
|
|
386
|
+
if (asset.checksum && digest(bytes) !== asset.checksum)
|
|
387
|
+
throw new Error(`Asset checksum mismatch: ${asset.id}`);
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/storage/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function newerRelease(latest: string, current: string): boolean;
|
|
2
|
+
export declare function latestRelease(timeout?: number): Promise<string>;
|
|
3
|
+
export declare function updateCachePath(): string;
|
|
4
|
+
export declare function cachedRelease(cachePath: string): Promise<string | undefined>;
|
|
5
|
+
export declare function confirmUpdate(): Promise<boolean>;
|
|
6
|
+
export declare function notifyUpdate(packagePath: string, version: string): Promise<void>;
|
|
7
|
+
export declare function installationArguments(packagePath: string, current: string, latest: string): Promise<string[]>;
|
|
8
|
+
export declare function verifyInstaller(bytes: Uint8Array, checksums: string, name: string): void;
|
|
9
|
+
export declare function installUpdate(packagePath: string, current: string, latest: string): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/updates.ts"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGrE;AAQD,wBAAsB,aAAa,CAAC,OAAO,SAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAOpE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkBlF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAOtD;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatF;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnH;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKxF;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvG"}
|