toiljs 0.0.14 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/.babelrc +13 -13
  2. package/.gitattributes +2 -2
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +90 -90
  5. package/.github/ISSUE_TEMPLATE/config.yml +8 -8
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  7. package/.github/PULL_REQUEST_TEMPLATE.md +43 -43
  8. package/.github/changelog-config.json +45 -45
  9. package/.github/dependabot.yml +27 -27
  10. package/.github/workflows/ci.yml +191 -191
  11. package/.prettierrc.json +11 -11
  12. package/.vscode/settings.json +9 -9
  13. package/CHANGELOG.md +5 -5
  14. package/LICENSE +187 -187
  15. package/README.md +339 -315
  16. package/as-pect.asconfig.json +34 -34
  17. package/as-pect.config.js +65 -65
  18. package/assets/logo.svg +36 -36
  19. package/build/backend/.tsbuildinfo +1 -1
  20. package/build/cli/.tsbuildinfo +1 -1
  21. package/build/cli/index.js +2926 -191
  22. package/build/client/.tsbuildinfo +1 -1
  23. package/build/client/dev/devtools.d.ts +6 -0
  24. package/build/client/dev/devtools.js +442 -0
  25. package/build/client/dev/error-overlay.d.ts +9 -0
  26. package/build/client/dev/error-overlay.js +19 -4
  27. package/build/client/head/metadata.d.ts +3 -1
  28. package/build/client/head/metadata.js +8 -0
  29. package/build/client/index.d.ts +4 -4
  30. package/build/client/index.js +2 -2
  31. package/build/client/navigation/navigation.d.ts +2 -0
  32. package/build/client/navigation/navigation.js +9 -1
  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 +25 -0
  38. package/build/client/routing/loader.js +53 -7
  39. package/build/client/routing/mount.js +4 -3
  40. package/build/compiler/.tsbuildinfo +1 -1
  41. package/build/compiler/config.d.ts +18 -0
  42. package/build/compiler/config.js +8 -0
  43. package/build/compiler/docs.js +16 -16
  44. package/build/compiler/generate.js +3 -0
  45. package/build/compiler/index.d.ts +2 -2
  46. package/build/compiler/index.js +3 -1
  47. package/build/compiler/plugin.js +156 -0
  48. package/build/compiler/prerender.d.ts +1 -0
  49. package/build/compiler/prerender.js +2 -1
  50. package/build/compiler/seo.d.ts +2 -2
  51. package/build/compiler/seo.js +8 -6
  52. package/build/compiler/ssg.d.ts +5 -0
  53. package/build/compiler/ssg.js +121 -0
  54. package/build/io/.tsbuildinfo +1 -1
  55. package/build/logger/.tsbuildinfo +1 -1
  56. package/build/shared/.tsbuildinfo +1 -1
  57. package/eslint.config.js +48 -48
  58. package/examples/basic/client/404.tsx +11 -11
  59. package/examples/basic/client/components/.gitkeep +1 -1
  60. package/examples/basic/client/global-error.tsx +13 -13
  61. package/examples/basic/client/layout.tsx +25 -25
  62. package/examples/basic/client/public/images/.gitkeep +1 -1
  63. package/examples/basic/client/public/images/logo.svg +36 -36
  64. package/examples/basic/client/public/robots.txt +2 -2
  65. package/examples/basic/client/routes/docs/[...slug].tsx +12 -12
  66. package/examples/basic/client/routes/features/error/error.tsx +16 -16
  67. package/examples/basic/client/routes/features/template/b.tsx +14 -14
  68. package/examples/basic/client/routes/files/[[...slug]].tsx +21 -21
  69. package/examples/basic/client/routes/gallery/layout.tsx +13 -13
  70. package/examples/basic/client/routes/io.tsx +24 -24
  71. package/examples/basic/client/routes/loader-demo/loading.tsx +13 -13
  72. package/examples/basic/client/routes/search.tsx +61 -61
  73. package/examples/basic/client/toil.tsx +5 -5
  74. package/package.json +155 -147
  75. package/presets/eslint.js +88 -88
  76. package/presets/no-uint8array-tostring.js +200 -200
  77. package/presets/prettier.json +18 -18
  78. package/presets/tsconfig.json +37 -37
  79. package/src/backend/index.ts +160 -160
  80. package/src/cli/proc.ts +50 -50
  81. package/src/cli/updates.ts +69 -69
  82. package/src/cli/validate.ts +31 -31
  83. package/src/client/channel/channel.ts +146 -146
  84. package/src/client/components/Form.tsx +65 -65
  85. package/src/client/components/Script.tsx +113 -113
  86. package/src/client/components/Slot.tsx +21 -21
  87. package/src/client/dev/devtools.tsx +973 -0
  88. package/src/client/dev/error-overlay.tsx +30 -4
  89. package/src/client/head/head.ts +167 -167
  90. package/src/client/head/metadata.ts +19 -1
  91. package/src/client/index.ts +19 -9
  92. package/src/client/navigation/NavLink.tsx +86 -86
  93. package/src/client/navigation/navigation.ts +25 -5
  94. package/src/client/navigation/prefetch.ts +169 -130
  95. package/src/client/navigation/scroll.ts +53 -53
  96. package/src/client/routing/Router.tsx +8 -2
  97. package/src/client/routing/action.ts +122 -122
  98. package/src/client/routing/error-boundary.tsx +43 -43
  99. package/src/client/routing/hooks.ts +21 -6
  100. package/src/client/routing/loader.ts +325 -225
  101. package/src/client/routing/match.ts +47 -47
  102. package/src/client/routing/mount.tsx +54 -52
  103. package/src/client/routing/params-context.ts +10 -10
  104. package/src/client/routing/slot-context.ts +7 -7
  105. package/src/client/search/search.ts +189 -189
  106. package/src/client/search/use-page-search.ts +73 -73
  107. package/src/client/types.ts +73 -73
  108. package/src/compiler/config.ts +47 -1
  109. package/src/compiler/docs.ts +228 -228
  110. package/src/compiler/generate.ts +394 -391
  111. package/src/compiler/index.ts +64 -54
  112. package/src/compiler/pages.ts +70 -70
  113. package/src/compiler/plugin.ts +170 -2
  114. package/src/compiler/prerender.ts +5 -1
  115. package/src/compiler/seo.ts +23 -7
  116. package/src/compiler/ssg.ts +162 -0
  117. package/src/io/BinaryReader.ts +340 -340
  118. package/src/io/BinaryWriter.ts +385 -385
  119. package/src/io/FastMap.ts +127 -127
  120. package/src/io/index.ts +11 -11
  121. package/src/io/lengths.ts +14 -14
  122. package/src/io/types.ts +18 -18
  123. package/src/logger/index.ts +22 -22
  124. package/src/server/index.ts +10 -10
  125. package/src/server/main.ts +13 -13
  126. package/src/server/tsconfig.json +4 -4
  127. package/src/shared/index.ts +10 -10
  128. package/std/client/index.d.ts +15 -15
  129. package/std/client/package.json +3 -3
  130. package/test/assembly/example.spec.ts +7 -7
  131. package/test/channel.test.ts +21 -21
  132. package/test/dom/Link.test.tsx +47 -47
  133. package/test/dom/NavLink.test.tsx +37 -37
  134. package/test/dom/error-overlay.test.tsx +44 -44
  135. package/test/dom/loader.test.tsx +121 -121
  136. package/test/dom/navigation.test.ts +59 -59
  137. package/test/dom/revalidate.test.tsx +38 -38
  138. package/test/dom/route-head.test.tsx +78 -78
  139. package/test/dom/router-loading.test.tsx +44 -44
  140. package/test/dom/scroll.test.ts +56 -56
  141. package/test/dom/use-metadata.test.tsx +58 -0
  142. package/test/io.test.ts +93 -93
  143. package/test/navlink.test.ts +28 -28
  144. package/test/placeholder.test.ts +9 -9
  145. package/test/routes.test.ts +76 -76
  146. package/test/seo.test.ts +175 -164
  147. package/test/slot-layouts.test.ts +69 -69
  148. package/test/ssg.test.ts +36 -0
  149. package/test/update.test.ts +44 -44
  150. package/test/validate.test.ts +42 -42
  151. package/toil-routes.d.ts +7 -0
  152. package/toilconfig.json +30 -30
  153. package/tsconfig.backend.json +13 -13
  154. package/tsconfig.base.json +35 -35
  155. package/tsconfig.cli.json +13 -13
  156. package/tsconfig.client.json +14 -14
  157. package/tsconfig.compiler.json +13 -13
  158. package/tsconfig.io.json +12 -12
  159. package/tsconfig.json +22 -22
  160. package/tsconfig.logger.json +12 -12
  161. package/tsconfig.server.json +10 -10
  162. package/tsconfig.shared.json +12 -12
  163. package/vitest.config.ts +26 -26
  164. package/.idea/codeStyles/Project.xml +0 -54
  165. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  166. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  167. package/.idea/modules.xml +0 -8
  168. package/.idea/prettier.xml +0 -7
  169. package/.idea/toiljs.iml +0 -8
  170. package/.idea/vcs.xml +0 -6
  171. package/.toil/entry.tsx +0 -9
  172. package/.toil/index.html +0 -12
  173. package/.toil/routes.ts +0 -9
  174. package/build/cli/configure.d.ts +0 -16
  175. package/build/cli/configure.js +0 -272
  176. package/build/cli/create.d.ts +0 -16
  177. package/build/cli/create.js +0 -420
  178. package/build/cli/diagnostics.d.ts +0 -55
  179. package/build/cli/diagnostics.js +0 -333
  180. package/build/cli/doctor.d.ts +0 -6
  181. package/build/cli/doctor.js +0 -249
  182. package/build/cli/features.d.ts +0 -25
  183. package/build/cli/features.js +0 -107
  184. package/build/cli/index.d.ts +0 -2
  185. package/build/cli/proc.d.ts +0 -6
  186. package/build/cli/proc.js +0 -31
  187. package/build/cli/ui.d.ts +0 -9
  188. package/build/cli/ui.js +0 -75
  189. package/build/cli/update.d.ts +0 -7
  190. package/build/cli/update.js +0 -117
  191. package/build/cli/updates.d.ts +0 -10
  192. package/build/cli/updates.js +0 -45
  193. package/build/cli/validate.d.ts +0 -4
  194. package/build/cli/validate.js +0 -19
  195. package/build/client/Link.d.ts +0 -8
  196. package/build/client/Link.js +0 -44
  197. package/build/client/NavLink.d.ts +0 -14
  198. package/build/client/NavLink.js +0 -37
  199. package/build/client/Router.d.ts +0 -7
  200. package/build/client/Router.js +0 -55
  201. package/build/client/channel.d.ts +0 -23
  202. package/build/client/channel.js +0 -94
  203. package/build/client/error-boundary.d.ts +0 -16
  204. package/build/client/error-boundary.js +0 -19
  205. package/build/client/head.d.ts +0 -26
  206. package/build/client/head.js +0 -87
  207. package/build/client/hooks.d.ts +0 -17
  208. package/build/client/hooks.js +0 -48
  209. package/build/client/lazy.d.ts +0 -16
  210. package/build/client/lazy.js +0 -53
  211. package/build/client/match.d.ts +0 -2
  212. package/build/client/match.js +0 -32
  213. package/build/client/mount.d.ts +0 -2
  214. package/build/client/mount.js +0 -13
  215. package/build/client/navigation.d.ts +0 -13
  216. package/build/client/navigation.js +0 -97
  217. package/build/client/params-context.d.ts +0 -2
  218. package/build/client/params-context.js +0 -2
  219. package/build/client/prefetch.d.ts +0 -11
  220. package/build/client/prefetch.js +0 -100
  221. package/build/client/runtime.d.ts +0 -31
  222. package/build/client/runtime.js +0 -112
  223. package/build/client/scroll.d.ts +0 -8
  224. package/build/client/scroll.js +0 -36
  225. package/toil-env.d.ts +0 -16
package/tsconfig.json CHANGED
@@ -1,22 +1,22 @@
1
- {
2
- "extends": "./tsconfig.base.json",
3
- "compilerOptions": {
4
- "module": "ESNext",
5
- "target": "ESNext",
6
- "moduleResolution": "bundler",
7
- "jsx": "react-jsx",
8
- "noEmit": true,
9
- "incremental": false
10
- },
11
- "include": [
12
- "src/**/*.ts",
13
- "src/**/*.tsx",
14
- "test/**/*.ts",
15
- "std/client/index.d.ts"
16
- ],
17
- "exclude": [
18
- "node_modules",
19
- "build",
20
- "src/server"
21
- ]
22
- }
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "ESNext",
5
+ "target": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "jsx": "react-jsx",
8
+ "noEmit": true,
9
+ "incremental": false
10
+ },
11
+ "include": [
12
+ "src/**/*.ts",
13
+ "src/**/*.tsx",
14
+ "test/**/*.ts",
15
+ "std/client/index.d.ts"
16
+ ],
17
+ "exclude": [
18
+ "node_modules",
19
+ "build",
20
+ "src/server"
21
+ ]
22
+ }
@@ -1,12 +1,12 @@
1
- {
2
- "extends": "./tsconfig.base.json",
3
- "compilerOptions": {
4
- "module": "ESNext",
5
- "target": "ESNext",
6
- "moduleResolution": "bundler",
7
- "rootDir": "src/logger",
8
- "outDir": "build/logger",
9
- "tsBuildInfoFile": "build/logger/.tsbuildinfo"
10
- },
11
- "include": ["src/logger/**/*"]
12
- }
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "ESNext",
5
+ "target": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "rootDir": "src/logger",
8
+ "outDir": "build/logger",
9
+ "tsBuildInfoFile": "build/logger/.tsbuildinfo"
10
+ },
11
+ "include": ["src/logger/**/*"]
12
+ }
@@ -1,10 +1,10 @@
1
- {
2
- "extends": "toilscript/std/assembly.json",
3
- "compilerOptions": {
4
- "experimentalDecorators": true,
5
- "noEmit": true
6
- },
7
- "include": [
8
- "src/server/**/*.ts"
9
- ]
10
- }
1
+ {
2
+ "extends": "toilscript/std/assembly.json",
3
+ "compilerOptions": {
4
+ "experimentalDecorators": true,
5
+ "noEmit": true
6
+ },
7
+ "include": [
8
+ "src/server/**/*.ts"
9
+ ]
10
+ }
@@ -1,12 +1,12 @@
1
- {
2
- "extends": "./tsconfig.base.json",
3
- "compilerOptions": {
4
- "module": "ESNext",
5
- "target": "ESNext",
6
- "moduleResolution": "bundler",
7
- "rootDir": "src/shared",
8
- "outDir": "build/shared",
9
- "tsBuildInfoFile": "build/shared/.tsbuildinfo"
10
- },
11
- "include": ["src/shared/**/*"]
12
- }
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "ESNext",
5
+ "target": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "rootDir": "src/shared",
8
+ "outDir": "build/shared",
9
+ "tsBuildInfoFile": "build/shared/.tsbuildinfo"
10
+ },
11
+ "include": ["src/shared/**/*"]
12
+ }
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>;