@deot/dev-updater 2.9.9 → 2.9.10

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 (3) hide show
  1. package/dist/index.cjs +247 -257
  2. package/dist/index.js +223 -238
  3. package/package.json +5 -5
package/dist/index.cjs CHANGED
@@ -1,265 +1,255 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
-
5
- const devShared = require('@deot/dev-shared');
6
- const path = require('node:path');
7
- const fs = require('fs-extra');
8
- const chalk = require('chalk');
9
- const ora = require('ora');
10
- const semver = require('semver');
11
-
12
- function _interopNamespaceDefault(e) {
13
- const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
14
- if (e) {
15
- for (const k in e) {
16
- if (k !== 'default') {
17
- const d = Object.getOwnPropertyDescriptor(e, k);
18
- Object.defineProperty(n, k, d.get ? d : {
19
- enumerable: true,
20
- get: () => e[k]
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region \0rolldown/runtime.js
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ let _deot_dev_shared = require("@deot/dev-shared");
25
+ let node_path = require("node:path");
26
+ node_path = __toESM(node_path);
27
+ let fs_extra = require("fs-extra");
28
+ fs_extra = __toESM(fs_extra);
29
+ let chalk = require("chalk");
30
+ chalk = __toESM(chalk);
31
+ let ora = require("ora");
32
+ ora = __toESM(ora);
33
+ let semver = require("semver");
34
+ semver = __toESM(semver);
35
+ //#region packages/updater/src/fit-version.ts
36
+ var fitVersion = (versions, version, commandOptions) => {
37
+ const vRegex = /([\d]+\.[\d]+\..*)/;
38
+ if (!vRegex.test(version)) return version;
39
+ const { major = false, minor = false, patch = false } = commandOptions || {};
40
+ const originalPrefix = (version.match(/([^\d]*).*/) || ["", ""])[1];
41
+ const prefix = major ? ">=" : minor ? "^" : patch ? "~" : originalPrefix;
42
+ const oldVersion = version.match(vRegex)[1];
43
+ const vailds = versions.slice(versions.indexOf(oldVersion) + 1);
44
+ return `${originalPrefix}${semver.default.maxSatisfying(vailds, prefix + oldVersion) || oldVersion}`;
45
+ };
46
+ //#endregion
47
+ //#region packages/updater/src/update.ts
48
+ var Update = class {
49
+ packageOptionsMap;
50
+ commandOptions;
51
+ constructor(commandOptions) {
52
+ const locals = _deot_dev_shared.Locals.impl();
53
+ const { rootPackageOptions, packageDir, cwd } = locals;
54
+ this.packageOptionsMap = {
55
+ [cwd]: rootPackageOptions,
56
+ ...Object.keys(locals.packageOptionsMap).reduce((result, key) => {
57
+ result[node_path.resolve(packageDir, key)] = locals.packageOptionsMap[key];
58
+ return result;
59
+ }, {})
60
+ };
61
+ this.commandOptions = commandOptions;
62
+ }
63
+ async getPackageChanged() {
64
+ const { packageOptionsMap, commandOptions } = this;
65
+ const packageNames = {};
66
+ Object.keys(packageOptionsMap).forEach((key) => {
67
+ const { dependencies = {}, devDependencies = {} } = packageOptionsMap[key];
68
+ const deps = {
69
+ ...dependencies,
70
+ ...devDependencies
71
+ };
72
+ Object.keys(deps).forEach((packageName) => {
73
+ const version = deps[packageName];
74
+ packageNames[packageName] = packageNames[packageName] || {};
75
+ if (typeof packageNames[packageName][version] !== "string") packageNames[packageName][version] = "";
76
+ });
77
+ });
78
+ await Promise.all(Object.keys(packageNames).map((packageName) => {
79
+ return new Promise(async (resolve) => {
80
+ try {
81
+ const { stdout: stdout1 } = await _deot_dev_shared.Shell.exec("npm", [
82
+ "view",
83
+ packageName,
84
+ "versions",
85
+ "--json"
86
+ ]);
87
+ const { stdout: stdout2 } = await _deot_dev_shared.Shell.exec("npm", [
88
+ "view",
89
+ packageName,
90
+ "version",
91
+ "--json"
92
+ ]);
93
+ const versions = JSON.parse(stdout1);
94
+ const lastVersion = JSON.parse(stdout2);
95
+ const lastIndex = versions.indexOf(lastVersion);
96
+ const versions$ = versions.slice(0, lastIndex == -1 ? versions.length : lastIndex + 1);
97
+ Object.keys(packageNames[packageName]).forEach((version) => {
98
+ const newVersion = fitVersion(versions$, version, commandOptions);
99
+ if (newVersion === version) delete packageNames[packageName][version];
100
+ else packageNames[packageName][version] = newVersion;
101
+ });
102
+ if (!Object.keys(packageNames[packageName]).length) delete packageNames[packageName];
103
+ resolve();
104
+ } catch (e) {
105
+ delete packageNames[packageName];
106
+ resolve();
107
+ }
108
+ });
109
+ }));
110
+ return packageNames;
111
+ }
112
+ async updatePackageOptions(changed) {
113
+ const { packageOptionsMap, commandOptions } = this;
114
+ const packageFolderNames = [];
115
+ Object.keys(packageOptionsMap).forEach((packageDir) => {
116
+ const packageOptions = packageOptionsMap[packageDir];
117
+ const { devDependencies = {}, dependencies = {} } = packageOptions;
118
+ let isChanged = false;
119
+ [devDependencies, dependencies].forEach((target) => {
120
+ Object.keys(target).forEach((packageName) => {
121
+ const version = target[packageName];
122
+ if (changed[packageName]?.[version]) {
123
+ isChanged = true;
124
+ target[packageName] = changed[packageName][version];
125
+ }
21
126
  });
127
+ });
128
+ if (isChanged) {
129
+ const { cwd } = _deot_dev_shared.Locals.impl();
130
+ if (packageDir !== cwd) packageFolderNames.push(packageDir.split("/").pop());
131
+ if (commandOptions.dryRun) _deot_dev_shared.Logger.log(chalk.default.magenta(`CHANGED: `) + chalk.default.yellow(`Skipping ${node_path.relative(cwd, packageDir)} Update`));
132
+ else {
133
+ fs_extra.default.removeSync(`${packageDir}/node_modules`);
134
+ fs_extra.default.outputFileSync(`${packageDir}/package.json`, JSON.stringify(packageOptions, null, 2));
135
+ }
22
136
  }
137
+ });
138
+ return packageFolderNames;
139
+ }
140
+ async updateLock(message) {
141
+ if (this.commandOptions.dryRun) _deot_dev_shared.Logger.log(chalk.default.yellow(`Skipping pnpm-lock.yaml Update`));
142
+ else {
143
+ _deot_dev_shared.Logger.log(chalk.default.magenta(`CHANGED: `) + `pnpm-lock.yaml`);
144
+ const { cwd } = _deot_dev_shared.Locals.impl();
145
+ await fs_extra.default.remove(`${cwd}/node_modules`);
146
+ await _deot_dev_shared.Shell.spawn("npx", [
147
+ "pnpm",
148
+ "install",
149
+ "--no-frozen-lockfile"
150
+ ]);
151
+ if (message.includes("puppeteer")) await _deot_dev_shared.Shell.spawn("node", ["node_modules/puppeteer/install.mjs"]);
152
+ }
153
+ }
154
+ async commit(message) {
155
+ const { commit, dryRun } = this.commandOptions;
156
+ if (!commit) _deot_dev_shared.Logger.log(chalk.default.magenta(`COMMIT: `) + "Disabled.");
157
+ else if (dryRun) _deot_dev_shared.Logger.log(chalk.default.magenta(`COMMIT: `) + chalk.default.yellow(`Skipping Git Commit`) + `\n${message}`);
158
+ else {
159
+ _deot_dev_shared.Logger.log(chalk.default.magenta(`COMMIT: `) + `package.json, pnpm-lock.yaml`);
160
+ await _deot_dev_shared.Shell.spawn("git", ["add", process.cwd()]);
161
+ await _deot_dev_shared.Shell.spawn("git", [
162
+ "commit",
163
+ "--m",
164
+ `'${message}'`
165
+ ]);
166
+ }
167
+ }
168
+ async push() {
169
+ const { push, dryRun } = this.commandOptions;
170
+ if (!push) _deot_dev_shared.Logger.log(chalk.default.magenta(`PUSH: `) + "Disabled.");
171
+ else if (dryRun) _deot_dev_shared.Logger.log(chalk.default.magenta(`PUSH: `) + chalk.default.yellow(`Skipping Git PUSH`));
172
+ else {
173
+ _deot_dev_shared.Logger.log(chalk.default.yellow("Git Fetch..."));
174
+ await _deot_dev_shared.Shell.spawn("git", [
175
+ "fetch",
176
+ "--prune",
177
+ "--prune-tags"
178
+ ]);
179
+ await _deot_dev_shared.Shell.spawn("git", ["pull", "--rebase"]);
180
+ await _deot_dev_shared.Shell.spawn("git", ["push"]);
181
+ }
182
+ }
183
+ async test() {
184
+ const { test, dryRun } = this.commandOptions;
185
+ if (!test) _deot_dev_shared.Logger.log(chalk.default.magenta(`Test: `) + "Disabled.");
186
+ else if (dryRun) {
187
+ _deot_dev_shared.Logger.log(chalk.default.yellow("Skipping Test"));
188
+ return;
189
+ } else _deot_dev_shared.Logger.log(chalk.default.yellow("Test..."));
190
+ const { rootPackageOptions } = _deot_dev_shared.Locals.impl();
191
+ if (rootPackageOptions?.scripts?.test) await _deot_dev_shared.Shell.exec(`npm run test -- --package-name '*'`);
192
+ }
193
+ async process() {
194
+ const spinner = (0, ora.default)(`Analyze ...`);
195
+ spinner.start();
196
+ const changed = await this.getPackageChanged();
197
+ spinner.stop();
198
+ let message = `deps updated \n\n`;
199
+ const keys = Object.keys(changed);
200
+ if (!keys.length) {
201
+ _deot_dev_shared.Logger.log(chalk.default.red(`No Package Update Found.`));
202
+ return;
203
+ }
204
+ _deot_dev_shared.Logger.log(chalk.default.magenta(`ANALYZE: `));
205
+ keys.forEach((key) => {
206
+ Object.keys(changed[key]).forEach((version) => {
207
+ message += `${key}: ${version} -> ${changed[key][version]}\n`;
208
+ _deot_dev_shared.Logger.log(`${chalk.default.cyan(key)}: ${chalk.default.yellow(version)} -> ${chalk.default.green(changed[key][version])}`);
209
+ });
210
+ });
211
+ const { all, changeLog } = this.commandOptions;
212
+ let packageFolderNames = await this.updatePackageOptions(changed);
213
+ const hasChanged = packageFolderNames.length;
214
+ packageFolderNames = hasChanged && all ? ["*"] : packageFolderNames;
215
+ if (changeLog) message = `chore${hasChanged ? "(" : ""}${packageFolderNames.join(",")}${hasChanged ? ")" : ""}: ${message}`;
216
+ else {
217
+ const { workspace } = _deot_dev_shared.Locals.impl();
218
+ message = `${workspace ? "chore" : "void"}: ${message}`;
23
219
  }
220
+ await this.updateLock(message);
221
+ await this.test();
222
+ await this.commit(message);
223
+ await this.push();
224
+ _deot_dev_shared.Logger.log(chalk.default.magenta(`FINISH: `) + chalk.default.green(`Update Successed.`));
225
+ if (this.commandOptions.dryRun) _deot_dev_shared.Logger.log(chalk.default.green("NO DRY RUN WAY: ") + chalk.default.grey(`npm run update -- --no-dry-run\n`));
24
226
  }
25
- n.default = e;
26
- return Object.freeze(n);
27
- }
28
-
29
- const path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
30
-
31
- const fitVersion = (versions, version, commandOptions) => {
32
- const vRegex = /([\d]+\.[\d]+\..*)/;
33
- if (!vRegex.test(version)) return version;
34
- const { major = false, minor = false, patch = false } = commandOptions || {};
35
- const originalPrefix = (version.match(/([^\d]*).*/) || ["", ""])[1];
36
- const prefix = major ? ">=" : minor ? "^" : patch ? "~" : originalPrefix;
37
- const oldVersion = version.match(vRegex)[1];
38
- const vailds = versions.slice(versions.indexOf(oldVersion) + 1);
39
- const newVersion = semver.maxSatisfying(vailds, prefix + oldVersion) || oldVersion;
40
- return `${originalPrefix}${newVersion}`;
41
227
  };
42
-
43
- class Update {
44
- packageOptionsMap;
45
- commandOptions;
46
- constructor(commandOptions) {
47
- const locals = devShared.Locals.impl();
48
- const { rootPackageOptions, packageDir, cwd } = locals;
49
- const packageOptionsMap = {
50
- [cwd]: rootPackageOptions,
51
- ...Object.keys(locals.packageOptionsMap).reduce((result, key) => {
52
- result[path__namespace.resolve(packageDir, key)] = locals.packageOptionsMap[key];
53
- return result;
54
- }, {})
55
- };
56
- this.packageOptionsMap = packageOptionsMap;
57
- this.commandOptions = commandOptions;
58
- }
59
- async getPackageChanged() {
60
- const { packageOptionsMap, commandOptions } = this;
61
- const packageNames = {};
62
- Object.keys(packageOptionsMap).forEach((key) => {
63
- const { dependencies = {}, devDependencies = {} } = packageOptionsMap[key];
64
- const deps = { ...dependencies, ...devDependencies };
65
- Object.keys(deps).forEach((packageName) => {
66
- const version = deps[packageName];
67
- packageNames[packageName] = packageNames[packageName] || {};
68
- if (typeof packageNames[packageName][version] !== "string") {
69
- packageNames[packageName][version] = "";
70
- }
71
- });
72
- });
73
- await Promise.all(Object.keys(packageNames).map((packageName) => {
74
- return new Promise(async (resolve) => {
75
- try {
76
- const { stdout: stdout1 } = await devShared.Shell.exec("npm", ["view", packageName, "versions", "--json"]);
77
- const { stdout: stdout2 } = await devShared.Shell.exec("npm", ["view", packageName, "version", "--json"]);
78
- const versions = JSON.parse(stdout1);
79
- const lastVersion = JSON.parse(stdout2);
80
- const lastIndex = versions.indexOf(lastVersion);
81
- const versions$ = versions.slice(0, lastIndex == -1 ? versions.length : lastIndex + 1);
82
- Object.keys(packageNames[packageName]).forEach((version) => {
83
- const newVersion = fitVersion(versions$, version, commandOptions);
84
- if (newVersion === version) {
85
- delete packageNames[packageName][version];
86
- } else {
87
- packageNames[packageName][version] = newVersion;
88
- }
89
- });
90
- if (!Object.keys(packageNames[packageName]).length) {
91
- delete packageNames[packageName];
92
- }
93
- resolve();
94
- } catch (e) {
95
- delete packageNames[packageName];
96
- resolve();
97
- }
98
- });
99
- }));
100
- return packageNames;
101
- }
102
- async updatePackageOptions(changed) {
103
- const { packageOptionsMap, commandOptions } = this;
104
- const packageFolderNames = [];
105
- Object.keys(packageOptionsMap).forEach((packageDir) => {
106
- const packageOptions = packageOptionsMap[packageDir];
107
- const { devDependencies = {}, dependencies = {} } = packageOptions;
108
- let isChanged = false;
109
- [devDependencies, dependencies].forEach((target) => {
110
- Object.keys(target).forEach((packageName) => {
111
- const version = target[packageName];
112
- if (changed[packageName]?.[version]) {
113
- isChanged = true;
114
- target[packageName] = changed[packageName][version];
115
- }
116
- });
117
- });
118
- if (isChanged) {
119
- const locals = devShared.Locals.impl();
120
- const { cwd } = locals;
121
- if (packageDir !== cwd) {
122
- packageFolderNames.push(packageDir.split("/").pop());
123
- }
124
- if (commandOptions.dryRun) {
125
- devShared.Logger.log(chalk.magenta(`CHANGED: `) + chalk.yellow(`Skipping ${path__namespace.relative(cwd, packageDir)} Update`));
126
- } else {
127
- fs.removeSync(`${packageDir}/node_modules`);
128
- fs.outputFileSync(`${packageDir}/package.json`, JSON.stringify(packageOptions, null, 2));
129
- }
130
- }
131
- });
132
- return packageFolderNames;
133
- }
134
- async updateLock(message) {
135
- if (this.commandOptions.dryRun) {
136
- devShared.Logger.log(chalk.yellow(`Skipping pnpm-lock.yaml Update`));
137
- } else {
138
- devShared.Logger.log(chalk.magenta(`CHANGED: `) + `pnpm-lock.yaml`);
139
- const locals = devShared.Locals.impl();
140
- const { cwd } = locals;
141
- await fs.remove(`${cwd}/node_modules`);
142
- await devShared.Shell.spawn("npx", ["pnpm", "install", "--no-frozen-lockfile"]);
143
- if (message.includes("puppeteer")) {
144
- await devShared.Shell.spawn("node", ["node_modules/puppeteer/install.mjs"]);
145
- }
146
- }
147
- }
148
- async commit(message) {
149
- const { commit, dryRun } = this.commandOptions;
150
- if (!commit) {
151
- devShared.Logger.log(chalk.magenta(`COMMIT: `) + "Disabled.");
152
- } else if (dryRun) {
153
- devShared.Logger.log(chalk.magenta(`COMMIT: `) + chalk.yellow(`Skipping Git Commit`) + `
154
- ${message}`);
155
- } else {
156
- devShared.Logger.log(chalk.magenta(`COMMIT: `) + `package.json, pnpm-lock.yaml`);
157
- await devShared.Shell.spawn("git", ["add", process.cwd()]);
158
- await devShared.Shell.spawn("git", ["commit", "--m", `'${message}'`]);
159
- }
160
- }
161
- async push() {
162
- const { push, dryRun } = this.commandOptions;
163
- if (!push) {
164
- devShared.Logger.log(chalk.magenta(`PUSH: `) + "Disabled.");
165
- } else if (dryRun) {
166
- devShared.Logger.log(chalk.magenta(`PUSH: `) + chalk.yellow(`Skipping Git PUSH`));
167
- } else {
168
- devShared.Logger.log(chalk.yellow("Git Fetch..."));
169
- await devShared.Shell.spawn("git", ["fetch", "--prune", "--prune-tags"]);
170
- await devShared.Shell.spawn("git", ["pull", "--rebase"]);
171
- await devShared.Shell.spawn("git", ["push"]);
172
- }
173
- }
174
- async test() {
175
- const { test, dryRun } = this.commandOptions;
176
- if (!test) {
177
- devShared.Logger.log(chalk.magenta(`Test: `) + "Disabled.");
178
- } else if (dryRun) {
179
- devShared.Logger.log(chalk.yellow("Skipping Test"));
180
- return;
181
- } else {
182
- devShared.Logger.log(chalk.yellow("Test..."));
183
- }
184
- const { rootPackageOptions } = devShared.Locals.impl();
185
- if (rootPackageOptions?.scripts?.test) {
186
- await devShared.Shell.exec(`npm run test -- --package-name '*'`);
187
- }
188
- }
189
- async process() {
190
- const spinner = ora(`Analyze ...`);
191
- spinner.start();
192
- const changed = await this.getPackageChanged();
193
- spinner.stop();
194
- let message = `deps updated
195
-
196
- `;
197
- const keys = Object.keys(changed);
198
- if (!keys.length) {
199
- devShared.Logger.log(chalk.red(`No Package Update Found.`));
200
- return;
201
- }
202
- devShared.Logger.log(chalk.magenta(`ANALYZE: `));
203
- keys.forEach((key) => {
204
- Object.keys(changed[key]).forEach((version) => {
205
- message += `${key}: ${version} -> ${changed[key][version]}
206
- `;
207
- devShared.Logger.log(`${chalk.cyan(key)}: ${chalk.yellow(version)} -> ${chalk.green(changed[key][version])}`);
208
- });
209
- });
210
- const { all, changeLog } = this.commandOptions;
211
- let packageFolderNames = await this.updatePackageOptions(changed);
212
- const hasChanged = packageFolderNames.length;
213
- packageFolderNames = hasChanged && all ? ["*"] : packageFolderNames;
214
- if (changeLog) {
215
- message = `chore${hasChanged ? "(" : ""}${packageFolderNames.join(",")}${hasChanged ? ")" : ""}: ${message}`;
216
- } else {
217
- const locals = devShared.Locals.impl();
218
- const { workspace } = locals;
219
- message = `${workspace ? "chore" : "void"}: ${message}`;
220
- }
221
- await this.updateLock(message);
222
- await this.test();
223
- await this.commit(message);
224
- await this.push();
225
- devShared.Logger.log(chalk.magenta(`FINISH: `) + chalk.green(`Update Successed.`));
226
- if (this.commandOptions.dryRun) {
227
- devShared.Logger.log(
228
- chalk.green("NO DRY RUN WAY: ") + chalk.grey(`npm run update -- --no-dry-run
229
- `)
230
- );
231
- }
232
- }
233
- }
234
- const update = (commandOptions) => {
235
- return new Update(commandOptions);
228
+ var update = (commandOptions) => {
229
+ return new Update(commandOptions);
236
230
  };
237
-
231
+ //#endregion
232
+ //#region packages/updater/src/index.ts
238
233
  process.setMaxListeners(100);
239
- const run = (options) => devShared.Utils.autoCatch(async () => {
240
- options = {
241
- dryRun: true,
242
- commit: true,
243
- push: true,
244
- test: true,
245
- changeLog: true,
246
- major: false,
247
- minor: false,
248
- patch: false,
249
- all: false,
250
- ...options
251
- };
252
- if (process.env.NODE_ENV === "UNIT") return devShared.Shell.spawn(`echo update`);
253
- await update(options).process();
254
- }, {
255
- onError: (e) => {
256
- if (typeof e === "number" && e === 1) {
257
- devShared.Logger.error("更新失败");
258
- } else {
259
- devShared.Logger.error(e);
260
- }
261
- process.exit(1);
262
- }
263
- });
264
-
234
+ var run = (options) => _deot_dev_shared.Utils.autoCatch(async () => {
235
+ options = {
236
+ dryRun: true,
237
+ commit: true,
238
+ push: true,
239
+ test: true,
240
+ changeLog: true,
241
+ major: false,
242
+ minor: false,
243
+ patch: false,
244
+ all: false,
245
+ ...options
246
+ };
247
+ if (process.env.NODE_ENV === "UNIT") return _deot_dev_shared.Shell.spawn(`echo update`);
248
+ await update(options).process();
249
+ }, { onError: (e) => {
250
+ if (typeof e === "number" && e === 1) _deot_dev_shared.Logger.error("更新失败");
251
+ else _deot_dev_shared.Logger.error(e);
252
+ process.exit(1);
253
+ } });
254
+ //#endregion
265
255
  exports.run = run;
package/dist/index.js CHANGED
@@ -1,242 +1,227 @@
1
- import { Locals, Shell, Logger, Utils } from '@deot/dev-shared';
2
- import * as path from 'node:path';
3
- import fs from 'fs-extra';
4
- import chalk from 'chalk';
5
- import ora from 'ora';
6
- import semver from 'semver';
7
-
8
- const fitVersion = (versions, version, commandOptions) => {
9
- const vRegex = /([\d]+\.[\d]+\..*)/;
10
- if (!vRegex.test(version)) return version;
11
- const { major = false, minor = false, patch = false } = commandOptions || {};
12
- const originalPrefix = (version.match(/([^\d]*).*/) || ["", ""])[1];
13
- const prefix = major ? ">=" : minor ? "^" : patch ? "~" : originalPrefix;
14
- const oldVersion = version.match(vRegex)[1];
15
- const vailds = versions.slice(versions.indexOf(oldVersion) + 1);
16
- const newVersion = semver.maxSatisfying(vailds, prefix + oldVersion) || oldVersion;
17
- return `${originalPrefix}${newVersion}`;
1
+ import { Locals, Logger, Shell, Utils } from "@deot/dev-shared";
2
+ import * as path from "node:path";
3
+ import fs from "fs-extra";
4
+ import chalk from "chalk";
5
+ import ora from "ora";
6
+ import semver from "semver";
7
+ //#region packages/updater/src/fit-version.ts
8
+ var fitVersion = (versions, version, commandOptions) => {
9
+ const vRegex = /([\d]+\.[\d]+\..*)/;
10
+ if (!vRegex.test(version)) return version;
11
+ const { major = false, minor = false, patch = false } = commandOptions || {};
12
+ const originalPrefix = (version.match(/([^\d]*).*/) || ["", ""])[1];
13
+ const prefix = major ? ">=" : minor ? "^" : patch ? "~" : originalPrefix;
14
+ const oldVersion = version.match(vRegex)[1];
15
+ const vailds = versions.slice(versions.indexOf(oldVersion) + 1);
16
+ return `${originalPrefix}${semver.maxSatisfying(vailds, prefix + oldVersion) || oldVersion}`;
18
17
  };
19
-
20
- class Update {
21
- packageOptionsMap;
22
- commandOptions;
23
- constructor(commandOptions) {
24
- const locals = Locals.impl();
25
- const { rootPackageOptions, packageDir, cwd } = locals;
26
- const packageOptionsMap = {
27
- [cwd]: rootPackageOptions,
28
- ...Object.keys(locals.packageOptionsMap).reduce((result, key) => {
29
- result[path.resolve(packageDir, key)] = locals.packageOptionsMap[key];
30
- return result;
31
- }, {})
32
- };
33
- this.packageOptionsMap = packageOptionsMap;
34
- this.commandOptions = commandOptions;
35
- }
36
- async getPackageChanged() {
37
- const { packageOptionsMap, commandOptions } = this;
38
- const packageNames = {};
39
- Object.keys(packageOptionsMap).forEach((key) => {
40
- const { dependencies = {}, devDependencies = {} } = packageOptionsMap[key];
41
- const deps = { ...dependencies, ...devDependencies };
42
- Object.keys(deps).forEach((packageName) => {
43
- const version = deps[packageName];
44
- packageNames[packageName] = packageNames[packageName] || {};
45
- if (typeof packageNames[packageName][version] !== "string") {
46
- packageNames[packageName][version] = "";
47
- }
48
- });
49
- });
50
- await Promise.all(Object.keys(packageNames).map((packageName) => {
51
- return new Promise(async (resolve) => {
52
- try {
53
- const { stdout: stdout1 } = await Shell.exec("npm", ["view", packageName, "versions", "--json"]);
54
- const { stdout: stdout2 } = await Shell.exec("npm", ["view", packageName, "version", "--json"]);
55
- const versions = JSON.parse(stdout1);
56
- const lastVersion = JSON.parse(stdout2);
57
- const lastIndex = versions.indexOf(lastVersion);
58
- const versions$ = versions.slice(0, lastIndex == -1 ? versions.length : lastIndex + 1);
59
- Object.keys(packageNames[packageName]).forEach((version) => {
60
- const newVersion = fitVersion(versions$, version, commandOptions);
61
- if (newVersion === version) {
62
- delete packageNames[packageName][version];
63
- } else {
64
- packageNames[packageName][version] = newVersion;
65
- }
66
- });
67
- if (!Object.keys(packageNames[packageName]).length) {
68
- delete packageNames[packageName];
69
- }
70
- resolve();
71
- } catch (e) {
72
- delete packageNames[packageName];
73
- resolve();
74
- }
75
- });
76
- }));
77
- return packageNames;
78
- }
79
- async updatePackageOptions(changed) {
80
- const { packageOptionsMap, commandOptions } = this;
81
- const packageFolderNames = [];
82
- Object.keys(packageOptionsMap).forEach((packageDir) => {
83
- const packageOptions = packageOptionsMap[packageDir];
84
- const { devDependencies = {}, dependencies = {} } = packageOptions;
85
- let isChanged = false;
86
- [devDependencies, dependencies].forEach((target) => {
87
- Object.keys(target).forEach((packageName) => {
88
- const version = target[packageName];
89
- if (changed[packageName]?.[version]) {
90
- isChanged = true;
91
- target[packageName] = changed[packageName][version];
92
- }
93
- });
94
- });
95
- if (isChanged) {
96
- const locals = Locals.impl();
97
- const { cwd } = locals;
98
- if (packageDir !== cwd) {
99
- packageFolderNames.push(packageDir.split("/").pop());
100
- }
101
- if (commandOptions.dryRun) {
102
- Logger.log(chalk.magenta(`CHANGED: `) + chalk.yellow(`Skipping ${path.relative(cwd, packageDir)} Update`));
103
- } else {
104
- fs.removeSync(`${packageDir}/node_modules`);
105
- fs.outputFileSync(`${packageDir}/package.json`, JSON.stringify(packageOptions, null, 2));
106
- }
107
- }
108
- });
109
- return packageFolderNames;
110
- }
111
- async updateLock(message) {
112
- if (this.commandOptions.dryRun) {
113
- Logger.log(chalk.yellow(`Skipping pnpm-lock.yaml Update`));
114
- } else {
115
- Logger.log(chalk.magenta(`CHANGED: `) + `pnpm-lock.yaml`);
116
- const locals = Locals.impl();
117
- const { cwd } = locals;
118
- await fs.remove(`${cwd}/node_modules`);
119
- await Shell.spawn("npx", ["pnpm", "install", "--no-frozen-lockfile"]);
120
- if (message.includes("puppeteer")) {
121
- await Shell.spawn("node", ["node_modules/puppeteer/install.mjs"]);
122
- }
123
- }
124
- }
125
- async commit(message) {
126
- const { commit, dryRun } = this.commandOptions;
127
- if (!commit) {
128
- Logger.log(chalk.magenta(`COMMIT: `) + "Disabled.");
129
- } else if (dryRun) {
130
- Logger.log(chalk.magenta(`COMMIT: `) + chalk.yellow(`Skipping Git Commit`) + `
131
- ${message}`);
132
- } else {
133
- Logger.log(chalk.magenta(`COMMIT: `) + `package.json, pnpm-lock.yaml`);
134
- await Shell.spawn("git", ["add", process.cwd()]);
135
- await Shell.spawn("git", ["commit", "--m", `'${message}'`]);
136
- }
137
- }
138
- async push() {
139
- const { push, dryRun } = this.commandOptions;
140
- if (!push) {
141
- Logger.log(chalk.magenta(`PUSH: `) + "Disabled.");
142
- } else if (dryRun) {
143
- Logger.log(chalk.magenta(`PUSH: `) + chalk.yellow(`Skipping Git PUSH`));
144
- } else {
145
- Logger.log(chalk.yellow("Git Fetch..."));
146
- await Shell.spawn("git", ["fetch", "--prune", "--prune-tags"]);
147
- await Shell.spawn("git", ["pull", "--rebase"]);
148
- await Shell.spawn("git", ["push"]);
149
- }
150
- }
151
- async test() {
152
- const { test, dryRun } = this.commandOptions;
153
- if (!test) {
154
- Logger.log(chalk.magenta(`Test: `) + "Disabled.");
155
- } else if (dryRun) {
156
- Logger.log(chalk.yellow("Skipping Test"));
157
- return;
158
- } else {
159
- Logger.log(chalk.yellow("Test..."));
160
- }
161
- const { rootPackageOptions } = Locals.impl();
162
- if (rootPackageOptions?.scripts?.test) {
163
- await Shell.exec(`npm run test -- --package-name '*'`);
164
- }
165
- }
166
- async process() {
167
- const spinner = ora(`Analyze ...`);
168
- spinner.start();
169
- const changed = await this.getPackageChanged();
170
- spinner.stop();
171
- let message = `deps updated
172
-
173
- `;
174
- const keys = Object.keys(changed);
175
- if (!keys.length) {
176
- Logger.log(chalk.red(`No Package Update Found.`));
177
- return;
178
- }
179
- Logger.log(chalk.magenta(`ANALYZE: `));
180
- keys.forEach((key) => {
181
- Object.keys(changed[key]).forEach((version) => {
182
- message += `${key}: ${version} -> ${changed[key][version]}
183
- `;
184
- Logger.log(`${chalk.cyan(key)}: ${chalk.yellow(version)} -> ${chalk.green(changed[key][version])}`);
185
- });
186
- });
187
- const { all, changeLog } = this.commandOptions;
188
- let packageFolderNames = await this.updatePackageOptions(changed);
189
- const hasChanged = packageFolderNames.length;
190
- packageFolderNames = hasChanged && all ? ["*"] : packageFolderNames;
191
- if (changeLog) {
192
- message = `chore${hasChanged ? "(" : ""}${packageFolderNames.join(",")}${hasChanged ? ")" : ""}: ${message}`;
193
- } else {
194
- const locals = Locals.impl();
195
- const { workspace } = locals;
196
- message = `${workspace ? "chore" : "void"}: ${message}`;
197
- }
198
- await this.updateLock(message);
199
- await this.test();
200
- await this.commit(message);
201
- await this.push();
202
- Logger.log(chalk.magenta(`FINISH: `) + chalk.green(`Update Successed.`));
203
- if (this.commandOptions.dryRun) {
204
- Logger.log(
205
- chalk.green("NO DRY RUN WAY: ") + chalk.grey(`npm run update -- --no-dry-run
206
- `)
207
- );
208
- }
209
- }
210
- }
211
- const update = (commandOptions) => {
212
- return new Update(commandOptions);
18
+ //#endregion
19
+ //#region packages/updater/src/update.ts
20
+ var Update = class {
21
+ packageOptionsMap;
22
+ commandOptions;
23
+ constructor(commandOptions) {
24
+ const locals = Locals.impl();
25
+ const { rootPackageOptions, packageDir, cwd } = locals;
26
+ this.packageOptionsMap = {
27
+ [cwd]: rootPackageOptions,
28
+ ...Object.keys(locals.packageOptionsMap).reduce((result, key) => {
29
+ result[path.resolve(packageDir, key)] = locals.packageOptionsMap[key];
30
+ return result;
31
+ }, {})
32
+ };
33
+ this.commandOptions = commandOptions;
34
+ }
35
+ async getPackageChanged() {
36
+ const { packageOptionsMap, commandOptions } = this;
37
+ const packageNames = {};
38
+ Object.keys(packageOptionsMap).forEach((key) => {
39
+ const { dependencies = {}, devDependencies = {} } = packageOptionsMap[key];
40
+ const deps = {
41
+ ...dependencies,
42
+ ...devDependencies
43
+ };
44
+ Object.keys(deps).forEach((packageName) => {
45
+ const version = deps[packageName];
46
+ packageNames[packageName] = packageNames[packageName] || {};
47
+ if (typeof packageNames[packageName][version] !== "string") packageNames[packageName][version] = "";
48
+ });
49
+ });
50
+ await Promise.all(Object.keys(packageNames).map((packageName) => {
51
+ return new Promise(async (resolve) => {
52
+ try {
53
+ const { stdout: stdout1 } = await Shell.exec("npm", [
54
+ "view",
55
+ packageName,
56
+ "versions",
57
+ "--json"
58
+ ]);
59
+ const { stdout: stdout2 } = await Shell.exec("npm", [
60
+ "view",
61
+ packageName,
62
+ "version",
63
+ "--json"
64
+ ]);
65
+ const versions = JSON.parse(stdout1);
66
+ const lastVersion = JSON.parse(stdout2);
67
+ const lastIndex = versions.indexOf(lastVersion);
68
+ const versions$ = versions.slice(0, lastIndex == -1 ? versions.length : lastIndex + 1);
69
+ Object.keys(packageNames[packageName]).forEach((version) => {
70
+ const newVersion = fitVersion(versions$, version, commandOptions);
71
+ if (newVersion === version) delete packageNames[packageName][version];
72
+ else packageNames[packageName][version] = newVersion;
73
+ });
74
+ if (!Object.keys(packageNames[packageName]).length) delete packageNames[packageName];
75
+ resolve();
76
+ } catch (e) {
77
+ delete packageNames[packageName];
78
+ resolve();
79
+ }
80
+ });
81
+ }));
82
+ return packageNames;
83
+ }
84
+ async updatePackageOptions(changed) {
85
+ const { packageOptionsMap, commandOptions } = this;
86
+ const packageFolderNames = [];
87
+ Object.keys(packageOptionsMap).forEach((packageDir) => {
88
+ const packageOptions = packageOptionsMap[packageDir];
89
+ const { devDependencies = {}, dependencies = {} } = packageOptions;
90
+ let isChanged = false;
91
+ [devDependencies, dependencies].forEach((target) => {
92
+ Object.keys(target).forEach((packageName) => {
93
+ const version = target[packageName];
94
+ if (changed[packageName]?.[version]) {
95
+ isChanged = true;
96
+ target[packageName] = changed[packageName][version];
97
+ }
98
+ });
99
+ });
100
+ if (isChanged) {
101
+ const { cwd } = Locals.impl();
102
+ if (packageDir !== cwd) packageFolderNames.push(packageDir.split("/").pop());
103
+ if (commandOptions.dryRun) Logger.log(chalk.magenta(`CHANGED: `) + chalk.yellow(`Skipping ${path.relative(cwd, packageDir)} Update`));
104
+ else {
105
+ fs.removeSync(`${packageDir}/node_modules`);
106
+ fs.outputFileSync(`${packageDir}/package.json`, JSON.stringify(packageOptions, null, 2));
107
+ }
108
+ }
109
+ });
110
+ return packageFolderNames;
111
+ }
112
+ async updateLock(message) {
113
+ if (this.commandOptions.dryRun) Logger.log(chalk.yellow(`Skipping pnpm-lock.yaml Update`));
114
+ else {
115
+ Logger.log(chalk.magenta(`CHANGED: `) + `pnpm-lock.yaml`);
116
+ const { cwd } = Locals.impl();
117
+ await fs.remove(`${cwd}/node_modules`);
118
+ await Shell.spawn("npx", [
119
+ "pnpm",
120
+ "install",
121
+ "--no-frozen-lockfile"
122
+ ]);
123
+ if (message.includes("puppeteer")) await Shell.spawn("node", ["node_modules/puppeteer/install.mjs"]);
124
+ }
125
+ }
126
+ async commit(message) {
127
+ const { commit, dryRun } = this.commandOptions;
128
+ if (!commit) Logger.log(chalk.magenta(`COMMIT: `) + "Disabled.");
129
+ else if (dryRun) Logger.log(chalk.magenta(`COMMIT: `) + chalk.yellow(`Skipping Git Commit`) + `\n${message}`);
130
+ else {
131
+ Logger.log(chalk.magenta(`COMMIT: `) + `package.json, pnpm-lock.yaml`);
132
+ await Shell.spawn("git", ["add", process.cwd()]);
133
+ await Shell.spawn("git", [
134
+ "commit",
135
+ "--m",
136
+ `'${message}'`
137
+ ]);
138
+ }
139
+ }
140
+ async push() {
141
+ const { push, dryRun } = this.commandOptions;
142
+ if (!push) Logger.log(chalk.magenta(`PUSH: `) + "Disabled.");
143
+ else if (dryRun) Logger.log(chalk.magenta(`PUSH: `) + chalk.yellow(`Skipping Git PUSH`));
144
+ else {
145
+ Logger.log(chalk.yellow("Git Fetch..."));
146
+ await Shell.spawn("git", [
147
+ "fetch",
148
+ "--prune",
149
+ "--prune-tags"
150
+ ]);
151
+ await Shell.spawn("git", ["pull", "--rebase"]);
152
+ await Shell.spawn("git", ["push"]);
153
+ }
154
+ }
155
+ async test() {
156
+ const { test, dryRun } = this.commandOptions;
157
+ if (!test) Logger.log(chalk.magenta(`Test: `) + "Disabled.");
158
+ else if (dryRun) {
159
+ Logger.log(chalk.yellow("Skipping Test"));
160
+ return;
161
+ } else Logger.log(chalk.yellow("Test..."));
162
+ const { rootPackageOptions } = Locals.impl();
163
+ if (rootPackageOptions?.scripts?.test) await Shell.exec(`npm run test -- --package-name '*'`);
164
+ }
165
+ async process() {
166
+ const spinner = ora(`Analyze ...`);
167
+ spinner.start();
168
+ const changed = await this.getPackageChanged();
169
+ spinner.stop();
170
+ let message = `deps updated \n\n`;
171
+ const keys = Object.keys(changed);
172
+ if (!keys.length) {
173
+ Logger.log(chalk.red(`No Package Update Found.`));
174
+ return;
175
+ }
176
+ Logger.log(chalk.magenta(`ANALYZE: `));
177
+ keys.forEach((key) => {
178
+ Object.keys(changed[key]).forEach((version) => {
179
+ message += `${key}: ${version} -> ${changed[key][version]}\n`;
180
+ Logger.log(`${chalk.cyan(key)}: ${chalk.yellow(version)} -> ${chalk.green(changed[key][version])}`);
181
+ });
182
+ });
183
+ const { all, changeLog } = this.commandOptions;
184
+ let packageFolderNames = await this.updatePackageOptions(changed);
185
+ const hasChanged = packageFolderNames.length;
186
+ packageFolderNames = hasChanged && all ? ["*"] : packageFolderNames;
187
+ if (changeLog) message = `chore${hasChanged ? "(" : ""}${packageFolderNames.join(",")}${hasChanged ? ")" : ""}: ${message}`;
188
+ else {
189
+ const { workspace } = Locals.impl();
190
+ message = `${workspace ? "chore" : "void"}: ${message}`;
191
+ }
192
+ await this.updateLock(message);
193
+ await this.test();
194
+ await this.commit(message);
195
+ await this.push();
196
+ Logger.log(chalk.magenta(`FINISH: `) + chalk.green(`Update Successed.`));
197
+ if (this.commandOptions.dryRun) Logger.log(chalk.green("NO DRY RUN WAY: ") + chalk.grey(`npm run update -- --no-dry-run\n`));
198
+ }
213
199
  };
214
-
200
+ var update = (commandOptions) => {
201
+ return new Update(commandOptions);
202
+ };
203
+ //#endregion
204
+ //#region packages/updater/src/index.ts
215
205
  process.setMaxListeners(100);
216
- const run = (options) => Utils.autoCatch(async () => {
217
- options = {
218
- dryRun: true,
219
- commit: true,
220
- push: true,
221
- test: true,
222
- changeLog: true,
223
- major: false,
224
- minor: false,
225
- patch: false,
226
- all: false,
227
- ...options
228
- };
229
- if (process.env.NODE_ENV === "UNIT") return Shell.spawn(`echo update`);
230
- await update(options).process();
231
- }, {
232
- onError: (e) => {
233
- if (typeof e === "number" && e === 1) {
234
- Logger.error("更新失败");
235
- } else {
236
- Logger.error(e);
237
- }
238
- process.exit(1);
239
- }
240
- });
241
-
206
+ var run = (options) => Utils.autoCatch(async () => {
207
+ options = {
208
+ dryRun: true,
209
+ commit: true,
210
+ push: true,
211
+ test: true,
212
+ changeLog: true,
213
+ major: false,
214
+ minor: false,
215
+ patch: false,
216
+ all: false,
217
+ ...options
218
+ };
219
+ if (process.env.NODE_ENV === "UNIT") return Shell.spawn(`echo update`);
220
+ await update(options).process();
221
+ }, { onError: (e) => {
222
+ if (typeof e === "number" && e === 1) Logger.error("更新失败");
223
+ else Logger.error(e);
224
+ process.exit(1);
225
+ } });
226
+ //#endregion
242
227
  export { run };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deot/dev-updater",
3
- "version": "2.9.9",
3
+ "version": "2.9.10",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,10 +19,10 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "@deot/dev-shared": "^2.9.9",
22
+ "@deot/dev-shared": "^2.9.10",
23
23
  "chalk": "^5.6.2",
24
- "fs-extra": "^11.3.3",
25
- "ora": "^9.0.0",
26
- "semver": "^7.7.3"
24
+ "fs-extra": "^11.3.4",
25
+ "ora": "^9.3.0",
26
+ "semver": "^7.7.4"
27
27
  }
28
28
  }