@datamoc/mw_games 0.38.0 → 0.39.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.
Files changed (90) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/api-surface.json +500 -2
  3. package/dist/assets/SvgParts.d.ts +31 -0
  4. package/dist/assets/SvgParts.d.ts.map +1 -0
  5. package/dist/assets/SvgParts.js +54 -0
  6. package/dist/assets/SvgParts.js.map +1 -0
  7. package/dist/assets/SvgSource.d.ts +3 -0
  8. package/dist/assets/SvgSource.d.ts.map +1 -0
  9. package/dist/assets/SvgSource.js +22 -0
  10. package/dist/assets/SvgSource.js.map +1 -0
  11. package/dist/assets/index.d.ts +2 -0
  12. package/dist/assets/index.d.ts.map +1 -1
  13. package/dist/assets/index.js +1 -0
  14. package/dist/assets/index.js.map +1 -1
  15. package/dist/assets/svg.d.ts.map +1 -1
  16. package/dist/assets/svg.js +9 -5
  17. package/dist/assets/svg.js.map +1 -1
  18. package/dist/mw_games.global.js +110 -110
  19. package/dist/mwl/presentation.d.ts.map +1 -1
  20. package/dist/mwl/presentation.js +25 -18
  21. package/dist/mwl/presentation.js.map +1 -1
  22. package/dist/physics/PhysicsWorld.d.ts +49 -17
  23. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  24. package/dist/physics/PhysicsWorld.js +297 -59
  25. package/dist/physics/PhysicsWorld.js.map +1 -1
  26. package/dist/physics/XpbdWorld.d.ts +1 -1
  27. package/dist/physics/XpbdWorld.js +1 -1
  28. package/dist/physics/cloth/index.d.ts +98 -0
  29. package/dist/physics/cloth/index.d.ts.map +1 -0
  30. package/dist/physics/cloth/index.js +207 -0
  31. package/dist/physics/cloth/index.js.map +1 -0
  32. package/dist/physics/index.d.ts +4 -0
  33. package/dist/physics/index.d.ts.map +1 -1
  34. package/dist/physics/index.js +2 -0
  35. package/dist/physics/index.js.map +1 -1
  36. package/dist/physics/spring/index.d.ts +90 -0
  37. package/dist/physics/spring/index.d.ts.map +1 -0
  38. package/dist/physics/spring/index.js +97 -0
  39. package/dist/physics/spring/index.js.map +1 -0
  40. package/dist/skeleton/index.d.ts +94 -13
  41. package/dist/skeleton/index.d.ts.map +1 -1
  42. package/dist/skeleton/index.js +192 -73
  43. package/dist/skeleton/index.js.map +1 -1
  44. package/dist/two-d/presentation/MwlPresentation.d.ts +12 -0
  45. package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -1
  46. package/dist/two-d/presentation/MwlPresentation.js +204 -153
  47. package/dist/two-d/presentation/MwlPresentation.js.map +1 -1
  48. package/dist/two-d/render/ClothSprite.d.ts +83 -0
  49. package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
  50. package/dist/two-d/render/ClothSprite.js +105 -0
  51. package/dist/two-d/render/ClothSprite.js.map +1 -0
  52. package/dist/two-d/render/HazeLayer.d.ts +112 -0
  53. package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
  54. package/dist/two-d/render/HazeLayer.js +185 -0
  55. package/dist/two-d/render/HazeLayer.js.map +1 -0
  56. package/dist/two-d/render/NeonGlow.d.ts +100 -0
  57. package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
  58. package/dist/two-d/render/NeonGlow.js +183 -0
  59. package/dist/two-d/render/NeonGlow.js.map +1 -0
  60. package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
  61. package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
  62. package/dist/two-d/render/SkeletalSprite.js +27 -3
  63. package/dist/two-d/render/SkeletalSprite.js.map +1 -1
  64. package/dist/two-d/render/SpringSprite.d.ts +40 -0
  65. package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
  66. package/dist/two-d/render/SpringSprite.js +39 -0
  67. package/dist/two-d/render/SpringSprite.js.map +1 -0
  68. package/dist/two-d/render/SpriteDeform.d.ts +156 -0
  69. package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
  70. package/dist/two-d/render/SpriteDeform.js +278 -0
  71. package/dist/two-d/render/SpriteDeform.js.map +1 -0
  72. package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
  73. package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
  74. package/dist/two-d/render/SvgSkeleton.js +112 -0
  75. package/dist/two-d/render/SvgSkeleton.js.map +1 -0
  76. package/dist/two-d/render/index.d.ts +12 -0
  77. package/dist/two-d/render/index.d.ts.map +1 -1
  78. package/dist/two-d/render/index.js +6 -0
  79. package/dist/two-d/render/index.js.map +1 -1
  80. package/dist/version.d.ts +1 -1
  81. package/dist/version.js +1 -1
  82. package/package.json +9 -7
  83. package/sbom.cdx.json +6 -58
  84. package/tools/asset-report.d.mts +37 -0
  85. package/tools/asset-report.mjs +157 -0
  86. package/tools/compile-resources.d.mts +2 -0
  87. package/tools/compile-resources.mjs +23 -2
  88. package/tools/emit-page.d.mts +2 -0
  89. package/tools/emit-page.mjs +11 -1
  90. package/tools/vite.mjs +4 -1
@@ -58,6 +58,9 @@ export async function* walk(dir) {
58
58
  * @param options.from folder holding the assets
59
59
  * @param options.to folder to write the generated scripts into
60
60
  * @param options.mime extension to MIME type, merged over the defaults
61
+ * @param options.assetFiles exact paths relative to `from` to embed; omit for all, [] for none.
62
+ * Unknown paths and explicitly selected unsupported formats fail before replacing output.
63
+ * credits.json is converted to CREDITS.txt only when selected (or when no list is given).
61
64
  * @param options.groupBy how to name the script an asset lands in; defaults to its top folder
62
65
  * @param options.toWebp convert `.png`/`.jpg`/`.jpeg` assets to WebP before embedding
63
66
  * (default false - see `tools/webp-convert.mjs`). The asset's *key* never changes (a game
@@ -81,6 +84,7 @@ export async function compileResources({
81
84
  to,
82
85
  mime = {},
83
86
  groupBy,
87
+ assetFiles,
84
88
  toWebp: convertToWebp = false,
85
89
  webpLossless = true,
86
90
  webpQuality = 90,
@@ -90,6 +94,22 @@ export async function compileResources({
90
94
  const types = { ...DEFAULT_MIME, ...mime };
91
95
  const group = groupBy ?? ((key) => (key.includes('/') ? key.slice(0, key.indexOf('/')) : 'assets'));
92
96
 
97
+ const files = [];
98
+ for await (const file of walk(from)) files.push(file);
99
+ const keyOf = (file) => relative(from, file).split(sep).join('/');
100
+ const selected =
101
+ assetFiles === undefined
102
+ ? undefined
103
+ : new Set(assetFiles.map((key) => key.replaceAll('\\', '/').replace(/^\.\//, '')));
104
+ if (selected) {
105
+ const known = new Set(files.map(keyOf));
106
+ for (const key of selected) {
107
+ if (!known.has(key)) throw new Error(`unknown asset file ${key}`);
108
+ if (key !== 'credits.json' && !types[extname(key).toLowerCase()])
109
+ throw new Error(`unsupported asset file ${key}`);
110
+ }
111
+ }
112
+
93
113
  await rm(to, { recursive: true, force: true });
94
114
  await mkdir(to, { recursive: true });
95
115
 
@@ -106,7 +126,8 @@ export async function compileResources({
106
126
  const creditsFile = join(from, 'credits.json');
107
127
  let credits = null;
108
128
 
109
- for await (const file of walk(from)) {
129
+ for (const file of files) {
130
+ if (selected && !selected.has(keyOf(file))) continue;
110
131
  if (file === creditsFile) {
111
132
  credits = creditsText(JSON.parse(await readFile(file, 'utf8')));
112
133
  continue;
@@ -118,7 +139,7 @@ export async function compileResources({
118
139
  continue;
119
140
  }
120
141
 
121
- const key = relative(from, file).split(sep).join('/');
142
+ const key = keyOf(file);
122
143
  const data = await readFile(file);
123
144
 
124
145
  let mimeType = type;
@@ -9,6 +9,8 @@ export interface EmitPageOptions {
9
9
  assets?: string;
10
10
  /** maps an asset path to its script's name; defaults to one script per top-level folder */
11
11
  groupBy?: (key: string) => string;
12
+ /** Exact paths relative to the asset folder to embed. Omit to include all; [] includes none. Unknown entries fail by name. */
13
+ assetFiles?: readonly string[];
12
14
  /** write `.gz`/`.br` siblings for a server to negotiate; default true */
13
15
  compress?: boolean;
14
16
  /** also write `.xz`, where the system `xz` binary exists */
@@ -66,6 +66,7 @@ export async function emitPage({
66
66
  dist,
67
67
  assets,
68
68
  groupBy,
69
+ assetFiles,
69
70
  compress = true,
70
71
  xz = false,
71
72
  singleFile = false,
@@ -75,8 +76,17 @@ export async function emitPage({
75
76
  csp = true,
76
77
  }) {
77
78
  if (!dist) throw new Error('emitPage needs the dist folder of a vite build');
79
+ if (!assets && assetFiles?.length) throw new Error(`unknown asset file ${assetFiles[0]}: no assets folder`);
78
80
  const compiled = assets
79
- ? await compileResources({ from: assets, to: join(dist, 'assets'), groupBy, toWebp, webpLossless, webpQuality })
81
+ ? await compileResources({
82
+ from: assets,
83
+ to: join(dist, 'assets'),
84
+ groupBy,
85
+ assetFiles,
86
+ toWebp,
87
+ webpLossless,
88
+ webpQuality,
89
+ })
80
90
  : { groups: [], rawBytes: 0, embeddedBytes: 0, webpConverted: 0 };
81
91
 
82
92
  const html = await readFile(join(dist, 'index.html'), 'utf8');
package/tools/vite.mjs CHANGED
@@ -11,7 +11,10 @@ import { buildArtifactSbom, serialize, shippedFiles } from './sbom.mjs';
11
11
  * It sets the configuration that target needs (a classic IIFE bundle named `game.js`, relative
12
12
  * urls through `base: './'`, no inlined or copied assets since they are compiled instead) and
13
13
  * serves `assets` (default `'assets'`, `false` for none) as the public folder, so an asset path reads the same in `vite` dev as in the
14
- * build. At the end of the build it runs `emitPage` over the output folder with the same
14
+ * build. `assetFiles: ['characters/hero.svg', 'music/theme.ogg']` embeds only those paths;
15
+ * omit it for all assets, or pass [] for none. An unknown entry fails by name. Filtering
16
+ * affects the build only, so the dev server still serves the asset folder normally.
17
+ * At the end of the build it runs `emitPage` over the output folder with the same
15
18
  * options. A setting the game's own config gives explicitly still wins, since vite merges a
16
19
  * plugin's `config` result under the user's.
17
20
  *