@doki-land/nifty 0.0.4 → 0.0.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.
Files changed (45) hide show
  1. package/cli/nifty.mjs +11 -11
  2. package/locales/en-US/cli.json +70 -68
  3. package/locales/locales.json +4 -4
  4. package/package.json +16 -20
  5. package/src/cli/authArgs.ts +52 -52
  6. package/src/cli/bump-cmd.ts +55 -55
  7. package/src/cli/bump.ts +237 -237
  8. package/src/cli/change-logs-cmd.ts +97 -97
  9. package/src/cli/cli.ts +47 -47
  10. package/src/cli/{reword-cmd.ts → commit-cmd.ts} +128 -87
  11. package/src/cli/context.ts +36 -36
  12. package/src/cli/format-cmd.ts +23 -23
  13. package/src/cli/format.ts +39 -28
  14. package/src/cli/index.ts +9 -9
  15. package/src/cli/install-native-cmd.ts +22 -22
  16. package/src/cli/install-native.ts +80 -80
  17. package/src/cli/lint-cmd.ts +35 -35
  18. package/src/cli/lint.ts +108 -102
  19. package/src/cli/main.ts +1 -1
  20. package/src/cli/options.ts +40 -40
  21. package/src/cli/publish-cmd.ts +38 -38
  22. package/src/cli/publish.ts +95 -95
  23. package/src/cli/resolveNpm.ts +16 -16
  24. package/src/cli/retime-cmd.ts +62 -62
  25. package/src/cli/trust-cmd.ts +38 -38
  26. package/src/cli/trust.ts +83 -83
  27. package/src/cli/update-cmd.ts +20 -20
  28. package/src/cli/update.ts +32 -32
  29. package/src/cli/upload-cmd.ts +44 -44
  30. package/src/cli/upload.ts +313 -313
  31. package/src/cli/workspace.ts +124 -124
  32. package/src/config/defineConfig.ts +12 -12
  33. package/src/config/detectProject.ts +189 -189
  34. package/src/config/formatPresets.ts +55 -0
  35. package/src/config/index.ts +28 -25
  36. package/src/config/loadConfig.ts +129 -129
  37. package/src/config/types.ts +78 -57
  38. package/src/git.ts +61 -61
  39. package/src/github.ts +184 -184
  40. package/src/gitmoji.ts +77 -77
  41. package/src/index.ts +40 -36
  42. package/src/native.ts +756 -665
  43. package/src/nifty.ts +95 -95
  44. package/src/types.ts +40 -40
  45. package/README.md +0 -29
@@ -1,80 +1,80 @@
1
- import { copyFileSync, existsSync, mkdirSync, readdirSync } from "node:fs";
2
- import { basename, dirname, join, relative, resolve } from "node:path";
3
-
4
- import { detectProjectLayout } from "../config/detectProject.js";
5
-
6
- /** Basename of a built .node file → platform package directory under projects/packages/. */
7
- const PACKAGE_BY_ASSET: Record<string, string> = {
8
- "nifty-win32-x64-msvc.node": "nifty-win32-x64",
9
- "nifty-linux-x64-gnu.node": "nifty-linux-x64",
10
- "nifty-linux-arm64-gnu.node": "nifty-linux-arm64",
11
- "nifty-darwin-x64.node": "nifty-darwin-x64",
12
- "nifty-darwin-arm64.node": "nifty-darwin-arm64",
13
- };
14
-
15
- /** Matrix platforms that must be present after install (matches publish-npm.yml). */
16
- const REQUIRED_PACKAGES = ["nifty-win32-x64", "nifty-linux-x64", "nifty-darwin-arm64"];
17
-
18
- export type InstallNativeOptions = {
19
- /** Downloaded CI artifact tree (walked recursively for .node files). */
20
- from: string;
21
- cwd?: string;
22
- };
23
-
24
- function walkNodes(dir: string): string[] {
25
- const out: string[] = [];
26
- if (!existsSync(dir)) {
27
- return out;
28
- }
29
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
30
- const full = join(dir, entry.name);
31
- if (entry.isDirectory()) {
32
- out.push(...walkNodes(full));
33
- } else if (entry.isFile() && entry.name.endsWith(".node")) {
34
- out.push(full);
35
- }
36
- }
37
- return out;
38
- }
39
-
40
- function libHasNode(libDir: string): boolean {
41
- return existsSync(libDir) && readdirSync(libDir).some((name) => name.endsWith(".node"));
42
- }
43
-
44
- /** Copy matrix .node artifacts into platform package lib dirs for npm publish. */
45
- export function installNativeFromOptions(options: InstallNativeOptions): void {
46
- const layout = detectProjectLayout(options.cwd ?? process.cwd());
47
- const artifactRoot = resolve(layout.root, options.from);
48
- const nodes = walkNodes(artifactRoot);
49
- if (nodes.length === 0) {
50
- throw new Error(`install-native: no .node files under ${artifactRoot}`);
51
- }
52
-
53
- let installed = 0;
54
- for (const file of nodes) {
55
- const base = basename(file);
56
- const packageDir = PACKAGE_BY_ASSET[base];
57
- if (!packageDir) {
58
- console.log(`skip unmapped artifact ${relative(artifactRoot, file)}`);
59
- continue;
60
- }
61
- const dest = join(layout.root, "projects/packages", packageDir, "lib", base);
62
- mkdirSync(dirname(dest), { recursive: true });
63
- copyFileSync(file, dest);
64
- console.log(`installed ${relative(layout.root, dest)}`);
65
- installed += 1;
66
- }
67
-
68
- if (installed === 0) {
69
- throw new Error("install-native: no mapped platform .node files installed");
70
- }
71
-
72
- for (const packageDir of REQUIRED_PACKAGES) {
73
- const libDir = join(layout.root, "projects/packages", packageDir, "lib");
74
- if (!libHasNode(libDir)) {
75
- throw new Error(`install-native: missing .node under ${packageDir}/lib`);
76
- }
77
- }
78
-
79
- console.log(`install-native: ${installed} native binary(ies) ready for npm publish`);
80
- }
1
+ import { copyFileSync, existsSync, mkdirSync, readdirSync } from "node:fs";
2
+ import { basename, dirname, join, relative, resolve } from "node:path";
3
+
4
+ import { detectProjectLayout } from "../config/detectProject.js";
5
+
6
+ /** Basename of a built .node file → platform package directory under projects/packages/. */
7
+ const PACKAGE_BY_ASSET: Record<string, string> = {
8
+ "nifty-win32-x64-msvc.node": "nifty-win32-x64",
9
+ "nifty-linux-x64-gnu.node": "nifty-linux-x64",
10
+ "nifty-linux-arm64-gnu.node": "nifty-linux-arm64",
11
+ "nifty-darwin-x64.node": "nifty-darwin-x64",
12
+ "nifty-darwin-arm64.node": "nifty-darwin-arm64",
13
+ };
14
+
15
+ /** Matrix platforms that must be present after install (matches publish-npm.yml). */
16
+ const REQUIRED_PACKAGES = ["nifty-win32-x64", "nifty-linux-x64", "nifty-darwin-arm64"];
17
+
18
+ export type InstallNativeOptions = {
19
+ /** Downloaded CI artifact tree (walked recursively for .node files). */
20
+ from: string;
21
+ cwd?: string;
22
+ };
23
+
24
+ function walkNodes(dir: string): string[] {
25
+ const out: string[] = [];
26
+ if (!existsSync(dir)) {
27
+ return out;
28
+ }
29
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
30
+ const full = join(dir, entry.name);
31
+ if (entry.isDirectory()) {
32
+ out.push(...walkNodes(full));
33
+ } else if (entry.isFile() && entry.name.endsWith(".node")) {
34
+ out.push(full);
35
+ }
36
+ }
37
+ return out;
38
+ }
39
+
40
+ function libHasNode(libDir: string): boolean {
41
+ return existsSync(libDir) && readdirSync(libDir).some((name) => name.endsWith(".node"));
42
+ }
43
+
44
+ /** Copy matrix .node artifacts into platform package lib dirs for npm publish. */
45
+ export function installNativeFromOptions(options: InstallNativeOptions): void {
46
+ const layout = detectProjectLayout(options.cwd ?? process.cwd());
47
+ const artifactRoot = resolve(layout.root, options.from);
48
+ const nodes = walkNodes(artifactRoot);
49
+ if (nodes.length === 0) {
50
+ throw new Error(`install-native: no .node files under ${artifactRoot}`);
51
+ }
52
+
53
+ let installed = 0;
54
+ for (const file of nodes) {
55
+ const base = basename(file);
56
+ const packageDir = PACKAGE_BY_ASSET[base];
57
+ if (!packageDir) {
58
+ console.log(`skip unmapped artifact ${relative(artifactRoot, file)}`);
59
+ continue;
60
+ }
61
+ const dest = join(layout.root, "projects/packages", packageDir, "lib", base);
62
+ mkdirSync(dirname(dest), { recursive: true });
63
+ copyFileSync(file, dest);
64
+ console.log(`installed ${relative(layout.root, dest)}`);
65
+ installed += 1;
66
+ }
67
+
68
+ if (installed === 0) {
69
+ throw new Error("install-native: no mapped platform .node files installed");
70
+ }
71
+
72
+ for (const packageDir of REQUIRED_PACKAGES) {
73
+ const libDir = join(layout.root, "projects/packages", packageDir, "lib");
74
+ if (!libHasNode(libDir)) {
75
+ throw new Error(`install-native: missing .node under ${packageDir}/lib`);
76
+ }
77
+ }
78
+
79
+ console.log(`install-native: ${installed} native binary(ies) ready for npm publish`);
80
+ }
@@ -1,35 +1,35 @@
1
- import type { Cli, ParsedOptions } from "@vmz/commander";
2
-
3
- import { bootstrapFromOptions } from "./context.js";
4
- import { lintCommits, type LintOptions } from "./lint.js";
5
- import { cwdFrom, flag, str, strList } from "./options.js";
6
-
7
- export function registerLintCommands(cli: Cli): void {
8
- registerLintLike(cli, "lint", "cli.cmd.lint", false);
9
- registerLintLike(cli, "check", "cli.cmd.check", true);
10
- }
11
-
12
- function registerLintLike(cli: Cli, name: string, helpId: string, check: boolean): void {
13
- cli.command(name, helpId)
14
- .option("--from <ref>", "cli.opt.from")
15
- .option("--to <ref>", "cli.opt.to")
16
- .option("-s, --subject <text>...", "cli.opt.subject")
17
- .option("--no-cargo", "cli.opt.no-cargo")
18
- .action(async (options) => cmdLint(options, check));
19
- }
20
-
21
- export async function cmdLint(options: ParsedOptions, check: boolean): Promise<number> {
22
- await bootstrapFromOptions(options);
23
- const lintOptions: LintOptions = {
24
- subjects: strList(options, "subject"),
25
- from: str(options, "from"),
26
- to: str(options, "to"),
27
- cwd: cwdFrom(options),
28
- scanCargo: flag(options, "no-cargo") ? false : undefined,
29
- };
30
- const errorCount = await lintCommits(lintOptions, check);
31
- if (check && errorCount > 0) {
32
- throw new Error(`found ${errorCount} lint error(s)`);
33
- }
34
- return 0;
35
- }
1
+ import type { Cli, ParsedOptions } from "@vmz/commander";
2
+
3
+ import { bootstrapFromOptions } from "./context.js";
4
+ import { lintCommits, type LintOptions } from "./lint.js";
5
+ import { cwdFrom, flag, str, strList } from "./options.js";
6
+
7
+ export function registerLintCommands(cli: Cli): void {
8
+ registerLintLike(cli, "lint", "cli.cmd.lint", false);
9
+ registerLintLike(cli, "check", "cli.cmd.check", true);
10
+ }
11
+
12
+ function registerLintLike(cli: Cli, name: string, helpId: string, check: boolean): void {
13
+ cli.command(name, helpId)
14
+ .option("--from <ref>", "cli.opt.from")
15
+ .option("--to <ref>", "cli.opt.to")
16
+ .option("-s, --subject <text>...", "cli.opt.subject")
17
+ .option("--no-cargo", "cli.opt.no-cargo")
18
+ .action(async (options) => cmdLint(options, check));
19
+ }
20
+
21
+ export async function cmdLint(options: ParsedOptions, check: boolean): Promise<number> {
22
+ await bootstrapFromOptions(options);
23
+ const lintOptions: LintOptions = {
24
+ subjects: strList(options, "subject"),
25
+ from: str(options, "from"),
26
+ to: str(options, "to"),
27
+ cwd: cwdFrom(options),
28
+ scanCargo: flag(options, "no-cargo") ? false : undefined,
29
+ };
30
+ const errorCount = await lintCommits(lintOptions, check);
31
+ if (check && errorCount > 0) {
32
+ throw new Error(`found ${errorCount} lint error(s)`);
33
+ }
34
+ return 0;
35
+ }
package/src/cli/lint.ts CHANGED
@@ -1,102 +1,108 @@
1
- import { loadConfig } from "../config/loadConfig.js";
2
- import { loadNiftyNative } from "../native.js";
3
-
4
- export type LintOptions = {
5
- subjects: string[];
6
- from?: string;
7
- to?: string;
8
- cwd?: string;
9
- scanCargo?: boolean;
10
- };
11
-
12
- type LintDiagnostic = {
13
- rule: string;
14
- severity: "error" | "warning" | "info";
15
- message: string;
16
- subject?: string;
17
- hash?: string;
18
- path?: string;
19
- line?: number;
20
- };
21
-
22
- type LintRuleConfig = {
23
- id: string;
24
- enabled?: boolean;
25
- severity?: "error" | "warning" | "info";
26
- };
27
-
28
- export async function runLint(argv: string[], check: boolean): Promise<void> {
29
- const options = parseLintArgs(argv);
30
- const errorCount = await lintCommits(options, check);
31
- if (check && errorCount > 0) {
32
- throw new Error(`found ${errorCount} lint error(s)`);
33
- }
34
- }
35
-
36
- export async function lintCommits(options: LintOptions, check: boolean): Promise<number> {
37
- const native = loadNiftyNative();
38
- const cwd = options.cwd ?? process.cwd();
39
- const { config } = await loadConfig({ cwd, createIfMissing: false });
40
- const rules: LintRuleConfig[] | undefined = config.lint?.rules?.map((rule) => ({
41
- id: rule.id,
42
- enabled: rule.enabled,
43
- severity: rule.severity,
44
- }));
45
-
46
- const runner = check ? native.lint.check : native.lint.run;
47
- const report = runner({
48
- cwd,
49
- fromRef: options.from,
50
- toRef: options.to,
51
- subjects: options.subjects.length > 0 ? options.subjects : undefined,
52
- rules,
53
- scanCargo: options.scanCargo,
54
- });
55
-
56
- for (const item of report.diagnostics) {
57
- printDiagnostic(item);
58
- }
59
-
60
- if (report.diagnostics.length > 0) {
61
- console.log(`lint: ${report.errorCount} error(s), ${report.warningCount} warning(s)`);
62
- } else {
63
- console.log("lint: no issues found");
64
- }
65
-
66
- return report.errorCount;
67
- }
68
-
69
- function printDiagnostic(item: LintDiagnostic): void {
70
- const prefix = item.severity === "error" ? "error" : item.severity === "warning" ? "warning" : "info";
71
- if (item.subject) {
72
- console.log(`${prefix} [${item.rule}] ${item.message} (${item.subject})`);
73
- return;
74
- }
75
- const location =
76
- item.path !== undefined
77
- ? item.line !== undefined
78
- ? `${item.path}:${item.line}`
79
- : item.path
80
- : undefined;
81
- const suffix = location ? ` @ ${location}` : "";
82
- console.log(`${prefix} [${item.rule}] ${item.message}${suffix}`);
83
- }
84
-
85
- function parseLintArgs(argv: string[]): LintOptions {
86
- const options: LintOptions = { subjects: [] };
87
- for (let i = 0; i < argv.length; i += 1) {
88
- const arg = argv[i];
89
- if (arg === "--from") {
90
- options.from = argv[++i];
91
- } else if (arg === "--to") {
92
- options.to = argv[++i];
93
- } else if (arg === "-C" || arg === "--cwd") {
94
- options.cwd = argv[++i];
95
- } else if (arg === "-s" || arg === "--subject") {
96
- options.subjects.push(argv[++i]);
97
- } else if (arg === "--no-cargo") {
98
- options.scanCargo = false;
99
- }
100
- }
101
- return options;
102
- }
1
+ import { loadConfig } from "../config/loadConfig.js";
2
+ import { loadNiftyNative } from "../native.js";
3
+
4
+ export type LintOptions = {
5
+ subjects: string[];
6
+ from?: string;
7
+ to?: string;
8
+ cwd?: string;
9
+ scanCargo?: boolean;
10
+ commitOnly?: boolean;
11
+ };
12
+
13
+ type LintDiagnostic = {
14
+ rule: string;
15
+ severity: "error" | "warning" | "info";
16
+ message: string;
17
+ subject?: string;
18
+ hash?: string;
19
+ path?: string;
20
+ line?: number;
21
+ };
22
+
23
+ type LintRuleConfig = {
24
+ id: string;
25
+ enabled?: boolean;
26
+ severity?: "error" | "warning" | "info";
27
+ };
28
+
29
+ export async function runLint(argv: string[], check: boolean): Promise<void> {
30
+ const options = parseLintArgs(argv);
31
+ const errorCount = await lintCommits(options, check);
32
+ if (check && errorCount > 0) {
33
+ throw new Error(`found ${errorCount} lint error(s)`);
34
+ }
35
+ }
36
+
37
+ export async function lintCommits(
38
+ options: LintOptions,
39
+ check: boolean,
40
+ commitOnly = options.commitOnly ?? false,
41
+ ): Promise<number> {
42
+ const native = loadNiftyNative();
43
+ const cwd = options.cwd ?? process.cwd();
44
+ const { config } = await loadConfig({ cwd, createIfMissing: false });
45
+ const rules: LintRuleConfig[] | undefined = config.lint?.rules?.map((rule) => ({
46
+ id: rule.id,
47
+ enabled: rule.enabled,
48
+ severity: rule.severity,
49
+ }));
50
+
51
+ const runner = check ? native.lint.check : native.lint.run;
52
+ const report = runner({
53
+ cwd,
54
+ fromRef: options.from,
55
+ toRef: options.to,
56
+ subjects: options.subjects.length > 0 ? options.subjects : undefined,
57
+ rules,
58
+ scanCargo: options.scanCargo,
59
+ commitOnly: commitOnly || options.commitOnly,
60
+ });
61
+
62
+ for (const item of report.diagnostics) {
63
+ printDiagnostic(item);
64
+ }
65
+
66
+ if (report.diagnostics.length > 0) {
67
+ console.log(`lint: ${report.errorCount} error(s), ${report.warningCount} warning(s)`);
68
+ } else {
69
+ console.log("lint: no issues found");
70
+ }
71
+
72
+ return report.errorCount;
73
+ }
74
+
75
+ function printDiagnostic(item: LintDiagnostic): void {
76
+ const prefix = item.severity === "error" ? "error" : item.severity === "warning" ? "warning" : "info";
77
+ if (item.subject) {
78
+ console.log(`${prefix} [${item.rule}] ${item.message} (${item.subject})`);
79
+ return;
80
+ }
81
+ const location =
82
+ item.path !== undefined
83
+ ? item.line !== undefined
84
+ ? `${item.path}:${item.line}`
85
+ : item.path
86
+ : undefined;
87
+ const suffix = location ? ` @ ${location}` : "";
88
+ console.log(`${prefix} [${item.rule}] ${item.message}${suffix}`);
89
+ }
90
+
91
+ function parseLintArgs(argv: string[]): LintOptions {
92
+ const options: LintOptions = { subjects: [] };
93
+ for (let i = 0; i < argv.length; i += 1) {
94
+ const arg = argv[i];
95
+ if (arg === "--from") {
96
+ options.from = argv[++i];
97
+ } else if (arg === "--to") {
98
+ options.to = argv[++i];
99
+ } else if (arg === "-C" || arg === "--cwd") {
100
+ options.cwd = argv[++i];
101
+ } else if (arg === "-s" || arg === "--subject") {
102
+ options.subjects.push(argv[++i]);
103
+ } else if (arg === "--no-cargo") {
104
+ options.scanCargo = false;
105
+ }
106
+ }
107
+ return options;
108
+ }
package/src/cli/main.ts CHANGED
@@ -1 +1 @@
1
- export { runCli } from "./cli.js";
1
+ export { runCli } from "./cli.js";
@@ -1,40 +1,40 @@
1
- import { resolve } from "node:path";
2
-
3
- import type { ParsedOptions } from "@vmz/commander";
4
-
5
- import { resolveNpmExecutable } from "./resolveNpm.js";
6
- import type { AuthCliOptions } from "./authArgs.js";
7
-
8
- export function cwdFrom(options: ParsedOptions): string | undefined {
9
- const value = options.cwd;
10
- return typeof value === "string" && value.length > 0 ? resolve(value) : undefined;
11
- }
12
-
13
- export function flag(options: ParsedOptions, key: string): boolean {
14
- return options[key] === true;
15
- }
16
-
17
- export function str(options: ParsedOptions, key: string): string | undefined {
18
- const value = options[key];
19
- return typeof value === "string" && value.length > 0 ? value : undefined;
20
- }
21
-
22
- export function strList(options: ParsedOptions, key: string): string[] {
23
- const value = options[key];
24
- if (Array.isArray(value)) {
25
- return value.filter((entry): entry is string => typeof entry === "string" && entry.length > 0);
26
- }
27
- if (typeof value === "string" && value.length > 0) {
28
- return [value];
29
- }
30
- return [];
31
- }
32
-
33
- export function authFromOptions(options: ParsedOptions): AuthCliOptions {
34
- return {
35
- otp: str(options, "otp"),
36
- totpSecret: str(options, "totp-secret"),
37
- token: str(options, "npm-token") ?? str(options, "token"),
38
- npm: resolveNpmExecutable(),
39
- };
40
- }
1
+ import { resolve } from "node:path";
2
+
3
+ import type { ParsedOptions } from "@vmz/commander";
4
+
5
+ import { resolveNpmExecutable } from "./resolveNpm.js";
6
+ import type { AuthCliOptions } from "./authArgs.js";
7
+
8
+ export function cwdFrom(options: ParsedOptions): string | undefined {
9
+ const value = options.cwd;
10
+ return typeof value === "string" && value.length > 0 ? resolve(value) : undefined;
11
+ }
12
+
13
+ export function flag(options: ParsedOptions, key: string): boolean {
14
+ return options[key] === true;
15
+ }
16
+
17
+ export function str(options: ParsedOptions, key: string): string | undefined {
18
+ const value = options[key];
19
+ return typeof value === "string" && value.length > 0 ? value : undefined;
20
+ }
21
+
22
+ export function strList(options: ParsedOptions, key: string): string[] {
23
+ const value = options[key];
24
+ if (Array.isArray(value)) {
25
+ return value.filter((entry): entry is string => typeof entry === "string" && entry.length > 0);
26
+ }
27
+ if (typeof value === "string" && value.length > 0) {
28
+ return [value];
29
+ }
30
+ return [];
31
+ }
32
+
33
+ export function authFromOptions(options: ParsedOptions): AuthCliOptions {
34
+ return {
35
+ otp: str(options, "otp"),
36
+ totpSecret: str(options, "totp-secret"),
37
+ token: str(options, "npm-token") ?? str(options, "token"),
38
+ npm: resolveNpmExecutable(),
39
+ };
40
+ }
@@ -1,38 +1,38 @@
1
- import type { Cli, ParsedOptions } from "@vmz/commander";
2
-
3
- import { loadNiftyNative } from "../native.js";
4
- import { authPayload } from "./authArgs.js";
5
- import { bootstrapFromOptions } from "./context.js";
6
- import { printPublishReport } from "./publish.js";
7
- import { authFromOptions, cwdFrom, flag, str, strList } from "./options.js";
8
-
9
- export function registerPublishCommand(cli: Cli): void {
10
- cli.command("publish", "cli.cmd.publish")
11
- .option("--dry-run", "cli.opt.dry-run")
12
- .option("--refresh", "cli.opt.refresh")
13
- .option("--package <name>", "cli.opt.package")
14
- .option("--tag <tag>", "cli.opt.tag")
15
- .option("--access <access>", "cli.opt.access")
16
- .option("--otp <code>", "cli.opt.otp")
17
- .option("--totp-secret <secret>", "cli.opt.totp-secret")
18
- .option("--npm-token <token>", "cli.opt.npm-token")
19
- .action(async (options) => cmdPublish(options));
20
- }
21
-
22
- export async function cmdPublish(options: ParsedOptions): Promise<number> {
23
- await bootstrapFromOptions(options);
24
- const packages = strList(options, "package");
25
- const native = loadNiftyNative();
26
- const report = native.publisher["publish-workspace"]({
27
- cwd: cwdFrom(options),
28
- dryRun: flag(options, "dry-run"),
29
- refresh: flag(options, "refresh"),
30
- tag: str(options, "tag"),
31
- access: str(options, "access") ?? "public",
32
- ...(packages.length === 1 ? { only: packages[0] } : {}),
33
- ...(packages.length > 1 ? { packages } : {}),
34
- ...authPayload(authFromOptions(options)),
35
- });
36
- printPublishReport(report, flag(options, "dry-run"));
37
- return 0;
38
- }
1
+ import type { Cli, ParsedOptions } from "@vmz/commander";
2
+
3
+ import { loadNiftyNative } from "../native.js";
4
+ import { authPayload } from "./authArgs.js";
5
+ import { bootstrapFromOptions } from "./context.js";
6
+ import { printPublishReport } from "./publish.js";
7
+ import { authFromOptions, cwdFrom, flag, str, strList } from "./options.js";
8
+
9
+ export function registerPublishCommand(cli: Cli): void {
10
+ cli.command("publish", "cli.cmd.publish")
11
+ .option("--dry-run", "cli.opt.dry-run")
12
+ .option("--refresh", "cli.opt.refresh")
13
+ .option("--package <name>", "cli.opt.package")
14
+ .option("--tag <tag>", "cli.opt.tag")
15
+ .option("--access <access>", "cli.opt.access")
16
+ .option("--otp <code>", "cli.opt.otp")
17
+ .option("--totp-secret <secret>", "cli.opt.totp-secret")
18
+ .option("--npm-token <token>", "cli.opt.npm-token")
19
+ .action(async (options) => cmdPublish(options));
20
+ }
21
+
22
+ export async function cmdPublish(options: ParsedOptions): Promise<number> {
23
+ await bootstrapFromOptions(options);
24
+ const packages = strList(options, "package");
25
+ const native = loadNiftyNative();
26
+ const report = native.publisher["publish-workspace"]({
27
+ cwd: cwdFrom(options),
28
+ dryRun: flag(options, "dry-run"),
29
+ refresh: flag(options, "refresh"),
30
+ tag: str(options, "tag"),
31
+ access: str(options, "access") ?? "public",
32
+ ...(packages.length === 1 ? { only: packages[0] } : {}),
33
+ ...(packages.length > 1 ? { packages } : {}),
34
+ ...authPayload(authFromOptions(options)),
35
+ });
36
+ printPublishReport(report, flag(options, "dry-run"));
37
+ return 0;
38
+ }