toiljs 0.0.15 → 0.0.19
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 +116 -5
- package/LICENSE +187 -187
- package/README.md +524 -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/backend/index.d.ts +1 -0
- package/build/backend/index.js +20 -1
- package/build/cli/.tsbuildinfo +1 -1
- package/build/cli/index.js +1320 -696
- package/build/client/.tsbuildinfo +1 -1
- package/build/client/dev/devtools.d.ts +6 -0
- package/build/client/dev/devtools.js +479 -0
- package/build/client/dev/error-overlay.d.ts +9 -0
- package/build/client/dev/error-overlay.js +19 -4
- package/build/client/errors.d.ts +1 -0
- package/build/client/errors.js +3 -0
- package/build/client/index.d.ts +2 -0
- package/build/client/index.js +2 -0
- 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/client/rpc.d.ts +1 -0
- package/build/client/rpc.js +37 -0
- package/build/compiler/.tsbuildinfo +1 -1
- package/build/compiler/config.d.ts +16 -0
- package/build/compiler/config.js +9 -0
- package/build/compiler/docs.js +78 -21
- package/build/compiler/generate.js +5 -4
- package/build/compiler/index.d.ts +3 -2
- package/build/compiler/index.js +2 -2
- package/build/compiler/plugin.js +228 -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 +20 -5
- package/build/compiler/ssg.js +39 -2
- package/build/compiler/vite.js +25 -0
- package/build/io/.tsbuildinfo +1 -1
- package/build/io/codec.d.ts +54 -0
- package/build/io/codec.js +143 -0
- package/build/io/index.d.ts +1 -2
- package/build/io/index.js +1 -2
- 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/index.tsx +1 -1
- 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 +23 -24
- package/examples/basic/client/routes/loader-demo/loading.tsx +13 -13
- package/examples/basic/client/routes/rest.tsx +74 -0
- package/examples/basic/client/routes/rpc.tsx +43 -0
- package/examples/basic/client/routes/search.tsx +61 -61
- package/examples/basic/client/toil.tsx +5 -5
- package/package.json +167 -148
- package/presets/eslint.js +88 -88
- package/presets/no-uint8array-tostring.js +200 -200
- package/presets/prettier-plugin.js +51 -0
- package/presets/prettier.json +19 -18
- package/presets/tsconfig.json +37 -37
- package/server/runtime/README.md +97 -0
- package/server/runtime/abort/abort.ts +27 -0
- package/server/runtime/env/Server.ts +61 -0
- package/server/runtime/envelope.ts +191 -0
- package/server/runtime/exports/index.ts +52 -0
- package/server/runtime/handlers/ToilHandler.ts +34 -0
- package/server/runtime/index.ts +26 -0
- package/server/runtime/lang/Potential.ts +5 -0
- package/server/runtime/memory.ts +81 -0
- package/server/runtime/request.ts +55 -0
- package/server/runtime/response.ts +86 -0
- package/server/runtime/rest/Rest.ts +39 -0
- package/server/runtime/rest/RestHandler.ts +20 -0
- package/server/runtime/rest/RouteContext.ts +82 -0
- package/server/runtime/rest/match.ts +48 -0
- package/server/runtime/tsconfig.json +7 -0
- package/src/backend/index.ts +202 -160
- package/src/cli/create.ts +15 -5
- package/src/cli/diagnostics.ts +81 -0
- package/src/cli/doctor.ts +384 -7
- package/src/cli/index.ts +11 -2
- 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 +1018 -0
- package/src/client/dev/error-overlay.tsx +30 -4
- package/src/client/errors.ts +11 -0
- package/src/client/head/head.ts +167 -167
- package/src/client/head/metadata.ts +112 -112
- package/src/client/index.ts +91 -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/rpc.ts +64 -0
- 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 +221 -182
- package/src/compiler/docs.ts +285 -228
- package/src/compiler/generate.ts +395 -394
- package/src/compiler/index.ts +66 -57
- package/src/compiler/pages.ts +70 -70
- package/src/compiler/plugin.ts +258 -2
- package/src/compiler/prerender.ts +156 -156
- package/src/compiler/seo.ts +417 -390
- package/src/compiler/ssg.ts +171 -126
- package/src/compiler/vite.ts +34 -0
- package/src/io/FastMap.ts +151 -127
- package/src/io/FastSet.ts +15 -1
- package/src/io/codec.ts +217 -0
- package/src/io/index.ts +10 -11
- package/src/io/lengths.ts +14 -14
- package/src/io/types.ts +19 -18
- package/src/logger/index.ts +22 -22
- 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 +17 -7
- package/test/channel.test.ts +21 -21
- package/test/doctor.test.ts +65 -0
- 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/errors.test.ts +21 -0
- package/test/io.test.ts +117 -93
- package/test/navlink.test.ts +28 -28
- package/test/placeholder.test.ts +9 -9
- package/test/prettier-plugin.test.ts +46 -0
- package/test/routes.test.ts +76 -76
- package/test/rpc.test.ts +50 -0
- 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/tests/data-parity/generated-parity.ts +99 -0
- package/tests/data-parity/parity.ts +80 -0
- package/tests/data-parity/spec.ts +46 -0
- package/toil-routes.d.ts +7 -0
- 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/build/io/BinaryReader.d.ts +0 -44
- package/build/io/BinaryReader.js +0 -244
- package/build/io/BinaryWriter.d.ts +0 -44
- package/build/io/BinaryWriter.js +0 -297
- package/build/server/release.wasm +0 -0
- package/build/server/release.wat +0 -9
- package/src/io/BinaryReader.ts +0 -340
- package/src/io/BinaryWriter.ts +0 -385
- package/src/server/index.ts +0 -10
- package/src/server/main.ts +0 -13
- package/src/server/tsconfig.json +0 -4
- package/toil-env.d.ts +0 -16
- package/toilconfig.json +0 -30
package/vitest.config.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import react from '@vitejs/plugin-react';
|
|
2
|
-
import { configDefaults, defineConfig } from 'vitest/config';
|
|
3
|
-
|
|
4
|
-
export default defineConfig({
|
|
5
|
-
plugins: [react()],
|
|
6
|
-
test: {
|
|
7
|
-
globals: true,
|
|
8
|
-
environment: 'node',
|
|
9
|
-
include: ['test/**/*.test.ts', 'test/**/*.test.tsx', 'test/**/*.spec.ts'],
|
|
10
|
-
// test/assembly holds toilscript specs run by as-pect, not vitest.
|
|
11
|
-
exclude: [...configDefaults.exclude, 'test/assembly/**'],
|
|
12
|
-
coverage: {
|
|
13
|
-
provider: 'v8',
|
|
14
|
-
reporter: ['text', 'json', 'html'],
|
|
15
|
-
exclude: [
|
|
16
|
-
'node_modules/',
|
|
17
|
-
'build/',
|
|
18
|
-
'browser/',
|
|
19
|
-
'test/',
|
|
20
|
-
'**/*.d.ts',
|
|
21
|
-
'**/*.config.*',
|
|
22
|
-
'**/mockData',
|
|
23
|
-
],
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
});
|
|
1
|
+
import react from '@vitejs/plugin-react';
|
|
2
|
+
import { configDefaults, defineConfig } from 'vitest/config';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [react()],
|
|
6
|
+
test: {
|
|
7
|
+
globals: true,
|
|
8
|
+
environment: 'node',
|
|
9
|
+
include: ['test/**/*.test.ts', 'test/**/*.test.tsx', 'test/**/*.spec.ts'],
|
|
10
|
+
// test/assembly holds toilscript specs run by as-pect, not vitest.
|
|
11
|
+
exclude: [...configDefaults.exclude, 'test/assembly/**'],
|
|
12
|
+
coverage: {
|
|
13
|
+
provider: 'v8',
|
|
14
|
+
reporter: ['text', 'json', 'html'],
|
|
15
|
+
exclude: [
|
|
16
|
+
'node_modules/',
|
|
17
|
+
'build/',
|
|
18
|
+
'browser/',
|
|
19
|
+
'test/',
|
|
20
|
+
'**/*.d.ts',
|
|
21
|
+
'**/*.config.*',
|
|
22
|
+
'**/mockData',
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
<component name="ProjectCodeStyleConfiguration">
|
|
2
|
-
<code_scheme name="Project" version="173">
|
|
3
|
-
<HTMLCodeStyleSettings>
|
|
4
|
-
<option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
|
|
5
|
-
</HTMLCodeStyleSettings>
|
|
6
|
-
<JSCodeStyleSettings version="0">
|
|
7
|
-
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
|
8
|
-
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
|
|
9
|
-
<option name="USE_DOUBLE_QUOTES" value="false" />
|
|
10
|
-
<option name="FORCE_QUOTE_STYlE" value="true" />
|
|
11
|
-
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
|
|
12
|
-
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
|
|
13
|
-
<option name="SPACES_WITHIN_IMPORTS" value="true" />
|
|
14
|
-
</JSCodeStyleSettings>
|
|
15
|
-
<TypeScriptCodeStyleSettings version="0">
|
|
16
|
-
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
|
17
|
-
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
|
|
18
|
-
<option name="USE_DOUBLE_QUOTES" value="false" />
|
|
19
|
-
<option name="FORCE_QUOTE_STYlE" value="true" />
|
|
20
|
-
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
|
|
21
|
-
<option name="USE_EXPLICIT_JS_EXTENSION" value="ALWAYS_JS" />
|
|
22
|
-
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
|
|
23
|
-
<option name="SPACES_WITHIN_IMPORTS" value="true" />
|
|
24
|
-
</TypeScriptCodeStyleSettings>
|
|
25
|
-
<VueCodeStyleSettings>
|
|
26
|
-
<option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
|
|
27
|
-
<option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
|
|
28
|
-
</VueCodeStyleSettings>
|
|
29
|
-
<codeStyleSettings language="HTML">
|
|
30
|
-
<option name="SOFT_MARGINS" value="100" />
|
|
31
|
-
<indentOptions>
|
|
32
|
-
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
|
33
|
-
</indentOptions>
|
|
34
|
-
</codeStyleSettings>
|
|
35
|
-
<codeStyleSettings language="JSON">
|
|
36
|
-
<indentOptions>
|
|
37
|
-
<option name="INDENT_SIZE" value="4" />
|
|
38
|
-
</indentOptions>
|
|
39
|
-
</codeStyleSettings>
|
|
40
|
-
<codeStyleSettings language="JavaScript">
|
|
41
|
-
<option name="SOFT_MARGINS" value="100" />
|
|
42
|
-
</codeStyleSettings>
|
|
43
|
-
<codeStyleSettings language="TypeScript">
|
|
44
|
-
<option name="SOFT_MARGINS" value="100" />
|
|
45
|
-
</codeStyleSettings>
|
|
46
|
-
<codeStyleSettings language="Vue">
|
|
47
|
-
<option name="SOFT_MARGINS" value="100" />
|
|
48
|
-
<indentOptions>
|
|
49
|
-
<option name="INDENT_SIZE" value="4" />
|
|
50
|
-
<option name="TAB_SIZE" value="4" />
|
|
51
|
-
</indentOptions>
|
|
52
|
-
</codeStyleSettings>
|
|
53
|
-
</code_scheme>
|
|
54
|
-
</component>
|
package/.idea/modules.xml
DELETED
package/.idea/prettier.xml
DELETED
package/.idea/toiljs.iml
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="WEB_MODULE" version="4">
|
|
3
|
-
<component name="NewModuleRootManager">
|
|
4
|
-
<content url="file://$MODULE_DIR$" />
|
|
5
|
-
<orderEntry type="inheritedJdk" />
|
|
6
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
7
|
-
</component>
|
|
8
|
-
</module>
|
package/.idea/vcs.xml
DELETED
package/.toil/entry.tsx
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// AUTO-GENERATED by toil — do not edit.
|
|
2
|
-
import { mount } from 'toiljs/client';
|
|
3
|
-
import { BinaryWriter, BinaryReader, FastMap, FastSet } from 'toiljs/io';
|
|
4
|
-
import { routes, layout, notFound } from './routes';
|
|
5
|
-
|
|
6
|
-
// Expose toiljs IO as native globals (typed via ./toil-env.d.ts).
|
|
7
|
-
Object.assign(globalThis, { BinaryWriter, BinaryReader, FastMap, FastSet });
|
|
8
|
-
|
|
9
|
-
mount(routes, layout, notFound);
|
package/.toil/index.html
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<title>Toil App</title>
|
|
7
|
-
</head>
|
|
8
|
-
<body>
|
|
9
|
-
<div id="root"></div>
|
|
10
|
-
<script type="module" src="./entry.tsx"></script>
|
|
11
|
-
</body>
|
|
12
|
-
</html>
|
package/.toil/routes.ts
DELETED
package/build/cli/configure.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { type Preprocessor, type StyleFeatures } from './features.js';
|
|
2
|
-
export interface ConfigureOptions {
|
|
3
|
-
readonly root?: string;
|
|
4
|
-
readonly cwd: string;
|
|
5
|
-
readonly preprocessor?: Preprocessor;
|
|
6
|
-
readonly tailwind?: boolean;
|
|
7
|
-
readonly images?: boolean;
|
|
8
|
-
readonly install?: boolean;
|
|
9
|
-
}
|
|
10
|
-
interface PackageJson {
|
|
11
|
-
dependencies?: Record<string, string>;
|
|
12
|
-
devDependencies?: Record<string, string>;
|
|
13
|
-
}
|
|
14
|
-
export declare function applyConfigure(clientDir: string, pkgPath: string, pkg: PackageJson, from: StyleFeatures, to: StyleFeatures): Promise<void>;
|
|
15
|
-
export declare function runConfigure(opts: ConfigureOptions): Promise<void>;
|
|
16
|
-
export {};
|
package/build/cli/configure.js
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { cancel, confirm, intro, isCancel, note, outro, select, spinner } from '@clack/prompts';
|
|
4
|
-
import { loadConfig } from 'toiljs/compiler';
|
|
5
|
-
import pc from 'picocolors';
|
|
6
|
-
import { defaultConfigSource, detectPreprocessor, detectTailwind, packageDiff, PKG_VERSION, preprocessorForExt, PREPROCESSORS, setConfigImages, setStyleImports, styleEntry, TAILWIND_CSS, TAILWIND_ENTRY, } from './features.js';
|
|
7
|
-
import { run } from './proc.js';
|
|
8
|
-
import { accent, dim } from './ui.js';
|
|
9
|
-
const CONFIG_FILES = [
|
|
10
|
-
'toil.config.ts',
|
|
11
|
-
'toil.config.mts',
|
|
12
|
-
'toil.config.js',
|
|
13
|
-
'toil.config.mjs',
|
|
14
|
-
'toiljs.config.ts',
|
|
15
|
-
'toiljs.config.mts',
|
|
16
|
-
'toiljs.config.js',
|
|
17
|
-
'toiljs.config.mjs',
|
|
18
|
-
];
|
|
19
|
-
async function readConfigFile(root) {
|
|
20
|
-
for (const name of CONFIG_FILES) {
|
|
21
|
-
const p = path.join(root, name);
|
|
22
|
-
try {
|
|
23
|
-
return { path: p, source: await fs.readFile(p, 'utf8') };
|
|
24
|
-
}
|
|
25
|
-
catch { }
|
|
26
|
-
}
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
async function writeImagesFlag(root, enabled) {
|
|
30
|
-
const existing = await readConfigFile(root);
|
|
31
|
-
if (!existing) {
|
|
32
|
-
await fs.writeFile(path.join(root, 'toil.config.ts'), defaultConfigSource(enabled), 'utf8');
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
const next = setConfigImages(existing.source, enabled);
|
|
36
|
-
if (next === null)
|
|
37
|
-
return false;
|
|
38
|
-
await fs.writeFile(existing.path, next, 'utf8');
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
async function resolveImages(root) {
|
|
42
|
-
try {
|
|
43
|
-
return (await loadConfig({ root })).images;
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
async function resolveClientDir(root) {
|
|
50
|
-
try {
|
|
51
|
-
const cfg = await loadConfig({ root });
|
|
52
|
-
return cfg.clientAbsDir;
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
return path.join(root, 'client');
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
const PREPROCESSOR_LABEL = {
|
|
59
|
-
css: 'Plain CSS',
|
|
60
|
-
sass: 'Sass (SCSS)',
|
|
61
|
-
less: 'Less',
|
|
62
|
-
stylus: 'Stylus',
|
|
63
|
-
};
|
|
64
|
-
function bail(value) {
|
|
65
|
-
if (isCancel(value)) {
|
|
66
|
-
cancel('Configuration cancelled.');
|
|
67
|
-
process.exit(0);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async function detectStylesheet(clientDir) {
|
|
71
|
-
for (const p of PREPROCESSORS) {
|
|
72
|
-
try {
|
|
73
|
-
await fs.access(path.join(clientDir, styleEntry(p)));
|
|
74
|
-
return p;
|
|
75
|
-
}
|
|
76
|
-
catch { }
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
await fs.access(path.join(clientDir, 'styles/main.sass'));
|
|
80
|
-
return preprocessorForExt('sass');
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
async function findMainStylesheet(clientDir) {
|
|
87
|
-
for (const ext of ['css', 'scss', 'sass', 'less', 'styl']) {
|
|
88
|
-
const p = path.join(clientDir, 'styles', `main.${ext}`);
|
|
89
|
-
try {
|
|
90
|
-
await fs.access(p);
|
|
91
|
-
return p;
|
|
92
|
-
}
|
|
93
|
-
catch { }
|
|
94
|
-
}
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
async function detectPackageManager(root) {
|
|
98
|
-
const lock = [
|
|
99
|
-
['pnpm-lock.yaml', 'pnpm'],
|
|
100
|
-
['yarn.lock', 'yarn'],
|
|
101
|
-
['bun.lockb', 'bun'],
|
|
102
|
-
];
|
|
103
|
-
for (const [file, pm] of lock) {
|
|
104
|
-
try {
|
|
105
|
-
await fs.access(path.join(root, file));
|
|
106
|
-
return pm;
|
|
107
|
-
}
|
|
108
|
-
catch { }
|
|
109
|
-
}
|
|
110
|
-
return 'npm';
|
|
111
|
-
}
|
|
112
|
-
async function applyStyleFiles(clientDir, from, to) {
|
|
113
|
-
if (from.preprocessor !== to.preprocessor) {
|
|
114
|
-
const newPath = path.join(clientDir, styleEntry(to.preprocessor));
|
|
115
|
-
await fs.mkdir(path.dirname(newPath), { recursive: true });
|
|
116
|
-
const existing = await findMainStylesheet(clientDir);
|
|
117
|
-
if (existing && path.resolve(existing) !== path.resolve(newPath)) {
|
|
118
|
-
await fs.rename(existing, newPath);
|
|
119
|
-
}
|
|
120
|
-
else if (!existing) {
|
|
121
|
-
await fs.writeFile(newPath, '', 'utf8');
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
const tailwindPath = path.join(clientDir, TAILWIND_ENTRY);
|
|
125
|
-
if (to.tailwind && !from.tailwind) {
|
|
126
|
-
await fs.mkdir(path.dirname(tailwindPath), { recursive: true });
|
|
127
|
-
await fs.writeFile(tailwindPath, TAILWIND_CSS, 'utf8');
|
|
128
|
-
}
|
|
129
|
-
else if (!to.tailwind && from.tailwind) {
|
|
130
|
-
await fs.rm(tailwindPath, { force: true });
|
|
131
|
-
}
|
|
132
|
-
for (const entry of ['toil.tsx', 'toil.jsx']) {
|
|
133
|
-
const entryPath = path.join(clientDir, entry);
|
|
134
|
-
try {
|
|
135
|
-
const source = await fs.readFile(entryPath, 'utf8');
|
|
136
|
-
await fs.writeFile(entryPath, setStyleImports(source, to), 'utf8');
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
catch { }
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
export async function applyConfigure(clientDir, pkgPath, pkg, from, to) {
|
|
143
|
-
await applyStyleFiles(clientDir, from, to);
|
|
144
|
-
await applyPackages(pkgPath, pkg, from, to);
|
|
145
|
-
}
|
|
146
|
-
async function applyPackages(pkgPath, pkg, from, to) {
|
|
147
|
-
const { add, remove } = packageDiff(from, to);
|
|
148
|
-
const dev = { ...pkg.devDependencies };
|
|
149
|
-
const deps = { ...pkg.dependencies };
|
|
150
|
-
for (const name of add)
|
|
151
|
-
dev[name] = PKG_VERSION[name] ?? 'latest';
|
|
152
|
-
for (const name of remove) {
|
|
153
|
-
delete dev[name];
|
|
154
|
-
delete deps[name];
|
|
155
|
-
}
|
|
156
|
-
const sortedDev = Object.fromEntries(Object.entries(dev).sort(([a], [b]) => a.localeCompare(b)));
|
|
157
|
-
const next = { ...pkg, devDependencies: sortedDev };
|
|
158
|
-
if (Object.keys(deps).length)
|
|
159
|
-
next.dependencies = deps;
|
|
160
|
-
else
|
|
161
|
-
delete next.dependencies;
|
|
162
|
-
await fs.writeFile(pkgPath, JSON.stringify(next, null, 4) + '\n', 'utf8');
|
|
163
|
-
}
|
|
164
|
-
function describe(from, to) {
|
|
165
|
-
const lines = [];
|
|
166
|
-
if (from.preprocessor !== to.preprocessor) {
|
|
167
|
-
lines.push(`preprocessor: ${PREPROCESSOR_LABEL[from.preprocessor]} → ${PREPROCESSOR_LABEL[to.preprocessor]}`);
|
|
168
|
-
}
|
|
169
|
-
if (from.tailwind !== to.tailwind) {
|
|
170
|
-
lines.push(`Tailwind: ${from.tailwind ? 'on' : 'off'} → ${to.tailwind ? 'on' : 'off'}`);
|
|
171
|
-
}
|
|
172
|
-
const { add, remove } = packageDiff(from, to);
|
|
173
|
-
if (add.length)
|
|
174
|
-
lines.push(`+ ${add.join(', ')}`);
|
|
175
|
-
if (remove.length)
|
|
176
|
-
lines.push(`- ${remove.join(', ')}`);
|
|
177
|
-
return lines.map((l) => dim(' ') + l).join('\n');
|
|
178
|
-
}
|
|
179
|
-
export async function runConfigure(opts) {
|
|
180
|
-
intro(accent(' toiljs configure '));
|
|
181
|
-
const root = path.resolve(opts.root ?? opts.cwd);
|
|
182
|
-
const pkgPath = path.join(root, 'package.json');
|
|
183
|
-
let pkg;
|
|
184
|
-
try {
|
|
185
|
-
pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'));
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
cancel(`No package.json in ${pc.cyan(root)}, run this inside a toiljs project.`);
|
|
189
|
-
process.exit(1);
|
|
190
|
-
}
|
|
191
|
-
const clientAbsDir = await resolveClientDir(root);
|
|
192
|
-
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
193
|
-
const current = {
|
|
194
|
-
preprocessor: (await detectStylesheet(clientAbsDir)) ?? detectPreprocessor(deps),
|
|
195
|
-
tailwind: detectTailwind(deps),
|
|
196
|
-
};
|
|
197
|
-
const currentImages = await resolveImages(root);
|
|
198
|
-
const nonInteractive = opts.preprocessor !== undefined || opts.tailwind !== undefined || opts.images !== undefined;
|
|
199
|
-
let target;
|
|
200
|
-
let targetImages;
|
|
201
|
-
if (nonInteractive) {
|
|
202
|
-
target = {
|
|
203
|
-
preprocessor: opts.preprocessor ?? current.preprocessor,
|
|
204
|
-
tailwind: opts.tailwind ?? current.tailwind,
|
|
205
|
-
};
|
|
206
|
-
targetImages = opts.images ?? currentImages;
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
const ppChoice = await select({
|
|
210
|
-
message: 'CSS preprocessor',
|
|
211
|
-
options: PREPROCESSORS.map((value) => ({ value, label: PREPROCESSOR_LABEL[value] })),
|
|
212
|
-
initialValue: current.preprocessor,
|
|
213
|
-
});
|
|
214
|
-
bail(ppChoice);
|
|
215
|
-
const twChoice = await confirm({
|
|
216
|
-
message: 'Use Tailwind CSS?',
|
|
217
|
-
initialValue: current.tailwind,
|
|
218
|
-
});
|
|
219
|
-
bail(twChoice);
|
|
220
|
-
const imChoice = await confirm({
|
|
221
|
-
message: 'Optimize images at build time?',
|
|
222
|
-
initialValue: currentImages,
|
|
223
|
-
});
|
|
224
|
-
bail(imChoice);
|
|
225
|
-
target = { preprocessor: ppChoice, tailwind: twChoice };
|
|
226
|
-
targetImages = imChoice;
|
|
227
|
-
}
|
|
228
|
-
const styleChanged = target.preprocessor !== current.preprocessor || target.tailwind !== current.tailwind;
|
|
229
|
-
const imagesChanged = targetImages !== currentImages;
|
|
230
|
-
if (!styleChanged && !imagesChanged) {
|
|
231
|
-
outro('No changes, your setup is already up to date.');
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
const s = spinner();
|
|
235
|
-
s.start('Updating project files');
|
|
236
|
-
if (styleChanged)
|
|
237
|
-
await applyConfigure(clientAbsDir, pkgPath, pkg, current, target);
|
|
238
|
-
let imagesWarning = '';
|
|
239
|
-
if (imagesChanged && !(await writeImagesFlag(root, targetImages))) {
|
|
240
|
-
imagesWarning = pc.yellow(' Could not edit toil.config automatically, set `client.images` by hand.');
|
|
241
|
-
}
|
|
242
|
-
s.stop('Updated project files');
|
|
243
|
-
if (styleChanged) {
|
|
244
|
-
const pm = await detectPackageManager(root);
|
|
245
|
-
if (opts.install === false) {
|
|
246
|
-
note(`${pc.cyan(`${pm} install`)} to sync the dependency changes.`, 'Next step');
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
const i = spinner();
|
|
250
|
-
i.start(`Syncing dependencies with ${pm}`);
|
|
251
|
-
try {
|
|
252
|
-
await run(pm, ['install'], root);
|
|
253
|
-
i.stop('Dependencies synced');
|
|
254
|
-
}
|
|
255
|
-
catch {
|
|
256
|
-
i.stop(pc.yellow(`Could not run \`${pm} install\`, run it yourself to finish`));
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
const summary = [
|
|
261
|
-
styleChanged ? describe(current, target) : '',
|
|
262
|
-
imagesChanged
|
|
263
|
-
? dim(' ') +
|
|
264
|
-
`image optimization: ${currentImages ? 'on' : 'off'} → ${targetImages ? 'on' : 'off'}`
|
|
265
|
-
: '',
|
|
266
|
-
imagesWarning,
|
|
267
|
-
]
|
|
268
|
-
.filter(Boolean)
|
|
269
|
-
.join('\n');
|
|
270
|
-
note(summary, 'Updated');
|
|
271
|
-
outro(`Reconfigured, restart \`${accent('toiljs dev')}\` to pick up the changes.`);
|
|
272
|
-
}
|
package/build/cli/create.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { type Preprocessor } from './features.js';
|
|
2
|
-
export type Template = 'app' | 'minimal';
|
|
3
|
-
export interface CreateOptions {
|
|
4
|
-
readonly name?: string;
|
|
5
|
-
readonly template?: Template;
|
|
6
|
-
readonly preprocessor?: Preprocessor;
|
|
7
|
-
readonly tailwind?: boolean;
|
|
8
|
-
readonly ai?: boolean;
|
|
9
|
-
readonly images?: boolean;
|
|
10
|
-
readonly install?: boolean;
|
|
11
|
-
readonly git?: boolean;
|
|
12
|
-
readonly pm?: string;
|
|
13
|
-
readonly yes?: boolean;
|
|
14
|
-
readonly cwd: string;
|
|
15
|
-
}
|
|
16
|
-
export declare function runCreate(opts: CreateOptions): Promise<void>;
|