@datamoc/mw_games 0.38.0 → 0.40.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/CHANGELOG.md +75 -0
- package/api-surface.json +500 -2
- package/data/microgm-opt.PROVENANCE.md +20 -0
- package/data/microgm-opt.sf2 +0 -0
- package/dist/assets/SvgParts.d.ts +31 -0
- package/dist/assets/SvgParts.d.ts.map +1 -0
- package/dist/assets/SvgParts.js +54 -0
- package/dist/assets/SvgParts.js.map +1 -0
- package/dist/assets/SvgSource.d.ts +3 -0
- package/dist/assets/SvgSource.d.ts.map +1 -0
- package/dist/assets/SvgSource.js +22 -0
- package/dist/assets/SvgSource.js.map +1 -0
- package/dist/assets/index.d.ts +2 -0
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +1 -0
- package/dist/assets/index.js.map +1 -1
- package/dist/assets/svg.d.ts.map +1 -1
- package/dist/assets/svg.js +9 -5
- package/dist/assets/svg.js.map +1 -1
- package/dist/mw_games.global.js +110 -110
- package/dist/mwl/presentation.d.ts.map +1 -1
- package/dist/mwl/presentation.js +25 -18
- package/dist/mwl/presentation.js.map +1 -1
- package/dist/physics/PhysicsWorld.d.ts +49 -17
- package/dist/physics/PhysicsWorld.d.ts.map +1 -1
- package/dist/physics/PhysicsWorld.js +297 -59
- package/dist/physics/PhysicsWorld.js.map +1 -1
- package/dist/physics/XpbdWorld.d.ts +1 -1
- package/dist/physics/XpbdWorld.js +1 -1
- package/dist/physics/cloth/index.d.ts +98 -0
- package/dist/physics/cloth/index.d.ts.map +1 -0
- package/dist/physics/cloth/index.js +207 -0
- package/dist/physics/cloth/index.js.map +1 -0
- package/dist/physics/index.d.ts +4 -0
- package/dist/physics/index.d.ts.map +1 -1
- package/dist/physics/index.js +2 -0
- package/dist/physics/index.js.map +1 -1
- package/dist/physics/spring/index.d.ts +90 -0
- package/dist/physics/spring/index.d.ts.map +1 -0
- package/dist/physics/spring/index.js +97 -0
- package/dist/physics/spring/index.js.map +1 -0
- package/dist/skeleton/index.d.ts +94 -13
- package/dist/skeleton/index.d.ts.map +1 -1
- package/dist/skeleton/index.js +192 -73
- package/dist/skeleton/index.js.map +1 -1
- package/dist/two-d/presentation/MwlPresentation.d.ts +12 -0
- package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -1
- package/dist/two-d/presentation/MwlPresentation.js +204 -153
- package/dist/two-d/presentation/MwlPresentation.js.map +1 -1
- package/dist/two-d/render/ClothSprite.d.ts +83 -0
- package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
- package/dist/two-d/render/ClothSprite.js +105 -0
- package/dist/two-d/render/ClothSprite.js.map +1 -0
- package/dist/two-d/render/HazeLayer.d.ts +112 -0
- package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
- package/dist/two-d/render/HazeLayer.js +185 -0
- package/dist/two-d/render/HazeLayer.js.map +1 -0
- package/dist/two-d/render/NeonGlow.d.ts +100 -0
- package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
- package/dist/two-d/render/NeonGlow.js +183 -0
- package/dist/two-d/render/NeonGlow.js.map +1 -0
- package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
- package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
- package/dist/two-d/render/SkeletalSprite.js +27 -3
- package/dist/two-d/render/SkeletalSprite.js.map +1 -1
- package/dist/two-d/render/SpringSprite.d.ts +40 -0
- package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
- package/dist/two-d/render/SpringSprite.js +39 -0
- package/dist/two-d/render/SpringSprite.js.map +1 -0
- package/dist/two-d/render/SpriteDeform.d.ts +156 -0
- package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
- package/dist/two-d/render/SpriteDeform.js +278 -0
- package/dist/two-d/render/SpriteDeform.js.map +1 -0
- package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
- package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
- package/dist/two-d/render/SvgSkeleton.js +112 -0
- package/dist/two-d/render/SvgSkeleton.js.map +1 -0
- package/dist/two-d/render/index.d.ts +12 -0
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +6 -0
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -7
- package/sbom.cdx.json +6 -58
- package/tools/asset-report.d.mts +37 -0
- package/tools/asset-report.mjs +157 -0
- package/tools/compile-resources.d.mts +24 -0
- package/tools/compile-resources.mjs +138 -5
- package/tools/emit-page.d.mts +9 -1
- package/tools/emit-page.mjs +31 -3
- package/tools/vite.mjs +6 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { readSvgSource } from '../../assets/SvgSource.js';
|
|
2
|
+
import { loadSvgParts } from '../../assets/SvgParts.js';
|
|
3
|
+
import { resolve } from '../../skeleton/index.js';
|
|
4
|
+
import { SkeletalSprite } from './SkeletalSprite.js';
|
|
5
|
+
/**
|
|
6
|
+
* Load authored SVG limbs, normalize each around its pivot, and bind them to a skeleton.
|
|
7
|
+
* Uses SVG data-pivot-x / data-pivot-y attributes or pivots supplied by the game. Art is
|
|
8
|
+
* rotated back from its rest angle before rasterization, so rest poses reconstruct the drawing
|
|
9
|
+
* and posed limbs turn around their joints. Separately bound descendant groups are removed
|
|
10
|
+
* from parent parts, avoiding duplicate limbs; ancestor transforms and shared defs/styles survive.
|
|
11
|
+
* Requires browser DOMParser and XMLSerializer. Compiled asset paths work directly under file://.
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { create } from '@datamoc/mw_games/skeleton';
|
|
15
|
+
* import { loadSvgSkeleton } from '@datamoc/mw_games/two-d/render';
|
|
16
|
+
* import { releaseSvgParts } from '@datamoc/mw_games/assets';
|
|
17
|
+
* const loaded = await loadSvgSkeleton('<svg xmlns="http://www.w3.org/2000/svg" width="30" height="10"><g id="arm" data-pivot-x="0" data-pivot-y="5"><rect width="30" height="10"/></g></svg>', {
|
|
18
|
+
* skeleton: create([{ name: 'arm', length: 30, origin: { x: 0, y: 5 } }]), resolution: 2,
|
|
19
|
+
* });
|
|
20
|
+
* loaded.sprite.apply({ arm: 45 });
|
|
21
|
+
* loaded.sprite.destroy({ children: true });
|
|
22
|
+
* await releaseSvgParts(loaded.textures);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export async function loadSvgSkeleton(source, options) {
|
|
26
|
+
if (options.mixer && options.mixer.skeleton !== options.skeleton)
|
|
27
|
+
throw new Error('SVG skeleton mixer must use the supplied skeleton');
|
|
28
|
+
const text = await readSvgSource(source);
|
|
29
|
+
const document = new DOMParser().parseFromString(text, 'image/svg+xml');
|
|
30
|
+
const root = document.documentElement;
|
|
31
|
+
if (document.querySelector('parsererror') || root.localName !== 'svg')
|
|
32
|
+
throw new Error('SVG skeleton needs a valid svg root');
|
|
33
|
+
const viewBox = root
|
|
34
|
+
.getAttribute('viewBox')
|
|
35
|
+
?.trim()
|
|
36
|
+
.split(/[\s,]+/)
|
|
37
|
+
.map(Number) ?? [0, 0, Number(root.getAttribute('width')), Number(root.getAttribute('height'))];
|
|
38
|
+
if (viewBox.length !== 4 || !viewBox.every(Number.isFinite) || viewBox[2] <= 0 || viewBox[3] <= 0)
|
|
39
|
+
throw new Error('SVG skeleton needs a finite viewBox or positive numeric width and height');
|
|
40
|
+
const groups = new Map();
|
|
41
|
+
for (const group of root.querySelectorAll('g[id]')) {
|
|
42
|
+
if (groups.has(group.id))
|
|
43
|
+
throw new Error(`duplicate SVG skeleton group ${group.id}`);
|
|
44
|
+
groups.set(group.id, group);
|
|
45
|
+
}
|
|
46
|
+
const rest = new Map(resolve(options.skeleton).map((bone) => [bone.name, bone]));
|
|
47
|
+
const bindings = options.bindings ?? [...groups.keys()].filter((name) => rest.has(name)).map((bone) => ({ bone }));
|
|
48
|
+
if (!bindings.length)
|
|
49
|
+
throw new Error('SVG skeleton found no matching bone groups');
|
|
50
|
+
const selected = new Set(bindings.map((binding) => binding.group ?? binding.bone));
|
|
51
|
+
const bones = new Set();
|
|
52
|
+
const sources = [];
|
|
53
|
+
const serializer = new XMLSerializer();
|
|
54
|
+
for (const binding of bindings) {
|
|
55
|
+
const id = binding.group ?? binding.bone;
|
|
56
|
+
if (bones.has(binding.bone))
|
|
57
|
+
throw new Error(`duplicate SVG binding for bone ${binding.bone}`);
|
|
58
|
+
bones.add(binding.bone);
|
|
59
|
+
const bone = rest.get(binding.bone);
|
|
60
|
+
if (!bone)
|
|
61
|
+
throw new Error(`SVG binding names no bone ${binding.bone}`);
|
|
62
|
+
const group = groups.get(id);
|
|
63
|
+
if (!group)
|
|
64
|
+
throw new Error(`SVG skeleton missing group ${id}`);
|
|
65
|
+
const pivot = binding.pivot ??
|
|
66
|
+
options.pivots?.[id] ?? {
|
|
67
|
+
x: group.hasAttribute('data-pivot-x') ? Number(group.getAttribute('data-pivot-x')) : NaN,
|
|
68
|
+
y: group.hasAttribute('data-pivot-y') ? Number(group.getAttribute('data-pivot-y')) : NaN,
|
|
69
|
+
};
|
|
70
|
+
const rotation = binding.rotation ?? bone.angle;
|
|
71
|
+
if (![pivot.x, pivot.y, rotation].every(Number.isFinite))
|
|
72
|
+
throw new Error(`SVG skeleton group ${id} needs a finite pivot and rest angle`);
|
|
73
|
+
const farX = Math.max(Math.abs(viewBox[0] - pivot.x), Math.abs(viewBox[0] + viewBox[2] - pivot.x));
|
|
74
|
+
const farY = Math.max(Math.abs(viewBox[1] - pivot.y), Math.abs(viewBox[1] + viewBox[3] - pivot.y));
|
|
75
|
+
const radius = Math.ceil(Math.hypot(farX, farY)) + 1;
|
|
76
|
+
const isolated = root.cloneNode(false);
|
|
77
|
+
isolated.setAttribute('viewBox', `${-radius} ${-radius} ${radius * 2} ${radius * 2}`);
|
|
78
|
+
isolated.setAttribute('width', String(radius * 2));
|
|
79
|
+
isolated.setAttribute('height', String(radius * 2));
|
|
80
|
+
for (const shared of root.querySelectorAll('defs, style'))
|
|
81
|
+
isolated.appendChild(shared.cloneNode(true));
|
|
82
|
+
const drawing = group.cloneNode(true);
|
|
83
|
+
for (const descendant of drawing.querySelectorAll('g[id]'))
|
|
84
|
+
if (selected.has(descendant.id))
|
|
85
|
+
descendant.remove();
|
|
86
|
+
let wrapped = drawing;
|
|
87
|
+
for (let ancestor = group.parentElement; ancestor && ancestor !== root; ancestor = ancestor.parentElement) {
|
|
88
|
+
const wrapper = ancestor.cloneNode(false);
|
|
89
|
+
wrapper.appendChild(wrapped);
|
|
90
|
+
wrapped = wrapper;
|
|
91
|
+
}
|
|
92
|
+
const centered = document.createElementNS(root.namespaceURI, 'g');
|
|
93
|
+
centered.setAttribute('id', 'mwg-part');
|
|
94
|
+
centered.setAttribute('transform', `rotate(${-rotation}) translate(${-pivot.x} ${-pivot.y})`);
|
|
95
|
+
centered.appendChild(wrapped);
|
|
96
|
+
isolated.appendChild(centered);
|
|
97
|
+
sources.push({ bone: binding.bone, svg: serializer.serializeToString(isolated) });
|
|
98
|
+
}
|
|
99
|
+
const textures = Object.create(null);
|
|
100
|
+
// All authoring errors above fail before loading textures or allocating display objects.
|
|
101
|
+
for (const part of sources)
|
|
102
|
+
textures[part.bone] = (await loadSvgParts(part.svg, { resolution: options.resolution }))['mwg-part'];
|
|
103
|
+
const sprite = new SkeletalSprite(options.skeleton, options.mixer);
|
|
104
|
+
for (const part of sources) {
|
|
105
|
+
const member = sprite.bind(part.bone, textures[part.bone]);
|
|
106
|
+
member.anchor.set(0.5);
|
|
107
|
+
member.label = part.bone;
|
|
108
|
+
}
|
|
109
|
+
sprite.apply({});
|
|
110
|
+
return { sprite, textures: Object.freeze(textures) };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=SvgSkeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SvgSkeleton.js","sourceRoot":"","sources":["../../../src/two-d/render/SvgSkeleton.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ export type { ChannelSource, ImageModifier, ImageTextureProbe, ParsedImagePath,
|
|
|
6
6
|
export { AnimatedSprite, Animation } from './AnimatedSprite.ts';
|
|
7
7
|
export type { AnimationFrame, AnimationFrameInput, AnimationOptions } from './AnimatedSprite.ts';
|
|
8
8
|
export { SpriteGroup, isOnScreen } from './SpriteGroup.ts';
|
|
9
|
+
export { PinnedDeform, DeformableSprite } from './SpriteDeform.ts';
|
|
10
|
+
export type { DeformPoint, PinnedDeformOptions, DeformableSpriteOptions } from './SpriteDeform.ts';
|
|
9
11
|
export { SkeletalSprite, ArticulatedChain, ChainRig } from './SkeletalSprite.ts';
|
|
10
12
|
export type { ChainOptions } from './SkeletalSprite.ts';
|
|
11
13
|
export type { SpriteGroupMember } from './SpriteGroup.ts';
|
|
@@ -47,6 +49,14 @@ export { StatusVisuals } from './StatusVisuals.ts';
|
|
|
47
49
|
export type { TintTarget, StatusVisualStyle, StatusVisualsOptions } from './StatusVisuals.ts';
|
|
48
50
|
export { SpriteMotion } from './SpriteMotion.ts';
|
|
49
51
|
export type { MotionTarget, MotionHandle, SpriteMotionOptions } from './SpriteMotion.ts';
|
|
52
|
+
export { ClothSprite } from './ClothSprite.ts';
|
|
53
|
+
export type { ClothSpriteOptions } from './ClothSprite.ts';
|
|
54
|
+
export { SpringSprite } from './SpringSprite.ts';
|
|
55
|
+
export type { SpringSpriteOptions } from './SpringSprite.ts';
|
|
56
|
+
export { HazeLayer, hazeField, paintHazePixels } from './HazeLayer.ts';
|
|
57
|
+
export type { HazeLayerOptions, HazePaint } from './HazeLayer.ts';
|
|
58
|
+
export { NeonGlow, glowFalloff, paintGlowPixels } from './NeonGlow.ts';
|
|
59
|
+
export type { NeonGlowOptions, GlowPaint } from './NeonGlow.ts';
|
|
50
60
|
export { blobIndex, autotileFrames, BLOB_SHAPES } from './Autotile.ts';
|
|
51
61
|
export type { NeighborMask } from './Autotile.ts';
|
|
52
62
|
export { RpgmAutotileAtlas, rpgmAutotileFrame, rpgmAutotileSlot, xpAutotileRef, xpAutotilePattern, assertAutotileLayout, autotileCellParts, rpgmTableEdgeCells, RPGM_AUTOTILE_SLOT_BASES, RPGM_AUTOTILE_SLOT_COUNTS, RPGM_FLOOR_AUTOTILE_TABLE, RPGM_WALL_AUTOTILE_TABLE, XP_AUTOTILE_PATTERNS, XP_NEIGHBORS_TO_PATTERN, } from './RpgmAutotile.ts';
|
|
@@ -64,4 +74,6 @@ export { paletteRangeMapping, recolorTexture, remapPixels, withTextureCanvas } f
|
|
|
64
74
|
export type { PaletteMapping, PaletteRange, PaletteRemapMode, RecolorProbe, RemapCanvas, RemapCanvasContext, } from './PaletteRemap.ts';
|
|
65
75
|
export { loadTiledMap } from './TiledMap.ts';
|
|
66
76
|
export type { TiledMapData, TiledTilesetData, TilesetSheet, LoadedTiledMap, TiledObject, TiledLayer, } from './TiledMap.ts';
|
|
77
|
+
export { loadSvgSkeleton } from './SvgSkeleton.ts';
|
|
78
|
+
export type { SvgBoneBinding, SvgSkeletonOptions, LoadedSvgSkeleton } from './SvgSkeleton.ts';
|
|
67
79
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ export { TintedSprite, registerColorTransform } from './TintedSprite.js';
|
|
|
3
3
|
export { applyAllImageModifiers, applyImageModifiers, applyTextureModifiers, blendMatrix, blendPixels, channelScaleMatrix, channelSwapMatrix, colorShiftMatrix, croppedTexture, imageModifier, maskPixels, parseColorPairs, parseImagePath, parsePaletteLists, parseRotateMode, rotatePixels, spriteColorMatrix, } from './ImageModifiers.js';
|
|
4
4
|
export { AnimatedSprite, Animation } from './AnimatedSprite.js';
|
|
5
5
|
export { SpriteGroup, isOnScreen } from './SpriteGroup.js';
|
|
6
|
+
export { PinnedDeform, DeformableSprite } from './SpriteDeform.js';
|
|
6
7
|
export { SkeletalSprite, ArticulatedChain, ChainRig } from './SkeletalSprite.js';
|
|
7
8
|
export { SpriteSheet } from './SpriteSheet.js';
|
|
8
9
|
export { Camera, createCamera, snapZoom } from './Camera.js';
|
|
@@ -24,6 +25,10 @@ export { ScreenEffects } from './ScreenEffects.js';
|
|
|
24
25
|
export { ActorAnimator } from './ActorAnimator.js';
|
|
25
26
|
export { StatusVisuals } from './StatusVisuals.js';
|
|
26
27
|
export { SpriteMotion } from './SpriteMotion.js';
|
|
28
|
+
export { ClothSprite } from './ClothSprite.js';
|
|
29
|
+
export { SpringSprite } from './SpringSprite.js';
|
|
30
|
+
export { HazeLayer, hazeField, paintHazePixels } from './HazeLayer.js';
|
|
31
|
+
export { NeonGlow, glowFalloff, paintGlowPixels } from './NeonGlow.js';
|
|
27
32
|
export { blobIndex, autotileFrames, BLOB_SHAPES } from './Autotile.js';
|
|
28
33
|
export { RpgmAutotileAtlas, rpgmAutotileFrame, rpgmAutotileSlot, xpAutotileRef, xpAutotilePattern, assertAutotileLayout, autotileCellParts, rpgmTableEdgeCells, RPGM_AUTOTILE_SLOT_BASES, RPGM_AUTOTILE_SLOT_COUNTS, RPGM_FLOOR_AUTOTILE_TABLE, RPGM_WALL_AUTOTILE_TABLE, XP_AUTOTILE_PATTERNS, XP_NEIGHBORS_TO_PATTERN, } from './RpgmAutotile.js';
|
|
29
34
|
export { hexRotate, matchTerrainRule, resolveTerrainGraphics, squareRotate } from './TerrainGraphics.js';
|
|
@@ -33,4 +38,5 @@ export { Container2D, Rectangle2D, Texture2D, rectOf } from './Types2D.js';
|
|
|
33
38
|
export { Node2D, Shape2D, Text2D, Sprite2D, TiledSprite, Gradient, createLayers } from './Shape2D.js';
|
|
34
39
|
export { paletteRangeMapping, recolorTexture, remapPixels, withTextureCanvas } from './PaletteRemap.js';
|
|
35
40
|
export { loadTiledMap } from './TiledMap.js';
|
|
41
|
+
export { loadSvgSkeleton } from './SvgSkeleton.js';
|
|
36
42
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG5G,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,UAAU,EACV,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,iBAAiB,GACjB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAG3F,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAWjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGvE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,GACvB,MAAM,mBAAmB,CAAC;AAc3B,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAWzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,EAAE,2BAA2B,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AASnG,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEtG,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAUxG,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAU7C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
* this from `package.json` automatically, chosen because this project's own build already
|
|
10
10
|
* has no step before `tsc`/`vite` that this would need to run ahead of.
|
|
11
11
|
*/
|
|
12
|
-
export declare const version = "0.
|
|
12
|
+
export declare const version = "0.40.0";
|
|
13
13
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
* this from `package.json` automatically, chosen because this project's own build already
|
|
10
10
|
* has no step before `tsc`/`vite` that this would need to run ahead of.
|
|
11
11
|
*/
|
|
12
|
-
export const version = '0.
|
|
12
|
+
export const version = '0.40.0';
|
|
13
13
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datamoc/mw_games",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.40.0",
|
|
4
4
|
"description": "A local-file game framework: renderer-free game logic, drawn through PixiJS in 2D or Babylon.js in 3D, with mobile and desktop packaging.",
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
],
|
|
36
36
|
"bin": {
|
|
37
37
|
"mwg-bench": "tools/benchmark-browser.mjs",
|
|
38
|
+
"mwg-assets": "tools/asset-report.mjs",
|
|
38
39
|
"mwg-audit-adoptions": "tools/audit-adoptions.mjs",
|
|
39
40
|
"mwg-emit": "tools/emit-page.mjs",
|
|
40
41
|
"mwg-extract-rgssad": "tools/extract-rgssad.mjs",
|
|
@@ -58,6 +59,8 @@
|
|
|
58
59
|
"dist",
|
|
59
60
|
"tools/compile-resources.mjs",
|
|
60
61
|
"tools/compile-resources.d.mts",
|
|
62
|
+
"tools/asset-report.mjs",
|
|
63
|
+
"tools/asset-report.d.mts",
|
|
61
64
|
"tools/webp-convert.mjs",
|
|
62
65
|
"tools/webp-convert.d.mts",
|
|
63
66
|
"tools/extract-html.mjs",
|
|
@@ -79,6 +82,8 @@
|
|
|
79
82
|
"tools/sbom.mjs",
|
|
80
83
|
"tools/sbom.d.mts",
|
|
81
84
|
"sbom.cdx.json",
|
|
85
|
+
"data/microgm-opt.sf2",
|
|
86
|
+
"data/microgm-opt.PROVENANCE.md",
|
|
82
87
|
"api-surface.json",
|
|
83
88
|
"tools/single-file.mjs",
|
|
84
89
|
"tools/single-file.d.mts",
|
|
@@ -225,6 +230,7 @@
|
|
|
225
230
|
},
|
|
226
231
|
"./tools/benchmark-browser": "./tools/benchmark-browser.mjs",
|
|
227
232
|
"./tools/audit-adoptions": "./tools/audit-adoptions.mjs",
|
|
233
|
+
"./tools/asset-report": "./tools/asset-report.mjs",
|
|
228
234
|
"./tools/browser-driver": "./tools/browser-driver.mjs",
|
|
229
235
|
"./tools/benchmark-history": "./tools/benchmark-history.mjs",
|
|
230
236
|
"./tools/browser-smoke": "./tools/browser-smoke.mjs",
|
|
@@ -328,6 +334,10 @@
|
|
|
328
334
|
"example:multi-turn-beam:build": "vite build --config examples/multi-turn-beam/vite.config.ts && node tools/emit-page.mjs examples/multi-turn-beam --assets=examples/assets",
|
|
329
335
|
"example:chess": "vite --config examples/chess/vite.config.ts",
|
|
330
336
|
"example:chess:build": "vite build --config examples/chess/vite.config.ts && node tools/emit-page.mjs examples/chess --assets=examples/assets",
|
|
337
|
+
"example:cloth": "vite --config examples/cloth/vite.config.ts",
|
|
338
|
+
"example:cloth:build": "vite build --config examples/cloth/vite.config.ts && node tools/emit-page.mjs examples/cloth --assets=examples/assets",
|
|
339
|
+
"example:spring": "vite --config examples/spring/vite.config.ts",
|
|
340
|
+
"example:spring:build": "vite build --config examples/spring/vite.config.ts && node tools/emit-page.mjs examples/spring --assets=examples/assets",
|
|
331
341
|
"example:tower-defense": "vite --config examples/tower-defense/vite.config.ts",
|
|
332
342
|
"example:tower-defense:build": "vite build --config examples/tower-defense/vite.config.ts && node tools/emit-page.mjs examples/tower-defense --assets=examples/assets",
|
|
333
343
|
"example:3d": "vite --config examples/three-d/vite.config.ts",
|
|
@@ -399,7 +409,6 @@
|
|
|
399
409
|
"@babylonjs/core": "^9.25.0",
|
|
400
410
|
"@babylonjs/loaders": "^9.25.0",
|
|
401
411
|
"@capacitor/core": "^8.5.2",
|
|
402
|
-
"matter-js": "^0.20.0",
|
|
403
412
|
"pixi.js": "^8.20.1",
|
|
404
413
|
"playwright-core": "^1.62.1",
|
|
405
414
|
"ws": "^8.21.3"
|
|
@@ -422,9 +431,6 @@
|
|
|
422
431
|
},
|
|
423
432
|
"ws": {
|
|
424
433
|
"optional": true
|
|
425
|
-
},
|
|
426
|
-
"matter-js": {
|
|
427
|
-
"optional": true
|
|
428
434
|
}
|
|
429
435
|
},
|
|
430
436
|
"devDependencies": {
|
|
@@ -434,10 +440,8 @@
|
|
|
434
440
|
"@capacitor/cli": "^8.5.2",
|
|
435
441
|
"@capacitor/core": "^8.5.2",
|
|
436
442
|
"@capacitor/ios": "^8.5.2",
|
|
437
|
-
"@types/matter-js": "^0.20.2",
|
|
438
443
|
"@types/node": "^26.4.1",
|
|
439
444
|
"@types/ws": "^8.18.1",
|
|
440
|
-
"matter-js": "^0.20.0",
|
|
441
445
|
"multithreading": "^0.3.52",
|
|
442
446
|
"pixi.js": "^8.20.1",
|
|
443
447
|
"playwright-core": "^1.62.1",
|
package/sbom.cdx.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CycloneDX",
|
|
3
3
|
"specVersion": "1.6",
|
|
4
|
-
"serialNumber": "urn:uuid:
|
|
4
|
+
"serialNumber": "urn:uuid:7aef1fa2-ee4d-5ed7-bb1c-aa6ad3a92c78",
|
|
5
5
|
"version": 1,
|
|
6
6
|
"metadata": {
|
|
7
7
|
"tools": {
|
|
@@ -10,16 +10,16 @@
|
|
|
10
10
|
"type": "application",
|
|
11
11
|
"group": "datamoc",
|
|
12
12
|
"name": "tools/sbom.mjs",
|
|
13
|
-
"version": "0.
|
|
13
|
+
"version": "0.40.0"
|
|
14
14
|
}
|
|
15
15
|
]
|
|
16
16
|
},
|
|
17
17
|
"component": {
|
|
18
18
|
"type": "library",
|
|
19
|
-
"bom-ref": "pkg:npm/%40datamoc/mw_games@0.
|
|
19
|
+
"bom-ref": "pkg:npm/%40datamoc/mw_games@0.40.0",
|
|
20
20
|
"name": "@datamoc/mw_games",
|
|
21
|
-
"version": "0.
|
|
22
|
-
"purl": "pkg:npm/%40datamoc/mw_games@0.
|
|
21
|
+
"version": "0.40.0",
|
|
22
|
+
"purl": "pkg:npm/%40datamoc/mw_games@0.40.0",
|
|
23
23
|
"description": "A local-file game framework: renderer-free game logic, drawn through PixiJS in 2D or Babylon.js in 3D, with mobile and desktop packaging.",
|
|
24
24
|
"licenses": [
|
|
25
25
|
{
|
|
@@ -1375,27 +1375,6 @@
|
|
|
1375
1375
|
}
|
|
1376
1376
|
]
|
|
1377
1377
|
},
|
|
1378
|
-
{
|
|
1379
|
-
"type": "library",
|
|
1380
|
-
"bom-ref": "pkg:npm/%40types/matter-js@0.20.2",
|
|
1381
|
-
"name": "@types/matter-js",
|
|
1382
|
-
"version": "0.20.2",
|
|
1383
|
-
"purl": "pkg:npm/%40types/matter-js@0.20.2",
|
|
1384
|
-
"scope": "excluded",
|
|
1385
|
-
"hashes": [
|
|
1386
|
-
{
|
|
1387
|
-
"alg": "SHA-512",
|
|
1388
|
-
"content": "dcf3cacb7431bd9f3d87dfb0741576e3cf08d492d5b3b0c4a4890fbe03bc242d6651d89548edfb648bd572d3930fb848abc3802f6809dee8064ae522a7a0e10b"
|
|
1389
|
-
}
|
|
1390
|
-
],
|
|
1391
|
-
"licenses": [
|
|
1392
|
-
{
|
|
1393
|
-
"license": {
|
|
1394
|
-
"id": "MIT"
|
|
1395
|
-
}
|
|
1396
|
-
}
|
|
1397
|
-
]
|
|
1398
|
-
},
|
|
1399
1378
|
{
|
|
1400
1379
|
"type": "library",
|
|
1401
1380
|
"bom-ref": "pkg:npm/%40types/node@26.6.5",
|
|
@@ -3181,27 +3160,6 @@
|
|
|
3181
3160
|
}
|
|
3182
3161
|
]
|
|
3183
3162
|
},
|
|
3184
|
-
{
|
|
3185
|
-
"type": "library",
|
|
3186
|
-
"bom-ref": "pkg:npm/matter-js@0.20.0",
|
|
3187
|
-
"name": "matter-js",
|
|
3188
|
-
"version": "0.20.0",
|
|
3189
|
-
"purl": "pkg:npm/matter-js@0.20.0",
|
|
3190
|
-
"scope": "excluded",
|
|
3191
|
-
"hashes": [
|
|
3192
|
-
{
|
|
3193
|
-
"alg": "SHA-512",
|
|
3194
|
-
"content": "882f5f611ef3553dc7a69367b05b29f573a841d40ddad5327da2a0e021cb1fc6cdfa3e864f81b0ec81f6acfd2d7e501e6eb1c5c3bdf4451dc3915499457f21c0"
|
|
3195
|
-
}
|
|
3196
|
-
],
|
|
3197
|
-
"licenses": [
|
|
3198
|
-
{
|
|
3199
|
-
"license": {
|
|
3200
|
-
"id": "MIT"
|
|
3201
|
-
}
|
|
3202
|
-
}
|
|
3203
|
-
]
|
|
3204
|
-
},
|
|
3205
3163
|
{
|
|
3206
3164
|
"type": "library",
|
|
3207
3165
|
"bom-ref": "pkg:npm/minimatch@10.2.6",
|
|
@@ -4643,7 +4601,7 @@
|
|
|
4643
4601
|
]
|
|
4644
4602
|
},
|
|
4645
4603
|
{
|
|
4646
|
-
"ref": "pkg:npm/%40datamoc/mw_games@0.
|
|
4604
|
+
"ref": "pkg:npm/%40datamoc/mw_games@0.40.0",
|
|
4647
4605
|
"dependsOn": [
|
|
4648
4606
|
"pkg:npm/%40babylonjs/core@9.30.0",
|
|
4649
4607
|
"pkg:npm/%40babylonjs/loaders@9.30.0",
|
|
@@ -4652,11 +4610,9 @@
|
|
|
4652
4610
|
"pkg:npm/%40capacitor/core@8.5.3",
|
|
4653
4611
|
"pkg:npm/%40capacitor/ios@8.5.3",
|
|
4654
4612
|
"pkg:npm/%40datamoc/pyroeis@0.9.0",
|
|
4655
|
-
"pkg:npm/%40types/matter-js@0.20.2",
|
|
4656
4613
|
"pkg:npm/%40types/node@26.6.5",
|
|
4657
4614
|
"pkg:npm/%40types/ws@8.18.2",
|
|
4658
4615
|
"pkg:npm/json5@2.2.3",
|
|
4659
|
-
"pkg:npm/matter-js@0.20.0",
|
|
4660
4616
|
"pkg:npm/multithreading@0.3.52",
|
|
4661
4617
|
"pkg:npm/pixi.js@8.22.0",
|
|
4662
4618
|
"pkg:npm/playwright-core@1.64.0",
|
|
@@ -4980,10 +4936,6 @@
|
|
|
4980
4936
|
"pkg:npm/%40types/node@26.6.5"
|
|
4981
4937
|
]
|
|
4982
4938
|
},
|
|
4983
|
-
{
|
|
4984
|
-
"ref": "pkg:npm/%40types/matter-js@0.20.2",
|
|
4985
|
-
"dependsOn": []
|
|
4986
|
-
},
|
|
4987
4939
|
{
|
|
4988
4940
|
"ref": "pkg:npm/%40types/node@26.6.5",
|
|
4989
4941
|
"dependsOn": [
|
|
@@ -5385,10 +5337,6 @@
|
|
|
5385
5337
|
"ref": "pkg:npm/lru-cache@11.5.3",
|
|
5386
5338
|
"dependsOn": []
|
|
5387
5339
|
},
|
|
5388
|
-
{
|
|
5389
|
-
"ref": "pkg:npm/matter-js@0.20.0",
|
|
5390
|
-
"dependsOn": []
|
|
5391
|
-
},
|
|
5392
5340
|
{
|
|
5393
5341
|
"ref": "pkg:npm/minimatch@10.2.6",
|
|
5394
5342
|
"dependsOn": [
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface AssetReportFile {
|
|
2
|
+
path: string;
|
|
3
|
+
raw: number;
|
|
4
|
+
gzip: number;
|
|
5
|
+
brotli: number;
|
|
6
|
+
sha256: string;
|
|
7
|
+
/** This file's gzip bytes over the page's total gzip bytes, 0 when the page is empty. */
|
|
8
|
+
share: number;
|
|
9
|
+
}
|
|
10
|
+
export interface AssetReportSource {
|
|
11
|
+
path: string;
|
|
12
|
+
raw: number;
|
|
13
|
+
sha256: string;
|
|
14
|
+
}
|
|
15
|
+
export interface AssetReportTotals {
|
|
16
|
+
files: number;
|
|
17
|
+
raw: number;
|
|
18
|
+
gzip: number;
|
|
19
|
+
brotli: number;
|
|
20
|
+
assetFiles: number;
|
|
21
|
+
assetRaw: number;
|
|
22
|
+
}
|
|
23
|
+
export interface AssetReport {
|
|
24
|
+
dist: string;
|
|
25
|
+
files: AssetReportFile[];
|
|
26
|
+
assets: AssetReportSource[];
|
|
27
|
+
/** Groups of source paths with byte-identical content, sorted; empty when none exist. */
|
|
28
|
+
duplicates: string[][];
|
|
29
|
+
totals: AssetReportTotals;
|
|
30
|
+
}
|
|
31
|
+
export function fingerprint(data: Uint8Array): string;
|
|
32
|
+
export function compressedSizes(data: Uint8Array): { gzip: number; brotli: number };
|
|
33
|
+
export function assetReport(options: {
|
|
34
|
+
dist: string;
|
|
35
|
+
assets?: string;
|
|
36
|
+
mime?: Record<string, string>;
|
|
37
|
+
}): Promise<AssetReport>;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { gzipSync, brotliCompressSync, constants } from 'node:zlib';
|
|
4
|
+
import { realpathSync, statSync } from 'node:fs';
|
|
5
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { join, relative, sep, extname } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { walk, DEFAULT_MIME } from './compile-resources.mjs';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Reports what a built page actually ships, so a game can see where its bytes go.
|
|
12
|
+
*
|
|
13
|
+
* Two halves, both deterministic (sorted paths, fixed compression settings, hashes):
|
|
14
|
+
*
|
|
15
|
+
* - `files`: every file under `dist` (precompressed `.gz`/`.br`/`.xz` siblings
|
|
16
|
+
* excluded - they are derived artifacts, and the gzip/brotli columns already count
|
|
17
|
+
* them) with raw, gzip (level 9) and brotli (quality 11) weights plus its share of
|
|
18
|
+
* the compressed page, the same settings `tools/compress-dist.mjs` writes with;
|
|
19
|
+
* - `assets`: every source file the asset folder embeds (the root `credits.json`
|
|
20
|
+
* and unknown extensions excluded, exactly the files `compileResources` skips),
|
|
21
|
+
* with duplicates grouped by SHA-256 so an asset embedded twice is visible.
|
|
22
|
+
*
|
|
23
|
+
* Shipped as `@datamoc/mw_games/tools/asset-report` (`assetReport(options)`, what the
|
|
24
|
+
* flags below map onto) and as the `mwg-assets` command.
|
|
25
|
+
*
|
|
26
|
+
* usage: mwg-assets <dist folder> [--assets=<dir>] [--json=<report file>]
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const DERIVED_SIBLINGS = new Set(['.gz', '.br', '.xz']);
|
|
30
|
+
|
|
31
|
+
export function fingerprint(data) {
|
|
32
|
+
return createHash('sha256').update(data).digest('hex');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function compressedSizes(data) {
|
|
36
|
+
return {
|
|
37
|
+
gzip: gzipSync(data, { level: 9 }).length,
|
|
38
|
+
brotli: brotliCompressSync(data, { params: { [constants.BROTLI_PARAM_QUALITY]: 11 } }).length,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function isDirectory(path) {
|
|
43
|
+
try {
|
|
44
|
+
return statSync(path).isDirectory();
|
|
45
|
+
} catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param options.dist the built page folder to measure
|
|
52
|
+
* @param options.assets the asset source folder to inventory (skipped when absent)
|
|
53
|
+
* @param options.mime extension to MIME type, merged over the compile defaults, so a
|
|
54
|
+
* game embedding extra types reports the same set the build embeds
|
|
55
|
+
* @returns the sorted files, sources, duplicate groups and totals described above
|
|
56
|
+
*/
|
|
57
|
+
export async function assetReport({ dist, assets, mime = {} } = {}) {
|
|
58
|
+
if (!dist || !isDirectory(dist))
|
|
59
|
+
throw new Error(`assetReport needs the dist folder of a built page, got "${dist}"`);
|
|
60
|
+
if (assets !== undefined && !isDirectory(assets))
|
|
61
|
+
throw new Error(`assetReport needs a readable assets folder, got "${assets}"`);
|
|
62
|
+
|
|
63
|
+
const files = [];
|
|
64
|
+
for await (const file of walk(dist)) {
|
|
65
|
+
if (DERIVED_SIBLINGS.has(extname(file).toLowerCase())) continue;
|
|
66
|
+
const data = await readFile(file);
|
|
67
|
+
const { gzip, brotli } = compressedSizes(data);
|
|
68
|
+
files.push({
|
|
69
|
+
path: relative(dist, file).split(sep).join('/'),
|
|
70
|
+
raw: data.length,
|
|
71
|
+
gzip,
|
|
72
|
+
brotli,
|
|
73
|
+
sha256: fingerprint(data),
|
|
74
|
+
share: 0,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
files.sort((a, b) => (a.path < b.path ? -1 : 1));
|
|
78
|
+
const totalGzip = files.reduce((sum, file) => sum + file.gzip, 0);
|
|
79
|
+
for (const file of files) file.share = totalGzip ? file.gzip / totalGzip : 0;
|
|
80
|
+
|
|
81
|
+
const sources = [];
|
|
82
|
+
const duplicates = [];
|
|
83
|
+
if (assets !== undefined) {
|
|
84
|
+
const types = { ...DEFAULT_MIME, ...mime };
|
|
85
|
+
const creditsFile = join(assets, 'credits.json');
|
|
86
|
+
const byHash = new Map();
|
|
87
|
+
for await (const file of walk(assets)) {
|
|
88
|
+
if (file === creditsFile) continue;
|
|
89
|
+
if (!types[extname(file).toLowerCase()]) continue;
|
|
90
|
+
const data = await readFile(file);
|
|
91
|
+
const sha256 = fingerprint(data);
|
|
92
|
+
const key = relative(assets, file).split(sep).join('/');
|
|
93
|
+
sources.push({ path: key, raw: data.length, sha256 });
|
|
94
|
+
const group = byHash.get(sha256) ?? [];
|
|
95
|
+
group.push(key);
|
|
96
|
+
byHash.set(sha256, group);
|
|
97
|
+
}
|
|
98
|
+
sources.sort((a, b) => (a.path < b.path ? -1 : 1));
|
|
99
|
+
for (const group of byHash.values()) if (group.length > 1) duplicates.push([...group].sort());
|
|
100
|
+
duplicates.sort((a, b) => (a[0] < b[0] ? -1 : 1));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
dist,
|
|
105
|
+
files,
|
|
106
|
+
assets: sources,
|
|
107
|
+
duplicates,
|
|
108
|
+
totals: {
|
|
109
|
+
files: files.length,
|
|
110
|
+
raw: files.reduce((sum, file) => sum + file.raw, 0),
|
|
111
|
+
gzip: totalGzip,
|
|
112
|
+
brotli: files.reduce((sum, file) => sum + file.brotli, 0),
|
|
113
|
+
assetFiles: sources.length,
|
|
114
|
+
assetRaw: sources.reduce((sum, source) => sum + source.raw, 0),
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const kb = (n) => (n / 1024).toFixed(1) + ' KB';
|
|
120
|
+
const percent = (share) => (share * 100).toFixed(1) + '%';
|
|
121
|
+
|
|
122
|
+
async function main(argv) {
|
|
123
|
+
const folder = argv.find((arg) => !arg.startsWith('--'));
|
|
124
|
+
if (!folder) {
|
|
125
|
+
console.error('usage: mwg-assets <dist folder> [--assets=<dir>] [--json=<report file>]');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
const value = (name) => argv.find((a) => a.startsWith(`--${name}=`))?.slice(name.length + 3);
|
|
129
|
+
const report = await assetReport({ dist: folder, assets: value('assets') });
|
|
130
|
+
|
|
131
|
+
console.log(`\n ${report.dist}`);
|
|
132
|
+
for (const file of report.files) {
|
|
133
|
+
console.log(
|
|
134
|
+
` ${file.path.padEnd(40)}${kb(file.raw).padStart(10)} gz ${kb(file.gzip).padStart(10)} br ${kb(file.brotli).padStart(10)} ${percent(file.share).padStart(6)}`,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
console.log(
|
|
138
|
+
` ${report.totals.files} file(s), ${kb(report.totals.raw)} raw -> ${kb(report.totals.gzip)} gz / ${kb(report.totals.brotli)} br`,
|
|
139
|
+
);
|
|
140
|
+
if (report.assets.length) {
|
|
141
|
+
console.log(` ${report.totals.assetFiles} embedded asset(s), ${kb(report.totals.assetRaw)} raw`);
|
|
142
|
+
for (const group of report.duplicates) console.log(` duplicate: ${group.join(' == ')}`);
|
|
143
|
+
}
|
|
144
|
+
const json = value('json');
|
|
145
|
+
if (json) {
|
|
146
|
+
await writeFile(json, JSON.stringify(report, null, 2) + '\n', 'utf8');
|
|
147
|
+
console.log(` report written to ${json}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
//realpath, since an npm `bin` shim reaches this file through a symlink
|
|
152
|
+
//no top-level await: a vite config loaded as CommonJS has to be able to require() this module
|
|
153
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === fileURLToPath(import.meta.url))
|
|
154
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
155
|
+
console.error(error);
|
|
156
|
+
process.exitCode = 1;
|
|
157
|
+
});
|