ba-memorial-lobby-wallpaper-toolkit 0.2.0 → 0.4.0

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.
@@ -0,0 +1,20 @@
1
+ export declare function sha256(bytes: Uint8Array): string;
2
+ export interface VerifiedCopyOptions {
3
+ source: string;
4
+ target: string;
5
+ expectedHash?: string;
6
+ checksums?: ReadonlyMap<string, string>;
7
+ checksumKey?: string;
8
+ }
9
+ export declare function parseChecksumManifest(content: string, source?: string): Map<string, string>;
10
+ export declare function copyVerifiedFile(options: VerifiedCopyOptions): Promise<Buffer>;
11
+ export interface UpscaledPngOptions {
12
+ source: string;
13
+ original: string;
14
+ target: string;
15
+ scale: number;
16
+ }
17
+ export declare function copyValidatedUpscaledPng(options: UpscaledPngOptions): Promise<void>;
18
+ export declare function writeScaledAtlasFile(source: string, target: string, scale: number): Promise<void>;
19
+ export declare function copyRuntimeFile(source: string, target: string, stripSourceMap?: boolean): Promise<void>;
20
+ //# sourceMappingURL=asset-preparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-preparation.d.ts","sourceRoot":"","sources":["../src/asset-preparation.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEhD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAsB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CASpF;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CASzF;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvG;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3G"}
@@ -0,0 +1,58 @@
1
+ import { copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { createHash } from "node:crypto";
3
+ import path from "node:path";
4
+ export function sha256(bytes) {
5
+ return createHash("sha256").update(bytes).digest("hex");
6
+ }
7
+ export function parseChecksumManifest(content, source = "checksum manifest") {
8
+ const manifest = new Map();
9
+ for (const line of content.trim().split(/\r?\n/).filter(Boolean)) {
10
+ const match = /^([a-f0-9]{64})\s{2}(.+)$/.exec(line);
11
+ if (!match)
12
+ throw new Error(`Invalid checksum line in ${source}: ${line}`);
13
+ manifest.set(match[2].replace(/\//g, path.sep), match[1]);
14
+ }
15
+ return manifest;
16
+ }
17
+ export async function copyVerifiedFile(options) {
18
+ const bytes = await readFile(options.source);
19
+ const expectedHash = options.expectedHash ?? (options.checksumKey ? options.checksums?.get(options.checksumKey) : undefined);
20
+ if (!expectedHash)
21
+ throw new Error(`No pinned checksum for ${options.checksumKey ?? options.source}`);
22
+ const actualHash = sha256(bytes);
23
+ if (actualHash !== expectedHash)
24
+ throw new Error(`${options.checksumKey ?? options.source} failed SHA-256 verification: ${actualHash}`);
25
+ await mkdir(path.dirname(options.target), { recursive: true });
26
+ await copyFile(options.source, options.target);
27
+ return bytes;
28
+ }
29
+ export async function copyValidatedUpscaledPng(options) {
30
+ const [upscaled, original] = await Promise.all([readFile(options.source), readFile(options.original)]);
31
+ const dimensions = pngDimensions(upscaled, options.source);
32
+ const originalDimensions = pngDimensions(original, options.original);
33
+ if (dimensions.width !== originalDimensions.width * options.scale || dimensions.height !== originalDimensions.height * options.scale || dimensions.colorType !== 6) {
34
+ throw new Error(`${options.source} is not a ${options.scale}x RGBA upscale of ${options.original}: ${dimensions.width}x${dimensions.height}, color type ${dimensions.colorType}`);
35
+ }
36
+ await mkdir(path.dirname(options.target), { recursive: true });
37
+ await copyFile(options.source, options.target);
38
+ }
39
+ export async function writeScaledAtlasFile(source, target, scale) {
40
+ const atlasText = await readFile(source, "utf8");
41
+ await mkdir(path.dirname(target), { recursive: true });
42
+ await writeFile(target, scaleAtlas(atlasText, scale), "utf8");
43
+ }
44
+ export async function copyRuntimeFile(source, target, stripSourceMap = false) {
45
+ const bytes = await readFile(source);
46
+ const content = stripSourceMap ? bytes.toString("utf8").replace(/^\/\/# sourceMappingURL=.*\r?\n?/gm, "") : bytes;
47
+ await mkdir(path.dirname(target), { recursive: true });
48
+ await writeFile(target, content);
49
+ }
50
+ function pngDimensions(bytes, source) {
51
+ if (bytes.subarray(1, 4).toString("ascii") !== "PNG")
52
+ throw new Error(`Invalid PNG file: ${source}`);
53
+ return { width: bytes.readUInt32BE(16), height: bytes.readUInt32BE(20), colorType: bytes[25] };
54
+ }
55
+ function scaleAtlas(atlasText, scale) {
56
+ return atlasText.replace(/^(\s*)(size|xy|orig|offset):\s*(\d+),\s*(\d+)\s*$/gm, (_, indent, key, first, second) => `${indent}${key}: ${Number(first) * scale}, ${Number(second) * scale}`);
57
+ }
58
+ //# sourceMappingURL=asset-preparation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-preparation.js","sourceRoot":"","sources":["../src/asset-preparation.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  export * from "./checksums.js";
2
+ export * from "./asset-preparation.js";
2
3
  export * from "./distribution-validation.js";
3
4
  export * from "./model-assets.js";
4
5
  export * from "./model-assets.js";
5
6
  export * from "./offline-package.js";
7
+ export * from "./spine-inspection.js";
6
8
  export * from "./template-initialization.js";
7
9
  export * from "./vite/index.js";
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  export * from "./checksums.js";
2
+ export * from "./asset-preparation.js";
2
3
  export * from "./distribution-validation.js";
3
4
  export * from "./model-assets.js";
4
5
  export * from "./model-assets.js";
5
6
  export * from "./offline-package.js";
7
+ export * from "./spine-inspection.js";
6
8
  export * from "./template-initialization.js";
7
9
  export * from "./vite/index.js";
8
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type WallpaperModelDefinition } from "./model-assets.js";
2
+ export interface InspectSpineModelOptions {
3
+ projectRoot: string;
4
+ model: WallpaperModelDefinition;
5
+ runtimeCommit: string;
6
+ modelDirectory?: string;
7
+ runtimePath?: string;
8
+ outputPath?: string;
9
+ }
10
+ export declare function parseSpineBinaryHeader(bytes: Buffer): {
11
+ hash: string | null;
12
+ version: string | null;
13
+ };
14
+ export declare function inspectSpineModel(options: InspectSpineModelOptions): Promise<Record<string, any>>;
15
+ export declare function spineInspectionSummary(report: Record<string, any>): Record<string, any>;
16
+ //# sourceMappingURL=spine-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spine-inspection.d.ts","sourceRoot":"","sources":["../src/spine-inspection.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE7F,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,wBAAwB,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAGrG;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAqDvG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEvF"}
@@ -0,0 +1,94 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import vm from "node:vm";
4
+ import { atlasPages, pngDimensions } from "./model-assets.js";
5
+ function readVarint(bytes, state) {
6
+ let result = 0;
7
+ let shift = 0;
8
+ let value;
9
+ do {
10
+ value = bytes[state.offset++];
11
+ result |= (value & 0x7f) << shift;
12
+ shift += 7;
13
+ } while (value & 0x80);
14
+ return result >>> 0;
15
+ }
16
+ function readHeaderString(bytes, state) {
17
+ const byteCount = readVarint(bytes, state);
18
+ if (byteCount === 0)
19
+ return null;
20
+ if (byteCount === 1)
21
+ return "";
22
+ const value = bytes.subarray(state.offset, state.offset + byteCount - 1);
23
+ state.offset += byteCount - 1;
24
+ return value.toString("utf8");
25
+ }
26
+ export function parseSpineBinaryHeader(bytes) {
27
+ const state = { offset: 0 };
28
+ return { hash: readHeaderString(bytes, state), version: readHeaderString(bytes, state) };
29
+ }
30
+ export async function inspectSpineModel(options) {
31
+ const projectRoot = path.resolve(options.projectRoot);
32
+ const modelDirectory = options.modelDirectory ?? path.join(projectRoot, "local-assets", "original", "model");
33
+ const binaryBase = path.posix.basename(options.model.binary).replace(/\.(skel|json)$/, "");
34
+ const skelPath = path.join(modelDirectory, `${binaryBase}.skel`);
35
+ const atlasPath = path.join(modelDirectory, `${binaryBase}.atlas`);
36
+ const runtimePath = options.runtimePath ?? path.join(projectRoot, ".cache", "spine-runtimes-3.8", "spine-ts", "build", "spine-webgl.js");
37
+ const outputPath = options.outputPath ?? path.join(projectRoot, "research", "spine-inspection.json");
38
+ const [runtimeSource, skel, atlasText] = await Promise.all([readFile(runtimePath, "utf8"), readFile(skelPath), readFile(atlasPath, "utf8")]);
39
+ const binaryHeader = parseSpineBinaryHeader(skel);
40
+ const context = vm.createContext({ console });
41
+ vm.runInContext(runtimeSource, context, { filename: runtimePath });
42
+ const spine = context.spine;
43
+ if (!spine?.SkeletonBinary || !spine?.TextureAtlas)
44
+ throw new Error("The pinned Spine 3.8 WebGL runtime did not load correctly");
45
+ const pages = atlasPages(atlasText, atlasPath);
46
+ const pngs = {};
47
+ for (const page of pages)
48
+ pngs[page] = pngDimensions(await readFile(path.join(modelDirectory, page)), page);
49
+ const atlas = new spine.TextureAtlas(atlasText, (pageName) => {
50
+ const dimensions = pngs[pageName];
51
+ if (!dimensions)
52
+ throw new Error(`Atlas references an unknown page: ${pageName}`);
53
+ return new spine.FakeTexture(dimensions);
54
+ });
55
+ const data = new spine.SkeletonBinary(new spine.AtlasAttachmentLoader(atlas)).readSkeletonData(new Uint8Array(skel));
56
+ const animationReports = data.animations.map((animation) => {
57
+ const events = [];
58
+ const timelineTypes = {};
59
+ const timelineTargets = [];
60
+ for (const timeline of animation.timelines) {
61
+ const type = timeline.constructor.name;
62
+ timelineTypes[type] = (timelineTypes[type] ?? 0) + 1;
63
+ if (Number.isInteger(timeline.boneIndex))
64
+ timelineTargets.push({ type, targetType: "bone", target: data.bones[timeline.boneIndex].name });
65
+ else if (Number.isInteger(timeline.slotIndex))
66
+ timelineTargets.push({ type, targetType: "slot", target: data.slots[timeline.slotIndex].name });
67
+ if (timeline instanceof spine.EventTimeline)
68
+ for (const event of timeline.events)
69
+ events.push({ time: event.time, name: event.data.name, intValue: event.intValue, floatValue: event.floatValue, stringValue: event.stringValue, volume: event.volume, balance: event.balance });
70
+ }
71
+ return { name: animation.name, duration: animation.duration, timelineCount: animation.timelines.length, timelineTypes, timelineTargets, events };
72
+ });
73
+ const candidatePattern = /touch|eye|head|face|look|pat|track|mouse/i;
74
+ const report = {
75
+ generatedAt: new Date().toISOString(),
76
+ source: { skeleton: `local-assets/original/model/${binaryBase}.skel`, atlas: `local-assets/original/model/${binaryBase}.atlas`, runtimeRepository: "https://github.com/EsotericSoftware/spine-runtimes", runtimeBranch: "3.8", runtimeCommit: options.runtimeCommit },
77
+ binaryHeader,
78
+ skeleton: { hash: data.hash, version: data.version, x: data.x, y: data.y, width: data.width, height: data.height, fps: data.fps, imagesPath: data.imagesPath, audioPath: data.audioPath },
79
+ counts: { bones: data.bones.length, slots: data.slots.length, skins: data.skins.length, events: data.events.length, animations: data.animations.length, atlasPages: atlas.pages.length, atlasRegions: atlas.regions.length },
80
+ atlasPages: atlas.pages.map((page) => ({ name: page.name, width: page.width, height: page.height })),
81
+ bones: data.bones.map((bone) => ({ name: bone.name, parent: bone.parent?.name ?? null, x: bone.x, y: bone.y, rotation: bone.rotation, scaleX: bone.scaleX, scaleY: bone.scaleY })),
82
+ slots: data.slots.map((slot) => ({ name: slot.name, bone: slot.boneData.name, attachmentName: slot.attachmentName, blendMode: slot.blendMode })),
83
+ skins: data.skins.map((skin) => skin.name),
84
+ eventDefinitions: data.events.map((event) => ({ name: event.name, intValue: event.intValue, floatValue: event.floatValue, stringValue: event.stringValue, audioPath: event.audioPath, volume: event.volume, balance: event.balance })),
85
+ animations: animationReports,
86
+ interactionCandidates: { bones: data.bones.map((bone) => bone.name).filter((name) => candidatePattern.test(name)), slots: data.slots.map((slot) => slot.name).filter((name) => candidatePattern.test(name)), animations: data.animations.map((animation) => animation.name).filter((name) => candidatePattern.test(name)) },
87
+ };
88
+ await writeFile(outputPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
89
+ return report;
90
+ }
91
+ export function spineInspectionSummary(report) {
92
+ return { binaryHeader: report.binaryHeader, skeleton: report.skeleton, counts: report.counts, interactionCandidates: report.interactionCandidates, animations: report.animations.map(({ name, duration, events }) => ({ name, duration, events })) };
93
+ }
94
+ //# sourceMappingURL=spine-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spine-inspection.js","sourceRoot":"","sources":["../src/spine-inspection.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ba-memorial-lobby-wallpaper-toolkit",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",