toiljs 0.0.15 → 0.0.16

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 (217) hide show
  1. package/.babelrc +13 -13
  2. package/.gitattributes +2 -2
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +90 -90
  5. package/.github/ISSUE_TEMPLATE/config.yml +8 -8
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  7. package/.github/PULL_REQUEST_TEMPLATE.md +43 -43
  8. package/.github/changelog-config.json +45 -45
  9. package/.github/dependabot.yml +27 -27
  10. package/.github/workflows/ci.yml +191 -191
  11. package/.prettierrc.json +11 -11
  12. package/.vscode/settings.json +9 -9
  13. package/CHANGELOG.md +5 -5
  14. package/LICENSE +187 -187
  15. package/README.md +339 -315
  16. package/as-pect.asconfig.json +34 -34
  17. package/as-pect.config.js +65 -65
  18. package/assets/logo.svg +36 -36
  19. package/build/backend/.tsbuildinfo +1 -1
  20. package/build/cli/.tsbuildinfo +1 -1
  21. package/build/cli/index.js +0 -0
  22. package/build/client/.tsbuildinfo +1 -1
  23. package/build/client/dev/devtools.d.ts +6 -0
  24. package/build/client/dev/devtools.js +442 -0
  25. package/build/client/dev/error-overlay.d.ts +9 -0
  26. package/build/client/dev/error-overlay.js +19 -4
  27. package/build/client/navigation/prefetch.d.ts +1 -0
  28. package/build/client/navigation/prefetch.js +35 -0
  29. package/build/client/routing/Router.js +1 -1
  30. package/build/client/routing/hooks.js +6 -2
  31. package/build/client/routing/loader.d.ts +23 -0
  32. package/build/client/routing/loader.js +53 -7
  33. package/build/client/routing/mount.js +4 -3
  34. package/build/compiler/.tsbuildinfo +1 -1
  35. package/build/compiler/config.d.ts +16 -0
  36. package/build/compiler/config.js +7 -0
  37. package/build/compiler/docs.js +16 -16
  38. package/build/compiler/index.d.ts +2 -2
  39. package/build/compiler/index.js +1 -1
  40. package/build/compiler/plugin.js +156 -0
  41. package/build/compiler/prerender.d.ts +1 -0
  42. package/build/compiler/prerender.js +1 -1
  43. package/build/compiler/seo.d.ts +1 -1
  44. package/build/compiler/seo.js +5 -4
  45. package/build/compiler/ssg.js +32 -1
  46. package/build/io/.tsbuildinfo +1 -1
  47. package/build/logger/.tsbuildinfo +1 -1
  48. package/build/shared/.tsbuildinfo +1 -1
  49. package/eslint.config.js +48 -48
  50. package/examples/basic/client/404.tsx +11 -11
  51. package/examples/basic/client/components/.gitkeep +1 -1
  52. package/examples/basic/client/global-error.tsx +13 -13
  53. package/examples/basic/client/layout.tsx +25 -25
  54. package/examples/basic/client/public/images/.gitkeep +1 -1
  55. package/examples/basic/client/public/images/logo.svg +36 -36
  56. package/examples/basic/client/public/robots.txt +2 -2
  57. package/examples/basic/client/routes/docs/[...slug].tsx +12 -12
  58. package/examples/basic/client/routes/features/error/error.tsx +16 -16
  59. package/examples/basic/client/routes/features/template/b.tsx +14 -14
  60. package/examples/basic/client/routes/files/[[...slug]].tsx +21 -21
  61. package/examples/basic/client/routes/gallery/layout.tsx +13 -13
  62. package/examples/basic/client/routes/io.tsx +24 -24
  63. package/examples/basic/client/routes/loader-demo/loading.tsx +13 -13
  64. package/examples/basic/client/routes/search.tsx +61 -61
  65. package/examples/basic/client/toil.tsx +5 -5
  66. package/package.json +155 -148
  67. package/presets/eslint.js +88 -88
  68. package/presets/no-uint8array-tostring.js +200 -200
  69. package/presets/prettier.json +18 -18
  70. package/presets/tsconfig.json +37 -37
  71. package/src/backend/index.ts +160 -160
  72. package/src/cli/proc.ts +50 -50
  73. package/src/cli/updates.ts +69 -69
  74. package/src/cli/validate.ts +31 -31
  75. package/src/client/channel/channel.ts +146 -146
  76. package/src/client/components/Form.tsx +65 -65
  77. package/src/client/components/Script.tsx +113 -113
  78. package/src/client/components/Slot.tsx +21 -21
  79. package/src/client/dev/devtools.tsx +973 -0
  80. package/src/client/dev/error-overlay.tsx +30 -4
  81. package/src/client/head/head.ts +167 -167
  82. package/src/client/head/metadata.ts +112 -112
  83. package/src/client/index.ts +89 -89
  84. package/src/client/navigation/NavLink.tsx +86 -86
  85. package/src/client/navigation/navigation.ts +235 -235
  86. package/src/client/navigation/prefetch.ts +169 -130
  87. package/src/client/navigation/scroll.ts +53 -53
  88. package/src/client/routing/Router.tsx +8 -2
  89. package/src/client/routing/action.ts +122 -122
  90. package/src/client/routing/error-boundary.tsx +43 -43
  91. package/src/client/routing/hooks.ts +21 -6
  92. package/src/client/routing/loader.ts +325 -235
  93. package/src/client/routing/match.ts +47 -47
  94. package/src/client/routing/mount.tsx +54 -52
  95. package/src/client/routing/params-context.ts +10 -10
  96. package/src/client/routing/slot-context.ts +7 -7
  97. package/src/client/search/search.ts +189 -189
  98. package/src/client/search/use-page-search.ts +73 -73
  99. package/src/client/types.ts +73 -73
  100. package/src/compiler/config.ts +219 -182
  101. package/src/compiler/docs.ts +228 -228
  102. package/src/compiler/generate.ts +394 -394
  103. package/src/compiler/index.ts +64 -57
  104. package/src/compiler/pages.ts +70 -70
  105. package/src/compiler/plugin.ts +170 -2
  106. package/src/compiler/prerender.ts +156 -156
  107. package/src/compiler/seo.ts +397 -390
  108. package/src/compiler/ssg.ts +162 -126
  109. package/src/io/BinaryReader.ts +340 -340
  110. package/src/io/BinaryWriter.ts +385 -385
  111. package/src/io/FastMap.ts +127 -127
  112. package/src/io/index.ts +11 -11
  113. package/src/io/lengths.ts +14 -14
  114. package/src/io/types.ts +18 -18
  115. package/src/logger/index.ts +22 -22
  116. package/src/server/index.ts +10 -10
  117. package/src/server/main.ts +13 -13
  118. package/src/server/tsconfig.json +4 -4
  119. package/src/shared/index.ts +10 -10
  120. package/std/client/index.d.ts +15 -15
  121. package/std/client/package.json +3 -3
  122. package/test/assembly/example.spec.ts +7 -7
  123. package/test/channel.test.ts +21 -21
  124. package/test/dom/Link.test.tsx +47 -47
  125. package/test/dom/NavLink.test.tsx +37 -37
  126. package/test/dom/error-overlay.test.tsx +44 -44
  127. package/test/dom/loader.test.tsx +121 -121
  128. package/test/dom/navigation.test.ts +59 -59
  129. package/test/dom/revalidate.test.tsx +38 -38
  130. package/test/dom/route-head.test.tsx +78 -78
  131. package/test/dom/router-loading.test.tsx +44 -44
  132. package/test/dom/scroll.test.ts +56 -56
  133. package/test/dom/use-metadata.test.tsx +58 -58
  134. package/test/io.test.ts +93 -93
  135. package/test/navlink.test.ts +28 -28
  136. package/test/placeholder.test.ts +9 -9
  137. package/test/routes.test.ts +76 -76
  138. package/test/seo.test.ts +175 -164
  139. package/test/slot-layouts.test.ts +69 -69
  140. package/test/ssg.test.ts +36 -36
  141. package/test/update.test.ts +44 -44
  142. package/test/validate.test.ts +42 -42
  143. package/toil-routes.d.ts +7 -0
  144. package/toilconfig.json +30 -30
  145. package/tsconfig.backend.json +13 -13
  146. package/tsconfig.base.json +35 -35
  147. package/tsconfig.cli.json +13 -13
  148. package/tsconfig.client.json +14 -14
  149. package/tsconfig.compiler.json +13 -13
  150. package/tsconfig.io.json +12 -12
  151. package/tsconfig.json +22 -22
  152. package/tsconfig.logger.json +12 -12
  153. package/tsconfig.server.json +10 -10
  154. package/tsconfig.shared.json +12 -12
  155. package/vitest.config.ts +26 -26
  156. package/.idea/codeStyles/Project.xml +0 -54
  157. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  158. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  159. package/.idea/modules.xml +0 -8
  160. package/.idea/prettier.xml +0 -7
  161. package/.idea/toiljs.iml +0 -8
  162. package/.idea/vcs.xml +0 -6
  163. package/.toil/entry.tsx +0 -9
  164. package/.toil/index.html +0 -12
  165. package/.toil/routes.ts +0 -9
  166. package/build/cli/configure.d.ts +0 -16
  167. package/build/cli/configure.js +0 -272
  168. package/build/cli/create.d.ts +0 -16
  169. package/build/cli/create.js +0 -420
  170. package/build/cli/diagnostics.d.ts +0 -55
  171. package/build/cli/diagnostics.js +0 -333
  172. package/build/cli/doctor.d.ts +0 -6
  173. package/build/cli/doctor.js +0 -249
  174. package/build/cli/features.d.ts +0 -25
  175. package/build/cli/features.js +0 -107
  176. package/build/cli/index.d.ts +0 -2
  177. package/build/cli/proc.d.ts +0 -6
  178. package/build/cli/proc.js +0 -31
  179. package/build/cli/ui.d.ts +0 -9
  180. package/build/cli/ui.js +0 -75
  181. package/build/cli/update.d.ts +0 -7
  182. package/build/cli/update.js +0 -117
  183. package/build/cli/updates.d.ts +0 -10
  184. package/build/cli/updates.js +0 -45
  185. package/build/cli/validate.d.ts +0 -4
  186. package/build/cli/validate.js +0 -19
  187. package/build/client/Link.d.ts +0 -8
  188. package/build/client/Link.js +0 -44
  189. package/build/client/NavLink.d.ts +0 -14
  190. package/build/client/NavLink.js +0 -37
  191. package/build/client/Router.d.ts +0 -7
  192. package/build/client/Router.js +0 -55
  193. package/build/client/channel.d.ts +0 -23
  194. package/build/client/channel.js +0 -94
  195. package/build/client/error-boundary.d.ts +0 -16
  196. package/build/client/error-boundary.js +0 -19
  197. package/build/client/head.d.ts +0 -26
  198. package/build/client/head.js +0 -87
  199. package/build/client/hooks.d.ts +0 -17
  200. package/build/client/hooks.js +0 -48
  201. package/build/client/lazy.d.ts +0 -16
  202. package/build/client/lazy.js +0 -53
  203. package/build/client/match.d.ts +0 -2
  204. package/build/client/match.js +0 -32
  205. package/build/client/mount.d.ts +0 -2
  206. package/build/client/mount.js +0 -13
  207. package/build/client/navigation.d.ts +0 -13
  208. package/build/client/navigation.js +0 -97
  209. package/build/client/params-context.d.ts +0 -2
  210. package/build/client/params-context.js +0 -2
  211. package/build/client/prefetch.d.ts +0 -11
  212. package/build/client/prefetch.js +0 -100
  213. package/build/client/runtime.d.ts +0 -31
  214. package/build/client/runtime.js +0 -112
  215. package/build/client/scroll.d.ts +0 -8
  216. package/build/client/scroll.js +0 -36
  217. package/toil-env.d.ts +0 -16
package/src/io/FastMap.ts CHANGED
@@ -1,127 +1,127 @@
1
- export type PropertyExtendedKey = PropertyKey | bigint;
2
-
3
- /**
4
- * Like Record, but supports bigint keys (which JS auto-converts to strings).
5
- * Reflects actual JavaScript behavior where obj[123n] becomes obj["123"].
6
- */
7
- export type FastRecord<V> = {
8
- [key: string]: V;
9
- };
10
-
11
- export type IndexKey = string | number;
12
-
13
- export class FastMap<K extends PropertyExtendedKey, V> implements Disposable {
14
- protected _keys: K[] = [];
15
- protected _values: FastRecord<V> = {};
16
-
17
- constructor(iterable?: ReadonlyArray<readonly [K, V]> | null | FastMap<K, V>) {
18
- if (iterable instanceof FastMap) {
19
- this.setAll(iterable);
20
- } else {
21
- if (iterable) {
22
- for (const [key, value] of iterable) {
23
- this.set(key, value);
24
- }
25
- }
26
- }
27
- }
28
-
29
- public get size(): number {
30
- return this._keys.length;
31
- }
32
-
33
- public setAll(map: FastMap<K, V>): void {
34
- this._keys = [...map._keys];
35
- this._values = { ...map._values };
36
- }
37
-
38
- public addAll(map: FastMap<K, V>): void {
39
- for (const [key, value] of map.entries()) {
40
- this.set(key, value);
41
- }
42
- }
43
-
44
- public *keys(): IterableIterator<K> {
45
- yield* this._keys;
46
- }
47
-
48
- public *values(): IterableIterator<V> {
49
- for (const key of this._keys) {
50
- yield this._values[key as IndexKey] as V;
51
- }
52
- }
53
-
54
- public *entries(): IterableIterator<[K, V]> {
55
- for (const key of this._keys) {
56
- yield [key, this._values[key as IndexKey] as V];
57
- }
58
- }
59
-
60
- public set(key: K, value: V): this {
61
- if (!this.has(key)) {
62
- this._keys.push(key);
63
- }
64
-
65
- this._values[key as IndexKey] = value;
66
-
67
- return this;
68
- }
69
-
70
- public indexOf(key: K): number {
71
- if (!this.has(key)) {
72
- return -1;
73
- }
74
-
75
- for (let i = 0; i < this._keys.length; i++) {
76
- if (this._keys[i] === key) {
77
- return i;
78
- }
79
- }
80
-
81
- throw new Error('Key not found, this should not happen.');
82
- }
83
-
84
- public get(key: K): V | undefined {
85
- return this._values[key as IndexKey];
86
- }
87
-
88
- public has(key: K): boolean {
89
- return Object.prototype.hasOwnProperty.call(this._values, key as IndexKey);
90
- }
91
-
92
- public delete(key: K): boolean {
93
- if (!this.has(key)) {
94
- return false;
95
- }
96
-
97
- const index = this.indexOf(key);
98
- this._keys.splice(index, 1);
99
-
100
- delete this._values[key as IndexKey];
101
- return true;
102
- }
103
-
104
- public clear(): void {
105
- this._keys = [];
106
- this._values = {};
107
- }
108
-
109
- public [Symbol.dispose](): void {
110
- this.clear();
111
- }
112
-
113
- public forEach(
114
- callback: (value: V, key: K, map: FastMap<K, V>) => void,
115
- thisArg?: unknown,
116
- ): void {
117
- for (const key of this._keys) {
118
- callback.call(thisArg, this._values[key as IndexKey] as V, key, this);
119
- }
120
- }
121
-
122
- *[Symbol.iterator](): IterableIterator<[K, V]> {
123
- for (const key of this._keys) {
124
- yield [key, this._values[key as IndexKey] as V];
125
- }
126
- }
127
- }
1
+ export type PropertyExtendedKey = PropertyKey | bigint;
2
+
3
+ /**
4
+ * Like Record, but supports bigint keys (which JS auto-converts to strings).
5
+ * Reflects actual JavaScript behavior where obj[123n] becomes obj["123"].
6
+ */
7
+ export type FastRecord<V> = {
8
+ [key: string]: V;
9
+ };
10
+
11
+ export type IndexKey = string | number;
12
+
13
+ export class FastMap<K extends PropertyExtendedKey, V> implements Disposable {
14
+ protected _keys: K[] = [];
15
+ protected _values: FastRecord<V> = {};
16
+
17
+ constructor(iterable?: ReadonlyArray<readonly [K, V]> | null | FastMap<K, V>) {
18
+ if (iterable instanceof FastMap) {
19
+ this.setAll(iterable);
20
+ } else {
21
+ if (iterable) {
22
+ for (const [key, value] of iterable) {
23
+ this.set(key, value);
24
+ }
25
+ }
26
+ }
27
+ }
28
+
29
+ public get size(): number {
30
+ return this._keys.length;
31
+ }
32
+
33
+ public setAll(map: FastMap<K, V>): void {
34
+ this._keys = [...map._keys];
35
+ this._values = { ...map._values };
36
+ }
37
+
38
+ public addAll(map: FastMap<K, V>): void {
39
+ for (const [key, value] of map.entries()) {
40
+ this.set(key, value);
41
+ }
42
+ }
43
+
44
+ public *keys(): IterableIterator<K> {
45
+ yield* this._keys;
46
+ }
47
+
48
+ public *values(): IterableIterator<V> {
49
+ for (const key of this._keys) {
50
+ yield this._values[key as IndexKey] as V;
51
+ }
52
+ }
53
+
54
+ public *entries(): IterableIterator<[K, V]> {
55
+ for (const key of this._keys) {
56
+ yield [key, this._values[key as IndexKey] as V];
57
+ }
58
+ }
59
+
60
+ public set(key: K, value: V): this {
61
+ if (!this.has(key)) {
62
+ this._keys.push(key);
63
+ }
64
+
65
+ this._values[key as IndexKey] = value;
66
+
67
+ return this;
68
+ }
69
+
70
+ public indexOf(key: K): number {
71
+ if (!this.has(key)) {
72
+ return -1;
73
+ }
74
+
75
+ for (let i = 0; i < this._keys.length; i++) {
76
+ if (this._keys[i] === key) {
77
+ return i;
78
+ }
79
+ }
80
+
81
+ throw new Error('Key not found, this should not happen.');
82
+ }
83
+
84
+ public get(key: K): V | undefined {
85
+ return this._values[key as IndexKey];
86
+ }
87
+
88
+ public has(key: K): boolean {
89
+ return Object.prototype.hasOwnProperty.call(this._values, key as IndexKey);
90
+ }
91
+
92
+ public delete(key: K): boolean {
93
+ if (!this.has(key)) {
94
+ return false;
95
+ }
96
+
97
+ const index = this.indexOf(key);
98
+ this._keys.splice(index, 1);
99
+
100
+ delete this._values[key as IndexKey];
101
+ return true;
102
+ }
103
+
104
+ public clear(): void {
105
+ this._keys = [];
106
+ this._values = {};
107
+ }
108
+
109
+ public [Symbol.dispose](): void {
110
+ this.clear();
111
+ }
112
+
113
+ public forEach(
114
+ callback: (value: V, key: K, map: FastMap<K, V>) => void,
115
+ thisArg?: unknown,
116
+ ): void {
117
+ for (const key of this._keys) {
118
+ callback.call(thisArg, this._values[key as IndexKey] as V, key, this);
119
+ }
120
+ }
121
+
122
+ *[Symbol.iterator](): IterableIterator<[K, V]> {
123
+ for (const key of this._keys) {
124
+ yield [key, this._values[key as IndexKey] as V];
125
+ }
126
+ }
127
+ }
package/src/io/index.ts CHANGED
@@ -1,11 +1,11 @@
1
- /**
2
- * toiljs IO, native binary serialization + fast collections, exposed to the client both as
3
- * `toiljs/io` imports and as ambient globals (see the generated `.toil/toil-env.d.ts`).
4
- */
5
- export { BinaryWriter } from './BinaryWriter.js';
6
- export { BinaryReader } from './BinaryReader.js';
7
- export { FastMap } from './FastMap.js';
8
- export { FastSet } from './FastSet.js';
9
-
10
- export type { PropertyExtendedKey, FastRecord, IndexKey } from './FastMap.js';
11
- export type { i8, i16, i32, i64, u8, u16, u32, u64, Selector, BufferLike } from './types.js';
1
+ /**
2
+ * toiljs IO, native binary serialization + fast collections, exposed to the client both as
3
+ * `toiljs/io` imports and as ambient globals (see the generated `.toil/toil-env.d.ts`).
4
+ */
5
+ export { BinaryWriter } from './BinaryWriter.js';
6
+ export { BinaryReader } from './BinaryReader.js';
7
+ export { FastMap } from './FastMap.js';
8
+ export { FastSet } from './FastSet.js';
9
+
10
+ export type { PropertyExtendedKey, FastRecord, IndexKey } from './FastMap.js';
11
+ export type { i8, i16, i32, i64, u8, u16, u32, u64, Selector, BufferLike } from './types.js';
package/src/io/lengths.ts CHANGED
@@ -1,14 +1,14 @@
1
- /** Byte widths for the fixed-size integer types written/read by the binary IO classes. */
2
- export const U8_BYTE_LENGTH = 1;
3
- export const U16_BYTE_LENGTH = 2;
4
- export const U32_BYTE_LENGTH = 4;
5
- export const U64_BYTE_LENGTH = 8;
6
-
7
- export const I8_BYTE_LENGTH = 1;
8
- export const I16_BYTE_LENGTH = 2;
9
- export const I32_BYTE_LENGTH = 4;
10
- export const I64_BYTE_LENGTH = 8;
11
-
12
- export const U128_BYTE_LENGTH = 16;
13
- export const I128_BYTE_LENGTH = 16;
14
- export const U256_BYTE_LENGTH = 32;
1
+ /** Byte widths for the fixed-size integer types written/read by the binary IO classes. */
2
+ export const U8_BYTE_LENGTH = 1;
3
+ export const U16_BYTE_LENGTH = 2;
4
+ export const U32_BYTE_LENGTH = 4;
5
+ export const U64_BYTE_LENGTH = 8;
6
+
7
+ export const I8_BYTE_LENGTH = 1;
8
+ export const I16_BYTE_LENGTH = 2;
9
+ export const I32_BYTE_LENGTH = 4;
10
+ export const I64_BYTE_LENGTH = 8;
11
+
12
+ export const U128_BYTE_LENGTH = 16;
13
+ export const I128_BYTE_LENGTH = 16;
14
+ export const U256_BYTE_LENGTH = 32;
package/src/io/types.ts CHANGED
@@ -1,18 +1,18 @@
1
- /**
2
- * Branded numeric width aliases used by the binary IO classes. They are plain `number`/`bigint`
3
- * at runtime, the names document intent.
4
- */
5
- export type i8 = number;
6
- export type i16 = number;
7
- export type i32 = number;
8
- export type i64 = bigint;
9
-
10
- export type u8 = number;
11
- export type u16 = number;
12
- export type u32 = number;
13
- export type u64 = bigint;
14
-
15
- export type Selector = number;
16
-
17
- /** Anything that can back a {@link BinaryReader}. */
18
- export type BufferLike = Uint8Array;
1
+ /**
2
+ * Branded numeric width aliases used by the binary IO classes. They are plain `number`/`bigint`
3
+ * at runtime, the names document intent.
4
+ */
5
+ export type i8 = number;
6
+ export type i16 = number;
7
+ export type i32 = number;
8
+ export type i64 = bigint;
9
+
10
+ export type u8 = number;
11
+ export type u16 = number;
12
+ export type u32 = number;
13
+ export type u64 = bigint;
14
+
15
+ export type Selector = number;
16
+
17
+ /** Anything that can back a {@link BinaryReader}. */
18
+ export type BufferLike = Uint8Array;
@@ -1,22 +1,22 @@
1
- /**
2
- * Minimal logger placeholder for toiljs. Swapped for the real implementation later.
3
- */
4
-
5
- export enum LogLevel {
6
- Debug = 'debug',
7
- Info = 'info',
8
- Warn = 'warn',
9
- Error = 'error',
10
- }
11
-
12
- export class Logger {
13
- public constructor(private readonly scope: string = 'toil') {}
14
-
15
- public log(level: LogLevel, message: string): void {
16
- console.log(`[${this.scope}] ${level}: ${message}`);
17
- }
18
-
19
- public info(message: string): void {
20
- this.log(LogLevel.Info, message);
21
- }
22
- }
1
+ /**
2
+ * Minimal logger placeholder for toiljs. Swapped for the real implementation later.
3
+ */
4
+
5
+ export enum LogLevel {
6
+ Debug = 'debug',
7
+ Info = 'info',
8
+ Warn = 'warn',
9
+ Error = 'error',
10
+ }
11
+
12
+ export class Logger {
13
+ public constructor(private readonly scope: string = 'toil') {}
14
+
15
+ public log(level: LogLevel, message: string): void {
16
+ console.log(`[${this.scope}] ${level}: ${message}`);
17
+ }
18
+
19
+ public info(message: string): void {
20
+ this.log(LogLevel.Info, message);
21
+ }
22
+ }
@@ -1,10 +1,10 @@
1
- /**
2
- * toilscript server (WASM) entry, compiled to WebAssembly by `toilscript`.
3
- *
4
- * Placeholder module: a trivial exported function that compiles with the toilscript std.
5
- * Native decorators (e.g. `@main`) ship from toilscript directly, no transformer required.
6
- */
7
-
8
- export function add(a: i32, b: i32): i32 {
9
- return a + b;
10
- }
1
+ /**
2
+ * toilscript server (WASM) entry, compiled to WebAssembly by `toilscript`.
3
+ *
4
+ * Placeholder module: a trivial exported function that compiles with the toilscript std.
5
+ * Native decorators (e.g. `@main`) ship from toilscript directly, no transformer required.
6
+ */
7
+
8
+ export function add(a: i32, b: i32): i32 {
9
+ return a + b;
10
+ }
@@ -1,13 +1,13 @@
1
- /**
2
- * Server (WASM) entry point, compiled by the toilscript fork (`toilscript --target release`).
3
- *
4
- * `@main` is a toilscript-native decorator, no import needed. It marks this
5
- * function as the module entry; the compiler exports it as the WebAssembly
6
- * export `main`.
7
- */
8
- import { add } from './index';
9
-
10
- @main
11
- function run(): i32 {
12
- return add(40, 2);
13
- }
1
+ /**
2
+ * Server (WASM) entry point, compiled by the toilscript fork (`toilscript --target release`).
3
+ *
4
+ * `@main` is a toilscript-native decorator, no import needed. It marks this
5
+ * function as the module entry; the compiler exports it as the WebAssembly
6
+ * export `main`.
7
+ */
8
+ import { add } from './index';
9
+
10
+ @main
11
+ function run(): i32 {
12
+ return add(40, 2);
13
+ }
@@ -1,4 +1,4 @@
1
- {
2
- "extends": "toilscript/std/assembly.json",
3
- "include": ["./**/*.ts"]
4
- }
1
+ {
2
+ "extends": "toilscript/std/assembly.json",
3
+ "include": ["./**/*.ts"]
4
+ }
@@ -1,10 +1,10 @@
1
- /**
2
- * Shared primitives used across every toiljs target (client, compiler, cli, server tooling).
3
- * Placeholder, real shared types/utilities land here.
4
- */
5
-
6
- export const FRAMEWORK_NAME = 'toiljs';
7
-
8
- export interface ToilTarget {
9
- readonly name: 'client' | 'compiler' | 'cli' | 'server';
10
- }
1
+ /**
2
+ * Shared primitives used across every toiljs target (client, compiler, cli, server tooling).
3
+ * Placeholder, real shared types/utilities land here.
4
+ */
5
+
6
+ export const FRAMEWORK_NAME = 'toiljs';
7
+
8
+ export interface ToilTarget {
9
+ readonly name: 'client' | 'compiler' | 'cli' | 'server';
10
+ }
@@ -1,15 +1,15 @@
1
- /**
2
- * Ambient "native" types for the toiljs client framework.
3
- *
4
- * These are injected into the client target so users don't import them (a `declare global`
5
- * block discovered via tsconfig). Placeholder declarations; real framework globals land here.
6
- */
7
-
8
- declare global {
9
- /** Global toil client handle, available without imports inside client code. */
10
- const toil: {
11
- readonly version: string;
12
- };
13
- }
14
-
15
- export {};
1
+ /**
2
+ * Ambient "native" types for the toiljs client framework.
3
+ *
4
+ * These are injected into the client target so users don't import them (a `declare global`
5
+ * block discovered via tsconfig). Placeholder declarations; real framework globals land here.
6
+ */
7
+
8
+ declare global {
9
+ /** Global toil client handle, available without imports inside client code. */
10
+ const toil: {
11
+ readonly version: string;
12
+ };
13
+ }
14
+
15
+ export {};
@@ -1,3 +1,3 @@
1
- {
2
- "types": "index.d.ts"
3
- }
1
+ {
2
+ "types": "index.d.ts"
3
+ }
@@ -1,7 +1,7 @@
1
- import { add } from '../../src/server';
2
-
3
- describe('server', () => {
4
- it('adds two integers', () => {
5
- expect<i32>(add(1, 2)).toBe(3);
6
- });
7
- });
1
+ import { add } from '../../src/server';
2
+
3
+ describe('server', () => {
4
+ it('adds two integers', () => {
5
+ expect<i32>(add(1, 2)).toBe(3);
6
+ });
7
+ });
@@ -1,21 +1,21 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- import { resolveChannelUrl } from '../src/client/channel/channel';
4
-
5
- describe('resolveChannelUrl', () => {
6
- it('uses ws:// over http and the default /_toil path', () => {
7
- expect(resolveChannelUrl(undefined, { protocol: 'http:', host: 'localhost:3000' })).toBe(
8
- 'ws://localhost:3000/_toil',
9
- );
10
- });
11
-
12
- it('uses wss:// over https', () => {
13
- expect(resolveChannelUrl('/_toil', { protocol: 'https:', host: 'app.example.com' })).toBe(
14
- 'wss://app.example.com/_toil',
15
- );
16
- });
17
-
18
- it('normalizes a path without a leading slash', () => {
19
- expect(resolveChannelUrl('live', { protocol: 'http:', host: 'h:1' })).toBe('ws://h:1/live');
20
- });
21
- });
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { resolveChannelUrl } from '../src/client/channel/channel';
4
+
5
+ describe('resolveChannelUrl', () => {
6
+ it('uses ws:// over http and the default /_toil path', () => {
7
+ expect(resolveChannelUrl(undefined, { protocol: 'http:', host: 'localhost:3000' })).toBe(
8
+ 'ws://localhost:3000/_toil',
9
+ );
10
+ });
11
+
12
+ it('uses wss:// over https', () => {
13
+ expect(resolveChannelUrl('/_toil', { protocol: 'https:', host: 'app.example.com' })).toBe(
14
+ 'wss://app.example.com/_toil',
15
+ );
16
+ });
17
+
18
+ it('normalizes a path without a leading slash', () => {
19
+ expect(resolveChannelUrl('live', { protocol: 'http:', host: 'h:1' })).toBe('ws://h:1/live');
20
+ });
21
+ });
@@ -1,47 +1,47 @@
1
- // @vitest-environment jsdom
2
- import { cleanup, fireEvent, render } from '@testing-library/react';
3
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
4
-
5
- import { Link } from '../../src/client/navigation/Link';
6
-
7
- afterEach(cleanup);
8
- beforeEach(() => {
9
- window.history.replaceState({}, '', '/');
10
- });
11
-
12
- describe('Link', () => {
13
- it('intercepts a plain internal click (client nav, default prevented)', () => {
14
- const { getByText } = render(<Link href="/about">go</Link>);
15
- const prevented = !fireEvent.click(getByText('go'));
16
- expect(prevented).toBe(true);
17
- expect(window.location.pathname).toBe('/about');
18
- });
19
-
20
- it('does not intercept external links', () => {
21
- const { getByText } = render(<Link href="https://example.com">ext</Link>);
22
- const notPrevented = fireEvent.click(getByText('ext'));
23
- expect(notPrevented).toBe(true);
24
- expect(window.location.pathname).toBe('/');
25
- });
26
-
27
- it('does not intercept modified (cmd/ctrl) clicks', () => {
28
- const { getByText } = render(<Link href="/about">go</Link>);
29
- const notPrevented = fireEvent.click(getByText('go'), { metaKey: true });
30
- expect(notPrevented).toBe(true);
31
- expect(window.location.pathname).toBe('/');
32
- });
33
-
34
- it('forwards anchor attributes (rel, target)', () => {
35
- const { getByText } = render(
36
- <Link
37
- href="https://x.com"
38
- target="_blank"
39
- rel="noopener noreferrer">
40
- x
41
- </Link>,
42
- );
43
- const a = getByText('x') as HTMLAnchorElement;
44
- expect(a.getAttribute('rel')).toBe('noopener noreferrer');
45
- expect(a.target).toBe('_blank');
46
- });
47
- });
1
+ // @vitest-environment jsdom
2
+ import { cleanup, fireEvent, render } from '@testing-library/react';
3
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
4
+
5
+ import { Link } from '../../src/client/navigation/Link';
6
+
7
+ afterEach(cleanup);
8
+ beforeEach(() => {
9
+ window.history.replaceState({}, '', '/');
10
+ });
11
+
12
+ describe('Link', () => {
13
+ it('intercepts a plain internal click (client nav, default prevented)', () => {
14
+ const { getByText } = render(<Link href="/about">go</Link>);
15
+ const prevented = !fireEvent.click(getByText('go'));
16
+ expect(prevented).toBe(true);
17
+ expect(window.location.pathname).toBe('/about');
18
+ });
19
+
20
+ it('does not intercept external links', () => {
21
+ const { getByText } = render(<Link href="https://example.com">ext</Link>);
22
+ const notPrevented = fireEvent.click(getByText('ext'));
23
+ expect(notPrevented).toBe(true);
24
+ expect(window.location.pathname).toBe('/');
25
+ });
26
+
27
+ it('does not intercept modified (cmd/ctrl) clicks', () => {
28
+ const { getByText } = render(<Link href="/about">go</Link>);
29
+ const notPrevented = fireEvent.click(getByText('go'), { metaKey: true });
30
+ expect(notPrevented).toBe(true);
31
+ expect(window.location.pathname).toBe('/');
32
+ });
33
+
34
+ it('forwards anchor attributes (rel, target)', () => {
35
+ const { getByText } = render(
36
+ <Link
37
+ href="https://x.com"
38
+ target="_blank"
39
+ rel="noopener noreferrer">
40
+ x
41
+ </Link>,
42
+ );
43
+ const a = getByText('x') as HTMLAnchorElement;
44
+ expect(a.getAttribute('rel')).toBe('noopener noreferrer');
45
+ expect(a.target).toBe('_blank');
46
+ });
47
+ });