@oidoid/void 0.1.0-4 → 0.1.0-7

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 (307) hide show
  1. package/dist/meta.json +1 -0
  2. package/dist/package.json +66 -0
  3. package/dist/public/favicon/favicon16.png +0 -0
  4. package/dist/public/favicon/favicon16.webp +0 -0
  5. package/dist/public/favicon/favicon192.png +0 -0
  6. package/dist/public/favicon/favicon192.webp +0 -0
  7. package/dist/public/favicon/favicon32.png +0 -0
  8. package/dist/public/favicon/favicon32.webp +0 -0
  9. package/dist/public/favicon/favicon48.png +0 -0
  10. package/dist/public/favicon/favicon48.webp +0 -0
  11. package/dist/public/favicon/favicon64.png +0 -0
  12. package/dist/public/favicon/favicon64.webp +0 -0
  13. package/dist/public/index.js +98 -0
  14. package/dist/public/index.js.map +7 -0
  15. package/dist/public/preload-atlas.png +0 -0
  16. package/dist/public/preload-atlas.webp +0 -0
  17. package/dist/public/void-v0.1.0-6+20251020.7cdf98d.html +111 -0
  18. package/dist/public/void-v0.1.0-6+20251020.e4e9eef.html +111 -0
  19. package/dist/public/void-v0.1.0-7+20251021.7cdf98d.html +111 -0
  20. package/dist/schema/config-file.d.ts +32 -0
  21. package/dist/schema/config-file.js +41 -0
  22. package/dist/schema/config-file.js.map +1 -0
  23. package/dist/schema/config-file.v0.json +68 -0
  24. package/dist/src/audio.d.ts +7 -0
  25. package/dist/src/audio.js +25 -0
  26. package/dist/src/audio.js.map +1 -0
  27. package/dist/src/demo/assets/manifest.json +41 -0
  28. package/dist/src/demo/assets/preload-atlas.json +193 -0
  29. package/dist/src/demo/ents/clock-ent.d.ts +11 -0
  30. package/dist/src/demo/ents/clock-ent.js +26 -0
  31. package/dist/src/demo/ents/clock-ent.js.map +1 -0
  32. package/dist/src/demo/ents/render-toggle-ent.d.ts +12 -0
  33. package/dist/src/demo/ents/render-toggle-ent.js +41 -0
  34. package/dist/src/demo/ents/render-toggle-ent.js.map +1 -0
  35. package/dist/src/demo/ents/work-counter-ent.d.ts +10 -0
  36. package/dist/src/demo/ents/work-counter-ent.js +20 -0
  37. package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
  38. package/dist/src/demo/game.d.ts +12 -0
  39. package/dist/src/demo/game.js +135 -0
  40. package/dist/src/demo/game.js.map +1 -0
  41. package/dist/src/demo/index.d.ts +1 -0
  42. package/dist/src/demo/index.js +8 -0
  43. package/dist/src/demo/index.js.map +1 -0
  44. package/dist/src/demo/tsconfig.json +15 -0
  45. package/dist/src/demo/types/tag.d.ts +2 -0
  46. package/dist/src/demo/types/tag.js +2 -0
  47. package/dist/src/demo/types/tag.js.map +1 -0
  48. package/dist/src/demo/void.json +11 -0
  49. package/dist/src/ents/button-ent.d.ts +39 -0
  50. package/dist/src/ents/button-ent.js +128 -0
  51. package/dist/src/ents/button-ent.js.map +1 -0
  52. package/dist/src/ents/cursor-ent.d.ts +18 -0
  53. package/dist/src/ents/cursor-ent.js +63 -0
  54. package/dist/src/ents/cursor-ent.js.map +1 -0
  55. package/dist/src/ents/ent.d.ts +7 -0
  56. package/dist/src/ents/ent.js +2 -0
  57. package/dist/src/ents/ent.js.map +1 -0
  58. package/dist/src/ents/follow-cam-ent.d.ts +25 -0
  59. package/dist/src/ents/follow-cam-ent.js +87 -0
  60. package/dist/src/ents/follow-cam-ent.js.map +1 -0
  61. package/dist/src/ents/nine-patch-ent.d.ts +43 -0
  62. package/dist/src/ents/nine-patch-ent.js +143 -0
  63. package/dist/src/ents/nine-patch-ent.js.map +1 -0
  64. package/dist/src/ents/text-ent.d.ts +23 -0
  65. package/dist/src/ents/text-ent.js +109 -0
  66. package/dist/src/ents/text-ent.js.map +1 -0
  67. package/dist/src/ents/zoo.d.ts +17 -0
  68. package/dist/src/ents/zoo.js +45 -0
  69. package/dist/src/ents/zoo.js.map +1 -0
  70. package/dist/src/graphics/atlas-parser.d.ts +4 -0
  71. package/dist/src/graphics/atlas-parser.js +27 -0
  72. package/dist/src/graphics/atlas-parser.js.map +1 -0
  73. package/dist/src/graphics/atlas.d.ts +49 -0
  74. package/dist/src/graphics/atlas.js +7 -0
  75. package/dist/src/graphics/atlas.js.map +1 -0
  76. package/dist/src/graphics/cam.d.ts +89 -0
  77. package/dist/src/graphics/cam.js +220 -0
  78. package/dist/src/graphics/cam.js.map +1 -0
  79. package/dist/src/graphics/gl.d.ts +24 -0
  80. package/dist/src/graphics/gl.js +70 -0
  81. package/dist/src/graphics/gl.js.map +1 -0
  82. package/dist/src/graphics/layer.d.ts +21 -0
  83. package/dist/src/graphics/layer.js +23 -0
  84. package/dist/src/graphics/layer.js.map +1 -0
  85. package/dist/src/graphics/renderer.d.ts +36 -0
  86. package/dist/src/graphics/renderer.js +180 -0
  87. package/dist/src/graphics/renderer.js.map +1 -0
  88. package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
  89. package/dist/src/graphics/sprite-frag.glsl.js +35 -0
  90. package/dist/src/graphics/sprite-frag.glsl.js.map +1 -0
  91. package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
  92. package/dist/src/graphics/sprite-vert.glsl.js +68 -0
  93. package/dist/src/graphics/sprite-vert.glsl.js.map +1 -0
  94. package/dist/src/graphics/sprite.d.ts +108 -0
  95. package/dist/src/graphics/sprite.js +301 -0
  96. package/dist/src/graphics/sprite.js.map +1 -0
  97. package/dist/src/index.d.ts +30 -0
  98. package/dist/src/index.js +33 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/input/context-menu.d.ts +8 -0
  101. package/dist/src/input/context-menu.js +25 -0
  102. package/dist/src/input/context-menu.js.map +1 -0
  103. package/dist/src/input/gamepad.d.ts +18 -0
  104. package/dist/src/input/gamepad.js +49 -0
  105. package/dist/src/input/gamepad.js.map +1 -0
  106. package/dist/src/input/input.d.ts +148 -0
  107. package/dist/src/input/input.js +383 -0
  108. package/dist/src/input/input.js.map +1 -0
  109. package/dist/src/input/keyboard.d.ts +17 -0
  110. package/dist/src/input/keyboard.js +46 -0
  111. package/dist/src/input/keyboard.js.map +1 -0
  112. package/dist/src/input/pointer.d.ts +53 -0
  113. package/dist/src/input/pointer.js +162 -0
  114. package/dist/src/input/pointer.js.map +1 -0
  115. package/dist/src/input/wheel.d.ts +12 -0
  116. package/dist/src/input/wheel.js +30 -0
  117. package/dist/src/input/wheel.js.map +1 -0
  118. package/dist/src/looper.d.ts +17 -0
  119. package/dist/src/looper.js +51 -0
  120. package/dist/src/looper.js.map +1 -0
  121. package/dist/src/mem/pool.d.ts +31 -0
  122. package/dist/src/mem/pool.js +98 -0
  123. package/dist/src/mem/pool.js.map +1 -0
  124. package/dist/src/random/random.d.ts +8 -0
  125. package/dist/src/random/random.js +23 -0
  126. package/dist/src/random/random.js.map +1 -0
  127. package/dist/src/storage/local-storage.d.ts +3 -0
  128. package/dist/src/storage/local-storage.js +11 -0
  129. package/dist/src/storage/local-storage.js.map +1 -0
  130. package/dist/src/text/font.d.ts +6 -0
  131. package/dist/src/text/font.js +20 -0
  132. package/dist/src/text/font.js.map +1 -0
  133. package/dist/src/text/mem-prop-5x6.json +573 -0
  134. package/dist/src/text/text-layout.d.ts +19 -0
  135. package/dist/src/text/text-layout.js +85 -0
  136. package/dist/src/text/text-layout.js.map +1 -0
  137. package/dist/src/tsconfig.json +15 -0
  138. package/dist/src/types/geo.d.ts +38 -0
  139. package/dist/src/types/geo.js +61 -0
  140. package/dist/src/types/geo.js.map +1 -0
  141. package/dist/src/types/json.d.ts +31 -0
  142. package/dist/src/types/json.js +2 -0
  143. package/dist/src/types/json.js.map +1 -0
  144. package/dist/src/types/time.d.ts +19 -0
  145. package/dist/src/types/time.js +10 -0
  146. package/dist/src/types/time.js.map +1 -0
  147. package/dist/src/types/void-version.d.ts +7 -0
  148. package/dist/src/types/void-version.js +2 -0
  149. package/dist/src/types/void-version.js.map +1 -0
  150. package/dist/src/utils/async-util.d.ts +11 -0
  151. package/dist/src/utils/async-util.js +36 -0
  152. package/dist/src/utils/async-util.js.map +1 -0
  153. package/dist/src/utils/canvas-util.d.ts +7 -0
  154. package/dist/src/utils/canvas-util.js +128 -0
  155. package/dist/src/utils/canvas-util.js.map +1 -0
  156. package/dist/src/utils/color-util.d.ts +1 -0
  157. package/dist/src/utils/color-util.js +4 -0
  158. package/dist/src/utils/color-util.js.map +1 -0
  159. package/dist/src/utils/debug.d.ts +19 -0
  160. package/dist/src/utils/debug.js +35 -0
  161. package/dist/src/utils/debug.js.map +1 -0
  162. package/dist/src/utils/delay-interval.d.ts +7 -0
  163. package/dist/src/utils/delay-interval.js +29 -0
  164. package/dist/src/utils/delay-interval.js.map +1 -0
  165. package/dist/src/utils/dom-util.d.ts +3 -0
  166. package/dist/src/utils/dom-util.js +29 -0
  167. package/dist/src/utils/dom-util.js.map +1 -0
  168. package/dist/src/utils/fetch-util.d.ts +3 -0
  169. package/dist/src/utils/fetch-util.js +24 -0
  170. package/dist/src/utils/fetch-util.js.map +1 -0
  171. package/dist/src/utils/math.d.ts +6 -0
  172. package/dist/src/utils/math.js +18 -0
  173. package/dist/src/utils/math.js.map +1 -0
  174. package/dist/src/utils/vibrate.d.ts +1 -0
  175. package/dist/src/utils/vibrate.js +4 -0
  176. package/dist/src/utils/vibrate.js.map +1 -0
  177. package/dist/src/void.d.ts +48 -0
  178. package/dist/src/void.js +102 -0
  179. package/dist/src/void.js.map +1 -0
  180. package/dist/tools/atlas-pack/aseprite.d.ts +58 -0
  181. package/dist/tools/atlas-pack/aseprite.js +16 -0
  182. package/dist/tools/atlas-pack/aseprite.js.map +1 -0
  183. package/dist/tools/atlas-pack/atlas-json-parser.d.ts +21 -0
  184. package/dist/tools/atlas-pack/atlas-json-parser.js +116 -0
  185. package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -0
  186. package/dist/tools/atlas-pack/atlas-pack.d.ts +2 -0
  187. package/dist/tools/atlas-pack/atlas-pack.js +22 -0
  188. package/dist/tools/atlas-pack/atlas-pack.js.map +1 -0
  189. package/dist/tools/bundle/bundle.d.ts +3 -0
  190. package/dist/tools/bundle/bundle.js +48 -0
  191. package/dist/tools/bundle/bundle.js.map +1 -0
  192. package/dist/tools/bundle/html-plugin.d.ts +3 -0
  193. package/dist/tools/bundle/html-plugin.js +90 -0
  194. package/dist/tools/bundle/html-plugin.js.map +1 -0
  195. package/dist/tools/tsconfig-base.json +48 -0
  196. package/dist/tools/tsconfig.json +19 -0
  197. package/dist/tools/types/config.d.ts +27 -0
  198. package/dist/tools/types/config.js +31 -0
  199. package/dist/tools/types/config.js.map +1 -0
  200. package/dist/tools/types/package-json.d.ts +4 -0
  201. package/dist/tools/types/package-json.js +2 -0
  202. package/dist/tools/types/package-json.js.map +1 -0
  203. package/dist/tools/utils/argv.d.ts +12 -0
  204. package/dist/tools/utils/argv.js +19 -0
  205. package/dist/tools/utils/argv.js.map +1 -0
  206. package/dist/tools/utils/exec.d.ts +3 -0
  207. package/dist/tools/utils/exec.js +15 -0
  208. package/dist/tools/utils/exec.js.map +1 -0
  209. package/dist/tools/utils/file-util.d.ts +1 -0
  210. package/dist/tools/utils/file-util.js +13 -0
  211. package/dist/tools/utils/file-util.js.map +1 -0
  212. package/dist/tools/utils/html-parser.d.ts +1 -0
  213. package/dist/tools/utils/html-parser.js +10 -0
  214. package/dist/tools/utils/html-parser.js.map +1 -0
  215. package/dist/tools/void.d.ts +15 -0
  216. package/dist/tools/void.js +31 -0
  217. package/dist/tools/void.js.map +1 -0
  218. package/package.json +31 -41
  219. package/readme.md +1 -1
  220. package/schema/config-file.test.ts +55 -0
  221. package/schema/config-file.ts +69 -0
  222. package/schema/config-file.v0.json +68 -0
  223. package/tools/atlas-pack/aseprite.ts +60 -0
  224. package/tools/atlas-pack/atlas-json-parser.test.ts +780 -0
  225. package/tools/atlas-pack/atlas-json-parser.ts +159 -0
  226. package/tools/atlas-pack/atlas-pack.ts +51 -0
  227. package/tools/bundle/bundle.ts +64 -0
  228. package/tools/bundle/html-plugin.ts +135 -0
  229. package/tools/types/config.ts +65 -0
  230. package/tools/types/package-json.ts +4 -0
  231. package/tools/utils/argv.test.ts +41 -0
  232. package/tools/utils/argv.ts +29 -0
  233. package/tools/utils/exec.ts +22 -0
  234. package/tools/utils/file-util.ts +11 -0
  235. package/tools/utils/html-parser.ts +9 -0
  236. package/tools/void.ts +55 -0
  237. package/dist/atlas/anim.d.ts +0 -30
  238. package/dist/atlas/anim.js +0 -16
  239. package/dist/atlas/anim.js.map +0 -1
  240. package/dist/atlas/aseprite.d.ts +0 -37
  241. package/dist/atlas/aseprite.js +0 -2
  242. package/dist/atlas/aseprite.js.map +0 -1
  243. package/dist/atlas/atlas-parser.d.ts +0 -52
  244. package/dist/atlas/atlas-parser.js +0 -109
  245. package/dist/atlas/atlas-parser.js.map +0 -1
  246. package/dist/atlas/atlas.d.ts +0 -4
  247. package/dist/atlas/atlas.js +0 -2
  248. package/dist/atlas/atlas.js.map +0 -1
  249. package/dist/audio/synth.d.ts +0 -4
  250. package/dist/audio/synth.js +0 -21
  251. package/dist/audio/synth.js.map +0 -1
  252. package/dist/graphics/bitmap.d.ts +0 -14
  253. package/dist/graphics/bitmap.js +0 -14
  254. package/dist/graphics/bitmap.js.map +0 -1
  255. package/dist/graphics/cam.d.ts +0 -16
  256. package/dist/graphics/cam.js +0 -42
  257. package/dist/graphics/cam.js.map +0 -1
  258. package/dist/graphics/frag.glsl.d.ts +0 -1
  259. package/dist/graphics/frag.glsl.js +0 -15
  260. package/dist/graphics/frag.glsl.js.map +0 -1
  261. package/dist/graphics/frame-listener.d.ts +0 -16
  262. package/dist/graphics/frame-listener.js +0 -83
  263. package/dist/graphics/frame-listener.js.map +0 -1
  264. package/dist/graphics/renderer.d.ts +0 -12
  265. package/dist/graphics/renderer.js +0 -184
  266. package/dist/graphics/renderer.js.map +0 -1
  267. package/dist/graphics/vert.glsl.d.ts +0 -1
  268. package/dist/graphics/vert.glsl.js +0 -46
  269. package/dist/graphics/vert.glsl.js.map +0 -1
  270. package/dist/index.d.ts +0 -31
  271. package/dist/index.js +0 -79
  272. package/dist/index.js.map +0 -1
  273. package/dist/input/gamepad-poller.d.ts +0 -8
  274. package/dist/input/gamepad-poller.js +0 -38
  275. package/dist/input/gamepad-poller.js.map +0 -1
  276. package/dist/input/input.d.ts +0 -44
  277. package/dist/input/input.js +0 -175
  278. package/dist/input/input.js.map +0 -1
  279. package/dist/input/keyboard-poller.d.ts +0 -7
  280. package/dist/input/keyboard-poller.js +0 -30
  281. package/dist/input/keyboard-poller.js.map +0 -1
  282. package/dist/input/pointer-poller.d.ts +0 -12
  283. package/dist/input/pointer-poller.js +0 -67
  284. package/dist/input/pointer-poller.js.map +0 -1
  285. package/dist/sprite/sprite.d.ts +0 -51
  286. package/dist/sprite/sprite.js +0 -161
  287. package/dist/sprite/sprite.js.map +0 -1
  288. package/dist/storage/json-storage.d.ts +0 -4
  289. package/dist/storage/json-storage.js +0 -13
  290. package/dist/storage/json-storage.js.map +0 -1
  291. package/dist/test/tsconfig.json +0 -14
  292. package/dist/text/font.d.ts +0 -6
  293. package/dist/text/font.js +0 -18
  294. package/dist/text/font.js.map +0 -1
  295. package/dist/text/text-layout.d.ts +0 -11
  296. package/dist/text/text-layout.js +0 -73
  297. package/dist/text/text-layout.js.map +0 -1
  298. package/dist/tsconfig.json +0 -13
  299. package/dist/types/2d.d.ts +0 -9
  300. package/dist/types/2d.js +0 -2
  301. package/dist/types/2d.js.map +0 -1
  302. package/dist/void.js +0 -60
  303. package/dist/void.js.map +0 -7
  304. package/dist/void.meta.json +0 -289
  305. package/src/atlas/anim.js +0 -17
  306. package/tools/atlas-parser.js +0 -120
  307. package/tools/void.js +0 -143
@@ -1,120 +0,0 @@
1
- /** @typedef {import('./aseprite.js').Aseprite} Aseprite */
2
- /** @typedef {import('./aseprite.js').AsepriteAnimTagFrame} AsepriteAnimTagFrame */
3
- /** @typedef {import('./aseprite.js').AsepriteFrame} AsepriteFrame */
4
- /** @typedef {import('./aseprite.js').AsepriteFrameMap} AsepriteFrameMap */
5
- /** @typedef {import('./aseprite.js').AsepriteSlice} AsepriteSlice */
6
- /** @typedef {import('./aseprite.js').AsepriteTagSpan} AsepriteTagSpan */
7
- /** @typedef {import('../src/atlas/anim.js').Anim<AnimTag>} Anim */
8
- /** @typedef {import('../src/atlas/anim.js').AnimTag} AnimTag */
9
- /** @typedef {import('../src/atlas/atlas.js').Atlas} Atlas */
10
- /** @typedef {import('../src/types/2d.js').Box} Box */
11
- /** @typedef {import('../src/types/2d.js').WH} WH */
12
- /** @typedef {import('../src/types/2d.js').XY} XY */
13
- import {maxAnimCels} from '../src/atlas/anim.js'
14
-
15
- /**
16
- * @arg {Aseprite} ase
17
- * @return {Atlas}
18
- */
19
- export function parseAtlas(ase) {
20
- const atlas = new Map()
21
- for (const span of ase.meta.frameTags) {
22
- const tag = parseTag(span.name)
23
- if (atlas.has(tag)) throw Error(`duplicate tag "${tag}" in atlas`)
24
- const id = atlas.size * maxAnimCels
25
- atlas.set(tag, parseAnim(id, span, ase.frames, ase.meta.slices))
26
- }
27
-
28
- const extraSlices = ase.meta.slices.filter(
29
- slice => !atlas.has(parseTag(slice.name))
30
- )
31
- if (extraSlices.length)
32
- throw Error(
33
- `unknown hitbox tags in atlas: ${extraSlices.map(slice => slice.name).join(', ')}`
34
- )
35
-
36
- return Object.fromEntries(atlas)
37
- }
38
-
39
- /**
40
- * @arg {number} id
41
- * @arg {AsepriteTagSpan} span
42
- * @arg {AsepriteFrameMap} map
43
- * @arg {readonly AsepriteSlice[]} slices
44
- * @return {Anim}
45
- * @internal
46
- */
47
- export function parseAnim(id, span, map, slices) {
48
- const frames = [...parseAnimFrames(span, map)]
49
- if (!frames[0]) throw Error('animation missing frames')
50
- return {
51
- id,
52
- w: frames[0].sourceSize.w,
53
- h: frames[0].sourceSize.h,
54
- cels: frames.map(parseCel),
55
- hitbox: parseHitbox(span, slices),
56
- tag: parseTag(span.name)
57
- }
58
- }
59
-
60
- /**
61
- * @arg {AsepriteTagSpan} span
62
- * @arg {AsepriteFrameMap} map
63
- * @return {IterableIterator<AsepriteFrame>}
64
- */
65
- function* parseAnimFrames(span, map) {
66
- for (let i = span.from; i <= span.to && i - span.from < maxAnimCels; i++) {
67
- const animTagFrame = /** @type {AsepriteAnimTagFrame} */ (
68
- `${span.name}--${i}`
69
- )
70
- const frame = map[animTagFrame]
71
- if (!frame) throw Error(`missing frame "${animTagFrame}"`)
72
- yield frame
73
- }
74
- }
75
-
76
- /**
77
- * @arg {AsepriteFrame} frame
78
- * @return {Readonly<XY>}
79
- * @internal
80
- */
81
- export function parseCel(frame) {
82
- return {
83
- x: frame.frame.x + (frame.frame.w - frame.sourceSize.w) / 2,
84
- y: frame.frame.y + (frame.frame.h - frame.sourceSize.h) / 2
85
- }
86
- }
87
-
88
- /**
89
- * @arg {AsepriteTagSpan} span
90
- * @arg {readonly AsepriteSlice[]} slices
91
- * @return {Readonly<Box>}
92
- * @internal
93
- */
94
- export function parseHitbox(span, slices) {
95
- const tagSlices = slices.filter(slice => slice.name === span.name)
96
- if (tagSlices.length > 1) {
97
- throw Error(`tag "${span.name}" has multiple hitboxes`)
98
- }
99
- const box = tagSlices[0]?.keys[0]?.bounds ?? {x: 0, y: 0, w: 0, h: 0}
100
- // https://github.com/aseprite/aseprite/issues/3524
101
- for (const key of tagSlices[0]?.keys ?? []) {
102
- if (
103
- key.bounds.x !== box.x ||
104
- key.bounds.y !== box.y ||
105
- key.bounds.w !== box.w ||
106
- key.bounds.h !== box.h
107
- )
108
- throw Error(`tag "${span.name}" hitbox varies across frames`)
109
- }
110
- return box
111
- }
112
-
113
- /**
114
- * @arg {string} tag
115
- * @return {AnimTag}
116
- */
117
- function parseTag(tag) {
118
- if (!tag.includes('--')) throw Error(`tag "${tag}" is malformed`)
119
- return /** @type {AnimTag} */ (tag)
120
- }
package/tools/void.js DELETED
@@ -1,143 +0,0 @@
1
- #!/usr/bin/env -S node --no-warnings
2
- // Bundles sources into a single HTML file for distribution and development.
3
- //
4
- // void --html=file --out=dir [--watch] sprite...
5
- // --watch Run development server. Serve on http://localhost:1234 and reload on
6
- // code change.
7
- //
8
- // --no-warnings shebang works around JSON import warnings. See
9
- // https://github.com/nodejs/node/issues/27355 and
10
- // https://github.com/nodejs/node/issues/40940.
11
-
12
- import {execFile} from 'child_process'
13
- import esbuild from 'esbuild'
14
- import {JSDOM} from 'jsdom'
15
- import fs from 'node:fs/promises'
16
- import path from 'node:path'
17
- import pkg from '../package.json' assert {type: 'json'}
18
- import {parseAtlas} from './atlas-parser.js'
19
-
20
- const args = process.argv.filter(arg => !arg.startsWith('--'))
21
- const opts = Object.fromEntries(
22
- process.argv.filter(arg => arg.startsWith('--')).map(arg => arg.split('='))
23
- )
24
-
25
- const watch = '--watch' in opts
26
- const inFilename = opts['--html']
27
- if (!inFilename) throw Error('missing input')
28
- const outDir = opts['--out']
29
- if (!outDir) throw Error('missing output')
30
- const doc = new JSDOM(await fs.readFile(inFilename, 'utf8')).window.document
31
- let srcFilename = /** @type {HTMLScriptElement|null} */ (
32
- doc.querySelector('script[type="module"][src]')
33
- )?.src
34
- if (!srcFilename) throw Error('missing script source')
35
- srcFilename = `${path.dirname(inFilename)}/${srcFilename}`
36
- const sprites = args.splice(2)
37
- if (!sprites.length) throw Error('missing sprites')
38
-
39
- const atlasPNGFilename = `${await fs.mkdtemp('/tmp/', {encoding: 'utf8'})}/atlas.png`
40
- const [err, stdout, stderr] = await new Promise(resolve =>
41
- execFile(
42
- 'aseprite',
43
- [
44
- '--batch',
45
- '--color-mode=indexed',
46
- '--filename-format={title}--{tag}--{frame}',
47
- // '--ignore-empty', Breaks --tagname-format.
48
- '--list-slices',
49
- '--list-tags',
50
- '--merge-duplicates',
51
- `--sheet=${atlasPNGFilename}`,
52
- '--sheet-pack',
53
- '--tagname-format={title}--{tag}',
54
- ...sprites
55
- ],
56
- (err, stdout, stderr) => resolve([err, stdout, stderr])
57
- )
58
- )
59
- process.stderr.write(stderr)
60
- if (err) throw err
61
-
62
- const atlasJSON = JSON.stringify(parseAtlas(JSON.parse(stdout)))
63
- const atlasURI =
64
- await `data:image/png;base64,${(await fs.readFile(atlasPNGFilename)).toString('base64')}`
65
-
66
- /** @type {Parameters<esbuild.PluginBuild['onEnd']>[0]} */
67
- async function pluginOnEnd(result) {
68
- const copy = /** @type {Document} */ (doc.cloneNode(true))
69
- const manifestEl = /** @type {HTMLLinkElement|null} */ (
70
- copy.querySelector('link[href][rel="manifest"]')
71
- )
72
- if (manifestEl) {
73
- const manifestFilename = `${path.dirname(inFilename)}/${manifestEl.href}`
74
- const manifest = JSON.parse(await fs.readFile(manifestFilename, 'utf8'))
75
- for (const icon of manifest.icons) {
76
- if (!icon.src) throw Error('missing manifest icon src')
77
- if (!icon.type) throw Error('missing manifest icon type')
78
- const file = await fs.readFile(
79
- `${path.dirname(manifestFilename)}/${icon.src}`
80
- )
81
- icon.src = `data:${icon.type};base64,${file.toString('base64')}`
82
- }
83
- if (watch) manifest.start_url = 'http://localhost:1234'
84
- manifest.version = pkg.version
85
- manifestEl.href = `data:application/json,${encodeURIComponent(
86
- JSON.stringify(manifest)
87
- )}`
88
- }
89
- const iconEl = /** @type {HTMLLinkElement|null} */ (
90
- copy.querySelector('link[href][rel="icon"][type]')
91
- )
92
- if (iconEl) {
93
- const file = await fs.readFile(`${path.dirname(inFilename)}/${iconEl.href}`)
94
- iconEl.href = `data:${iconEl.type};base64,${file.toString('base64')}`
95
- }
96
-
97
- let js = ''
98
- if (watch)
99
- js +=
100
- "new globalThis.EventSource('/esbuild').addEventListener('change', () => globalThis.location.reload());"
101
-
102
- const outFiles =
103
- result.outputFiles?.filter(file => file.path.endsWith('.js')) ?? []
104
- if (outFiles.length > 1) throw Error('cannot concatenate JavaScript files')
105
- if (outFiles[0]) js += outFiles[0].text
106
-
107
- const scriptEl = /** @type {HTMLScriptElement|null} */ (
108
- copy.querySelector('script[type="module"][src]')
109
- )
110
- if (!scriptEl) throw Error('missing script')
111
- scriptEl.removeAttribute('src')
112
- scriptEl.textContent = `
113
- const atlasURI = '${atlasURI}'
114
- const atlas = ${atlasJSON}
115
- ${js}
116
- `
117
- const outFilename = `${outDir}/${
118
- watch ? 'index' : `${path.basename(inFilename, '.html')}-v${pkg.version}`
119
- }.html`
120
- await fs.mkdir(path.dirname(outFilename), {recursive: true})
121
- await fs.writeFile(
122
- outFilename,
123
- `<!doctype html>${copy.documentElement.outerHTML}`
124
- )
125
- }
126
-
127
- /** @type {esbuild.BuildOptions} */
128
- const buildOpts = {
129
- bundle: true,
130
- entryPoints: [srcFilename],
131
- format: 'esm',
132
- logLevel: `info`, // Print the port and build demarcations.
133
- minify: !watch,
134
- outdir: outDir,
135
- plugins: [{name: 'void', setup: build => build.onEnd(pluginOnEnd)}],
136
- sourcemap: 'linked',
137
- target: 'es2022', // https://esbuild.github.io/content-types/#tsconfig-json
138
- write: false // Written by plugin.
139
- }
140
- if (watch) {
141
- const ctx = await esbuild.context(buildOpts)
142
- await Promise.race([ctx.watch(), ctx.serve({port: 1234, servedir: 'dist'})])
143
- } else await esbuild.build(buildOpts)