auklet 0.1.4 → 0.1.6
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/README.md +116 -429
- package/dist/cli/build.d.ts +3 -5
- package/dist/cli/build.js +86 -23
- package/dist/cli/buildCss.d.ts +10 -5
- package/dist/cli/buildCss.js +21 -17
- package/dist/cli/buildWorkspace.d.ts +24 -0
- package/dist/cli/buildWorkspace.js +43 -0
- package/dist/cli/dev.d.ts +2 -1
- package/dist/cli/dev.js +130 -23
- package/dist/cli/main.js +167 -26
- package/dist/cli/parse/build.d.ts +63 -0
- package/dist/cli/{buildArgs.js → parse/build.js} +47 -22
- package/dist/cli/parse/core.d.ts +14 -0
- package/dist/cli/parse/core.js +68 -0
- package/dist/cli/parse/dev.d.ts +18 -0
- package/dist/cli/parse/dev.js +4 -0
- package/dist/cli/parse/owner.d.ts +11 -0
- package/dist/cli/parse/owner.js +25 -0
- package/dist/cli/parse/publish.d.ts +19 -0
- package/dist/cli/parse/publish.js +60 -0
- package/dist/cli/parse/workspace.d.ts +14 -0
- package/dist/cli/parse/workspace.js +60 -0
- package/dist/css/inspect.js +4 -3
- package/dist/publish/api/pnpmApi.d.ts +0 -4
- package/dist/publish/api/pnpmApi.js +0 -34
- package/dist/publish/cli.d.ts +0 -16
- package/dist/publish/cli.js +5 -122
- package/dist/publish/inspect.js +2 -2
- package/dist/publish/targetResolver.js +28 -72
- package/dist/publish/types.d.ts +1 -7
- package/dist/workspace/targets.d.ts +31 -0
- package/dist/workspace/targets.js +144 -0
- package/package.json +1 -1
- package/dist/cli/buildArgs.d.ts +0 -9
- package/dist/cli/publish.d.ts +0 -2
- package/dist/cli/publish.js +0 -9
- /package/dist/cli/{values.d.ts → parse/values.d.ts} +0 -0
- /package/dist/cli/{values.js → parse/values.js} +0 -0
package/dist/cli/build.js
CHANGED
|
@@ -1,40 +1,103 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
1
2
|
import { cleanAukletOutputByConfig } from '#auklet/build/cleanOutput';
|
|
2
3
|
import { mergeAukletConfigOverrides } from '#auklet/build/cliOverrides';
|
|
3
4
|
import { runTsdown } from '#auklet/build/runTsdown';
|
|
4
5
|
import { loadAukletConfig } from '#auklet/configLoader';
|
|
5
|
-
import { createBuildEnv
|
|
6
|
+
import { createBuildEnv } from '#auklet/cli/parse/build';
|
|
6
7
|
import { runBuildCss } from '#auklet/cli/buildCss';
|
|
7
|
-
import { AukletEnvContext } from '#auklet/env';
|
|
8
8
|
import { createAukletLogger } from '#auklet/logger';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const config = mergeAukletConfigOverrides(options.config ?? {}, buildArgs.config);
|
|
9
|
+
import { getWorkspacePackageScript, resolveWorkspaceBuildTargets, } from '#auklet/cli/buildWorkspace';
|
|
10
|
+
const workspaceBuildEnv = 'AUKLET_WORKSPACE_BUILD';
|
|
11
|
+
export async function runBuildJs(options) {
|
|
12
|
+
return options.envContext.run(async () => {
|
|
14
13
|
const logger = createAukletLogger();
|
|
15
14
|
return logger.group('Build JavaScript', async () => {
|
|
16
|
-
return runTsdown(
|
|
17
|
-
cwd:
|
|
15
|
+
return runTsdown(options.passthroughArgs, {
|
|
16
|
+
cwd: options.cwd,
|
|
18
17
|
env: {
|
|
19
|
-
...envContext.values,
|
|
20
|
-
...createBuildEnv(
|
|
18
|
+
...options.envContext.values,
|
|
19
|
+
...createBuildEnv(options.overrides),
|
|
21
20
|
},
|
|
22
21
|
});
|
|
23
22
|
});
|
|
24
23
|
});
|
|
25
24
|
}
|
|
26
|
-
export async function runBuild(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
export async function runBuild(options) {
|
|
26
|
+
return options.envContext.run(async () => {
|
|
27
|
+
if (options.workspace.filters.length) {
|
|
28
|
+
if (process.env[workspaceBuildEnv]) {
|
|
29
|
+
throw new Error('[build] recursive workspace build detected. Do not run `auk build --workspace` from a workspace package build script.');
|
|
30
|
+
}
|
|
31
|
+
return runWorkspaceBuild(options.workspaceScriptArgs, {
|
|
32
|
+
cwd: options.cwd,
|
|
33
|
+
envContext: options.envContext,
|
|
34
|
+
filters: options.workspace.filters,
|
|
35
|
+
includeDependencies: options.workspace.includeDependencies,
|
|
36
|
+
includePrivate: options.workspace.includePrivate,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (options.workspace.includeDependencies) {
|
|
40
|
+
throw new Error('[build] --deps requires --filter or --workspace.');
|
|
41
|
+
}
|
|
42
|
+
return runPackageBuild({
|
|
43
|
+
cwd: options.cwd,
|
|
44
|
+
envContext: options.envContext,
|
|
45
|
+
overrides: options.overrides,
|
|
46
|
+
passthroughArgs: options.passthroughArgs,
|
|
34
47
|
});
|
|
35
|
-
if (jsExitCode)
|
|
36
|
-
return jsExitCode;
|
|
37
|
-
createAukletLogger().newline();
|
|
38
|
-
return runBuildCss([], { aukletConfig });
|
|
39
48
|
});
|
|
40
49
|
}
|
|
50
|
+
const runWorkspaceBuild = async (args, options) => {
|
|
51
|
+
const targets = await resolveWorkspaceBuildTargets(options.cwd, options.filters, options.envContext, {
|
|
52
|
+
includeDependencies: options.includeDependencies,
|
|
53
|
+
includePrivate: options.includePrivate,
|
|
54
|
+
});
|
|
55
|
+
const logger = createAukletLogger();
|
|
56
|
+
for (const target of targets) {
|
|
57
|
+
if (!getWorkspacePackageScript(target.packageJson, 'build')) {
|
|
58
|
+
throw new Error(`[build] package ${target.packageName} has no build script.`);
|
|
59
|
+
}
|
|
60
|
+
const targetEnvContext = options.envContext.createPackageContext(target.packageRoot);
|
|
61
|
+
const exitCode = await targetEnvContext.run(async () => {
|
|
62
|
+
return logger.group(`Build ${target.packageName}`, async () => {
|
|
63
|
+
const result = await execa('pnpm', createWorkspaceBuildArgs(args), {
|
|
64
|
+
cwd: target.packageRoot,
|
|
65
|
+
env: {
|
|
66
|
+
...targetEnvContext.values,
|
|
67
|
+
[workspaceBuildEnv]: '1',
|
|
68
|
+
},
|
|
69
|
+
stdio: 'inherit',
|
|
70
|
+
reject: false,
|
|
71
|
+
});
|
|
72
|
+
return result.exitCode ?? 0;
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
if (exitCode)
|
|
76
|
+
return exitCode;
|
|
77
|
+
logger.newline();
|
|
78
|
+
}
|
|
79
|
+
return 0;
|
|
80
|
+
};
|
|
81
|
+
const createWorkspaceBuildArgs = (args) => {
|
|
82
|
+
return args.length ? ['run', 'build', '--', ...args] : ['run', 'build'];
|
|
83
|
+
};
|
|
84
|
+
const runPackageBuild = async (options) => {
|
|
85
|
+
const aukletConfig = mergeAukletConfigOverrides(await loadAukletConfig(options.cwd), options.overrides);
|
|
86
|
+
cleanAukletOutputByConfig(options.cwd, aukletConfig);
|
|
87
|
+
const jsExitCode = await runBuildJs({
|
|
88
|
+
cwd: options.cwd,
|
|
89
|
+
envContext: options.envContext,
|
|
90
|
+
overrides: options.overrides,
|
|
91
|
+
passthroughArgs: options.passthroughArgs,
|
|
92
|
+
});
|
|
93
|
+
if (jsExitCode)
|
|
94
|
+
return jsExitCode;
|
|
95
|
+
createAukletLogger().newline();
|
|
96
|
+
return runBuildCss({
|
|
97
|
+
cwd: options.cwd,
|
|
98
|
+
envContext: options.envContext,
|
|
99
|
+
overrides: {},
|
|
100
|
+
watch: false,
|
|
101
|
+
aukletConfig,
|
|
102
|
+
});
|
|
103
|
+
};
|
package/dist/cli/buildCss.d.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { AukletEnvContext } from '#auklet/env';
|
|
2
1
|
import { ModuleStyleWatcher } from '#auklet/css/watch/watcher';
|
|
2
|
+
import type { BuildCssCommandOptions } from '#auklet/cli/parse/build';
|
|
3
3
|
import type { AukletConfig } from '#auklet/types';
|
|
4
|
-
export declare function resolveBuildCssConfig(
|
|
4
|
+
export declare function resolveBuildCssConfig(options?: {
|
|
5
5
|
aukletConfig?: AukletConfig;
|
|
6
|
-
|
|
6
|
+
configOverrides?: AukletConfig;
|
|
7
|
+
packageRoot?: string;
|
|
8
|
+
watch?: boolean;
|
|
7
9
|
}): Promise<{
|
|
8
10
|
aukletConfig: AukletConfig;
|
|
11
|
+
packageRoot: string;
|
|
9
12
|
shouldWatch: boolean;
|
|
10
13
|
}>;
|
|
11
|
-
export declare function startBuildCssWatch(aukletConfig: AukletConfig
|
|
12
|
-
|
|
14
|
+
export declare function startBuildCssWatch(aukletConfig: AukletConfig, options?: {
|
|
15
|
+
packageRoot?: string;
|
|
16
|
+
}): Promise<ModuleStyleWatcher>;
|
|
17
|
+
export declare function runBuildCss(options: BuildCssCommandOptions & {
|
|
13
18
|
aukletConfig?: AukletConfig;
|
|
14
19
|
}): Promise<number>;
|
package/dist/cli/buildCss.js
CHANGED
|
@@ -1,43 +1,47 @@
|
|
|
1
1
|
import { createAukletLogger } from '#auklet/logger';
|
|
2
2
|
import { loadAukletConfig } from '#auklet/configLoader';
|
|
3
|
-
import { resolveBuildCliArgs } from '#auklet/cli/buildArgs';
|
|
4
|
-
import { AukletEnvContext } from '#auklet/env';
|
|
5
3
|
import { ModuleStyleWatcher } from '#auklet/css/watch/watcher';
|
|
6
4
|
import { ModuleStyleBuilder } from '#auklet/css/production/builder';
|
|
7
5
|
import { mergeAukletConfigOverrides } from '#auklet/build/cliOverrides';
|
|
8
6
|
import { logModuleStyleBuildResult } from '#auklet/css/production/buildReporter';
|
|
9
|
-
export async function resolveBuildCssConfig(
|
|
10
|
-
const
|
|
11
|
-
const shouldWatch =
|
|
7
|
+
export async function resolveBuildCssConfig(options = {}) {
|
|
8
|
+
const packageRoot = options.packageRoot ?? process.cwd();
|
|
9
|
+
const shouldWatch = options.watch === true;
|
|
12
10
|
const aukletConfig = options.aukletConfig ??
|
|
13
|
-
mergeAukletConfigOverrides(await loadAukletConfig(
|
|
11
|
+
mergeAukletConfigOverrides(await loadAukletConfig(packageRoot, {
|
|
14
12
|
cacheBust: shouldWatch,
|
|
15
|
-
}),
|
|
13
|
+
}), options.configOverrides ?? {});
|
|
16
14
|
return {
|
|
17
15
|
aukletConfig,
|
|
16
|
+
packageRoot,
|
|
18
17
|
shouldWatch,
|
|
19
18
|
};
|
|
20
19
|
}
|
|
21
|
-
export async function startBuildCssWatch(aukletConfig) {
|
|
20
|
+
export async function startBuildCssWatch(aukletConfig, options = {}) {
|
|
22
21
|
const logger = createAukletLogger();
|
|
23
22
|
return logger.group('Build CSS', async () => {
|
|
24
23
|
const css = logger.child('css');
|
|
25
|
-
const watcher = new ModuleStyleWatcher({
|
|
24
|
+
const watcher = new ModuleStyleWatcher({
|
|
25
|
+
...(options.packageRoot ? { packageRoot: options.packageRoot } : {}),
|
|
26
|
+
aukletConfig,
|
|
27
|
+
});
|
|
26
28
|
await watcher.watch();
|
|
27
29
|
css.success('watch mode ready');
|
|
28
30
|
return watcher;
|
|
29
31
|
});
|
|
30
32
|
}
|
|
31
|
-
export async function runBuildCss(
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
export async function runBuildCss(options) {
|
|
34
|
+
return options.envContext.run(async () => {
|
|
35
|
+
const packageRoot = options.cwd;
|
|
34
36
|
const logger = createAukletLogger();
|
|
35
|
-
const { aukletConfig, shouldWatch } = await resolveBuildCssConfig(
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
const { aukletConfig, shouldWatch } = await resolveBuildCssConfig({
|
|
38
|
+
aukletConfig: options.aukletConfig,
|
|
39
|
+
configOverrides: options.overrides,
|
|
40
|
+
packageRoot,
|
|
41
|
+
watch: options.watch,
|
|
38
42
|
});
|
|
39
43
|
if (shouldWatch) {
|
|
40
|
-
const watcher = await startBuildCssWatch(aukletConfig);
|
|
44
|
+
const watcher = await startBuildCssWatch(aukletConfig, { packageRoot });
|
|
41
45
|
const close = () => {
|
|
42
46
|
watcher
|
|
43
47
|
.close()
|
|
@@ -49,7 +53,7 @@ export async function runBuildCss(args, options = {}) {
|
|
|
49
53
|
await new Promise(() => { });
|
|
50
54
|
return 0;
|
|
51
55
|
}
|
|
52
|
-
const builder = new ModuleStyleBuilder({ aukletConfig });
|
|
56
|
+
const builder = new ModuleStyleBuilder({ packageRoot, aukletConfig });
|
|
53
57
|
await logger.group('Build CSS', async () => {
|
|
54
58
|
const timer = logger.timer();
|
|
55
59
|
const result = await builder.build();
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AukletEnvContext } from '#auklet/env';
|
|
2
|
+
type WorkspaceBuildPackageJson = {
|
|
3
|
+
name?: string;
|
|
4
|
+
private?: boolean;
|
|
5
|
+
scripts?: unknown;
|
|
6
|
+
dependencies?: unknown;
|
|
7
|
+
optionalDependencies?: unknown;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
};
|
|
10
|
+
export type WorkspaceBuildTarget = {
|
|
11
|
+
packageRoot: string;
|
|
12
|
+
packageName: string;
|
|
13
|
+
packageJson: WorkspaceBuildPackageJson;
|
|
14
|
+
};
|
|
15
|
+
export declare function resolveWorkspaceBuildTargets(cwd: string, filters: Array<string>, envContext: AukletEnvContext, options?: {
|
|
16
|
+
includePrivate?: boolean;
|
|
17
|
+
includeDependencies?: boolean;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
packageRoot: string;
|
|
20
|
+
packageName: string;
|
|
21
|
+
packageJson: WorkspaceBuildPackageJson;
|
|
22
|
+
}[]>;
|
|
23
|
+
export declare function getWorkspacePackageScript(packageJson: WorkspaceBuildPackageJson, name: string): string | null;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isPlainObject, isString } from 'aidly';
|
|
4
|
+
import { getWorkspaceDependencyNames, resolveWorkspaceTargets, } from '#auklet/workspace/targets';
|
|
5
|
+
export async function resolveWorkspaceBuildTargets(cwd, filters, envContext, options = {}) {
|
|
6
|
+
return resolveWorkspaceTargets({
|
|
7
|
+
cwd,
|
|
8
|
+
filters,
|
|
9
|
+
env: envContext.normalizedValues,
|
|
10
|
+
scope: 'build',
|
|
11
|
+
emptyTargetMessage: '[build] no buildable workspace package found.',
|
|
12
|
+
excludeRoot: true,
|
|
13
|
+
includePrivate: options.includePrivate,
|
|
14
|
+
readPackageJson: readBuildPackageJson,
|
|
15
|
+
createTarget: (item, packageJson) => ({
|
|
16
|
+
packageRoot: item.path,
|
|
17
|
+
packageName: item.name,
|
|
18
|
+
packageJson,
|
|
19
|
+
}),
|
|
20
|
+
getDependencies: getBuildWorkspaceDependencies,
|
|
21
|
+
includeDependencies: options.includeDependencies,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const readBuildPackageJson = (packageRoot) => {
|
|
25
|
+
const file = path.join(packageRoot, 'package.json');
|
|
26
|
+
const packageJson = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
27
|
+
if (!isPlainObject(packageJson)) {
|
|
28
|
+
throw new Error(`[build] package.json must be an object at ${file}.`);
|
|
29
|
+
}
|
|
30
|
+
return packageJson;
|
|
31
|
+
};
|
|
32
|
+
const getBuildWorkspaceDependencies = (target) => {
|
|
33
|
+
return [
|
|
34
|
+
...getWorkspaceDependencyNames(target.packageJson.dependencies),
|
|
35
|
+
...getWorkspaceDependencyNames(target.packageJson.optionalDependencies),
|
|
36
|
+
];
|
|
37
|
+
};
|
|
38
|
+
export function getWorkspacePackageScript(packageJson, name) {
|
|
39
|
+
if (!isPlainObject(packageJson.scripts))
|
|
40
|
+
return null;
|
|
41
|
+
const script = packageJson.scripts[name];
|
|
42
|
+
return isString(script) ? script : null;
|
|
43
|
+
}
|
package/dist/cli/dev.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { DevCommandOptions } from '#auklet/cli/parse/dev';
|
|
2
|
+
export declare function runDev(options: DevCommandOptions): Promise<number>;
|
package/dist/cli/dev.js
CHANGED
|
@@ -1,26 +1,72 @@
|
|
|
1
1
|
import { execa } from 'execa';
|
|
2
2
|
import { createTsdownArgs } from '#auklet/build/runTsdown';
|
|
3
|
-
import { createBuildEnv
|
|
4
|
-
import { AukletEnvContext } from '#auklet/env';
|
|
3
|
+
import { createBuildEnv } from '#auklet/cli/parse/build';
|
|
5
4
|
import { resolveBuildCssConfig, startBuildCssWatch, } from '#auklet/cli/buildCss';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
import { getWorkspacePackageScript, resolveWorkspaceBuildTargets, } from '#auklet/cli/buildWorkspace';
|
|
6
|
+
const workspaceDevEnv = 'AUKLET_WORKSPACE_DEV';
|
|
7
|
+
export async function runDev(options) {
|
|
8
|
+
return options.envContext.run(async () => {
|
|
9
|
+
if (options.workspace.filters.length) {
|
|
10
|
+
if (process.env[workspaceDevEnv]) {
|
|
11
|
+
throw new Error('[dev] recursive workspace dev detected. Do not run `auk dev --workspace` from a workspace package dev script.');
|
|
12
|
+
}
|
|
13
|
+
return runWorkspaceDev({
|
|
14
|
+
cwd: options.cwd,
|
|
15
|
+
envContext: options.envContext,
|
|
16
|
+
workspaceScriptArgs: options.workspaceScriptArgs,
|
|
17
|
+
filters: options.workspace.filters,
|
|
18
|
+
includeDependencies: options.workspace.includeDependencies,
|
|
19
|
+
includePrivate: options.workspace.includePrivate,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (options.workspace.includeDependencies) {
|
|
23
|
+
throw new Error('[dev] --deps requires --filter or --workspace.');
|
|
24
|
+
}
|
|
25
|
+
return runDevWithEnv({
|
|
26
|
+
cwd: options.cwd,
|
|
27
|
+
envContext: options.envContext,
|
|
28
|
+
overrides: options.overrides,
|
|
29
|
+
passthroughArgs: options.passthroughArgs,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
9
32
|
}
|
|
10
|
-
const runDevWithEnv = async (
|
|
33
|
+
const runDevWithEnv = async (options) => {
|
|
34
|
+
let closed = false;
|
|
35
|
+
const handle = await startDevTarget(options);
|
|
36
|
+
const close = async () => {
|
|
37
|
+
if (closed)
|
|
38
|
+
return;
|
|
39
|
+
closed = true;
|
|
40
|
+
await closeDevTargetHandle(handle);
|
|
41
|
+
};
|
|
42
|
+
const closeAndExit = () => {
|
|
43
|
+
close()
|
|
44
|
+
.catch(console.error)
|
|
45
|
+
.finally(() => process.exit(0));
|
|
46
|
+
};
|
|
47
|
+
try {
|
|
48
|
+
process.once('SIGINT', closeAndExit);
|
|
49
|
+
process.once('SIGTERM', closeAndExit);
|
|
50
|
+
return await handle.process.then((result) => result.exitCode ?? 0);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
process.off('SIGINT', closeAndExit);
|
|
54
|
+
process.off('SIGTERM', closeAndExit);
|
|
55
|
+
await close();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const runWorkspaceDev = async (options) => {
|
|
11
59
|
let closed = false;
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
60
|
+
const handles = [];
|
|
61
|
+
const targets = await resolveWorkspaceBuildTargets(options.cwd, options.filters, options.envContext, {
|
|
62
|
+
includeDependencies: options.includeDependencies,
|
|
63
|
+
includePrivate: options.includePrivate,
|
|
16
64
|
});
|
|
17
|
-
const cssWatcher = await startBuildCssWatch(aukletConfig);
|
|
18
65
|
const close = async () => {
|
|
19
66
|
if (closed)
|
|
20
67
|
return;
|
|
21
68
|
closed = true;
|
|
22
|
-
|
|
23
|
-
await cssWatcher.close();
|
|
69
|
+
await Promise.all(handles.map(closeDevTargetHandle));
|
|
24
70
|
};
|
|
25
71
|
const closeAndExit = () => {
|
|
26
72
|
close()
|
|
@@ -28,18 +74,22 @@ const runDevWithEnv = async (args, envContext) => {
|
|
|
28
74
|
.finally(() => process.exit(0));
|
|
29
75
|
};
|
|
30
76
|
try {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
77
|
+
for (const target of targets) {
|
|
78
|
+
const targetEnvContext = options.envContext.createPackageContext(target.packageRoot);
|
|
79
|
+
const handle = await targetEnvContext.run(() => startWorkspaceDevTarget({
|
|
80
|
+
workspaceScriptArgs: options.workspaceScriptArgs,
|
|
81
|
+
cwd: target.packageRoot,
|
|
82
|
+
envContext: targetEnvContext,
|
|
83
|
+
packageJson: target.packageJson,
|
|
84
|
+
packageName: target.packageName,
|
|
85
|
+
}));
|
|
86
|
+
handles.push(handle);
|
|
87
|
+
}
|
|
40
88
|
process.once('SIGINT', closeAndExit);
|
|
41
89
|
process.once('SIGTERM', closeAndExit);
|
|
42
|
-
|
|
90
|
+
const processes = handles.map((handle) => handle.process);
|
|
91
|
+
const result = await Promise.race(processes);
|
|
92
|
+
return result.exitCode ?? 0;
|
|
43
93
|
}
|
|
44
94
|
finally {
|
|
45
95
|
process.off('SIGINT', closeAndExit);
|
|
@@ -47,3 +97,60 @@ const runDevWithEnv = async (args, envContext) => {
|
|
|
47
97
|
await close();
|
|
48
98
|
}
|
|
49
99
|
};
|
|
100
|
+
const startWorkspaceDevTarget = async (options) => {
|
|
101
|
+
if (!getWorkspacePackageScript(options.packageJson, 'dev')) {
|
|
102
|
+
throw new Error(`[dev] package ${options.packageName} has no dev script.`);
|
|
103
|
+
}
|
|
104
|
+
const handle = {
|
|
105
|
+
kind: 'script',
|
|
106
|
+
process: execa('pnpm', createWorkspaceDevArgs(options.workspaceScriptArgs), {
|
|
107
|
+
cwd: options.cwd,
|
|
108
|
+
env: {
|
|
109
|
+
...options.envContext.values,
|
|
110
|
+
[workspaceDevEnv]: '1',
|
|
111
|
+
},
|
|
112
|
+
stdio: 'inherit',
|
|
113
|
+
reject: false,
|
|
114
|
+
}),
|
|
115
|
+
};
|
|
116
|
+
return handle;
|
|
117
|
+
};
|
|
118
|
+
const startDevTarget = async (options) => {
|
|
119
|
+
const { aukletConfig } = await resolveBuildCssConfig({
|
|
120
|
+
configOverrides: options.overrides,
|
|
121
|
+
packageRoot: options.cwd,
|
|
122
|
+
watch: true,
|
|
123
|
+
});
|
|
124
|
+
const cssWatcher = await startBuildCssWatch(aukletConfig, {
|
|
125
|
+
packageRoot: options.cwd,
|
|
126
|
+
});
|
|
127
|
+
const jsProcess = execa(process.execPath, createTsdownArgs([...options.passthroughArgs, '--watch']), {
|
|
128
|
+
cwd: options.cwd,
|
|
129
|
+
env: {
|
|
130
|
+
...options.envContext.values,
|
|
131
|
+
...createBuildEnv(options.overrides),
|
|
132
|
+
},
|
|
133
|
+
stdio: 'inherit',
|
|
134
|
+
reject: false,
|
|
135
|
+
});
|
|
136
|
+
const handle = {
|
|
137
|
+
kind: 'auklet-watch',
|
|
138
|
+
process: jsProcess,
|
|
139
|
+
cssWatcher,
|
|
140
|
+
};
|
|
141
|
+
return handle;
|
|
142
|
+
};
|
|
143
|
+
const createWorkspaceDevArgs = (args) => {
|
|
144
|
+
return args.length ? ['run', 'dev', '--', ...args] : ['run', 'dev'];
|
|
145
|
+
};
|
|
146
|
+
const closeDevTargetHandle = async (handle) => {
|
|
147
|
+
switch (handle.kind) {
|
|
148
|
+
case 'script':
|
|
149
|
+
handle.process.kill('SIGTERM');
|
|
150
|
+
return;
|
|
151
|
+
case 'auklet-watch':
|
|
152
|
+
handle.process.kill('SIGTERM');
|
|
153
|
+
await handle.cssWatcher.close();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
};
|