auklet 0.0.19 → 0.0.21

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 (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -393
  3. package/bin/entry.mjs +5 -0
  4. package/dist/build/bundleConfig.js +3 -2
  5. package/dist/build/cliOverrides.d.ts +22 -0
  6. package/dist/build/cliOverrides.js +22 -0
  7. package/dist/build/moduleConfig.js +1 -1
  8. package/dist/build/runTsdown.d.ts +2 -0
  9. package/dist/build/runTsdown.js +4 -3
  10. package/dist/build/tsdown/common.d.ts +2 -2
  11. package/dist/build/tsdown/context.d.ts +2 -1
  12. package/dist/build/tsdown/context.js +2 -1
  13. package/dist/build/tsdown/define.js +3 -2
  14. package/dist/build/tsdown/dependencies.js +3 -1
  15. package/dist/build/tsdown/entries.d.ts +2 -2
  16. package/dist/build/tsdown/entries.js +10 -10
  17. package/dist/build/tsdown/types.d.ts +1 -0
  18. package/dist/cli/build.d.ts +5 -0
  19. package/dist/cli/build.js +30 -0
  20. package/dist/cli/buildArgs.d.ts +8 -0
  21. package/dist/cli/buildArgs.js +114 -0
  22. package/dist/cli/buildCss.d.ts +12 -0
  23. package/dist/cli/buildCss.js +53 -0
  24. package/dist/cli/dev.d.ts +1 -0
  25. package/dist/cli/dev.js +39 -0
  26. package/dist/cli/main.d.ts +1 -0
  27. package/dist/cli/main.js +95 -0
  28. package/dist/cli/publish.d.ts +2 -0
  29. package/dist/cli/publish.js +9 -0
  30. package/dist/config.d.ts +3 -1
  31. package/dist/config.js +7 -1
  32. package/dist/configLoader.d.ts +1 -0
  33. package/dist/configLoader.js +42 -61
  34. package/dist/css/production/buildReporter.d.ts +3 -0
  35. package/dist/css/production/buildReporter.js +19 -0
  36. package/dist/css/production/builder.d.ts +8 -3
  37. package/dist/css/production/builder.js +9 -13
  38. package/dist/css/vite/hmr.js +10 -8
  39. package/dist/css/vite/moduleGraph/graph.js +2 -3
  40. package/dist/css/vite/moduleGraph/packageSource/monorepo.d.ts +5 -1
  41. package/dist/css/vite/moduleGraph/packageSource/monorepo.js +42 -33
  42. package/dist/css/vite/moduleGraph/packageSource/singlePackage.js +3 -3
  43. package/dist/css/vite/moduleGraph/requestCache.d.ts +4 -4
  44. package/dist/css/vite/moduleGraph/requestCache.js +8 -4
  45. package/dist/css/vite/moduleGraph/styleCodeFactory.js +4 -4
  46. package/dist/css/vite/moduleGraph/types.d.ts +0 -1
  47. package/dist/css/watch/watcher.d.ts +0 -1
  48. package/dist/css/watch/watcher.js +9 -15
  49. package/dist/index.d.ts +6 -7
  50. package/dist/index.js +5 -5
  51. package/dist/logger.d.ts +5 -0
  52. package/dist/logger.js +14 -0
  53. package/dist/publish/api/gitApi.d.ts +7 -0
  54. package/dist/publish/api/gitApi.js +55 -0
  55. package/dist/publish/api/packageJsonApi.d.ts +7 -0
  56. package/dist/publish/api/packageJsonApi.js +35 -0
  57. package/dist/publish/api/pnpmApi.d.ts +9 -0
  58. package/dist/publish/api/pnpmApi.js +85 -0
  59. package/dist/publish/api/pnpmPublishApi.d.ts +4 -0
  60. package/dist/publish/api/pnpmPublishApi.js +7 -0
  61. package/dist/publish/api/publishArgs.d.ts +2 -0
  62. package/dist/publish/api/publishArgs.js +25 -0
  63. package/dist/publish/api/publishHookApi.d.ts +10 -0
  64. package/dist/publish/api/publishHookApi.js +53 -0
  65. package/dist/publish/cli.d.ts +2 -0
  66. package/dist/publish/cli.js +95 -0
  67. package/dist/publish/ownerRunner.d.ts +6 -0
  68. package/dist/publish/ownerRunner.js +22 -0
  69. package/dist/publish/publishRunner.d.ts +16 -0
  70. package/dist/publish/publishRunner.js +108 -0
  71. package/dist/publish/runner/packageBuilder.d.ts +4 -0
  72. package/dist/publish/runner/packageBuilder.js +16 -0
  73. package/dist/publish/runner/packagePublisher.d.ts +7 -0
  74. package/dist/publish/runner/packagePublisher.js +21 -0
  75. package/dist/publish/runner/publishFailureReporter.d.ts +3 -0
  76. package/dist/publish/runner/publishFailureReporter.js +14 -0
  77. package/dist/publish/runner/publishOutputFormatter.d.ts +2 -0
  78. package/dist/publish/runner/publishOutputFormatter.js +83 -0
  79. package/dist/publish/runner/publishPreflight.d.ts +8 -0
  80. package/dist/publish/runner/publishPreflight.js +26 -0
  81. package/dist/publish/runner/publishSummaryReporter.d.ts +10 -0
  82. package/dist/publish/runner/publishSummaryReporter.js +81 -0
  83. package/dist/publish/runner/publishTargetError.d.ts +9 -0
  84. package/dist/publish/runner/publishTargetError.js +14 -0
  85. package/dist/publish/runner/releaseGitController.d.ts +10 -0
  86. package/dist/publish/runner/releaseGitController.js +41 -0
  87. package/dist/publish/runner/versionWriter.d.ts +13 -0
  88. package/dist/publish/runner/versionWriter.js +78 -0
  89. package/dist/publish/targetResolver.d.ts +7 -0
  90. package/dist/publish/targetResolver.js +195 -0
  91. package/dist/publish/types.d.ts +70 -0
  92. package/dist/publish/types.js +0 -0
  93. package/dist/publish/version.d.ts +5 -0
  94. package/dist/publish/version.js +55 -0
  95. package/dist/types.d.ts +8 -7
  96. package/dist/workspace/packages.d.ts +9 -0
  97. package/dist/workspace/packages.js +62 -0
  98. package/dist/workspace/root.d.ts +1 -0
  99. package/dist/workspace/root.js +14 -0
  100. package/package.json +15 -7
  101. package/bin/entry.cjs +0 -163
@@ -0,0 +1,195 @@
1
+ import path from 'node:path';
2
+ import { createScopedAukletLogger } from '#auklet/logger';
3
+ import { findWorkspaceRoot } from '#auklet/workspace/root';
4
+ import { getPublishConfig, readPackageJson, requirePackageName, requirePackageVersion, } from '#auklet/publish/api/packageJsonApi';
5
+ import { readPnpmWorkspacePackages } from '#auklet/publish/api/pnpmApi';
6
+ import { resolvePublishVersion, validateVersionConsistency, } from '#auklet/publish/version';
7
+ export async function resolvePublishPlan(options, logger = createScopedAukletLogger('publish')) {
8
+ if (options.filters.length) {
9
+ return resolveMonorepoPublishPlan(options, logger);
10
+ }
11
+ return resolveCurrentPackagePublishPlan(options);
12
+ }
13
+ export async function resolveOwnerPackageNames(options) {
14
+ if (options.filters.length && options.packages.length) {
15
+ throw new Error('[auklet:publish] owner command cannot use --filter and --package together.');
16
+ }
17
+ if (options.filters.length) {
18
+ const root = requireWorkspaceRoot(options.cwd);
19
+ const packages = await readPnpmWorkspacePackages(root);
20
+ return filterWorkspacePackages(packages, options.filters)
21
+ .filter((item) => !item.private)
22
+ .map((item) => item.name);
23
+ }
24
+ if (options.packages.length)
25
+ return [...new Set(options.packages)];
26
+ const packageJson = readPackageJson(options.cwd);
27
+ if (packageJson.private) {
28
+ throw new Error('[auklet:publish] current package is private.');
29
+ }
30
+ return [requirePackageName(options.cwd, packageJson)];
31
+ }
32
+ const resolveCurrentPackagePublishPlan = async (options) => {
33
+ const packageRoot = path.resolve(options.cwd);
34
+ const packageJson = readPackageJson(packageRoot);
35
+ const version = requirePackageVersion(packageRoot, packageJson);
36
+ const workspaceRoot = findWorkspaceRoot(packageRoot);
37
+ if (workspaceRoot === packageRoot && packageJson.private) {
38
+ throw new Error('[auklet:publish] current directory is a private monorepo root. Use --filter to select workspace packages.');
39
+ }
40
+ const publishVersion = await resolvePublishVersion(version, options.version, packageRoot);
41
+ const target = createPublishTarget({
42
+ packageRoot,
43
+ packageJson,
44
+ publishVersion,
45
+ workspaceMode: 'single',
46
+ });
47
+ validatePublishTargets([target]);
48
+ return {
49
+ root: packageRoot,
50
+ version: publishVersion,
51
+ dryRun: options.dryRun,
52
+ targets: [target],
53
+ config: getPublishConfig(packageJson),
54
+ workspaceMode: 'single',
55
+ };
56
+ };
57
+ const resolveMonorepoPublishPlan = async (options, logger) => {
58
+ const root = requireWorkspaceRoot(options.cwd);
59
+ const rootPackageJson = readPackageJson(root);
60
+ const rootVersion = requirePackageVersion(root, rootPackageJson);
61
+ const workspacePackages = await readPnpmWorkspacePackages(root);
62
+ const selectedPackages = filterWorkspacePackages(workspacePackages, options.filters);
63
+ const publishVersion = await resolvePublishVersion(rootVersion, options.version, root);
64
+ const targets = selectedPackages
65
+ .filter((item) => {
66
+ if (!item.private)
67
+ return true;
68
+ if (isExactlyMatchedByFilter(item.name, options.filters)) {
69
+ logger.warnOnce('package ', logger.package(item.name), ' is private, skipping.');
70
+ }
71
+ return false;
72
+ })
73
+ .map((item) => {
74
+ const packageJson = readPackageJson(item.path);
75
+ return createPublishTarget({
76
+ packageRoot: item.path,
77
+ packageJson,
78
+ publishVersion,
79
+ workspaceMode: 'monorepo',
80
+ });
81
+ });
82
+ validatePublishTargets(targets);
83
+ validateWorkspaceInternalDependencies(targets);
84
+ if (!options.version) {
85
+ validateVersionConsistency(rootVersion, targets);
86
+ }
87
+ return {
88
+ root,
89
+ version: publishVersion,
90
+ dryRun: options.dryRun,
91
+ targets: sortTargetsByWorkspaceDependencies(targets),
92
+ config: getPublishConfig(rootPackageJson),
93
+ workspaceMode: 'monorepo',
94
+ };
95
+ };
96
+ const requireWorkspaceRoot = (cwd) => {
97
+ const root = findWorkspaceRoot(cwd);
98
+ if (!root) {
99
+ throw new Error('[auklet:publish] --filter requires a pnpm workspace root.');
100
+ }
101
+ return root;
102
+ };
103
+ const filterWorkspacePackages = (packages, filters) => {
104
+ const matched = packages.filter((item) => filters.some((filter) => matchesFilter(item.name, filter)));
105
+ if (!matched.length) {
106
+ throw new Error(`[auklet:publish] no workspace package matched filter: ${filters.join(', ')}`);
107
+ }
108
+ return matched;
109
+ };
110
+ const matchesFilter = (packageName, filter) => {
111
+ if (filter.endsWith('/*')) {
112
+ const scope = filter.slice(0, -2);
113
+ return packageName.startsWith(`${scope}/`);
114
+ }
115
+ return packageName === filter;
116
+ };
117
+ const isExactlyMatchedByFilter = (packageName, filters) => {
118
+ return filters.some((filter) => filter === packageName);
119
+ };
120
+ const createPublishTarget = (options) => {
121
+ const packageName = requirePackageName(options.packageRoot, options.packageJson);
122
+ const version = requirePackageVersion(options.packageRoot, options.packageJson);
123
+ return {
124
+ packageRoot: options.packageRoot,
125
+ packageName,
126
+ version,
127
+ publishVersion: options.publishVersion,
128
+ private: options.packageJson.private === true,
129
+ kind: 'package',
130
+ workspaceMode: options.workspaceMode,
131
+ packageJson: options.packageJson,
132
+ };
133
+ };
134
+ const validatePublishTargets = (targets) => {
135
+ const publishableTargets = targets.filter((target) => !target.private);
136
+ if (!publishableTargets.length) {
137
+ throw new Error('[auklet:publish] no publishable package found.');
138
+ }
139
+ };
140
+ const sortTargetsByWorkspaceDependencies = (targets) => {
141
+ const targetNames = new Set(targets.map((target) => target.packageName));
142
+ const visited = new Set();
143
+ const visiting = new Set();
144
+ const sorted = [];
145
+ const targetMap = new Map(targets.map((target) => [target.packageName, target]));
146
+ const visit = (target) => {
147
+ if (visited.has(target.packageName))
148
+ return;
149
+ if (visiting.has(target.packageName)) {
150
+ throw new Error(`[auklet:publish] circular workspace dependency detected at ${target.packageName}.`);
151
+ }
152
+ visiting.add(target.packageName);
153
+ for (const dependency of getWorkspaceDependencies(target.packageJson)) {
154
+ if (!targetNames.has(dependency))
155
+ continue;
156
+ const dependencyTarget = targetMap.get(dependency);
157
+ if (dependencyTarget)
158
+ visit(dependencyTarget);
159
+ }
160
+ visiting.delete(target.packageName);
161
+ visited.add(target.packageName);
162
+ sorted.push(target);
163
+ };
164
+ for (const target of targets) {
165
+ visit(target);
166
+ }
167
+ return sorted;
168
+ };
169
+ const getWorkspaceDependencies = (packageJson) => {
170
+ return Object.entries({
171
+ ...packageJson.dependencies,
172
+ ...packageJson.optionalDependencies,
173
+ })
174
+ .filter(([, version]) => version === 'workspace:*')
175
+ .map(([packageName]) => packageName);
176
+ };
177
+ const validateWorkspaceInternalDependencies = (targets) => {
178
+ const targetNames = new Set(targets.map((target) => target.packageName));
179
+ for (const target of targets) {
180
+ for (const dependencyGroup of workspaceDependencyGroups) {
181
+ for (const [packageName, version] of Object.entries(target.packageJson[dependencyGroup] ?? {})) {
182
+ if (!targetNames.has(packageName))
183
+ continue;
184
+ if (version === 'workspace:*')
185
+ continue;
186
+ throw new Error(`[auklet:publish] package ${target.packageName} ${dependencyGroup} ${packageName} must use workspace:* before publishing.`);
187
+ }
188
+ }
189
+ }
190
+ };
191
+ const workspaceDependencyGroups = [
192
+ 'dependencies',
193
+ 'optionalDependencies',
194
+ 'peerDependencies',
195
+ ];
@@ -0,0 +1,70 @@
1
+ export type PackageJson = {
2
+ name?: string;
3
+ version?: string;
4
+ private?: boolean;
5
+ scripts?: Record<string, string>;
6
+ files?: Array<string>;
7
+ publishConfig?: {
8
+ access?: string;
9
+ [key: string]: unknown;
10
+ };
11
+ auklet?: {
12
+ publish?: PublishPackageConfig;
13
+ [key: string]: unknown;
14
+ };
15
+ dependencies?: Record<string, string>;
16
+ devDependencies?: Record<string, string>;
17
+ peerDependencies?: Record<string, string>;
18
+ optionalDependencies?: Record<string, string>;
19
+ [key: string]: unknown;
20
+ };
21
+ export type PublishPackageConfig = {
22
+ beforeBuild?: PublishHookConfig;
23
+ afterBuild?: PublishHookConfig;
24
+ beforePublish?: PublishHookConfig;
25
+ afterPublish?: PublishHookConfig;
26
+ };
27
+ export type PublishHookConfig = string | Array<string>;
28
+ export type PublishTarget = {
29
+ packageRoot: string;
30
+ packageName: string;
31
+ version: string;
32
+ publishVersion: string;
33
+ private: boolean;
34
+ kind: 'package' | 'lib';
35
+ workspaceMode: 'single' | 'monorepo';
36
+ packageJson: PackageJson;
37
+ };
38
+ export type WorkspacePackage = {
39
+ name: string;
40
+ path: string;
41
+ version: string;
42
+ private?: boolean;
43
+ };
44
+ export type PublishOptions = {
45
+ cwd: string;
46
+ filters: Array<string>;
47
+ version?: string;
48
+ dryRun: boolean;
49
+ format: boolean;
50
+ otp?: string;
51
+ ignoreScripts: boolean;
52
+ allowDirty: boolean;
53
+ };
54
+ export type OwnerOptions = {
55
+ cwd: string;
56
+ users: Array<string>;
57
+ filters: Array<string>;
58
+ packages: Array<string>;
59
+ otp?: string;
60
+ };
61
+ export type PublishPlan = {
62
+ root: string;
63
+ version: string;
64
+ dryRun: boolean;
65
+ targets: Array<PublishTarget>;
66
+ config: PublishPackageConfig;
67
+ workspaceMode: 'single' | 'monorepo';
68
+ };
69
+ export type HookStatus = 'beforeBuild' | 'afterBuild' | 'beforePublish' | 'afterPublish';
70
+ export type HookResult = 'success' | 'failure';
File without changes
@@ -0,0 +1,5 @@
1
+ export declare function resolvePublishVersion(currentVersion: string, versionSpec: string | undefined, cwd: string): Promise<string>;
2
+ export declare function validateVersionConsistency(expectedVersion: string, versions: Array<{
3
+ packageName: string;
4
+ version: string;
5
+ }>): void;
@@ -0,0 +1,55 @@
1
+ import semver from 'semver';
2
+ import { getGitShortHash } from '#auklet/publish/api/gitApi';
3
+ const prereleaseKinds = new Set(['alpha', 'beta']);
4
+ const releaseIncrements = new Set(['patch', 'minor', 'major']);
5
+ export async function resolvePublishVersion(currentVersion, versionSpec, cwd) {
6
+ if (!versionSpec) {
7
+ if (!semver.valid(currentVersion)) {
8
+ throw new Error(`[auklet:publish] invalid package version: ${currentVersion}`);
9
+ }
10
+ return currentVersion;
11
+ }
12
+ if (releaseIncrements.has(versionSpec)) {
13
+ const parsed = semver.parse(currentVersion);
14
+ if (!parsed) {
15
+ throw new Error(`[auklet:publish] invalid package version: ${currentVersion}`);
16
+ }
17
+ const baseVersion = `${parsed.major}.${parsed.minor}.${parsed.patch}`;
18
+ const next = semver.inc(baseVersion, versionSpec);
19
+ if (!next) {
20
+ throw new Error(`[auklet:publish] failed to bump version ${currentVersion} with ${versionSpec}.`);
21
+ }
22
+ return next;
23
+ }
24
+ if (prereleaseKinds.has(versionSpec)) {
25
+ const parsed = semver.parse(currentVersion);
26
+ if (!parsed) {
27
+ throw new Error(`[auklet:publish] invalid package version: ${currentVersion}`);
28
+ }
29
+ const suffix = (await getGitShortHash(cwd)) ?? createTimestamp();
30
+ return `${parsed.major}.${parsed.minor}.${parsed.patch}-${versionSpec}.${suffix}`;
31
+ }
32
+ const explicit = semver.valid(versionSpec);
33
+ if (explicit)
34
+ return explicit;
35
+ throw new Error(`[auklet:publish] unsupported --version value: ${versionSpec}`);
36
+ }
37
+ export function validateVersionConsistency(expectedVersion, versions) {
38
+ for (const item of versions) {
39
+ if (item.version !== expectedVersion) {
40
+ throw new Error(`[auklet:publish] package ${item.packageName} version ${item.version} does not match shared version ${expectedVersion}.`);
41
+ }
42
+ }
43
+ }
44
+ const createTimestamp = () => {
45
+ const date = new Date();
46
+ const pad = (value) => value.toString().padStart(2, '0');
47
+ return [
48
+ date.getFullYear(),
49
+ pad(date.getMonth() + 1),
50
+ pad(date.getDate()),
51
+ pad(date.getHours()),
52
+ pad(date.getMinutes()),
53
+ pad(date.getSeconds()),
54
+ ].join('');
55
+ };
package/dist/types.d.ts CHANGED
@@ -53,11 +53,6 @@ export interface AukletConfig {
53
53
  styles?: StyleOptions;
54
54
  build?: PackageBuildOptions;
55
55
  }
56
- export type AukletLogger = {
57
- log?: (...args: Array<unknown>) => void;
58
- info?: (...args: Array<unknown>) => void;
59
- error?: (...args: Array<unknown>) => void;
60
- };
61
56
  export type LoadAukletConfigOptions = {
62
57
  configFile?: string;
63
58
  cacheBust?: boolean;
@@ -65,7 +60,6 @@ export type LoadAukletConfigOptions = {
65
60
  export interface ModuleStyleBuildContext {
66
61
  packageRoot?: string;
67
62
  aukletConfig?: AukletConfig;
68
- logger?: AukletLogger;
69
63
  source?: string;
70
64
  output?: string;
71
65
  }
@@ -76,7 +70,14 @@ export interface ResolvedModuleStyleBuildContext {
76
70
  }
77
71
  export type ModuleStyleBuildOptions = {
78
72
  aukletConfig?: AukletConfig;
79
- logger?: AukletLogger;
73
+ };
74
+ export type ModuleStyleBuildResult = {
75
+ packageRoot: string;
76
+ styleFiles: Array<string>;
77
+ outputs: Array<{
78
+ file: string;
79
+ size: number;
80
+ }>;
80
81
  };
81
82
  export interface ModuleStyleBuildOutputConfig {
82
83
  outputFormats: Array<string>;
@@ -0,0 +1,9 @@
1
+ import { type Options } from 'execa';
2
+ export type WorkspacePackageInfo = {
3
+ name: string;
4
+ path: string;
5
+ version?: string;
6
+ private?: boolean;
7
+ };
8
+ export declare function readPnpmWorkspacePackageInfo(root: string, options?: Options): Promise<WorkspacePackageInfo[]>;
9
+ export declare function readPnpmWorkspacePackageInfoSync(root: string): WorkspacePackageInfo[];
@@ -0,0 +1,62 @@
1
+ import { execa, execaSync } from 'execa';
2
+ import { isArray, isPlainObject, isString } from 'aidly';
3
+ const pnpmWorkspaceListArgs = ['list', '-r', '--depth', '-1', '--json'];
4
+ const parsePnpmWorkspacePackages = (value) => {
5
+ let parsed;
6
+ try {
7
+ parsed = JSON.parse(value);
8
+ }
9
+ catch (error) {
10
+ throw new Error('[auklet:workspace] failed to parse workspace packages.', {
11
+ cause: error,
12
+ });
13
+ }
14
+ if (!isArray(parsed)) {
15
+ throwInvalidWorkspacePackages();
16
+ }
17
+ return parsed.map((item) => {
18
+ if (!isWorkspacePackageInfo(item))
19
+ throwInvalidWorkspacePackages();
20
+ return item;
21
+ });
22
+ };
23
+ export async function readPnpmWorkspacePackageInfo(root, options = {}) {
24
+ const result = await execa('pnpm', pnpmWorkspaceListArgs, {
25
+ cwd: root,
26
+ reject: false,
27
+ ...options,
28
+ });
29
+ if (result.failed) {
30
+ throw new Error('[auklet:workspace] failed to read workspace packages.', {
31
+ cause: result.stderr || result.stdout,
32
+ });
33
+ }
34
+ return parsePnpmWorkspacePackages(String(result.stdout ?? ''));
35
+ }
36
+ export function readPnpmWorkspacePackageInfoSync(root) {
37
+ const result = execaSync('pnpm', pnpmWorkspaceListArgs, {
38
+ cwd: root,
39
+ reject: false,
40
+ });
41
+ if (result.failed) {
42
+ throw new Error('[auklet:workspace] failed to read workspace packages.', {
43
+ cause: result.stderr || result.stdout,
44
+ });
45
+ }
46
+ return parsePnpmWorkspacePackages(String(result.stdout ?? ''));
47
+ }
48
+ const isWorkspacePackageInfo = (value) => {
49
+ if (!isPlainObject(value)) {
50
+ return false;
51
+ }
52
+ return (isString(value.name) &&
53
+ value.name.length > 0 &&
54
+ isString(value.path) &&
55
+ value.path.length > 0 &&
56
+ (value.version === undefined || isString(value.version)) &&
57
+ (value.private === undefined || typeof value.private === 'boolean'));
58
+ };
59
+ function throwInvalidWorkspacePackages() {
60
+ throw new Error('[auklet:workspace] failed to read workspace packages.\n' +
61
+ '[auklet:workspace] Expected `pnpm list -r --depth -1 --json` to return package objects with name/path.');
62
+ }
@@ -0,0 +1 @@
1
+ export declare function findWorkspaceRoot(startDir: string): string | null;
@@ -0,0 +1,14 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const workspaceFile = 'pnpm-workspace.yaml';
4
+ export function findWorkspaceRoot(startDir) {
5
+ let current = path.resolve(startDir);
6
+ while (true) {
7
+ if (fs.existsSync(path.join(current, workspaceFile)))
8
+ return current;
9
+ const parent = path.dirname(current);
10
+ if (parent === current)
11
+ return null;
12
+ current = parent;
13
+ }
14
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auklet",
3
- "version": "0.0.19",
3
+ "version": "0.0.21",
4
4
  "type": "module",
5
5
  "author": "chentao.arthur",
6
6
  "description": "Build utilities for TypeScript packages and module CSS output.",
@@ -9,8 +9,8 @@
9
9
  "pnpm": "=10.27.0"
10
10
  },
11
11
  "bin": {
12
- "auk": "./bin/entry.cjs",
13
- "auklet": "./bin/entry.cjs"
12
+ "auk": "./bin/entry.mjs",
13
+ "auklet": "./bin/entry.mjs"
14
14
  },
15
15
  "exports": {
16
16
  ".": {
@@ -51,23 +51,29 @@
51
51
  "tsdown"
52
52
  ],
53
53
  "dependencies": {
54
- "unrun": "0.3.0",
55
- "execa": "9.6.1",
54
+ "cac": "7.0.0",
55
+ "tsdown": "0.22.0",
56
56
  "aidly": "1.37.0",
57
+ "execa": "9.6.1",
57
58
  "rimraf": "6.1.3",
58
- "tsdown": "0.22.0",
59
59
  "postcss": "8.5.15",
60
60
  "chokidar": "5.0.0",
61
+ "semver": "7.8.1",
62
+ "briefing": "0.0.4",
61
63
  "minimist": "1.2.8",
64
+ "picocolors": "1.1.1",
62
65
  "typescript": "6.0.3",
66
+ "prettier": "3.8.3",
63
67
  "conditional-export": "1.1.0"
64
68
  },
65
69
  "devDependencies": {
66
70
  "@types/node": "22.17.0",
71
+ "@types/semver": "7.7.1",
72
+ "@types/prettier": "3.0.0",
67
73
  "@types/minimist": "1.2.5",
68
74
  "@vitest/coverage-v8": "4.1.7",
69
75
  "husky": "9.1.7",
70
- "prettier": "3.8.3",
76
+ "verdaccio": "6.7.1",
71
77
  "lint-staged": "17.0.5",
72
78
  "vite": "8.0.14",
73
79
  "vitest": "4.1.7"
@@ -89,6 +95,8 @@
89
95
  "test:examples": "pnpm build:examples && vitest run examples/__tests__",
90
96
  "test:coverage": "vitest run src/__tests__ --coverage",
91
97
  "typecheck": "tsc --noEmit --skipLibCheck",
98
+ "dev:registry": "verdaccio --config examples/verdaccio.yaml --listen 127.0.0.1:4873",
99
+ "dev:registry-login": "npm adduser --registry http://127.0.0.1:4873 --auth-type=legacy",
92
100
  "dev:examples": "pnpm --filter './examples/*' --if-present dev",
93
101
  "build:examples": "pnpm --filter './examples/*' build",
94
102
  "format:md": "prettier --write \"*.md\" \"examples/**/*.md\"",
package/bin/entry.cjs DELETED
@@ -1,163 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('node:fs');
4
- const path = require('node:path');
5
- const minimist = require('minimist');
6
-
7
- const getPackageVersion = () => {
8
- const packageJson = JSON.parse(
9
- fs.readFileSync(path.resolve(__dirname, '../package.json'), 'utf8'),
10
- );
11
- return packageJson.version;
12
- };
13
-
14
- const runVersion = async () => {
15
- console.log(getPackageVersion());
16
- return 0;
17
- };
18
-
19
- const loadCurrentAukletConfig = async (options) => {
20
- const { loadAukletConfig } = await import('../dist/configLoader.js');
21
- return loadAukletConfig(process.cwd(), options);
22
- };
23
-
24
- const runBuildStyle = async (args, options = {}) => {
25
- const shouldWatch = args.includes('--watch') || args.includes('-w');
26
- const aukletConfig =
27
- options.aukletConfig ??
28
- (await loadCurrentAukletConfig({
29
- cacheBust: shouldWatch,
30
- }));
31
-
32
- if (shouldWatch) {
33
- const { ModuleStyleWatcher } = await import('../dist/css/watch/watcher.js');
34
- const watcher = new ModuleStyleWatcher({ aukletConfig, logger: console });
35
- await watcher.watch();
36
- const close = () => {
37
- watcher
38
- .close()
39
- .catch(console.error)
40
- .finally(() => process.exit(0));
41
- };
42
- process.once('SIGINT', close);
43
- process.once('SIGTERM', close);
44
- await new Promise(() => {});
45
- return 0;
46
- }
47
-
48
- const { ModuleStyleBuilder } =
49
- await import('../dist/css/production/builder.js');
50
- const builder = new ModuleStyleBuilder({ aukletConfig, logger: console });
51
- await builder.build();
52
- return 0;
53
- };
54
-
55
- const runBuildJs = async (args) => {
56
- const { runTsdown } = await import('../dist/build/runTsdown.js');
57
- return runTsdown(args, { cwd: process.cwd() });
58
- };
59
-
60
- const runBuild = async (args) => {
61
- const aukletConfig = await loadCurrentAukletConfig();
62
- const { cleanAukletOutputByConfig } =
63
- await import('../dist/build/cleanOutput.js');
64
- cleanAukletOutputByConfig(process.cwd(), aukletConfig);
65
-
66
- const jsExitCode = await runBuildJs(args);
67
- if (jsExitCode) return jsExitCode;
68
-
69
- return runBuildStyle([], { aukletConfig });
70
- };
71
-
72
- const runDev = async () => {
73
- const { execa } = await import('execa');
74
- const { createTsdownArgs } = await import('../dist/build/runTsdown.js');
75
- const entries = [
76
- createTsdownArgs(['--watch']),
77
- [path.resolve(__dirname, './entry.cjs'), 'build-css', '--watch'],
78
- ];
79
- const processes = entries.map((args) =>
80
- execa(process.execPath, args, {
81
- cwd: process.cwd(),
82
- stdio: 'inherit',
83
- reject: false,
84
- }),
85
- );
86
-
87
- const close = () => {
88
- for (const item of processes) {
89
- item.kill('SIGTERM');
90
- }
91
- };
92
-
93
- process.once('SIGINT', close);
94
- process.once('SIGTERM', close);
95
-
96
- for (const item of processes) {
97
- item.then((result) => {
98
- if (result.exitCode) close();
99
- });
100
- }
101
-
102
- const results = await Promise.all(processes);
103
- const failed = results.find((result) => result.exitCode);
104
- return failed?.exitCode ?? 0;
105
- };
106
-
107
- const argv = minimist(process.argv.slice(2), {
108
- boolean: ['help', 'version'],
109
- alias: {
110
- h: 'help',
111
- v: 'version',
112
- },
113
- });
114
- const [command, ...args] = argv._;
115
- const commandIndex = process.argv.indexOf(command);
116
- const commandArgs =
117
- commandIndex >= 0 ? process.argv.slice(commandIndex + 1) : args;
118
-
119
- if (argv.version) {
120
- console.log(getPackageVersion());
121
- process.exit(0);
122
- }
123
-
124
- if (argv.help || !command) {
125
- console.log('Usage: auk <command>');
126
- console.log('');
127
- console.log('Commands:');
128
- console.log(' build Build package JavaScript and CSS output');
129
- console.log(' build-js Build package JavaScript output with tsdown');
130
- console.log(' build-css Build package module CSS output, supports --watch');
131
- console.log(' dev Watch package JavaScript and CSS output');
132
- console.log(' version Print auklet version');
133
- console.log('');
134
- console.log('Options:');
135
- console.log(' -v, --version Print auklet version');
136
- console.log(' -h, --help Print help');
137
- process.exit(argv.help ? 0 : 1);
138
- }
139
-
140
- const runners = {
141
- build: runBuild,
142
- 'build-js': runBuildJs,
143
- 'build-css': runBuildStyle,
144
- dev: runDev,
145
- version: runVersion,
146
- };
147
-
148
- const runner = runners[command];
149
-
150
- if (runner) {
151
- runner(commandArgs)
152
- .then((exitCode) => {
153
- process.exit(exitCode ?? 0);
154
- })
155
- .catch((error) => {
156
- console.error(error);
157
- process.exit(1);
158
- });
159
- return;
160
- }
161
-
162
- console.error(`Unknown auk command: ${command}`);
163
- process.exit(1);