vite-plugin-millennium-skin 1.0.9 → 1.1.1

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.
package/dist/git.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function gitCommit(needCommitMessage?: boolean): Promise<void>;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
- import { Plugin } from 'vite';
1
+ import { Plugin, LogOptions } from 'vite';
2
+ import { versionConfig } from './versionConfig';
2
3
  export * from './aliasModules';
3
4
  export * from './defaultMatch';
4
5
  export * from './versionConfig';
6
+ export * from './versionConfig';
5
7
  export type SkinConfig = {
6
8
  name: string;
7
9
  description: string;
@@ -65,9 +67,8 @@ export type versionObject = {
65
67
  alpha?: number;
66
68
  snapshot?: number;
67
69
  };
68
- export declare enum versionConfig {
69
- auto = 0,
70
- package = 1
71
- }
72
70
  export default function millenniumSkin(): Plugin;
73
71
  export declare function defineConfig(SkinConfig: SkinConfig): SkinConfig;
72
+ export declare function warn(msg: string, options?: LogOptions): void;
73
+ export declare function info(msg: string, options?: LogOptions): void;
74
+ export declare function error(msg: string, options?: LogOptions): void;
package/dist/index.js CHANGED
@@ -1,13 +1,15 @@
1
- import c from "@babel/types";
2
- import { parse as A } from "@babel/parser";
3
- import x from "@babel/traverse";
4
- import { generate as P } from "@babel/generator";
5
- import b, { join as m } from "path/posix";
6
- import { existsSync as I } from "fs";
7
- import k from "fs/promises";
8
- import { loadConfigFromFile as F } from "vite";
9
- import v from "chalk";
10
- const N = [
1
+ import l from "@babel/types";
2
+ import { parse as O } from "@babel/parser";
3
+ import B from "@babel/traverse";
4
+ import { generate as z } from "@babel/generator";
5
+ import w, { join as f } from "path/posix";
6
+ import { existsSync as D } from "fs";
7
+ import E from "fs/promises";
8
+ import { loadConfigFromFile as Z } from "vite";
9
+ import y from "chalk";
10
+ import G from "inquirer";
11
+ import L from "simple-git";
12
+ const U = [
11
13
  {
12
14
  Match: "https://.*.steampowered.com",
13
15
  TargetCss: "webkit.css",
@@ -88,44 +90,124 @@ const N = [
88
90
  TargetCss: "libraryroot.custom.css",
89
91
  TargetJs: "libraryroot.custom.js"
90
92
  }
91
- ], $ = 0, O = 1, z = [
93
+ ], J = 0, V = 1, H = [
92
94
  {
93
- method: $,
95
+ method: J,
94
96
  module: /^react$/g,
95
97
  links: ["window", "opener", "SP_REACT"]
96
98
  },
97
99
  {
98
- method: $,
100
+ method: J,
99
101
  module: /^react-dom$/g,
100
102
  links: ["window", "opener", "SP_REACTDOM"]
101
103
  }
102
- ], Z = 0, B = 1, ae = /^SharedJSContext$/, ne = /^Steam$/, ie = /^View Root Menu$/, ce = /^Steam Root Menu$/, le = /^Friends Root Menu$/, ue = /^Games Root Menu$/, me = /^Help Root Menu$/, pe = /^Notifications Menu$/, ge = /^Account Menu$/;
103
- var D = /* @__PURE__ */ ((s) => (s[s.auto = 0] = "auto", s[s.package = 1] = "package", s))(D || {});
104
- const G = x.default, L = /(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<preRelease>(?:[a-zA-Z1-9][a-zA-Z\d]*|0\d*[a-zA-Z][a-zA-Z\d]*|0)(?:\.(?:[a-zA-Z1-9][a-zA-Z\d]*|0\d*[a-zA-Z][a-zA-Z\d]*|0))*))?(?:\+(?<metadata>(?:[a-zA-Z\d-]*)(?:\.(?:[a-zA-Z\d-]*))*))?/, V = /(?:\.)?(?<tag>[a-zA-Z]+)\.(?<number>(?:[1-9]\d*|0\d*|0))/g;
105
- let w;
106
- function de() {
104
+ ], W = {
105
+ type: "auto",
106
+ git: {
107
+ major: { autoCommit: !1 },
108
+ minor: { autoCommit: !1 },
109
+ patch: { autoCommit: !1 },
110
+ rc: { autoCommit: !0, needCommitMessage: !0 },
111
+ gamma: { autoCommit: !0, needCommitMessage: !0 },
112
+ beta: { autoCommit: !0, needCommitMessage: !0 },
113
+ preview: { autoCommit: !0, needCommitMessage: !1 },
114
+ alpha: { autoCommit: !0, needCommitMessage: !1 },
115
+ snapshot: { autoCommit: !0, needCommitMessage: !1 }
116
+ }
117
+ }, ge = {
118
+ type: "auto",
119
+ git: {
120
+ major: { autoCommit: !1 },
121
+ minor: { autoCommit: !1 },
122
+ patch: { autoCommit: !1 },
123
+ rc: { autoCommit: !1 },
124
+ gamma: { autoCommit: !1 },
125
+ beta: { autoCommit: !1 },
126
+ preview: { autoCommit: !1 },
127
+ alpha: { autoCommit: !1 },
128
+ snapshot: { autoCommit: !1 }
129
+ }
130
+ }, X = W, $ = L();
131
+ async function q(s = !1) {
132
+ if (s) {
133
+ const o = await G.prompt([
134
+ {
135
+ type: "select",
136
+ name: "type",
137
+ message: "选择提交类型:",
138
+ choices: [
139
+ "feat",
140
+ "fix",
141
+ "docs",
142
+ "style",
143
+ "refactor",
144
+ "test",
145
+ "chore"
146
+ ],
147
+ default: "chore"
148
+ },
149
+ {
150
+ type: "input",
151
+ name: "message",
152
+ message: "输入提交信息:"
153
+ },
154
+ {
155
+ type: "confirm",
156
+ name: "confirm",
157
+ message: "确认提交?",
158
+ default: !0
159
+ }
160
+ ]);
161
+ if (!o.confirm) {
162
+ k("❌ 已取消提交");
163
+ return;
164
+ }
165
+ try {
166
+ await $.add("."), await $.commit(`${o.type}: ${o.message}`), k("✓ git提交成功");
167
+ } catch (t) {
168
+ F(`❌ git提交失败: ${t.message}`);
169
+ }
170
+ } else
171
+ try {
172
+ await $.add("."), await $.commit("chore: auto commit by MillenniumSkin"), k("✓ git提交成功");
173
+ } catch (o) {
174
+ F(`❌ git提交失败: ${o.message}`);
175
+ }
176
+ }
177
+ const de = /^SharedJSContext$/, he = /^Steam$/, Ce = /^View Root Menu$/, be = /^Steam Root Menu$/, Me = /^Friends Root Menu$/, we = /^Games Root Menu$/, ye = /^Help Root Menu$/, Te = /^Notifications Menu$/, ve = /^Account Menu$/, K = B.default, Q = /(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<preRelease>(?:[a-zA-Z1-9][a-zA-Z\d]*|0\d*[a-zA-Z][a-zA-Z\d]*|0)(?:\.(?:[a-zA-Z1-9][a-zA-Z\d]*|0\d*[a-zA-Z][a-zA-Z\d]*|0))*))?(?:\+(?<metadata>(?:[a-zA-Z\d-]*)(?:\.(?:[a-zA-Z\d-]*))*))?/, Y = /(?:\.)?(?<tag>[a-zA-Z]+)\.(?<number>(?:[1-9]\d*|0\d*|0))/g;
178
+ let C;
179
+ function $e() {
107
180
  const s = [], o = [];
108
- let t, e, n;
181
+ let t, e, a, n;
182
+ const b = "virtual:millennium-skin", A = "\0" + b;
109
183
  return {
110
184
  name: "vite-plugin-millennium-skin",
111
185
  enforce: "pre",
112
- async config(i) {
113
- if (t = (await F(
186
+ resolveId(c) {
187
+ if (c === b)
188
+ return A;
189
+ },
190
+ load(c) {
191
+ if (c === A)
192
+ return `export const version = ${n ? JSON.stringify(n) : "undefined"};`;
193
+ },
194
+ async config(c) {
195
+ if (t = (await Z(
114
196
  { command: "build", mode: "profuction" },
115
197
  "skin.config.ts",
116
- i.root
198
+ c.root
117
199
  ))?.config, t.Patches === void 0) {
118
200
  if (!t.UseDefaultPatches)
119
201
  throw new Error("haven't any patch in skin.config.ts");
120
- t.Patches = N;
202
+ t.Patches = U;
121
203
  }
122
- return t.Patches.forEach((a) => {
123
- a.TargetJs && s.push(m(t.srcJs, a.TargetJs)), a.TargetCss && o.push(
124
- J(m(t.srcCss, a.TargetCss))
204
+ return t.Patches.forEach((i) => {
205
+ i.TargetJs && s.push(f(t.srcJs, i.TargetJs)), i.TargetCss && o.push(
206
+ I(f(t.srcCss, i.TargetCss))
125
207
  );
126
208
  }), t.RootColors !== void 0 && o.push(
127
- J(
128
- m(t.srcCss, t.RootColors)
209
+ I(
210
+ f(t.srcCss, t.RootColors)
129
211
  )
130
212
  ), {
131
213
  build: {
@@ -133,11 +215,11 @@ function de() {
133
215
  input: [...s, ...o],
134
216
  output: {
135
217
  entryFileNames: "assets/js/[name].js",
136
- assetFileNames: (a) => {
137
- const u = a.names[0], r = b.parse(u);
138
- return r.ext === ".css" ? `assets/css/${u}` : /\.(png|jpg|jpeg|gif|svg|webp|bmp|heic)/i.test(
218
+ assetFileNames: (i) => {
219
+ const m = i.names[0], r = w.parse(m);
220
+ return r.ext === ".css" ? `assets/css/${m}` : /\.(png|jpg|jpeg|gif|svg|webp|bmp|heic)/i.test(
139
221
  r.ext
140
- ) ? `assets/images/${u}` : `assets/css/${u}`;
222
+ ) ? `assets/images/${m}` : `assets/css/${m}`;
141
223
  }
142
224
  }
143
225
  },
@@ -146,28 +228,52 @@ function de() {
146
228
  }
147
229
  };
148
230
  },
149
- configResolved(i) {
150
- n = i, w = i.logger;
231
+ async configResolved(c) {
232
+ a = c, C = c.logger;
233
+ const p = a.root, i = f(p, "package.json");
234
+ t.version === void 0 && (t.version = X);
235
+ try {
236
+ const m = JSON.parse(
237
+ await E.readFile(i, {
238
+ flag: "r",
239
+ encoding: "utf-8"
240
+ })
241
+ );
242
+ if (t.version.type === "auto") {
243
+ if (n = await _(
244
+ m.version,
245
+ process.env.RELEASE
246
+ ), n) {
247
+ const r = n.newString;
248
+ m.version = r, await E.writeFile(
249
+ i,
250
+ JSON.stringify(m, null, 4)
251
+ ), k(`${n.nativeString} -> ${r}`);
252
+ }
253
+ } else t.version.type === "package" && (n = await _(m.version));
254
+ } catch (m) {
255
+ R(`can't use package.json: ${m}`), n = await _("0.0.0");
256
+ }
151
257
  },
152
- generateBundle(i, p) {
258
+ generateBundle(c, p) {
153
259
  if (t.Patches === void 0)
154
260
  throw new Error("haven't any patch in building");
155
- const a = n.root, u = structuredClone(
261
+ const i = a.root, m = structuredClone(
156
262
  t.Patches
157
263
  ).map((r) => {
158
264
  if (r.Match instanceof RegExp && (r.Match = r.Match.source), r.TargetJs) {
159
- const g = b.parse(r.TargetJs);
160
- r.TargetJs = m(
161
- a,
265
+ const g = w.parse(r.TargetJs);
266
+ r.TargetJs = f(
267
+ i,
162
268
  t.srcJs,
163
269
  g.dir,
164
270
  g.name
165
271
  );
166
272
  }
167
273
  if (r.TargetCss) {
168
- const g = b.parse(r.TargetCss);
169
- r.TargetCss = m(
170
- a,
274
+ const g = w.parse(r.TargetCss);
275
+ r.TargetCss = f(
276
+ i,
171
277
  t.srcCss,
172
278
  g.dir,
173
279
  g.name
@@ -180,183 +286,169 @@ function de() {
180
286
  };
181
287
  });
182
288
  Object.entries(p).forEach(([, r]) => {
183
- const { type: g } = r, h = r.fileName;
289
+ const { type: g } = r, M = r.fileName;
184
290
  if (g === "chunk") {
185
291
  if (!r.facadeModuleId) return;
186
- const l = b.parse(
187
- r.facadeModuleId
188
- ), f = m(
189
- l.dir,
190
- l.name
292
+ const u = w.parse(r.facadeModuleId), h = f(
293
+ u.dir,
294
+ u.name
191
295
  );
192
- u.forEach((d) => {
193
- f === d.TargetJs && (d.TargetJs = h);
296
+ m.forEach((d) => {
297
+ h === d.TargetJs && (d.TargetJs = M);
194
298
  });
195
299
  } else {
196
- const l = b.parse(
197
- m(a, r.originalFileNames[0])
198
- ), f = m(
199
- l.dir,
200
- l.name
300
+ const u = w.parse(
301
+ f(i, r.originalFileNames[0])
302
+ ), h = f(
303
+ u.dir,
304
+ u.name
201
305
  );
202
- u.forEach((d) => {
203
- f === d.TargetCss && (d.TargetCss = h);
204
- }), t.RootColors && f === m(
205
- n.root,
306
+ m.forEach((d) => {
307
+ h === d.TargetCss && (d.TargetCss = M);
308
+ }), t.RootColors && h === f(
309
+ a.root,
206
310
  t.srcCss,
207
311
  t.RootColors
208
- ) && (t.RootColors = h);
312
+ ) && (t.RootColors = M);
209
313
  return;
210
314
  }
211
315
  }), e = {
212
316
  ...t,
213
- Patches: u,
214
- version: ""
317
+ Patches: m,
318
+ version: n?.newString ?? "0.0.0"
215
319
  };
216
320
  },
217
321
  async writeBundle() {
218
- const i = n.root, p = m(i, "package.json");
219
- try {
220
- const a = JSON.parse(
221
- await k.readFile(p, {
222
- flag: "r",
223
- encoding: "utf-8"
224
- })
225
- );
226
- if (t.version === Z || t.version === void 0) {
227
- const u = await W(
228
- a.version,
229
- process.env.RELEASE
230
- );
231
- if (u) {
232
- const r = _(u.new);
233
- e.version = r, a.version = r, await k.writeFile(
234
- p,
235
- JSON.stringify(a, null, 4)
236
- ), X(
237
- `${_(u.native)} -> ${r}`
238
- );
239
- }
240
- } else t.version === B && (e.version = a.version);
241
- } catch (a) {
242
- j(`can't use package.json: ${a}`);
243
- }
322
+ const c = a.root;
244
323
  try {
245
- await k.writeFile(
246
- m(i, n.build.outDir, "skin.json"),
324
+ await E.writeFile(
325
+ f(c, a.build.outDir, "skin.json"),
247
326
  JSON.stringify(e, null, 4)
248
327
  );
249
- } catch (a) {
250
- throw new Error(`can't write skin.json: ${a}`);
328
+ } catch (p) {
329
+ throw new Error(`can't write skin.json: ${p}`);
251
330
  }
252
331
  },
253
- transform(i, p) {
332
+ transform(c, p) {
254
333
  if (!/.+\.(js|ts|tsx)$/g.test(p)) return;
255
- const a = A(i, {
334
+ const i = O(c, {
256
335
  sourceType: "module",
257
336
  plugins: ["typescript", "jsx"]
258
337
  });
259
- return G(a, {
338
+ return K(i, {
260
339
  Program(r) {
261
- const g = r.node.body, h = {};
262
- for (let l = g.length - 1; l >= 0; l--) {
263
- let f = g[l];
264
- if (!c.isImportDeclaration(f)) continue;
265
- const d = f.source.value, M = [];
266
- for (const T of z) {
267
- if (!T.module.test(d)) continue;
268
- const { method: R } = T;
269
- for (const C of f.specifiers) {
270
- const E = C.local.name;
271
- let y;
272
- switch (C.type === "ImportDefaultSpecifier" ? y = T.links : y = [
273
- ...T.links,
274
- C.imported.name
275
- ], R) {
276
- case O:
277
- h[E] = T.links;
340
+ const g = r.node.body, M = {};
341
+ for (let u = g.length - 1; u >= 0; u--) {
342
+ let h = g[u];
343
+ if (!l.isImportDeclaration(h)) continue;
344
+ const d = h.source.value, T = [];
345
+ for (const v of H) {
346
+ if (!v.module.test(d)) continue;
347
+ const { method: N } = v;
348
+ for (const j of h.specifiers) {
349
+ const x = j.local.name;
350
+ let S;
351
+ switch (j.type === "ImportDefaultSpecifier" ? S = v.links : S = [
352
+ ...v.links,
353
+ j.imported.name
354
+ ], N) {
355
+ case V:
356
+ M[x] = v.links;
278
357
  break;
279
- case $:
280
- M.push(
281
- U(
282
- E,
283
- y
358
+ case J:
359
+ T.push(
360
+ ee(
361
+ x,
362
+ S
284
363
  )
285
364
  );
286
365
  break;
287
366
  }
288
367
  }
289
368
  }
290
- M.length && g.splice(l, 1, ...M);
369
+ T.length && g.splice(u, 1, ...T);
291
370
  }
292
- Object.entries(h).forEach(
293
- ([l, f]) => {
294
- const d = r.scope.getBinding(l);
295
- d !== void 0 && (d.referencePaths.forEach((M) => {
296
- H(M, l, f);
297
- }), d.scope.removeOwnBinding(l));
371
+ Object.entries(M).forEach(
372
+ ([u, h]) => {
373
+ const d = r.scope.getBinding(u);
374
+ d !== void 0 && (d.referencePaths.forEach((T) => {
375
+ te(T, u, h);
376
+ }), d.scope.removeOwnBinding(u));
298
377
  }
299
378
  );
300
379
  }
301
- }), { code: P(a).code };
380
+ }), { code: z(i).code };
381
+ },
382
+ async closeBundle(c) {
383
+ if (c) {
384
+ console.error("打包失败:", c);
385
+ return;
386
+ }
387
+ if (t.version?.git !== void 0) {
388
+ const p = process.env.RELEASE;
389
+ if (p && t.version.git[p]) {
390
+ const i = t.version.git[p];
391
+ i.autoCommit && await q(i.needCommitMessage);
392
+ }
393
+ }
302
394
  }
303
395
  };
304
396
  }
305
- function fe(s) {
397
+ function ke(s) {
306
398
  return s;
307
399
  }
308
- function U(s, o) {
309
- let t = c.identifier(o[0]);
310
- for (let n = 1; n < o.length; n++)
311
- t = c.memberExpression(t, c.identifier(o[n]));
312
- const e = c.variableDeclarator(
313
- c.identifier(s),
400
+ function ee(s, o) {
401
+ let t = l.identifier(o[0]);
402
+ for (let a = 1; a < o.length; a++)
403
+ t = l.memberExpression(t, l.identifier(o[a]));
404
+ const e = l.variableDeclarator(
405
+ l.identifier(s),
314
406
  t
315
407
  );
316
- return c.variableDeclaration("const", [e]);
408
+ return l.variableDeclaration("const", [e]);
317
409
  }
318
- function J(s) {
319
- if (b.parse(s).ext !== "") return s;
410
+ function I(s) {
411
+ if (w.parse(s).ext !== "") return s;
320
412
  for (const t of ["scss", "sass", "css"]) {
321
413
  const e = `${s}.${t}`;
322
- if (I(m(process.cwd(), e)))
414
+ if (D(f(process.cwd(), e)))
323
415
  return e;
324
416
  }
325
417
  throw new Error(`can't find css module: ${s}`);
326
418
  }
327
- function H(s, o, t) {
419
+ function te(s, o, t) {
328
420
  const e = s.parent;
329
- if (c.isMemberExpression(e) && e.object === s.node) {
330
- const n = e.property;
331
- if (c.isIdentifier(n)) {
332
- const i = S(t);
421
+ if (l.isMemberExpression(e) && e.object === s.node) {
422
+ const a = e.property;
423
+ if (l.isIdentifier(a)) {
424
+ const n = P(t);
333
425
  if (!s.parentPath) return;
334
426
  s.parentPath.replaceWith(
335
- c.memberExpression(i, c.identifier(n.name))
427
+ l.memberExpression(n, l.identifier(a.name))
336
428
  );
337
429
  }
338
430
  return;
339
431
  }
340
432
  if (s.isIdentifier()) {
341
- const n = S(t);
433
+ const a = P(t);
342
434
  s.replaceWith(
343
- c.memberExpression(n, c.identifier(o))
435
+ l.memberExpression(a, l.identifier(o))
344
436
  );
345
437
  }
346
438
  }
347
- function S(s) {
439
+ function P(s) {
348
440
  if (s.length === 0)
349
441
  throw new Error("globalObj must not be empty");
350
- let o = c.identifier(s[0]);
442
+ let o = l.identifier(s[0]);
351
443
  for (let t = 1; t < s.length; t++)
352
- o = c.memberExpression(o, c.identifier(s[t]));
444
+ o = l.memberExpression(o, l.identifier(s[t]));
353
445
  return o;
354
446
  }
355
- async function W(s, o = "snapshot") {
447
+ async function _(s, o = null) {
356
448
  try {
357
- const t = L.exec(s);
449
+ const t = Q.exec(s);
358
450
  if (!t?.groups) {
359
- j(`can't understand version: ${s}`);
451
+ R(`can't understand version: ${s}`);
360
452
  return;
361
453
  }
362
454
  let e = {
@@ -365,11 +457,11 @@ async function W(s, o = "snapshot") {
365
457
  patch: parseInt(t.groups.patch)
366
458
  };
367
459
  t.groups.preRelease && [
368
- ...t.groups.preRelease.matchAll(V)
369
- ].forEach((p) => {
370
- p.groups && (e[p.groups.tag] = parseInt(p.groups.number));
460
+ ...t.groups.preRelease.matchAll(Y)
461
+ ].forEach((b) => {
462
+ b.groups && (e[b.groups.tag] = parseInt(b.groups.number));
371
463
  });
372
- const n = { ...e };
464
+ const a = { ...e };
373
465
  switch (o) {
374
466
  case null:
375
467
  break;
@@ -416,44 +508,52 @@ async function W(s, o = "snapshot") {
416
508
  break;
417
509
  }
418
510
  return {
419
- native: n,
420
- new: e
511
+ native: a,
512
+ new: e,
513
+ nativeString: s,
514
+ newString: se(e)
421
515
  };
422
516
  } catch (t) {
423
- j(`can't bump version: ${t}`);
517
+ R(`can't bump version: ${t}`);
424
518
  }
425
519
  }
426
- function _(s) {
520
+ function se(s) {
427
521
  let o = `${s.major}.${s.minor}.${s.patch}`;
428
522
  const t = ["rc", "gamma", "beta", "preview", "alpha", "snapshot"];
429
523
  let e = !1;
430
- for (const n of t) {
431
- const i = s[n];
432
- i != null && (e ? o += `.${n}.${i}` : (o += `-${n}.${i}`, e = !0));
524
+ for (const a of t) {
525
+ const n = s[a];
526
+ n != null && (e ? o += `.${a}.${n}` : (o += `-${a}.${n}`, e = !0));
433
527
  }
434
528
  return o;
435
529
  }
436
- function j(s, o) {
437
- w ? w.warn(v.yellow(`[MillenniumSkin] ${s}`), o) : console.warn(v.yellow(`[MillenniumSkin] ${s}`));
530
+ function R(s, o) {
531
+ C ? C.warn(y.yellow(`[MillenniumSkin] ${s}`), o) : console.warn(y.yellow(`[MillenniumSkin] ${s}`));
532
+ }
533
+ function k(s, o) {
534
+ C ? C.info(y.greenBright(`[MillenniumSkin] ${s}`), o) : console.log(y.greenBright(`[MillenniumSkin] ${s}`));
438
535
  }
439
- function X(s, o) {
440
- w ? w.info(v.greenBright(`[MillenniumSkin] ${s}`), o) : console.log(v.greenBright(`[MillenniumSkin] ${s}`));
536
+ function F(s, o) {
537
+ C ? C.error(y.redBright(`[MillenniumSkin] ${s}`), o) : console.error(y.redBright(`[MillenniumSkin] ${s}`));
441
538
  }
442
539
  export {
443
- ne as LibraryRoot,
444
- ge as MenuAccount,
445
- le as MenuFriends,
446
- ue as MenuGames,
447
- me as MenuHelp,
448
- pe as MenuNotifications,
449
- ce as MenuSteam,
450
- ie as MenuView,
451
- ae as Root,
452
- Z as __AUTO__,
453
- $ as __DIRECT__,
454
- B as __PACKAGE__,
455
- O as __RUNTIME__,
456
- de as default,
457
- fe as defineConfig,
458
- D as versionConfig
540
+ he as LibraryRoot,
541
+ ve as MenuAccount,
542
+ Me as MenuFriends,
543
+ we as MenuGames,
544
+ ye as MenuHelp,
545
+ Te as MenuNotifications,
546
+ be as MenuSteam,
547
+ Ce as MenuView,
548
+ de as Root,
549
+ W as __AUTO__,
550
+ X as __DEFAULT__,
551
+ J as __DIRECT__,
552
+ ge as __PACKAGE__,
553
+ V as __RUNTIME__,
554
+ $e as default,
555
+ ke as defineConfig,
556
+ F as error,
557
+ k as info,
558
+ R as warn
459
559
  };
@@ -1,2 +1,23 @@
1
- export declare const __AUTO__ = 0;
2
- export declare const __PACKAGE__ = 1;
1
+ export declare const __AUTO__: versionConfig;
2
+ export declare const __PACKAGE__: versionConfig;
3
+ export declare const __DEFAULT__: versionConfig;
4
+ export type autoCommitLevel = {
5
+ autoCommit: false;
6
+ } | {
7
+ autoCommit: true;
8
+ needCommitMessage: boolean;
9
+ };
10
+ export type versionConfig = {
11
+ type: "auto" | "package";
12
+ git?: {
13
+ major: autoCommitLevel;
14
+ minor: autoCommitLevel;
15
+ patch: autoCommitLevel;
16
+ rc: autoCommitLevel;
17
+ gamma: autoCommitLevel;
18
+ beta: autoCommitLevel;
19
+ preview: autoCommitLevel;
20
+ alpha: autoCommitLevel;
21
+ snapshot: autoCommitLevel;
22
+ };
23
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-millennium-skin",
3
- "version": "1.0.9",
3
+ "version": "1.1.1",
4
4
  "main": "./dist/index.js",
5
5
  "type": "module",
6
6
  "directories": {
@@ -9,7 +9,10 @@
9
9
  "types": "dist/index.d.ts",
10
10
  "scripts": {
11
11
  "lint": "eslint . --ext .ts",
12
- "build": "tsc --noEmit && vite build"
12
+ "build": "tsc --noEmit && vite build",
13
+ "build:beta": "tsc --noEmit && cross-env RELEASE=beta vite build",
14
+ "build:preview": "tsc --noEmit && cross-env RELEASE=preview vite build",
15
+ "ci": "npm publish"
13
16
  },
14
17
  "repository": {
15
18
  "type": "git",
@@ -53,6 +56,8 @@
53
56
  "@typescript-eslint/eslint-plugin": "^8.50.1",
54
57
  "babel-plugin-transform-typescript": "^7.0.0-alpha.19",
55
58
  "chalk": "^5.6.2",
59
+ "inquirer": "^13.1.0",
60
+ "simple-git": "^3.30.0",
56
61
  "vite-plugin-dts": "^4.5.4"
57
62
  }
58
63
  }
package/src/ts/git.ts ADDED
@@ -0,0 +1,58 @@
1
+ import inquirer from "inquirer";
2
+ import simpleGit from "simple-git";
3
+ import { info, error } from "./index";
4
+
5
+ const git = simpleGit();
6
+
7
+ export async function gitCommit(needCommitMessage: boolean = false) {
8
+ if (needCommitMessage) {
9
+ const answers = await inquirer.prompt([
10
+ {
11
+ type: "select",
12
+ name: "type",
13
+ message: "选择提交类型:",
14
+ choices: [
15
+ "feat",
16
+ "fix",
17
+ "docs",
18
+ "style",
19
+ "refactor",
20
+ "test",
21
+ "chore",
22
+ ],
23
+ default: "chore",
24
+ },
25
+ {
26
+ type: "input",
27
+ name: "message",
28
+ message: "输入提交信息:",
29
+ },
30
+ {
31
+ type: "confirm",
32
+ name: "confirm",
33
+ message: "确认提交?",
34
+ default: true,
35
+ },
36
+ ]);
37
+
38
+ if (!answers.confirm) {
39
+ info("❌ 已取消提交");
40
+ return;
41
+ }
42
+ try {
43
+ await git.add(".");
44
+ await git.commit(`${answers.type}: ${answers.message}`);
45
+ info("✓ git提交成功");
46
+ } catch (e) {
47
+ error(`❌ git提交失败: ${(e as Error).message}`);
48
+ }
49
+ } else {
50
+ try {
51
+ await git.add(".");
52
+ await git.commit("chore: auto commit by MillenniumSkin");
53
+ info("✓ git提交成功");
54
+ } catch (e) {
55
+ error(`❌ git提交失败: ${(e as Error).message}`);
56
+ }
57
+ }
58
+ }
package/src/ts/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { Plugin, ResolvedConfig, Logger, LogOptions } from "vite";
2
2
  import type { Statement, MemberExpression, Identifier } from "@babel/types";
3
+ import type { autoCommitLevel, versionConfig } from "./versionConfig";
3
4
  import type { NodePath } from "@babel/traverse";
4
5
  import t from "@babel/types";
5
6
  import { parse } from "@babel/parser";
@@ -12,11 +13,13 @@ import { loadConfigFromFile } from "vite";
12
13
  import chalk from "chalk";
13
14
  import defaultPatches from "./defaultPatches";
14
15
  import aliasModules, { __DIRECT__, __RUNTIME__ } from "./aliasModules";
15
- import { __AUTO__, __PACKAGE__ } from "./versionConfig";
16
+ import { __DEFAULT__ } from "./versionConfig";
17
+ import { gitCommit } from "./git";
16
18
 
17
19
  export * from "./aliasModules";
18
20
  export * from "./defaultMatch";
19
21
  export * from "./versionConfig";
22
+ export * from "./versionConfig";
20
23
 
21
24
  export type SkinConfig = {
22
25
  name: string;
@@ -100,11 +103,6 @@ export type versionObject = {
100
103
  snapshot?: number;
101
104
  };
102
105
 
103
- export enum versionConfig {
104
- auto,
105
- package,
106
- }
107
-
108
106
  const traver = (traverse as any).default as typeof traverse;
109
107
  const SEMANTIC_VERSIONING_REGEXP =
110
108
  /(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<preRelease>(?:[a-zA-Z1-9][a-zA-Z\d]*|0\d*[a-zA-Z][a-zA-Z\d]*|0)(?:\.(?:[a-zA-Z1-9][a-zA-Z\d]*|0\d*[a-zA-Z][a-zA-Z\d]*|0))*))?(?:\+(?<metadata>(?:[a-zA-Z\d-]*)(?:\.(?:[a-zA-Z\d-]*))*))?/;
@@ -118,10 +116,25 @@ export default function millenniumSkin(): Plugin {
118
116
  let skinConfig: SkinConfig;
119
117
  let skinConfigResult: SkinConfigResult;
120
118
  let viteConfig: ResolvedConfig;
119
+ let versions: bumpResult | undefined;
120
+ const virtualModuleId = "virtual:millennium-skin";
121
+ const resolvedVirtualModuleId = "\0" + virtualModuleId;
121
122
  return {
122
123
  name: "vite-plugin-millennium-skin",
123
124
  enforce: "pre",
124
125
 
126
+ resolveId(source) {
127
+ if (source === virtualModuleId) {
128
+ return resolvedVirtualModuleId;
129
+ }
130
+ },
131
+
132
+ load(id) {
133
+ if (id === resolvedVirtualModuleId) {
134
+ return `export const version = ${versions ? JSON.stringify(versions) : "undefined"};`;
135
+ }
136
+ },
137
+
125
138
  async config(config) {
126
139
  const res = await loadConfigFromFile(
127
140
  { command: "build", mode: "profuction" },
@@ -180,9 +193,44 @@ export default function millenniumSkin(): Plugin {
180
193
  };
181
194
  },
182
195
 
183
- configResolved(config) {
196
+ async configResolved(config) {
184
197
  viteConfig = config;
185
198
  logger = config.logger;
199
+
200
+ const root = viteConfig.root;
201
+ const pkgPath = join(root, "package.json");
202
+ if (skinConfig.version === undefined)
203
+ skinConfig.version = __DEFAULT__;
204
+ // 版本自动管理
205
+ try {
206
+ const pkg = JSON.parse(
207
+ await fsp.readFile(pkgPath, {
208
+ flag: "r",
209
+ encoding: "utf-8",
210
+ }),
211
+ );
212
+
213
+ if (skinConfig.version.type === "auto") {
214
+ versions = await bump_version(
215
+ pkg.version,
216
+ process.env.RELEASE as any,
217
+ );
218
+ if (versions) {
219
+ const newVersion = versions.newString;
220
+ pkg.version = newVersion;
221
+ await fsp.writeFile(
222
+ pkgPath,
223
+ JSON.stringify(pkg, null, 4),
224
+ );
225
+ info(`${versions.nativeString} -> ${newVersion}`);
226
+ }
227
+ } else if (skinConfig.version.type === "package") {
228
+ versions = await bump_version(pkg.version);
229
+ }
230
+ } catch (e) {
231
+ warn(`can't use package.json: ${e}`);
232
+ versions = await bump_version("0.0.0");
233
+ }
186
234
  },
187
235
 
188
236
  generateBundle(_, bundles) {
@@ -225,9 +273,7 @@ export default function millenniumSkin(): Plugin {
225
273
  const compileLib = bundle.fileName;
226
274
  if (type === "chunk") {
227
275
  if (!bundle.facadeModuleId) return;
228
- const compileParsed = path.parse(
229
- bundle.facadeModuleId as string,
230
- );
276
+ const compileParsed = path.parse(bundle.facadeModuleId);
231
277
  const compilePath = join(
232
278
  compileParsed.dir,
233
279
  compileParsed.name,
@@ -265,47 +311,12 @@ export default function millenniumSkin(): Plugin {
265
311
  skinConfigResult = {
266
312
  ...skinConfig,
267
313
  Patches: patches,
268
- version: "",
314
+ version: versions?.newString ?? "0.0.0",
269
315
  };
270
316
  },
271
317
 
272
318
  async writeBundle() {
273
319
  const root = viteConfig.root;
274
- const pkgPath = join(root, "package.json");
275
- // 版本自动管理
276
- try {
277
- const pkg = JSON.parse(
278
- await fsp.readFile(pkgPath, {
279
- flag: "r",
280
- encoding: "utf-8",
281
- }),
282
- );
283
- if (
284
- skinConfig.version === __AUTO__ ||
285
- skinConfig.version === undefined
286
- ) {
287
- const versions = await bump_version(
288
- pkg.version,
289
- process.env.RELEASE as any,
290
- );
291
- if (versions) {
292
- const newVersion = versionObjToString(versions.new);
293
- skinConfigResult.version = newVersion;
294
- pkg.version = newVersion;
295
- await fsp.writeFile(
296
- pkgPath,
297
- JSON.stringify(pkg, null, 4),
298
- );
299
- info(
300
- `${versionObjToString(versions.native)} -> ${newVersion}`,
301
- );
302
- }
303
- } else if (skinConfig.version === __PACKAGE__) {
304
- skinConfigResult.version = pkg.version;
305
- }
306
- } catch (e) {
307
- warn(`can't use package.json: ${e}`);
308
- }
309
320
 
310
321
  // 写入skin.json
311
322
  try {
@@ -395,6 +406,25 @@ export default function millenniumSkin(): Plugin {
395
406
  const result = generate(ast);
396
407
  return { code: result.code };
397
408
  },
409
+
410
+ async closeBundle(error?: Error) {
411
+ if (error) {
412
+ console.error("打包失败:", error);
413
+ return;
414
+ }
415
+ if (skinConfig.version?.git !== undefined) {
416
+ const tag = process.env.RELEASE as
417
+ | keyof versionConfig["git"]
418
+ | undefined;
419
+ if (tag && skinConfig.version.git[tag]) {
420
+ const gitConfig = skinConfig.version.git[
421
+ tag
422
+ ] as autoCommitLevel;
423
+ if (gitConfig.autoCommit)
424
+ await gitCommit(gitConfig.needCommitMessage);
425
+ }
426
+ }
427
+ },
398
428
  };
399
429
  }
400
430
 
@@ -461,7 +491,16 @@ function createNestedMemberExpression(globalObj: string[]): t.MemberExpression {
461
491
  return node as t.MemberExpression;
462
492
  }
463
493
 
464
- async function bump_version(nativeVersion: string, tag: bump_tag = "snapshot") {
494
+ type bumpResult = {
495
+ native: versionObject;
496
+ new: versionObject;
497
+ nativeString: string;
498
+ newString: string;
499
+ };
500
+ async function bump_version(
501
+ nativeVersion: string,
502
+ tag: bump_tag = null,
503
+ ): Promise<bumpResult | undefined> {
465
504
  try {
466
505
  const match = SEMANTIC_VERSIONING_REGEXP.exec(nativeVersion);
467
506
 
@@ -548,6 +587,8 @@ async function bump_version(nativeVersion: string, tag: bump_tag = "snapshot") {
548
587
  return {
549
588
  native: nativeVersionObj,
550
589
  new: version,
590
+ nativeString: nativeVersion,
591
+ newString: versionObjToString(version),
551
592
  };
552
593
  } catch (e) {
553
594
  warn(`can't bump version: ${e}`);
@@ -576,13 +617,19 @@ function versionObjToString(version: versionObject) {
576
617
  return versionString;
577
618
  }
578
619
 
579
- function warn(msg: string, options?: LogOptions) {
620
+ export function warn(msg: string, options?: LogOptions) {
580
621
  if (logger) logger.warn(chalk.yellow(`[MillenniumSkin] ${msg}`), options);
581
622
  else console.warn(chalk.yellow(`[MillenniumSkin] ${msg}`));
582
623
  }
583
624
 
584
- function info(msg: string, options?: LogOptions) {
625
+ export function info(msg: string, options?: LogOptions) {
585
626
  if (logger)
586
627
  logger.info(chalk.greenBright(`[MillenniumSkin] ${msg}`), options);
587
628
  else console.log(chalk.greenBright(`[MillenniumSkin] ${msg}`));
588
629
  }
630
+
631
+ export function error(msg: string, options?: LogOptions) {
632
+ if (logger)
633
+ logger.error(chalk.redBright(`[MillenniumSkin] ${msg}`), options);
634
+ else console.error(chalk.redBright(`[MillenniumSkin] ${msg}`));
635
+ }
@@ -1,2 +1,55 @@
1
- export const __AUTO__ = 0;
2
- export const __PACKAGE__ = 1;
1
+ export const __AUTO__: versionConfig = {
2
+ type: "auto",
3
+ git: {
4
+ major: { autoCommit: false },
5
+ minor: { autoCommit: false },
6
+ patch: { autoCommit: false },
7
+ rc: { autoCommit: true, needCommitMessage: true },
8
+ gamma: { autoCommit: true, needCommitMessage: true },
9
+ beta: { autoCommit: true, needCommitMessage: true },
10
+ preview: { autoCommit: true, needCommitMessage: false },
11
+ alpha: { autoCommit: true, needCommitMessage: false },
12
+ snapshot: { autoCommit: true, needCommitMessage: false },
13
+ },
14
+ };
15
+
16
+ export const __PACKAGE__: versionConfig = {
17
+ type: "auto",
18
+ git: {
19
+ major: { autoCommit: false },
20
+ minor: { autoCommit: false },
21
+ patch: { autoCommit: false },
22
+ rc: { autoCommit: false },
23
+ gamma: { autoCommit: false },
24
+ beta: { autoCommit: false },
25
+ preview: { autoCommit: false },
26
+ alpha: { autoCommit: false },
27
+ snapshot: { autoCommit: false },
28
+ },
29
+ };
30
+
31
+ export const __DEFAULT__: versionConfig = __AUTO__;
32
+
33
+ export type autoCommitLevel =
34
+ | {
35
+ autoCommit: false;
36
+ }
37
+ | {
38
+ autoCommit: true;
39
+ needCommitMessage: boolean;
40
+ };
41
+
42
+ export type versionConfig = {
43
+ type: "auto" | "package";
44
+ git?: {
45
+ major: autoCommitLevel;
46
+ minor: autoCommitLevel;
47
+ patch: autoCommitLevel;
48
+ rc: autoCommitLevel;
49
+ gamma: autoCommitLevel;
50
+ beta: autoCommitLevel;
51
+ preview: autoCommitLevel;
52
+ alpha: autoCommitLevel;
53
+ snapshot: autoCommitLevel;
54
+ };
55
+ };
@@ -0,0 +1,3 @@
1
+ declare module "virtual:millennium-skin" {
2
+ export const version: bumpResult | undefined;
3
+ }
package/vite.config.ts CHANGED
@@ -25,6 +25,8 @@ const rg: any = {
25
25
  "@babel/types",
26
26
  "@babel/parser",
27
27
  "chalk",
28
+ "inquirer",
29
+ "simple-git",
28
30
  ],
29
31
  output: {
30
32
  preserveModules: false,