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.
- package/.babelrc +13 -13
- package/.gitattributes +2 -2
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
- package/.github/ISSUE_TEMPLATE/bug_report.yml +90 -90
- package/.github/ISSUE_TEMPLATE/config.yml +8 -8
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
- package/.github/PULL_REQUEST_TEMPLATE.md +43 -43
- package/.github/changelog-config.json +45 -45
- package/.github/dependabot.yml +27 -27
- package/.github/workflows/ci.yml +191 -191
- package/.prettierrc.json +11 -11
- package/.vscode/settings.json +9 -9
- package/CHANGELOG.md +5 -5
- package/LICENSE +187 -187
- package/README.md +339 -315
- package/as-pect.asconfig.json +34 -34
- package/as-pect.config.js +65 -65
- package/assets/logo.svg +36 -36
- package/build/backend/.tsbuildinfo +1 -1
- package/build/cli/.tsbuildinfo +1 -1
- package/build/cli/index.js +0 -0
- package/build/client/.tsbuildinfo +1 -1
- package/build/client/dev/devtools.d.ts +6 -0
- package/build/client/dev/devtools.js +442 -0
- package/build/client/dev/error-overlay.d.ts +9 -0
- package/build/client/dev/error-overlay.js +19 -4
- package/build/client/navigation/prefetch.d.ts +1 -0
- package/build/client/navigation/prefetch.js +35 -0
- package/build/client/routing/Router.js +1 -1
- package/build/client/routing/hooks.js +6 -2
- package/build/client/routing/loader.d.ts +23 -0
- package/build/client/routing/loader.js +53 -7
- package/build/client/routing/mount.js +4 -3
- package/build/compiler/.tsbuildinfo +1 -1
- package/build/compiler/config.d.ts +16 -0
- package/build/compiler/config.js +7 -0
- package/build/compiler/docs.js +16 -16
- package/build/compiler/index.d.ts +2 -2
- package/build/compiler/index.js +1 -1
- package/build/compiler/plugin.js +156 -0
- package/build/compiler/prerender.d.ts +1 -0
- package/build/compiler/prerender.js +1 -1
- package/build/compiler/seo.d.ts +1 -1
- package/build/compiler/seo.js +5 -4
- package/build/compiler/ssg.js +32 -1
- package/build/io/.tsbuildinfo +1 -1
- package/build/logger/.tsbuildinfo +1 -1
- package/build/shared/.tsbuildinfo +1 -1
- package/eslint.config.js +48 -48
- package/examples/basic/client/404.tsx +11 -11
- package/examples/basic/client/components/.gitkeep +1 -1
- package/examples/basic/client/global-error.tsx +13 -13
- package/examples/basic/client/layout.tsx +25 -25
- package/examples/basic/client/public/images/.gitkeep +1 -1
- package/examples/basic/client/public/images/logo.svg +36 -36
- package/examples/basic/client/public/robots.txt +2 -2
- package/examples/basic/client/routes/docs/[...slug].tsx +12 -12
- package/examples/basic/client/routes/features/error/error.tsx +16 -16
- package/examples/basic/client/routes/features/template/b.tsx +14 -14
- package/examples/basic/client/routes/files/[[...slug]].tsx +21 -21
- package/examples/basic/client/routes/gallery/layout.tsx +13 -13
- package/examples/basic/client/routes/io.tsx +24 -24
- package/examples/basic/client/routes/loader-demo/loading.tsx +13 -13
- package/examples/basic/client/routes/search.tsx +61 -61
- package/examples/basic/client/toil.tsx +5 -5
- package/package.json +155 -148
- package/presets/eslint.js +88 -88
- package/presets/no-uint8array-tostring.js +200 -200
- package/presets/prettier.json +18 -18
- package/presets/tsconfig.json +37 -37
- package/src/backend/index.ts +160 -160
- package/src/cli/proc.ts +50 -50
- package/src/cli/updates.ts +69 -69
- package/src/cli/validate.ts +31 -31
- package/src/client/channel/channel.ts +146 -146
- package/src/client/components/Form.tsx +65 -65
- package/src/client/components/Script.tsx +113 -113
- package/src/client/components/Slot.tsx +21 -21
- package/src/client/dev/devtools.tsx +973 -0
- package/src/client/dev/error-overlay.tsx +30 -4
- package/src/client/head/head.ts +167 -167
- package/src/client/head/metadata.ts +112 -112
- package/src/client/index.ts +89 -89
- package/src/client/navigation/NavLink.tsx +86 -86
- package/src/client/navigation/navigation.ts +235 -235
- package/src/client/navigation/prefetch.ts +169 -130
- package/src/client/navigation/scroll.ts +53 -53
- package/src/client/routing/Router.tsx +8 -2
- package/src/client/routing/action.ts +122 -122
- package/src/client/routing/error-boundary.tsx +43 -43
- package/src/client/routing/hooks.ts +21 -6
- package/src/client/routing/loader.ts +325 -235
- package/src/client/routing/match.ts +47 -47
- package/src/client/routing/mount.tsx +54 -52
- package/src/client/routing/params-context.ts +10 -10
- package/src/client/routing/slot-context.ts +7 -7
- package/src/client/search/search.ts +189 -189
- package/src/client/search/use-page-search.ts +73 -73
- package/src/client/types.ts +73 -73
- package/src/compiler/config.ts +219 -182
- package/src/compiler/docs.ts +228 -228
- package/src/compiler/generate.ts +394 -394
- package/src/compiler/index.ts +64 -57
- package/src/compiler/pages.ts +70 -70
- package/src/compiler/plugin.ts +170 -2
- package/src/compiler/prerender.ts +156 -156
- package/src/compiler/seo.ts +397 -390
- package/src/compiler/ssg.ts +162 -126
- package/src/io/BinaryReader.ts +340 -340
- package/src/io/BinaryWriter.ts +385 -385
- package/src/io/FastMap.ts +127 -127
- package/src/io/index.ts +11 -11
- package/src/io/lengths.ts +14 -14
- package/src/io/types.ts +18 -18
- package/src/logger/index.ts +22 -22
- package/src/server/index.ts +10 -10
- package/src/server/main.ts +13 -13
- package/src/server/tsconfig.json +4 -4
- package/src/shared/index.ts +10 -10
- package/std/client/index.d.ts +15 -15
- package/std/client/package.json +3 -3
- package/test/assembly/example.spec.ts +7 -7
- package/test/channel.test.ts +21 -21
- package/test/dom/Link.test.tsx +47 -47
- package/test/dom/NavLink.test.tsx +37 -37
- package/test/dom/error-overlay.test.tsx +44 -44
- package/test/dom/loader.test.tsx +121 -121
- package/test/dom/navigation.test.ts +59 -59
- package/test/dom/revalidate.test.tsx +38 -38
- package/test/dom/route-head.test.tsx +78 -78
- package/test/dom/router-loading.test.tsx +44 -44
- package/test/dom/scroll.test.ts +56 -56
- package/test/dom/use-metadata.test.tsx +58 -58
- package/test/io.test.ts +93 -93
- package/test/navlink.test.ts +28 -28
- package/test/placeholder.test.ts +9 -9
- package/test/routes.test.ts +76 -76
- package/test/seo.test.ts +175 -164
- package/test/slot-layouts.test.ts +69 -69
- package/test/ssg.test.ts +36 -36
- package/test/update.test.ts +44 -44
- package/test/validate.test.ts +42 -42
- package/toil-routes.d.ts +7 -0
- package/toilconfig.json +30 -30
- package/tsconfig.backend.json +13 -13
- package/tsconfig.base.json +35 -35
- package/tsconfig.cli.json +13 -13
- package/tsconfig.client.json +14 -14
- package/tsconfig.compiler.json +13 -13
- package/tsconfig.io.json +12 -12
- package/tsconfig.json +22 -22
- package/tsconfig.logger.json +12 -12
- package/tsconfig.server.json +10 -10
- package/tsconfig.shared.json +12 -12
- package/vitest.config.ts +26 -26
- package/.idea/codeStyles/Project.xml +0 -54
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/prettier.xml +0 -7
- package/.idea/toiljs.iml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.toil/entry.tsx +0 -9
- package/.toil/index.html +0 -12
- package/.toil/routes.ts +0 -9
- package/build/cli/configure.d.ts +0 -16
- package/build/cli/configure.js +0 -272
- package/build/cli/create.d.ts +0 -16
- package/build/cli/create.js +0 -420
- package/build/cli/diagnostics.d.ts +0 -55
- package/build/cli/diagnostics.js +0 -333
- package/build/cli/doctor.d.ts +0 -6
- package/build/cli/doctor.js +0 -249
- package/build/cli/features.d.ts +0 -25
- package/build/cli/features.js +0 -107
- package/build/cli/index.d.ts +0 -2
- package/build/cli/proc.d.ts +0 -6
- package/build/cli/proc.js +0 -31
- package/build/cli/ui.d.ts +0 -9
- package/build/cli/ui.js +0 -75
- package/build/cli/update.d.ts +0 -7
- package/build/cli/update.js +0 -117
- package/build/cli/updates.d.ts +0 -10
- package/build/cli/updates.js +0 -45
- package/build/cli/validate.d.ts +0 -4
- package/build/cli/validate.js +0 -19
- package/build/client/Link.d.ts +0 -8
- package/build/client/Link.js +0 -44
- package/build/client/NavLink.d.ts +0 -14
- package/build/client/NavLink.js +0 -37
- package/build/client/Router.d.ts +0 -7
- package/build/client/Router.js +0 -55
- package/build/client/channel.d.ts +0 -23
- package/build/client/channel.js +0 -94
- package/build/client/error-boundary.d.ts +0 -16
- package/build/client/error-boundary.js +0 -19
- package/build/client/head.d.ts +0 -26
- package/build/client/head.js +0 -87
- package/build/client/hooks.d.ts +0 -17
- package/build/client/hooks.js +0 -48
- package/build/client/lazy.d.ts +0 -16
- package/build/client/lazy.js +0 -53
- package/build/client/match.d.ts +0 -2
- package/build/client/match.js +0 -32
- package/build/client/mount.d.ts +0 -2
- package/build/client/mount.js +0 -13
- package/build/client/navigation.d.ts +0 -13
- package/build/client/navigation.js +0 -97
- package/build/client/params-context.d.ts +0 -2
- package/build/client/params-context.js +0 -2
- package/build/client/prefetch.d.ts +0 -11
- package/build/client/prefetch.js +0 -100
- package/build/client/runtime.d.ts +0 -31
- package/build/client/runtime.js +0 -112
- package/build/client/scroll.d.ts +0 -8
- package/build/client/scroll.js +0 -36
- 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;
|
package/src/logger/index.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/server/index.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/server/main.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/server/tsconfig.json
CHANGED
|
@@ -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
|
+
}
|
package/src/shared/index.ts
CHANGED
|
@@ -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
|
+
}
|
package/std/client/index.d.ts
CHANGED
|
@@ -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 {};
|
package/std/client/package.json
CHANGED
|
@@ -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
|
+
});
|
package/test/channel.test.ts
CHANGED
|
@@ -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
|
+
});
|
package/test/dom/Link.test.tsx
CHANGED
|
@@ -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
|
+
});
|