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.
Files changed (273) 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 +116 -5
  14. package/LICENSE +187 -187
  15. package/README.md +524 -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/backend/index.d.ts +1 -0
  21. package/build/backend/index.js +20 -1
  22. package/build/cli/.tsbuildinfo +1 -1
  23. package/build/cli/index.js +1320 -696
  24. package/build/client/.tsbuildinfo +1 -1
  25. package/build/client/dev/devtools.d.ts +6 -0
  26. package/build/client/dev/devtools.js +479 -0
  27. package/build/client/dev/error-overlay.d.ts +9 -0
  28. package/build/client/dev/error-overlay.js +19 -4
  29. package/build/client/errors.d.ts +1 -0
  30. package/build/client/errors.js +3 -0
  31. package/build/client/index.d.ts +2 -0
  32. package/build/client/index.js +2 -0
  33. package/build/client/navigation/prefetch.d.ts +1 -0
  34. package/build/client/navigation/prefetch.js +35 -0
  35. package/build/client/routing/Router.js +1 -1
  36. package/build/client/routing/hooks.js +6 -2
  37. package/build/client/routing/loader.d.ts +23 -0
  38. package/build/client/routing/loader.js +53 -7
  39. package/build/client/routing/mount.js +4 -3
  40. package/build/client/rpc.d.ts +1 -0
  41. package/build/client/rpc.js +37 -0
  42. package/build/compiler/.tsbuildinfo +1 -1
  43. package/build/compiler/config.d.ts +16 -0
  44. package/build/compiler/config.js +9 -0
  45. package/build/compiler/docs.js +78 -21
  46. package/build/compiler/generate.js +5 -4
  47. package/build/compiler/index.d.ts +3 -2
  48. package/build/compiler/index.js +2 -2
  49. package/build/compiler/plugin.js +228 -0
  50. package/build/compiler/prerender.d.ts +1 -0
  51. package/build/compiler/prerender.js +1 -1
  52. package/build/compiler/seo.d.ts +1 -1
  53. package/build/compiler/seo.js +20 -5
  54. package/build/compiler/ssg.js +39 -2
  55. package/build/compiler/vite.js +25 -0
  56. package/build/io/.tsbuildinfo +1 -1
  57. package/build/io/codec.d.ts +54 -0
  58. package/build/io/codec.js +143 -0
  59. package/build/io/index.d.ts +1 -2
  60. package/build/io/index.js +1 -2
  61. package/build/logger/.tsbuildinfo +1 -1
  62. package/build/shared/.tsbuildinfo +1 -1
  63. package/eslint.config.js +48 -48
  64. package/examples/basic/client/404.tsx +11 -11
  65. package/examples/basic/client/components/.gitkeep +1 -1
  66. package/examples/basic/client/global-error.tsx +13 -13
  67. package/examples/basic/client/layout.tsx +25 -25
  68. package/examples/basic/client/public/images/.gitkeep +1 -1
  69. package/examples/basic/client/public/images/logo.svg +36 -36
  70. package/examples/basic/client/public/robots.txt +2 -2
  71. package/examples/basic/client/routes/docs/[...slug].tsx +12 -12
  72. package/examples/basic/client/routes/features/error/error.tsx +16 -16
  73. package/examples/basic/client/routes/features/index.tsx +1 -1
  74. package/examples/basic/client/routes/features/template/b.tsx +14 -14
  75. package/examples/basic/client/routes/files/[[...slug]].tsx +21 -21
  76. package/examples/basic/client/routes/gallery/layout.tsx +13 -13
  77. package/examples/basic/client/routes/io.tsx +23 -24
  78. package/examples/basic/client/routes/loader-demo/loading.tsx +13 -13
  79. package/examples/basic/client/routes/rest.tsx +74 -0
  80. package/examples/basic/client/routes/rpc.tsx +43 -0
  81. package/examples/basic/client/routes/search.tsx +61 -61
  82. package/examples/basic/client/toil.tsx +5 -5
  83. package/package.json +167 -148
  84. package/presets/eslint.js +88 -88
  85. package/presets/no-uint8array-tostring.js +200 -200
  86. package/presets/prettier-plugin.js +51 -0
  87. package/presets/prettier.json +19 -18
  88. package/presets/tsconfig.json +37 -37
  89. package/server/runtime/README.md +97 -0
  90. package/server/runtime/abort/abort.ts +27 -0
  91. package/server/runtime/env/Server.ts +61 -0
  92. package/server/runtime/envelope.ts +191 -0
  93. package/server/runtime/exports/index.ts +52 -0
  94. package/server/runtime/handlers/ToilHandler.ts +34 -0
  95. package/server/runtime/index.ts +26 -0
  96. package/server/runtime/lang/Potential.ts +5 -0
  97. package/server/runtime/memory.ts +81 -0
  98. package/server/runtime/request.ts +55 -0
  99. package/server/runtime/response.ts +86 -0
  100. package/server/runtime/rest/Rest.ts +39 -0
  101. package/server/runtime/rest/RestHandler.ts +20 -0
  102. package/server/runtime/rest/RouteContext.ts +82 -0
  103. package/server/runtime/rest/match.ts +48 -0
  104. package/server/runtime/tsconfig.json +7 -0
  105. package/src/backend/index.ts +202 -160
  106. package/src/cli/create.ts +15 -5
  107. package/src/cli/diagnostics.ts +81 -0
  108. package/src/cli/doctor.ts +384 -7
  109. package/src/cli/index.ts +11 -2
  110. package/src/cli/proc.ts +50 -50
  111. package/src/cli/updates.ts +69 -69
  112. package/src/cli/validate.ts +31 -31
  113. package/src/client/channel/channel.ts +146 -146
  114. package/src/client/components/Form.tsx +65 -65
  115. package/src/client/components/Script.tsx +113 -113
  116. package/src/client/components/Slot.tsx +21 -21
  117. package/src/client/dev/devtools.tsx +1018 -0
  118. package/src/client/dev/error-overlay.tsx +30 -4
  119. package/src/client/errors.ts +11 -0
  120. package/src/client/head/head.ts +167 -167
  121. package/src/client/head/metadata.ts +112 -112
  122. package/src/client/index.ts +91 -89
  123. package/src/client/navigation/NavLink.tsx +86 -86
  124. package/src/client/navigation/navigation.ts +235 -235
  125. package/src/client/navigation/prefetch.ts +169 -130
  126. package/src/client/navigation/scroll.ts +53 -53
  127. package/src/client/routing/Router.tsx +8 -2
  128. package/src/client/routing/action.ts +122 -122
  129. package/src/client/routing/error-boundary.tsx +43 -43
  130. package/src/client/routing/hooks.ts +21 -6
  131. package/src/client/routing/loader.ts +325 -235
  132. package/src/client/routing/match.ts +47 -47
  133. package/src/client/routing/mount.tsx +54 -52
  134. package/src/client/routing/params-context.ts +10 -10
  135. package/src/client/routing/slot-context.ts +7 -7
  136. package/src/client/rpc.ts +64 -0
  137. package/src/client/search/search.ts +189 -189
  138. package/src/client/search/use-page-search.ts +73 -73
  139. package/src/client/types.ts +73 -73
  140. package/src/compiler/config.ts +221 -182
  141. package/src/compiler/docs.ts +285 -228
  142. package/src/compiler/generate.ts +395 -394
  143. package/src/compiler/index.ts +66 -57
  144. package/src/compiler/pages.ts +70 -70
  145. package/src/compiler/plugin.ts +258 -2
  146. package/src/compiler/prerender.ts +156 -156
  147. package/src/compiler/seo.ts +417 -390
  148. package/src/compiler/ssg.ts +171 -126
  149. package/src/compiler/vite.ts +34 -0
  150. package/src/io/FastMap.ts +151 -127
  151. package/src/io/FastSet.ts +15 -1
  152. package/src/io/codec.ts +217 -0
  153. package/src/io/index.ts +10 -11
  154. package/src/io/lengths.ts +14 -14
  155. package/src/io/types.ts +19 -18
  156. package/src/logger/index.ts +22 -22
  157. package/src/shared/index.ts +10 -10
  158. package/std/client/index.d.ts +15 -15
  159. package/std/client/package.json +3 -3
  160. package/test/assembly/example.spec.ts +17 -7
  161. package/test/channel.test.ts +21 -21
  162. package/test/doctor.test.ts +65 -0
  163. package/test/dom/Link.test.tsx +47 -47
  164. package/test/dom/NavLink.test.tsx +37 -37
  165. package/test/dom/error-overlay.test.tsx +44 -44
  166. package/test/dom/loader.test.tsx +121 -121
  167. package/test/dom/navigation.test.ts +59 -59
  168. package/test/dom/revalidate.test.tsx +38 -38
  169. package/test/dom/route-head.test.tsx +78 -78
  170. package/test/dom/router-loading.test.tsx +44 -44
  171. package/test/dom/scroll.test.ts +56 -56
  172. package/test/dom/use-metadata.test.tsx +58 -58
  173. package/test/errors.test.ts +21 -0
  174. package/test/io.test.ts +117 -93
  175. package/test/navlink.test.ts +28 -28
  176. package/test/placeholder.test.ts +9 -9
  177. package/test/prettier-plugin.test.ts +46 -0
  178. package/test/routes.test.ts +76 -76
  179. package/test/rpc.test.ts +50 -0
  180. package/test/seo.test.ts +175 -164
  181. package/test/slot-layouts.test.ts +69 -69
  182. package/test/ssg.test.ts +36 -36
  183. package/test/update.test.ts +44 -44
  184. package/test/validate.test.ts +42 -42
  185. package/tests/data-parity/generated-parity.ts +99 -0
  186. package/tests/data-parity/parity.ts +80 -0
  187. package/tests/data-parity/spec.ts +46 -0
  188. package/toil-routes.d.ts +7 -0
  189. package/tsconfig.backend.json +13 -13
  190. package/tsconfig.base.json +35 -35
  191. package/tsconfig.cli.json +13 -13
  192. package/tsconfig.client.json +14 -14
  193. package/tsconfig.compiler.json +13 -13
  194. package/tsconfig.io.json +12 -12
  195. package/tsconfig.json +22 -22
  196. package/tsconfig.logger.json +12 -12
  197. package/tsconfig.server.json +10 -10
  198. package/tsconfig.shared.json +12 -12
  199. package/vitest.config.ts +26 -26
  200. package/.idea/codeStyles/Project.xml +0 -54
  201. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  202. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  203. package/.idea/modules.xml +0 -8
  204. package/.idea/prettier.xml +0 -7
  205. package/.idea/toiljs.iml +0 -8
  206. package/.idea/vcs.xml +0 -6
  207. package/.toil/entry.tsx +0 -9
  208. package/.toil/index.html +0 -12
  209. package/.toil/routes.ts +0 -9
  210. package/build/cli/configure.d.ts +0 -16
  211. package/build/cli/configure.js +0 -272
  212. package/build/cli/create.d.ts +0 -16
  213. package/build/cli/create.js +0 -420
  214. package/build/cli/diagnostics.d.ts +0 -55
  215. package/build/cli/diagnostics.js +0 -333
  216. package/build/cli/doctor.d.ts +0 -6
  217. package/build/cli/doctor.js +0 -249
  218. package/build/cli/features.d.ts +0 -25
  219. package/build/cli/features.js +0 -107
  220. package/build/cli/index.d.ts +0 -2
  221. package/build/cli/proc.d.ts +0 -6
  222. package/build/cli/proc.js +0 -31
  223. package/build/cli/ui.d.ts +0 -9
  224. package/build/cli/ui.js +0 -75
  225. package/build/cli/update.d.ts +0 -7
  226. package/build/cli/update.js +0 -117
  227. package/build/cli/updates.d.ts +0 -10
  228. package/build/cli/updates.js +0 -45
  229. package/build/cli/validate.d.ts +0 -4
  230. package/build/cli/validate.js +0 -19
  231. package/build/client/Link.d.ts +0 -8
  232. package/build/client/Link.js +0 -44
  233. package/build/client/NavLink.d.ts +0 -14
  234. package/build/client/NavLink.js +0 -37
  235. package/build/client/Router.d.ts +0 -7
  236. package/build/client/Router.js +0 -55
  237. package/build/client/channel.d.ts +0 -23
  238. package/build/client/channel.js +0 -94
  239. package/build/client/error-boundary.d.ts +0 -16
  240. package/build/client/error-boundary.js +0 -19
  241. package/build/client/head.d.ts +0 -26
  242. package/build/client/head.js +0 -87
  243. package/build/client/hooks.d.ts +0 -17
  244. package/build/client/hooks.js +0 -48
  245. package/build/client/lazy.d.ts +0 -16
  246. package/build/client/lazy.js +0 -53
  247. package/build/client/match.d.ts +0 -2
  248. package/build/client/match.js +0 -32
  249. package/build/client/mount.d.ts +0 -2
  250. package/build/client/mount.js +0 -13
  251. package/build/client/navigation.d.ts +0 -13
  252. package/build/client/navigation.js +0 -97
  253. package/build/client/params-context.d.ts +0 -2
  254. package/build/client/params-context.js +0 -2
  255. package/build/client/prefetch.d.ts +0 -11
  256. package/build/client/prefetch.js +0 -100
  257. package/build/client/runtime.d.ts +0 -31
  258. package/build/client/runtime.js +0 -112
  259. package/build/client/scroll.d.ts +0 -8
  260. package/build/client/scroll.js +0 -36
  261. package/build/io/BinaryReader.d.ts +0 -44
  262. package/build/io/BinaryReader.js +0 -244
  263. package/build/io/BinaryWriter.d.ts +0 -44
  264. package/build/io/BinaryWriter.js +0 -297
  265. package/build/server/release.wasm +0 -0
  266. package/build/server/release.wat +0 -9
  267. package/src/io/BinaryReader.ts +0 -340
  268. package/src/io/BinaryWriter.ts +0 -385
  269. package/src/server/index.ts +0 -10
  270. package/src/server/main.ts +0 -13
  271. package/src/server/tsconfig.json +0 -4
  272. package/toil-env.d.ts +0 -16
  273. 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>
@@ -1,5 +0,0 @@
1
- <component name="ProjectCodeStyleConfiguration">
2
- <state>
3
- <option name="USE_PER_PROJECT_SETTINGS" value="true" />
4
- </state>
5
- </component>
@@ -1,6 +0,0 @@
1
- <component name="InspectionProjectProfileManager">
2
- <profile version="1.0">
3
- <option name="myName" value="Project Default" />
4
- <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
- </profile>
6
- </component>
package/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/toiljs.iml" filepath="$PROJECT_DIR$/.idea/toiljs.iml" />
6
- </modules>
7
- </component>
8
- </project>
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="PrettierConfiguration">
4
- <option name="myConfigurationMode" value="AUTOMATIC" />
5
- <option name="myRunOnSave" value="true" />
6
- </component>
7
- </project>
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
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="" vcs="Git" />
5
- </component>
6
- </project>
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
@@ -1,9 +0,0 @@
1
- // AUTO-GENERATED by toil — do not edit.
2
- import type { RouteDef, LayoutLoader, NotFoundLoader } from 'toiljs/client';
3
-
4
- export const routes: RouteDef[] = [
5
-
6
- ];
7
-
8
- export const layout: LayoutLoader = null;
9
- export const notFound: NotFoundLoader = null;
@@ -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 {};
@@ -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
- }
@@ -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>;