@liuli-util/cli 3.15.0 → 3.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. package/CHANGELOG.md +96 -89
  2. package/dist/bin.js +96 -77
  3. package/dist/bin.js.map +3 -3
  4. package/dist/commands/deploy/DeployService.d.ts +51 -0
  5. package/dist/commands/deploy/DeployService.d.ts.map +1 -0
  6. package/dist/commands/deploy/deploy.d.ts +3 -0
  7. package/dist/commands/deploy/deploy.d.ts.map +1 -0
  8. package/dist/commands/deploy/index.d.ts +3 -0
  9. package/dist/commands/deploy/index.d.ts.map +1 -0
  10. package/dist/commands/deploy/util/FileLock.d.ts +14 -0
  11. package/dist/commands/deploy/util/FileLock.d.ts.map +1 -0
  12. package/dist/commands/deploy/util/PromiseUtil.d.ts +14 -0
  13. package/dist/commands/deploy/util/PromiseUtil.d.ts.map +1 -0
  14. package/dist/commands/deploy/util/createArchive.d.ts +10 -0
  15. package/dist/commands/deploy/util/createArchive.d.ts.map +1 -0
  16. package/dist/commands/deploy/util/execPromise.d.ts +4 -0
  17. package/dist/commands/deploy/util/execPromise.d.ts.map +1 -0
  18. package/dist/commands/deploy/util/wait.d.ts +9 -0
  19. package/dist/commands/deploy/util/wait.d.ts.map +1 -0
  20. package/dist/commands/esbuild/ESBuildProgram.d.ts.map +1 -1
  21. package/dist/index.esm.js +1 -1
  22. package/dist/index.esm.js.map +2 -2
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +2 -2
  25. package/dist/utils/nodeCacheDir.d.ts +2 -0
  26. package/dist/utils/nodeCacheDir.d.ts.map +1 -0
  27. package/package.json +13 -7
  28. package/src/bin.ts +3 -2
  29. package/src/commands/deploy/DeployService.ts +157 -0
  30. package/src/commands/deploy/__tests__/DeployService.test.ts +75 -0
  31. package/src/commands/deploy/__tests__/FileLock.test.ts +27 -0
  32. package/src/commands/deploy/__tests__/conf.test.ts +29 -0
  33. package/src/commands/deploy/__tests__/simpleGit.test.ts +29 -0
  34. package/src/commands/deploy/__tests__/util/deployGhPageWorker.ts +16 -0
  35. package/src/commands/deploy/deploy.ts +48 -0
  36. package/src/commands/deploy/index.ts +7 -0
  37. package/src/commands/deploy/util/FileLock.ts +31 -0
  38. package/src/commands/deploy/util/PromiseUtil.ts +34 -0
  39. package/src/commands/deploy/util/createArchive.ts +30 -0
  40. package/src/commands/deploy/util/execPromise.ts +13 -0
  41. package/src/commands/deploy/util/wait.ts +23 -0
  42. package/src/commands/esbuild/ESBuildProgram.ts +1 -1
  43. package/src/commands/esbuild/__tests__/.temp/getDeps/package.json +1 -0
  44. package/src/commands/generate/__tests__/.temp/test-cli/CHANGELOG.md +1 -0
  45. package/src/commands/generate/__tests__/.temp/test-cli/README.md +1 -0
  46. package/src/commands/generate/__tests__/.temp/test-cli/bin.js +3 -0
  47. package/src/commands/generate/__tests__/.temp/test-cli/package.json +44 -0
  48. package/src/commands/generate/__tests__/.temp/test-cli/src/bin.ts +13 -0
  49. package/src/commands/generate/__tests__/.temp/test-cli/src/index.ts +1 -0
  50. package/src/commands/generate/__tests__/.temp/test-cli/tsconfig.json +28 -0
  51. package/src/utils/__tests__/nodeCacheDir.test.ts +6 -0
  52. package/src/utils/nodeCacheDir.ts +54 -0
  53. package/templates/cli/tsconfig.json +28 -28
  54. package/templates/lib/tsconfig.json +28 -28
  55. package/tsconfig.json +34 -34
  56. package/src/commands/sync/__tests__/.temp/package.json +0 -16
@@ -0,0 +1,51 @@
1
+ import { EventExtPromise } from './util/PromiseUtil';
2
+ import { ConnectOptions } from 'ssh2-sftp-client';
3
+ export interface DeployEvents {
4
+ process(title: string): void;
5
+ }
6
+ /**
7
+ * 部署服务接口
8
+ */
9
+ export interface IDeployService {
10
+ validate(): [isValidate: boolean, errorText: string];
11
+ /**
12
+ * 部署
13
+ */
14
+ deploy(): EventExtPromise<void, DeployEvents>;
15
+ }
16
+ export declare enum DeployTypeEnum {
17
+ GhPages = "gh-pages",
18
+ Sftp = "sftp"
19
+ }
20
+ export interface BaseDeployOptions {
21
+ cwd: string;
22
+ type: DeployTypeEnum;
23
+ }
24
+ export declare type SftpDeployOptions = Omit<BaseDeployOptions, 'type'> & {
25
+ dest: string;
26
+ remote: string;
27
+ sshConfig: ConnectOptions;
28
+ };
29
+ /**
30
+ * sftp 集成到远端
31
+ */
32
+ export declare class SftpDeployService implements IDeployService {
33
+ private readonly options;
34
+ constructor(options: SftpDeployOptions);
35
+ deploy(): EventExtPromise<void, DeployEvents>;
36
+ validate(): [isValidate: boolean, errorText: string];
37
+ }
38
+ export declare type GhPagesDeployOptions = Omit<BaseDeployOptions, 'type'> & {
39
+ dest: string;
40
+ remote: string;
41
+ };
42
+ /**
43
+ * 将本地静态资源推送到 gh-pages 远端
44
+ */
45
+ export declare class GhPagesDeployService implements IDeployService {
46
+ private readonly options;
47
+ constructor(options: GhPagesDeployOptions);
48
+ deploy(): EventExtPromise<void, DeployEvents>;
49
+ validate(): [isValid: boolean, errorText: string];
50
+ }
51
+ //# sourceMappingURL=DeployService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeployService.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/DeployService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAe,MAAM,oBAAoB,CAAA;AACjE,OAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AASzD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAgBD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACpD;;OAEG;IACH,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;CAC9C;AAED,oBAAY,cAAc;IACxB,OAAO,aAAa;IACpB,IAAI,SAAS;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,oBAAY,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED;;GAEG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAEvD,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC;IAc7C,QAAQ,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;CAqBrD;AAED,oBAAY,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAE1D,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC;IAiC7C,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;CAclD"}
@@ -0,0 +1,3 @@
1
+ import { BaseDeployOptions } from './DeployService';
2
+ export declare function deploy(options: Omit<BaseDeployOptions, 'type'>): Promise<void>;
3
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAMlB,MAAM,iBAAiB,CAAA;AAgBxB,wBAAsB,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBpF"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const deployCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,eAAO,MAAM,aAAa,SAEsB,CAAA"}
@@ -0,0 +1,14 @@
1
+ export declare class FileLock {
2
+ private readonly lockFilePath;
3
+ constructor(lockFilePath: string);
4
+ private lockId?;
5
+ /**
6
+ * 加锁
7
+ */
8
+ lock(): Promise<boolean>;
9
+ /**
10
+ * 解锁
11
+ */
12
+ unlock(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=FileLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileLock.d.ts","sourceRoot":"","sources":["../../../../src/commands/deploy/util/FileLock.ts"],"names":[],"mappings":"AAGA,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,MAAM;IAEjD,OAAO,CAAC,MAAM,CAAC,CAAQ;IAEvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAO9B"}
@@ -0,0 +1,14 @@
1
+ import { ConditionalKeys, PromiseValue } from 'type-fest';
2
+ declare type VoidFunc = ((...args: any[]) => void) | undefined;
3
+ export declare type EventExtPromise<T, E> = Promise<T> & {
4
+ on<K extends ConditionalKeys<E, VoidFunc>>(type: K, callback: E[K]): EventExtPromise<T, E>;
5
+ };
6
+ export declare class PromiseUtil {
7
+ /**
8
+ * 创建一个支持 on* 事件的 Promise 实例
9
+ * @param executor
10
+ */
11
+ static wrapOnEvent<F extends (events: any) => Promise<any>, E extends Parameters<F>[0], K extends ConditionalKeys<E, VoidFunc>>(executor: F): EventExtPromise<PromiseValue<ReturnType<F>>, E>;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=PromiseUtil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromiseUtil.d.ts","sourceRoot":"","sources":["../../../../src/commands/deploy/util/PromiseUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAEzD,aAAK,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;AAEtD,oBAAY,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG;IAC/C,EAAE,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC3F,CAAA;AAED,qBAAa,WAAW;IACtB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAChB,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EACvC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1B,CAAC,SAAS,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,EACtC,QAAQ,EAAE,CAAC,GAAG,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;CAgBhE"}
@@ -0,0 +1,10 @@
1
+ export declare type ArchiveOptions = {
2
+ sourceDir: string;
3
+ destPath: string;
4
+ };
5
+ /**
6
+ * 创建 jpl 压缩文件
7
+ * @param options
8
+ */
9
+ export declare function createArchive(options: ArchiveOptions): Promise<void>;
10
+ //# sourceMappingURL=createArchive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArchive.d.ts","sourceRoot":"","sources":["../../../../src/commands/deploy/util/createArchive.ts"],"names":[],"mappings":"AAIA,oBAAY,cAAc,GAAG;IAE3B,SAAS,EAAE,MAAM,CAAA;IAEjB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1E"}
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ import { ExecOptions } from 'child_process';
3
+ export declare function execPromise(command: string, options?: ExecOptions): Promise<string | Buffer>;
4
+ //# sourceMappingURL=execPromise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execPromise.d.ts","sourceRoot":"","sources":["../../../../src/commands/deploy/util/execPromise.ts"],"names":[],"mappings":";AAAA,OAAO,EAAQ,WAAW,EAAE,MAAM,eAAe,CAAA;AAEjD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAU5F"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 等待指定的时间/等待指定表达式成立
3
+ * 如果未指定等待条件则立刻执行
4
+ * 注: 此实现在 nodejs 10- 会存在宏任务与微任务的问题,切记 async-await 本质上还是 Promise 的语法糖,实际上并非真正的同步函数!!!即便在浏览器,也不要依赖于这种特性。
5
+ * @param param 等待时间/等待条件
6
+ * @returns Promise 对象
7
+ */
8
+ export declare function wait(param?: number | (() => boolean | Promise<boolean>)): Promise<void>;
9
+ //# sourceMappingURL=wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../../src/commands/deploy/util/wait.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAevF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ESBuildProgram.d.ts","sourceRoot":"","sources":["../../../src/commands/esbuild/ESBuildProgram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAM/D,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAG/B,OAAO,QAAQ,MAAM,UAAU,CAAA;AAK/B,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,UAAU,IAAI;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;CACrB;AAED,oBAAY,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;AAEjE,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,EAE3B;IAED,MAAM,CAAC,QAAQ,CAAC,cAAc,WAAoC;IAElE;;OAEG;WACU,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASrD;;OAEG;WACU,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBzD,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;QACpC,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,QAAQ,CAAA;KAClB;IAQD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB7B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,YAAY;IAe3F;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,YAAY;IAe3F;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY;IAgBtG;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,YAAY;IAoBrF,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAQvC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;WAsDxC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9D,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB9C"}
1
+ {"version":3,"file":"ESBuildProgram.d.ts","sourceRoot":"","sources":["../../../src/commands/esbuild/ESBuildProgram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAM/D,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAG/B,OAAO,QAAQ,MAAM,UAAU,CAAA;AAK/B,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,UAAU,IAAI;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;CACrB;AAED,oBAAY,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;AAEjE,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,EAE3B;IAED,MAAM,CAAC,QAAQ,CAAC,cAAc,WAA4C;IAE1E;;OAEG;WACU,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASrD;;OAEG;WACU,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBzD,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;QACpC,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,QAAQ,CAAA;KAClB;IAQD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB7B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,YAAY;IAe3F;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,YAAY;IAe3F;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY;IAgBtG;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,YAAY;IAoBrF,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAQvC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;WAsDxC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9D,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB9C"}
package/dist/index.esm.js CHANGED
@@ -2,5 +2,5 @@ var G=Object.defineProperty;var U=(i,e,t)=>e in i?G(i,e,{enumerable:!0,configura
2
2
  import path from ${JSON.stringify(t.path)}
3
3
  try { module.exports = require(path) }
4
4
  catch {}
5
- `})),i.onResolve({filter:/\.node$/,namespace:"node-file"},t=>({path:t.path,namespace:"file"}));let e=i.initialOptions;e.loader=e.loader||{},e.loader[".node"]="file"}}}function D(){return{name:"esbuild-plugin-node-externals",setup(i){i.onResolve({filter:/(^node:)/},e=>({path:e.path.slice(5),external:!0}))}}}import{watch as Q}from"chokidar";import X from"spinnies";function F(i,e,t=null){let s,a=t;return async function(...n){return new Promise(o=>{s&&clearTimeout(s),s=setTimeout(()=>o(a=i(...n)),e),setTimeout(()=>o(a),e)})}}import{parse as Z}from"json5";function W(i){return(i.startsWith("@")?i.slice(i.indexOf("/")+1):i).split("-").map(t=>t.slice(0,1).toUpperCase()+t.slice(1).toLowerCase()).join("")}var l=class{constructor(e){this.options=e}set isWatch(e){this.options.isWatch=e}static async getDeps(e){let t=await j(r(e,"package.json"));return Object.keys({...t.dependencies,...t.devDependencies,...t.peerDependencies})}static async getPlatform(e){let t=r(e,"tsconfig.json");if(await B(t)&&Z(await Y(t,"utf-8")).compilerOptions.lib.some(n=>n.toLowerCase()==="dom"))return"browser";let s=r(e,"package.json");if(await B(s)){let a=await j(s);if(Object.keys(a.devDependencies??{}).includes("@types/node"))return"node"}return"neutral"}static getWatchOptions(e){return{pattern:"src/**/*.ts",options:{cwd:e,ignore:"**/__tests__/**/*"}}}async genDTS(){let e=this.options.base,{pattern:t,options:s}=l.getWatchOptions(this.options.base),a=new z({tsConfigFilePath:r(e,"tsconfig.json"),skipAddingFilesFromTsConfig:!0,compilerOptions:{emitDeclarationOnly:!0,noEmit:!1,incremental:this.options.isWatch}}),n=(await H(t,s)).map(o=>r(e,o));a.addSourceFilesAtPaths(n),await a.emit({emitOnlyDtsFiles:!0})}getBuildCjsOption({deps:e,platform:t}){return{entryPoints:[r(this.options.base,"./src/index.ts")],outfile:r(this.options.base,"./dist/index.js"),format:"cjs",sourcemap:!0,bundle:!0,external:[...l.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildESMOption({deps:e,platform:t}){return{entryPoints:[r(this.options.base,"./src/index.ts")],outfile:r(this.options.base,"./dist/index.esm.js"),format:"esm",sourcemap:!0,bundle:!0,external:[...l.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildIifeOption({platform:e,globalName:t}){return{entryPoints:[r(this.options.base,"./src/index.ts")],outfile:r(this.options.base,"./dist/index.iife.js"),format:"iife",sourcemap:!0,bundle:!0,external:[...l.globalExternal],platform:e,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch,globalName:t}}getBuildCliOption({platform:e}){let t=l.getPlugins(e);return{entryPoints:[r(this.options.base,"./src/bin.ts")],outfile:r(this.options.base,"./dist/bin.js"),format:"cjs",sourcemap:!0,platform:e,bundle:!0,banner:{js:"#!/usr/bin/env node"},external:[...l.globalExternal],plugins:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}static getPlugins(e){let t=[];return e==="node"&&t.push(D(),S()),t}async build(e){await E(e)}async getTasks(){let e=await l.getDeps(this.options.base),t=await l.getPlatform(this.options.base);return{esm:{title:"\u6784\u5EFA esm",task:()=>this.build(this.getBuildESMOption({deps:e,platform:t}))},cjs:{title:"\u6784\u5EFA cjs",task:()=>this.build(this.getBuildCjsOption({deps:e,platform:t}))},iife:{title:"\u6784\u5EFA iife",task:async()=>await this.build(this.getBuildIifeOption({platform:t,globalName:W((await j(r(this.options.base,"./package.json"))).name)}))},cli:{title:"\u6784\u5EFA cli",task:()=>E(this.getBuildCliOption({deps:e,platform:t}))},dts:{title:"\u751F\u6210\u7C7B\u578B\u5B9A\u4E49",task:()=>this.genDTS()}}}static async execTask(e,t){let s=Date.now();e.add(t.title,{text:t.title});try{await t.task(),e.succeed(t.title,{text:`${t.title}: ${Date.now()-s}ms`})}catch{e.fail(t.title,{text:t.title})}}async execTasks(e){let t=async()=>{let n=Date.now(),o=new X;await Promise.all(e.map(async R=>l.execTask(o,R))),console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now()-n}ms`)};if(!this.options.isWatch){await t();return}let{pattern:s,options:a}=l.getWatchOptions(this.options.base);await new Promise((n,o)=>{Q(s,a).on("error",o).on("all",F(t,10))})}},N=l;h(N,"globalExternal",["esbuild","pnpapi","ts-morph"]);import u from"path";import{copy as le,pathExists as q,readdir as pe,readFile as ce,readJSON as me,remove as ue,writeFile as de,writeJSON as fe}from"fs-extra";import{prompt as M}from"enquirer";import{readFile as te,readJson as w,writeFile as se,writeJson as L}from"fs-extra";import f from"path";import{merge as V}from"lodash-es";import ie from"@liuli-util/prettier-standard-config/package.json";import ae from"@liuli-util/eslint-config-ts/package.json";import ne from"@liuli-util/eslint-config-react-ts/package.json";import re from"@liuli-util/commitlint-standard-config/package.json";import{prompt as oe}from"enquirer";import{pathExists as A,readJson as K}from"fs-extra";import b from"path";function $(i,e,t=s=>s){return i.reduce((s,a,n,o)=>s.set(e(a,n,o),t(a,n,o)),new Map)}function I(i,e){return i?i.includes(e)?i:i+" && "+e:e}import _ from"path";function O(i,e){let t=e(i);function s(a){if(a)return i;let n=_.dirname(i);return n===i?null:O(n,e)}return t instanceof Promise?t.then(s):s(t)}var p;(function(n){n.Filter="filter",n.Map="map",n.ForEach="forEach",n.Reduce="reduce",n.FlatMap="flatMap"})(p||(p={}));var y=class{constructor(e,t){this.type=e;this.args=t;this.type=e,this.args=t}};h(y,"Type",p);var c=class{constructor(e){this.arr=e}static reduce(e,t,s){return e.reduce((a,n,o)=>a.then(R=>t(R,n,o)),Promise.resolve(s))}static map(e,t){return Promise.all(e.map((s,a)=>t(s,a)))}static async filter(e,t){let s=[];return await c.map(e,async(a,n)=>{await t(a,n)&&s.push(a)}),s}static async flatMap(e,t){return(await Promise.all(e.map((s,a)=>t(s,a)))).flatMap(s=>s)}static async forEach(e,t){await c.map(e,t)}tasks=[];map(e){return this.tasks.push(new y(p.Map,[e])),this}flatMap(e){return this.tasks.push(new y(p.FlatMap,[e])),this}filter(e){return this.tasks.push(new y(p.Filter,[e])),this}async forEach(e){this.tasks.push(new y(p.Map,[e])),await this}then(e,t){let s=this.value();return s.then(a=>(e&&e(s),a)).catch(a=>{throw t&&t(a),a}),s}async value(){let e=this.arr;for(let t of this.tasks)switch(t.type){case p.Filter:e=await c.filter(e,t.args[0]);break;case p.Map:e=await c.map(e,t.args[0]);break;case p.FlatMap:e=await c.flatMap(e,t.args[0]);break;case p.ForEach:await c.forEach(e,t.args[0]);return;case p.Reduce:return await c.reduce(e,t.args[0],t.args[1])}return e}};async function m(i=process.cwd()){return await A(b.resolve(i,"./package.json"))}async function d(i=process.cwd()){return await m(i)?!!(await K(b.resolve(i,"./package.json"))).workspaces:!1}async function x(i=process.cwd()){return!await m(i)||await d(i)?!1:await O(b.dirname(i),d)!==null}async function k(i,e=process.cwd()){if(!await m(e))return!1;let t=await K(b.resolve(e,"./package.json")),s=new Set(Object.keys({...t.dependencies,...t.devDependencies}));return i.every(a=>s.has(a))}import ee from"path";var P=class{};h(P,"RootPath",ee.resolve(__dirname,".."));async function g(i,e){let t=f.resolve(i,"./package.json");await L(t,V(await w(t),e),{spaces:2})}var J=class{constructor(e){this.base=e}syncConfigs=[{type:"workspaces",handler:async()=>{let e=f.resolve(this.base,"./package.json"),t=f.resolve(this.base,"lerna.json"),s=await w(e),a=await w(t);a.packages=s.workspaces,await L(t,a,{spaces:2})},when:d},{type:"prettier",handler:async()=>{await g(this.base,{prettier:"@liuli-util/prettier-standard-config",devDependencies:{prettier:"^2.3.2","@liuli-util/prettier-standard-config":`^${ie.version}`}})},async when(){return await m()&&(await d()||!await x())}},{type:"commitlint",handler:async()=>{await g(this.base,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"},commitlint:{extends:["@liuli-util/commitlint-standard-config"]},devDependencies:{"@commitlint/cli":"^12.1.4","@liuli-util/commitlint-standard-config":`^${re.version}`}})},async when(){return await m()&&(await d()||!await x())}},{type:"gitignore",handler:async()=>{let e=f.resolve(this.base,".gitignore");await se(e,await te(f.resolve(P.RootPath,"_gitignore"),"utf-8"))}},{type:"eslint-ts",handler:async()=>{await g(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-ts"]},devDependencies:{"@liuli-util/eslint-config-ts":`^${ae.version}`}})},async when(){return await m()&&!await k(["vue"])&&!await k(["react"])}},{type:"eslint-react-ts",handler:async()=>{await g(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-react-ts"]},devDependencies:{"@liuli-util/eslint-config-react-ts":`^${ne.version}`}})},async when(){return await m()&&await k(["react"])}},{type:"jest",handler:async()=>{await g(this.base,{jest:{preset:"ts-jest",testMatch:["<rootDir>/src/**/__tests__/*.test.ts"]},devDependencies:{jest:"^27.4.3","ts-jest":"^27.0.7"}})}},{type:"simplehooks",handler:async()=>{let e=await w(f.resolve(this.base,"./package.json")),t=[];e.prettier&&t.push("prettier --write"),e.eslintConfig&&t.push("eslint --fix");let s={scripts:{postinstall:I(e?.scripts?.postinstall,"npx simple-git-hooks")},"simple-git-hooks":{"pre-commit":"yarn lint-staged"},"lint-staged":{"*.{ts,tsx,js,jsx,css,vue}":[...t,"git add"]},devDependencies:{"simple-git-hooks":"^2.5.1","lint-staged":"^11.1.1"}};e.commitlint&&(s=V(s,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"}})),await g(this.base,s)},async when(){return await m()&&(await d()||!await x())}}];async sync(){let{sync:e}=await w(f.resolve(this.base,"package.json"));if(!e)return;let t=this.syncConfigs.filter(s=>e.includes(s.type));for(let s of t)await s.handler()}async init(){let e=$(await c.filter(this.syncConfigs,async s=>s.when?await s.when():!0),s=>s.type),t=await oe({type:"multiselect",message:"\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879",name:"sync",choices:[...e.keys()]});await g(this.base,{sync:t.sync})}};var v;(function(t){t.Cli="cli",t.Lib="lib"})(v||(v={}));var T=class{async generate(e){if(!e.dest){let{dest:a}=await M({name:"dest",type:"input",message:"\u8BF7\u8F93\u5165\u9879\u76EE\u540D",validate(n){return n.trim()!==""}});e.dest=u.resolve(a)}if(!e.template){let{template:a}=await M({name:"template",type:"select",message:"\u8BF7\u9009\u62E9\u6A21\u677F",choices:[v.Lib,v.Cli]});e.template=a}let t=u.resolve(P.RootPath,`templates/${e.template}`),s=u.resolve(e.dest);if(await q(s)&&(await pe(s)).some(a=>q(a))){let{override:a}=await M({name:"override",type:"confirm",initial:!0,message:"\u76EE\u6807\u4F4D\u7F6E\u4E0D\u662F\u4E00\u4E2A\u7A7A\u76EE\u5F55\uFF0C\u786E\u8BA4\u8981\u8986\u76D6\u4E48\uFF1F"});if(!a)return}if(await ue(s),await le(t,s,{filter:a=>u.basename(a)!=="node_modules"}),await T.updatePackageJSON(s),await T.updateReadme(s),e.initSync){let a=new J(u.resolve(e.dest));await a.init(),await a.sync()}}static async updatePackageJSON(e){let t=u.resolve(e,"package.json");await fe(t,{...await me(t),name:u.basename(e)},{spaces:2})}static async updateReadme(e){let t=u.resolve(e,"README.md"),s=await ce(t,"utf-8");s=s.replace("template",u.basename(e)),await de(t,s)}};export{N as ESBuildProgram,T as GenerateProgram,J as SyncProgram,v as TemplateTypeEnum,g as mergeJson};
5
+ `})),i.onResolve({filter:/\.node$/,namespace:"node-file"},t=>({path:t.path,namespace:"file"}));let e=i.initialOptions;e.loader=e.loader||{},e.loader[".node"]="file"}}}function D(){return{name:"esbuild-plugin-node-externals",setup(i){i.onResolve({filter:/(^node:)/},e=>({path:e.path.slice(5),external:!0}))}}}import{watch as Q}from"chokidar";import X from"spinnies";function F(i,e,t=null){let s,a=t;return async function(...n){return new Promise(o=>{s&&clearTimeout(s),s=setTimeout(()=>o(a=i(...n)),e),setTimeout(()=>o(a),e)})}}import{parse as Z}from"json5";function W(i){return(i.startsWith("@")?i.slice(i.indexOf("/")+1):i).split("-").map(t=>t.slice(0,1).toUpperCase()+t.slice(1).toLowerCase()).join("")}var l=class{constructor(e){this.options=e}set isWatch(e){this.options.isWatch=e}static async getDeps(e){let t=await j(r(e,"package.json"));return Object.keys({...t.dependencies,...t.devDependencies,...t.peerDependencies})}static async getPlatform(e){let t=r(e,"tsconfig.json");if(await B(t)&&Z(await Y(t,"utf-8")).compilerOptions.lib.some(n=>n.toLowerCase()==="dom"))return"browser";let s=r(e,"package.json");if(await B(s)){let a=await j(s);if(Object.keys(a.devDependencies??{}).includes("@types/node"))return"node"}return"neutral"}static getWatchOptions(e){return{pattern:"src/**/*.ts",options:{cwd:e,ignore:"**/__tests__/**/*"}}}async genDTS(){let e=this.options.base,{pattern:t,options:s}=l.getWatchOptions(this.options.base),a=new z({tsConfigFilePath:r(e,"tsconfig.json"),skipAddingFilesFromTsConfig:!0,compilerOptions:{emitDeclarationOnly:!0,noEmit:!1,incremental:this.options.isWatch}}),n=(await H(t,s)).map(o=>r(e,o));a.addSourceFilesAtPaths(n),await a.emit({emitOnlyDtsFiles:!0})}getBuildCjsOption({deps:e,platform:t}){return{entryPoints:[r(this.options.base,"./src/index.ts")],outfile:r(this.options.base,"./dist/index.js"),format:"cjs",sourcemap:!0,bundle:!0,external:[...l.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildESMOption({deps:e,platform:t}){return{entryPoints:[r(this.options.base,"./src/index.ts")],outfile:r(this.options.base,"./dist/index.esm.js"),format:"esm",sourcemap:!0,bundle:!0,external:[...l.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildIifeOption({platform:e,globalName:t}){return{entryPoints:[r(this.options.base,"./src/index.ts")],outfile:r(this.options.base,"./dist/index.iife.js"),format:"iife",sourcemap:!0,bundle:!0,external:[...l.globalExternal],platform:e,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch,globalName:t}}getBuildCliOption({platform:e}){let t=l.getPlugins(e);return{entryPoints:[r(this.options.base,"./src/bin.ts")],outfile:r(this.options.base,"./dist/bin.js"),format:"cjs",sourcemap:!0,platform:e,bundle:!0,banner:{js:"#!/usr/bin/env node"},external:[...l.globalExternal],plugins:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}static getPlugins(e){let t=[];return e==="node"&&t.push(D(),S()),t}async build(e){await E(e)}async getTasks(){let e=await l.getDeps(this.options.base),t=await l.getPlatform(this.options.base);return{esm:{title:"\u6784\u5EFA esm",task:()=>this.build(this.getBuildESMOption({deps:e,platform:t}))},cjs:{title:"\u6784\u5EFA cjs",task:()=>this.build(this.getBuildCjsOption({deps:e,platform:t}))},iife:{title:"\u6784\u5EFA iife",task:async()=>await this.build(this.getBuildIifeOption({platform:t,globalName:W((await j(r(this.options.base,"./package.json"))).name)}))},cli:{title:"\u6784\u5EFA cli",task:()=>E(this.getBuildCliOption({deps:e,platform:t}))},dts:{title:"\u751F\u6210\u7C7B\u578B\u5B9A\u4E49",task:()=>this.genDTS()}}}static async execTask(e,t){let s=Date.now();e.add(t.title,{text:t.title});try{await t.task(),e.succeed(t.title,{text:`${t.title}: ${Date.now()-s}ms`})}catch{e.fail(t.title,{text:t.title})}}async execTasks(e){let t=async()=>{let n=Date.now(),o=new X;await Promise.all(e.map(async R=>l.execTask(o,R))),console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now()-n}ms`)};if(!this.options.isWatch){await t();return}let{pattern:s,options:a}=l.getWatchOptions(this.options.base);await new Promise((n,o)=>{Q(s,a).on("error",o).on("all",F(t,10))})}},N=l;h(N,"globalExternal",["esbuild","pnpapi","ts-morph","ssh2"]);import u from"path";import{copy as le,pathExists as q,readdir as pe,readFile as ce,readJSON as me,remove as ue,writeFile as de,writeJSON as fe}from"fs-extra";import{prompt as M}from"enquirer";import{readFile as te,readJson as w,writeFile as se,writeJson as L}from"fs-extra";import f from"path";import{merge as V}from"lodash-es";import ie from"@liuli-util/prettier-standard-config/package.json";import ae from"@liuli-util/eslint-config-ts/package.json";import ne from"@liuli-util/eslint-config-react-ts/package.json";import re from"@liuli-util/commitlint-standard-config/package.json";import{prompt as oe}from"enquirer";import{pathExists as A,readJson as K}from"fs-extra";import b from"path";function $(i,e,t=s=>s){return i.reduce((s,a,n,o)=>s.set(e(a,n,o),t(a,n,o)),new Map)}function I(i,e){return i?i.includes(e)?i:i+" && "+e:e}import _ from"path";function O(i,e){let t=e(i);function s(a){if(a)return i;let n=_.dirname(i);return n===i?null:O(n,e)}return t instanceof Promise?t.then(s):s(t)}var p;(function(n){n.Filter="filter",n.Map="map",n.ForEach="forEach",n.Reduce="reduce",n.FlatMap="flatMap"})(p||(p={}));var y=class{constructor(e,t){this.type=e;this.args=t;this.type=e,this.args=t}};h(y,"Type",p);var c=class{constructor(e){this.arr=e}static reduce(e,t,s){return e.reduce((a,n,o)=>a.then(R=>t(R,n,o)),Promise.resolve(s))}static map(e,t){return Promise.all(e.map((s,a)=>t(s,a)))}static async filter(e,t){let s=[];return await c.map(e,async(a,n)=>{await t(a,n)&&s.push(a)}),s}static async flatMap(e,t){return(await Promise.all(e.map((s,a)=>t(s,a)))).flatMap(s=>s)}static async forEach(e,t){await c.map(e,t)}tasks=[];map(e){return this.tasks.push(new y(p.Map,[e])),this}flatMap(e){return this.tasks.push(new y(p.FlatMap,[e])),this}filter(e){return this.tasks.push(new y(p.Filter,[e])),this}async forEach(e){this.tasks.push(new y(p.Map,[e])),await this}then(e,t){let s=this.value();return s.then(a=>(e&&e(s),a)).catch(a=>{throw t&&t(a),a}),s}async value(){let e=this.arr;for(let t of this.tasks)switch(t.type){case p.Filter:e=await c.filter(e,t.args[0]);break;case p.Map:e=await c.map(e,t.args[0]);break;case p.FlatMap:e=await c.flatMap(e,t.args[0]);break;case p.ForEach:await c.forEach(e,t.args[0]);return;case p.Reduce:return await c.reduce(e,t.args[0],t.args[1])}return e}};async function m(i=process.cwd()){return await A(b.resolve(i,"./package.json"))}async function d(i=process.cwd()){return await m(i)?!!(await K(b.resolve(i,"./package.json"))).workspaces:!1}async function x(i=process.cwd()){return!await m(i)||await d(i)?!1:await O(b.dirname(i),d)!==null}async function k(i,e=process.cwd()){if(!await m(e))return!1;let t=await K(b.resolve(e,"./package.json")),s=new Set(Object.keys({...t.dependencies,...t.devDependencies}));return i.every(a=>s.has(a))}import ee from"path";var P=class{};h(P,"RootPath",ee.resolve(__dirname,".."));async function g(i,e){let t=f.resolve(i,"./package.json");await L(t,V(await w(t),e),{spaces:2})}var J=class{constructor(e){this.base=e}syncConfigs=[{type:"workspaces",handler:async()=>{let e=f.resolve(this.base,"./package.json"),t=f.resolve(this.base,"lerna.json"),s=await w(e),a=await w(t);a.packages=s.workspaces,await L(t,a,{spaces:2})},when:d},{type:"prettier",handler:async()=>{await g(this.base,{prettier:"@liuli-util/prettier-standard-config",devDependencies:{prettier:"^2.3.2","@liuli-util/prettier-standard-config":`^${ie.version}`}})},async when(){return await m()&&(await d()||!await x())}},{type:"commitlint",handler:async()=>{await g(this.base,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"},commitlint:{extends:["@liuli-util/commitlint-standard-config"]},devDependencies:{"@commitlint/cli":"^12.1.4","@liuli-util/commitlint-standard-config":`^${re.version}`}})},async when(){return await m()&&(await d()||!await x())}},{type:"gitignore",handler:async()=>{let e=f.resolve(this.base,".gitignore");await se(e,await te(f.resolve(P.RootPath,"_gitignore"),"utf-8"))}},{type:"eslint-ts",handler:async()=>{await g(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-ts"]},devDependencies:{"@liuli-util/eslint-config-ts":`^${ae.version}`}})},async when(){return await m()&&!await k(["vue"])&&!await k(["react"])}},{type:"eslint-react-ts",handler:async()=>{await g(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-react-ts"]},devDependencies:{"@liuli-util/eslint-config-react-ts":`^${ne.version}`}})},async when(){return await m()&&await k(["react"])}},{type:"jest",handler:async()=>{await g(this.base,{jest:{preset:"ts-jest",testMatch:["<rootDir>/src/**/__tests__/*.test.ts"]},devDependencies:{jest:"^27.4.3","ts-jest":"^27.0.7"}})}},{type:"simplehooks",handler:async()=>{let e=await w(f.resolve(this.base,"./package.json")),t=[];e.prettier&&t.push("prettier --write"),e.eslintConfig&&t.push("eslint --fix");let s={scripts:{postinstall:I(e?.scripts?.postinstall,"npx simple-git-hooks")},"simple-git-hooks":{"pre-commit":"yarn lint-staged"},"lint-staged":{"*.{ts,tsx,js,jsx,css,vue}":[...t,"git add"]},devDependencies:{"simple-git-hooks":"^2.5.1","lint-staged":"^11.1.1"}};e.commitlint&&(s=V(s,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"}})),await g(this.base,s)},async when(){return await m()&&(await d()||!await x())}}];async sync(){let{sync:e}=await w(f.resolve(this.base,"package.json"));if(!e)return;let t=this.syncConfigs.filter(s=>e.includes(s.type));for(let s of t)await s.handler()}async init(){let e=$(await c.filter(this.syncConfigs,async s=>s.when?await s.when():!0),s=>s.type),t=await oe({type:"multiselect",message:"\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879",name:"sync",choices:[...e.keys()]});await g(this.base,{sync:t.sync})}};var v;(function(t){t.Cli="cli",t.Lib="lib"})(v||(v={}));var T=class{async generate(e){if(!e.dest){let{dest:a}=await M({name:"dest",type:"input",message:"\u8BF7\u8F93\u5165\u9879\u76EE\u540D",validate(n){return n.trim()!==""}});e.dest=u.resolve(a)}if(!e.template){let{template:a}=await M({name:"template",type:"select",message:"\u8BF7\u9009\u62E9\u6A21\u677F",choices:[v.Lib,v.Cli]});e.template=a}let t=u.resolve(P.RootPath,`templates/${e.template}`),s=u.resolve(e.dest);if(await q(s)&&(await pe(s)).some(a=>q(a))){let{override:a}=await M({name:"override",type:"confirm",initial:!0,message:"\u76EE\u6807\u4F4D\u7F6E\u4E0D\u662F\u4E00\u4E2A\u7A7A\u76EE\u5F55\uFF0C\u786E\u8BA4\u8981\u8986\u76D6\u4E48\uFF1F"});if(!a)return}if(await ue(s),await le(t,s,{filter:a=>u.basename(a)!=="node_modules"}),await T.updatePackageJSON(s),await T.updateReadme(s),e.initSync){let a=new J(u.resolve(e.dest));await a.init(),await a.sync()}}static async updatePackageJSON(e){let t=u.resolve(e,"package.json");await fe(t,{...await me(t),name:u.basename(e)},{spaces:2})}static async updateReadme(e){let t=u.resolve(e,"README.md"),s=await ce(t,"utf-8");s=s.replace("template",u.basename(e)),await de(t,s)}};export{N as ESBuildProgram,T as GenerateProgram,J as SyncProgram,v as TemplateTypeEnum,g as mergeJson};
6
6
  //# sourceMappingURL=index.esm.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/commands/esbuild/ESBuildProgram.ts", "../src/commands/esbuild/util/esbuildPlugins.ts", "../src/commands/esbuild/util/debounce.ts", "../src/commands/esbuild/util/getPkgGlobalName.ts", "../src/commands/generate/GenerateProgram.ts", "../src/commands/sync/SyncProgram.ts", "../src/commands/sync/when.ts", "../src/utils/arrayToMap.ts", "../src/utils/appendScript.ts", "../src/utils/findParent.ts", "../src/utils/AsyncArray.ts", "../src/PathUtil.ts"],
4
- "sourcesContent": ["import { build, BuildOptions, Platform, Plugin } from 'esbuild'\r\nimport { pathExists, readFile, readJson } from 'fs-extra'\r\nimport * as path from 'path'\r\nimport { PackageJson } from 'type-fest'\r\nimport { Project } from 'ts-morph'\r\nimport { promise } from 'glob-promise'\r\nimport { IOptions } from 'glob'\r\nimport { nativeNodeModules, nodeExternals } from './util/esbuildPlugins'\r\nimport { watch } from 'chokidar'\r\nimport Spinnies from 'spinnies'\r\nimport { debounce } from './util/debounce'\r\nimport { parse } from 'json5'\r\nimport { getPkgGlobalName } from './util/getPkgGlobalName'\r\n\r\ninterface ESBuildProgramOptions {\r\n base: string\r\n isWatch: boolean\r\n}\r\n\r\ninterface Task {\r\n title: string\r\n task(): Promise<any>\r\n}\r\n\r\nexport type TaskTypeEnum = 'esm' | 'cjs' | 'iife' | 'cli' | 'dts'\r\n\r\nexport class ESBuildProgram {\r\n constructor(private readonly options: ESBuildProgramOptions) {}\r\n\r\n set isWatch(isWatch: boolean) {\r\n this.options.isWatch = isWatch\r\n }\r\n\r\n static readonly globalExternal = ['esbuild', 'pnpapi', 'ts-morph']\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u4F9D\u8D56\r\n */\r\n static async getDeps(base: string): Promise<string[]> {\r\n const json = (await readJson(path.resolve(base, 'package.json'))) as PackageJson\r\n return Object.keys({\r\n ...json.dependencies,\r\n ...json.devDependencies,\r\n ...json.peerDependencies,\r\n })\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u5728\u6A21\u5757\u7684\u7C7B\u578B\r\n */\r\n static async getPlatform(base: string): Promise<Platform> {\r\n const tsconfigPath = path.resolve(base, 'tsconfig.json')\r\n if (await pathExists(tsconfigPath)) {\r\n const tsconfigJson = parse(await readFile(tsconfigPath, 'utf-8'))\r\n if ((tsconfigJson.compilerOptions.lib as string[]).some((lib) => lib.toLowerCase() === 'dom')) {\r\n return 'browser'\r\n }\r\n }\r\n const pkgPath = path.resolve(base, 'package.json')\r\n if (await pathExists(pkgPath)) {\r\n const pkgJson = (await readJson(pkgPath)) as PackageJson\r\n if (Object.keys(pkgJson.devDependencies ?? {}).includes('@types/node')) {\r\n return 'node'\r\n }\r\n }\r\n return 'neutral'\r\n }\r\n static getWatchOptions(base: string): {\r\n pattern: string\r\n options: IOptions\r\n } {\r\n const pattern = 'src/**/*.ts'\r\n const options: Pick<IOptions, 'cwd' | 'ignore'> = {\r\n cwd: base,\r\n ignore: '**/__tests__/**/*',\r\n }\r\n return { pattern, options }\r\n }\r\n /**\r\n * \u751F\u6210\u7C7B\u578B\u5B9A\u4E49\r\n */\r\n async genDTS(): Promise<void> {\r\n const base = this.options.base\r\n const { pattern, options } = ESBuildProgram.getWatchOptions(this.options.base)\r\n const project = new Project({\r\n tsConfigFilePath: path.resolve(base, 'tsconfig.json'),\r\n skipAddingFilesFromTsConfig: true,\r\n compilerOptions: {\r\n emitDeclarationOnly: true,\r\n noEmit: false,\r\n incremental: this.options.isWatch,\r\n },\r\n })\r\n const fileList = (await promise(pattern, options)).map((filePath) => path.resolve(base, filePath))\r\n project.addSourceFilesAtPaths(fileList)\r\n await project.emit({\r\n emitOnlyDtsFiles: true,\r\n })\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA cjs \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n * @param plugins\r\n */\r\n getBuildCjsOption({ deps, platform }: { deps: string[]; platform: Platform }): BuildOptions {\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/index.ts')],\r\n outfile: path.resolve(this.options.base, './dist/index.js'),\r\n format: 'cjs',\r\n sourcemap: true,\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal, ...deps],\r\n platform: platform,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA esm \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n * @param plugins\r\n */\r\n getBuildESMOption({ deps, platform }: { deps: string[]; platform: Platform }): BuildOptions {\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/index.ts')],\r\n outfile: path.resolve(this.options.base, './dist/index.esm.js'),\r\n format: 'esm',\r\n sourcemap: true,\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal, ...deps],\r\n platform: platform,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA iife \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n * @param plugins\r\n */\r\n getBuildIifeOption({ platform, globalName }: { platform: Platform; globalName: string }): BuildOptions {\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/index.ts')],\r\n outfile: path.resolve(this.options.base, './dist/index.iife.js'),\r\n format: 'iife',\r\n sourcemap: true,\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal],\r\n platform: platform,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n globalName,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA cli \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n */\r\n getBuildCliOption({ platform }: { deps: string[]; platform: Platform }): BuildOptions {\r\n const plugins = ESBuildProgram.getPlugins(platform)\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/bin.ts')],\r\n outfile: path.resolve(this.options.base, './dist/bin.js'),\r\n format: 'cjs',\r\n sourcemap: true,\r\n platform: platform,\r\n bundle: true,\r\n banner: {\r\n js: '#!/usr/bin/env node',\r\n },\r\n external: [...ESBuildProgram.globalExternal],\r\n plugins,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n }\r\n }\r\n\r\n static getPlugins(platform: string): Plugin[] {\r\n const plugins: Plugin[] = []\r\n if (platform === 'node') {\r\n plugins.push(nodeExternals(), nativeNodeModules())\r\n }\r\n return plugins\r\n }\r\n\r\n async build(options: BuildOptions): Promise<void> {\r\n // if (this.options.isWatch) {\r\n // options.plugins = [...(options.plugins ?? []), metafile(options.outfile + '.meta.json')]\r\n // }\r\n await build(options)\r\n }\r\n\r\n async getTasks(): Promise<Record<TaskTypeEnum, Task>> {\r\n const deps = await ESBuildProgram.getDeps(this.options.base)\r\n const platform = await ESBuildProgram.getPlatform(this.options.base)\r\n return {\r\n esm: {\r\n title: '\u6784\u5EFA esm',\r\n task: () =>\r\n this.build(\r\n this.getBuildESMOption({\r\n deps: deps,\r\n platform: platform,\r\n }),\r\n ),\r\n },\r\n cjs: {\r\n title: '\u6784\u5EFA cjs',\r\n task: () =>\r\n this.build(\r\n this.getBuildCjsOption({\r\n deps: deps,\r\n platform: platform,\r\n }),\r\n ),\r\n },\r\n iife: {\r\n title: '\u6784\u5EFA iife',\r\n task: async () => {\r\n return await this.build(\r\n this.getBuildIifeOption({\r\n platform: platform,\r\n globalName: getPkgGlobalName(\r\n ((await readJson(path.resolve(this.options.base, './package.json'))) as PackageJson).name!,\r\n ),\r\n }),\r\n )\r\n },\r\n },\r\n cli: {\r\n title: '\u6784\u5EFA cli',\r\n task: () =>\r\n build(\r\n this.getBuildCliOption({\r\n deps: deps,\r\n platform: platform,\r\n }),\r\n ),\r\n },\r\n dts: {\r\n title: '\u751F\u6210\u7C7B\u578B\u5B9A\u4E49',\r\n task: () => this.genDTS(),\r\n },\r\n }\r\n }\r\n\r\n static async execTask(spinnies: Spinnies, task: Task): Promise<void> {\r\n const start = Date.now()\r\n spinnies.add(task.title, { text: task.title })\r\n try {\r\n await task.task()\r\n spinnies.succeed(task.title, {\r\n text: `${task.title}: ${Date.now() - start}ms`,\r\n })\r\n } catch (e) {\r\n spinnies.fail(task.title, { text: task.title })\r\n }\r\n }\r\n async execTasks(tasks: Task[]): Promise<void> {\r\n const run = async () => {\r\n const start = Date.now()\r\n const spinnies = new Spinnies()\r\n await Promise.all(tasks.map(async (task) => ESBuildProgram.execTask(spinnies, task)))\r\n console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now() - start}ms`)\r\n }\r\n\r\n if (!this.options.isWatch) {\r\n await run()\r\n return\r\n }\r\n\r\n const { pattern, options } = ESBuildProgram.getWatchOptions(this.options.base)\r\n await new Promise((resolve, reject) => {\r\n watch(pattern, options).on('error', reject).on('all', debounce(run, 10))\r\n })\r\n }\r\n}\r\n", "import { Plugin } from 'esbuild'\r\nimport { writeJson } from 'fs-extra'\r\n\r\n/**\r\n * \u5904\u7406 nodejs \u539F\u751F\u6A21\u5757\r\n * @link https://github.com/evanw/esbuild/issues/1051#issuecomment-806325487\r\n */\r\nexport function nativeNodeModules(): Plugin {\r\n return {\r\n name: 'native-node-modules',\r\n setup(build) {\r\n // If a \".node\" file is imported within a module in the \"file\" namespace, resolve\r\n // it to an absolute path and put it into the \"node-file\" virtual namespace.\r\n build.onResolve({ filter: /\\.node$/, namespace: 'file' }, (args) => ({\r\n path: require.resolve(args.path, { paths: [args.resolveDir] }),\r\n namespace: 'node-file',\r\n }))\r\n\r\n // Files in the \"node-file\" virtual namespace call \"require()\" on the\r\n // path from esbuild of the \".node\" file in the output directory.\r\n build.onLoad({ filter: /.*/, namespace: 'node-file' }, (args) => ({\r\n contents: `\r\n import path from ${JSON.stringify(args.path)}\r\n try { module.exports = require(path) }\r\n catch {}\r\n `,\r\n }))\r\n\r\n // If a \".node\" file is imported within a module in the \"node-file\" namespace, put\r\n // it in the \"file\" namespace where esbuild's default loading behavior will handle\r\n // it. It is already an absolute path since we resolved it to one above.\r\n build.onResolve({ filter: /\\.node$/, namespace: 'node-file' }, (args) => ({\r\n path: args.path,\r\n namespace: 'file',\r\n }))\r\n\r\n // Tell esbuild's default loading behavior to use the \"file\" loader for\r\n // these \".node\" files.\r\n const opts = build.initialOptions\r\n opts.loader = opts.loader || {}\r\n opts.loader['.node'] = 'file'\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * \u6392\u9664\u548C\u66FF\u6362 node \u5185\u7F6E\u6A21\u5757\r\n */\r\nexport function nodeExternals(): Plugin {\r\n return {\r\n name: 'esbuild-plugin-node-externals',\r\n setup(build) {\r\n build.onResolve({ filter: /(^node:)/ }, (args) => ({\r\n path: args.path.slice(5),\r\n external: true,\r\n }))\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * \u81EA\u52A8\u6392\u9664\u6240\u6709\u4F9D\u8D56\u9879\r\n * golang \u4E0D\u652F\u6301 js \u7684\u4E00\u4E9B\u8BED\u6CD5\uFF0C\u53C2\u8003 https://github.com/evanw/esbuild/issues/1634\r\n */\r\nexport function autoExternal(): Plugin {\r\n return {\r\n name: 'esbuild-plugin-auto-external',\r\n setup(build) {\r\n build.onResolve({ filter: /.*/ }, (args) => {\r\n if (/^\\.{1,2}\\//.test(args.path)) {\r\n return\r\n }\r\n return {\r\n path: args.path,\r\n external: true,\r\n }\r\n })\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * \u751F\u6210 metafile \u7684\u63D2\u4EF6\r\n * @param metafilePath\r\n */\r\nexport function metafile(metafilePath: string): Plugin {\r\n return {\r\n name: 'esbuild-plugin-metafile',\r\n setup(builder) {\r\n builder.onEnd(async (result) => {\r\n await writeJson(metafilePath, result.metafile)\r\n })\r\n },\r\n }\r\n}\r\n", "/**\r\n * \u51FD\u6570\u53BB\u6296\r\n * \u53BB\u6296 (debounce) \u53BB\u6296\u5C31\u662F\u5BF9\u4E8E\u4E00\u5B9A\u65F6\u95F4\u6BB5\u7684\u8FDE\u7EED\u7684\u51FD\u6570\u8C03\u7528\uFF0C\u53EA\u8BA9\u5176\u6267\u884C\u4E00\u6B21\r\n * \u6CE8: \u5305\u88C5\u540E\u7684\u51FD\u6570\u5982\u679C\u4E24\u6B21\u64CD\u4F5C\u95F4\u9694\u5C0F\u4E8E delay \u5219\u4E0D\u4F1A\u88AB\u6267\u884C, \u5982\u679C\u4E00\u76F4\u5728\u64CD\u4F5C\u5C31\u4F1A\u4E00\u76F4\u4E0D\u6267\u884C, \u76F4\u5230\u64CD\u4F5C\u505C\u6B62\u7684\u65F6\u95F4\u5927\u4E8E delay \u6700\u5C0F\u95F4\u9694\u65F6\u95F4\u624D\u4F1A\u6267\u884C\u4E00\u6B21, \u4E0D\u7BA1\u4EFB\u4F55\u65F6\u95F4\u8C03\u7528\u90FD\u9700\u8981\u505C\u6B62\u64CD\u4F5C\u7B49\u5F85\u6700\u5C0F\u5EF6\u8FDF\u65F6\u95F4\r\n * \u5E94\u7528\u573A\u666F\u4E3B\u8981\u5728\u90A3\u4E9B\u8FDE\u7EED\u7684\u64CD\u4F5C, \u4F8B\u5982\u9875\u9762\u6EDA\u52A8\u76D1\u542C, \u5305\u88C5\u540E\u7684\u51FD\u6570\u53EA\u4F1A\u6267\u884C\u6700\u540E\u4E00\u6B21\r\n * \u6CE8: \u8BE5\u51FD\u6570\u7B2C\u4E00\u6B21\u8C03\u7528\u4E00\u5B9A\u4E0D\u4F1A\u6267\u884C\uFF0C\u7B2C\u4E00\u6B21\u4E00\u5B9A\u62FF\u4E0D\u5230\u7F13\u5B58\u503C\uFF0C\u540E\u9762\u7684\u8FDE\u7EED\u8C03\u7528\u90FD\u4F1A\u62FF\u5230\u4E0A\u4E00\u6B21\u7684\u7F13\u5B58\u503C\u3002\u5982\u679C\u9700\u8981\u5728\u7B2C\u4E00\u6B21\u8C03\u7528\u83B7\u53D6\u5230\u7684\u7F13\u5B58\u503C\uFF0C\u5219\u9700\u8981\u4F20\u5165\u7B2C\u4E09\u4E2A\u53C2\u6570 {@param init}\uFF0C\u9ED8\u8BA4\u4E3A {@code undefined} \u7684\u53EF\u9009\u53C2\u6570\r\n * \u6CE8: \u8FD4\u56DE\u51FD\u6570\u7ED3\u679C\u7684\u9AD8\u9636\u51FD\u6570\u9700\u8981\u4F7F\u7528 {@see Proxy} \u5B9E\u73B0\uFF0C\u4EE5\u907F\u514D\u539F\u51FD\u6570\u539F\u578B\u94FE\u4E0A\u7684\u4FE1\u606F\u4E22\u5931\r\n *\r\n * @param fn \u771F\u6B63\u9700\u8981\u6267\u884C\u7684\u64CD\u4F5C\r\n * @param delay \u6700\u5C0F\u5EF6\u8FDF\u65F6\u95F4\uFF0C\u5355\u4F4D\u4E3A ms\r\n * @param init \u521D\u59CB\u7684\u7F13\u5B58\u503C\uFF0C\u4E0D\u586B\u9ED8\u8BA4\u4E3A {@see undefined}\r\n * @return \u5305\u88C5\u540E\u6709\u53BB\u6296\u529F\u80FD\u7684\u51FD\u6570\u3002\u8BE5\u51FD\u6570\u662F\u5F02\u6B65\u7684\uFF0C\u4E0E\u9700\u8981\u5305\u88C5\u7684\u51FD\u6570 {@param fn} \u662F\u5426\u5F02\u6B65\u6CA1\u6709\u592A\u5927\u5173\u8054\r\n */\r\nexport function debounce<\r\n T extends (...args: any[]) => any,\r\n R extends (...args: Parameters<T>) => Promise<ReturnType<T>>,\r\n>(fn: T, delay: number, init: any = null): R {\r\n let flag: number\r\n let result = init\r\n return async function (...args) {\r\n return new Promise((resolve) => {\r\n if (flag) {\r\n clearTimeout(flag as any)\r\n }\r\n flag = setTimeout(() => resolve((result = fn(...args))), delay) as any\r\n setTimeout(() => resolve(result), delay)\r\n })\r\n } as R\r\n}\r\n", "/**\r\n * \u8F6C\u6362 npm \u5305\u540D\u4E3A\u4E00\u4E2A\u5408\u9002\u7684\u5168\u5C40\u53D8\u91CF\u540D\r\n * @param name\r\n */\r\nexport function getPkgGlobalName(name: string): string {\r\n const temp = name.startsWith('@') ? name.slice(name.indexOf('/') + 1) : name\r\n return temp\r\n .split('-')\r\n .map((s) => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())\r\n .join('')\r\n}\r\n", "import path from 'path'\r\nimport { copy, pathExists, readdir, readFile, readJSON, remove, writeFile, writeJSON } from 'fs-extra'\r\nimport { prompt } from 'enquirer'\r\nimport { SyncProgram } from '../sync/SyncProgram'\r\nimport { PathUtil } from '../../PathUtil'\r\n\r\nexport enum TemplateTypeEnum {\r\n Cli = 'cli',\r\n Lib = 'lib',\r\n}\r\n\r\nexport interface GenerateConfig {\r\n template: TemplateTypeEnum\r\n dest: string\r\n initSync?: boolean\r\n}\r\n\r\nexport class GenerateProgram {\r\n /**\r\n * \u751F\u6210\u9879\u76EE\r\n */\r\n async generate(config: GenerateConfig): Promise<void> {\r\n if (!config.dest) {\r\n const { dest } = await prompt<{ dest: string }>({\r\n name: 'dest',\r\n type: 'input',\r\n message: '\u8BF7\u8F93\u5165\u9879\u76EE\u540D',\r\n validate(input: string): boolean {\r\n return input.trim() !== ''\r\n },\r\n })\r\n config.dest = path.resolve(dest)\r\n }\r\n if (!config.template) {\r\n const { template } = await prompt<{ template: TemplateTypeEnum }>({\r\n name: 'template',\r\n type: 'select',\r\n message: '\u8BF7\u9009\u62E9\u6A21\u677F',\r\n choices: [TemplateTypeEnum.Lib, TemplateTypeEnum.Cli] as TemplateTypeEnum[],\r\n })\r\n config.template = template\r\n }\r\n\r\n /*\r\n \u514B\u9686\u9879\u76EE\r\n \u4FEE\u6539\u4E00\u4E9B\u5185\u5BB9\r\n \u5171\u901A\u4FEE\u6539\r\n - \u4FEE\u6539 package.json\uFF0C\u5220\u9664 private\uFF0C\u4FEE\u6539\u540D\u5B57\r\n \u6A21\u677F\u7279\u5B9A\u4FEE\u6539\r\n */\r\n const srcFile = path.resolve(PathUtil.RootPath, `templates/${config.template}`)\r\n const destFile = path.resolve(config.dest)\r\n if ((await pathExists(destFile)) && (await readdir(destFile)).some((file) => pathExists(file))) {\r\n const { override } = await prompt<{\r\n override: boolean\r\n }>({\r\n name: 'override',\r\n type: 'confirm',\r\n initial: true,\r\n message: '\u76EE\u6807\u4F4D\u7F6E\u4E0D\u662F\u4E00\u4E2A\u7A7A\u76EE\u5F55\uFF0C\u786E\u8BA4\u8981\u8986\u76D6\u4E48\uFF1F',\r\n })\r\n if (!override) {\r\n return\r\n }\r\n }\r\n await remove(destFile)\r\n await copy(srcFile, destFile, {\r\n filter: (source) => path.basename(source) !== 'node_modules',\r\n })\r\n await GenerateProgram.updatePackageJSON(destFile)\r\n await GenerateProgram.updateReadme(destFile)\r\n if (config.initSync) {\r\n const syncProgram = new SyncProgram(path.resolve(config.dest))\r\n await syncProgram.init()\r\n await syncProgram.sync()\r\n }\r\n }\r\n\r\n static async updatePackageJSON(destFile: string): Promise<void> {\r\n const pkgPath = path.resolve(destFile, 'package.json')\r\n await writeJSON(\r\n pkgPath,\r\n {\r\n ...(await readJSON(pkgPath)),\r\n name: path.basename(destFile),\r\n },\r\n {\r\n spaces: 2,\r\n },\r\n )\r\n }\r\n\r\n static async updateReadme(destFile: string): Promise<void> {\r\n const readmePath = path.resolve(destFile, 'README.md')\r\n let readmeFile = await readFile(readmePath, 'utf-8')\r\n readmeFile = readmeFile.replace('template', path.basename(destFile))\r\n await writeFile(readmePath, readmeFile)\r\n }\r\n}\r\n", "import { readFile, readJson, writeFile, writeJson } from 'fs-extra'\r\nimport path from 'path'\r\nimport { merge } from 'lodash-es'\r\nimport { PackageJson } from 'type-fest'\r\nimport prettier from '@liuli-util/prettier-standard-config/package.json'\r\nimport eslintTs from '@liuli-util/eslint-config-ts/package.json'\r\nimport eslintReactTs from '@liuli-util/eslint-config-react-ts/package.json'\r\nimport commitlint from '@liuli-util/commitlint-standard-config/package.json'\r\nimport { prompt } from 'enquirer'\r\nimport { isIncludeDep, isNpmPackage, isYarnRoot, isYarnSubModule } from './when'\r\nimport { appendScript, arrayToMap, AsyncArray } from '../../utils'\r\nimport { PathUtil } from '../../PathUtil'\r\n\r\nexport async function mergeJson(base: string, json: object): Promise<void> {\r\n const pkgJsonFilePath = path.resolve(base, './package.json')\r\n await writeJson(pkgJsonFilePath, merge(await readJson(pkgJsonFilePath), json), {\r\n spaces: 2,\r\n })\r\n}\r\n\r\nexport type SyncConfigType =\r\n | 'prettier'\r\n | 'commitlint'\r\n | 'simplehooks'\r\n | 'workspaces'\r\n | 'gitignore'\r\n | 'eslint-ts'\r\n | 'eslint-vue-ts'\r\n | 'eslint-react-ts'\r\n | 'jest'\r\n\r\nexport interface SyncConfig {\r\n type: SyncConfigType\r\n handler(): Promise<void>\r\n when?(): Promise<boolean>\r\n}\r\n\r\nexport class SyncProgram {\r\n constructor(private readonly base: string) {}\r\n private syncConfigs: SyncConfig[] = [\r\n {\r\n type: 'workspaces',\r\n handler: async () => {\r\n const pkgPath = path.resolve(this.base, './package.json')\r\n const lernaPath = path.resolve(this.base, 'lerna.json')\r\n const pkgJson = (await readJson(pkgPath)) as { workspaces: string[] }\r\n const lernaJson = await readJson(lernaPath)\r\n lernaJson.packages = pkgJson.workspaces\r\n await writeJson(lernaPath, lernaJson, {\r\n spaces: 2,\r\n })\r\n },\r\n when: isYarnRoot,\r\n },\r\n {\r\n type: 'prettier',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n prettier: '@liuli-util/prettier-standard-config',\r\n devDependencies: {\r\n prettier: '^2.3.2',\r\n '@liuli-util/prettier-standard-config': `^${prettier.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && ((await isYarnRoot()) || !(await isYarnSubModule()))\r\n },\r\n },\r\n {\r\n type: 'commitlint',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n 'simple-git-hooks': {\r\n 'commit-msg': 'yarn commitlint --edit $1',\r\n },\r\n commitlint: {\r\n extends: ['@liuli-util/commitlint-standard-config'],\r\n },\r\n devDependencies: {\r\n '@commitlint/cli': '^12.1.4',\r\n '@liuli-util/commitlint-standard-config': `^${commitlint.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && ((await isYarnRoot()) || !(await isYarnSubModule()))\r\n },\r\n },\r\n {\r\n type: 'gitignore',\r\n handler: async () => {\r\n const gitignorePath = path.resolve(this.base, '.gitignore')\r\n await writeFile(gitignorePath, await readFile(path.resolve(PathUtil.RootPath, '_gitignore'), 'utf-8'))\r\n },\r\n },\r\n {\r\n type: 'eslint-ts',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n eslintConfig: {\r\n extends: ['@liuli-util/eslint-config-ts'],\r\n },\r\n devDependencies: {\r\n '@liuli-util/eslint-config-ts': `^${eslintTs.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && !(await isIncludeDep(['vue'])) && !(await isIncludeDep(['react']))\r\n },\r\n },\r\n {\r\n type: 'eslint-react-ts',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n eslintConfig: {\r\n extends: ['@liuli-util/eslint-config-react-ts'],\r\n },\r\n devDependencies: {\r\n '@liuli-util/eslint-config-react-ts': `^${eslintReactTs.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && (await isIncludeDep(['react']))\r\n },\r\n },\r\n {\r\n type: 'jest',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n jest: {\r\n preset: 'ts-jest',\r\n testMatch: ['<rootDir>/src/**/__tests__/*.test.ts'],\r\n },\r\n devDependencies: {\r\n jest: '^27.4.3',\r\n 'ts-jest': '^27.0.7',\r\n },\r\n })\r\n },\r\n },\r\n //\u5FC5\u987B\u653E\u5230\u6700\u540E\u4E00\u4E2A\uFF0C\u540E\u7EED\u6839\u636E\u68C0\u6D4B\u7ED3\u679C\u6DFB\u52A0 hooks\r\n {\r\n type: 'simplehooks',\r\n handler: async () => {\r\n const json = await readJson(path.resolve(this.base, './package.json'))\r\n const lintStaged: string[] = []\r\n if (json.prettier) {\r\n lintStaged.push('prettier --write')\r\n }\r\n if (json.eslintConfig) {\r\n lintStaged.push('eslint --fix')\r\n }\r\n let config = {\r\n scripts: {\r\n postinstall: appendScript(json?.scripts?.postinstall, 'npx simple-git-hooks'),\r\n },\r\n 'simple-git-hooks': {\r\n 'pre-commit': 'yarn lint-staged',\r\n },\r\n 'lint-staged': {\r\n '*.{ts,tsx,js,jsx,css,vue}': [...lintStaged, 'git add'],\r\n },\r\n devDependencies: {\r\n 'simple-git-hooks': '^2.5.1',\r\n 'lint-staged': '^11.1.1',\r\n },\r\n }\r\n if (json.commitlint) {\r\n config = merge(config, {\r\n 'simple-git-hooks': {\r\n 'commit-msg': 'yarn commitlint --edit $1',\r\n },\r\n })\r\n }\r\n await mergeJson(this.base, config as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && ((await isYarnRoot()) || !(await isYarnSubModule()))\r\n },\r\n },\r\n ]\r\n\r\n async sync(): Promise<void> {\r\n const { sync } = (await readJson(path.resolve(this.base, 'package.json'))) as {\r\n sync?: SyncConfigType[]\r\n }\r\n if (!sync) {\r\n return\r\n }\r\n const syncConfigs = this.syncConfigs.filter((config) => sync.includes(config.type))\r\n for (const syncConfig of syncConfigs) {\r\n await syncConfig.handler()\r\n }\r\n }\r\n\r\n async init(): Promise<void> {\r\n const configMap = arrayToMap(\r\n await AsyncArray.filter(this.syncConfigs, async (config) => {\r\n if (!config.when) {\r\n return true\r\n }\r\n return await config.when()\r\n }),\r\n (item) => item.type,\r\n )\r\n const res = await prompt<{\r\n sync: string[]\r\n }>({\r\n type: 'multiselect',\r\n message: '\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879',\r\n name: 'sync',\r\n choices: [...configMap.keys()],\r\n })\r\n await mergeJson(this.base, {\r\n sync: res.sync,\r\n })\r\n }\r\n}\r\n", "import { pathExists, readJson } from 'fs-extra'\r\nimport path from 'path'\r\nimport { PackageJson } from 'type-fest'\r\nimport { findParent } from '../../utils'\r\n\r\n/**\r\n * \u5224\u65AD\u662F\u5426\u5305\u542B package.json\r\n * @param cwd\r\n */\r\nexport async function isNpmPackage(\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n return await pathExists(path.resolve(cwd, './package.json'))\r\n}\r\n\r\n/**\r\n * \u5224\u65AD\u662F yarn2 monorepo \u9879\u76EE\r\n * @param cwd\r\n */\r\nexport async function isYarnRoot(\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(\r\n path.resolve(cwd, './package.json'),\r\n )) as PackageJson\r\n return !!json.workspaces\r\n}\r\n\r\n/**\r\n * \u5224\u65AD\u662F yarn2 monorepo \u7684\u5B50\u6A21\u5757\r\n */\r\nexport async function isYarnSubModule(\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n //\u5982\u679C\u662F yarn monorepo \u6839\u6A21\u5757\u5219\u76F4\u63A5\u8FD4\u56DE true\r\n if (await isYarnRoot(cwd)) {\r\n return false\r\n }\r\n return (await findParent(path.dirname(cwd), isYarnRoot)) !== null\r\n}\r\n\r\n/**\r\n * \u662F\u5426\u5305\u542B\u6307\u5B9A\u4F9D\u8D56\r\n * @param deps\r\n * @param cwd\r\n */\r\nexport async function isIncludeDep(\r\n deps: string[],\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(\r\n path.resolve(cwd, './package.json'),\r\n )) as PackageJson\r\n const set = new Set(\r\n Object.keys({ ...json.dependencies, ...json.devDependencies }),\r\n )\r\n return deps.every((dep) => set.has(dep))\r\n}\r\n", "export function arrayToMap<T, K>(\r\n arr: T[],\r\n kFn: (item: T, index: number, arr: T[]) => K,\r\n): Map<K, T>\r\nexport function arrayToMap<T, K, V>(\r\n arr: T[],\r\n kFn: (item: T, index: number, arr: T[]) => K,\r\n vFn: (item: T, index: number, arr: T[]) => V,\r\n): Map<K, V>\r\n/**\r\n * \u5C06\u6570\u7EC4\u6620\u5C04\u4E3A Map\r\n * @param arr \u6570\u7EC4\r\n * @param kFn \u4EA7\u751F Map \u5143\u7D20\u552F\u4E00\u6807\u8BC6\u7684\u51FD\u6570\r\n * @param vFn \u4EA7\u751F Map \u503C\u7684\u51FD\u6570\uFF0C\u9ED8\u8BA4\u4E3A\u8FD4\u56DE\u6570\u7EC4\u7684\u5143\u7D20\r\n * @returns \u6620\u5C04\u4EA7\u751F\u7684 map \u96C6\u5408\r\n */\r\nexport function arrayToMap<T, K, V>(\r\n arr: T[],\r\n kFn: (item: T, index: number, arr: T[]) => K,\r\n vFn: (item: T, index: number, arr: T[]) => V = (v) => v as any,\r\n): Map<K, V> {\r\n return arr.reduce(\r\n (res, item, index, arr) =>\r\n res.set(kFn(item, index, arr), vFn(item, index, arr)),\r\n new Map<K, V>(),\r\n )\r\n}\r\n", "/**\r\n * \u5728\u4E4B\u524D\u7684\u811A\u672C\u4E2D\u8FFD\u52A0\u65B0\u7684\u811A\u672C\r\n * @param oldScript\r\n * @param newScript\r\n */\r\nexport function appendScript(\r\n oldScript: string | undefined,\r\n newScript: string,\r\n): string {\r\n if (!oldScript) {\r\n return newScript\r\n }\r\n if (oldScript.includes(newScript)) {\r\n return oldScript\r\n }\r\n return oldScript + ' && ' + newScript\r\n}\r\n", "import path from 'path'\r\n\r\n/**\r\n * \u5411\u4E0A\u67E5\u627E\u76EE\u5F55\r\n * @param cwd\r\n * @param predicate\r\n */\r\nexport function findParent(\r\n cwd: string,\r\n predicate: (dir: string) => boolean,\r\n): string | null\r\nexport function findParent(\r\n cwd: string,\r\n predicate: (dir: string) => Promise<boolean>,\r\n): Promise<string | null>\r\nexport function findParent<\r\n T extends (dir: string) => boolean | Promise<boolean>,\r\n R extends string | null,\r\n>(\r\n cwd: string,\r\n predicate: T,\r\n): ReturnType<T> extends Promise<any> ? Promise<R> : R {\r\n const res = predicate(cwd)\r\n function f(res: boolean): string | null {\r\n if (res) {\r\n return cwd\r\n }\r\n const parent = path.dirname(cwd)\r\n if (parent === cwd) {\r\n return null\r\n }\r\n return findParent(parent, predicate as any)\r\n }\r\n\r\n return res instanceof Promise ? res.then(f) : (f(res) as any)\r\n}\r\n", "import { IterableElement } from 'type-fest'\r\n\r\nenum ActionTypeEnum {\r\n Filter = 'filter',\r\n Map = 'map',\r\n ForEach = 'forEach',\r\n Reduce = 'reduce',\r\n FlatMap = 'flatMap',\r\n}\r\n\r\nclass Action {\r\n public static Type = ActionTypeEnum\r\n\r\n constructor(\r\n public readonly type: ActionTypeEnum,\r\n public readonly args: any[],\r\n ) {\r\n this.type = type\r\n this.args = args\r\n }\r\n}\r\n\r\n/**\r\n * \u5F02\u6B65\u6570\u7EC4\uFF0C\u652F\u6301\u9759\u6001\u65B9\u6CD5\u548C\u94FE\u5F0F\u8C03\u7528\r\n */\r\nexport class AsyncArray<T> implements PromiseLike<T[]> {\r\n static reduce<T extends any[], R>(\r\n arr: T,\r\n fn: (res: R, item: IterableElement<T>, index: number) => Promise<R>,\r\n res: R,\r\n ): Promise<R> {\r\n return arr.reduce(\r\n (res: Promise<R>, item: IterableElement<T>, index: number) =>\r\n res.then((r) => fn(r, item, index)),\r\n Promise.resolve(res),\r\n )\r\n }\r\n\r\n static map<T, R>(\r\n arr: T[],\r\n fn: (item: T, index: number) => Promise<R>,\r\n ): Promise<R[]> {\r\n return Promise.all(arr.map((item, index) => fn(item, index)))\r\n }\r\n\r\n static async filter<T>(\r\n arr: T[],\r\n fn: (item: T, index: number) => Promise<boolean>,\r\n ): Promise<T[]> {\r\n const res: T[] = []\r\n await AsyncArray.map(arr, async (item, index) => {\r\n if (await fn(item, index)) {\r\n res.push(item)\r\n }\r\n })\r\n return res\r\n }\r\n\r\n static async flatMap<T, R>(\r\n arr: T[],\r\n fn: (item: T, index: number) => Promise<R[]>,\r\n ): Promise<R[]> {\r\n return (\r\n await Promise.all(arr.map((item, index) => fn(item, index)))\r\n ).flatMap((r) => r)\r\n }\r\n\r\n static async forEach<T extends any[]>(\r\n arr: T,\r\n fn: (item: IterableElement<T>, index: number) => Promise<void>,\r\n ): Promise<void> {\r\n await AsyncArray.map(arr, fn)\r\n }\r\n\r\n private tasks: Action[] = []\r\n\r\n constructor(private readonly arr: T[]) {}\r\n\r\n map<R>(fn: (item: T, index: number) => Promise<R>): AsyncArray<R> {\r\n this.tasks.push(new Action(ActionTypeEnum.Map, [fn]))\r\n return this as any\r\n }\r\n\r\n flatMap<R>(fn: (item: T, index: number) => Promise<R[]>): AsyncArray<R> {\r\n this.tasks.push(new Action(ActionTypeEnum.FlatMap, [fn]))\r\n return this as any\r\n }\r\n\r\n filter(fn: (item: T, index: number) => Promise<boolean>): this {\r\n this.tasks.push(new Action(ActionTypeEnum.Filter, [fn]))\r\n return this\r\n }\r\n\r\n async forEach<R>(fn: (item: T, index: number) => Promise<R>): Promise<void> {\r\n this.tasks.push(new Action(ActionTypeEnum.Map, [fn]))\r\n await this\r\n }\r\n\r\n then<TResult1 = T[], TResult2 = never>(\r\n resolve?:\r\n | ((value: T[]) => PromiseLike<TResult1> | TResult1)\r\n | undefined\r\n | null,\r\n reject?:\r\n | ((reason: any) => PromiseLike<TResult2> | TResult2)\r\n | undefined\r\n | null,\r\n ): PromiseLike<TResult1 | TResult2> {\r\n const res = this.value()\r\n res\r\n .then((r) => {\r\n resolve && resolve(res as any)\r\n return r\r\n })\r\n .catch((e) => {\r\n reject && reject(e as any)\r\n throw e\r\n })\r\n return res as any\r\n }\r\n\r\n private async value(): Promise<any> {\r\n let res = this.arr\r\n for (const task of this.tasks) {\r\n switch (task.type) {\r\n case ActionTypeEnum.Filter:\r\n res = await AsyncArray.filter(res, task.args[0])\r\n break\r\n case ActionTypeEnum.Map:\r\n res = await AsyncArray.map(res, task.args[0])\r\n break\r\n case ActionTypeEnum.FlatMap:\r\n res = await AsyncArray.flatMap(res, task.args[0])\r\n break\r\n case ActionTypeEnum.ForEach:\r\n await AsyncArray.forEach(res, task.args[0])\r\n return\r\n case ActionTypeEnum.Reduce:\r\n return await AsyncArray.reduce(res, task.args[0], task.args[1])\r\n }\r\n }\r\n return res\r\n }\r\n}\r\n", "import path from 'path'\r\n\r\nexport class PathUtil {\r\n /**\r\n * \u4ECE\u8FD9\u4E2A\u9879\u76EE\u7684\u6839\u76EE\u5F55\u8BFB\u53D6\uFF0C\u5F00\u53D1\u73AF\u5883\u662F src/../\uFF0C\u8FD0\u884C\u65F6\u5219\u662F dist/../\r\n */\r\n static readonly RootPath = path.resolve(__dirname, '..')\r\n}\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { build, BuildOptions, Platform, Plugin } from 'esbuild'\r\nimport { pathExists, readFile, readJson } from 'fs-extra'\r\nimport * as path from 'path'\r\nimport { PackageJson } from 'type-fest'\r\nimport { Project } from 'ts-morph'\r\nimport { promise } from 'glob-promise'\r\nimport { IOptions } from 'glob'\r\nimport { nativeNodeModules, nodeExternals } from './util/esbuildPlugins'\r\nimport { watch } from 'chokidar'\r\nimport Spinnies from 'spinnies'\r\nimport { debounce } from './util/debounce'\r\nimport { parse } from 'json5'\r\nimport { getPkgGlobalName } from './util/getPkgGlobalName'\r\n\r\ninterface ESBuildProgramOptions {\r\n base: string\r\n isWatch: boolean\r\n}\r\n\r\ninterface Task {\r\n title: string\r\n task(): Promise<any>\r\n}\r\n\r\nexport type TaskTypeEnum = 'esm' | 'cjs' | 'iife' | 'cli' | 'dts'\r\n\r\nexport class ESBuildProgram {\r\n constructor(private readonly options: ESBuildProgramOptions) {}\r\n\r\n set isWatch(isWatch: boolean) {\r\n this.options.isWatch = isWatch\r\n }\r\n\r\n static readonly globalExternal = ['esbuild', 'pnpapi', 'ts-morph', 'ssh2']\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u4F9D\u8D56\r\n */\r\n static async getDeps(base: string): Promise<string[]> {\r\n const json = (await readJson(path.resolve(base, 'package.json'))) as PackageJson\r\n return Object.keys({\r\n ...json.dependencies,\r\n ...json.devDependencies,\r\n ...json.peerDependencies,\r\n })\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u5728\u6A21\u5757\u7684\u7C7B\u578B\r\n */\r\n static async getPlatform(base: string): Promise<Platform> {\r\n const tsconfigPath = path.resolve(base, 'tsconfig.json')\r\n if (await pathExists(tsconfigPath)) {\r\n const tsconfigJson = parse(await readFile(tsconfigPath, 'utf-8'))\r\n if ((tsconfigJson.compilerOptions.lib as string[]).some((lib) => lib.toLowerCase() === 'dom')) {\r\n return 'browser'\r\n }\r\n }\r\n const pkgPath = path.resolve(base, 'package.json')\r\n if (await pathExists(pkgPath)) {\r\n const pkgJson = (await readJson(pkgPath)) as PackageJson\r\n if (Object.keys(pkgJson.devDependencies ?? {}).includes('@types/node')) {\r\n return 'node'\r\n }\r\n }\r\n return 'neutral'\r\n }\r\n static getWatchOptions(base: string): {\r\n pattern: string\r\n options: IOptions\r\n } {\r\n const pattern = 'src/**/*.ts'\r\n const options: Pick<IOptions, 'cwd' | 'ignore'> = {\r\n cwd: base,\r\n ignore: '**/__tests__/**/*',\r\n }\r\n return { pattern, options }\r\n }\r\n /**\r\n * \u751F\u6210\u7C7B\u578B\u5B9A\u4E49\r\n */\r\n async genDTS(): Promise<void> {\r\n const base = this.options.base\r\n const { pattern, options } = ESBuildProgram.getWatchOptions(this.options.base)\r\n const project = new Project({\r\n tsConfigFilePath: path.resolve(base, 'tsconfig.json'),\r\n skipAddingFilesFromTsConfig: true,\r\n compilerOptions: {\r\n emitDeclarationOnly: true,\r\n noEmit: false,\r\n incremental: this.options.isWatch,\r\n },\r\n })\r\n const fileList = (await promise(pattern, options)).map((filePath) => path.resolve(base, filePath))\r\n project.addSourceFilesAtPaths(fileList)\r\n await project.emit({\r\n emitOnlyDtsFiles: true,\r\n })\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA cjs \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n * @param plugins\r\n */\r\n getBuildCjsOption({ deps, platform }: { deps: string[]; platform: Platform }): BuildOptions {\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/index.ts')],\r\n outfile: path.resolve(this.options.base, './dist/index.js'),\r\n format: 'cjs',\r\n sourcemap: true,\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal, ...deps],\r\n platform: platform,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA esm \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n * @param plugins\r\n */\r\n getBuildESMOption({ deps, platform }: { deps: string[]; platform: Platform }): BuildOptions {\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/index.ts')],\r\n outfile: path.resolve(this.options.base, './dist/index.esm.js'),\r\n format: 'esm',\r\n sourcemap: true,\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal, ...deps],\r\n platform: platform,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA iife \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n * @param plugins\r\n */\r\n getBuildIifeOption({ platform, globalName }: { platform: Platform; globalName: string }): BuildOptions {\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/index.ts')],\r\n outfile: path.resolve(this.options.base, './dist/index.iife.js'),\r\n format: 'iife',\r\n sourcemap: true,\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal],\r\n platform: platform,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n globalName,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA cli \u7684\u9009\u9879\r\n * @param deps\r\n * @param platform\r\n */\r\n getBuildCliOption({ platform }: { deps: string[]; platform: Platform }): BuildOptions {\r\n const plugins = ESBuildProgram.getPlugins(platform)\r\n return {\r\n entryPoints: [path.resolve(this.options.base, './src/bin.ts')],\r\n outfile: path.resolve(this.options.base, './dist/bin.js'),\r\n format: 'cjs',\r\n sourcemap: true,\r\n platform: platform,\r\n bundle: true,\r\n banner: {\r\n js: '#!/usr/bin/env node',\r\n },\r\n external: [...ESBuildProgram.globalExternal],\r\n plugins,\r\n minify: !this.options.isWatch,\r\n incremental: this.options.isWatch,\r\n metafile: this.options.isWatch,\r\n }\r\n }\r\n\r\n static getPlugins(platform: string): Plugin[] {\r\n const plugins: Plugin[] = []\r\n if (platform === 'node') {\r\n plugins.push(nodeExternals(), nativeNodeModules())\r\n }\r\n return plugins\r\n }\r\n\r\n async build(options: BuildOptions): Promise<void> {\r\n // if (this.options.isWatch) {\r\n // options.plugins = [...(options.plugins ?? []), metafile(options.outfile + '.meta.json')]\r\n // }\r\n await build(options)\r\n }\r\n\r\n async getTasks(): Promise<Record<TaskTypeEnum, Task>> {\r\n const deps = await ESBuildProgram.getDeps(this.options.base)\r\n const platform = await ESBuildProgram.getPlatform(this.options.base)\r\n return {\r\n esm: {\r\n title: '\u6784\u5EFA esm',\r\n task: () =>\r\n this.build(\r\n this.getBuildESMOption({\r\n deps: deps,\r\n platform: platform,\r\n }),\r\n ),\r\n },\r\n cjs: {\r\n title: '\u6784\u5EFA cjs',\r\n task: () =>\r\n this.build(\r\n this.getBuildCjsOption({\r\n deps: deps,\r\n platform: platform,\r\n }),\r\n ),\r\n },\r\n iife: {\r\n title: '\u6784\u5EFA iife',\r\n task: async () => {\r\n return await this.build(\r\n this.getBuildIifeOption({\r\n platform: platform,\r\n globalName: getPkgGlobalName(\r\n ((await readJson(path.resolve(this.options.base, './package.json'))) as PackageJson).name!,\r\n ),\r\n }),\r\n )\r\n },\r\n },\r\n cli: {\r\n title: '\u6784\u5EFA cli',\r\n task: () =>\r\n build(\r\n this.getBuildCliOption({\r\n deps: deps,\r\n platform: platform,\r\n }),\r\n ),\r\n },\r\n dts: {\r\n title: '\u751F\u6210\u7C7B\u578B\u5B9A\u4E49',\r\n task: () => this.genDTS(),\r\n },\r\n }\r\n }\r\n\r\n static async execTask(spinnies: Spinnies, task: Task): Promise<void> {\r\n const start = Date.now()\r\n spinnies.add(task.title, { text: task.title })\r\n try {\r\n await task.task()\r\n spinnies.succeed(task.title, {\r\n text: `${task.title}: ${Date.now() - start}ms`,\r\n })\r\n } catch (e) {\r\n spinnies.fail(task.title, { text: task.title })\r\n }\r\n }\r\n async execTasks(tasks: Task[]): Promise<void> {\r\n const run = async () => {\r\n const start = Date.now()\r\n const spinnies = new Spinnies()\r\n await Promise.all(tasks.map(async (task) => ESBuildProgram.execTask(spinnies, task)))\r\n console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now() - start}ms`)\r\n }\r\n\r\n if (!this.options.isWatch) {\r\n await run()\r\n return\r\n }\r\n\r\n const { pattern, options } = ESBuildProgram.getWatchOptions(this.options.base)\r\n await new Promise((resolve, reject) => {\r\n watch(pattern, options).on('error', reject).on('all', debounce(run, 10))\r\n })\r\n }\r\n}\r\n", "import { Plugin } from 'esbuild'\r\nimport { writeJson } from 'fs-extra'\r\n\r\n/**\r\n * \u5904\u7406 nodejs \u539F\u751F\u6A21\u5757\r\n * @link https://github.com/evanw/esbuild/issues/1051#issuecomment-806325487\r\n */\r\nexport function nativeNodeModules(): Plugin {\r\n return {\r\n name: 'native-node-modules',\r\n setup(build) {\r\n // If a \".node\" file is imported within a module in the \"file\" namespace, resolve\r\n // it to an absolute path and put it into the \"node-file\" virtual namespace.\r\n build.onResolve({ filter: /\\.node$/, namespace: 'file' }, (args) => ({\r\n path: require.resolve(args.path, { paths: [args.resolveDir] }),\r\n namespace: 'node-file',\r\n }))\r\n\r\n // Files in the \"node-file\" virtual namespace call \"require()\" on the\r\n // path from esbuild of the \".node\" file in the output directory.\r\n build.onLoad({ filter: /.*/, namespace: 'node-file' }, (args) => ({\r\n contents: `\r\n import path from ${JSON.stringify(args.path)}\r\n try { module.exports = require(path) }\r\n catch {}\r\n `,\r\n }))\r\n\r\n // If a \".node\" file is imported within a module in the \"node-file\" namespace, put\r\n // it in the \"file\" namespace where esbuild's default loading behavior will handle\r\n // it. It is already an absolute path since we resolved it to one above.\r\n build.onResolve({ filter: /\\.node$/, namespace: 'node-file' }, (args) => ({\r\n path: args.path,\r\n namespace: 'file',\r\n }))\r\n\r\n // Tell esbuild's default loading behavior to use the \"file\" loader for\r\n // these \".node\" files.\r\n const opts = build.initialOptions\r\n opts.loader = opts.loader || {}\r\n opts.loader['.node'] = 'file'\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * \u6392\u9664\u548C\u66FF\u6362 node \u5185\u7F6E\u6A21\u5757\r\n */\r\nexport function nodeExternals(): Plugin {\r\n return {\r\n name: 'esbuild-plugin-node-externals',\r\n setup(build) {\r\n build.onResolve({ filter: /(^node:)/ }, (args) => ({\r\n path: args.path.slice(5),\r\n external: true,\r\n }))\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * \u81EA\u52A8\u6392\u9664\u6240\u6709\u4F9D\u8D56\u9879\r\n * golang \u4E0D\u652F\u6301 js \u7684\u4E00\u4E9B\u8BED\u6CD5\uFF0C\u53C2\u8003 https://github.com/evanw/esbuild/issues/1634\r\n */\r\nexport function autoExternal(): Plugin {\r\n return {\r\n name: 'esbuild-plugin-auto-external',\r\n setup(build) {\r\n build.onResolve({ filter: /.*/ }, (args) => {\r\n if (/^\\.{1,2}\\//.test(args.path)) {\r\n return\r\n }\r\n return {\r\n path: args.path,\r\n external: true,\r\n }\r\n })\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * \u751F\u6210 metafile \u7684\u63D2\u4EF6\r\n * @param metafilePath\r\n */\r\nexport function metafile(metafilePath: string): Plugin {\r\n return {\r\n name: 'esbuild-plugin-metafile',\r\n setup(builder) {\r\n builder.onEnd(async (result) => {\r\n await writeJson(metafilePath, result.metafile)\r\n })\r\n },\r\n }\r\n}\r\n", "/**\r\n * \u51FD\u6570\u53BB\u6296\r\n * \u53BB\u6296 (debounce) \u53BB\u6296\u5C31\u662F\u5BF9\u4E8E\u4E00\u5B9A\u65F6\u95F4\u6BB5\u7684\u8FDE\u7EED\u7684\u51FD\u6570\u8C03\u7528\uFF0C\u53EA\u8BA9\u5176\u6267\u884C\u4E00\u6B21\r\n * \u6CE8: \u5305\u88C5\u540E\u7684\u51FD\u6570\u5982\u679C\u4E24\u6B21\u64CD\u4F5C\u95F4\u9694\u5C0F\u4E8E delay \u5219\u4E0D\u4F1A\u88AB\u6267\u884C, \u5982\u679C\u4E00\u76F4\u5728\u64CD\u4F5C\u5C31\u4F1A\u4E00\u76F4\u4E0D\u6267\u884C, \u76F4\u5230\u64CD\u4F5C\u505C\u6B62\u7684\u65F6\u95F4\u5927\u4E8E delay \u6700\u5C0F\u95F4\u9694\u65F6\u95F4\u624D\u4F1A\u6267\u884C\u4E00\u6B21, \u4E0D\u7BA1\u4EFB\u4F55\u65F6\u95F4\u8C03\u7528\u90FD\u9700\u8981\u505C\u6B62\u64CD\u4F5C\u7B49\u5F85\u6700\u5C0F\u5EF6\u8FDF\u65F6\u95F4\r\n * \u5E94\u7528\u573A\u666F\u4E3B\u8981\u5728\u90A3\u4E9B\u8FDE\u7EED\u7684\u64CD\u4F5C, \u4F8B\u5982\u9875\u9762\u6EDA\u52A8\u76D1\u542C, \u5305\u88C5\u540E\u7684\u51FD\u6570\u53EA\u4F1A\u6267\u884C\u6700\u540E\u4E00\u6B21\r\n * \u6CE8: \u8BE5\u51FD\u6570\u7B2C\u4E00\u6B21\u8C03\u7528\u4E00\u5B9A\u4E0D\u4F1A\u6267\u884C\uFF0C\u7B2C\u4E00\u6B21\u4E00\u5B9A\u62FF\u4E0D\u5230\u7F13\u5B58\u503C\uFF0C\u540E\u9762\u7684\u8FDE\u7EED\u8C03\u7528\u90FD\u4F1A\u62FF\u5230\u4E0A\u4E00\u6B21\u7684\u7F13\u5B58\u503C\u3002\u5982\u679C\u9700\u8981\u5728\u7B2C\u4E00\u6B21\u8C03\u7528\u83B7\u53D6\u5230\u7684\u7F13\u5B58\u503C\uFF0C\u5219\u9700\u8981\u4F20\u5165\u7B2C\u4E09\u4E2A\u53C2\u6570 {@param init}\uFF0C\u9ED8\u8BA4\u4E3A {@code undefined} \u7684\u53EF\u9009\u53C2\u6570\r\n * \u6CE8: \u8FD4\u56DE\u51FD\u6570\u7ED3\u679C\u7684\u9AD8\u9636\u51FD\u6570\u9700\u8981\u4F7F\u7528 {@see Proxy} \u5B9E\u73B0\uFF0C\u4EE5\u907F\u514D\u539F\u51FD\u6570\u539F\u578B\u94FE\u4E0A\u7684\u4FE1\u606F\u4E22\u5931\r\n *\r\n * @param fn \u771F\u6B63\u9700\u8981\u6267\u884C\u7684\u64CD\u4F5C\r\n * @param delay \u6700\u5C0F\u5EF6\u8FDF\u65F6\u95F4\uFF0C\u5355\u4F4D\u4E3A ms\r\n * @param init \u521D\u59CB\u7684\u7F13\u5B58\u503C\uFF0C\u4E0D\u586B\u9ED8\u8BA4\u4E3A {@see undefined}\r\n * @return \u5305\u88C5\u540E\u6709\u53BB\u6296\u529F\u80FD\u7684\u51FD\u6570\u3002\u8BE5\u51FD\u6570\u662F\u5F02\u6B65\u7684\uFF0C\u4E0E\u9700\u8981\u5305\u88C5\u7684\u51FD\u6570 {@param fn} \u662F\u5426\u5F02\u6B65\u6CA1\u6709\u592A\u5927\u5173\u8054\r\n */\r\nexport function debounce<\r\n T extends (...args: any[]) => any,\r\n R extends (...args: Parameters<T>) => Promise<ReturnType<T>>,\r\n>(fn: T, delay: number, init: any = null): R {\r\n let flag: number\r\n let result = init\r\n return async function (...args) {\r\n return new Promise((resolve) => {\r\n if (flag) {\r\n clearTimeout(flag as any)\r\n }\r\n flag = setTimeout(() => resolve((result = fn(...args))), delay) as any\r\n setTimeout(() => resolve(result), delay)\r\n })\r\n } as R\r\n}\r\n", "/**\r\n * \u8F6C\u6362 npm \u5305\u540D\u4E3A\u4E00\u4E2A\u5408\u9002\u7684\u5168\u5C40\u53D8\u91CF\u540D\r\n * @param name\r\n */\r\nexport function getPkgGlobalName(name: string): string {\r\n const temp = name.startsWith('@') ? name.slice(name.indexOf('/') + 1) : name\r\n return temp\r\n .split('-')\r\n .map((s) => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())\r\n .join('')\r\n}\r\n", "import path from 'path'\r\nimport { copy, pathExists, readdir, readFile, readJSON, remove, writeFile, writeJSON } from 'fs-extra'\r\nimport { prompt } from 'enquirer'\r\nimport { SyncProgram } from '../sync/SyncProgram'\r\nimport { PathUtil } from '../../PathUtil'\r\n\r\nexport enum TemplateTypeEnum {\r\n Cli = 'cli',\r\n Lib = 'lib',\r\n}\r\n\r\nexport interface GenerateConfig {\r\n template: TemplateTypeEnum\r\n dest: string\r\n initSync?: boolean\r\n}\r\n\r\nexport class GenerateProgram {\r\n /**\r\n * \u751F\u6210\u9879\u76EE\r\n */\r\n async generate(config: GenerateConfig): Promise<void> {\r\n if (!config.dest) {\r\n const { dest } = await prompt<{ dest: string }>({\r\n name: 'dest',\r\n type: 'input',\r\n message: '\u8BF7\u8F93\u5165\u9879\u76EE\u540D',\r\n validate(input: string): boolean {\r\n return input.trim() !== ''\r\n },\r\n })\r\n config.dest = path.resolve(dest)\r\n }\r\n if (!config.template) {\r\n const { template } = await prompt<{ template: TemplateTypeEnum }>({\r\n name: 'template',\r\n type: 'select',\r\n message: '\u8BF7\u9009\u62E9\u6A21\u677F',\r\n choices: [TemplateTypeEnum.Lib, TemplateTypeEnum.Cli] as TemplateTypeEnum[],\r\n })\r\n config.template = template\r\n }\r\n\r\n /*\r\n \u514B\u9686\u9879\u76EE\r\n \u4FEE\u6539\u4E00\u4E9B\u5185\u5BB9\r\n \u5171\u901A\u4FEE\u6539\r\n - \u4FEE\u6539 package.json\uFF0C\u5220\u9664 private\uFF0C\u4FEE\u6539\u540D\u5B57\r\n \u6A21\u677F\u7279\u5B9A\u4FEE\u6539\r\n */\r\n const srcFile = path.resolve(PathUtil.RootPath, `templates/${config.template}`)\r\n const destFile = path.resolve(config.dest)\r\n if ((await pathExists(destFile)) && (await readdir(destFile)).some((file) => pathExists(file))) {\r\n const { override } = await prompt<{\r\n override: boolean\r\n }>({\r\n name: 'override',\r\n type: 'confirm',\r\n initial: true,\r\n message: '\u76EE\u6807\u4F4D\u7F6E\u4E0D\u662F\u4E00\u4E2A\u7A7A\u76EE\u5F55\uFF0C\u786E\u8BA4\u8981\u8986\u76D6\u4E48\uFF1F',\r\n })\r\n if (!override) {\r\n return\r\n }\r\n }\r\n await remove(destFile)\r\n await copy(srcFile, destFile, {\r\n filter: (source) => path.basename(source) !== 'node_modules',\r\n })\r\n await GenerateProgram.updatePackageJSON(destFile)\r\n await GenerateProgram.updateReadme(destFile)\r\n if (config.initSync) {\r\n const syncProgram = new SyncProgram(path.resolve(config.dest))\r\n await syncProgram.init()\r\n await syncProgram.sync()\r\n }\r\n }\r\n\r\n static async updatePackageJSON(destFile: string): Promise<void> {\r\n const pkgPath = path.resolve(destFile, 'package.json')\r\n await writeJSON(\r\n pkgPath,\r\n {\r\n ...(await readJSON(pkgPath)),\r\n name: path.basename(destFile),\r\n },\r\n {\r\n spaces: 2,\r\n },\r\n )\r\n }\r\n\r\n static async updateReadme(destFile: string): Promise<void> {\r\n const readmePath = path.resolve(destFile, 'README.md')\r\n let readmeFile = await readFile(readmePath, 'utf-8')\r\n readmeFile = readmeFile.replace('template', path.basename(destFile))\r\n await writeFile(readmePath, readmeFile)\r\n }\r\n}\r\n", "import { readFile, readJson, writeFile, writeJson } from 'fs-extra'\r\nimport path from 'path'\r\nimport { merge } from 'lodash-es'\r\nimport { PackageJson } from 'type-fest'\r\nimport prettier from '@liuli-util/prettier-standard-config/package.json'\r\nimport eslintTs from '@liuli-util/eslint-config-ts/package.json'\r\nimport eslintReactTs from '@liuli-util/eslint-config-react-ts/package.json'\r\nimport commitlint from '@liuli-util/commitlint-standard-config/package.json'\r\nimport { prompt } from 'enquirer'\r\nimport { isIncludeDep, isNpmPackage, isYarnRoot, isYarnSubModule } from './when'\r\nimport { appendScript, arrayToMap, AsyncArray } from '../../utils'\r\nimport { PathUtil } from '../../PathUtil'\r\n\r\nexport async function mergeJson(base: string, json: object): Promise<void> {\r\n const pkgJsonFilePath = path.resolve(base, './package.json')\r\n await writeJson(pkgJsonFilePath, merge(await readJson(pkgJsonFilePath), json), {\r\n spaces: 2,\r\n })\r\n}\r\n\r\nexport type SyncConfigType =\r\n | 'prettier'\r\n | 'commitlint'\r\n | 'simplehooks'\r\n | 'workspaces'\r\n | 'gitignore'\r\n | 'eslint-ts'\r\n | 'eslint-vue-ts'\r\n | 'eslint-react-ts'\r\n | 'jest'\r\n\r\nexport interface SyncConfig {\r\n type: SyncConfigType\r\n handler(): Promise<void>\r\n when?(): Promise<boolean>\r\n}\r\n\r\nexport class SyncProgram {\r\n constructor(private readonly base: string) {}\r\n private syncConfigs: SyncConfig[] = [\r\n {\r\n type: 'workspaces',\r\n handler: async () => {\r\n const pkgPath = path.resolve(this.base, './package.json')\r\n const lernaPath = path.resolve(this.base, 'lerna.json')\r\n const pkgJson = (await readJson(pkgPath)) as { workspaces: string[] }\r\n const lernaJson = await readJson(lernaPath)\r\n lernaJson.packages = pkgJson.workspaces\r\n await writeJson(lernaPath, lernaJson, {\r\n spaces: 2,\r\n })\r\n },\r\n when: isYarnRoot,\r\n },\r\n {\r\n type: 'prettier',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n prettier: '@liuli-util/prettier-standard-config',\r\n devDependencies: {\r\n prettier: '^2.3.2',\r\n '@liuli-util/prettier-standard-config': `^${prettier.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && ((await isYarnRoot()) || !(await isYarnSubModule()))\r\n },\r\n },\r\n {\r\n type: 'commitlint',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n 'simple-git-hooks': {\r\n 'commit-msg': 'yarn commitlint --edit $1',\r\n },\r\n commitlint: {\r\n extends: ['@liuli-util/commitlint-standard-config'],\r\n },\r\n devDependencies: {\r\n '@commitlint/cli': '^12.1.4',\r\n '@liuli-util/commitlint-standard-config': `^${commitlint.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && ((await isYarnRoot()) || !(await isYarnSubModule()))\r\n },\r\n },\r\n {\r\n type: 'gitignore',\r\n handler: async () => {\r\n const gitignorePath = path.resolve(this.base, '.gitignore')\r\n await writeFile(gitignorePath, await readFile(path.resolve(PathUtil.RootPath, '_gitignore'), 'utf-8'))\r\n },\r\n },\r\n {\r\n type: 'eslint-ts',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n eslintConfig: {\r\n extends: ['@liuli-util/eslint-config-ts'],\r\n },\r\n devDependencies: {\r\n '@liuli-util/eslint-config-ts': `^${eslintTs.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && !(await isIncludeDep(['vue'])) && !(await isIncludeDep(['react']))\r\n },\r\n },\r\n {\r\n type: 'eslint-react-ts',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n eslintConfig: {\r\n extends: ['@liuli-util/eslint-config-react-ts'],\r\n },\r\n devDependencies: {\r\n '@liuli-util/eslint-config-react-ts': `^${eslintReactTs.version}`,\r\n },\r\n } as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && (await isIncludeDep(['react']))\r\n },\r\n },\r\n {\r\n type: 'jest',\r\n handler: async () => {\r\n await mergeJson(this.base, {\r\n jest: {\r\n preset: 'ts-jest',\r\n testMatch: ['<rootDir>/src/**/__tests__/*.test.ts'],\r\n },\r\n devDependencies: {\r\n jest: '^27.4.3',\r\n 'ts-jest': '^27.0.7',\r\n },\r\n })\r\n },\r\n },\r\n //\u5FC5\u987B\u653E\u5230\u6700\u540E\u4E00\u4E2A\uFF0C\u540E\u7EED\u6839\u636E\u68C0\u6D4B\u7ED3\u679C\u6DFB\u52A0 hooks\r\n {\r\n type: 'simplehooks',\r\n handler: async () => {\r\n const json = await readJson(path.resolve(this.base, './package.json'))\r\n const lintStaged: string[] = []\r\n if (json.prettier) {\r\n lintStaged.push('prettier --write')\r\n }\r\n if (json.eslintConfig) {\r\n lintStaged.push('eslint --fix')\r\n }\r\n let config = {\r\n scripts: {\r\n postinstall: appendScript(json?.scripts?.postinstall, 'npx simple-git-hooks'),\r\n },\r\n 'simple-git-hooks': {\r\n 'pre-commit': 'yarn lint-staged',\r\n },\r\n 'lint-staged': {\r\n '*.{ts,tsx,js,jsx,css,vue}': [...lintStaged, 'git add'],\r\n },\r\n devDependencies: {\r\n 'simple-git-hooks': '^2.5.1',\r\n 'lint-staged': '^11.1.1',\r\n },\r\n }\r\n if (json.commitlint) {\r\n config = merge(config, {\r\n 'simple-git-hooks': {\r\n 'commit-msg': 'yarn commitlint --edit $1',\r\n },\r\n })\r\n }\r\n await mergeJson(this.base, config as PackageJson)\r\n },\r\n async when(): Promise<boolean> {\r\n return (await isNpmPackage()) && ((await isYarnRoot()) || !(await isYarnSubModule()))\r\n },\r\n },\r\n ]\r\n\r\n async sync(): Promise<void> {\r\n const { sync } = (await readJson(path.resolve(this.base, 'package.json'))) as {\r\n sync?: SyncConfigType[]\r\n }\r\n if (!sync) {\r\n return\r\n }\r\n const syncConfigs = this.syncConfigs.filter((config) => sync.includes(config.type))\r\n for (const syncConfig of syncConfigs) {\r\n await syncConfig.handler()\r\n }\r\n }\r\n\r\n async init(): Promise<void> {\r\n const configMap = arrayToMap(\r\n await AsyncArray.filter(this.syncConfigs, async (config) => {\r\n if (!config.when) {\r\n return true\r\n }\r\n return await config.when()\r\n }),\r\n (item) => item.type,\r\n )\r\n const res = await prompt<{\r\n sync: string[]\r\n }>({\r\n type: 'multiselect',\r\n message: '\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879',\r\n name: 'sync',\r\n choices: [...configMap.keys()],\r\n })\r\n await mergeJson(this.base, {\r\n sync: res.sync,\r\n })\r\n }\r\n}\r\n", "import { pathExists, readJson } from 'fs-extra'\r\nimport path from 'path'\r\nimport { PackageJson } from 'type-fest'\r\nimport { findParent } from '../../utils'\r\n\r\n/**\r\n * \u5224\u65AD\u662F\u5426\u5305\u542B package.json\r\n * @param cwd\r\n */\r\nexport async function isNpmPackage(\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n return await pathExists(path.resolve(cwd, './package.json'))\r\n}\r\n\r\n/**\r\n * \u5224\u65AD\u662F yarn2 monorepo \u9879\u76EE\r\n * @param cwd\r\n */\r\nexport async function isYarnRoot(\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(\r\n path.resolve(cwd, './package.json'),\r\n )) as PackageJson\r\n return !!json.workspaces\r\n}\r\n\r\n/**\r\n * \u5224\u65AD\u662F yarn2 monorepo \u7684\u5B50\u6A21\u5757\r\n */\r\nexport async function isYarnSubModule(\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n //\u5982\u679C\u662F yarn monorepo \u6839\u6A21\u5757\u5219\u76F4\u63A5\u8FD4\u56DE true\r\n if (await isYarnRoot(cwd)) {\r\n return false\r\n }\r\n return (await findParent(path.dirname(cwd), isYarnRoot)) !== null\r\n}\r\n\r\n/**\r\n * \u662F\u5426\u5305\u542B\u6307\u5B9A\u4F9D\u8D56\r\n * @param deps\r\n * @param cwd\r\n */\r\nexport async function isIncludeDep(\r\n deps: string[],\r\n cwd: string = process.cwd(),\r\n): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(\r\n path.resolve(cwd, './package.json'),\r\n )) as PackageJson\r\n const set = new Set(\r\n Object.keys({ ...json.dependencies, ...json.devDependencies }),\r\n )\r\n return deps.every((dep) => set.has(dep))\r\n}\r\n", "export function arrayToMap<T, K>(\r\n arr: T[],\r\n kFn: (item: T, index: number, arr: T[]) => K,\r\n): Map<K, T>\r\nexport function arrayToMap<T, K, V>(\r\n arr: T[],\r\n kFn: (item: T, index: number, arr: T[]) => K,\r\n vFn: (item: T, index: number, arr: T[]) => V,\r\n): Map<K, V>\r\n/**\r\n * \u5C06\u6570\u7EC4\u6620\u5C04\u4E3A Map\r\n * @param arr \u6570\u7EC4\r\n * @param kFn \u4EA7\u751F Map \u5143\u7D20\u552F\u4E00\u6807\u8BC6\u7684\u51FD\u6570\r\n * @param vFn \u4EA7\u751F Map \u503C\u7684\u51FD\u6570\uFF0C\u9ED8\u8BA4\u4E3A\u8FD4\u56DE\u6570\u7EC4\u7684\u5143\u7D20\r\n * @returns \u6620\u5C04\u4EA7\u751F\u7684 map \u96C6\u5408\r\n */\r\nexport function arrayToMap<T, K, V>(\r\n arr: T[],\r\n kFn: (item: T, index: number, arr: T[]) => K,\r\n vFn: (item: T, index: number, arr: T[]) => V = (v) => v as any,\r\n): Map<K, V> {\r\n return arr.reduce(\r\n (res, item, index, arr) =>\r\n res.set(kFn(item, index, arr), vFn(item, index, arr)),\r\n new Map<K, V>(),\r\n )\r\n}\r\n", "/**\r\n * \u5728\u4E4B\u524D\u7684\u811A\u672C\u4E2D\u8FFD\u52A0\u65B0\u7684\u811A\u672C\r\n * @param oldScript\r\n * @param newScript\r\n */\r\nexport function appendScript(\r\n oldScript: string | undefined,\r\n newScript: string,\r\n): string {\r\n if (!oldScript) {\r\n return newScript\r\n }\r\n if (oldScript.includes(newScript)) {\r\n return oldScript\r\n }\r\n return oldScript + ' && ' + newScript\r\n}\r\n", "import path from 'path'\r\n\r\n/**\r\n * \u5411\u4E0A\u67E5\u627E\u76EE\u5F55\r\n * @param cwd\r\n * @param predicate\r\n */\r\nexport function findParent(\r\n cwd: string,\r\n predicate: (dir: string) => boolean,\r\n): string | null\r\nexport function findParent(\r\n cwd: string,\r\n predicate: (dir: string) => Promise<boolean>,\r\n): Promise<string | null>\r\nexport function findParent<\r\n T extends (dir: string) => boolean | Promise<boolean>,\r\n R extends string | null,\r\n>(\r\n cwd: string,\r\n predicate: T,\r\n): ReturnType<T> extends Promise<any> ? Promise<R> : R {\r\n const res = predicate(cwd)\r\n function f(res: boolean): string | null {\r\n if (res) {\r\n return cwd\r\n }\r\n const parent = path.dirname(cwd)\r\n if (parent === cwd) {\r\n return null\r\n }\r\n return findParent(parent, predicate as any)\r\n }\r\n\r\n return res instanceof Promise ? res.then(f) : (f(res) as any)\r\n}\r\n", "import { IterableElement } from 'type-fest'\r\n\r\nenum ActionTypeEnum {\r\n Filter = 'filter',\r\n Map = 'map',\r\n ForEach = 'forEach',\r\n Reduce = 'reduce',\r\n FlatMap = 'flatMap',\r\n}\r\n\r\nclass Action {\r\n public static Type = ActionTypeEnum\r\n\r\n constructor(\r\n public readonly type: ActionTypeEnum,\r\n public readonly args: any[],\r\n ) {\r\n this.type = type\r\n this.args = args\r\n }\r\n}\r\n\r\n/**\r\n * \u5F02\u6B65\u6570\u7EC4\uFF0C\u652F\u6301\u9759\u6001\u65B9\u6CD5\u548C\u94FE\u5F0F\u8C03\u7528\r\n */\r\nexport class AsyncArray<T> implements PromiseLike<T[]> {\r\n static reduce<T extends any[], R>(\r\n arr: T,\r\n fn: (res: R, item: IterableElement<T>, index: number) => Promise<R>,\r\n res: R,\r\n ): Promise<R> {\r\n return arr.reduce(\r\n (res: Promise<R>, item: IterableElement<T>, index: number) =>\r\n res.then((r) => fn(r, item, index)),\r\n Promise.resolve(res),\r\n )\r\n }\r\n\r\n static map<T, R>(\r\n arr: T[],\r\n fn: (item: T, index: number) => Promise<R>,\r\n ): Promise<R[]> {\r\n return Promise.all(arr.map((item, index) => fn(item, index)))\r\n }\r\n\r\n static async filter<T>(\r\n arr: T[],\r\n fn: (item: T, index: number) => Promise<boolean>,\r\n ): Promise<T[]> {\r\n const res: T[] = []\r\n await AsyncArray.map(arr, async (item, index) => {\r\n if (await fn(item, index)) {\r\n res.push(item)\r\n }\r\n })\r\n return res\r\n }\r\n\r\n static async flatMap<T, R>(\r\n arr: T[],\r\n fn: (item: T, index: number) => Promise<R[]>,\r\n ): Promise<R[]> {\r\n return (\r\n await Promise.all(arr.map((item, index) => fn(item, index)))\r\n ).flatMap((r) => r)\r\n }\r\n\r\n static async forEach<T extends any[]>(\r\n arr: T,\r\n fn: (item: IterableElement<T>, index: number) => Promise<void>,\r\n ): Promise<void> {\r\n await AsyncArray.map(arr, fn)\r\n }\r\n\r\n private tasks: Action[] = []\r\n\r\n constructor(private readonly arr: T[]) {}\r\n\r\n map<R>(fn: (item: T, index: number) => Promise<R>): AsyncArray<R> {\r\n this.tasks.push(new Action(ActionTypeEnum.Map, [fn]))\r\n return this as any\r\n }\r\n\r\n flatMap<R>(fn: (item: T, index: number) => Promise<R[]>): AsyncArray<R> {\r\n this.tasks.push(new Action(ActionTypeEnum.FlatMap, [fn]))\r\n return this as any\r\n }\r\n\r\n filter(fn: (item: T, index: number) => Promise<boolean>): this {\r\n this.tasks.push(new Action(ActionTypeEnum.Filter, [fn]))\r\n return this\r\n }\r\n\r\n async forEach<R>(fn: (item: T, index: number) => Promise<R>): Promise<void> {\r\n this.tasks.push(new Action(ActionTypeEnum.Map, [fn]))\r\n await this\r\n }\r\n\r\n then<TResult1 = T[], TResult2 = never>(\r\n resolve?:\r\n | ((value: T[]) => PromiseLike<TResult1> | TResult1)\r\n | undefined\r\n | null,\r\n reject?:\r\n | ((reason: any) => PromiseLike<TResult2> | TResult2)\r\n | undefined\r\n | null,\r\n ): PromiseLike<TResult1 | TResult2> {\r\n const res = this.value()\r\n res\r\n .then((r) => {\r\n resolve && resolve(res as any)\r\n return r\r\n })\r\n .catch((e) => {\r\n reject && reject(e as any)\r\n throw e\r\n })\r\n return res as any\r\n }\r\n\r\n private async value(): Promise<any> {\r\n let res = this.arr\r\n for (const task of this.tasks) {\r\n switch (task.type) {\r\n case ActionTypeEnum.Filter:\r\n res = await AsyncArray.filter(res, task.args[0])\r\n break\r\n case ActionTypeEnum.Map:\r\n res = await AsyncArray.map(res, task.args[0])\r\n break\r\n case ActionTypeEnum.FlatMap:\r\n res = await AsyncArray.flatMap(res, task.args[0])\r\n break\r\n case ActionTypeEnum.ForEach:\r\n await AsyncArray.forEach(res, task.args[0])\r\n return\r\n case ActionTypeEnum.Reduce:\r\n return await AsyncArray.reduce(res, task.args[0], task.args[1])\r\n }\r\n }\r\n return res\r\n }\r\n}\r\n", "import path from 'path'\r\n\r\nexport class PathUtil {\r\n /**\r\n * \u4ECE\u8FD9\u4E2A\u9879\u76EE\u7684\u6839\u76EE\u5F55\u8BFB\u53D6\uFF0C\u5F00\u53D1\u73AF\u5883\u662F src/../\uFF0C\u8FD0\u884C\u65F6\u5219\u662F dist/../\r\n */\r\n static readonly RootPath = path.resolve(__dirname, '..')\r\n}\r\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -2,5 +2,5 @@ var se=Object.create;var v=Object.defineProperty;var ie=Object.getOwnPropertyDes
2
2
  import path from ${JSON.stringify(t.path)}
3
3
  try { module.exports = require(path) }
4
4
  catch {}
5
- `})),i.onResolve({filter:/\.node$/,namespace:"node-file"},t=>({path:t.path,namespace:"file"}));let e=i.initialOptions;e.loader=e.loader||{},e.loader[".node"]="file"}}}function I(){return{name:"esbuild-plugin-node-externals",setup(i){i.onResolve({filter:/(^node:)/},e=>({path:e.path.slice(5),external:!0}))}}}var G=r(require("chokidar")),U=r(require("spinnies"));function K(i,e,t=null){let s,a=t;return async function(...n){return new Promise(p=>{s&&clearTimeout(s),s=setTimeout(()=>p(a=i(...n)),e),setTimeout(()=>p(a),e)})}}var Y=r(require("json5"));function L(i){return(i.startsWith("@")?i.slice(i.indexOf("/")+1):i).split("-").map(t=>t.slice(0,1).toUpperCase()+t.slice(1).toLowerCase()).join("")}var m=class{constructor(e){this.options=e}set isWatch(e){this.options.isWatch=e}static async getDeps(e){let t=await(0,g.readJson)(l.resolve(e,"package.json"));return Object.keys({...t.dependencies,...t.devDependencies,...t.peerDependencies})}static async getPlatform(e){let t=l.resolve(e,"tsconfig.json");if(await(0,g.pathExists)(t)&&(0,Y.parse)(await(0,g.readFile)(t,"utf-8")).compilerOptions.lib.some(n=>n.toLowerCase()==="dom"))return"browser";let s=l.resolve(e,"package.json");if(await(0,g.pathExists)(s)){let a=await(0,g.readJson)(s);if(Object.keys(a.devDependencies??{}).includes("@types/node"))return"node"}return"neutral"}static getWatchOptions(e){return{pattern:"src/**/*.ts",options:{cwd:e,ignore:"**/__tests__/**/*"}}}async genDTS(){let e=this.options.base,{pattern:t,options:s}=m.getWatchOptions(this.options.base),a=new V.Project({tsConfigFilePath:l.resolve(e,"tsconfig.json"),skipAddingFilesFromTsConfig:!0,compilerOptions:{emitDeclarationOnly:!0,noEmit:!1,incremental:this.options.isWatch}}),n=(await(0,q.promise)(t,s)).map(p=>l.resolve(e,p));a.addSourceFilesAtPaths(n),await a.emit({emitOnlyDtsFiles:!0})}getBuildCjsOption({deps:e,platform:t}){return{entryPoints:[l.resolve(this.options.base,"./src/index.ts")],outfile:l.resolve(this.options.base,"./dist/index.js"),format:"cjs",sourcemap:!0,bundle:!0,external:[...m.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildESMOption({deps:e,platform:t}){return{entryPoints:[l.resolve(this.options.base,"./src/index.ts")],outfile:l.resolve(this.options.base,"./dist/index.esm.js"),format:"esm",sourcemap:!0,bundle:!0,external:[...m.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildIifeOption({platform:e,globalName:t}){return{entryPoints:[l.resolve(this.options.base,"./src/index.ts")],outfile:l.resolve(this.options.base,"./dist/index.iife.js"),format:"iife",sourcemap:!0,bundle:!0,external:[...m.globalExternal],platform:e,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch,globalName:t}}getBuildCliOption({platform:e}){let t=m.getPlugins(e);return{entryPoints:[l.resolve(this.options.base,"./src/bin.ts")],outfile:l.resolve(this.options.base,"./dist/bin.js"),format:"cjs",sourcemap:!0,platform:e,bundle:!0,banner:{js:"#!/usr/bin/env node"},external:[...m.globalExternal],plugins:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}static getPlugins(e){let t=[];return e==="node"&&t.push(I(),$()),t}async build(e){await(0,F.build)(e)}async getTasks(){let e=await m.getDeps(this.options.base),t=await m.getPlatform(this.options.base);return{esm:{title:"\u6784\u5EFA esm",task:()=>this.build(this.getBuildESMOption({deps:e,platform:t}))},cjs:{title:"\u6784\u5EFA cjs",task:()=>this.build(this.getBuildCjsOption({deps:e,platform:t}))},iife:{title:"\u6784\u5EFA iife",task:async()=>await this.build(this.getBuildIifeOption({platform:t,globalName:L((await(0,g.readJson)(l.resolve(this.options.base,"./package.json"))).name)}))},cli:{title:"\u6784\u5EFA cli",task:()=>(0,F.build)(this.getBuildCliOption({deps:e,platform:t}))},dts:{title:"\u751F\u6210\u7C7B\u578B\u5B9A\u4E49",task:()=>this.genDTS()}}}static async execTask(e,t){let s=Date.now();e.add(t.title,{text:t.title});try{await t.task(),e.succeed(t.title,{text:`${t.title}: ${Date.now()-s}ms`})}catch{e.fail(t.title,{text:t.title})}}async execTasks(e){let t=async()=>{let n=Date.now(),p=new U.default;await Promise.all(e.map(async D=>m.execTask(p,D))),console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now()-n}ms`)};if(!this.options.isWatch){await t();return}let{pattern:s,options:a}=m.getWatchOptions(this.options.base);await new Promise((n,p)=>{(0,G.watch)(s,a).on("error",p).on("all",K(t,10))})}},W=m;b(W,"globalExternal",["esbuild","pnpapi","ts-morph"]);var f=r(require("path")),o=r(require("fs-extra")),S=r(require("enquirer"));var c=r(require("fs-extra")),y=r(require("path")),B=r(require("lodash-es")),Z=r(require("@liuli-util/prettier-standard-config/package.json")),_=r(require("@liuli-util/eslint-config-ts/package.json")),A=r(require("@liuli-util/eslint-config-react-ts/package.json")),ee=r(require("@liuli-util/commitlint-standard-config/package.json")),te=r(require("enquirer"));var T=r(require("fs-extra")),R=r(require("path"));function z(i,e,t=s=>s){return i.reduce((s,a,n,p)=>s.set(e(a,n,p),t(a,n,p)),new Map)}function H(i,e){return i?i.includes(e)?i:i+" && "+e:e}var Q=r(require("path"));function E(i,e){let t=e(i);function s(a){if(a)return i;let n=Q.default.dirname(i);return n===i?null:E(n,e)}return t instanceof Promise?t.then(s):s(t)}var u;(function(n){n.Filter="filter",n.Map="map",n.ForEach="forEach",n.Reduce="reduce",n.FlatMap="flatMap"})(u||(u={}));var x=class{constructor(e,t){this.type=e;this.args=t;this.type=e,this.args=t}};b(x,"Type",u);var d=class{constructor(e){this.arr=e}static reduce(e,t,s){return e.reduce((a,n,p)=>a.then(D=>t(D,n,p)),Promise.resolve(s))}static map(e,t){return Promise.all(e.map((s,a)=>t(s,a)))}static async filter(e,t){let s=[];return await d.map(e,async(a,n)=>{await t(a,n)&&s.push(a)}),s}static async flatMap(e,t){return(await Promise.all(e.map((s,a)=>t(s,a)))).flatMap(s=>s)}static async forEach(e,t){await d.map(e,t)}tasks=[];map(e){return this.tasks.push(new x(u.Map,[e])),this}flatMap(e){return this.tasks.push(new x(u.FlatMap,[e])),this}filter(e){return this.tasks.push(new x(u.Filter,[e])),this}async forEach(e){this.tasks.push(new x(u.Map,[e])),await this}then(e,t){let s=this.value();return s.then(a=>(e&&e(s),a)).catch(a=>{throw t&&t(a),a}),s}async value(){let e=this.arr;for(let t of this.tasks)switch(t.type){case u.Filter:e=await d.filter(e,t.args[0]);break;case u.Map:e=await d.map(e,t.args[0]);break;case u.FlatMap:e=await d.flatMap(e,t.args[0]);break;case u.ForEach:await d.forEach(e,t.args[0]);return;case u.Reduce:return await d.reduce(e,t.args[0],t.args[1])}return e}};async function h(i=process.cwd()){return await(0,T.pathExists)(R.default.resolve(i,"./package.json"))}async function w(i=process.cwd()){return await h(i)?!!(await(0,T.readJson)(R.default.resolve(i,"./package.json"))).workspaces:!1}async function J(i=process.cwd()){return!await h(i)||await w(i)?!1:await E(R.default.dirname(i),w)!==null}async function M(i,e=process.cwd()){if(!await h(e))return!1;let t=await(0,T.readJson)(R.default.resolve(e,"./package.json")),s=new Set(Object.keys({...t.dependencies,...t.devDependencies}));return i.every(a=>s.has(a))}var X=r(require("path")),k=class{};b(k,"RootPath",X.default.resolve(__dirname,".."));async function P(i,e){let t=y.default.resolve(i,"./package.json");await(0,c.writeJson)(t,(0,B.merge)(await(0,c.readJson)(t),e),{spaces:2})}var C=class{constructor(e){this.base=e}syncConfigs=[{type:"workspaces",handler:async()=>{let e=y.default.resolve(this.base,"./package.json"),t=y.default.resolve(this.base,"lerna.json"),s=await(0,c.readJson)(e),a=await(0,c.readJson)(t);a.packages=s.workspaces,await(0,c.writeJson)(t,a,{spaces:2})},when:w},{type:"prettier",handler:async()=>{await P(this.base,{prettier:"@liuli-util/prettier-standard-config",devDependencies:{prettier:"^2.3.2","@liuli-util/prettier-standard-config":`^${Z.default.version}`}})},async when(){return await h()&&(await w()||!await J())}},{type:"commitlint",handler:async()=>{await P(this.base,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"},commitlint:{extends:["@liuli-util/commitlint-standard-config"]},devDependencies:{"@commitlint/cli":"^12.1.4","@liuli-util/commitlint-standard-config":`^${ee.default.version}`}})},async when(){return await h()&&(await w()||!await J())}},{type:"gitignore",handler:async()=>{let e=y.default.resolve(this.base,".gitignore");await(0,c.writeFile)(e,await(0,c.readFile)(y.default.resolve(k.RootPath,"_gitignore"),"utf-8"))}},{type:"eslint-ts",handler:async()=>{await P(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-ts"]},devDependencies:{"@liuli-util/eslint-config-ts":`^${_.default.version}`}})},async when(){return await h()&&!await M(["vue"])&&!await M(["react"])}},{type:"eslint-react-ts",handler:async()=>{await P(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-react-ts"]},devDependencies:{"@liuli-util/eslint-config-react-ts":`^${A.default.version}`}})},async when(){return await h()&&await M(["react"])}},{type:"jest",handler:async()=>{await P(this.base,{jest:{preset:"ts-jest",testMatch:["<rootDir>/src/**/__tests__/*.test.ts"]},devDependencies:{jest:"^27.4.3","ts-jest":"^27.0.7"}})}},{type:"simplehooks",handler:async()=>{let e=await(0,c.readJson)(y.default.resolve(this.base,"./package.json")),t=[];e.prettier&&t.push("prettier --write"),e.eslintConfig&&t.push("eslint --fix");let s={scripts:{postinstall:H(e?.scripts?.postinstall,"npx simple-git-hooks")},"simple-git-hooks":{"pre-commit":"yarn lint-staged"},"lint-staged":{"*.{ts,tsx,js,jsx,css,vue}":[...t,"git add"]},devDependencies:{"simple-git-hooks":"^2.5.1","lint-staged":"^11.1.1"}};e.commitlint&&(s=(0,B.merge)(s,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"}})),await P(this.base,s)},async when(){return await h()&&(await w()||!await J())}}];async sync(){let{sync:e}=await(0,c.readJson)(y.default.resolve(this.base,"package.json"));if(!e)return;let t=this.syncConfigs.filter(s=>e.includes(s.type));for(let s of t)await s.handler()}async init(){let e=z(await d.filter(this.syncConfigs,async s=>s.when?await s.when():!0),s=>s.type),t=await(0,te.prompt)({type:"multiselect",message:"\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879",name:"sync",choices:[...e.keys()]});await P(this.base,{sync:t.sync})}};var j;(function(t){t.Cli="cli",t.Lib="lib"})(j||(j={}));var O=class{async generate(e){if(!e.dest){let{dest:a}=await(0,S.prompt)({name:"dest",type:"input",message:"\u8BF7\u8F93\u5165\u9879\u76EE\u540D",validate(n){return n.trim()!==""}});e.dest=f.default.resolve(a)}if(!e.template){let{template:a}=await(0,S.prompt)({name:"template",type:"select",message:"\u8BF7\u9009\u62E9\u6A21\u677F",choices:[j.Lib,j.Cli]});e.template=a}let t=f.default.resolve(k.RootPath,`templates/${e.template}`),s=f.default.resolve(e.dest);if(await(0,o.pathExists)(s)&&(await(0,o.readdir)(s)).some(a=>(0,o.pathExists)(a))){let{override:a}=await(0,S.prompt)({name:"override",type:"confirm",initial:!0,message:"\u76EE\u6807\u4F4D\u7F6E\u4E0D\u662F\u4E00\u4E2A\u7A7A\u76EE\u5F55\uFF0C\u786E\u8BA4\u8981\u8986\u76D6\u4E48\uFF1F"});if(!a)return}if(await(0,o.remove)(s),await(0,o.copy)(t,s,{filter:a=>f.default.basename(a)!=="node_modules"}),await O.updatePackageJSON(s),await O.updateReadme(s),e.initSync){let a=new C(f.default.resolve(e.dest));await a.init(),await a.sync()}}static async updatePackageJSON(e){let t=f.default.resolve(e,"package.json");await(0,o.writeJSON)(t,{...await(0,o.readJSON)(t),name:f.default.basename(e)},{spaces:2})}static async updateReadme(e){let t=f.default.resolve(e,"README.md"),s=await(0,o.readFile)(t,"utf-8");s=s.replace("template",f.default.basename(e)),await(0,o.writeFile)(t,s)}};0&&(module.exports={ESBuildProgram,GenerateProgram,SyncProgram,TemplateTypeEnum,mergeJson});
5
+ `})),i.onResolve({filter:/\.node$/,namespace:"node-file"},t=>({path:t.path,namespace:"file"}));let e=i.initialOptions;e.loader=e.loader||{},e.loader[".node"]="file"}}}function I(){return{name:"esbuild-plugin-node-externals",setup(i){i.onResolve({filter:/(^node:)/},e=>({path:e.path.slice(5),external:!0}))}}}var G=r(require("chokidar")),U=r(require("spinnies"));function K(i,e,t=null){let s,a=t;return async function(...n){return new Promise(p=>{s&&clearTimeout(s),s=setTimeout(()=>p(a=i(...n)),e),setTimeout(()=>p(a),e)})}}var Y=r(require("json5"));function L(i){return(i.startsWith("@")?i.slice(i.indexOf("/")+1):i).split("-").map(t=>t.slice(0,1).toUpperCase()+t.slice(1).toLowerCase()).join("")}var m=class{constructor(e){this.options=e}set isWatch(e){this.options.isWatch=e}static async getDeps(e){let t=await(0,g.readJson)(l.resolve(e,"package.json"));return Object.keys({...t.dependencies,...t.devDependencies,...t.peerDependencies})}static async getPlatform(e){let t=l.resolve(e,"tsconfig.json");if(await(0,g.pathExists)(t)&&(0,Y.parse)(await(0,g.readFile)(t,"utf-8")).compilerOptions.lib.some(n=>n.toLowerCase()==="dom"))return"browser";let s=l.resolve(e,"package.json");if(await(0,g.pathExists)(s)){let a=await(0,g.readJson)(s);if(Object.keys(a.devDependencies??{}).includes("@types/node"))return"node"}return"neutral"}static getWatchOptions(e){return{pattern:"src/**/*.ts",options:{cwd:e,ignore:"**/__tests__/**/*"}}}async genDTS(){let e=this.options.base,{pattern:t,options:s}=m.getWatchOptions(this.options.base),a=new V.Project({tsConfigFilePath:l.resolve(e,"tsconfig.json"),skipAddingFilesFromTsConfig:!0,compilerOptions:{emitDeclarationOnly:!0,noEmit:!1,incremental:this.options.isWatch}}),n=(await(0,q.promise)(t,s)).map(p=>l.resolve(e,p));a.addSourceFilesAtPaths(n),await a.emit({emitOnlyDtsFiles:!0})}getBuildCjsOption({deps:e,platform:t}){return{entryPoints:[l.resolve(this.options.base,"./src/index.ts")],outfile:l.resolve(this.options.base,"./dist/index.js"),format:"cjs",sourcemap:!0,bundle:!0,external:[...m.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildESMOption({deps:e,platform:t}){return{entryPoints:[l.resolve(this.options.base,"./src/index.ts")],outfile:l.resolve(this.options.base,"./dist/index.esm.js"),format:"esm",sourcemap:!0,bundle:!0,external:[...m.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildIifeOption({platform:e,globalName:t}){return{entryPoints:[l.resolve(this.options.base,"./src/index.ts")],outfile:l.resolve(this.options.base,"./dist/index.iife.js"),format:"iife",sourcemap:!0,bundle:!0,external:[...m.globalExternal],platform:e,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch,globalName:t}}getBuildCliOption({platform:e}){let t=m.getPlugins(e);return{entryPoints:[l.resolve(this.options.base,"./src/bin.ts")],outfile:l.resolve(this.options.base,"./dist/bin.js"),format:"cjs",sourcemap:!0,platform:e,bundle:!0,banner:{js:"#!/usr/bin/env node"},external:[...m.globalExternal],plugins:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}static getPlugins(e){let t=[];return e==="node"&&t.push(I(),$()),t}async build(e){await(0,F.build)(e)}async getTasks(){let e=await m.getDeps(this.options.base),t=await m.getPlatform(this.options.base);return{esm:{title:"\u6784\u5EFA esm",task:()=>this.build(this.getBuildESMOption({deps:e,platform:t}))},cjs:{title:"\u6784\u5EFA cjs",task:()=>this.build(this.getBuildCjsOption({deps:e,platform:t}))},iife:{title:"\u6784\u5EFA iife",task:async()=>await this.build(this.getBuildIifeOption({platform:t,globalName:L((await(0,g.readJson)(l.resolve(this.options.base,"./package.json"))).name)}))},cli:{title:"\u6784\u5EFA cli",task:()=>(0,F.build)(this.getBuildCliOption({deps:e,platform:t}))},dts:{title:"\u751F\u6210\u7C7B\u578B\u5B9A\u4E49",task:()=>this.genDTS()}}}static async execTask(e,t){let s=Date.now();e.add(t.title,{text:t.title});try{await t.task(),e.succeed(t.title,{text:`${t.title}: ${Date.now()-s}ms`})}catch{e.fail(t.title,{text:t.title})}}async execTasks(e){let t=async()=>{let n=Date.now(),p=new U.default;await Promise.all(e.map(async D=>m.execTask(p,D))),console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now()-n}ms`)};if(!this.options.isWatch){await t();return}let{pattern:s,options:a}=m.getWatchOptions(this.options.base);await new Promise((n,p)=>{(0,G.watch)(s,a).on("error",p).on("all",K(t,10))})}},W=m;b(W,"globalExternal",["esbuild","pnpapi","ts-morph","ssh2"]);var f=r(require("path")),o=r(require("fs-extra")),S=r(require("enquirer"));var c=r(require("fs-extra")),y=r(require("path")),B=r(require("lodash-es")),Z=r(require("@liuli-util/prettier-standard-config/package.json")),_=r(require("@liuli-util/eslint-config-ts/package.json")),A=r(require("@liuli-util/eslint-config-react-ts/package.json")),ee=r(require("@liuli-util/commitlint-standard-config/package.json")),te=r(require("enquirer"));var T=r(require("fs-extra")),R=r(require("path"));function z(i,e,t=s=>s){return i.reduce((s,a,n,p)=>s.set(e(a,n,p),t(a,n,p)),new Map)}function H(i,e){return i?i.includes(e)?i:i+" && "+e:e}var Q=r(require("path"));function E(i,e){let t=e(i);function s(a){if(a)return i;let n=Q.default.dirname(i);return n===i?null:E(n,e)}return t instanceof Promise?t.then(s):s(t)}var u;(function(n){n.Filter="filter",n.Map="map",n.ForEach="forEach",n.Reduce="reduce",n.FlatMap="flatMap"})(u||(u={}));var x=class{constructor(e,t){this.type=e;this.args=t;this.type=e,this.args=t}};b(x,"Type",u);var d=class{constructor(e){this.arr=e}static reduce(e,t,s){return e.reduce((a,n,p)=>a.then(D=>t(D,n,p)),Promise.resolve(s))}static map(e,t){return Promise.all(e.map((s,a)=>t(s,a)))}static async filter(e,t){let s=[];return await d.map(e,async(a,n)=>{await t(a,n)&&s.push(a)}),s}static async flatMap(e,t){return(await Promise.all(e.map((s,a)=>t(s,a)))).flatMap(s=>s)}static async forEach(e,t){await d.map(e,t)}tasks=[];map(e){return this.tasks.push(new x(u.Map,[e])),this}flatMap(e){return this.tasks.push(new x(u.FlatMap,[e])),this}filter(e){return this.tasks.push(new x(u.Filter,[e])),this}async forEach(e){this.tasks.push(new x(u.Map,[e])),await this}then(e,t){let s=this.value();return s.then(a=>(e&&e(s),a)).catch(a=>{throw t&&t(a),a}),s}async value(){let e=this.arr;for(let t of this.tasks)switch(t.type){case u.Filter:e=await d.filter(e,t.args[0]);break;case u.Map:e=await d.map(e,t.args[0]);break;case u.FlatMap:e=await d.flatMap(e,t.args[0]);break;case u.ForEach:await d.forEach(e,t.args[0]);return;case u.Reduce:return await d.reduce(e,t.args[0],t.args[1])}return e}};async function h(i=process.cwd()){return await(0,T.pathExists)(R.default.resolve(i,"./package.json"))}async function w(i=process.cwd()){return await h(i)?!!(await(0,T.readJson)(R.default.resolve(i,"./package.json"))).workspaces:!1}async function J(i=process.cwd()){return!await h(i)||await w(i)?!1:await E(R.default.dirname(i),w)!==null}async function M(i,e=process.cwd()){if(!await h(e))return!1;let t=await(0,T.readJson)(R.default.resolve(e,"./package.json")),s=new Set(Object.keys({...t.dependencies,...t.devDependencies}));return i.every(a=>s.has(a))}var X=r(require("path")),k=class{};b(k,"RootPath",X.default.resolve(__dirname,".."));async function P(i,e){let t=y.default.resolve(i,"./package.json");await(0,c.writeJson)(t,(0,B.merge)(await(0,c.readJson)(t),e),{spaces:2})}var C=class{constructor(e){this.base=e}syncConfigs=[{type:"workspaces",handler:async()=>{let e=y.default.resolve(this.base,"./package.json"),t=y.default.resolve(this.base,"lerna.json"),s=await(0,c.readJson)(e),a=await(0,c.readJson)(t);a.packages=s.workspaces,await(0,c.writeJson)(t,a,{spaces:2})},when:w},{type:"prettier",handler:async()=>{await P(this.base,{prettier:"@liuli-util/prettier-standard-config",devDependencies:{prettier:"^2.3.2","@liuli-util/prettier-standard-config":`^${Z.default.version}`}})},async when(){return await h()&&(await w()||!await J())}},{type:"commitlint",handler:async()=>{await P(this.base,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"},commitlint:{extends:["@liuli-util/commitlint-standard-config"]},devDependencies:{"@commitlint/cli":"^12.1.4","@liuli-util/commitlint-standard-config":`^${ee.default.version}`}})},async when(){return await h()&&(await w()||!await J())}},{type:"gitignore",handler:async()=>{let e=y.default.resolve(this.base,".gitignore");await(0,c.writeFile)(e,await(0,c.readFile)(y.default.resolve(k.RootPath,"_gitignore"),"utf-8"))}},{type:"eslint-ts",handler:async()=>{await P(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-ts"]},devDependencies:{"@liuli-util/eslint-config-ts":`^${_.default.version}`}})},async when(){return await h()&&!await M(["vue"])&&!await M(["react"])}},{type:"eslint-react-ts",handler:async()=>{await P(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-react-ts"]},devDependencies:{"@liuli-util/eslint-config-react-ts":`^${A.default.version}`}})},async when(){return await h()&&await M(["react"])}},{type:"jest",handler:async()=>{await P(this.base,{jest:{preset:"ts-jest",testMatch:["<rootDir>/src/**/__tests__/*.test.ts"]},devDependencies:{jest:"^27.4.3","ts-jest":"^27.0.7"}})}},{type:"simplehooks",handler:async()=>{let e=await(0,c.readJson)(y.default.resolve(this.base,"./package.json")),t=[];e.prettier&&t.push("prettier --write"),e.eslintConfig&&t.push("eslint --fix");let s={scripts:{postinstall:H(e?.scripts?.postinstall,"npx simple-git-hooks")},"simple-git-hooks":{"pre-commit":"yarn lint-staged"},"lint-staged":{"*.{ts,tsx,js,jsx,css,vue}":[...t,"git add"]},devDependencies:{"simple-git-hooks":"^2.5.1","lint-staged":"^11.1.1"}};e.commitlint&&(s=(0,B.merge)(s,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"}})),await P(this.base,s)},async when(){return await h()&&(await w()||!await J())}}];async sync(){let{sync:e}=await(0,c.readJson)(y.default.resolve(this.base,"package.json"));if(!e)return;let t=this.syncConfigs.filter(s=>e.includes(s.type));for(let s of t)await s.handler()}async init(){let e=z(await d.filter(this.syncConfigs,async s=>s.when?await s.when():!0),s=>s.type),t=await(0,te.prompt)({type:"multiselect",message:"\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879",name:"sync",choices:[...e.keys()]});await P(this.base,{sync:t.sync})}};var j;(function(t){t.Cli="cli",t.Lib="lib"})(j||(j={}));var O=class{async generate(e){if(!e.dest){let{dest:a}=await(0,S.prompt)({name:"dest",type:"input",message:"\u8BF7\u8F93\u5165\u9879\u76EE\u540D",validate(n){return n.trim()!==""}});e.dest=f.default.resolve(a)}if(!e.template){let{template:a}=await(0,S.prompt)({name:"template",type:"select",message:"\u8BF7\u9009\u62E9\u6A21\u677F",choices:[j.Lib,j.Cli]});e.template=a}let t=f.default.resolve(k.RootPath,`templates/${e.template}`),s=f.default.resolve(e.dest);if(await(0,o.pathExists)(s)&&(await(0,o.readdir)(s)).some(a=>(0,o.pathExists)(a))){let{override:a}=await(0,S.prompt)({name:"override",type:"confirm",initial:!0,message:"\u76EE\u6807\u4F4D\u7F6E\u4E0D\u662F\u4E00\u4E2A\u7A7A\u76EE\u5F55\uFF0C\u786E\u8BA4\u8981\u8986\u76D6\u4E48\uFF1F"});if(!a)return}if(await(0,o.remove)(s),await(0,o.copy)(t,s,{filter:a=>f.default.basename(a)!=="node_modules"}),await O.updatePackageJSON(s),await O.updateReadme(s),e.initSync){let a=new C(f.default.resolve(e.dest));await a.init(),await a.sync()}}static async updatePackageJSON(e){let t=f.default.resolve(e,"package.json");await(0,o.writeJSON)(t,{...await(0,o.readJSON)(t),name:f.default.basename(e)},{spaces:2})}static async updateReadme(e){let t=f.default.resolve(e,"README.md"),s=await(0,o.readFile)(t,"utf-8");s=s.replace("template",f.default.basename(e)),await(0,o.writeFile)(t,s)}};0&&(module.exports={ESBuildProgram,GenerateProgram,SyncProgram,TemplateTypeEnum,mergeJson});
6
6
  //# sourceMappingURL=index.js.map