@jsdevtools/npm-publish 1.4.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +161 -147
  2. package/bin/npm-publish.js +10 -2
  3. package/lib/action/core.d.ts +45 -0
  4. package/lib/action/core.js +59 -0
  5. package/lib/action/core.js.map +1 -0
  6. package/lib/action/main.js +54 -0
  7. package/lib/action/main.js.map +1 -0
  8. package/lib/cli/index.d.ts +4 -2
  9. package/lib/cli/index.js +57 -53
  10. package/lib/cli/index.js.map +1 -1
  11. package/lib/cli/parse-cli-arguments.d.ts +17 -0
  12. package/lib/cli/parse-cli-arguments.js +39 -0
  13. package/lib/cli/parse-cli-arguments.js.map +1 -0
  14. package/lib/compare-versions.d.ts +20 -0
  15. package/lib/compare-versions.js +36 -0
  16. package/lib/compare-versions.js.map +1 -0
  17. package/lib/errors.d.ts +36 -0
  18. package/lib/errors.js +114 -0
  19. package/lib/errors.js.map +1 -0
  20. package/lib/format-publish-result.d.ts +12 -0
  21. package/lib/format-publish-result.js +36 -0
  22. package/lib/format-publish-result.js.map +1 -0
  23. package/lib/index.d.ts +4 -5
  24. package/lib/index.js +11 -10
  25. package/lib/index.js.map +1 -1
  26. package/lib/normalize-options.d.ts +26 -1
  27. package/lib/normalize-options.js +86 -13
  28. package/lib/normalize-options.js.map +1 -1
  29. package/lib/npm/call-npm-cli.d.ts +16 -0
  30. package/lib/npm/call-npm-cli.js +91 -0
  31. package/lib/npm/call-npm-cli.js.map +1 -0
  32. package/lib/npm/get-publish-arguments.d.ts +9 -0
  33. package/lib/npm/get-publish-arguments.js +29 -0
  34. package/lib/npm/get-publish-arguments.js.map +1 -0
  35. package/lib/npm/index.d.ts +29 -0
  36. package/lib/npm/index.js +41 -0
  37. package/lib/npm/index.js.map +1 -0
  38. package/lib/npm/use-npm-environment.d.ts +13 -0
  39. package/lib/npm/use-npm-environment.js +42 -0
  40. package/lib/npm/use-npm-environment.js.map +1 -0
  41. package/lib/npm-publish.d.ts +7 -4
  42. package/lib/npm-publish.js +29 -25
  43. package/lib/npm-publish.js.map +1 -1
  44. package/lib/options.d.ts +58 -46
  45. package/lib/options.js +5 -0
  46. package/lib/options.js.map +1 -1
  47. package/lib/read-manifest.d.ts +25 -1
  48. package/lib/read-manifest.js +119 -22
  49. package/lib/read-manifest.js.map +1 -1
  50. package/lib/results.d.ts +26 -28
  51. package/package.json +43 -35
  52. package/src/action/core.ts +91 -0
  53. package/src/action/main.ts +31 -0
  54. package/src/cli/index.ts +69 -0
  55. package/src/cli/parse-cli-arguments.ts +48 -0
  56. package/src/compare-versions.ts +52 -0
  57. package/src/errors.ts +130 -0
  58. package/src/format-publish-result.ts +40 -0
  59. package/src/index.ts +7 -0
  60. package/src/normalize-options.ts +119 -0
  61. package/src/npm/call-npm-cli.ts +98 -0
  62. package/src/npm/get-publish-arguments.ts +34 -0
  63. package/src/npm/index.ts +64 -0
  64. package/src/npm/use-npm-environment.ts +51 -0
  65. package/src/npm-publish.ts +47 -0
  66. package/src/options.ts +96 -0
  67. package/src/read-manifest.ts +143 -0
  68. package/src/results.ts +45 -0
  69. package/CHANGELOG.md +0 -49
  70. package/lib/action/index.js +0 -67
  71. package/lib/action/index.js.map +0 -1
  72. package/lib/cli/exit-code.d.ts +0 -1
  73. package/lib/cli/exit-code.js +0 -16
  74. package/lib/cli/exit-code.js.map +0 -1
  75. package/lib/cli/help.d.ts +0 -1
  76. package/lib/cli/help.js +0 -28
  77. package/lib/cli/help.js.map +0 -1
  78. package/lib/cli/parse-args.d.ts +0 -1
  79. package/lib/cli/parse-args.js +0 -58
  80. package/lib/cli/parse-args.js.map +0 -1
  81. package/lib/npm-config.d.ts +0 -1
  82. package/lib/npm-config.js +0 -85
  83. package/lib/npm-config.js.map +0 -1
  84. package/lib/npm-env.d.ts +0 -6
  85. package/lib/npm-env.js +0 -24
  86. package/lib/npm-env.js.map +0 -1
  87. package/lib/npm.d.ts +0 -1
  88. package/lib/npm.js +0 -95
  89. package/lib/npm.js.map +0 -1
  90. /package/lib/action/{index.d.ts → main.d.ts} +0 -0
@@ -1,24 +1,97 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
2
28
  Object.defineProperty(exports, "__esModule", { value: true });
3
29
  exports.normalizeOptions = void 0;
4
- const url_1 = require("url");
30
+ const node_os_1 = __importDefault(require("node:os"));
31
+ const errors = __importStar(require("./errors.js"));
32
+ const options_js_1 = require("./options.js");
33
+ const DEFAULT_REGISTRY = "https://registry.npmjs.org/";
34
+ const DEFAULT_TAG = "latest";
5
35
  /**
6
36
  * Normalizes and sanitizes options, and fills-in any default values.
7
- * @internal
37
+ *
38
+ * @param options User-input options.
39
+ * @param manifest Package metadata from package.json.
40
+ * @returns Validated auth and publish configuration.
8
41
  */
9
- function normalizeOptions(options) {
10
- let registryURL = typeof options.registry === "string" ? new url_1.URL(options.registry) : options.registry;
42
+ function normalizeOptions(options, manifest) {
43
+ const defaultTag = manifest.publishConfig?.tag ?? DEFAULT_TAG;
44
+ const defaultRegistry = manifest.publishConfig?.registry ?? DEFAULT_REGISTRY;
45
+ const defaultAccess = manifest.publishConfig?.access ??
46
+ (manifest.scope === undefined ? options_js_1.ACCESS_PUBLIC : undefined);
11
47
  return {
12
- token: options.token || "",
13
- registry: registryURL || new url_1.URL("https://registry.npmjs.org/"),
14
- package: options.package || "package.json",
15
- tag: options.tag || "latest",
16
- access: options.access,
17
- dryRun: options.dryRun || false,
18
- checkVersion: options.checkVersion === undefined ? true : Boolean(options.checkVersion),
19
- quiet: options.quiet || false,
20
- debug: options.debug || (() => undefined),
48
+ token: validateToken(options.token),
49
+ registry: validateRegistry(options.registry ?? defaultRegistry),
50
+ tag: setValue(options.tag, defaultTag, validateTag),
51
+ access: setValue(options.access, defaultAccess, validateAccess),
52
+ dryRun: setValue(options.dryRun, false, validateDryRun),
53
+ strategy: setValue(options.strategy, options_js_1.STRATEGY_ALL, validateStrategy),
54
+ logger: options.logger,
55
+ temporaryDirectory: options.temporaryDirectory ?? node_os_1.default.tmpdir(),
21
56
  };
22
57
  }
23
58
  exports.normalizeOptions = normalizeOptions;
59
+ const setValue = (value, defaultValue, validate) => ({
60
+ value: validate(value ?? defaultValue),
61
+ isDefault: value === undefined,
62
+ });
63
+ const validateToken = (value) => {
64
+ if (typeof value === "string" && value.length > 0) {
65
+ return value;
66
+ }
67
+ throw new errors.InvalidTokenError();
68
+ };
69
+ const validateRegistry = (value) => {
70
+ try {
71
+ return new URL(value);
72
+ }
73
+ catch {
74
+ throw new errors.InvalidRegistryUrlError(value);
75
+ }
76
+ };
77
+ const validateTag = (value) => {
78
+ return value;
79
+ };
80
+ const validateDryRun = (value) => {
81
+ return value;
82
+ };
83
+ const validateAccess = (value) => {
84
+ if (value === undefined ||
85
+ value === options_js_1.ACCESS_PUBLIC ||
86
+ value === options_js_1.ACCESS_RESTRICTED) {
87
+ return value;
88
+ }
89
+ throw new errors.InvalidAccessError(value);
90
+ };
91
+ const validateStrategy = (value) => {
92
+ if (value === options_js_1.STRATEGY_ALL || value === options_js_1.STRATEGY_UPGRADE) {
93
+ return value;
94
+ }
95
+ throw new errors.InvalidStrategyError(value);
96
+ };
24
97
  //# sourceMappingURL=normalize-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-options.js","sourceRoot":"","sources":["../src/normalize-options.ts"],"names":[],"mappings":";;;AAAA,6BAA0B;AAmB1B;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,WAAW,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEtG,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,QAAQ,EAAE,WAAW,IAAI,IAAI,SAAG,CAAC,6BAA6B,CAAC;QAC/D,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc;QAC1C,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,QAAQ;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;QACvF,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;QAC7B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KAC1C,CAAC;AACJ,CAAC;AAdD,4CAcC"}
1
+ {"version":3,"file":"normalize-options.js","sourceRoot":"","sources":["../src/normalize-options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Logger } from "../options.js";
2
+ import type { NpmCliEnvironment } from "./use-npm-environment.js";
3
+ export interface NpmCliOptions<TReturn> {
4
+ environment?: NpmCliEnvironment;
5
+ ifError?: Record<string, TReturn>;
6
+ logger?: Logger | undefined;
7
+ }
8
+ /**
9
+ * Call the NPM CLI in JSON mode.
10
+ *
11
+ * @param command The command of the NPM CLI to call
12
+ * @param cliArguments Any arguments to send to the command
13
+ * @param options Customize environment variables or add an error handler.
14
+ * @returns The parsed JSON, or stdout if unparsable.
15
+ */
16
+ export declare function callNpmCli<TReturn = string>(command: string, cliArguments: string[], options?: NpmCliOptions<TReturn>): Promise<TReturn>;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.callNpmCli = void 0;
30
+ const node_child_process_1 = __importDefault(require("node:child_process"));
31
+ const node_os_1 = __importDefault(require("node:os"));
32
+ const errors = __importStar(require("../errors.js"));
33
+ const NPM = node_os_1.default.platform() === "win32" ? "npm.cmd" : "npm";
34
+ const JSON_MATCH_RE = /(\{[\s\S]*\})/mu;
35
+ const execNpm = (commandArguments, environment = {}, logger) => {
36
+ logger?.debug?.(`Running command: ${NPM} ${commandArguments.join(" ")}`);
37
+ return new Promise((resolve) => {
38
+ let stdout = "";
39
+ let stderr = "";
40
+ const npm = node_child_process_1.default.spawn(NPM, commandArguments, {
41
+ env: { ...process.env, ...environment },
42
+ });
43
+ npm.stdout.on("data", (data) => (stdout += data));
44
+ npm.stderr.on("data", (data) => (stderr += data));
45
+ npm.on("close", (code) => {
46
+ resolve({
47
+ stdout: stdout.trim(),
48
+ stderr: stderr.trim(),
49
+ exitCode: code ?? 0,
50
+ });
51
+ });
52
+ });
53
+ };
54
+ const parseJson = (...values) => {
55
+ for (const value of values) {
56
+ const jsonValue = JSON_MATCH_RE.exec(value)?.[1];
57
+ if (jsonValue) {
58
+ try {
59
+ return JSON.parse(jsonValue);
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }
65
+ }
66
+ return undefined;
67
+ };
68
+ /**
69
+ * Call the NPM CLI in JSON mode.
70
+ *
71
+ * @param command The command of the NPM CLI to call
72
+ * @param cliArguments Any arguments to send to the command
73
+ * @param options Customize environment variables or add an error handler.
74
+ * @returns The parsed JSON, or stdout if unparsable.
75
+ */
76
+ async function callNpmCli(command, cliArguments, options = {}) {
77
+ const { stdout, stderr, exitCode } = await execNpm([command, "--ignore-scripts", "--json", ...cliArguments], options.environment, options.logger);
78
+ if (exitCode !== 0) {
79
+ const errorPayload = parseJson(stdout, stderr);
80
+ const errorCode = errorPayload?.error?.code?.toLowerCase();
81
+ if (typeof errorCode === "string" &&
82
+ options.ifError &&
83
+ errorCode in options.ifError) {
84
+ return options.ifError[errorCode];
85
+ }
86
+ throw new errors.NpmCallError(command, exitCode, stderr);
87
+ }
88
+ return parseJson(stdout) ?? stdout;
89
+ }
90
+ exports.callNpmCli = callNpmCli;
91
+ //# sourceMappingURL=call-npm-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-npm-cli.js","sourceRoot":"","sources":["../../src/npm/call-npm-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { NormalizedOptions } from "../normalize-options.js";
2
+ /**
3
+ * Given a publish configuration, get the NPM CLI publish arguments.
4
+ *
5
+ * @param packageSpec Package specification path.
6
+ * @param options Publish configuration.
7
+ * @returns Arguments to pass to the NPM CLI.
8
+ */
9
+ export declare function getPublishArguments(packageSpec: string, options: NormalizedOptions): string[];
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPublishArguments = void 0;
4
+ /**
5
+ * Given a publish configuration, get the NPM CLI publish arguments.
6
+ *
7
+ * @param packageSpec Package specification path.
8
+ * @param options Publish configuration.
9
+ * @returns Arguments to pass to the NPM CLI.
10
+ */
11
+ function getPublishArguments(packageSpec, options) {
12
+ const { tag, access, dryRun } = options;
13
+ const publishArguments = [];
14
+ if (packageSpec.length > 0) {
15
+ publishArguments.push(packageSpec);
16
+ }
17
+ if (!tag.isDefault) {
18
+ publishArguments.push("--tag", tag.value);
19
+ }
20
+ if (!access.isDefault && access.value) {
21
+ publishArguments.push("--access", access.value);
22
+ }
23
+ if (dryRun.value) {
24
+ publishArguments.push("--dry-run");
25
+ }
26
+ return publishArguments;
27
+ }
28
+ exports.getPublishArguments = getPublishArguments;
29
+ //# sourceMappingURL=get-publish-arguments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-publish-arguments.js","sourceRoot":"","sources":["../../src/npm/get-publish-arguments.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,WAAmB,EACnB,OAA0B;IAE1B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,gBAAgB,GAAG,EAAE,CAAC;IAE5B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KACpC;IAED,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;QAClB,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;KAC3C;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE;QACrC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;KACjD;IAED,IAAI,MAAM,CAAC,KAAK,EAAE;QAChB,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KACpC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAxBD,kDAwBC"}
@@ -0,0 +1,29 @@
1
+ import type { NormalizedOptions } from "../normalize-options.js";
2
+ export interface PublishedVersions {
3
+ "dist-tags": Record<string, string>;
4
+ versions: string[];
5
+ }
6
+ export interface PublishFile {
7
+ path: string;
8
+ size: number;
9
+ }
10
+ export interface PublishResult {
11
+ id: string;
12
+ files: PublishFile[];
13
+ }
14
+ /**
15
+ * Get a package's published versions.
16
+ *
17
+ * @param packageName The name of the package to get published versions for.
18
+ * @param options Configuration options.
19
+ * @returns All published versions and tags.
20
+ */
21
+ export declare function getVersions(packageName: string, options: NormalizedOptions): Promise<PublishedVersions>;
22
+ /**
23
+ * Publish a package.
24
+ *
25
+ * @param packageSpec Package specification to pass to npm.
26
+ * @param options Configuration options.
27
+ * @returns Release metadata.
28
+ */
29
+ export declare function publish(packageSpec: string, options: NormalizedOptions): Promise<PublishResult>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.publish = exports.getVersions = void 0;
4
+ const use_npm_environment_js_1 = require("./use-npm-environment.js");
5
+ const call_npm_cli_js_1 = require("./call-npm-cli.js");
6
+ const get_publish_arguments_js_1 = require("./get-publish-arguments.js");
7
+ /**
8
+ * Get a package's published versions.
9
+ *
10
+ * @param packageName The name of the package to get published versions for.
11
+ * @param options Configuration options.
12
+ * @returns All published versions and tags.
13
+ */
14
+ async function getVersions(packageName, options) {
15
+ return (0, use_npm_environment_js_1.useNpmEnvironment)(options, (environment) => {
16
+ return (0, call_npm_cli_js_1.callNpmCli)("view", [packageName, "dist-tags", "versions"], {
17
+ logger: options.logger,
18
+ environment,
19
+ ifError: { e404: { "dist-tags": {}, versions: [] } },
20
+ });
21
+ });
22
+ }
23
+ exports.getVersions = getVersions;
24
+ /**
25
+ * Publish a package.
26
+ *
27
+ * @param packageSpec Package specification to pass to npm.
28
+ * @param options Configuration options.
29
+ * @returns Release metadata.
30
+ */
31
+ async function publish(packageSpec, options) {
32
+ const publishArguments = (0, get_publish_arguments_js_1.getPublishArguments)(packageSpec, options);
33
+ return (0, use_npm_environment_js_1.useNpmEnvironment)(options, (environment) => {
34
+ return (0, call_npm_cli_js_1.callNpmCli)("publish", publishArguments, {
35
+ logger: options.logger,
36
+ environment,
37
+ });
38
+ });
39
+ }
40
+ exports.publish = publish;
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/npm/index.ts"],"names":[],"mappings":";;;AACA,qEAA6D;AAC7D,uDAA+C;AAC/C,yEAAiE;AAiBjE;;;;;;GAMG;AACI,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,OAA0B;IAE1B,OAAO,IAAA,0CAAiB,EAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE;QAChD,OAAO,IAAA,4BAAU,EACf,MAAM,EACN,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,EACtC;YACE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW;YACX,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE;SACrD,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAfD,kCAeC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,OAAO,CAC3B,WAAmB,EACnB,OAA0B;IAE1B,MAAM,gBAAgB,GAAG,IAAA,8CAAmB,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEnE,OAAO,IAAA,0CAAiB,EAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE;QAChD,OAAO,IAAA,4BAAU,EAAgB,SAAS,EAAE,gBAAgB,EAAE;YAC5D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAZD,0BAYC"}
@@ -0,0 +1,13 @@
1
+ import type { NormalizedOptions } from "../normalize-options.js";
2
+ export type NpmCliEnvironment = Record<string, string>;
3
+ export type NpmCliTask<TReturn> = (environment: NpmCliEnvironment) => Promise<TReturn>;
4
+ /**
5
+ * Create a temporary .npmrc file with the given auth token, and call a task
6
+ * with env vars set to use that .npmrc.
7
+ *
8
+ * @param options Configuration options.
9
+ * @param task A function called with the configured environment. After the
10
+ * function resolves, the temporary .npmrc file will be removed.
11
+ * @returns The resolved value of `task`
12
+ */
13
+ export declare function useNpmEnvironment<TReturn>(options: NormalizedOptions, task: NpmCliTask<TReturn>): Promise<TReturn>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useNpmEnvironment = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ /**
11
+ * Create a temporary .npmrc file with the given auth token, and call a task
12
+ * with env vars set to use that .npmrc.
13
+ *
14
+ * @param options Configuration options.
15
+ * @param task A function called with the configured environment. After the
16
+ * function resolves, the temporary .npmrc file will be removed.
17
+ * @returns The resolved value of `task`
18
+ */
19
+ async function useNpmEnvironment(options, task) {
20
+ const { registry, token, logger, temporaryDirectory } = options;
21
+ const npmrcDirectory = await promises_1.default.mkdtemp(node_path_1.default.join(temporaryDirectory, "npm-publish-"));
22
+ const npmrc = node_path_1.default.join(npmrcDirectory, ".npmrc");
23
+ const config = [
24
+ "; created by jsdevtools/npm-publish",
25
+ `//${registry.host}/:_authToken=\${NODE_AUTH_TOKEN}`,
26
+ `registry=${registry.href}`,
27
+ "",
28
+ ].join(node_os_1.default.EOL);
29
+ await promises_1.default.writeFile(npmrc, config, "utf8");
30
+ logger?.debug?.(`Temporary .npmrc created at ${npmrc}\n${config}`);
31
+ try {
32
+ return await task({
33
+ NODE_AUTH_TOKEN: token,
34
+ npm_config_userconfig: npmrc,
35
+ });
36
+ }
37
+ finally {
38
+ await promises_1.default.rm(npmrcDirectory, { force: true, recursive: true });
39
+ }
40
+ }
41
+ exports.useNpmEnvironment = useNpmEnvironment;
42
+ //# sourceMappingURL=use-npm-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-npm-environment.js","sourceRoot":"","sources":["../../src/npm/use-npm-environment.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAkC;AAClC,sDAAyB;AACzB,0DAA6B;AAU7B;;;;;;;;GAQG;AACI,KAAK,UAAU,iBAAiB,CACrC,OAA0B,EAC1B,IAAyB;IAEzB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAChE,MAAM,cAAc,GAAG,MAAM,kBAAE,CAAC,OAAO,CACrC,mBAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAC9C,CAAC;IACF,MAAM,KAAK,GAAG,mBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG;QACb,qCAAqC;QACrC,KAAK,QAAQ,CAAC,IAAI,kCAAkC;QACpD,YAAY,QAAQ,CAAC,IAAI,EAAE;QAC3B,EAAE;KACH,CAAC,IAAI,CAAC,iBAAE,CAAC,GAAG,CAAC,CAAC;IAEf,MAAM,kBAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE1C,MAAM,EAAE,KAAK,EAAE,CAAC,+BAA+B,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC;IAEnE,IAAI;QACF,OAAO,MAAM,IAAI,CAAC;YAChB,eAAe,EAAE,KAAK;YACtB,qBAAqB,EAAE,KAAK;SAC7B,CAAC,CAAC;KACJ;YAAS;QACR,MAAM,kBAAE,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KAC/D;AACH,CAAC;AA7BD,8CA6BC"}
@@ -1,6 +1,9 @@
1
- import { Options } from "./options";
2
- import { Results } from "./results";
1
+ import type { Options } from "./options.js";
2
+ import type { Results } from "./results.js";
3
3
  /**
4
- * Publishes a package to NPM, if its version has changed
4
+ * Publishes a package to NPM, if its version has changed.
5
+ *
6
+ * @param options Publish options.
7
+ * @returns Release metadata.
5
8
  */
6
- export declare function npmPublish(opts?: Options): Promise<Results>;
9
+ export declare function npmPublish(options: Options): Promise<Results>;
@@ -1,35 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.npmPublish = void 0;
4
- const semver = require("semver");
5
- const normalize_options_1 = require("./normalize-options");
6
- const npm_1 = require("./npm");
7
- const read_manifest_1 = require("./read-manifest");
4
+ const read_manifest_js_1 = require("./read-manifest.js");
5
+ const normalize_options_js_1 = require("./normalize-options.js");
6
+ const index_js_1 = require("./npm/index.js");
7
+ const compare_versions_js_1 = require("./compare-versions.js");
8
+ const format_publish_result_js_1 = require("./format-publish-result.js");
8
9
  /**
9
- * Publishes a package to NPM, if its version has changed
10
+ * Publishes a package to NPM, if its version has changed.
11
+ *
12
+ * @param options Publish options.
13
+ * @returns Release metadata.
10
14
  */
11
- async function npmPublish(opts = {}) {
12
- let options = normalize_options_1.normalizeOptions(opts);
13
- // Get the old and new version numbers
14
- let manifest = await read_manifest_1.readManifest(options.package, options.debug);
15
- let publishedVersion = await npm_1.npm.getLatestVersion(manifest.name, options);
16
- // Determine if/how the version has changed
17
- let diff = semver.diff(manifest.version, publishedVersion);
18
- if (diff || !options.checkVersion) {
19
- // Publish the new version to NPM
20
- await npm_1.npm.publish(manifest, options);
15
+ async function npmPublish(options) {
16
+ const { packageSpec, manifest } = await (0, read_manifest_js_1.readManifest)(options.package);
17
+ const normalizedOptions = (0, normalize_options_js_1.normalizeOptions)(options, manifest);
18
+ const publishedVersions = await (0, index_js_1.getVersions)(manifest.name, normalizedOptions);
19
+ const versionComparison = (0, compare_versions_js_1.compareVersions)(manifest.version, publishedVersions, normalizedOptions);
20
+ let publishResult;
21
+ if (versionComparison.type !== undefined) {
22
+ publishResult = await (0, index_js_1.publish)(packageSpec, normalizedOptions);
21
23
  }
22
- let results = {
23
- package: manifest.name,
24
- type: diff || "none",
25
- version: manifest.version.raw,
26
- oldVersion: publishedVersion.raw,
27
- tag: options.tag,
28
- access: options.access || (manifest.name.startsWith("@") ? "restricted" : "public"),
29
- dryRun: options.dryRun
24
+ normalizedOptions.logger?.info?.((0, format_publish_result_js_1.formatPublishResult)(manifest, normalizedOptions, publishResult));
25
+ return {
26
+ id: publishResult?.id,
27
+ name: manifest.name,
28
+ version: manifest.version,
29
+ type: versionComparison.type,
30
+ oldVersion: versionComparison.oldVersion,
31
+ registry: normalizedOptions.registry,
32
+ tag: normalizedOptions.tag.value,
33
+ access: normalizedOptions.access.value,
34
+ strategy: normalizedOptions.strategy.value,
35
+ dryRun: normalizedOptions.dryRun.value,
30
36
  };
31
- options.debug("OUTPUT:", results);
32
- return results;
33
37
  }
34
38
  exports.npmPublish = npmPublish;
35
39
  //# sourceMappingURL=npm-publish.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"npm-publish.js","sourceRoot":"","sources":["../src/npm-publish.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AACjC,2DAAuD;AACvD,+BAA4B;AAE5B,mDAA+C;AAG/C;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,OAAgB,EAAE;IACjD,IAAI,OAAO,GAAG,oCAAgB,CAAC,IAAI,CAAC,CAAC;IAErC,sCAAsC;IACtC,IAAI,QAAQ,GAAG,MAAM,4BAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClE,IAAI,gBAAgB,GAAG,MAAM,SAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1E,2CAA2C;IAC3C,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAE3D,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;QACjC,iCAAiC;QACjC,MAAM,SAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;KACtC;IAED,IAAI,OAAO,GAAY;QACrB,OAAO,EAAE,QAAQ,CAAC,IAAI;QACtB,IAAI,EAAE,IAAI,IAAI,MAAM;QACpB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG;QAC7B,UAAU,EAAE,gBAAgB,CAAC,GAAG;QAChC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnF,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AA3BD,gCA2BC"}
1
+ {"version":3,"file":"npm-publish.js","sourceRoot":"","sources":["../src/npm-publish.ts"],"names":[],"mappings":";;;AAAA,yDAAkD;AAClD,iEAA0D;AAC1D,6CAAsD;AACtD,+DAAwD;AACxD,yEAAiE;AAIjE;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,+BAAY,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,iBAAiB,GAAG,IAAA,uCAAgB,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,MAAM,IAAA,sBAAW,EAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC9E,MAAM,iBAAiB,GAAG,IAAA,qCAAe,EACvC,QAAQ,CAAC,OAAO,EAChB,iBAAiB,EACjB,iBAAiB,CAClB,CAAC;IAEF,IAAI,aAAa,CAAC;IAElB,IAAI,iBAAiB,CAAC,IAAI,KAAK,SAAS,EAAE;QACxC,aAAa,GAAG,MAAM,IAAA,kBAAO,EAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;KAC/D;IAED,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,CAC9B,IAAA,8CAAmB,EAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAChE,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,aAAa,EAAE,EAAE;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,UAAU,EAAE,iBAAiB,CAAC,UAAU;QACxC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;QACpC,GAAG,EAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK;QAChC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK;QACtC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,KAAK;QAC1C,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK;KACvC,CAAC;AACJ,CAAC;AAhCD,gCAgCC"}