@ryanatkn/gro 0.154.0 → 0.155.0

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 (192) hide show
  1. package/dist/build.task.d.ts +1 -1
  2. package/dist/build.task.js +2 -2
  3. package/dist/changelog.js +1 -1
  4. package/dist/changeset.task.d.ts +1 -1
  5. package/dist/changeset.task.js +6 -6
  6. package/dist/check.task.d.ts +1 -1
  7. package/dist/check.task.js +3 -3
  8. package/dist/clean.task.d.ts +1 -1
  9. package/dist/clean.task.js +2 -2
  10. package/dist/clean_fs.js +2 -2
  11. package/dist/cli.d.ts +1 -1
  12. package/dist/cli.js +2 -2
  13. package/dist/commit.task.d.ts +1 -1
  14. package/dist/commit.task.js +1 -1
  15. package/dist/deploy.task.d.ts +1 -1
  16. package/dist/deploy.task.js +5 -5
  17. package/dist/dev.task.d.ts +2 -2
  18. package/dist/dev.task.js +2 -2
  19. package/dist/esbuild_helpers.d.ts +1 -1
  20. package/dist/esbuild_helpers.d.ts.map +1 -1
  21. package/dist/esbuild_helpers.js +1 -2
  22. package/dist/esbuild_plugin_external_worker.d.ts +1 -1
  23. package/dist/esbuild_plugin_external_worker.js +7 -7
  24. package/dist/esbuild_plugin_svelte.d.ts +1 -1
  25. package/dist/esbuild_plugin_svelte.js +4 -4
  26. package/dist/esbuild_plugin_sveltekit_local_imports.js +2 -2
  27. package/dist/esbuild_plugin_sveltekit_shim_app.d.ts +1 -1
  28. package/dist/esbuild_plugin_sveltekit_shim_app.js +2 -2
  29. package/dist/esbuild_plugin_sveltekit_shim_env.js +3 -3
  30. package/dist/filer.d.ts +3 -3
  31. package/dist/filer.js +6 -6
  32. package/dist/format.task.d.ts +1 -1
  33. package/dist/format.task.js +3 -3
  34. package/dist/format_directory.d.ts +1 -1
  35. package/dist/format_directory.js +5 -5
  36. package/dist/format_file.js +1 -1
  37. package/dist/gen.d.ts +5 -5
  38. package/dist/gen.js +4 -4
  39. package/dist/gen.task.d.ts +1 -1
  40. package/dist/gen.task.js +8 -8
  41. package/dist/git.js +1 -1
  42. package/dist/gro.config.default.d.ts +1 -1
  43. package/dist/gro.config.default.js +16 -8
  44. package/dist/gro.d.ts +1 -1
  45. package/dist/gro.js +3 -2
  46. package/dist/gro_config.d.ts +4 -4
  47. package/dist/gro_config.js +12 -4
  48. package/dist/gro_helpers.d.ts.map +1 -1
  49. package/dist/gro_helpers.js +5 -2
  50. package/dist/gro_plugin_gen.d.ts +2 -2
  51. package/dist/gro_plugin_gen.js +4 -4
  52. package/dist/gro_plugin_server.d.ts +1 -1
  53. package/dist/gro_plugin_server.js +11 -11
  54. package/dist/gro_plugin_sveltekit_app.d.ts +3 -3
  55. package/dist/gro_plugin_sveltekit_app.js +10 -10
  56. package/dist/gro_plugin_sveltekit_library.d.ts +2 -2
  57. package/dist/gro_plugin_sveltekit_library.js +3 -3
  58. package/dist/index.d.ts +4 -4
  59. package/dist/index.js +2 -2
  60. package/dist/input_path.d.ts +1 -1
  61. package/dist/input_path.js +3 -3
  62. package/dist/invoke.js +4 -4
  63. package/dist/invoke_task.d.ts +4 -4
  64. package/dist/invoke_task.js +7 -7
  65. package/dist/lint.task.d.ts +1 -1
  66. package/dist/lint.task.js +3 -3
  67. package/dist/loader.d.ts.map +1 -1
  68. package/dist/loader.js +62 -46
  69. package/dist/module.js +2 -2
  70. package/dist/modules.d.ts +2 -2
  71. package/dist/modules.js +10 -2
  72. package/dist/package.d.ts +1 -0
  73. package/dist/package.d.ts.map +1 -1
  74. package/dist/package.gen.d.ts +1 -1
  75. package/dist/package.gen.js +5 -5
  76. package/dist/package.js +6 -5
  77. package/dist/package_json.js +5 -5
  78. package/dist/package_meta.d.ts +2 -2
  79. package/dist/package_meta.js +1 -1
  80. package/dist/parse_imports.d.ts +1 -1
  81. package/dist/parse_imports.js +2 -2
  82. package/dist/paths.d.ts +1 -1
  83. package/dist/paths.js +2 -2
  84. package/dist/plugin.d.ts +3 -3
  85. package/dist/plugin.d.ts.map +1 -1
  86. package/dist/publish.task.d.ts +1 -1
  87. package/dist/publish.task.js +8 -8
  88. package/dist/reinstall.task.d.ts +1 -1
  89. package/dist/reinstall.task.js +2 -2
  90. package/dist/release.task.d.ts +1 -1
  91. package/dist/release.task.js +2 -2
  92. package/dist/resolve.task.d.ts +1 -1
  93. package/dist/resolve.task.js +2 -2
  94. package/dist/resolve_specifier.d.ts +1 -1
  95. package/dist/resolve_specifier.js +1 -1
  96. package/dist/run.task.d.ts +1 -1
  97. package/dist/run.task.js +2 -2
  98. package/dist/run_gen.d.ts +3 -3
  99. package/dist/run_gen.js +3 -3
  100. package/dist/run_task.d.ts +5 -5
  101. package/dist/run_task.js +4 -4
  102. package/dist/search_fs.d.ts +1 -1
  103. package/dist/src_json.d.ts +1 -1
  104. package/dist/src_json.js +2 -2
  105. package/dist/svelte_config.js +10 -2
  106. package/dist/sveltekit_helpers.d.ts +3 -3
  107. package/dist/sveltekit_helpers.js +6 -6
  108. package/dist/sveltekit_shim_app.d.ts +1 -1
  109. package/dist/sveltekit_shim_app_state.js +1 -1
  110. package/dist/sveltekit_shim_env.js +1 -1
  111. package/dist/sync.task.d.ts +1 -1
  112. package/dist/sync.task.js +3 -3
  113. package/dist/task.d.ts +7 -7
  114. package/dist/task.js +4 -4
  115. package/dist/task_logging.d.ts +1 -1
  116. package/dist/task_logging.js +1 -1
  117. package/dist/test.task.d.ts +1 -1
  118. package/dist/test.task.js +3 -3
  119. package/dist/typecheck.task.d.ts +1 -1
  120. package/dist/typecheck.task.js +6 -6
  121. package/dist/upgrade.task.d.ts +1 -1
  122. package/dist/upgrade.task.js +6 -6
  123. package/dist/watch_dir.d.ts +1 -1
  124. package/package.json +5 -4
  125. package/src/lib/build.task.ts +3 -3
  126. package/src/lib/changelog.ts +1 -1
  127. package/src/lib/changeset.task.ts +6 -6
  128. package/src/lib/check.task.ts +3 -3
  129. package/src/lib/clean.task.ts +3 -3
  130. package/src/lib/clean_fs.ts +2 -2
  131. package/src/lib/cli.ts +3 -3
  132. package/src/lib/commit.task.ts +2 -2
  133. package/src/lib/deploy.task.ts +5 -5
  134. package/src/lib/dev.task.ts +3 -3
  135. package/src/lib/esbuild_helpers.ts +2 -3
  136. package/src/lib/esbuild_plugin_external_worker.ts +9 -9
  137. package/src/lib/esbuild_plugin_svelte.ts +4 -4
  138. package/src/lib/esbuild_plugin_sveltekit_local_imports.ts +2 -2
  139. package/src/lib/esbuild_plugin_sveltekit_shim_app.ts +3 -3
  140. package/src/lib/esbuild_plugin_sveltekit_shim_env.ts +3 -3
  141. package/src/lib/filer.ts +8 -8
  142. package/src/lib/format.task.ts +3 -3
  143. package/src/lib/format_directory.ts +5 -5
  144. package/src/lib/format_file.ts +1 -1
  145. package/src/lib/gen.task.ts +8 -8
  146. package/src/lib/gen.ts +7 -7
  147. package/src/lib/git.ts +1 -1
  148. package/src/lib/gro.config.default.ts +8 -8
  149. package/src/lib/gro.ts +4 -2
  150. package/src/lib/gro_config.ts +7 -7
  151. package/src/lib/gro_helpers.ts +5 -2
  152. package/src/lib/gro_plugin_gen.ts +6 -6
  153. package/src/lib/gro_plugin_server.ts +13 -13
  154. package/src/lib/gro_plugin_sveltekit_app.ts +11 -11
  155. package/src/lib/gro_plugin_sveltekit_library.ts +4 -4
  156. package/src/lib/index.ts +4 -4
  157. package/src/lib/input_path.ts +4 -4
  158. package/src/lib/invoke.ts +4 -4
  159. package/src/lib/invoke_task.ts +8 -8
  160. package/src/lib/lint.task.ts +3 -3
  161. package/src/lib/loader.ts +63 -63
  162. package/src/lib/module.ts +2 -2
  163. package/src/lib/modules.ts +3 -3
  164. package/src/lib/package.gen.ts +6 -6
  165. package/src/lib/package.ts +8 -7
  166. package/src/lib/package_json.ts +5 -5
  167. package/src/lib/package_meta.ts +3 -3
  168. package/src/lib/parse_imports.ts +3 -3
  169. package/src/lib/paths.ts +3 -3
  170. package/src/lib/plugin.ts +8 -5
  171. package/src/lib/publish.task.ts +8 -8
  172. package/src/lib/reinstall.task.ts +2 -2
  173. package/src/lib/release.task.ts +3 -3
  174. package/src/lib/resolve.task.ts +2 -2
  175. package/src/lib/resolve_specifier.ts +2 -2
  176. package/src/lib/run.task.ts +2 -2
  177. package/src/lib/run_gen.ts +5 -5
  178. package/src/lib/run_task.ts +7 -7
  179. package/src/lib/search_fs.ts +1 -1
  180. package/src/lib/src_json.ts +2 -2
  181. package/src/lib/svelte_config.ts +1 -1
  182. package/src/lib/sveltekit_helpers.ts +6 -6
  183. package/src/lib/sveltekit_shim_app.ts +1 -1
  184. package/src/lib/sveltekit_shim_app_state.ts +1 -1
  185. package/src/lib/sveltekit_shim_env.ts +1 -1
  186. package/src/lib/sync.task.ts +3 -3
  187. package/src/lib/task.ts +9 -9
  188. package/src/lib/task_logging.ts +3 -3
  189. package/src/lib/test.task.ts +3 -3
  190. package/src/lib/typecheck.task.ts +6 -6
  191. package/src/lib/upgrade.task.ts +6 -6
  192. package/src/lib/watch_dir.ts +1 -1
package/src/lib/invoke.ts CHANGED
@@ -3,10 +3,10 @@ import {configure_log_colors} from '@ryanatkn/belt/log.js';
3
3
  import {set_colors} from '@ryanatkn/belt/print.js';
4
4
  import {styleText} from 'node:util';
5
5
 
6
- import {invoke_task} from './invoke_task.js';
7
- import {to_task_args} from './args.js';
8
- import {load_gro_config} from './gro_config.js';
9
- import {sveltekit_sync_if_obviously_needed} from './sveltekit_helpers.js';
6
+ import {invoke_task} from './invoke_task.ts';
7
+ import {to_task_args} from './args.ts';
8
+ import {load_gro_config} from './gro_config.ts';
9
+ import {sveltekit_sync_if_obviously_needed} from './sveltekit_helpers.ts';
10
10
 
11
11
  /*
12
12
 
@@ -3,14 +3,14 @@ import {System_Logger} from '@ryanatkn/belt/log.js';
3
3
  import {create_stopwatch, Timings} from '@ryanatkn/belt/timings.js';
4
4
  import {print_ms, print_timings, print_log_label} from '@ryanatkn/belt/print.js';
5
5
 
6
- import {to_forwarded_args, type Args} from './args.js';
7
- import {run_task} from './run_task.js';
8
- import {to_input_path, Raw_Input_Path} from './input_path.js';
9
- import {find_tasks, load_tasks, Silent_Error} from './task.js';
10
- import {load_gro_package_json} from './package_json.js';
11
- import {log_tasks, log_error_reasons} from './task_logging.js';
12
- import type {Gro_Config} from './gro_config.js';
13
- import {Filer} from './filer.js';
6
+ import {to_forwarded_args, type Args} from './args.ts';
7
+ import {run_task} from './run_task.ts';
8
+ import {to_input_path, Raw_Input_Path} from './input_path.ts';
9
+ import {find_tasks, load_tasks, Silent_Error} from './task.ts';
10
+ import {load_gro_package_json} from './package_json.ts';
11
+ import {log_tasks, log_error_reasons} from './task_logging.ts';
12
+ import type {Gro_Config} from './gro_config.ts';
13
+ import {Filer} from './filer.ts';
14
14
 
15
15
  /**
16
16
  * Invokes Gro tasks by name using the filesystem as the source.
@@ -1,9 +1,9 @@
1
1
  import {print_spawn_result} from '@ryanatkn/belt/process.js';
2
2
  import {z} from 'zod';
3
3
 
4
- import {Task_Error, type Task} from './task.js';
5
- import {serialize_args, to_forwarded_args} from './args.js';
6
- import {find_cli, spawn_cli} from './cli.js';
4
+ import {Task_Error, type Task} from './task.ts';
5
+ import {serialize_args, to_forwarded_args} from './args.ts';
6
+ import {find_cli, spawn_cli} from './cli.ts';
7
7
 
8
8
  const ESLINT_CLI = 'eslint';
9
9
 
package/src/lib/loader.ts CHANGED
@@ -1,26 +1,25 @@
1
- import * as esbuild from 'esbuild';
2
1
  import {compile, compileModule, preprocess} from 'svelte/compiler';
3
2
  import {fileURLToPath, pathToFileURL} from 'node:url';
4
3
  import {dirname, join} from 'node:path';
5
4
  import type {LoadHook, ResolveHook} from 'node:module';
6
5
  import {escape_regexp} from '@ryanatkn/belt/regexp.js';
7
6
  import {readFileSync} from 'node:fs';
7
+ import ts_blank_space from 'ts-blank-space';
8
8
 
9
- import {render_env_shim_module} from './sveltekit_shim_env.js';
9
+ import {render_env_shim_module} from './sveltekit_shim_env.ts';
10
10
  import {
11
11
  render_sveltekit_shim_app_environment,
12
12
  render_sveltekit_shim_app_paths,
13
13
  SVELTEKIT_SHIM_APP_ENVIRONMENT_MATCHER,
14
14
  SVELTEKIT_SHIM_APP_PATHS_MATCHER,
15
15
  sveltekit_shim_app_specifiers,
16
- } from './sveltekit_shim_app.js';
17
- import {default_svelte_config} from './svelte_config.js';
18
- import {SVELTE_MATCHER, SVELTE_RUNES_MATCHER} from './svelte_helpers.js';
19
- import {IS_THIS_GRO, paths} from './paths.js';
20
- import {JSON_MATCHER, NODE_MODULES_DIRNAME, TS_MATCHER} from './constants.js';
21
- import {to_define_import_meta_env, default_ts_transform_options} from './esbuild_helpers.js';
22
- import {resolve_specifier} from './resolve_specifier.js';
23
- import {map_sveltekit_aliases} from './sveltekit_helpers.js';
16
+ } from './sveltekit_shim_app.ts';
17
+ import {default_svelte_config} from './svelte_config.ts';
18
+ import {SVELTE_MATCHER, SVELTE_RUNES_MATCHER} from './svelte_helpers.ts';
19
+ import {IS_THIS_GRO, paths} from './paths.ts';
20
+ import {JSON_MATCHER, NODE_MODULES_DIRNAME, TS_MATCHER} from './constants.ts';
21
+ import {resolve_specifier} from './resolve_specifier.ts';
22
+ import {map_sveltekit_aliases} from './sveltekit_helpers.ts';
24
23
 
25
24
  // TODO get out of the loader business, starting with https://nodejs.org/api/typescript.html#type-stripping
26
25
 
@@ -41,7 +40,7 @@ gro run foo.ts
41
40
  Direct usage without register (see also `$lib/gro.ts`):
42
41
 
43
42
  ```bash
44
- node --import 'data:text/javascript,import {register} from "node:module"; import {pathToFileURL} from "node:url"; register("@ryanatkn/gro/loader.js", pathToFileURL("./"));' --experimental-import-meta-resolve --enable-source-maps' foo.ts
43
+ node --import 'data:text/javascript,import {register} from "node:module"; import {pathToFileURL} from "node:url"; register("@ryanatkn/gro/loader.js", pathToFileURL("./"));' --experimental-import-meta-resolve --experimental-strip-types' foo.ts
45
44
  ```
46
45
 
47
46
  TODO how to improve that gnarly import line? was originally designed for the now-deprecated `--loader`
@@ -68,19 +67,13 @@ const {
68
67
  svelte_preprocessors,
69
68
  } = default_svelte_config;
70
69
 
71
- const ts_transform_options: esbuild.TransformOptions = {
72
- ...default_ts_transform_options,
73
- define: to_define_import_meta_env(dev, base_url),
74
- sourcemap: 'inline',
75
- };
76
-
77
70
  const aliases = Object.entries(alias);
78
71
 
79
72
  const RAW_MATCHER = /(%3Fraw|\.css|\.svg)$/; // TODO others? configurable?
80
- const ENV_MATCHER = /src\/lib\/\$env\/(static|dynamic)\/(public|private)$/;
81
73
  const NODE_MODULES_MATCHER = new RegExp(escape_regexp('/' + NODE_MODULES_DIRNAME + '/'), 'u');
82
74
 
83
75
  export const load: LoadHook = async (url, context, nextLoad) => {
76
+ // console.log(`url`, url);
84
77
  if (SVELTEKIT_SHIM_APP_PATHS_MATCHER.test(url)) {
85
78
  // SvelteKit `$app/paths` shim
86
79
  return {
@@ -96,33 +89,25 @@ export const load: LoadHook = async (url, context, nextLoad) => {
96
89
  source: render_sveltekit_shim_app_environment(dev),
97
90
  };
98
91
  } else if (SVELTE_RUNES_MATCHER.test(url)) {
99
- // Svelte runes in js/ts
100
- const loaded = await nextLoad(
101
- url,
102
- context.format === 'module' ? context : {...context, format: 'module'}, // TODO dunno why this is needed, specifically with tests
103
- );
92
+ // Svelte runes in js/ts, `.svelte.ts`
104
93
  const filename = fileURLToPath(url);
105
- const source = loaded.source!.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
106
- const js_source = TS_MATCHER.test(url)
107
- ? (await esbuild.transform(source, {...ts_transform_options, sourcefile: url})).code // TODO @many use warnings? handle not-inline sourcemaps?
108
- : source;
109
- const transformed = compileModule(js_source, {...svelte_compile_module_options, dev, filename});
94
+ const loaded = await nextLoad(url, {...context, format: 'module-typescript'});
95
+ const raw_source = loaded.source?.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
96
+ if (raw_source == null) throw new Error(`Failed to load ${url}`);
97
+ // TODO should be nice if we could use Node's builtin amaro transform, but I couldn't find a way after digging into the source, AFAICT it's internal and not exposed
98
+ const source = ts_blank_space(raw_source); // TODO was using oxc-transform and probably should, but this doesn't require sourcemaps, and it's still alpha as of May 2025
99
+ const transformed = compileModule(source, {
100
+ ...svelte_compile_module_options,
101
+ dev,
102
+ filename,
103
+ });
110
104
  return {format: 'module', shortCircuit: true, source: transformed.js.code};
111
105
  } else if (TS_MATCHER.test(url)) {
112
- // ts
113
- const loaded = await nextLoad(
114
- url,
115
- context.format === 'module' ? context : {...context, format: 'module'}, // TODO dunno why this is needed, specifically with tests
116
- );
117
- const source = loaded.source!.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
118
- const transformed = await esbuild.transform(source, {...ts_transform_options, sourcefile: url}); // TODO @many use warnings? handle not-inline sourcemaps?
119
- return {format: 'module', shortCircuit: true, source: transformed.code};
106
+ // ts but not `.svelte.ts`
107
+ return nextLoad(url, {...context, format: 'module-typescript'});
120
108
  } else if (SVELTE_MATCHER.test(url)) {
121
- // Svelte
122
- const loaded = await nextLoad(
123
- url,
124
- context.format === 'module' ? context : {...context, format: 'module'}, // TODO dunno why this is needed, specifically with tests
125
- );
109
+ // Svelte, `.svelte`
110
+ const loaded = await nextLoad(url, {...context, format: 'module'});
126
111
  const raw_source = loaded.source!.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
127
112
  const filename = fileURLToPath(url);
128
113
  const preprocessed = svelte_preprocessors // TODO @many use sourcemaps (and diagnostics?)
@@ -132,10 +117,12 @@ export const load: LoadHook = async (url, context, nextLoad) => {
132
117
  const transformed = compile(source, {...svelte_compile_options, dev, filename});
133
118
  return {format: 'module', shortCircuit: true, source: transformed.js.code};
134
119
  } else if (JSON_MATCHER.test(url)) {
120
+ // TODO probably require import attrs: `JSON_MATCHER.test(url) && context.importAttributes.type === 'json'`
135
121
  // json
136
- // TODO probably follow esbuild and also export every top-level property for objects from the module - https://esbuild.github.io/content-types/#json (type generation?)
137
- const loaded = await nextLoad(url);
138
- const raw_source = loaded.source!.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
122
+ // TODO probably follow esbuild and also export every top-level property for objects from the module for good treeshaking - https://esbuild.github.io/content-types/#json (type generation?)
123
+ const loaded = await nextLoad(url, context);
124
+ const raw_source = loaded.source?.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
125
+ if (raw_source == null) throw new Error(`Failed to load ${url}`);
139
126
  const source = `export default ` + raw_source;
140
127
  return {format: 'module', shortCircuit: true, source};
141
128
  } else if (RAW_MATCHER.test(url)) {
@@ -146,24 +133,36 @@ export const load: LoadHook = async (url, context, nextLoad) => {
146
133
  'export default `' + raw_source.replaceAll('\\', '\\\\').replaceAll('`', '\\`') + '`;';
147
134
  return {format: 'module', shortCircuit: true, source};
148
135
  } else {
149
- const matched_env = ENV_MATCHER.exec(url);
150
- if (matched_env) {
151
- // SvelteKit `$env`
152
- const mode: 'static' | 'dynamic' = matched_env[1] as any;
153
- const visibility: 'public' | 'private' = matched_env[2] as any;
154
- return {
155
- format: 'module',
156
- shortCircuit: true,
157
- source: render_env_shim_module(
158
- dev,
159
- mode,
160
- visibility,
161
- public_prefix,
162
- private_prefix,
163
- env_dir,
164
- ),
165
- };
166
- }
136
+ // SvelteKit `$env`
137
+ // TODO use `format` from the resolve hook to speed this up and make it simpler
138
+ if (context.format === 'sveltekit-env') {
139
+ let mode: 'static' | 'dynamic';
140
+ let visibility: 'public' | 'private';
141
+ if (context.importAttributes.virtual === '$env/static/public') {
142
+ mode = 'static';
143
+ visibility = 'public';
144
+ } else if (context.importAttributes.virtual === '$env/static/private') {
145
+ mode = 'static';
146
+ visibility = 'private';
147
+ } else if (context.importAttributes.virtual === '$env/dynamic/public') {
148
+ mode = 'dynamic';
149
+ visibility = 'public';
150
+ } else if (context.importAttributes.virtual === '$env/dynamic/private') {
151
+ mode = 'dynamic';
152
+ visibility = 'private';
153
+ } else {
154
+ throw new Error(`Unknown $env import: ${context.importAttributes.virtual}`);
155
+ }
156
+ const source = render_env_shim_module(
157
+ dev,
158
+ mode,
159
+ visibility,
160
+ public_prefix,
161
+ private_prefix,
162
+ env_dir,
163
+ );
164
+ return {format: 'module', shortCircuit: true, source};
165
+ } // else fallback
167
166
  }
168
167
 
169
168
  // fallback to default behavior
@@ -184,7 +183,8 @@ export const resolve: ResolveHook = async (specifier, context, nextResolve) => {
184
183
  // so we need a slightly roundabout strategy to pass through the specifier for virtual files.
185
184
  return {
186
185
  url: pathToFileURL(join(dir, 'src/lib', s)).href,
187
- format: 'module',
186
+ format: 'sveltekit-env',
187
+ importAttributes: {virtual: s}, // TODO idk I'm just making this up
188
188
  shortCircuit: true,
189
189
  };
190
190
  }
package/src/lib/module.ts CHANGED
@@ -1,5 +1,5 @@
1
- import {LIB_DIRNAME} from './paths.js';
2
- import {SOURCE_DIR, SOURCE_DIRNAME} from './constants.js';
1
+ import {LIB_DIRNAME} from './paths.ts';
2
+ import {SOURCE_DIR, SOURCE_DIRNAME} from './constants.ts';
3
3
 
4
4
  export const MODULE_PATH_SRC_PREFIX = SOURCE_DIR;
5
5
  export const MODULE_PATH_LIB_PREFIX = `$${LIB_DIRNAME}/`;
@@ -3,9 +3,9 @@ import {Unreachable_Error} from '@ryanatkn/belt/error.js';
3
3
  import type {Result} from '@ryanatkn/belt/result.js';
4
4
  import {print_error} from '@ryanatkn/belt/print.js';
5
5
 
6
- import type {Resolved_Input_File} from './input_path.js';
7
- import {print_path} from './paths.js';
8
- import type {Path_Id} from './path.js';
6
+ import type {Resolved_Input_File} from './input_path.ts';
7
+ import {print_path} from './paths.ts';
8
+ import type {Path_Id} from './path.ts';
9
9
 
10
10
  export interface Module_Meta<T_Module extends Record<string, any> = Record<string, any>> {
11
11
  id: Path_Id;
@@ -1,7 +1,7 @@
1
- import type {Gen} from './gen.js';
2
- import {load_package_json} from './package_json.js';
3
- import {IS_THIS_GRO} from './paths.js';
4
- import {create_src_json} from './src_json.js';
1
+ import type {Gen} from './gen.ts';
2
+ import {load_package_json} from './package_json.ts';
3
+ import {IS_THIS_GRO} from './paths.ts';
4
+ import {create_src_json} from './src_json.ts';
5
5
 
6
6
  // TODO rename? `Package_Json + Src_Json = package.ts` currently, idk
7
7
 
@@ -20,9 +20,9 @@ export const gen: Gen = ({origin_path}) => {
20
20
  // generated by ${origin_path}
21
21
 
22
22
  import type {Package_Json} from '${
23
- IS_THIS_GRO ? './package_json.js' : '@ryanatkn/gro/package_json.js'
23
+ IS_THIS_GRO ? './package_json.ts' : '@ryanatkn/gro/package_json.js'
24
24
  }';
25
- import type {Src_Json} from '${IS_THIS_GRO ? './src_json.js' : '@ryanatkn/gro/src_json.js'}';
25
+ import type {Src_Json} from '${IS_THIS_GRO ? './src_json.ts' : '@ryanatkn/gro/src_json.js'}';
26
26
 
27
27
  export const package_json = ${JSON.stringify(package_json)} satisfies Package_Json;
28
28
 
@@ -1,11 +1,11 @@
1
1
  // generated by src/lib/package.gen.ts
2
2
 
3
- import type {Package_Json} from './package_json.js';
4
- import type {Src_Json} from './src_json.js';
3
+ import type {Package_Json} from './package_json.ts';
4
+ import type {Src_Json} from './src_json.ts';
5
5
 
6
6
  export const package_json = {
7
7
  name: '@ryanatkn/gro',
8
- version: '0.154.0',
8
+ version: '0.155.0',
9
9
  description: 'task runner and toolkit extending SvelteKit',
10
10
  motto: 'generate, run, optimize',
11
11
  glyph: '🌰',
@@ -30,7 +30,7 @@ export const package_json = {
30
30
  deploy: 'gro deploy',
31
31
  },
32
32
  type: 'module',
33
- engines: {node: '>=22.11'},
33
+ engines: {node: '>=22.15'},
34
34
  bin: {gro: 'dist/gro.js'},
35
35
  keywords: [
36
36
  'web',
@@ -52,6 +52,7 @@ export const package_json = {
52
52
  'oxc-parser': '^0.67.0',
53
53
  prettier: '^3.5.3',
54
54
  'prettier-plugin-svelte': '^3.3.3',
55
+ 'ts-blank-space': '^0.6.1',
55
56
  'ts-morph': '^25.0.1',
56
57
  tslib: '^2.8.1',
57
58
  zod: '^3.24.3',
@@ -61,7 +62,7 @@ export const package_json = {
61
62
  '@changesets/changelog-git': '^0.2.1',
62
63
  '@changesets/types': '^6.1.0',
63
64
  '@ryanatkn/eslint-config': '^0.8.0',
64
- '@ryanatkn/fuz': '^0.140.0',
65
+ '@ryanatkn/fuz': '^0.141.1',
65
66
  '@ryanatkn/moss': '^0.28.0',
66
67
  '@sveltejs/adapter-static': '^3.0.8',
67
68
  '@sveltejs/kit': '^2.20.8',
@@ -77,7 +78,7 @@ export const package_json = {
77
78
  'typescript-eslint': '^8.31.1',
78
79
  uvu: '^0.5.6',
79
80
  },
80
- optionalDependencies: {'@ryanatkn/moss': '^0.28.0'},
81
+ optionalDependencies: {'@ryanatkn/moss': '>=0.27.0 <0.29.0'},
81
82
  prettier: {
82
83
  plugins: ['prettier-plugin-svelte'],
83
84
  useTabs: true,
@@ -263,7 +264,7 @@ export const package_json = {
263
264
 
264
265
  export const src_json = {
265
266
  name: '@ryanatkn/gro',
266
- version: '0.154.0',
267
+ version: '0.155.0',
267
268
  modules: {
268
269
  '.': {
269
270
  path: 'index.ts',
@@ -6,11 +6,11 @@ import type {Logger} from '@ryanatkn/belt/log.js';
6
6
  import type {Flavored} from '@ryanatkn/belt/types.js';
7
7
  import {styleText as st} from 'node:util';
8
8
 
9
- import {paths, gro_paths, IS_THIS_GRO, replace_extension} from './paths.js';
10
- import {SVELTEKIT_DIST_DIRNAME} from './constants.js';
11
- import {search_fs} from './search_fs.js';
12
- import {has_sveltekit_library} from './sveltekit_helpers.js';
13
- import {GITHUB_REPO_MATCHER} from './github.js';
9
+ import {paths, gro_paths, IS_THIS_GRO, replace_extension} from './paths.ts';
10
+ import {SVELTEKIT_DIST_DIRNAME} from './constants.ts';
11
+ import {search_fs} from './search_fs.ts';
12
+ import {has_sveltekit_library} from './sveltekit_helpers.ts';
13
+ import {GITHUB_REPO_MATCHER} from './github.ts';
14
14
 
15
15
  // TODO @many belongs elsewhere
16
16
  export const Url = z.string();
@@ -1,7 +1,7 @@
1
1
  import {strip_start, strip_end, ensure_end} from '@ryanatkn/belt/string.js';
2
2
 
3
- import type {Package_Json, Url} from './package_json.js';
4
- import type {Src_Json} from './src_json.js';
3
+ import type {Package_Json, Url} from './package_json.ts';
4
+ import type {Src_Json} from './src_json.ts';
5
5
 
6
6
  // TODO needs refactoring, more clarity
7
7
  export interface Package_Meta {
@@ -42,7 +42,7 @@ export const parse_package_meta = (
42
42
  : null,
43
43
  );
44
44
  if (!repo_url) {
45
- throw new Error('failed to parse package_meta - `repo_url` is required in package_json');
45
+ throw Error('failed to parse package_meta - `repo_url` is required in package_json');
46
46
  }
47
47
 
48
48
  const homepage_url = package_json.homepage ?? null;
@@ -2,9 +2,9 @@ import {parseSync, type ImportDeclaration} from 'oxc-parser';
2
2
  import type {Flavored} from '@ryanatkn/belt/types.js';
3
3
  import {Unreachable_Error} from '@ryanatkn/belt/error.js';
4
4
 
5
- import type {Path_Id} from './path.js';
6
- import {SVELTE_MATCHER} from './svelte_helpers.js';
7
- import {JS_MATCHER, TS_MATCHER, SVELTE_SCRIPT_MATCHER} from './constants.js';
5
+ import type {Path_Id} from './path.ts';
6
+ import {SVELTE_MATCHER} from './svelte_helpers.ts';
7
+ import {JS_MATCHER, TS_MATCHER, SVELTE_SCRIPT_MATCHER} from './constants.ts';
8
8
 
9
9
  export type Import_Specifier = Flavored<string, 'Import_Specifier'>;
10
10
 
package/src/lib/paths.ts CHANGED
@@ -9,9 +9,9 @@ import {
9
9
  GRO_DIR,
10
10
  SOURCE_DIR,
11
11
  SVELTEKIT_DIST_DIRNAME,
12
- } from './constants.js';
13
- import {default_svelte_config} from './svelte_config.js';
14
- import type {Path_Id} from './path.js';
12
+ } from './constants.ts';
13
+ import {default_svelte_config} from './svelte_config.ts';
14
+ import type {Path_Id} from './path.ts';
15
15
 
16
16
  /*
17
17
 
package/src/lib/plugin.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type {Task_Context} from './task.js';
1
+ import type {Task_Context} from './task.ts';
2
2
 
3
3
  /**
4
4
  * Gro `Plugin`s enable custom behavior during `gro dev` and `gro build`.
@@ -22,10 +22,13 @@ export interface Plugin_Context<T_Args = object> extends Task_Context<T_Args> {
22
22
 
23
23
  /** See `Plugins.create` for a usage example. */
24
24
  export class Plugins<T_Plugin_Context extends Plugin_Context> {
25
- constructor(
26
- private ctx: T_Plugin_Context,
27
- private instances: Array<Plugin>,
28
- ) {}
25
+ readonly ctx: T_Plugin_Context;
26
+ readonly instances: Array<Plugin<T_Plugin_Context>>;
27
+
28
+ constructor(ctx: T_Plugin_Context, instances: Array<Plugin>) {
29
+ this.ctx = ctx;
30
+ this.instances = instances;
31
+ }
29
32
 
30
33
  static async create<T_Plugin_Context extends Plugin_Context>(
31
34
  ctx: T_Plugin_Context,
@@ -3,12 +3,12 @@ import {z} from 'zod';
3
3
  import {styleText as st} from 'node:util';
4
4
  import {existsSync} from 'node:fs';
5
5
 
6
- import {Task_Error, type Task} from './task.js';
7
- import {load_package_json, parse_repo_url} from './package_json.js';
8
- import {find_cli, spawn_cli} from './cli.js';
9
- import {has_sveltekit_library} from './sveltekit_helpers.js';
10
- import {update_changelog} from './changelog.js';
11
- import {load_from_env} from './env.js';
6
+ import {Task_Error, type Task} from './task.ts';
7
+ import {load_package_json, parse_repo_url} from './package_json.ts';
8
+ import {find_cli, spawn_cli} from './cli.ts';
9
+ import {has_sveltekit_library} from './sveltekit_helpers.ts';
10
+ import {update_changelog} from './changelog.ts';
11
+ import {load_from_env} from './env.ts';
12
12
  import {
13
13
  Git_Branch,
14
14
  Git_Origin,
@@ -16,8 +16,8 @@ import {
16
16
  git_checkout,
17
17
  git_fetch,
18
18
  git_pull,
19
- } from './git.js';
20
- import {CHANGESET_CLI} from './changeset_helpers.js';
19
+ } from './git.ts';
20
+ import {CHANGESET_CLI} from './changeset_helpers.ts';
21
21
 
22
22
  export const Args = z
23
23
  .object({
@@ -2,8 +2,8 @@ import {z} from 'zod';
2
2
  import {spawn} from '@ryanatkn/belt/process.js';
3
3
  import {rm} from 'node:fs/promises';
4
4
 
5
- import {Task_Error, type Task} from './task.js';
6
- import {LOCKFILE_FILENAME, NODE_MODULES_DIRNAME} from './constants.js';
5
+ import {Task_Error, type Task} from './task.ts';
6
+ import {LOCKFILE_FILENAME, NODE_MODULES_DIRNAME} from './constants.ts';
7
7
 
8
8
  export const Args = z.object({}).strict();
9
9
  export type Args = z.infer<typeof Args>;
@@ -1,8 +1,8 @@
1
1
  import {z} from 'zod';
2
2
 
3
- import type {Task} from './task.js';
4
- import {has_sveltekit_library, has_sveltekit_app} from './sveltekit_helpers.js';
5
- import {load_package_json} from './package_json.js';
3
+ import type {Task} from './task.ts';
4
+ import {has_sveltekit_library, has_sveltekit_app} from './sveltekit_helpers.ts';
5
+ import {load_package_json} from './package_json.ts';
6
6
 
7
7
  export const Args = z.object({}).strict();
8
8
  export type Args = z.infer<typeof Args>;
@@ -1,8 +1,8 @@
1
1
  import {z} from 'zod';
2
2
  import {styleText as st} from 'node:util';
3
3
 
4
- import {TASK_FILE_SUFFIXES, type Task} from './task.js';
5
- import {resolve_input_paths, to_input_paths} from './input_path.js';
4
+ import {TASK_FILE_SUFFIXES, type Task} from './task.ts';
5
+ import {resolve_input_paths, to_input_paths} from './input_path.ts';
6
6
 
7
7
  export const Args = z
8
8
  .object({
@@ -1,8 +1,8 @@
1
1
  import {extname, isAbsolute, join, relative} from 'node:path';
2
2
  import {existsSync} from 'node:fs';
3
3
 
4
- import {replace_extension} from './paths.js';
5
- import type {Path_Id} from './path.js';
4
+ import {replace_extension} from './paths.ts';
5
+ import type {Path_Id} from './path.ts';
6
6
 
7
7
  export interface Resolved_Specifier {
8
8
  /**
@@ -2,8 +2,8 @@ import {z} from 'zod';
2
2
  import {styleText as st} from 'node:util';
3
3
  import {existsSync} from 'node:fs';
4
4
 
5
- import {Task_Error, type Task} from './task.js';
6
- import {resolve_gro_module_path, spawn_with_loader} from './gro_helpers.js';
5
+ import {Task_Error, type Task} from './task.ts';
6
+ import {resolve_gro_module_path, spawn_with_loader} from './gro_helpers.ts';
7
7
 
8
8
  export const Args = z
9
9
  .object({
@@ -10,11 +10,11 @@ import {
10
10
  type Genfile_Module_Meta,
11
11
  to_gen_result,
12
12
  type Raw_Gen_Result,
13
- } from './gen.js';
14
- import {print_path, to_root_path} from './paths.js';
15
- import type {format_file as base_format_file} from './format_file.js';
16
- import type {Gro_Config} from './gro_config.js';
17
- import {default_svelte_config} from './svelte_config.js';
13
+ } from './gen.ts';
14
+ import {print_path, to_root_path} from './paths.ts';
15
+ import type {format_file as base_format_file} from './format_file.ts';
16
+ import type {Gro_Config} from './gro_config.ts';
17
+ import {default_svelte_config} from './svelte_config.ts';
18
18
 
19
19
  export const GEN_NO_PROD_MESSAGE = 'gen runs only during development';
20
20
 
@@ -3,13 +3,13 @@ import {print_log_label} from '@ryanatkn/belt/print.js';
3
3
  import {System_Logger} from '@ryanatkn/belt/log.js';
4
4
  import type {Timings} from '@ryanatkn/belt/timings.js';
5
5
 
6
- import {parse_args, type Args} from './args.js';
7
- import type {invoke_task as base_invoke_task} from './invoke_task.js';
8
- import {log_task_help} from './task_logging.js';
9
- import type {Gro_Config} from './gro_config.js';
10
- import {Task_Error, type Task_Module_Meta} from './task.js';
11
- import {default_svelte_config} from './svelte_config.js';
12
- import type {Filer} from './filer.js';
6
+ import {parse_args, type Args} from './args.ts';
7
+ import type {invoke_task as base_invoke_task} from './invoke_task.ts';
8
+ import {log_task_help} from './task_logging.ts';
9
+ import type {Gro_Config} from './gro_config.ts';
10
+ import {Task_Error, type Task_Module_Meta} from './task.ts';
11
+ import {default_svelte_config} from './svelte_config.ts';
12
+ import type {Filer} from './filer.ts';
13
13
 
14
14
  export type Run_Task_Result =
15
15
  | {
@@ -4,7 +4,7 @@ import {ensure_end} from '@ryanatkn/belt/string.js';
4
4
  import {isAbsolute, join} from 'node:path';
5
5
  import {existsSync, readdirSync} from 'node:fs';
6
6
 
7
- import type {File_Filter, Resolved_Path, Path_Filter} from './path.js';
7
+ import type {File_Filter, Resolved_Path, Path_Filter} from './path.ts';
8
8
 
9
9
  export interface Search_Fs_Options {
10
10
  /**
@@ -4,12 +4,12 @@ import {strip_start} from '@ryanatkn/belt/string.js';
4
4
  import {Project} from 'ts-morph';
5
5
  import {existsSync} from 'node:fs';
6
6
 
7
- import {paths, replace_extension} from './paths.js';
7
+ import {paths, replace_extension} from './paths.ts';
8
8
  import {
9
9
  transform_empty_object_to_undefined,
10
10
  type Package_Json,
11
11
  type Package_Json_Exports,
12
- } from './package_json.js';
12
+ } from './package_json.ts';
13
13
 
14
14
  // TODO @many rename to prefix with `Src_Json_`?
15
15
  export const Src_Module_Declaration = z
@@ -3,7 +3,7 @@ import type {CompileOptions, ModuleCompileOptions, PreprocessorGroup} from 'svel
3
3
  import {join} from 'node:path';
4
4
  import {EMPTY_OBJECT} from '@ryanatkn/belt/object.js';
5
5
 
6
- import {SVELTE_CONFIG_FILENAME} from './constants.js';
6
+ import {SVELTE_CONFIG_FILENAME} from './constants.ts';
7
7
 
8
8
  /*
9
9
 
@@ -3,12 +3,12 @@ import {existsSync} from 'node:fs';
3
3
  import type {Logger} from '@ryanatkn/belt/log.js';
4
4
  import {join} from 'node:path';
5
5
 
6
- import {Package_Json, has_dep} from './package_json.js';
7
- import {default_svelte_config, type Parsed_Svelte_Config} from './svelte_config.js';
8
- import {SVELTE_CONFIG_FILENAME, SVELTEKIT_DEV_DIRNAME, PM_CLI_DEFAULT} from './constants.js';
9
- import {find_cli, spawn_cli, to_cli_name, type Cli} from './cli.js';
10
- import {Task_Error} from './task.js';
11
- import {serialize_args, to_forwarded_args} from './args.js';
6
+ import {Package_Json, has_dep} from './package_json.ts';
7
+ import {default_svelte_config, type Parsed_Svelte_Config} from './svelte_config.ts';
8
+ import {SVELTE_CONFIG_FILENAME, SVELTEKIT_DEV_DIRNAME, PM_CLI_DEFAULT} from './constants.ts';
9
+ import {find_cli, spawn_cli, to_cli_name, type Cli} from './cli.ts';
10
+ import {Task_Error} from './task.ts';
11
+ import {serialize_args, to_forwarded_args} from './args.ts';
12
12
 
13
13
  export const SVELTEKIT_CLI = 'svelte-kit';
14
14