@oidoid/void 0.1.7 → 0.1.8

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 (168) hide show
  1. package/dist/public/index.js +1 -1
  2. package/dist/public/index.js.map +1 -1
  3. package/dist/public/{void-v0.1.7+20260106.c6b562a.html → void-v0.1.8+20260106.f2ce523.html} +2 -2
  4. package/dist/src/demo/ents/clock.test.d.ts +2 -0
  5. package/dist/src/demo/ents/clock.test.d.ts.map +1 -0
  6. package/dist/src/demo/ents/clock.test.js +24 -0
  7. package/dist/src/demo/ents/clock.test.js.map +1 -0
  8. package/dist/src/demo/tsconfig.json +3 -3
  9. package/dist/src/ents/cursor.test.d.ts +2 -0
  10. package/dist/src/ents/cursor.test.d.ts.map +1 -0
  11. package/dist/src/ents/cursor.test.js +92 -0
  12. package/dist/src/ents/cursor.test.js.map +1 -0
  13. package/dist/src/ents/ent-query.test.d.ts +11 -0
  14. package/dist/src/ents/ent-query.test.d.ts.map +1 -0
  15. package/dist/src/ents/ent-query.test.js +63 -0
  16. package/dist/src/ents/ent-query.test.js.map +1 -0
  17. package/dist/src/graphics/atlas-parser.test.d.ts +2 -0
  18. package/dist/src/graphics/atlas-parser.test.d.ts.map +1 -0
  19. package/dist/src/graphics/atlas-parser.test.js +100 -0
  20. package/dist/src/graphics/atlas-parser.test.js.map +1 -0
  21. package/dist/src/graphics/cam.test.d.ts +2 -0
  22. package/dist/src/graphics/cam.test.d.ts.map +1 -0
  23. package/dist/src/graphics/cam.test.js +456 -0
  24. package/dist/src/graphics/cam.test.js.map +1 -0
  25. package/dist/src/graphics/layer.test.d.ts +2 -0
  26. package/dist/src/graphics/layer.test.d.ts.map +1 -0
  27. package/dist/src/graphics/layer.test.js +23 -0
  28. package/dist/src/graphics/layer.test.js.map +1 -0
  29. package/dist/src/graphics/renderer.test.d.ts +2 -0
  30. package/dist/src/graphics/renderer.test.d.ts.map +1 -0
  31. package/dist/src/graphics/renderer.test.js +92 -0
  32. package/dist/src/graphics/renderer.test.js.map +1 -0
  33. package/dist/src/graphics/sprite.test.d.ts +2 -0
  34. package/dist/src/graphics/sprite.test.d.ts.map +1 -0
  35. package/dist/src/graphics/sprite.test.js +582 -0
  36. package/dist/src/graphics/sprite.test.js.map +1 -0
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/index.js +0 -1
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/input/context-menu.test.d.ts +2 -0
  41. package/dist/src/input/context-menu.test.d.ts.map +1 -0
  42. package/dist/src/input/context-menu.test.js +111 -0
  43. package/dist/src/input/context-menu.test.js.map +1 -0
  44. package/dist/src/input/gamepad.test.d.ts +2 -0
  45. package/dist/src/input/gamepad.test.d.ts.map +1 -0
  46. package/dist/src/input/gamepad.test.js +172 -0
  47. package/dist/src/input/gamepad.test.js.map +1 -0
  48. package/dist/src/input/input.test.d.ts +2 -0
  49. package/dist/src/input/input.test.d.ts.map +1 -0
  50. package/dist/src/input/input.test.js +1146 -0
  51. package/dist/src/input/input.test.js.map +1 -0
  52. package/dist/src/input/keyboard.test.d.ts +2 -0
  53. package/dist/src/input/keyboard.test.d.ts.map +1 -0
  54. package/dist/src/input/keyboard.test.js +159 -0
  55. package/dist/src/input/keyboard.test.js.map +1 -0
  56. package/dist/src/input/pointer.test.d.ts +2 -0
  57. package/dist/src/input/pointer.test.d.ts.map +1 -0
  58. package/dist/src/input/pointer.test.js +339 -0
  59. package/dist/src/input/pointer.test.js.map +1 -0
  60. package/dist/src/input/wheel.test.d.ts +2 -0
  61. package/dist/src/input/wheel.test.d.ts.map +1 -0
  62. package/dist/src/input/wheel.test.js +92 -0
  63. package/dist/src/input/wheel.test.js.map +1 -0
  64. package/dist/src/level/level-parser.test.d.ts +20 -0
  65. package/dist/src/level/level-parser.test.d.ts.map +1 -0
  66. package/dist/src/level/level-parser.test.js +340 -0
  67. package/dist/src/level/level-parser.test.js.map +1 -0
  68. package/dist/src/looper.test.d.ts +2 -0
  69. package/dist/src/looper.test.d.ts.map +1 -0
  70. package/dist/src/looper.test.js +128 -0
  71. package/dist/src/looper.test.js.map +1 -0
  72. package/dist/src/mem/pool.test.d.ts +2 -0
  73. package/dist/src/mem/pool.test.d.ts.map +1 -0
  74. package/dist/src/mem/pool.test.js +120 -0
  75. package/dist/src/mem/pool.test.js.map +1 -0
  76. package/dist/src/random/random.test.d.ts +2 -0
  77. package/dist/src/random/random.test.d.ts.map +1 -0
  78. package/dist/src/random/random.test.js +36 -0
  79. package/dist/src/random/random.test.js.map +1 -0
  80. package/dist/src/storage/local-storage.test.d.ts +2 -0
  81. package/dist/src/storage/local-storage.test.d.ts.map +1 -0
  82. package/dist/src/storage/local-storage.test.js +105 -0
  83. package/dist/src/storage/local-storage.test.js.map +1 -0
  84. package/dist/src/test/assert.d.ts +5 -0
  85. package/dist/src/test/assert.d.ts.map +1 -0
  86. package/dist/src/test/assert.js +6 -0
  87. package/dist/src/test/assert.js.map +1 -0
  88. package/dist/src/test/device-pixel-ratio-mock.d.ts +6 -0
  89. package/dist/src/test/device-pixel-ratio-mock.d.ts.map +1 -0
  90. package/dist/src/test/device-pixel-ratio-mock.js +10 -0
  91. package/dist/src/test/device-pixel-ratio-mock.js.map +1 -0
  92. package/dist/src/test/index.d.ts +5 -0
  93. package/dist/src/test/index.d.ts.map +1 -0
  94. package/dist/src/test/index.js +5 -0
  95. package/dist/src/test/index.js.map +1 -0
  96. package/dist/src/test/navigator-gamepads-mock.d.ts +7 -0
  97. package/dist/src/test/navigator-gamepads-mock.d.ts.map +1 -0
  98. package/dist/src/test/navigator-gamepads-mock.js +14 -0
  99. package/dist/src/test/navigator-gamepads-mock.js.map +1 -0
  100. package/dist/src/test/secure-context-mock.d.ts +6 -0
  101. package/dist/src/test/secure-context-mock.d.ts.map +1 -0
  102. package/dist/src/test/secure-context-mock.js +10 -0
  103. package/dist/src/test/secure-context-mock.js.map +1 -0
  104. package/dist/src/test/test-element.d.ts +2 -0
  105. package/dist/src/test/test-element.d.ts.map +1 -0
  106. package/dist/src/test/test-element.js +8 -0
  107. package/dist/src/test/test-element.js.map +1 -0
  108. package/dist/src/test/test-event.d.ts +17 -0
  109. package/dist/src/test/test-event.d.ts.map +1 -0
  110. package/dist/src/test/test-event.js +26 -0
  111. package/dist/src/test/test-event.js.map +1 -0
  112. package/dist/src/test/tsconfig.json +30 -0
  113. package/dist/src/text/text-layout.test.d.ts +2 -0
  114. package/dist/src/text/text-layout.test.d.ts.map +1 -0
  115. package/dist/src/text/text-layout.test.js +717 -0
  116. package/dist/src/text/text-layout.test.js.map +1 -0
  117. package/dist/src/tsconfig.json +3 -3
  118. package/dist/src/types/geo.test.d.ts +2 -0
  119. package/dist/src/types/geo.test.d.ts.map +1 -0
  120. package/dist/src/types/geo.test.js +657 -0
  121. package/dist/src/types/geo.test.js.map +1 -0
  122. package/dist/src/types/time.test.d.ts +2 -0
  123. package/dist/src/types/time.test.d.ts.map +1 -0
  124. package/dist/src/types/time.test.js +27 -0
  125. package/dist/src/types/time.test.js.map +1 -0
  126. package/dist/src/utils/async-util.test.d.ts +2 -0
  127. package/dist/src/utils/async-util.test.d.ts.map +1 -0
  128. package/dist/src/utils/async-util.test.js +55 -0
  129. package/dist/src/utils/async-util.test.js.map +1 -0
  130. package/dist/src/utils/color-util.test.d.ts +2 -0
  131. package/dist/src/utils/color-util.test.d.ts.map +1 -0
  132. package/dist/src/utils/color-util.test.js +20 -0
  133. package/dist/src/utils/color-util.test.js.map +1 -0
  134. package/dist/src/utils/debug.test.d.ts +2 -0
  135. package/dist/src/utils/debug.test.d.ts.map +1 -0
  136. package/dist/src/utils/debug.test.js +61 -0
  137. package/dist/src/utils/debug.test.js.map +1 -0
  138. package/dist/src/utils/delay-interval.test.d.ts +2 -0
  139. package/dist/src/utils/delay-interval.test.d.ts.map +1 -0
  140. package/dist/src/utils/delay-interval.test.js +91 -0
  141. package/dist/src/utils/delay-interval.test.js.map +1 -0
  142. package/dist/src/utils/math.test.d.ts +2 -0
  143. package/dist/src/utils/math.test.d.ts.map +1 -0
  144. package/dist/src/utils/math.test.js +10 -0
  145. package/dist/src/utils/math.test.js.map +1 -0
  146. package/dist/src/utils/str-util.test.d.ts +2 -0
  147. package/dist/src/utils/str-util.test.d.ts.map +1 -0
  148. package/dist/src/utils/str-util.test.js +13 -0
  149. package/dist/src/utils/str-util.test.js.map +1 -0
  150. package/dist/tools/atlas-pack/atlas-json-parser.test.d.ts +2 -0
  151. package/dist/tools/atlas-pack/atlas-json-parser.test.d.ts.map +1 -0
  152. package/dist/tools/atlas-pack/atlas-json-parser.test.js +2109 -0
  153. package/dist/tools/atlas-pack/atlas-json-parser.test.js.map +1 -0
  154. package/dist/tools/atlas-pack/atlas.test.aseprite.json +4499 -0
  155. package/dist/tools/bundle/bundle.js +1 -1
  156. package/dist/tools/types/config-file.test.d.ts +2 -0
  157. package/dist/tools/types/config-file.test.d.ts.map +1 -0
  158. package/dist/tools/types/config-file.test.js +68 -0
  159. package/dist/tools/types/config-file.test.js.map +1 -0
  160. package/dist/tools/types/config.test.d.ts +2 -0
  161. package/dist/tools/types/config.test.d.ts.map +1 -0
  162. package/dist/tools/types/config.test.js +125 -0
  163. package/dist/tools/types/config.test.js.map +1 -0
  164. package/dist/tools/utils/argv.test.d.ts +9 -0
  165. package/dist/tools/utils/argv.test.d.ts.map +1 -0
  166. package/dist/tools/utils/argv.test.js +42 -0
  167. package/dist/tools/utils/argv.test.js.map +1 -0
  168. package/package.json +7 -3
@@ -27,7 +27,7 @@ export async function bundle(config, srcFilenames) {
27
27
  plugins: [HTMLPlugin(config)],
28
28
  tsconfig: config.tsconfigFilename,
29
29
  sourcemap: 'linked',
30
- target: 'es2024' // https://esbuild.github.io/content-types/#tsconfig-json
30
+ target: 'es2023' // https://esbuild.github.io/content-types/#tsconfig-json
31
31
  };
32
32
  const atlas = await packAtlas(config.atlas);
33
33
  await writeVoidConfig(atlas, config);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.test.d.ts","sourceRoot":"","sources":["../../../tools/types/config-file.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import path from 'node:path';
2
+ import { test } from 'node:test';
3
+ import { assert } from "../../src/test/assert.js";
4
+ import { parse } from "./config-file.js";
5
+ test('defaults', () => {
6
+ const config = {
7
+ out: {
8
+ dir: undefined,
9
+ game: 'game',
10
+ name: undefined,
11
+ tagSchema: 'tagSchema'
12
+ },
13
+ atlas: { dir: 'dir', image: 'image' }
14
+ };
15
+ assert(parse('dirname/filename', JSON.stringify(config)), {
16
+ $schema: 'https://oidoid.github.io/void/config-file.v0.json',
17
+ entry: path.resolve('dirname', 'src/assets/index.html'),
18
+ meta: path.resolve('dirname', 'dist/meta.json'),
19
+ out: {
20
+ dir: path.resolve('dirname', 'dist/public'),
21
+ game: path.resolve('dirname', 'game'),
22
+ name: undefined,
23
+ tagSchema: path.resolve('dirname', 'tagSchema')
24
+ },
25
+ atlas: {
26
+ dir: path.resolve('dirname', 'dir'),
27
+ image: path.resolve('dirname', 'image')
28
+ },
29
+ input: 'Default',
30
+ mode: 'Int',
31
+ dirname: 'dirname',
32
+ filename: 'dirname/filename'
33
+ });
34
+ });
35
+ test('overrides', () => {
36
+ const config = {
37
+ $schema: '$schema',
38
+ entry: 'entry',
39
+ meta: 'meta',
40
+ out: { dir: 'outDir', game: 'game', name: 'name', tagSchema: 'tagSchema' },
41
+ atlas: { dir: 'dir/', image: 'image.webp' },
42
+ input: 'Custom',
43
+ mode: 'Float'
44
+ };
45
+ assert(parse('dirname/filename', JSON.stringify(config)), {
46
+ $schema: '$schema',
47
+ entry: path.resolve('dirname', 'entry'),
48
+ meta: path.resolve('dirname', 'meta'),
49
+ out: {
50
+ dir: path.resolve('dirname', 'outDir'),
51
+ game: path.resolve('dirname', 'game'),
52
+ name: 'name',
53
+ tagSchema: path.resolve('dirname', 'tagSchema')
54
+ },
55
+ atlas: {
56
+ dir: path.resolve('dirname', 'dir/'),
57
+ image: path.resolve('dirname', 'image.webp')
58
+ },
59
+ input: 'Custom',
60
+ mode: 'Float',
61
+ dirname: 'dirname',
62
+ filename: 'dirname/filename'
63
+ });
64
+ });
65
+ test('overrides', () => {
66
+ assert.throws(() => parse('dirname/filename', ''), /config dirname\/filename unparsable/);
67
+ });
68
+ //# sourceMappingURL=config-file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.test.js","sourceRoot":"","sources":["../../../tools/types/config-file.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../tools/types/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ import { describe, test } from 'node:test';
2
+ import { assert } from "../../src/test/assert.js";
3
+ import { Config, parseTSConfig } from "./config.js";
4
+ describe('Config()', () => {
5
+ const configFile = {
6
+ $schema: 'schema',
7
+ entry: '/project/src/index.ts',
8
+ meta: '/project/meta.json',
9
+ out: {
10
+ dir: '/project/dist',
11
+ game: '/project/game',
12
+ name: undefined,
13
+ tagSchema: '/project/tagSchema'
14
+ },
15
+ atlas: { dir: '/project/dir', image: '/project/image' },
16
+ input: 'Default',
17
+ mode: 'Int',
18
+ dirname: '/project',
19
+ filename: '/project/void.json'
20
+ };
21
+ const argv = {
22
+ args: [],
23
+ opts: {},
24
+ posargs: [],
25
+ argv: ['node', 'void.ts']
26
+ };
27
+ test('watch mode uses .html suffix', () => {
28
+ const config = Config({ ...argv, opts: { '--watch': true } }, configFile, 'abc1234', { version: '1.0.0', published: '2024-01-01' }, '/project/tsconfig.json', {});
29
+ assert(config.out.filename, 'index.html');
30
+ assert(config.watch, true);
31
+ });
32
+ test('build mode uses versioned suffix', () => {
33
+ const config = Config(argv, configFile, 'abc1234', { version: '1.0.0', published: '2024-01-01' }, '/project/tsconfig.json', {});
34
+ assert(config.out.filename, 'index-v1.0.0+2024-01-01.abc1234.html');
35
+ });
36
+ test('out.name overrides entry stem', () => {
37
+ const config = Config(argv, { ...configFile, out: { ...configFile.out, name: 'game' } }, 'abc1234', { version: '1.0.0' }, '/project/tsconfig.json', {});
38
+ assert(config.out.filename, 'game-v1.0.0.abc1234.html');
39
+ });
40
+ test('conditions from tsconfig', () => {
41
+ const config = Config(argv, configFile, '', {}, '/project/tsconfig.json', {
42
+ compilerOptions: { customConditions: ['dev', 'browser'] }
43
+ });
44
+ assert(config.conditions, ['dev', 'browser']);
45
+ });
46
+ });
47
+ describe('parseTSConfig()', () => {
48
+ test('JSON', () => {
49
+ const jsonc = '{"compilerOptions": {"customConditions": ["dev"]}}';
50
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
51
+ compilerOptions: { customConditions: ['dev'] }
52
+ });
53
+ });
54
+ test('empty JSON', () => {
55
+ assert(parseTSConfig('{}', 'tsconfig.json'), {});
56
+ });
57
+ test('JSON: // in string', () => {
58
+ const jsonc = '{"url": "https://example.com"}';
59
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
60
+ url: 'https://example.com'
61
+ });
62
+ });
63
+ test('JSONC: single-line', () => {
64
+ const jsonc = `{
65
+ // This is a comment.
66
+ "compilerOptions": {
67
+ // Another comment.
68
+ "customConditions": ["dev"]
69
+ }
70
+ }`;
71
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
72
+ compilerOptions: { customConditions: ['dev'] }
73
+ });
74
+ });
75
+ test('JSONC: end-of-line', () => {
76
+ const jsonc = `{
77
+ "compilerOptions": { // inline comment.
78
+ "customConditions": ["dev"] // "another" inline.
79
+ }
80
+ }`;
81
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
82
+ compilerOptions: { customConditions: ['dev'] }
83
+ });
84
+ });
85
+ test('JSONC: trailing commas', () => {
86
+ const jsonc = `{
87
+ "compilerOptions": {
88
+ "customConditions": ["dev"],
89
+ },
90
+ }`;
91
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
92
+ compilerOptions: { customConditions: ['dev'] }
93
+ });
94
+ });
95
+ test('JSONC: // in string with adjacent comment', () => {
96
+ const jsonc = `{
97
+ "url": "https://example.com", // real comment
98
+ "path": "file://localhost/path"
99
+ }`;
100
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
101
+ url: 'https://example.com',
102
+ path: 'file://localhost/path'
103
+ });
104
+ });
105
+ test('JSONC: commented out props', () => {
106
+ const jsonc = `{
107
+ "extends": "./tsconfig.prod.json",
108
+ "compilerOptions": {
109
+ "customConditions": ["dev"], // npm link
110
+ // "paths": {"@oidoid/void": ["../void/src"]} // esbuild
111
+ },
112
+ "references": [{"path": "../void"}] // ts build
113
+ }`;
114
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
115
+ extends: './tsconfig.prod.json',
116
+ compilerOptions: { customConditions: ['dev'] },
117
+ references: [{ path: '../void' }]
118
+ });
119
+ });
120
+ test('invalid', () => {
121
+ const jsonc = '{';
122
+ assert.throws(() => parseTSConfig(jsonc, 'tsconfig.json'), /tsconfig\.json/);
123
+ });
124
+ });
125
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../tools/types/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ declare module './argv.ts' {
2
+ interface Opts {
3
+ '--config'?: string;
4
+ '--minify'?: true;
5
+ '--watch'?: true;
6
+ }
7
+ }
8
+ export {};
9
+ //# sourceMappingURL=argv.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argv.test.d.ts","sourceRoot":"","sources":["../../../tools/utils/argv.test.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,WAAW,CAAC;IACzB,UAAU,IAAI;QACZ,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,UAAU,CAAC,EAAE,IAAI,CAAA;QACjB,SAAS,CAAC,EAAE,IAAI,CAAA;KACjB;CACF"}
@@ -0,0 +1,42 @@
1
+ import { test } from 'node:test';
2
+ import { assert } from "../../src/test/assert.js";
3
+ import { Argv } from "./argv.js";
4
+ test('parses empty.', () => {
5
+ assert(Argv(['/usr/local/bin/node', 'tools/void.ts']), {
6
+ args: [],
7
+ opts: {},
8
+ posargs: [],
9
+ argv: ['/usr/local/bin/node', 'tools/void.ts']
10
+ });
11
+ });
12
+ test('parses nonempty.', () => {
13
+ assert(Argv([
14
+ '/usr/local/bin/node',
15
+ 'tools/void.ts',
16
+ '--config=config',
17
+ '--minify',
18
+ '--watch',
19
+ 'a.aseprite',
20
+ 'b.aseprite',
21
+ '--',
22
+ 'posarg0',
23
+ 'posarg1'
24
+ ]), {
25
+ args: ['a.aseprite', 'b.aseprite'],
26
+ opts: { '--config': 'config', '--minify': true, '--watch': true },
27
+ posargs: ['posarg0', 'posarg1'],
28
+ argv: [
29
+ '/usr/local/bin/node',
30
+ 'tools/void.ts',
31
+ '--config=config',
32
+ '--minify',
33
+ '--watch',
34
+ 'a.aseprite',
35
+ 'b.aseprite',
36
+ '--',
37
+ 'posarg0',
38
+ 'posarg1'
39
+ ]
40
+ });
41
+ });
42
+ //# sourceMappingURL=argv.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argv.test.js","sourceRoot":"","sources":["../../../tools/utils/argv.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAA;AAC/C,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAU9B,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IACzB,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC,EAAE;QACrD,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,CAAC,qBAAqB,EAAE,eAAe,CAAC;KAC/C,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC5B,MAAM,CACJ,IAAI,CAAC;QACH,qBAAqB;QACrB,eAAe;QACf,iBAAiB;QACjB,UAAU;QACV,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,IAAI;QACJ,SAAS;QACT,SAAS;KACV,CAAC,EACF;QACE,IAAI,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;QAClC,IAAI,EAAE,EAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAC;QAC/D,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC/B,IAAI,EAAE;YACJ,qBAAqB;YACrB,eAAe;YACf,iBAAiB;YACjB,UAAU;YACV,SAAS;YACT,YAAY;YACZ,YAAY;YACZ,IAAI;YACJ,SAAS;YACT,SAAS;SACV;KACF,CACF,CAAA;AACH,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "bugs": "https://github.com/oidoid/void/issues",
7
7
  "dependencies": {
8
- "@biomejs/biome": "2.3.10",
8
+ "@biomejs/biome": "2.3.11",
9
9
  "esbuild": "0.27.2",
10
10
  "jsdom": "27.4.0",
11
11
  "mem-font": "11.0.0-10"
12
12
  },
13
13
  "description": "basic 2D game library.",
14
14
  "devDependencies": {
15
- "@oidoid/config": "0.0.5",
15
+ "@oidoid/config": "0.0.6",
16
16
  "@types/jsdom": "27.0.0",
17
17
  "@types/node": "24.4.0",
18
18
  "typescript": "5.9.3"
@@ -24,6 +24,10 @@
24
24
  ".": {
25
25
  "dev": "./src/index.ts",
26
26
  "default": "./dist/src/index.js"
27
+ },
28
+ "./test": {
29
+ "dev": "./src/test/index.ts",
30
+ "default": "./dist/src/test/index.js"
27
31
  }
28
32
  },
29
33
  "files": [
@@ -61,5 +65,5 @@
61
65
  "version": "npm pkg set published=$(date +%Y%m%d) && npm run clean && npm test"
62
66
  },
63
67
  "type": "module",
64
- "version": "0.1.7"
68
+ "version": "0.1.8"
65
69
  }