@debuffjp/assets 0.0.0-stage → 0.2.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.
package/README.md CHANGED
@@ -1,3 +1,39 @@
1
- # Temporary Holding Version
1
+ # @debuffjp/assets
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Runtime loader for the manifest that `debuff` generates from your project's `assets/` folder. No dependencies.
4
+
5
+ ```ts
6
+ import { Assets } from "@debuffjp/assets";
7
+ import { Sprite } from "@debuffjp/core";
8
+
9
+ const assets = new Assets(await (await fetch("assets/manifest.json")).json());
10
+ await assets.load("default", ({ loaded, total }) => showProgress(loaded / total));
11
+
12
+ const hero = new Sprite({ frames: assets.frames("hero") }); // hero@16x24.png, sliced on its grid
13
+ draw.sprite(assets.frame("coin"), x, y); // any image, atlased or not
14
+ ```
15
+
16
+ ## Conventions (from the asset compiler)
17
+
18
+ | File | Asset id | Group |
19
+ | --- | --- | --- |
20
+ | `assets/logo.png` | `logo` | `default` |
21
+ | `assets/level1/map.json` | `level1/map` | `level1` |
22
+ | `assets/hero@16x24.png` | `hero` (grid 16×24) | `default` |
23
+
24
+ ## API
25
+
26
+ - `load(groups?, onProgress?)`: preload one or more groups
27
+ - `fetch(id)`: lazy-load a single asset; concurrent calls share one request
28
+ - `frame(id)`: `{ image, x, y, w, h }` for `draw.sprite`; works for atlased and standalone images
29
+ - `frames(id)`: sprite-sheet frames from the `name@WxH` grid
30
+ - `image(id)` (standalone images only), `json(id)`, `audio(id)`, `text(id)`, `entry(id)`, `has(id)`
31
+
32
+ ## Atlases
33
+
34
+ The CLI packs PNGs into atlases per preload group, in dev and in builds, so a level loads one texture instead of dozens. It's lossless, with padding that prevents edge bleeding. Images over half the atlas size stay standalone. Configure or disable it in `debuff.config.ts`:
35
+
36
+ ```ts
37
+ export default defineConfig({ assets: { atlas: { maxSize: 2048, padding: 2, exclude: ["ui/"] } } }); // or atlas: false
38
+ ```
39
+ - Errors are `AssetError` with the asset `id` and a suggested fix
@@ -0,0 +1,83 @@
1
+ /** Runtime asset manifest and loader. The build-time compiler (see `@debuffjp/cli`)
2
+ * produces the manifest; at runtime this only fetches and caches. */
3
+ export type AssetType = "image" | "json" | "audio" | "text";
4
+ export interface AssetEntry {
5
+ type: AssetType;
6
+ /** URL relative to the manifest's base. */
7
+ src: string;
8
+ /** Preload group; defaults to "default". */
9
+ group?: string;
10
+ /** Optional sprite-sheet grid for images. */
11
+ grid?: {
12
+ frameWidth: number;
13
+ frameHeight: number;
14
+ };
15
+ /** Region of `src` holding this image when it was packed into an atlas. */
16
+ rect?: {
17
+ x: number;
18
+ y: number;
19
+ w: number;
20
+ h: number;
21
+ };
22
+ bytes?: number;
23
+ }
24
+ export interface AssetManifest {
25
+ version: 1;
26
+ assets: Record<string, AssetEntry>;
27
+ }
28
+ export interface LoadProgress {
29
+ loaded: number;
30
+ total: number;
31
+ }
32
+ /** An image region, structurally compatible with `@debuffjp/core`'s `Frame`. */
33
+ export interface ImageFrame {
34
+ image: HTMLImageElement;
35
+ x: number;
36
+ y: number;
37
+ w: number;
38
+ h: number;
39
+ }
40
+ export declare class AssetError extends Error {
41
+ readonly id: string;
42
+ constructor(id: string, message: string);
43
+ }
44
+ type Loaded = HTMLImageElement | ArrayBuffer | string | unknown;
45
+ export declare class Assets {
46
+ readonly manifest: AssetManifest;
47
+ private readonly base;
48
+ private readonly cache;
49
+ private readonly pending;
50
+ /** Loads by URL, so assets packed into one atlas share a single request and image. */
51
+ private readonly byUrl;
52
+ constructor(manifest: AssetManifest, base?: string);
53
+ /** Load every asset in the given groups (default: "default"). */
54
+ load(groups?: string | readonly string[], onProgress?: (p: LoadProgress) => void): Promise<void>;
55
+ has(id: string): boolean;
56
+ /**
57
+ * The whole image element. For images packed into an atlas this would be the atlas, so it throws;
58
+ * use `frame(id)` (works for both) with `draw.sprite`.
59
+ */
60
+ image(id: string): HTMLImageElement;
61
+ /** The image region for an asset: `{ image, x, y, w, h }`, ready for `draw.sprite`. Works whether or not it was atlased. */
62
+ frame(id: string): ImageFrame;
63
+ /**
64
+ * Frames of a sprite sheet declared with the `name@WxH.png` convention, row-major, ready for
65
+ * `new Sprite({ frames })`. Works whether or not the sheet was atlased.
66
+ */
67
+ frames(id: string): ImageFrame[];
68
+ json<T = unknown>(id: string): T;
69
+ /** Raw encoded audio; decode with `@debuffjp/audio`. */
70
+ audio(id: string): ArrayBuffer;
71
+ text(id: string): string;
72
+ /**
73
+ * The asset's URL without downloading it, for streaming: `audio.stream(assets.url("music/theme"))`.
74
+ * Keep long tracks in a group you never `load()` (e.g. `assets/music/`) so they aren't fetched twice.
75
+ */
76
+ url(id: string): string;
77
+ entry(id: string): AssetEntry;
78
+ /** Fetch a single asset (lazy loading). Concurrent calls share one request. */
79
+ fetch(id: string): Promise<Loaded>;
80
+ private get;
81
+ }
82
+ export {};
83
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;sEACsE;AACtE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,2EAA2E;IAC3E,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,qBAAa,UAAW,SAAQ,KAAK;IAEjC,QAAQ,CAAC,EAAE,EAAE,MAAM;IADrB,YACW,EAAE,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,KAAK,MAAM,GAAG,gBAAgB,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,qBAAa,MAAM;IAOf,QAAQ,CAAC,QAAQ,EAAE,aAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAE5D,YACW,QAAQ,EAAE,aAAa,EACf,IAAI,SAAK,EACxB;IAEJ,iEAAiE;IAC3D,IAAI,CAAC,MAAM,GAAE,MAAM,GAAG,SAAS,MAAM,EAAc,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAahH;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvB;IAED;;;OAGG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAQlC;IAED,4HAA4H;IAC5H,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAI5B;IAED;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,EAAE,CAW/B;IAED,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAE/B;IAED,wDAAwD;IACxD,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAE7B;IAED,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEvB;IAED;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEtB;IAED,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAI5B;IAED,+EAA+E;IAC/E,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBjC;IAED,OAAO,CAAC,GAAG;CAQZ"}
package/dist/index.js ADDED
@@ -0,0 +1,156 @@
1
+ export class AssetError extends Error {
2
+ id;
3
+ constructor(id, message) {
4
+ super(message);
5
+ this.id = id;
6
+ this.name = "AssetError";
7
+ }
8
+ }
9
+ export class Assets {
10
+ manifest;
11
+ base;
12
+ cache = new Map();
13
+ pending = new Map();
14
+ /** Loads by URL, so assets packed into one atlas share a single request and image. */
15
+ byUrl = new Map();
16
+ constructor(manifest, base = "") {
17
+ this.manifest = manifest;
18
+ this.base = base;
19
+ }
20
+ /** Load every asset in the given groups (default: "default"). */
21
+ async load(groups = "default", onProgress) {
22
+ const wanted = new Set(typeof groups === "string" ? [groups] : groups);
23
+ const ids = Object.entries(this.manifest.assets)
24
+ .filter(([, e]) => wanted.has(e.group ?? "default"))
25
+ .map(([id]) => id);
26
+ let loaded = 0;
27
+ onProgress?.({ loaded, total: ids.length });
28
+ await Promise.all(ids.map(async (id) => {
29
+ await this.fetch(id);
30
+ onProgress?.({ loaded: ++loaded, total: ids.length });
31
+ }));
32
+ }
33
+ has(id) {
34
+ return this.cache.has(id);
35
+ }
36
+ /**
37
+ * The whole image element. For images packed into an atlas this would be the atlas, so it throws;
38
+ * use `frame(id)` (works for both) with `draw.sprite`.
39
+ */
40
+ image(id) {
41
+ if (this.entry(id).rect) {
42
+ throw new AssetError(id, `Asset "${id}" is packed into an atlas. Use assets.frame("${id}") (or frames() for sprite sheets) with draw.sprite.`);
43
+ }
44
+ return this.get(id, "image");
45
+ }
46
+ /** The image region for an asset: `{ image, x, y, w, h }`, ready for `draw.sprite`. Works whether or not it was atlased. */
47
+ frame(id) {
48
+ const image = this.get(id, "image");
49
+ const rect = this.entry(id).rect;
50
+ return rect ? { image, ...rect } : { image, x: 0, y: 0, w: image.naturalWidth || image.width, h: image.naturalHeight || image.height };
51
+ }
52
+ /**
53
+ * Frames of a sprite sheet declared with the `name@WxH.png` convention, row-major, ready for
54
+ * `new Sprite({ frames })`. Works whether or not the sheet was atlased.
55
+ */
56
+ frames(id) {
57
+ const whole = this.frame(id);
58
+ const grid = this.entry(id).grid;
59
+ if (!grid)
60
+ return [whole];
61
+ const out = [];
62
+ for (let y = 0; y + grid.frameHeight <= whole.h; y += grid.frameHeight) {
63
+ for (let x = 0; x + grid.frameWidth <= whole.w; x += grid.frameWidth) {
64
+ out.push({ image: whole.image, x: whole.x + x, y: whole.y + y, w: grid.frameWidth, h: grid.frameHeight });
65
+ }
66
+ }
67
+ return out;
68
+ }
69
+ json(id) {
70
+ return this.get(id, "json");
71
+ }
72
+ /** Raw encoded audio; decode with `@debuffjp/audio`. */
73
+ audio(id) {
74
+ return this.get(id, "audio");
75
+ }
76
+ text(id) {
77
+ return this.get(id, "text");
78
+ }
79
+ /**
80
+ * The asset's URL without downloading it, for streaming: `audio.stream(assets.url("music/theme"))`.
81
+ * Keep long tracks in a group you never `load()` (e.g. `assets/music/`) so they aren't fetched twice.
82
+ */
83
+ url(id) {
84
+ return this.base + this.entry(id).src;
85
+ }
86
+ entry(id) {
87
+ const e = this.manifest.assets[id];
88
+ if (!e)
89
+ throw new AssetError(id, `Unknown asset "${id}". ${suggest(id, Object.keys(this.manifest.assets))}`);
90
+ return e;
91
+ }
92
+ /** Fetch a single asset (lazy loading). Concurrent calls share one request. */
93
+ fetch(id) {
94
+ if (this.cache.has(id))
95
+ return Promise.resolve(this.cache.get(id));
96
+ const existing = this.pending.get(id);
97
+ if (existing)
98
+ return existing;
99
+ const entry = this.entry(id);
100
+ const url = this.base + entry.src;
101
+ let shared = this.byUrl.get(url);
102
+ if (!shared) {
103
+ shared = loadOne(entry.type, url);
104
+ this.byUrl.set(url, shared);
105
+ shared.catch(() => this.byUrl.delete(url));
106
+ }
107
+ const p = shared
108
+ .then((value) => {
109
+ this.cache.set(id, value);
110
+ this.pending.delete(id);
111
+ return value;
112
+ })
113
+ .catch((err) => {
114
+ this.pending.delete(id);
115
+ throw new AssetError(id, `Failed to load asset "${id}" from ${url}: ${err instanceof Error ? err.message : String(err)}`);
116
+ });
117
+ this.pending.set(id, p);
118
+ return p;
119
+ }
120
+ get(id, type) {
121
+ const entry = this.entry(id);
122
+ if (entry.type !== type)
123
+ throw new AssetError(id, `Asset "${id}" is ${entry.type}, not ${type}`);
124
+ if (!this.cache.has(id)) {
125
+ throw new AssetError(id, `Asset "${id}" not loaded yet. Load its group "${entry.group ?? "default"}" first.`);
126
+ }
127
+ return this.cache.get(id);
128
+ }
129
+ }
130
+ async function loadOne(type, url) {
131
+ if (type === "image") {
132
+ const img = new Image();
133
+ await new Promise((resolve, reject) => {
134
+ img.onload = () => resolve();
135
+ img.onerror = () => reject(new Error("image failed to load or decode"));
136
+ img.src = url;
137
+ });
138
+ // decode() avoids a hitch on first draw, but it can stall indefinitely in background tabs and
139
+ // throttled iframes. The load event already guarantees the image is usable, so it's only a hint.
140
+ img.decode().catch(() => { });
141
+ return img;
142
+ }
143
+ const res = await fetch(url);
144
+ if (!res.ok)
145
+ throw new Error(`HTTP ${res.status}`);
146
+ if (type === "json")
147
+ return res.json();
148
+ if (type === "text")
149
+ return res.text();
150
+ return res.arrayBuffer();
151
+ }
152
+ function suggest(id, known) {
153
+ const close = known.filter((k) => k.includes(id) || id.includes(k)).slice(0, 3);
154
+ return close.length ? `Did you mean: ${close.join(", ")}?` : `${known.length} assets in manifest.`;
155
+ }
156
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,47 @@
1
1
  {
2
2
  "name": "@debuffjp/assets",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "Manifest-driven asset loader with preload groups for debuff",
5
+ "keywords": [
6
+ "game",
7
+ "gamedev",
8
+ "game-engine",
9
+ "2d",
10
+ "html5-game",
11
+ "browser-game",
12
+ "debuff",
13
+ "assets",
14
+ "loader",
15
+ "preload",
16
+ "sprite-sheet"
17
+ ],
18
+ "license": "MIT",
19
+ "homepage": "https://debuff.jp",
20
+ "bugs": "https://github.com/debuffjp/debuff/issues",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/debuffjp/debuff.git",
24
+ "directory": "packages/assets"
25
+ },
26
+ "type": "module",
27
+ "sideEffects": false,
28
+ "main": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "default": "./dist/index.js"
34
+ }
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md"
39
+ ],
40
+ "scripts": {
41
+ "build": "tsc -b"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public",
45
+ "provenance": false
46
+ }
47
+ }