@fuzdev/gro 0.192.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.
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/dist/args.d.ts +37 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +102 -0
- package/dist/build.task.d.ts +20 -0
- package/dist/build.task.d.ts.map +1 -0
- package/dist/build.task.js +119 -0
- package/dist/build_cache.d.ts +100 -0
- package/dist/build_cache.d.ts.map +1 -0
- package/dist/build_cache.js +299 -0
- package/dist/changelog.d.ts +11 -0
- package/dist/changelog.d.ts.map +1 -0
- package/dist/changelog.js +47 -0
- package/dist/changeset.task.d.ts +35 -0
- package/dist/changeset.task.d.ts.map +1 -0
- package/dist/changeset.task.js +151 -0
- package/dist/changeset_helpers.d.ts +17 -0
- package/dist/changeset_helpers.d.ts.map +1 -0
- package/dist/changeset_helpers.js +7 -0
- package/dist/check.task.d.ts +28 -0
- package/dist/check.task.d.ts.map +1 -0
- package/dist/check.task.js +104 -0
- package/dist/child_process_logging.d.ts +10 -0
- package/dist/child_process_logging.d.ts.map +1 -0
- package/dist/child_process_logging.js +26 -0
- package/dist/clean.task.d.ts +15 -0
- package/dist/clean.task.d.ts.map +1 -0
- package/dist/clean.task.js +40 -0
- package/dist/clean_fs.d.ts +9 -0
- package/dist/clean_fs.d.ts.map +1 -0
- package/dist/clean_fs.js +28 -0
- package/dist/cli.d.ts +34 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +61 -0
- package/dist/commit.task.d.ts +11 -0
- package/dist/commit.task.d.ts.map +1 -0
- package/dist/commit.task.js +24 -0
- package/dist/constants.d.ts +46 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +52 -0
- package/dist/deploy.task.d.ts +29 -0
- package/dist/deploy.task.d.ts.map +1 -0
- package/dist/deploy.task.js +217 -0
- package/dist/dev.task.d.ts +16 -0
- package/dist/dev.task.d.ts.map +1 -0
- package/dist/dev.task.js +44 -0
- package/dist/disknode.d.ts +23 -0
- package/dist/disknode.d.ts.map +1 -0
- package/dist/disknode.js +1 -0
- package/dist/env.d.ts +11 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +49 -0
- package/dist/esbuild_helpers.d.ts +16 -0
- package/dist/esbuild_helpers.d.ts.map +1 -0
- package/dist/esbuild_helpers.js +36 -0
- package/dist/esbuild_plugin_external_worker.d.ts +23 -0
- package/dist/esbuild_plugin_external_worker.d.ts.map +1 -0
- package/dist/esbuild_plugin_external_worker.js +55 -0
- package/dist/esbuild_plugin_svelte.d.ts +15 -0
- package/dist/esbuild_plugin_svelte.d.ts.map +1 -0
- package/dist/esbuild_plugin_svelte.js +83 -0
- package/dist/esbuild_plugin_sveltekit_local_imports.d.ts +8 -0
- package/dist/esbuild_plugin_sveltekit_local_imports.d.ts.map +1 -0
- package/dist/esbuild_plugin_sveltekit_local_imports.js +30 -0
- package/dist/esbuild_plugin_sveltekit_shim_alias.d.ts +7 -0
- package/dist/esbuild_plugin_sveltekit_shim_alias.d.ts.map +1 -0
- package/dist/esbuild_plugin_sveltekit_shim_alias.js +18 -0
- package/dist/esbuild_plugin_sveltekit_shim_app.d.ts +9 -0
- package/dist/esbuild_plugin_sveltekit_shim_app.d.ts.map +1 -0
- package/dist/esbuild_plugin_sveltekit_shim_app.js +22 -0
- package/dist/esbuild_plugin_sveltekit_shim_env.d.ts +11 -0
- package/dist/esbuild_plugin_sveltekit_shim_env.d.ts.map +1 -0
- package/dist/esbuild_plugin_sveltekit_shim_env.js +18 -0
- package/dist/filer.d.ts +33 -0
- package/dist/filer.d.ts.map +1 -0
- package/dist/filer.js +385 -0
- package/dist/format.task.d.ts +11 -0
- package/dist/format.task.d.ts.map +1 -0
- package/dist/format.task.js +27 -0
- package/dist/format_directory.d.ts +13 -0
- package/dist/format_directory.d.ts.map +1 -0
- package/dist/format_directory.js +40 -0
- package/dist/format_file.d.ts +9 -0
- package/dist/format_file.d.ts.map +1 -0
- package/dist/format_file.js +42 -0
- package/dist/gen.d.ts +142 -0
- package/dist/gen.d.ts.map +1 -0
- package/dist/gen.js +199 -0
- package/dist/gen.task.d.ts +12 -0
- package/dist/gen.task.d.ts.map +1 -0
- package/dist/gen.task.js +149 -0
- package/dist/gen_helpers.d.ts +11 -0
- package/dist/gen_helpers.d.ts.map +1 -0
- package/dist/gen_helpers.js +76 -0
- package/dist/github.d.ts +19 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +33 -0
- package/dist/gro.config.default.d.ts +13 -0
- package/dist/gro.config.default.d.ts.map +1 -0
- package/dist/gro.config.default.js +33 -0
- package/dist/gro.d.ts +3 -0
- package/dist/gro.d.ts.map +1 -0
- package/dist/gro.js +21 -0
- package/dist/gro_config.d.ts +115 -0
- package/dist/gro_config.d.ts.map +1 -0
- package/dist/gro_config.js +114 -0
- package/dist/gro_helpers.d.ts +49 -0
- package/dist/gro_helpers.d.ts.map +1 -0
- package/dist/gro_helpers.js +97 -0
- package/dist/gro_plugin_gen.d.ts +12 -0
- package/dist/gro_plugin_gen.d.ts.map +1 -0
- package/dist/gro_plugin_gen.js +101 -0
- package/dist/gro_plugin_server.d.ts +80 -0
- package/dist/gro_plugin_server.d.ts.map +1 -0
- package/dist/gro_plugin_server.js +167 -0
- package/dist/gro_plugin_sveltekit_app.d.ts +9 -0
- package/dist/gro_plugin_sveltekit_app.d.ts.map +1 -0
- package/dist/gro_plugin_sveltekit_app.js +42 -0
- package/dist/gro_plugin_sveltekit_library.d.ts +16 -0
- package/dist/gro_plugin_sveltekit_library.d.ts.map +1 -0
- package/dist/gro_plugin_sveltekit_library.js +34 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/input_path.d.ts +64 -0
- package/dist/input_path.d.ts.map +1 -0
- package/dist/input_path.js +199 -0
- package/dist/invoke.d.ts +2 -0
- package/dist/invoke.d.ts.map +1 -0
- package/dist/invoke.js +28 -0
- package/dist/invoke_task.d.ts +30 -0
- package/dist/invoke_task.d.ts.map +1 -0
- package/dist/invoke_task.js +104 -0
- package/dist/lint.task.d.ts +11 -0
- package/dist/lint.task.d.ts.map +1 -0
- package/dist/lint.task.js +32 -0
- package/dist/loader.d.ts +6 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +192 -0
- package/dist/module.d.ts +4 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +6 -0
- package/dist/modules.d.ts +36 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +71 -0
- package/dist/package_json.d.ts +32 -0
- package/dist/package_json.d.ts.map +1 -0
- package/dist/package_json.js +178 -0
- package/dist/parse_exports.d.ts +20 -0
- package/dist/parse_exports.d.ts.map +1 -0
- package/dist/parse_exports.js +65 -0
- package/dist/parse_exports_context.d.ts +21 -0
- package/dist/parse_exports_context.d.ts.map +1 -0
- package/dist/parse_exports_context.js +332 -0
- package/dist/parse_imports.d.ts +5 -0
- package/dist/parse_imports.d.ts.map +1 -0
- package/dist/parse_imports.js +140 -0
- package/dist/paths.d.ts +41 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +69 -0
- package/dist/plugin.d.ts +36 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +78 -0
- package/dist/publish.task.d.ts +26 -0
- package/dist/publish.task.d.ts.map +1 -0
- package/dist/publish.task.js +176 -0
- package/dist/register.d.ts +2 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +2 -0
- package/dist/reinstall.task.d.ts +8 -0
- package/dist/reinstall.task.d.ts.map +1 -0
- package/dist/reinstall.task.js +35 -0
- package/dist/release.task.d.ts +8 -0
- package/dist/release.task.d.ts.map +1 -0
- package/dist/release.task.js +20 -0
- package/dist/resolve.task.d.ts +11 -0
- package/dist/resolve.task.d.ts.map +1 -0
- package/dist/resolve.task.js +38 -0
- package/dist/resolve_specifier.d.ts +22 -0
- package/dist/resolve_specifier.d.ts.map +1 -0
- package/dist/resolve_specifier.js +57 -0
- package/dist/run.task.d.ts +16 -0
- package/dist/run.task.d.ts.map +1 -0
- package/dist/run.task.js +52 -0
- package/dist/run_gen.d.ts +10 -0
- package/dist/run_gen.d.ts.map +1 -0
- package/dist/run_gen.js +73 -0
- package/dist/run_task.d.ts +17 -0
- package/dist/run_task.d.ts.map +1 -0
- package/dist/run_task.js +45 -0
- package/dist/source_json.d.ts +7 -0
- package/dist/source_json.d.ts.map +1 -0
- package/dist/source_json.js +145 -0
- package/dist/svelte_config.d.ts +57 -0
- package/dist/svelte_config.d.ts.map +1 -0
- package/dist/svelte_config.js +81 -0
- package/dist/sveltekit_helpers.d.ts +75 -0
- package/dist/sveltekit_helpers.d.ts.map +1 -0
- package/dist/sveltekit_helpers.js +94 -0
- package/dist/sveltekit_shim_app.d.ts +11 -0
- package/dist/sveltekit_shim_app.d.ts.map +1 -0
- package/dist/sveltekit_shim_app.js +31 -0
- package/dist/sveltekit_shim_app_environment.d.ts +13 -0
- package/dist/sveltekit_shim_app_environment.d.ts.map +1 -0
- package/dist/sveltekit_shim_app_environment.js +14 -0
- package/dist/sveltekit_shim_app_forms.d.ts +5 -0
- package/dist/sveltekit_shim_app_forms.d.ts.map +1 -0
- package/dist/sveltekit_shim_app_forms.js +6 -0
- package/dist/sveltekit_shim_app_navigation.d.ts +10 -0
- package/dist/sveltekit_shim_app_navigation.d.ts.map +1 -0
- package/dist/sveltekit_shim_app_navigation.js +11 -0
- package/dist/sveltekit_shim_app_paths.d.ts +17 -0
- package/dist/sveltekit_shim_app_paths.d.ts.map +1 -0
- package/dist/sveltekit_shim_app_paths.js +10 -0
- package/dist/sveltekit_shim_app_state.d.ts +5 -0
- package/dist/sveltekit_shim_app_state.d.ts.map +1 -0
- package/dist/sveltekit_shim_app_state.js +26 -0
- package/dist/sveltekit_shim_env.d.ts +5 -0
- package/dist/sveltekit_shim_env.d.ts.map +1 -0
- package/dist/sveltekit_shim_env.js +23 -0
- package/dist/sync.task.d.ts +16 -0
- package/dist/sync.task.d.ts.map +1 -0
- package/dist/sync.task.js +39 -0
- package/dist/task.d.ts +98 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +109 -0
- package/dist/task_logging.d.ts +6 -0
- package/dist/task_logging.d.ts.map +1 -0
- package/dist/task_logging.js +201 -0
- package/dist/test.task.d.ts +13 -0
- package/dist/test.task.d.ts.map +1 -0
- package/dist/test.task.js +53 -0
- package/dist/typecheck.task.d.ts +13 -0
- package/dist/typecheck.task.d.ts.map +1 -0
- package/dist/typecheck.task.js +68 -0
- package/dist/upgrade.task.d.ts +20 -0
- package/dist/upgrade.task.d.ts.map +1 -0
- package/dist/upgrade.task.js +111 -0
- package/dist/watch_dir.d.ts +36 -0
- package/dist/watch_dir.d.ts.map +1 -0
- package/dist/watch_dir.js +69 -0
- package/package.json +149 -0
- package/src/lib/args.ts +115 -0
- package/src/lib/build.task.ts +151 -0
- package/src/lib/build_cache.ts +378 -0
- package/src/lib/changelog.ts +69 -0
- package/src/lib/changeset.task.ts +228 -0
- package/src/lib/changeset_helpers.ts +14 -0
- package/src/lib/check.task.ts +132 -0
- package/src/lib/child_process_logging.ts +38 -0
- package/src/lib/clean.task.ts +48 -0
- package/src/lib/clean_fs.ts +54 -0
- package/src/lib/cli.ts +98 -0
- package/src/lib/commit.task.ts +34 -0
- package/src/lib/constants.ts +56 -0
- package/src/lib/deploy.task.ts +287 -0
- package/src/lib/dev.task.ts +52 -0
- package/src/lib/disknode.ts +26 -0
- package/src/lib/env.ts +78 -0
- package/src/lib/esbuild_helpers.ts +49 -0
- package/src/lib/esbuild_plugin_external_worker.ts +94 -0
- package/src/lib/esbuild_plugin_svelte.ts +134 -0
- package/src/lib/esbuild_plugin_sveltekit_local_imports.ts +38 -0
- package/src/lib/esbuild_plugin_sveltekit_shim_alias.ts +27 -0
- package/src/lib/esbuild_plugin_sveltekit_shim_app.ts +42 -0
- package/src/lib/esbuild_plugin_sveltekit_shim_env.ts +47 -0
- package/src/lib/filer.ts +458 -0
- package/src/lib/format.task.ts +44 -0
- package/src/lib/format_directory.ts +65 -0
- package/src/lib/format_file.ts +49 -0
- package/src/lib/gen.task.ts +206 -0
- package/src/lib/gen.ts +406 -0
- package/src/lib/gen_helpers.ts +131 -0
- package/src/lib/github.ts +46 -0
- package/src/lib/gro.config.default.ts +42 -0
- package/src/lib/gro.ts +29 -0
- package/src/lib/gro_config.ts +254 -0
- package/src/lib/gro_helpers.ts +108 -0
- package/src/lib/gro_plugin_gen.ts +149 -0
- package/src/lib/gro_plugin_server.ts +288 -0
- package/src/lib/gro_plugin_sveltekit_app.ts +58 -0
- package/src/lib/gro_plugin_sveltekit_library.ts +63 -0
- package/src/lib/index.ts +8 -0
- package/src/lib/input_path.ts +254 -0
- package/src/lib/invoke.ts +34 -0
- package/src/lib/invoke_task.ts +139 -0
- package/src/lib/lint.task.ts +39 -0
- package/src/lib/loader.ts +229 -0
- package/src/lib/module.ts +13 -0
- package/src/lib/modules.ts +117 -0
- package/src/lib/package_json.ts +255 -0
- package/src/lib/parse_exports.ts +100 -0
- package/src/lib/parse_exports_context.ts +395 -0
- package/src/lib/parse_imports.ts +180 -0
- package/src/lib/paths.ts +111 -0
- package/src/lib/plugin.ts +106 -0
- package/src/lib/publish.task.ts +228 -0
- package/src/lib/register.ts +3 -0
- package/src/lib/reinstall.task.ts +45 -0
- package/src/lib/release.task.ts +26 -0
- package/src/lib/resolve.task.ts +43 -0
- package/src/lib/resolve_specifier.ts +81 -0
- package/src/lib/run.task.ts +65 -0
- package/src/lib/run_gen.ts +110 -0
- package/src/lib/run_task.ts +82 -0
- package/src/lib/source_json.ts +183 -0
- package/src/lib/svelte_config.ts +140 -0
- package/src/lib/sveltekit_helpers.ts +193 -0
- package/src/lib/sveltekit_shim_app.ts +41 -0
- package/src/lib/sveltekit_shim_app_environment.ts +16 -0
- package/src/lib/sveltekit_shim_app_forms.ts +13 -0
- package/src/lib/sveltekit_shim_app_navigation.ts +23 -0
- package/src/lib/sveltekit_shim_app_paths.ts +26 -0
- package/src/lib/sveltekit_shim_app_state.ts +35 -0
- package/src/lib/sveltekit_shim_env.ts +45 -0
- package/src/lib/sync.task.ts +47 -0
- package/src/lib/task.ts +245 -0
- package/src/lib/task_logging.ts +255 -0
- package/src/lib/test.task.ts +63 -0
- package/src/lib/typecheck.task.ts +81 -0
- package/src/lib/upgrade.task.ts +148 -0
- package/src/lib/watch_dir.ts +115 -0
package/dist/task.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { Args } from '@fuzdev/fuz_util/args.js';
|
|
2
|
+
import type { Logger } from '@fuzdev/fuz_util/log.js';
|
|
3
|
+
import type { PathId } from '@fuzdev/fuz_util/path.js';
|
|
4
|
+
import type { Result } from '@fuzdev/fuz_util/result.js';
|
|
5
|
+
import type { Timings } from '@fuzdev/fuz_util/timings.js';
|
|
6
|
+
import type { z } from 'zod';
|
|
7
|
+
import type { GroConfig } from './gro_config.ts';
|
|
8
|
+
import type { ParsedSvelteConfig } from './svelte_config.ts';
|
|
9
|
+
import { type InputPath, type ResolvedInputFile, type ResolvedInputPath } from './input_path.ts';
|
|
10
|
+
import { type LoadModulesFailure, type ModuleMeta } from './modules.ts';
|
|
11
|
+
import type { Filer } from './filer.ts';
|
|
12
|
+
export interface Task<TArgs = Args, TArgsSchema extends z.ZodType<Args, Args> = z.ZodType<Args, Args>, // TODO improve type? separate input/output?
|
|
13
|
+
TReturn = unknown> {
|
|
14
|
+
run: (ctx: TaskContext<TArgs>) => TReturn | Promise<TReturn>;
|
|
15
|
+
summary?: string;
|
|
16
|
+
Args?: TArgsSchema;
|
|
17
|
+
}
|
|
18
|
+
export interface TaskContext<TArgs = object> {
|
|
19
|
+
args: TArgs;
|
|
20
|
+
config: GroConfig;
|
|
21
|
+
svelte_config: ParsedSvelteConfig;
|
|
22
|
+
filer: Filer;
|
|
23
|
+
log: Logger;
|
|
24
|
+
timings: Timings;
|
|
25
|
+
invoke_task: InvokeTask;
|
|
26
|
+
}
|
|
27
|
+
export type InvokeTask = (task_name: string, args?: Args, config?: GroConfig) => Promise<void>;
|
|
28
|
+
export declare const TASK_FILE_SUFFIX_TS = ".task.ts";
|
|
29
|
+
export declare const TASK_FILE_SUFFIX_JS = ".task.js";
|
|
30
|
+
export declare const TASK_FILE_SUFFIXES: string[];
|
|
31
|
+
export declare const is_task_path: (path: string) => boolean;
|
|
32
|
+
export declare const to_task_name: (id: PathId, task_root_dir: PathId, input_path: InputPath, root_path: PathId) => string;
|
|
33
|
+
/**
|
|
34
|
+
* This is used by tasks to signal a known failure.
|
|
35
|
+
* It's useful for cleaning up logging because
|
|
36
|
+
* we usually don't need their stack trace.
|
|
37
|
+
*/
|
|
38
|
+
export declare class TaskError extends Error {
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* This is used to tell Gro to exit silently, usually still with with a non-zero exit code.
|
|
42
|
+
* Using it means error logging is handled by the code that threw it.
|
|
43
|
+
*/
|
|
44
|
+
export declare class SilentError extends Error {
|
|
45
|
+
}
|
|
46
|
+
export interface FoundTask {
|
|
47
|
+
input_path: InputPath;
|
|
48
|
+
id: PathId;
|
|
49
|
+
task_root_dir: PathId;
|
|
50
|
+
}
|
|
51
|
+
export interface FoundTasks {
|
|
52
|
+
resolved_input_files: Array<ResolvedInputFile>;
|
|
53
|
+
resolved_input_files_by_root_dir: Map<PathId, Array<ResolvedInputFile>>;
|
|
54
|
+
resolved_input_paths: Array<ResolvedInputPath>;
|
|
55
|
+
input_paths: Array<InputPath>;
|
|
56
|
+
task_root_dirs: Array<PathId>;
|
|
57
|
+
}
|
|
58
|
+
export type FindTasksResult = Result<{
|
|
59
|
+
value: FoundTasks;
|
|
60
|
+
}, FindModulesFailure>;
|
|
61
|
+
export type FindModulesFailure = {
|
|
62
|
+
type: 'unmapped_input_paths';
|
|
63
|
+
unmapped_input_paths: Array<InputPath>;
|
|
64
|
+
resolved_input_paths: Array<ResolvedInputPath>;
|
|
65
|
+
input_paths: Array<InputPath>;
|
|
66
|
+
task_root_dirs: Array<PathId>;
|
|
67
|
+
reasons: Array<string>;
|
|
68
|
+
} | {
|
|
69
|
+
type: 'input_directories_with_no_files';
|
|
70
|
+
input_directories_with_no_files: Array<InputPath>;
|
|
71
|
+
resolved_input_files: Array<ResolvedInputFile>;
|
|
72
|
+
resolved_input_files_by_root_dir: Map<PathId, Array<ResolvedInputFile>>;
|
|
73
|
+
resolved_input_paths: Array<ResolvedInputPath>;
|
|
74
|
+
input_paths: Array<InputPath>;
|
|
75
|
+
task_root_dirs: Array<PathId>;
|
|
76
|
+
reasons: Array<string>;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Finds modules from input paths. (see `src/lib/input_path.ts` for more)
|
|
80
|
+
*/
|
|
81
|
+
export declare const find_tasks: (input_paths: Array<InputPath>, task_root_dirs: Array<PathId>, config: GroConfig, timings?: Timings) => Promise<FindTasksResult>;
|
|
82
|
+
export interface LoadedTasks {
|
|
83
|
+
modules: Array<TaskModuleMeta>;
|
|
84
|
+
found_tasks: FoundTasks;
|
|
85
|
+
}
|
|
86
|
+
export interface TaskModule {
|
|
87
|
+
task: Task;
|
|
88
|
+
}
|
|
89
|
+
export interface TaskModuleMeta extends ModuleMeta<TaskModule> {
|
|
90
|
+
name: string;
|
|
91
|
+
}
|
|
92
|
+
export type LoadTasksResult = Result<{
|
|
93
|
+
value: LoadedTasks;
|
|
94
|
+
}, LoadTasksFailure>;
|
|
95
|
+
export type LoadTasksFailure = LoadModulesFailure<TaskModuleMeta>;
|
|
96
|
+
export declare const load_tasks: (found_tasks: FoundTasks, root_path?: PathId) => Promise<LoadTasksResult>;
|
|
97
|
+
export declare const validate_task_module: (mod: Record<string, any>) => mod is TaskModule;
|
|
98
|
+
//# sourceMappingURL=task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/task.ts"],"names":[],"mappings":"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"}
|
package/dist/task.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { fs_search } from '@fuzdev/fuz_util/fs.js';
|
|
2
|
+
import { ensure_end, strip_end, strip_start } from '@fuzdev/fuz_util/string.js';
|
|
3
|
+
import { isAbsolute, join, relative } from 'node:path';
|
|
4
|
+
import { styleText as st } from 'node:util';
|
|
5
|
+
import { resolve_input_files, resolve_input_paths, } from "./input_path.js";
|
|
6
|
+
import { GRO_DIST_DIR, print_path } from "./paths.js";
|
|
7
|
+
import { load_modules } from "./modules.js";
|
|
8
|
+
export const TASK_FILE_SUFFIX_TS = '.task.ts';
|
|
9
|
+
export const TASK_FILE_SUFFIX_JS = '.task.js';
|
|
10
|
+
export const TASK_FILE_SUFFIXES = [TASK_FILE_SUFFIX_TS, TASK_FILE_SUFFIX_JS]; // TODO from `GroConfig`, but needs to be used everywhere the constants are
|
|
11
|
+
export const is_task_path = (path) => path.endsWith(TASK_FILE_SUFFIX_TS) || path.endsWith(TASK_FILE_SUFFIX_JS);
|
|
12
|
+
export const to_task_name = (id, task_root_dir, input_path, root_path) => {
|
|
13
|
+
let task_name = id.startsWith(task_root_dir)
|
|
14
|
+
? strip_start(strip_start(id, task_root_dir), '/')
|
|
15
|
+
: id;
|
|
16
|
+
for (const suffix of TASK_FILE_SUFFIXES) {
|
|
17
|
+
task_name = strip_end(task_name, suffix);
|
|
18
|
+
}
|
|
19
|
+
if (ensure_end(task_root_dir, '/') === GRO_DIST_DIR) {
|
|
20
|
+
// TODO ideally it would display this in some contexts like the task progress logs,
|
|
21
|
+
// but not all, like printing the task list, UNLESS there's a local override
|
|
22
|
+
// return 'gro/' + task_name;
|
|
23
|
+
return task_name;
|
|
24
|
+
}
|
|
25
|
+
if (isAbsolute(input_path)) {
|
|
26
|
+
return relative(root_path, join(task_root_dir, task_name));
|
|
27
|
+
}
|
|
28
|
+
return task_name;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* This is used by tasks to signal a known failure.
|
|
32
|
+
* It's useful for cleaning up logging because
|
|
33
|
+
* we usually don't need their stack trace.
|
|
34
|
+
*/
|
|
35
|
+
export class TaskError extends Error {
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* This is used to tell Gro to exit silently, usually still with with a non-zero exit code.
|
|
39
|
+
* Using it means error logging is handled by the code that threw it.
|
|
40
|
+
*/
|
|
41
|
+
export class SilentError extends Error {
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Finds modules from input paths. (see `src/lib/input_path.ts` for more)
|
|
45
|
+
*/
|
|
46
|
+
export const find_tasks = async (input_paths, task_root_dirs, config, timings) => {
|
|
47
|
+
// Check which extension variation works - if it's a directory, prefer others first!
|
|
48
|
+
const timing_to_resolve_input_paths = timings?.start('resolve input paths');
|
|
49
|
+
const { resolved_input_paths, unmapped_input_paths } = await resolve_input_paths(input_paths, task_root_dirs, TASK_FILE_SUFFIXES);
|
|
50
|
+
timing_to_resolve_input_paths?.();
|
|
51
|
+
// Error if any input path could not be mapped.
|
|
52
|
+
if (unmapped_input_paths.length) {
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
type: 'unmapped_input_paths',
|
|
56
|
+
unmapped_input_paths,
|
|
57
|
+
resolved_input_paths,
|
|
58
|
+
input_paths,
|
|
59
|
+
task_root_dirs,
|
|
60
|
+
reasons: unmapped_input_paths.map((input_path) => st('red', `Input path ${print_path(input_path)} cannot be mapped to a file or directory.`)),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Find all of the files for any directories.
|
|
64
|
+
const timing_to_resolve_input_files = timings?.start('resolve input files');
|
|
65
|
+
const { resolved_input_files, resolved_input_files_by_root_dir, input_directories_with_no_files } = await resolve_input_files(resolved_input_paths, async (id) => await fs_search(id, {
|
|
66
|
+
filter: config.search_filters,
|
|
67
|
+
file_filter: (p) => TASK_FILE_SUFFIXES.some((s) => p.endsWith(s)),
|
|
68
|
+
}));
|
|
69
|
+
timing_to_resolve_input_files?.();
|
|
70
|
+
// Error if any input path has no files. (means we have an empty directory)
|
|
71
|
+
if (input_directories_with_no_files.length) {
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
type: 'input_directories_with_no_files',
|
|
75
|
+
input_directories_with_no_files,
|
|
76
|
+
resolved_input_files,
|
|
77
|
+
resolved_input_files_by_root_dir,
|
|
78
|
+
resolved_input_paths,
|
|
79
|
+
input_paths,
|
|
80
|
+
task_root_dirs,
|
|
81
|
+
reasons: input_directories_with_no_files.map((input_path) => st('red', `Input directory contains no matching files: ${print_path(input_path)}`)),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
value: {
|
|
87
|
+
resolved_input_files,
|
|
88
|
+
resolved_input_files_by_root_dir,
|
|
89
|
+
resolved_input_paths,
|
|
90
|
+
input_paths,
|
|
91
|
+
task_root_dirs,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
export const load_tasks = async (found_tasks, root_path = process.cwd()) => {
|
|
96
|
+
const loaded_modules = await load_modules(found_tasks.resolved_input_files, validate_task_module, (resolved_input_file, mod) => ({
|
|
97
|
+
id: resolved_input_file.id,
|
|
98
|
+
mod,
|
|
99
|
+
name: to_task_name(resolved_input_file.id, resolved_input_file.resolved_input_path.root_dir, resolved_input_file.resolved_input_path.input_path, root_path),
|
|
100
|
+
}));
|
|
101
|
+
if (!loaded_modules.ok) {
|
|
102
|
+
return loaded_modules;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
ok: true,
|
|
106
|
+
value: { modules: loaded_modules.modules, found_tasks },
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
export const validate_task_module = (mod) => !!mod.task && typeof mod.task.run === 'function';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Logger } from '@fuzdev/fuz_util/log.js';
|
|
2
|
+
import type { LoadedTasks, TaskModuleMeta } from './task.ts';
|
|
3
|
+
export declare const log_tasks: (log: Logger, loaded_tasks: LoadedTasks, log_intro?: boolean) => void;
|
|
4
|
+
export declare const log_error_reasons: (log: Logger, reasons: Array<string>) => void;
|
|
5
|
+
export declare const log_task_help: (log: Logger, meta: TaskModuleMeta) => void;
|
|
6
|
+
//# sourceMappingURL=task_logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task_logging.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/task_logging.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAKpD,OAAO,KAAK,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AAG3D,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,cAAc,WAAW,EAAE,mBAAgB,KAAG,IAkCpF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,SAAS,KAAK,CAAC,MAAM,CAAC,KAAG,IAIvE,CAAC;AAIF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,MAAM,cAAc,KAAG,IAkCjE,CAAC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { print_value } from '@fuzdev/fuz_util/print.js';
|
|
2
|
+
import { plural } from '@fuzdev/fuz_util/string.js';
|
|
3
|
+
import { styleText as st } from 'node:util';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { print_path } from "./paths.js";
|
|
6
|
+
export const log_tasks = (log, loaded_tasks, log_intro = true) => {
|
|
7
|
+
const { modules, found_tasks } = loaded_tasks;
|
|
8
|
+
const { resolved_input_files_by_root_dir } = found_tasks;
|
|
9
|
+
const logged = [];
|
|
10
|
+
if (log_intro) {
|
|
11
|
+
logged.unshift(`\n\n${st('gray', 'Run a task:')} gro [name]`, `\n${st('gray', 'View help:')} gro [name] --help`);
|
|
12
|
+
}
|
|
13
|
+
for (const [root_dir, resolved_input_files] of resolved_input_files_by_root_dir) {
|
|
14
|
+
const dir_label = print_path(root_dir);
|
|
15
|
+
if (!resolved_input_files.length) {
|
|
16
|
+
log.info(`No tasks found in ${dir_label}.`);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
logged.push(`${log_intro ? '\n\n' : ''}${resolved_input_files.length} task${plural(resolved_input_files.length)} in ${dir_label}:\n`);
|
|
20
|
+
const longest_task_name = to_max_length(modules, (m) => m.name);
|
|
21
|
+
for (const resolved_input_file of resolved_input_files) {
|
|
22
|
+
const meta = modules.find((m) => m.id === resolved_input_file.id);
|
|
23
|
+
logged.push('\n' + st('cyan', meta.name.padEnd(longest_task_name)), ' ', meta.mod.task.summary ?? '');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
log[log_intro ? 'info' : 'raw'](logged.join('') + '\n');
|
|
27
|
+
};
|
|
28
|
+
export const log_error_reasons = (log, reasons) => {
|
|
29
|
+
for (const reason of reasons) {
|
|
30
|
+
log.error(st('red', reason));
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const ARGS_PROPERTY_NAME = '[...args]';
|
|
34
|
+
export const log_task_help = (log, meta) => {
|
|
35
|
+
const { name, mod: { task }, } = meta;
|
|
36
|
+
const logged = [];
|
|
37
|
+
logged.push(st('cyan', name), 'help', st('cyan', `\n\ngro ${name}`) + `: ${task.summary ?? '(no summary available)'}\n`);
|
|
38
|
+
if (task.Args) {
|
|
39
|
+
const properties = to_arg_properties(task.Args, meta, log);
|
|
40
|
+
// TODO hacky padding for some quick and dirty tables
|
|
41
|
+
const longest_task_name = Math.max(ARGS_PROPERTY_NAME.length, to_max_length(properties, (p) => p.name));
|
|
42
|
+
const longest_type = to_max_length(properties, (p) => p.schema.type);
|
|
43
|
+
const longest_default = to_max_length(properties, (p) => print_value(p.schema.default));
|
|
44
|
+
for (const property of properties) {
|
|
45
|
+
const name = property.name === '_' ? ARGS_PROPERTY_NAME : property.name;
|
|
46
|
+
logged.push(`\n${st('green', name.padEnd(longest_task_name))} `, st('gray', property.schema.type.padEnd(longest_type)) + ' ', print_value(property.schema.default).padEnd(longest_default) + ' ', property.schema.description || '(no description available)');
|
|
47
|
+
}
|
|
48
|
+
if (!properties.length) {
|
|
49
|
+
logged.push('\n' + st('gray', 'this task has no args'));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
log.info(...logged, '\n');
|
|
53
|
+
};
|
|
54
|
+
// TODO this blocks many usecases like unions, and it's only implemented for CLI arg types, need better support for arbitrary schemas
|
|
55
|
+
const to_arg_properties = (schema, meta, log) => {
|
|
56
|
+
const { def } = schema;
|
|
57
|
+
// TODO overly restrictive, support optional objects and/or unions?
|
|
58
|
+
if (!('shape' in def)) {
|
|
59
|
+
log.error(`Expected Args for task "${meta.name}" to be an object schema but got ${def.type}`);
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const shape = def.shape;
|
|
63
|
+
const properties = [];
|
|
64
|
+
for (const name in shape) {
|
|
65
|
+
if ('no-' + name in shape)
|
|
66
|
+
continue;
|
|
67
|
+
const s = shape[name];
|
|
68
|
+
const schema = {
|
|
69
|
+
type: to_args_schema_type(s),
|
|
70
|
+
description: to_args_schema_description(s) || '',
|
|
71
|
+
default: to_args_schema_default(s),
|
|
72
|
+
};
|
|
73
|
+
properties.push({ name, schema });
|
|
74
|
+
}
|
|
75
|
+
return properties;
|
|
76
|
+
};
|
|
77
|
+
const to_max_length = (items, toString) => items.reduce((max, m) => Math.max(toString(m).length, max), 0);
|
|
78
|
+
const to_args_schema_type = (schema) => {
|
|
79
|
+
const { def } = schema._zod;
|
|
80
|
+
switch (def.type) {
|
|
81
|
+
case 'string':
|
|
82
|
+
return 'string';
|
|
83
|
+
case 'number':
|
|
84
|
+
return 'number';
|
|
85
|
+
case 'int':
|
|
86
|
+
return 'int';
|
|
87
|
+
case 'boolean':
|
|
88
|
+
return 'boolean';
|
|
89
|
+
case 'bigint':
|
|
90
|
+
return 'bigint';
|
|
91
|
+
case 'symbol':
|
|
92
|
+
return 'symbol';
|
|
93
|
+
case 'null':
|
|
94
|
+
return 'null';
|
|
95
|
+
case 'undefined':
|
|
96
|
+
return 'undefined';
|
|
97
|
+
case 'void':
|
|
98
|
+
return 'void';
|
|
99
|
+
case 'never':
|
|
100
|
+
return 'never';
|
|
101
|
+
case 'any':
|
|
102
|
+
return 'any';
|
|
103
|
+
case 'unknown':
|
|
104
|
+
return 'unknown';
|
|
105
|
+
case 'date':
|
|
106
|
+
return 'date';
|
|
107
|
+
case 'object':
|
|
108
|
+
return 'object';
|
|
109
|
+
case 'record':
|
|
110
|
+
return 'record';
|
|
111
|
+
case 'file':
|
|
112
|
+
return 'file';
|
|
113
|
+
case 'array':
|
|
114
|
+
// TODO other types, only handling a subset of CLI arg cases
|
|
115
|
+
return 'Array<string>';
|
|
116
|
+
case 'tuple':
|
|
117
|
+
return 'tuple';
|
|
118
|
+
case 'union':
|
|
119
|
+
// TODO fix, this is a hacky way to handle unions for CLI args
|
|
120
|
+
return 'string | Array<string>';
|
|
121
|
+
case 'intersection':
|
|
122
|
+
return 'intersection';
|
|
123
|
+
case 'map':
|
|
124
|
+
return 'map';
|
|
125
|
+
case 'set':
|
|
126
|
+
return 'set';
|
|
127
|
+
case 'enum':
|
|
128
|
+
return schema.options
|
|
129
|
+
.map((v) => `'${v}'`)
|
|
130
|
+
.join(' | ');
|
|
131
|
+
case 'literal':
|
|
132
|
+
return def.values.map((v) => print_value(v)).join(' | ');
|
|
133
|
+
case 'nullable': {
|
|
134
|
+
const subschema = to_subschema(def);
|
|
135
|
+
return subschema ? to_args_schema_type(subschema) + ' | null' : 'nullable';
|
|
136
|
+
}
|
|
137
|
+
case 'optional': {
|
|
138
|
+
const subschema = to_subschema(def);
|
|
139
|
+
return subschema ? to_args_schema_type(subschema) + ' | undefined' : 'optional';
|
|
140
|
+
}
|
|
141
|
+
case 'success':
|
|
142
|
+
return 'success';
|
|
143
|
+
case 'catch':
|
|
144
|
+
return 'catch';
|
|
145
|
+
case 'nan':
|
|
146
|
+
return 'NaN';
|
|
147
|
+
case 'readonly':
|
|
148
|
+
return 'readonly';
|
|
149
|
+
case 'template_literal':
|
|
150
|
+
return 'template_literal';
|
|
151
|
+
case 'promise':
|
|
152
|
+
return 'promise';
|
|
153
|
+
case 'lazy':
|
|
154
|
+
return 'lazy';
|
|
155
|
+
case 'custom':
|
|
156
|
+
return 'custom';
|
|
157
|
+
// Unwrap these:
|
|
158
|
+
// case 'nonoptional':
|
|
159
|
+
// case 'transform':
|
|
160
|
+
// case 'default':
|
|
161
|
+
// case 'prefault':
|
|
162
|
+
// case 'pipe':
|
|
163
|
+
default: {
|
|
164
|
+
const subschema = to_subschema(def);
|
|
165
|
+
return subschema ? to_args_schema_type(subschema) : def.type;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
const to_args_schema_description = (schema) => {
|
|
170
|
+
const meta = schema.meta();
|
|
171
|
+
if (meta?.description) {
|
|
172
|
+
return meta.description;
|
|
173
|
+
}
|
|
174
|
+
const subschema = to_subschema(schema.def);
|
|
175
|
+
if (subschema) {
|
|
176
|
+
return to_args_schema_description(subschema);
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
};
|
|
180
|
+
const to_args_schema_default = (schema) => {
|
|
181
|
+
const { def } = schema._zod;
|
|
182
|
+
if ('defaultValue' in def) {
|
|
183
|
+
return def.defaultValue;
|
|
184
|
+
}
|
|
185
|
+
const subschema = to_subschema(def);
|
|
186
|
+
if (subschema) {
|
|
187
|
+
return to_args_schema_default(subschema);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const to_subschema = (def) => {
|
|
191
|
+
if ('innerType' in def) {
|
|
192
|
+
return def.innerType;
|
|
193
|
+
}
|
|
194
|
+
else if ('in' in def) {
|
|
195
|
+
return def.in;
|
|
196
|
+
}
|
|
197
|
+
else if ('schema' in def) {
|
|
198
|
+
return def.schema;
|
|
199
|
+
}
|
|
200
|
+
return undefined;
|
|
201
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type Task } from './task.ts';
|
|
3
|
+
/** @nodocs */
|
|
4
|
+
export declare const Args: z.ZodObject<{
|
|
5
|
+
_: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
6
|
+
dir: z.ZodDefault<z.ZodString>;
|
|
7
|
+
fail_without_tests: z.ZodDefault<z.ZodBoolean>;
|
|
8
|
+
t: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strict>;
|
|
10
|
+
export type Args = z.infer<typeof Args>;
|
|
11
|
+
/** @nodocs */
|
|
12
|
+
export declare const task: Task<Args>;
|
|
13
|
+
//# sourceMappingURL=test.task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/test.task.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAOtB,OAAO,EAAY,KAAK,IAAI,EAAC,MAAM,WAAW,CAAC;AAE/C,cAAc;AACd,eAAO,MAAM,IAAI;;;;;kBAWf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAkC3B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { args_serialize } from '@fuzdev/fuz_util/args.js';
|
|
2
|
+
import { spawn_result_to_message } from '@fuzdev/fuz_util/process.js';
|
|
3
|
+
import { spawn_cli } from './cli.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { to_implicit_forwarded_args } from "./args.js";
|
|
6
|
+
import { find_cli } from "./cli.js";
|
|
7
|
+
import { VITEST_CLI } from "./constants.js";
|
|
8
|
+
import { package_json_has_dependency, package_json_load } from "./package_json.js";
|
|
9
|
+
import { paths } from "./paths.js";
|
|
10
|
+
import { TaskError } from "./task.js";
|
|
11
|
+
/** @nodocs */
|
|
12
|
+
export const Args = z.strictObject({
|
|
13
|
+
_: z.array(z.string()).meta({ description: 'file patterns to filter tests' }).default(['.test.']),
|
|
14
|
+
dir: z.string().meta({ description: 'working directory for tests' }).default(paths.source),
|
|
15
|
+
fail_without_tests: z
|
|
16
|
+
.boolean()
|
|
17
|
+
.meta({ description: 'opt out of `passWithNoTests`' })
|
|
18
|
+
.default(false),
|
|
19
|
+
t: z
|
|
20
|
+
.string()
|
|
21
|
+
.meta({ description: 'search pattern for test names, same as vitest -t and --testNamePattern' })
|
|
22
|
+
.optional(),
|
|
23
|
+
});
|
|
24
|
+
/** @nodocs */
|
|
25
|
+
export const task = {
|
|
26
|
+
summary: 'run tests with vitest',
|
|
27
|
+
Args,
|
|
28
|
+
run: async ({ args }) => {
|
|
29
|
+
const { _: patterns, dir, fail_without_tests, t } = args;
|
|
30
|
+
const package_json = await package_json_load();
|
|
31
|
+
if (!package_json_has_dependency(VITEST_CLI, package_json)) {
|
|
32
|
+
throw new TaskError('no test runner found, install vitest');
|
|
33
|
+
}
|
|
34
|
+
if (!(await find_cli(VITEST_CLI))) {
|
|
35
|
+
throw new TaskError('vitest is a dependency but not installed; run `npm i`?');
|
|
36
|
+
}
|
|
37
|
+
const vitest_args = ['run', ...patterns];
|
|
38
|
+
if (dir) {
|
|
39
|
+
vitest_args.push('--dir', dir);
|
|
40
|
+
}
|
|
41
|
+
if (!fail_without_tests) {
|
|
42
|
+
vitest_args.push('--passWithNoTests');
|
|
43
|
+
}
|
|
44
|
+
if (t) {
|
|
45
|
+
vitest_args.push('-t', t);
|
|
46
|
+
}
|
|
47
|
+
vitest_args.push(...args_serialize(to_implicit_forwarded_args(VITEST_CLI)));
|
|
48
|
+
const spawned = await spawn_cli(VITEST_CLI, vitest_args);
|
|
49
|
+
if (!spawned?.ok) {
|
|
50
|
+
throw new TaskError(`vitest failed: ${spawned ? spawn_result_to_message(spawned) : 'unknown error'}`);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type Task } from './task.ts';
|
|
3
|
+
/** @nodocs */
|
|
4
|
+
export declare const Args: z.ZodObject<{
|
|
5
|
+
svelte_check_cli: z.ZodDefault<z.ZodString>;
|
|
6
|
+
typescript_cli: z.ZodDefault<z.ZodString>;
|
|
7
|
+
path_replacement: z.ZodDefault<z.ZodString>;
|
|
8
|
+
cwd: z.ZodDefault<z.ZodString>;
|
|
9
|
+
}, z.core.$strict>;
|
|
10
|
+
export type Args = z.infer<typeof Args>;
|
|
11
|
+
/** @nodocs */
|
|
12
|
+
export declare const task: Task<Args>;
|
|
13
|
+
//# sourceMappingURL=typecheck.task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/typecheck.task.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAQtB,OAAO,EAAY,KAAK,IAAI,EAAC,MAAM,WAAW,CAAC;AAE/C,cAAc;AACd,eAAO,MAAM,IAAI;;;;;kBAcf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAiD3B,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { args_serialize } from '@fuzdev/fuz_util/args.js';
|
|
2
|
+
import { print_spawn_result } from '@fuzdev/fuz_util/process.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { to_forwarded_args } from "./args.js";
|
|
5
|
+
import { configure_colored_output_with_path_replacement } from "./child_process_logging.js";
|
|
6
|
+
import { find_cli, spawn_cli, spawn_cli_process } from "./cli.js";
|
|
7
|
+
import { SVELTE_CHECK_CLI } from "./constants.js";
|
|
8
|
+
import { paths } from "./paths.js";
|
|
9
|
+
import { sveltekit_sync_if_available } from "./sveltekit_helpers.js";
|
|
10
|
+
import { TaskError } from "./task.js";
|
|
11
|
+
/** @nodocs */
|
|
12
|
+
export const Args = z.strictObject({
|
|
13
|
+
svelte_check_cli: z
|
|
14
|
+
.string()
|
|
15
|
+
.meta({ description: 'the svelte-check CLI to use' })
|
|
16
|
+
.default(SVELTE_CHECK_CLI),
|
|
17
|
+
typescript_cli: z
|
|
18
|
+
.string()
|
|
19
|
+
.meta({ description: 'the TypeScript CLI to use as a fallback to svelte-check' })
|
|
20
|
+
.default('tsc'),
|
|
21
|
+
path_replacement: z
|
|
22
|
+
.string()
|
|
23
|
+
.meta({ description: 'replacement string for current working directory in output' })
|
|
24
|
+
.default('.'),
|
|
25
|
+
cwd: z.string().meta({ description: 'current working directory' }).default(paths.root),
|
|
26
|
+
});
|
|
27
|
+
/** @nodocs */
|
|
28
|
+
export const task = {
|
|
29
|
+
summary: 'run svelte-check or tsc on the project without emitting any files',
|
|
30
|
+
Args,
|
|
31
|
+
run: async ({ args, log }) => {
|
|
32
|
+
const { svelte_check_cli, typescript_cli, path_replacement, cwd } = args;
|
|
33
|
+
await sveltekit_sync_if_available();
|
|
34
|
+
// Prefer svelte-check if available.
|
|
35
|
+
const found_svelte_check_cli = await find_cli(svelte_check_cli);
|
|
36
|
+
if (found_svelte_check_cli) {
|
|
37
|
+
const serialized = args_serialize(to_forwarded_args(svelte_check_cli));
|
|
38
|
+
const spawned = await spawn_cli_process(found_svelte_check_cli, serialized, undefined, {
|
|
39
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
40
|
+
env: { ...process.env, FORCE_COLOR: '1' }, // Needed for colors (maybe make an option)
|
|
41
|
+
});
|
|
42
|
+
const svelte_check_process = spawned?.child;
|
|
43
|
+
if (svelte_check_process) {
|
|
44
|
+
// Configure process output with path replacement while preserving colors
|
|
45
|
+
configure_colored_output_with_path_replacement(svelte_check_process, path_replacement, cwd);
|
|
46
|
+
const svelte_check_result = await spawned.closed;
|
|
47
|
+
if (!svelte_check_result.ok) {
|
|
48
|
+
throw new TaskError(`Failed to typecheck. ${print_spawn_result(svelte_check_result)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Fall back to tsc.
|
|
54
|
+
const found_typescript_cli = await find_cli(typescript_cli);
|
|
55
|
+
if (found_typescript_cli) {
|
|
56
|
+
const forwarded = to_forwarded_args(typescript_cli);
|
|
57
|
+
if (!forwarded.noEmit)
|
|
58
|
+
forwarded.noEmit = true;
|
|
59
|
+
const serialized = args_serialize(forwarded);
|
|
60
|
+
const svelte_check_result = await spawn_cli(found_typescript_cli, serialized, log);
|
|
61
|
+
if (!svelte_check_result?.ok) {
|
|
62
|
+
throw new TaskError(`Failed to typecheck. ${print_spawn_result(svelte_check_result)}`);
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
throw new TaskError(`Failed to typecheck because neither \`${svelte_check_cli}\` nor \`${typescript_cli}\` was found`);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type Task } from './task.ts';
|
|
3
|
+
/** @nodocs */
|
|
4
|
+
export declare const Args: z.ZodObject<{
|
|
5
|
+
_: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
6
|
+
only: z.ZodPipe<z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>, z.ZodTransform<string[], string | string[]>>;
|
|
7
|
+
origin: z.ZodDefault<z.ZodString>;
|
|
8
|
+
force: z.ZodDefault<z.ZodBoolean>;
|
|
9
|
+
pull: z.ZodDefault<z.ZodBoolean>;
|
|
10
|
+
'no-pull': z.ZodDefault<z.ZodBoolean>;
|
|
11
|
+
delete_node_modules: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
+
node_modules_path: z.ZodDefault<z.ZodString>;
|
|
13
|
+
delete_lockfile: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
lockfile_path: z.ZodDefault<z.ZodString>;
|
|
15
|
+
dry: z.ZodDefault<z.ZodBoolean>;
|
|
16
|
+
}, z.core.$strict>;
|
|
17
|
+
export type Args = z.infer<typeof Args>;
|
|
18
|
+
/** @nodocs */
|
|
19
|
+
export declare const task: Task<Args>;
|
|
20
|
+
//# sourceMappingURL=upgrade.task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/upgrade.task.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAUtB,OAAO,EAAY,KAAK,IAAI,EAAC,MAAM,WAAW,CAAC;AAE/C,cAAc;AACd,eAAO,MAAM,IAAI;;;;;;;;;;;;kBAiCf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CA4E3B,CAAC"}
|