auklet 0.1.4 → 0.1.5

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 (38) hide show
  1. package/README.md +113 -429
  2. package/dist/cli/build.d.ts +3 -5
  3. package/dist/cli/build.js +84 -23
  4. package/dist/cli/buildCss.d.ts +10 -5
  5. package/dist/cli/buildCss.js +21 -17
  6. package/dist/cli/buildWorkspace.d.ts +23 -0
  7. package/dist/cli/buildWorkspace.js +43 -0
  8. package/dist/cli/dev.d.ts +2 -1
  9. package/dist/cli/dev.js +128 -23
  10. package/dist/cli/main.js +36 -12
  11. package/dist/cli/parse/build.d.ts +62 -0
  12. package/dist/cli/{buildArgs.js → parse/build.js} +47 -22
  13. package/dist/cli/parse/core.d.ts +14 -0
  14. package/dist/cli/parse/core.js +68 -0
  15. package/dist/cli/parse/dev.d.ts +17 -0
  16. package/dist/cli/parse/dev.js +4 -0
  17. package/dist/cli/parse/owner.d.ts +11 -0
  18. package/dist/cli/parse/owner.js +25 -0
  19. package/dist/cli/parse/publish.d.ts +19 -0
  20. package/dist/cli/parse/publish.js +60 -0
  21. package/dist/cli/parse/workspace.d.ts +12 -0
  22. package/dist/cli/parse/workspace.js +45 -0
  23. package/dist/css/inspect.js +4 -3
  24. package/dist/publish/api/pnpmApi.d.ts +0 -4
  25. package/dist/publish/api/pnpmApi.js +0 -34
  26. package/dist/publish/cli.d.ts +0 -16
  27. package/dist/publish/cli.js +5 -122
  28. package/dist/publish/inspect.js +2 -2
  29. package/dist/publish/targetResolver.js +26 -71
  30. package/dist/publish/types.d.ts +1 -7
  31. package/dist/workspace/targets.d.ts +31 -0
  32. package/dist/workspace/targets.js +144 -0
  33. package/package.json +1 -1
  34. package/dist/cli/buildArgs.d.ts +0 -9
  35. package/dist/cli/publish.d.ts +0 -2
  36. package/dist/cli/publish.js +0 -9
  37. /package/dist/cli/{values.d.ts → parse/values.d.ts} +0 -0
  38. /package/dist/cli/{values.js → parse/values.js} +0 -0
package/dist/cli/build.js CHANGED
@@ -1,40 +1,101 @@
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, resolveBuildCliArgs } from '#auklet/cli/buildArgs';
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
- export async function runBuildJs(args, options = {}) {
10
- const envContext = new AukletEnvContext(process.cwd());
11
- return envContext.run(async () => {
12
- const buildArgs = resolveBuildCliArgs(args, envContext);
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(buildArgs.args, {
17
- cwd: process.cwd(),
15
+ return runTsdown(options.passthroughArgs, {
16
+ cwd: options.cwd,
18
17
  env: {
19
- ...envContext.values,
20
- ...createBuildEnv(config),
18
+ ...options.envContext.values,
19
+ ...createBuildEnv(options.overrides),
21
20
  },
22
21
  });
23
22
  });
24
23
  });
25
24
  }
26
- export async function runBuild(args) {
27
- const envContext = new AukletEnvContext(process.cwd());
28
- return envContext.run(async () => {
29
- const buildArgs = resolveBuildCliArgs(args, envContext);
30
- const aukletConfig = mergeAukletConfigOverrides(await loadAukletConfig(process.cwd()), buildArgs.config);
31
- cleanAukletOutputByConfig(process.cwd(), aukletConfig);
32
- const jsExitCode = await runBuildJs(buildArgs.args, {
33
- config: buildArgs.config,
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
+ });
37
+ }
38
+ if (options.workspace.includeDependencies) {
39
+ throw new Error('[build] --deps requires --filter or --workspace.');
40
+ }
41
+ return runPackageBuild({
42
+ cwd: options.cwd,
43
+ envContext: options.envContext,
44
+ overrides: options.overrides,
45
+ passthroughArgs: options.passthroughArgs,
34
46
  });
35
- if (jsExitCode)
36
- return jsExitCode;
37
- createAukletLogger().newline();
38
- return runBuildCss([], { aukletConfig });
39
47
  });
40
48
  }
49
+ const runWorkspaceBuild = async (args, options) => {
50
+ const targets = await resolveWorkspaceBuildTargets(options.cwd, options.filters, options.envContext, {
51
+ includeDependencies: options.includeDependencies,
52
+ });
53
+ const logger = createAukletLogger();
54
+ for (const target of targets) {
55
+ if (!getWorkspacePackageScript(target.packageJson, 'build')) {
56
+ throw new Error(`[build] package ${target.packageName} has no build script.`);
57
+ }
58
+ const targetEnvContext = options.envContext.createPackageContext(target.packageRoot);
59
+ const exitCode = await targetEnvContext.run(async () => {
60
+ return logger.group(`Build ${target.packageName}`, async () => {
61
+ const result = await execa('pnpm', createWorkspaceBuildArgs(args), {
62
+ cwd: target.packageRoot,
63
+ env: {
64
+ ...targetEnvContext.values,
65
+ [workspaceBuildEnv]: '1',
66
+ },
67
+ stdio: 'inherit',
68
+ reject: false,
69
+ });
70
+ return result.exitCode ?? 0;
71
+ });
72
+ });
73
+ if (exitCode)
74
+ return exitCode;
75
+ logger.newline();
76
+ }
77
+ return 0;
78
+ };
79
+ const createWorkspaceBuildArgs = (args) => {
80
+ return args.length ? ['run', 'build', '--', ...args] : ['run', 'build'];
81
+ };
82
+ const runPackageBuild = async (options) => {
83
+ const aukletConfig = mergeAukletConfigOverrides(await loadAukletConfig(options.cwd), options.overrides);
84
+ cleanAukletOutputByConfig(options.cwd, aukletConfig);
85
+ const jsExitCode = await runBuildJs({
86
+ cwd: options.cwd,
87
+ envContext: options.envContext,
88
+ overrides: options.overrides,
89
+ passthroughArgs: options.passthroughArgs,
90
+ });
91
+ if (jsExitCode)
92
+ return jsExitCode;
93
+ createAukletLogger().newline();
94
+ return runBuildCss({
95
+ cwd: options.cwd,
96
+ envContext: options.envContext,
97
+ overrides: {},
98
+ watch: false,
99
+ aukletConfig,
100
+ });
101
+ };
@@ -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(args: Array<string>, options?: {
4
+ export declare function resolveBuildCssConfig(options?: {
5
5
  aukletConfig?: AukletConfig;
6
- envContext?: AukletEnvContext;
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): Promise<ModuleStyleWatcher>;
12
- export declare function runBuildCss(args: Array<string>, options?: {
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>;
@@ -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(args, options = {}) {
10
- const buildArgs = resolveBuildCliArgs(args, options.envContext);
11
- const shouldWatch = buildArgs.args.includes('--watch') || buildArgs.args.includes('-w');
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(process.cwd(), {
11
+ mergeAukletConfigOverrides(await loadAukletConfig(packageRoot, {
14
12
  cacheBust: shouldWatch,
15
- }), buildArgs.config);
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({ aukletConfig });
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(args, options = {}) {
32
- const envContext = new AukletEnvContext(process.cwd());
33
- return envContext.run(async () => {
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(args, {
36
- ...options,
37
- envContext,
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,23 @@
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
+ includeDependencies?: boolean;
17
+ }): Promise<{
18
+ packageRoot: string;
19
+ packageName: string;
20
+ packageJson: WorkspaceBuildPackageJson;
21
+ }[]>;
22
+ export declare function getWorkspacePackageScript(packageJson: WorkspaceBuildPackageJson, name: string): string | null;
23
+ 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: true,
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
- export declare function runDev(args: Array<string>): Promise<number>;
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,70 @@
1
1
  import { execa } from 'execa';
2
2
  import { createTsdownArgs } from '#auklet/build/runTsdown';
3
- import { createBuildEnv, resolveBuildCliArgs } from '#auklet/cli/buildArgs';
4
- import { AukletEnvContext } from '#auklet/env';
3
+ import { createBuildEnv } from '#auklet/cli/parse/build';
5
4
  import { resolveBuildCssConfig, startBuildCssWatch, } from '#auklet/cli/buildCss';
6
- export async function runDev(args) {
7
- const envContext = new AukletEnvContext(process.cwd());
8
- return envContext.run(async () => runDevWithEnv(args, envContext));
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
+ });
20
+ }
21
+ if (options.workspace.includeDependencies) {
22
+ throw new Error('[dev] --deps requires --filter or --workspace.');
23
+ }
24
+ return runDevWithEnv({
25
+ cwd: options.cwd,
26
+ envContext: options.envContext,
27
+ overrides: options.overrides,
28
+ passthroughArgs: options.passthroughArgs,
29
+ });
30
+ });
9
31
  }
10
- const runDevWithEnv = async (args, envContext) => {
32
+ const runDevWithEnv = async (options) => {
33
+ let closed = false;
34
+ const handle = await startDevTarget(options);
35
+ const close = async () => {
36
+ if (closed)
37
+ return;
38
+ closed = true;
39
+ await closeDevTargetHandle(handle);
40
+ };
41
+ const closeAndExit = () => {
42
+ close()
43
+ .catch(console.error)
44
+ .finally(() => process.exit(0));
45
+ };
46
+ try {
47
+ process.once('SIGINT', closeAndExit);
48
+ process.once('SIGTERM', closeAndExit);
49
+ return await handle.process.then((result) => result.exitCode ?? 0);
50
+ }
51
+ finally {
52
+ process.off('SIGINT', closeAndExit);
53
+ process.off('SIGTERM', closeAndExit);
54
+ await close();
55
+ }
56
+ };
57
+ const runWorkspaceDev = async (options) => {
11
58
  let closed = false;
12
- let jsProcess = null;
13
- const buildArgs = resolveBuildCliArgs(args, envContext);
14
- const { aukletConfig } = await resolveBuildCssConfig(['--watch', ...args], {
15
- envContext,
59
+ const handles = [];
60
+ const targets = await resolveWorkspaceBuildTargets(options.cwd, options.filters, options.envContext, {
61
+ includeDependencies: options.includeDependencies,
16
62
  });
17
- const cssWatcher = await startBuildCssWatch(aukletConfig);
18
63
  const close = async () => {
19
64
  if (closed)
20
65
  return;
21
66
  closed = true;
22
- jsProcess?.kill('SIGTERM');
23
- await cssWatcher.close();
67
+ await Promise.all(handles.map(closeDevTargetHandle));
24
68
  };
25
69
  const closeAndExit = () => {
26
70
  close()
@@ -28,18 +72,22 @@ const runDevWithEnv = async (args, envContext) => {
28
72
  .finally(() => process.exit(0));
29
73
  };
30
74
  try {
31
- jsProcess = execa(process.execPath, createTsdownArgs([...buildArgs.args, '--watch']), {
32
- cwd: process.cwd(),
33
- env: {
34
- ...envContext.values,
35
- ...createBuildEnv(buildArgs.config),
36
- },
37
- stdio: 'inherit',
38
- reject: false,
39
- });
75
+ for (const target of targets) {
76
+ const targetEnvContext = options.envContext.createPackageContext(target.packageRoot);
77
+ const handle = await targetEnvContext.run(() => startWorkspaceDevTarget({
78
+ workspaceScriptArgs: options.workspaceScriptArgs,
79
+ cwd: target.packageRoot,
80
+ envContext: targetEnvContext,
81
+ packageJson: target.packageJson,
82
+ packageName: target.packageName,
83
+ }));
84
+ handles.push(handle);
85
+ }
40
86
  process.once('SIGINT', closeAndExit);
41
87
  process.once('SIGTERM', closeAndExit);
42
- return await jsProcess.then((result) => result.exitCode ?? 0);
88
+ const processes = handles.map((handle) => handle.process);
89
+ const result = await Promise.race(processes);
90
+ return result.exitCode ?? 0;
43
91
  }
44
92
  finally {
45
93
  process.off('SIGINT', closeAndExit);
@@ -47,3 +95,60 @@ const runDevWithEnv = async (args, envContext) => {
47
95
  await close();
48
96
  }
49
97
  };
98
+ const startWorkspaceDevTarget = async (options) => {
99
+ if (!getWorkspacePackageScript(options.packageJson, 'dev')) {
100
+ throw new Error(`[dev] package ${options.packageName} has no dev script.`);
101
+ }
102
+ const handle = {
103
+ kind: 'script',
104
+ process: execa('pnpm', createWorkspaceDevArgs(options.workspaceScriptArgs), {
105
+ cwd: options.cwd,
106
+ env: {
107
+ ...options.envContext.values,
108
+ [workspaceDevEnv]: '1',
109
+ },
110
+ stdio: 'inherit',
111
+ reject: false,
112
+ }),
113
+ };
114
+ return handle;
115
+ };
116
+ const startDevTarget = async (options) => {
117
+ const { aukletConfig } = await resolveBuildCssConfig({
118
+ configOverrides: options.overrides,
119
+ packageRoot: options.cwd,
120
+ watch: true,
121
+ });
122
+ const cssWatcher = await startBuildCssWatch(aukletConfig, {
123
+ packageRoot: options.cwd,
124
+ });
125
+ const jsProcess = execa(process.execPath, createTsdownArgs([...options.passthroughArgs, '--watch']), {
126
+ cwd: options.cwd,
127
+ env: {
128
+ ...options.envContext.values,
129
+ ...createBuildEnv(options.overrides),
130
+ },
131
+ stdio: 'inherit',
132
+ reject: false,
133
+ });
134
+ const handle = {
135
+ kind: 'auklet-watch',
136
+ process: jsProcess,
137
+ cssWatcher,
138
+ };
139
+ return handle;
140
+ };
141
+ const createWorkspaceDevArgs = (args) => {
142
+ return args.length ? ['run', 'dev', '--', ...args] : ['run', 'dev'];
143
+ };
144
+ const closeDevTargetHandle = async (handle) => {
145
+ switch (handle.kind) {
146
+ case 'script':
147
+ handle.process.kill('SIGTERM');
148
+ return;
149
+ case 'auklet-watch':
150
+ handle.process.kill('SIGTERM');
151
+ await handle.cssWatcher.close();
152
+ return;
153
+ }
154
+ };
package/dist/cli/main.js CHANGED
@@ -6,8 +6,11 @@ import { createAukletLogger } from '#auklet/logger';
6
6
  import { runDev } from '#auklet/cli/dev';
7
7
  import { runBuildCss } from '#auklet/cli/buildCss';
8
8
  import { runBuild, runBuildJs } from '#auklet/cli/build';
9
- import { runOwner, runPublish } from '#auklet/cli/publish';
10
9
  import { runInspect } from '#auklet/cli/inspect';
10
+ import { runOwnerCli, runPublishCli } from '#auklet/publish/cli';
11
+ import { AukletEnvContext } from '#auklet/env';
12
+ import { parseBuildCommand, parseBuildCssCommand, parseBuildJsCommand, } from '#auklet/cli/parse/build';
13
+ import { parseDevCommand } from '#auklet/cli/parse/dev';
11
14
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
12
15
  const getPackageVersion = () => {
13
16
  const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../package.json'), 'utf8'));
@@ -17,50 +20,71 @@ const runVersion = async () => {
17
20
  console.log(getPackageVersion());
18
21
  return 0;
19
22
  };
20
- const getCommandArgs = (argv, command) => {
23
+ // Raw argv slicing is intentionally kept in this entry module. Command runners
24
+ // only receive parsed options or command-specific raw subcommand args.
25
+ const getRawCommandArgs = (argv, command) => {
21
26
  const rawArgs = argv.slice(2);
22
27
  const commandIndex = rawArgs.indexOf(command);
23
28
  return commandIndex >= 0 ? rawArgs.slice(commandIndex + 1) : [];
24
29
  };
25
- const runCliCommand = (runner, args) => {
26
- return runner(args).then((exitCode) => {
30
+ const runCliCommand = (runner) => {
31
+ return runner().then((exitCode) => {
27
32
  process.exit(exitCode ?? 0);
28
33
  });
29
34
  };
35
+ const createCommandContext = () => {
36
+ const cwd = process.cwd();
37
+ return {
38
+ cwd,
39
+ envContext: new AukletEnvContext(cwd),
40
+ };
41
+ };
30
42
  async function runCli(argv) {
31
43
  const cli = cac('auk');
32
44
  cli
33
45
  .command('build [...args]', 'Build package JavaScript and CSS output')
34
46
  .allowUnknownOptions()
35
- .action(() => runCliCommand(runBuild, getCommandArgs(argv, 'build')));
47
+ .action(() => runCliCommand(() => {
48
+ const context = createCommandContext();
49
+ return runBuild(parseBuildCommand(getRawCommandArgs(argv, 'build'), context));
50
+ }));
36
51
  cli
37
52
  .command('build-js [...args]', 'Build package JavaScript output with tsdown')
38
53
  .allowUnknownOptions()
39
- .action(() => runCliCommand(runBuildJs, getCommandArgs(argv, 'build-js')));
54
+ .action(() => runCliCommand(() => {
55
+ const context = createCommandContext();
56
+ return runBuildJs(parseBuildJsCommand(getRawCommandArgs(argv, 'build-js'), context));
57
+ }));
40
58
  cli
41
59
  .command('build-css [...args]', 'Build package module CSS output')
42
60
  .option('-w, --watch', 'Watch module CSS output')
43
61
  .allowUnknownOptions()
44
- .action(() => runCliCommand(runBuildCss, getCommandArgs(argv, 'build-css')));
62
+ .action(() => runCliCommand(() => {
63
+ const context = createCommandContext();
64
+ return runBuildCss(parseBuildCssCommand(getRawCommandArgs(argv, 'build-css'), context));
65
+ }));
45
66
  cli
46
67
  .command('dev [...args]', 'Watch package JavaScript and CSS output')
47
68
  .allowUnknownOptions()
48
- .action(() => runCliCommand(runDev, getCommandArgs(argv, 'dev')));
69
+ .action(() => runCliCommand(() => {
70
+ const context = createCommandContext();
71
+ return runDev(parseDevCommand(getRawCommandArgs(argv, 'dev'), context));
72
+ }));
49
73
  cli
50
74
  .command('publish [...args]', 'Build and publish package output with pnpm')
51
75
  .allowUnknownOptions()
52
- .action(() => runCliCommand(runPublish, getCommandArgs(argv, 'publish')));
76
+ .action(() => runCliCommand(() => runPublishCli(getRawCommandArgs(argv, 'publish'))));
53
77
  cli
54
78
  .command('owner [...args]', 'Manage npm package owners with pnpm')
55
79
  .allowUnknownOptions()
56
- .action(() => runCliCommand(runOwner, getCommandArgs(argv, 'owner')));
80
+ .action(() => runCliCommand(() => runOwnerCli(getRawCommandArgs(argv, 'owner'))));
57
81
  cli
58
82
  .command('inspect [...args]', 'Inspect auklet plans without side effects')
59
83
  .allowUnknownOptions()
60
- .action(() => runCliCommand(runInspect, getCommandArgs(argv, 'inspect')));
84
+ .action(() => runCliCommand(() => runInspect(getRawCommandArgs(argv, 'inspect'))));
61
85
  cli
62
86
  .command('version', 'Print auklet version')
63
- .action(() => runCliCommand(runVersion, []));
87
+ .action(() => runCliCommand(runVersion));
64
88
  cli.option('-v, --version', 'Print auklet version');
65
89
  cli.help();
66
90
  if (argv.length <= 2) {
@@ -0,0 +1,62 @@
1
+ import type { AukletEnvContext } from '#auklet/env';
2
+ import type { AukletConfig } from '#auklet/types';
3
+ import type { WorkspaceSelection } from '#auklet/cli/parse/workspace';
4
+ export type BuildCommandOptions = {
5
+ cwd: string;
6
+ envContext: AukletEnvContext;
7
+ workspace: WorkspaceSelection;
8
+ overrides: AukletConfig;
9
+ passthroughArgs: Array<string>;
10
+ workspaceScriptArgs: Array<string>;
11
+ };
12
+ export type BuildJsCommandOptions = {
13
+ cwd: string;
14
+ envContext: AukletEnvContext;
15
+ overrides: AukletConfig;
16
+ passthroughArgs: Array<string>;
17
+ };
18
+ export type BuildCssCommandOptions = {
19
+ cwd: string;
20
+ envContext: AukletEnvContext;
21
+ overrides: AukletConfig;
22
+ watch: boolean;
23
+ };
24
+ export declare function parseBuildCommand(args: Array<string>, options: {
25
+ cwd: string;
26
+ envContext: AukletEnvContext;
27
+ }): {
28
+ cwd: string;
29
+ envContext: AukletEnvContext;
30
+ workspace: {
31
+ filters: string[];
32
+ includeDependencies: boolean;
33
+ };
34
+ overrides: AukletConfig;
35
+ passthroughArgs: string[];
36
+ workspaceScriptArgs: string[];
37
+ };
38
+ export declare function parseBuildJsCommand(args: Array<string>, options: {
39
+ cwd: string;
40
+ envContext: AukletEnvContext;
41
+ }): {
42
+ cwd: string;
43
+ envContext: AukletEnvContext;
44
+ overrides: AukletConfig;
45
+ passthroughArgs: string[];
46
+ };
47
+ export declare function parseBuildCssCommand(args: Array<string>, options: {
48
+ cwd: string;
49
+ envContext: AukletEnvContext;
50
+ }): {
51
+ cwd: string;
52
+ envContext: AukletEnvContext;
53
+ overrides: AukletConfig;
54
+ watch: boolean;
55
+ };
56
+ export declare function parseBuildOverrideArgs(args: Array<string>, envContext: AukletEnvContext): {
57
+ args: string[];
58
+ config: AukletConfig;
59
+ };
60
+ export declare function createBuildEnv(config: AukletConfig): {
61
+ AUKLET_CONFIG_OVERRIDES: string;
62
+ } | undefined;