@liuli-util/cli 3.21.0 → 3.22.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. package/bin.js +1 -1
  2. package/dist/bin.js +152 -106
  3. package/dist/bin.js.map +3 -3
  4. package/dist/commands/deploy/util/execPromise.d.ts +1 -0
  5. package/dist/commands/deploy/util/execPromise.d.ts.map +1 -1
  6. package/dist/commands/esbuild/ESBuildProgram.d.ts +0 -6
  7. package/dist/commands/esbuild/ESBuildProgram.d.ts.map +1 -1
  8. package/dist/commands/esbuild/util/autoExternal.d.ts +7 -0
  9. package/dist/commands/esbuild/util/autoExternal.d.ts.map +1 -0
  10. package/dist/commands/esbuild/util/env.d.ts +16 -0
  11. package/dist/commands/esbuild/util/env.d.ts.map +1 -0
  12. package/dist/commands/esbuild/util/index.d.ts +11 -0
  13. package/dist/commands/esbuild/util/index.d.ts.map +1 -0
  14. package/dist/commands/esbuild/util/log.d.ts +3 -0
  15. package/dist/commands/esbuild/util/log.d.ts.map +1 -0
  16. package/dist/commands/esbuild/util/metafile.d.ts +7 -0
  17. package/dist/commands/esbuild/util/metafile.d.ts.map +1 -0
  18. package/dist/commands/esbuild/util/nativeNodeModules.d.ts +7 -0
  19. package/dist/commands/esbuild/util/nativeNodeModules.d.ts.map +1 -0
  20. package/dist/commands/esbuild/util/nodeExternal.d.ts +6 -0
  21. package/dist/commands/esbuild/util/nodeExternal.d.ts.map +1 -0
  22. package/dist/commands/esbuild/util/raw.d.ts +7 -0
  23. package/dist/commands/esbuild/util/raw.d.ts.map +1 -0
  24. package/dist/commands/esbuild/util/resolve.d.ts +8 -0
  25. package/dist/commands/esbuild/util/resolve.d.ts.map +1 -0
  26. package/dist/commands/esbuild/util/sideEffect.d.ts +8 -0
  27. package/dist/commands/esbuild/util/sideEffect.d.ts.map +1 -0
  28. package/dist/commands/esbuild/util/userJS.d.ts +3 -0
  29. package/dist/commands/esbuild/util/userJS.d.ts.map +1 -0
  30. package/dist/index.esm.js +3 -3
  31. package/dist/index.esm.js.map +3 -3
  32. package/dist/index.js +3 -3
  33. package/dist/index.js.map +3 -3
  34. package/package.json +40 -36
  35. package/src/commands/esbuild/ESBuildProgram.ts +5 -9
  36. package/src/commands/esbuild/__tests__/ESBuildProgram.test.ts +2 -2
  37. package/src/commands/esbuild/util/autoExternal.ts +22 -0
  38. package/src/commands/esbuild/util/env.ts +67 -0
  39. package/src/commands/esbuild/util/index.ts +10 -0
  40. package/src/commands/esbuild/util/log.ts +20 -0
  41. package/src/commands/esbuild/util/metafile.ts +17 -0
  42. package/src/commands/esbuild/util/nativeNodeModules.ts +43 -0
  43. package/src/commands/esbuild/util/nodeExternal.ts +16 -0
  44. package/src/commands/esbuild/util/raw.ts +27 -0
  45. package/src/commands/esbuild/util/resolve.ts +22 -0
  46. package/src/commands/esbuild/util/sideEffect.ts +29 -0
  47. package/src/commands/esbuild/util/userJS.ts +38 -0
  48. package/templates/cli/package.json +35 -33
  49. package/templates/lib/package.json +24 -19
  50. package/dist/commands/esbuild/util/esbuildPlugins.d.ts +0 -32
  51. package/dist/commands/esbuild/util/esbuildPlugins.d.ts.map +0 -1
  52. package/src/commands/esbuild/__tests__/.temp/package.json +0 -1
  53. package/src/commands/esbuild/__tests__/.temp/src/index.ts +0 -1
  54. package/src/commands/esbuild/util/__tests__/.temp/index.js +0 -1
  55. package/src/commands/esbuild/util/__tests__/esbuildPlugins.test.ts +0 -52
  56. package/src/commands/esbuild/util/esbuildPlugins.ts +0 -196
  57. package/src/commands/generate/__tests__/.temp/README.md +0 -1
  58. package/src/commands/generate/__tests__/.temp/package.json +0 -3
  59. package/src/commands/generate/__tests__/.temp/test-cli/CHANGELOG.md +0 -1
  60. package/src/commands/generate/__tests__/.temp/test-cli/README.md +0 -1
  61. package/src/commands/generate/__tests__/.temp/test-cli/bin.js +0 -3
  62. package/src/commands/generate/__tests__/.temp/test-cli/package.json +0 -33
  63. package/src/commands/generate/__tests__/.temp/test-cli/src/bin.ts +0 -13
  64. package/src/commands/generate/__tests__/.temp/test-cli/src/index.ts +0 -1
  65. package/src/commands/generate/__tests__/.temp/test-cli/tsconfig.json +0 -28
  66. package/src/commands/sync/__tests__/.temp/package.json +0 -16
  67. package/wallaby.conf.js +0 -3
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- var ne=Object.create;var T=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var le=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var ce=(s,e,t)=>e in s?T(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var I=s=>T(s,"__esModule",{value:!0});var me=(s,e)=>{I(s);for(var t in e)T(s,t,{get:e[t],enumerable:!0})},ue=(s,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of oe(e))!pe.call(s,i)&&i!=="default"&&T(s,i,{get:()=>e[i],enumerable:!(t=re(e,i))||t.enumerable});return s},r=s=>ue(I(T(s!=null?ne(le(s)):{},"default",s&&s.__esModule&&"default"in s?{get:()=>s.default,enumerable:!0}:{value:s,enumerable:!0})),s);var P=(s,e,t)=>(ce(s,typeof e!="symbol"?e+"":e,t),t);me(exports,{ESBuildProgram:()=>$,GenerateProgram:()=>O,SyncProgram:()=>C,TemplateTypeEnum:()=>R,mergeJson:()=>y});var E=r(require("esbuild")),d=r(require("fs-extra")),o=r(require("path")),G=r(require("ts-morph")),Y=r(require("glob-promise"));var J=r(require("fs-extra")),S=r(require("path"));function L(){return{name:"native-node-modules",setup(s){s.onResolve({filter:/\.node$/,namespace:"file"},t=>({path:require.resolve(t.path,{paths:[t.resolveDir]}),namespace:"node-file"})),s.onLoad({filter:/.*/,namespace:"node-file"},t=>({contents:`
1
+ var ae=Object.create;var k=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var le=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var me=(i,e,t)=>e in i?k(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var ue=(i,e)=>{for(var t in e)k(i,t,{get:e[t],enumerable:!0})},$=(i,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of pe(e))!ce.call(i,n)&&n!==t&&k(i,n,{get:()=>e[n],enumerable:!(s=oe(e,n))||s.enumerable});return i};var m=(i,e,t)=>(t=i!=null?ae(le(i)):{},$(e||!i||!i.__esModule?k(t,"default",{value:i,enumerable:!0}):t,i)),fe=i=>$(k({},"__esModule",{value:!0}),i);var x=(i,e,t)=>(me(i,typeof e!="symbol"?e+"":e,t),t);var ye={};ue(ye,{ESBuildProgram:()=>O,GenerateProgram:()=>T,SyncProgram:()=>R,TemplateTypeEnum:()=>re,mergeJson:()=>h});module.exports=fe(ye);var C=require("esbuild"),f=require("fs-extra"),a=m(require("path")),Y=require("ts-morph"),q=require("glob-promise"),G=require("chokidar"),z=m(require("spinnies"));function B(i,e,t=null){let s,n=t;return async function(...r){return new Promise(p=>{s&&clearTimeout(s),s=setTimeout(()=>p(n=i(...r)),e),setTimeout(()=>p(n),e)})}}var A=require("json5");function N(i){return(i.startsWith("@")?i.slice(i.indexOf("/")+1):i).split("-").map(t=>t.slice(0,1).toUpperCase()+t.slice(1).toLowerCase()).join("")}var de=require("fs-extra");function I(){return{name:"native-node-modules",setup(i){i.onResolve({filter:/\.node$/,namespace:"file"},t=>({path:require.resolve(t.path,{paths:[t.resolveDir]}),namespace:"node-file"})),i.onLoad({filter:/.*/,namespace:"node-file"},t=>({contents:`
2
2
  import path from ${JSON.stringify(t.path)}
3
3
  try { module.exports = require(path) }
4
4
  catch {}
5
- `})),s.onResolve({filter:/\.node$/,namespace:"node-file"},t=>({path:t.path,namespace:"file"}));let e=s.initialOptions;e.loader=e.loader||{},e.loader[".node"]="file"}}}function K(){return{name:"esbuild-plugin-node-externals",setup(s){s.onResolve({filter:/(^node:)/},e=>({path:e.path.slice(5),external:!0}))}}}function de(s){return["// ==UserScript==",...Object.entries(s).map(([e,t])=>Array.isArray(t)?t.map(i=>`// @${e} ${i}`):`// @${e} ${t}`).flat(),"// ==/UserScript=="].join(`
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 L(){return{name:"nodeExternals",setup(i){i.onResolve({filter:/(^node:)/},e=>({path:e.path.slice(5),external:!0}))}}}var ge=require("fs-extra");function M(i){return{name:"resolve",setup(e){e.onResolve({filter:/.*/},async t=>{let s=i.find(n=>n[0]===t.path);if(!!s)return await e.resolve(s[1])})}}}var K=require("fs-extra"),V=m(require("path"));function he(i){return["// ==UserScript==",...Object.entries(i).map(([e,t])=>Array.isArray(t)?t.map(s=>`// @${e} ${s}`):`// @${e} ${t}`).flat(),"// ==/UserScript=="].join(`
6
6
  `)+`
7
- `}function U(){return{name:"esbuild-plugin-userjs",async setup(s){let e=await(0,J.readJson)(S.resolve(s.initialOptions.absWorkingDir,"package.json"));if(!e.userjs)throw new Error("userjs is not supported");s.initialOptions.banner||(s.initialOptions.banner={}),s.initialOptions.banner.js=de(e.userjs)}}}var z=r(require("chokidar")),H=r(require("spinnies"));function V(s,e,t=null){let i,a=t;return async function(...n){return new Promise(p=>{i&&clearTimeout(i),i=setTimeout(()=>p(a=s(...n)),e),setTimeout(()=>p(a),e)})}}var Q=r(require("json5"));function q(s){return(s.startsWith("@")?s.slice(s.indexOf("/")+1):s).split("-").map(t=>t.slice(0,1).toUpperCase()+t.slice(1).toLowerCase()).join("")}var c=class{constructor(e){this.options=e}set isWatch(e){this.options.isWatch=e}static async getDeps(e){let t=await(0,d.readJson)(o.resolve(e,"package.json"));return Object.keys({...t.dependencies,...t.devDependencies,...t.peerDependencies})}static async getPlatform(e){let t=o.resolve(e,"tsconfig.json");if(await(0,d.pathExists)(t)&&(0,Q.parse)(await(0,d.readFile)(t,"utf-8"))?.compilerOptions?.lib?.some(n=>n.toLowerCase()==="dom"))return"browser";let i=o.resolve(e,"package.json");if(await(0,d.pathExists)(i)){let a=await(0,d.readJson)(i);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:i}=c.getWatchOptions(this.options.base),a=new G.Project({tsConfigFilePath:o.resolve(e,"tsconfig.json"),skipAddingFilesFromTsConfig:!0,compilerOptions:{emitDeclarationOnly:!0,noEmit:!1,incremental:this.options.isWatch}}),n=(await(0,Y.promise)(t,i)).map(p=>o.resolve(e,p));a.addSourceFilesAtPaths(n),await a.emit({emitOnlyDtsFiles:!0})}getBuildUserJSOption(){return{entryPoints:[o.resolve(this.options.base,"./src/index.ts")],outfile:o.resolve(this.options.base,"./dist/index.user.js"),format:"iife",bundle:!0,external:[...c.globalExternal],platform:"browser",plugins:[U()],incremental:this.options.isWatch,absWorkingDir:this.options.base}}getBuildCjsOption({deps:e,platform:t}){return{entryPoints:[o.resolve(this.options.base,"./src/index.ts")],outfile:o.resolve(this.options.base,"./dist/index.js"),format:"cjs",sourcemap:!0,bundle:!0,external:[...c.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildESMOption({deps:e,platform:t}){return{entryPoints:[o.resolve(this.options.base,"./src/index.ts")],outfile:o.resolve(this.options.base,"./dist/index.esm.js"),format:"esm",sourcemap:!0,bundle:!0,external:[...c.globalExternal,...e],platform:t,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch}}getBuildIifeOption({platform:e,globalName:t}){return{entryPoints:[o.resolve(this.options.base,"./src/index.ts")],outfile:o.resolve(this.options.base,"./dist/index.iife.js"),format:"iife",sourcemap:!0,bundle:!0,external:[...c.globalExternal],platform:e,minify:!this.options.isWatch,incremental:this.options.isWatch,metafile:this.options.isWatch,globalName:t}}getBuildCliOption({platform:e}){let t=c.getPlugins(e);return{entryPoints:[o.resolve(this.options.base,"./src/bin.ts")],outfile:o.resolve(this.options.base,"./dist/bin.js"),format:"cjs",sourcemap:!0,platform:e,bundle:!0,banner:{js:"#!/usr/bin/env node"},external:[...c.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(K(),L()),t}async build(e){await(0,E.build)(e)}async getTasks(){let e=await c.getDeps(this.options.base),t=await c.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:q((await(0,d.readJson)(o.resolve(this.options.base,"./package.json"))).name)}))},cli:{title:"\u6784\u5EFA cli",task:()=>(0,E.build)(this.getBuildCliOption({deps:e,platform:t}))},dts:{title:"\u751F\u6210\u7C7B\u578B\u5B9A\u4E49",task:()=>this.genDTS()},userjs:{title:"\u6253\u5305 userjs",task:()=>this.build(this.getBuildUserJSOption())}}}static async execTask(e,t){let i=Date.now();e.add(t.title,{text:t.title});try{await t.task(),e.succeed(t.title,{text:`${t.title}: ${Date.now()-i}ms`})}catch{e.fail(t.title,{text:t.title})}}async execTasks(e){let t=async()=>{let n=Date.now(),p=new H.default;await Promise.all(e.map(async W=>c.execTask(p,W))),console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now()-n}ms`)};if(!this.options.isWatch){await(0,d.remove)(o.resolve(this.options.base,"dist")),await t();return}let{pattern:i,options:a}=c.getWatchOptions(this.options.base);await new Promise((n,p)=>{(0,z.watch)(i,a).on("error",p).on("all",V(t,10))})}},$=c;P($,"globalExternal",["esbuild","pnpapi","ts-morph","ssh2"]);var h=r(require("path")),l=r(require("fs-extra")),F=r(require("enquirer"));var m=r(require("fs-extra")),b=r(require("path")),N=r(require("lodash")),ee=r(require("@liuli-util/prettier-standard-config/package.json")),te=r(require("@liuli-util/eslint-config-ts/package.json")),se=r(require("@liuli-util/eslint-config-react-ts/package.json")),ie=r(require("@liuli-util/commitlint-standard-config/package.json")),ae=r(require("enquirer"));var j=r(require("fs-extra")),v=r(require("path"));function X(s,e,t=i=>i){return s.reduce((i,a,n,p)=>i.set(e(a,n,p),t(a,n,p)),new Map)}function Z(s,e){return s?s.includes(e)?s:s+" && "+e:e}var _=r(require("path"));function B(s,e){let t=e(s);function i(a){if(a)return s;let n=_.default.dirname(s);return n===s?null:B(n,e)}return t instanceof Promise?t.then(i):i(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}};P(x,"Type",u);var f=class{constructor(e){this.arr=e}static reduce(e,t,i){return e.reduce((a,n,p)=>a.then(W=>t(W,n,p)),Promise.resolve(i))}static map(e,t){return Promise.all(e.map((i,a)=>t(i,a)))}static async filter(e,t){let i=[];return await f.map(e,async(a,n)=>{await t(a,n)&&i.push(a)}),i}static async flatMap(e,t){return(await Promise.all(e.map((i,a)=>t(i,a)))).flatMap(i=>i)}static async forEach(e,t){await f.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 i=this.value();return i.then(a=>(e&&e(i),a)).catch(a=>{throw t&&t(a),a}),i}async value(){let e=this.arr;for(let t of this.tasks)switch(t.type){case u.Filter:e=await f.filter(e,t.args[0]);break;case u.Map:e=await f.map(e,t.args[0]);break;case u.FlatMap:e=await f.flatMap(e,t.args[0]);break;case u.ForEach:await f.forEach(e,t.args[0]);return;case u.Reduce:return await f.reduce(e,t.args[0],t.args[1])}return e}};async function g(s=process.cwd()){return await(0,j.pathExists)(v.resolve(s,"./package.json"))}async function w(s=process.cwd()){return await g(s)?!!(await(0,j.readJson)(v.resolve(s,"./package.json"))).workspaces:!1}async function M(s=process.cwd()){return!await g(s)||await w(s)?!1:await B(v.dirname(s),w)!==null}async function D(s,e=process.cwd()){if(!await g(e))return!1;let t=await(0,j.readJson)(v.resolve(e,"./package.json")),i=new Set(Object.keys({...t.dependencies,...t.devDependencies}));return s.every(a=>i.has(a))}var A=r(require("path")),k=class{};P(k,"RootPath",A.default.resolve(__dirname,".."));async function y(s,e){let t=b.default.resolve(s,"./package.json");await(0,m.writeJson)(t,(0,N.merge)(await(0,m.readJson)(t),e),{spaces:2})}var C=class{constructor(e){this.base=e}syncConfigs=[{type:"workspaces",handler:async()=>{let e=b.default.resolve(this.base,"./package.json"),t=b.default.resolve(this.base,"lerna.json"),i=await(0,m.readJson)(e),a=await(0,m.readJson)(t);a.packages=i.workspaces,await(0,m.writeJson)(t,a,{spaces:2})},when:w},{type:"prettier",handler:async()=>{await y(this.base,{prettier:"@liuli-util/prettier-standard-config",devDependencies:{prettier:"^2.3.2","@liuli-util/prettier-standard-config":`^${ee.default.version}`}})},async when(){return await g()&&(await w()||!await M())}},{type:"commitlint",handler:async()=>{await y(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":`^${ie.default.version}`}})},async when(){return await g()&&(await w()||!await M())}},{type:"gitignore",handler:async()=>{let e=b.default.resolve(this.base,".gitignore");await(0,m.writeFile)(e,await(0,m.readFile)(b.default.resolve(k.RootPath,"_gitignore"),"utf-8"))}},{type:"eslint-ts",handler:async()=>{await y(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-ts"]},devDependencies:{"@liuli-util/eslint-config-ts":`^${te.default.version}`}})},async when(){return await g()&&!await D(["vue"])&&!await D(["react"])}},{type:"eslint-react-ts",handler:async()=>{await y(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-react-ts"]},devDependencies:{"@liuli-util/eslint-config-react-ts":`^${se.default.version}`}})},async when(){return await g()&&await D(["react"])}},{type:"jest",handler:async()=>{await y(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,m.readJson)(b.default.resolve(this.base,"./package.json")),t={};e.prettier&&(t["src/**/*.{ts,tsx,js,jsx,css,vue}"]=["prettier --write","git add"]),e.eslintConfig&&(t["src/**/*.{ts,tsx,js,jsx}"]=["eslint --fix --quiet","git add"]);let i={scripts:{postinstall:Z(e?.scripts?.postinstall,"npx simple-git-hooks")},"simple-git-hooks":{"pre-commit":"yarn lint-staged"},"lint-staged":t,devDependencies:{"simple-git-hooks":"^2.5.1","lint-staged":"^11.1.1"}};e.commitlint&&(i=(0,N.merge)(i,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"}})),await y(this.base,i)},async when(){return await g()&&(await w()||!await M())}}];async sync(){let{sync:e}=await(0,m.readJson)(b.default.resolve(this.base,"package.json"));if(!e)return;let t=this.syncConfigs.filter(i=>e.includes(i.type));for(let i of t)await i.handler()}async init(){let e=X(await f.filter(this.syncConfigs,async i=>i.when?await i.when():!0),i=>i.type),t=await(0,ae.prompt)({type:"multiselect",message:"\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879",name:"sync",choices:[...e.keys()]});await y(this.base,{sync:t.sync})}};var R;(function(t){t.Cli="cli",t.Lib="lib"})(R||(R={}));var O=class{async generate(e){if(!e.dest){let{dest:a}=await(0,F.prompt)({name:"dest",type:"input",message:"\u8BF7\u8F93\u5165\u9879\u76EE\u540D",validate(n){return n.trim()!==""}});e.dest=h.default.resolve(a)}if(!e.template){let{template:a}=await(0,F.prompt)({name:"template",type:"select",message:"\u8BF7\u9009\u62E9\u6A21\u677F",choices:[R.Lib,R.Cli]});e.template=a}let t=h.default.resolve(k.RootPath,`templates/${e.template}`),i=h.default.resolve(e.dest);if(await(0,l.pathExists)(i)&&(await(0,l.readdir)(i)).some(a=>(0,l.pathExists)(a))){let{override:a}=await(0,F.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,l.remove)(i),await(0,l.copy)(t,i,{filter:a=>h.default.basename(a)!=="node_modules"}),await O.updatePackageJSON(i),await O.updateReadme(i),e.initSync){let a=new C(h.default.resolve(e.dest));await a.init(),await a.sync()}}static async updatePackageJSON(e){let t=h.default.resolve(e,"package.json");await(0,l.writeJSON)(t,{...await(0,l.readJSON)(t),name:h.default.basename(e)},{spaces:2})}static async updateReadme(e){let t=h.default.resolve(e,"README.md"),i=await(0,l.readFile)(t,"utf-8");i=i.replace("template",h.default.basename(e)),await(0,l.writeFile)(t,i)}};0&&(module.exports={ESBuildProgram,GenerateProgram,SyncProgram,TemplateTypeEnum,mergeJson});
7
+ `}function U(){return{name:"userJS",async setup(i){let e=await(0,K.readJson)(V.default.resolve(i.initialOptions.absWorkingDir,"package.json"));if(!e.userjs)throw new Error("userjs is not supported");i.initialOptions.banner||(i.initialOptions.banner={}),i.initialOptions.banner.js=he(e.userjs)}}}var l=class{constructor(e){this.options=e}set isWatch(e){this.options.isWatch=e}static async getDeps(e){let t=await(0,f.readJson)(a.resolve(e,"package.json"));return Object.keys({...t.dependencies,...t.devDependencies,...t.peerDependencies})}static async getPlatform(e){let t=a.resolve(e,"tsconfig.json");if(await(0,f.pathExists)(t)&&(0,A.parse)(await(0,f.readFile)(t,"utf-8"))?.compilerOptions?.lib?.some(r=>r.toLowerCase()==="dom"))return"browser";let s=a.resolve(e,"package.json");if(await(0,f.pathExists)(s)){let n=await(0,f.readJson)(s);if(Object.keys(n.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),n=new Y.Project({tsConfigFilePath:a.resolve(e,"tsconfig.json"),skipAddingFilesFromTsConfig:!0,compilerOptions:{emitDeclarationOnly:!0,noEmit:!1,incremental:this.options.isWatch}}),r=(await(0,q.promise)(t,s)).map(p=>a.resolve(e,p));n.addSourceFilesAtPaths(r),await n.emit({emitOnlyDtsFiles:!0})}getBuildUserJSOption(){return{entryPoints:[a.resolve(this.options.base,"./src/index.ts")],outfile:a.resolve(this.options.base,"./dist/index.user.js"),format:"iife",bundle:!0,external:[...l.globalExternal],platform:"browser",plugins:[U()],incremental:this.options.isWatch,absWorkingDir:this.options.base}}getBuildCjsOption({deps:e,platform:t}){return{entryPoints:[a.resolve(this.options.base,"./src/index.ts")],outfile:a.resolve(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,plugins:[M([["@liuli-util/esbuild-plugins/src/","@liuli-util/esbuild-plugins"]])]}}getBuildESMOption({deps:e,platform:t}){return{entryPoints:[a.resolve(this.options.base,"./src/index.ts")],outfile:a.resolve(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,plugins:[M([["@liuli-util/esbuild-plugins/src/","@liuli-util/esbuild-plugins"]])]}}getBuildIifeOption({platform:e,globalName:t}){return{entryPoints:[a.resolve(this.options.base,"./src/index.ts")],outfile:a.resolve(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:[a.resolve(this.options.base,"./src/bin.ts")],outfile:a.resolve(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(L(),I()),t}async build(e){await(0,C.build)(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:N((await(0,f.readJson)(a.resolve(this.options.base,"./package.json"))).name)}))},cli:{title:"\u6784\u5EFA cli",task:()=>(0,C.build)(this.getBuildCliOption({deps:e,platform:t}))},dts:{title:"\u751F\u6210\u7C7B\u578B\u5B9A\u4E49",task:()=>this.genDTS()},userjs:{title:"\u6253\u5305 userjs",task:()=>this.build(this.getBuildUserJSOption())}}}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 r=Date.now(),p=new z.default;await Promise.all(e.map(async S=>l.execTask(p,S))),console.log(`\u6784\u5EFA\u5B8C\u6210: ${Date.now()-r}ms`)};if(!this.options.isWatch){await(0,f.remove)(a.resolve(this.options.base,"dist")),await t();return}let{pattern:s,options:n}=l.getWatchOptions(this.options.base);await new Promise((r,p)=>{(0,G.watch)(s,n).on("error",p).on("all",B(t,10))})}},O=l;x(O,"globalExternal",["esbuild","pnpapi","ts-morph","ssh2"]);var d=m(require("path")),o=require("fs-extra"),D=require("enquirer");var c=require("fs-extra"),y=m(require("path")),W=require("lodash"),ee=m(require("@liuli-util/prettier-standard-config/package.json")),te=m(require("@liuli-util/eslint-config-ts/package.json")),ie=m(require("@liuli-util/eslint-config-react-ts/package.json")),se=m(require("@liuli-util/commitlint-standard-config/package.json")),ne=require("enquirer");var j=require("fs-extra"),v=m(require("path"));function H(i,e,t=s=>s){return i.reduce((s,n,r,p)=>s.set(e(n,r,p),t(n,r,p)),new Map)}function Q(i,e){return i?i.includes(e)?i:i+" && "+e:e}var X=m(require("path"));function F(i,e){let t=e(i);function s(n){if(n)return i;let r=X.default.dirname(i);return r===i?null:F(r,e)}return t instanceof Promise?t.then(s):s(t)}var Z=(r=>(r.Filter="filter",r.Map="map",r.ForEach="forEach",r.Reduce="reduce",r.FlatMap="flatMap",r))(Z||{}),w=class{constructor(e,t){this.type=e;this.args=t;this.type=e,this.args=t}};x(w,"Type",Z);var u=class{constructor(e){this.arr=e}static reduce(e,t,s){return e.reduce((n,r,p)=>n.then(S=>t(S,r,p)),Promise.resolve(s))}static map(e,t){return Promise.all(e.map((s,n)=>t(s,n)))}static async filter(e,t){let s=[];return await u.map(e,async(n,r)=>{await t(n,r)&&s.push(n)}),s}static async flatMap(e,t){return(await Promise.all(e.map((s,n)=>t(s,n)))).flatMap(s=>s)}static async forEach(e,t){await u.map(e,t)}tasks=[];map(e){return this.tasks.push(new w("map",[e])),this}flatMap(e){return this.tasks.push(new w("flatMap",[e])),this}filter(e){return this.tasks.push(new w("filter",[e])),this}async forEach(e){this.tasks.push(new w("map",[e])),await this}then(e,t){let s=this.value();return s.then(n=>(e&&e(s),n)).catch(n=>{throw t&&t(n),n}),s}async value(){let e=this.arr;for(let t of this.tasks)switch(t.type){case"filter":e=await u.filter(e,t.args[0]);break;case"map":e=await u.map(e,t.args[0]);break;case"flatMap":e=await u.flatMap(e,t.args[0]);break;case"forEach":await u.forEach(e,t.args[0]);return;case"reduce":return await u.reduce(e,t.args[0],t.args[1])}return e}};async function g(i=process.cwd()){return await(0,j.pathExists)(v.resolve(i,"./package.json"))}async function P(i=process.cwd()){return await g(i)?!!(await(0,j.readJson)(v.resolve(i,"./package.json"))).workspaces:!1}async function E(i=process.cwd()){return!await g(i)||await P(i)?!1:await F(v.dirname(i),P)!==null}async function J(i,e=process.cwd()){if(!await g(e))return!1;let t=await(0,j.readJson)(v.resolve(e,"./package.json")),s=new Set(Object.keys({...t.dependencies,...t.devDependencies}));return i.every(n=>s.has(n))}var _=m(require("path")),b=class{};x(b,"RootPath",_.default.resolve(__dirname,".."));async function h(i,e){let t=y.default.resolve(i,"./package.json");await(0,c.writeJson)(t,(0,W.merge)(await(0,c.readJson)(t),e),{spaces:2})}var R=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),n=await(0,c.readJson)(t);n.packages=s.workspaces,await(0,c.writeJson)(t,n,{spaces:2})},when:P},{type:"prettier",handler:async()=>{await h(this.base,{prettier:"@liuli-util/prettier-standard-config",devDependencies:{prettier:"^2.3.2","@liuli-util/prettier-standard-config":`^${ee.default.version}`}})},async when(){return await g()&&(await P()||!await E())}},{type:"commitlint",handler:async()=>{await h(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":`^${se.default.version}`}})},async when(){return await g()&&(await P()||!await E())}},{type:"gitignore",handler:async()=>{let e=y.default.resolve(this.base,".gitignore");await(0,c.writeFile)(e,await(0,c.readFile)(y.default.resolve(b.RootPath,"_gitignore"),"utf-8"))}},{type:"eslint-ts",handler:async()=>{await h(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-ts"]},devDependencies:{"@liuli-util/eslint-config-ts":`^${te.default.version}`}})},async when(){return await g()&&!await J(["vue"])&&!await J(["react"])}},{type:"eslint-react-ts",handler:async()=>{await h(this.base,{eslintConfig:{extends:["@liuli-util/eslint-config-react-ts"]},devDependencies:{"@liuli-util/eslint-config-react-ts":`^${ie.default.version}`}})},async when(){return await g()&&await J(["react"])}},{type:"jest",handler:async()=>{await h(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["src/**/*.{ts,tsx,js,jsx,css,vue}"]=["prettier --write","git add"]),e.eslintConfig&&(t["src/**/*.{ts,tsx,js,jsx}"]=["eslint --fix --quiet","git add"]);let s={scripts:{postinstall:Q(e?.scripts?.postinstall,"npx simple-git-hooks")},"simple-git-hooks":{"pre-commit":"yarn lint-staged"},"lint-staged":t,devDependencies:{"simple-git-hooks":"^2.5.1","lint-staged":"^11.1.1"}};e.commitlint&&(s=(0,W.merge)(s,{"simple-git-hooks":{"commit-msg":"yarn commitlint --edit $1"}})),await h(this.base,s)},async when(){return await g()&&(await P()||!await E())}}];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=H(await u.filter(this.syncConfigs,async s=>s.when?await s.when():!0),s=>s.type),t=await(0,ne.prompt)({type:"multiselect",message:"\u8BF7\u9009\u62E9\u9700\u8981\u540C\u6B65\u7684\u914D\u7F6E\u9879",name:"sync",choices:[...e.keys()]});await h(this.base,{sync:t.sync})}};var re=(t=>(t.Cli="cli",t.Lib="lib",t))(re||{}),T=class{async generate(e){if(!e.dest){let{dest:n}=await(0,D.prompt)({name:"dest",type:"input",message:"\u8BF7\u8F93\u5165\u9879\u76EE\u540D",validate(r){return r.trim()!==""}});e.dest=d.default.resolve(n)}if(!e.template){let{template:n}=await(0,D.prompt)({name:"template",type:"select",message:"\u8BF7\u9009\u62E9\u6A21\u677F",choices:["lib","cli"]});e.template=n}let t=d.default.resolve(b.RootPath,`templates/${e.template}`),s=d.default.resolve(e.dest);if(await(0,o.pathExists)(s)&&(await(0,o.readdir)(s)).some(n=>(0,o.pathExists)(n))){let{override:n}=await(0,D.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(!n)return}if(await(0,o.remove)(s),await(0,o.copy)(t,s,{filter:n=>d.default.basename(n)!=="node_modules"}),await T.updatePackageJSON(s),await T.updateReadme(s),e.initSync){let n=new R(d.default.resolve(e.dest));await n.init(),await n.sync()}}static async updatePackageJSON(e){let t=d.default.resolve(e,"package.json");await(0,o.writeJSON)(t,{...await(0,o.readJSON)(t),name:d.default.basename(e)},{spaces:2})}static async updateReadme(e){let t=d.default.resolve(e,"README.md"),s=await(0,o.readFile)(t,"utf-8");s=s.replace("template",d.default.basename(e)),await(0,o.writeFile)(t,s)}};0&&(module.exports={ESBuildProgram,GenerateProgram,SyncProgram,TemplateTypeEnum,mergeJson});
8
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../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": ["export * from './commands/esbuild/ESBuildProgram'\r\nexport * from './commands/generate/GenerateProgram'\r\nexport * from './commands/sync/SyncProgram'\r\n", "import { build, BuildOptions, Platform, Plugin } from 'esbuild'\r\nimport { pathExists, readFile, readJson, remove } 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, userJS } 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' | 'userjs'\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 * \u83B7\u53D6\u6784\u5EFA cjs \u7684\u9009\u9879\r\n */\r\n getBuildUserJSOption(): 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.user.js'),\r\n format: 'iife',\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal],\r\n platform: 'browser',\r\n plugins: [userJS()],\r\n incremental: this.options.isWatch,\r\n absWorkingDir: this.options.base,\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 */\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 userjs: {\r\n title: '\u6253\u5305 userjs',\r\n task: () => this.build(this.getBuildUserJSOption()),\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 remove(path.resolve(this.options.base, 'dist'))\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 { readFile, readJson, writeJson } from 'fs-extra'\r\nimport * as path from 'path'\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 * \u901A\u8FC7 ?raw \u5C06\u8D44\u6E90\u4F5C\u4E3A\u5B57\u7B26\u4E32\u6253\u5305\u8FDB\u6765\r\n * @returns\r\n */\r\nexport function raw(): Plugin {\r\n return {\r\n name: 'esbuild-plugin-raw',\r\n setup(build) {\r\n build.onResolve({ filter: /\\?raw$/ }, (args) => {\r\n return {\r\n path: path.isAbsolute(args.path) ? args.path : path.join(args.resolveDir, args.path),\r\n namespace: 'raw-loader',\r\n }\r\n })\r\n build.onLoad({ filter: /\\?raw$/, namespace: 'raw-loader' }, async (args) => {\r\n return {\r\n contents: await readFile(args.path.replace(/\\?raw$/, '')),\r\n loader: 'text',\r\n }\r\n })\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * @param {string} str\r\n */\r\nfunction isValidId(str: string) {\r\n try {\r\n new Function(`var ${str};`)\r\n } catch (err) {\r\n return false\r\n }\r\n return true\r\n}\r\n\r\nfunction defineImportEnv() {\r\n const definitions: Record<string, string> = {}\r\n Object.keys(process.env).forEach((key) => {\r\n if (isValidId(key)) {\r\n definitions[`import.meta.env.${key}`] = JSON.stringify(process.env[key])\r\n }\r\n })\r\n definitions['import.meta.env'] = '{}'\r\n return definitions\r\n}\r\n\r\n/**\r\n * Pass environment variables to esbuild.\r\n * @return An esbuild plugin.\r\n */\r\nexport function envPlugin(): Plugin {\r\n return {\r\n name: 'esbuild-plugin-env',\r\n setup(build) {\r\n const { platform, define = {} } = build.initialOptions\r\n if (platform === 'node') {\r\n return\r\n }\r\n build.initialOptions.define = define\r\n Object.assign(build.initialOptions.define, defineImportEnv())\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\nfunction generateBanner(meta: object) {\r\n return (\r\n [\r\n '// ==UserScript==',\r\n ...Object.entries(meta)\r\n .map(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => `// @${key} ${item}`)\r\n }\r\n return `// @${key} ${value}`\r\n })\r\n .flat(),\r\n '// ==/UserScript==',\r\n ].join('\\n') + '\\n'\r\n )\r\n}\r\n\r\nexport function userJS(): Plugin {\r\n return {\r\n name: 'esbuild-plugin-userjs',\r\n async setup(build) {\r\n const json = (await readJson(path.resolve(build.initialOptions.absWorkingDir!, 'package.json'))) as {\r\n userjs: object\r\n }\r\n if (!json.userjs) {\r\n throw new Error('userjs is not supported')\r\n }\r\n if (!build.initialOptions.banner) {\r\n build.initialOptions.banner = {}\r\n }\r\n build.initialOptions.banner!['js'] = generateBanner(json.userjs)\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'\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: Record<string, string[]> = {}\r\n if (json.prettier) {\r\n lintStaged['src/**/*.{ts,tsx,js,jsx,css,vue}'] = ['prettier --write', 'git add']\r\n }\r\n if (json.eslintConfig) {\r\n lintStaged['src/**/*.{ts,tsx,js,jsx}'] = ['eslint --fix --quiet', 'git add']\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': lintStaged,\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 * as 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(cwd: string = process.cwd()): 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(cwd: string = process.cwd()): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(path.resolve(cwd, './package.json'))) 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(cwd: string = process.cwd()): 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(deps: string[], cwd: string = process.cwd()): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(path.resolve(cwd, './package.json'))) as PackageJson\r\n const set = new Set(Object.keys({ ...json.dependencies, ...json.devDependencies }))\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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",
3
+ "sources": ["../src/index.ts", "../src/commands/esbuild/ESBuildProgram.ts", "../src/commands/esbuild/util/debounce.ts", "../src/commands/esbuild/util/getPkgGlobalName.ts", "../src/commands/esbuild/util/metafile.ts", "../src/commands/esbuild/util/nativeNodeModules.ts", "../src/commands/esbuild/util/nodeExternal.ts", "../src/commands/esbuild/util/raw.ts", "../src/commands/esbuild/util/resolve.ts", "../src/commands/esbuild/util/userJS.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": ["export * from './commands/esbuild/ESBuildProgram'\r\nexport * from './commands/generate/GenerateProgram'\r\nexport * from './commands/sync/SyncProgram'\r\n", "import { build, BuildOptions, Platform, Plugin } from 'esbuild'\r\nimport { pathExists, readFile, readJson, remove } 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 { 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\nimport { nativeNodeModules, nodeExternal, resolve, userJS } from './util'\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' | 'userjs'\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 * \u83B7\u53D6\u6784\u5EFA cjs \u7684\u9009\u9879\r\n */\r\n getBuildUserJSOption(): 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.user.js'),\r\n format: 'iife',\r\n bundle: true,\r\n external: [...ESBuildProgram.globalExternal],\r\n platform: 'browser',\r\n plugins: [userJS() as any],\r\n incremental: this.options.isWatch,\r\n absWorkingDir: this.options.base,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA cjs \u7684\u9009\u9879\r\n * @param deps\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 plugins: [resolve([['@liuli-util/esbuild-plugins/src/', '@liuli-util/esbuild-plugins']])] as any,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA esm \u7684\u9009\u9879\r\n * @param deps\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 plugins: [resolve([['@liuli-util/esbuild-plugins/src/', '@liuli-util/esbuild-plugins']])] as any,\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6784\u5EFA iife \u7684\u9009\u9879\r\n * @param deps\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 */\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(nodeExternal() as any, nativeNodeModules() as any)\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 userjs: {\r\n title: '\u6253\u5305 userjs',\r\n task: () => this.build(this.getBuildUserJSOption()),\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 remove(path.resolve(this.options.base, 'dist'))\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", "/**\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 { Plugin } from 'esbuild'\r\nimport { writeJson } from 'fs-extra'\r\n\r\n/**\r\n * \u751F\u6210 metafile \u7684\u63D2\u4EF6\r\n * @param metafilePath\r\n */\r\n export function metafile(metafilePath: string): Plugin {\r\n return {\r\n name: '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", "import { Plugin } from 'esbuild'\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", "import { Plugin } from 'esbuild'\r\n\r\n/**\r\n * \u6392\u9664\u548C\u66FF\u6362 node \u5185\u7F6E\u6A21\u5757\r\n */\r\nexport function nodeExternal(): Plugin {\r\n return {\r\n name: 'nodeExternals',\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", "import { Plugin } from 'esbuild'\r\nimport { readFile } from 'fs-extra'\r\nimport * as path from 'path'\r\n\r\n/**\r\n * \u901A\u8FC7 ?raw \u5C06\u8D44\u6E90\u4F5C\u4E3A\u5B57\u7B26\u4E32\u6253\u5305\u8FDB\u6765\r\n * @returns\r\n */\r\nexport function raw(): Plugin {\r\n return {\r\n name: 'raw',\r\n setup(build) {\r\n build.onResolve({ filter: /\\?raw$/ }, (args) => {\r\n return {\r\n path: path.isAbsolute(args.path) ? args.path : path.join(args.resolveDir, args.path),\r\n namespace: 'raw-loader',\r\n }\r\n })\r\n build.onLoad({ filter: /\\?raw$/, namespace: 'raw-loader' }, async (args) => {\r\n return {\r\n contents: await readFile(args.path.replace(/\\?raw$/, '')),\r\n loader: 'text',\r\n }\r\n })\r\n },\r\n }\r\n}\r\n", "import { build, Plugin } from 'esbuild'\r\nimport path from 'path'\r\n\r\n/**\r\n * \u5C06\u6307\u5B9A\u7684 import \u91CD\u5199\u4E3A\u53E6\u4E00\u4E2A\r\n * @param entries\r\n * @returns\r\n */\r\nexport function resolve(entries: [from: string, to: string][]): Plugin {\r\n return {\r\n name: 'resolve',\r\n setup(build) {\r\n build.onResolve({ filter: /.*/ }, async (args) => {\r\n const findEntries = entries.find((item) => item[0] === args.path)\r\n if (!findEntries) {\r\n return\r\n }\r\n return await build.resolve(findEntries[1])\r\n })\r\n },\r\n }\r\n}\r\n", "import { Plugin } from 'esbuild'\r\nimport { readJson } from 'fs-extra'\r\nimport path from 'path'\r\n\r\nfunction generateBanner(meta: object) {\r\n return (\r\n [\r\n '// ==UserScript==',\r\n ...Object.entries(meta)\r\n .map(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => `// @${key} ${item}`)\r\n }\r\n return `// @${key} ${value}`\r\n })\r\n .flat(),\r\n '// ==/UserScript==',\r\n ].join('\\n') + '\\n'\r\n )\r\n}\r\n\r\nexport function userJS(): Plugin {\r\n return {\r\n name: 'userJS',\r\n async setup(build) {\r\n const json = (await readJson(path.resolve(build.initialOptions.absWorkingDir!, 'package.json'))) as {\r\n userjs: object\r\n }\r\n if (!json.userjs) {\r\n throw new Error('userjs is not supported')\r\n }\r\n if (!build.initialOptions.banner) {\r\n build.initialOptions.banner = {}\r\n }\r\n build.initialOptions.banner!['js'] = generateBanner(json.userjs)\r\n },\r\n }\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'\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: Record<string, string[]> = {}\r\n if (json.prettier) {\r\n lintStaged['src/**/*.{ts,tsx,js,jsx,css,vue}'] = ['prettier --write', 'git add']\r\n }\r\n if (json.eslintConfig) {\r\n lintStaged['src/**/*.{ts,tsx,js,jsx}'] = ['eslint --fix --quiet', 'git add']\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': lintStaged,\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 * as 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(cwd: string = process.cwd()): 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(cwd: string = process.cwd()): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(path.resolve(cwd, './package.json'))) 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(cwd: string = process.cwd()): 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(deps: string[], cwd: string = process.cwd()): Promise<boolean> {\r\n if (!(await isNpmPackage(cwd))) {\r\n return false\r\n }\r\n const json = (await readJson(path.resolve(cwd, './package.json'))) as PackageJson\r\n const set = new Set(Object.keys({ ...json.dependencies, ...json.devDependencies }))\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/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@liuli-util/cli",
3
- "version": "3.21.0",
3
+ "version": "3.22.1",
4
4
  "description": "一个针对于库和 CLI 应用程序打包的零配置 CLI",
5
- "main": "dist/index.js",
6
- "module": "dist/index.esm.js",
7
- "types": "dist/index.d.ts",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.esm.js",
7
+ "types": "./dist/index.d.ts",
8
8
  "license": "MIT",
9
9
  "bin": {
10
10
  "liuli-cli": "./bin.js"
@@ -20,55 +20,59 @@
20
20
  "registry": "https://registry.npmjs.org/"
21
21
  },
22
22
  "dependencies": {
23
- "@liuli-util/commitlint-standard-config": "^0.1.6",
24
- "@liuli-util/eslint-config-react-ts": "^0.2.1",
25
- "@liuli-util/eslint-config-ts": "^0.4.0",
26
- "@liuli-util/prettier-standard-config": "^0.2.0",
27
- "ajv": "^8.8.2",
23
+ "@liuli-util/commitlint-standard-config": "0.1.6",
24
+ "@liuli-util/eslint-config-react-ts": "0.2.1",
25
+ "@liuli-util/eslint-config-ts": "0.4.0",
26
+ "@liuli-util/prettier-standard-config": "0.3.0",
27
+ "ajv": "^8.11.0",
28
28
  "ajv-formats": "^2.1.1",
29
29
  "ajv-i18n": "^4.2.0",
30
- "chokidar": "^3.5.2",
31
- "commander": "^8.2.0",
32
- "conf": "^10.1.1",
30
+ "chokidar": "^3.5.3",
31
+ "commander": "^9.4.0",
32
+ "conf": "^10.2.0",
33
33
  "enquirer": "^2.3.6",
34
- "esbuild": "^0.13.15",
35
- "fs-extra": "^10.0.0",
36
- "glob": "^7.2.0",
37
- "glob-promise": "^4.2.0",
38
- "json5": "^2.2.0",
39
- "simple-git": "^2.45.1",
34
+ "esbuild": "0.14.39",
35
+ "fs-extra": "^10.1.0",
36
+ "glob": "^8.0.3",
37
+ "glob-promise": "^5.0.0",
38
+ "json5": "^2.2.1",
39
+ "simple-git": "^3.11.0",
40
40
  "spinnies": "^0.5.1",
41
- "ssh2": "^1.5.0",
42
- "ssh2-sftp-client": "^7.2.1",
41
+ "ssh2": "^1.11.0",
42
+ "ssh2-sftp-client": "^9.0.3",
43
43
  "tar": "^6.1.11",
44
- "ts-morph": "^12.0.0"
44
+ "ts-morph": "^15.1.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/fs-extra": "^9.0.13",
48
- "@types/glob": "^7",
49
- "@types/jest": "^27.0.2",
50
- "@types/lodash": "^4.14.178",
51
- "@types/node": "^16.9.6",
52
- "@types/ssh2-sftp-client": "^7.0.0",
53
- "esno": "^0.9.1",
54
- "jest": "^27.4.7",
48
+ "@types/glob": "^7.2.0",
49
+ "@types/jest": "^28.1.6",
50
+ "@types/lodash": "^4.14.182",
51
+ "@types/node": "^18.6.4",
52
+ "@types/ssh2-sftp-client": "^7.1.0",
53
+ "jest": "^28.1.3",
55
54
  "lodash": "^4.17.21",
56
55
  "rimraf": "^3.0.2",
57
- "ts-jest": "^27.1.3",
58
- "type-fest": "^2.3.4",
59
- "typescript": "^4.5.5"
56
+ "ts-jest": "^28.0.7",
57
+ "tsx": "^3.9.0",
58
+ "type-fest": "^2.18.0",
59
+ "typescript": "^4.7.4"
60
60
  },
61
61
  "repository": {
62
62
  "type": "git",
63
63
  "url": "https://github.com/rxliuli/liuli-tools/tree/master/apps/liuli-cli"
64
64
  },
65
+ "exports": {
66
+ "import": "./dist/index.esm.js",
67
+ "require": "./dist/index.js",
68
+ "types": "./dist/index.d.ts"
69
+ },
65
70
  "scripts": {
66
71
  "setup": "pnpm build",
67
- "build": "esno src/bin.ts build cli",
68
- "dev": "esno src/bin.ts build cli -w",
69
- "start": "esno src/bin.ts",
72
+ "build": "tsx src/bin.ts build cli",
73
+ "dev": "tsx src/bin.ts build cli -w",
74
+ "start": "tsx src/bin.ts",
70
75
  "test": "jest --all",
71
76
  "lint": "eslint --fix src/**"
72
- },
73
- "readme": "# @liuli-util/cli\r\n\r\n> [中文](https://github.com/rxliuli/liuli-tools/tree/master/apps/liuli-cli/README.zh-CN.md)\r\n\r\nA zero-configuration CLI for packaging libraries and CLI applications.\r\n\r\n## Getting Started\r\n\r\n### Install\r\n\r\n```sh\r\npnpm i -D @liuli-util/cli # Local installation\r\npnpm i -g @liuli-util/cli # global install\r\n```\r\n\r\n### Packages\r\n\r\n```sh\r\nliuli-cli build lib # Package the library\r\nliuli-cli build cli # Package cli references\r\n```\r\n\r\n> Adding the `-w` option starts the rollup monitoring mode, the dist/ will not be compressed and the dependencies will not be added to the bundle.\r\n\r\n![watchdog mode](https://liuli.dev/images/liuli-cli%20%E7%9B%91%E8%A7%86%E6%A8%A1%E5%BC%8F.gif)\r\n\r\n### Generate\r\n\r\n```sh\r\nliuli-cli generate <name> --template lib # Generate ts-lib project\r\nliuli-cli generate <name> --template cli # generate cli project\r\n```\r\n\r\nutil also supports interactive project creation\r\n\r\n```shell\r\nliuli-cli generate\r\n```\r\n\r\n![liuli-cli interactive creation screenshot](https://liuli.dev/images/liuli-cli%20%E4%BA%A4%E4%BA%92%E5%BC%8F%E5%88%9B%E5%BB%BA%E6%88%AA%E5%9B%BE.gif)\r\n\r\n### Deployment\r\n\r\nSupport for deploying front-end resources to a remote location via sftp/gh-pages, with configuration information in the `deploy` field in package.json\r\n\r\n```sh\r\nliuli deploy\r\n```\r\n\r\npublic\r\n\r\n| configuration | description | defaults |\r\n| ------------- | --------------------------------- | -------- |\r\n| ``type` | deployment type, ``sftp/gh-pgaes` | none |\r\n| `dist` | Static resource directory | None |\r\n| `dest` | deployed remote directory | none |\r\n\r\nsftp\r\n\r\n| configuration | description | defaults |\r\n| -------------------- | ----------------- | -------- |\r\n| `sshConfig.host` | ip address of ssh | |\r\n| `sshConfig.port` | ssh's port number | 22 |\r\n| `sshConfig.username` | ssh's username | |\r\n\r\ngh-pages\r\n\r\n| configuration | description | default |\r\n| ----------------- | ----------------------------------------- | --------------------------------------- |\r\n| `repo?: string` | the git address of the project to push to | the default is the current project |\r\n| `remote?: string` | push remote | defaults to origin |\r\n| `branch?: string` | remote branch name | defaults to gh-pages |\r\n| `add?: boolean` | whether to push incrementally | cleans up the dest directory by default |\r\n\r\nExample configuration for deploying a vuepress documentation site\r\n\r\n```json\r\n{\r\n \"deploy\": {\r\n \"type\": \"gh-pages\",\r\n \"dist\": \"docs/.vuepress/dist\"\r\n }\r\n}\r\n```\r\n\r\n### Sync configuration\r\n\r\n```shell\r\nliuli-cli sync\r\n```\r\n\r\nYou need to specify which configuration to sync in package.json\r\n\r\n```json\r\n{\r\n \"sync\": [\"prettier\", \"workspaces\", \"commitlint\", \"simplehooks\"]\r\n}\r\n```\r\n\r\nCurrently supported configuration items\r\n\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- jest\r\n\r\nFuture goals: By default, this will include checking the cli's own sync (if it needs to be used outside of monorepo), eslint/style-lint, and interactive cli when not configured\r\n\r\n> Note: Currently, only dependencies are synchronized and no installation is performed\r\n\r\nInteractive initialization of synchronized configuration is also supported\r\n\r\n```shell\r\nliuli-cli sync init\r\n```\r\n\r\n## Design philosophy\r\n\r\n- Conventions outweigh configuration and should be left out if possible. VitePress does the same thing, see: https://vitepress.vuejs.org/#lighter-page-weight This leads to a number of constraints, including the following\r\n - The entry file must be `src/index.ts` when packaging the library, and the exit file must be `dist/index.esm.js` and `dist/index.js`\r\n - The entry file must be `src/bin.ts` and the exit file is `dist/bin.js` when packaging the CLI.\r\n - When packaging lib, all dependencies are treated as external dependencies, while when packaging cli, all dependencies are typed into the bundle\r\n\r\n## FAQ\r\n\r\n### Why not bundle external dependencies\r\n\r\nThe main reason is that we want to leave the bundling to the final application, to avoid bundling the same dependencies over and over again, and to avoid dealing with the problem of using `worker_threads` directly on the filesystem in nodejs.\r\n"
77
+ }
74
78
  }
@@ -5,12 +5,12 @@ import { PackageJson } from 'type-fest'
5
5
  import { Project } from 'ts-morph'
6
6
  import { promise } from 'glob-promise'
7
7
  import { IOptions } from 'glob'
8
- import { nativeNodeModules, nodeExternals, userJS } from './util/esbuildPlugins'
9
8
  import { watch } from 'chokidar'
10
9
  import Spinnies from 'spinnies'
11
10
  import { debounce } from './util/debounce'
12
11
  import { parse } from 'json5'
13
12
  import { getPkgGlobalName } from './util/getPkgGlobalName'
13
+ import { nativeNodeModules, nodeExternal, resolve, userJS } from './util'
14
14
 
15
15
  interface ESBuildProgramOptions {
16
16
  base: string
@@ -108,7 +108,7 @@ export class ESBuildProgram {
108
108
  bundle: true,
109
109
  external: [...ESBuildProgram.globalExternal],
110
110
  platform: 'browser',
111
- plugins: [userJS()],
111
+ plugins: [userJS() as any],
112
112
  incremental: this.options.isWatch,
113
113
  absWorkingDir: this.options.base,
114
114
  }
@@ -117,8 +117,6 @@ export class ESBuildProgram {
117
117
  /**
118
118
  * 获取构建 cjs 的选项
119
119
  * @param deps
120
- * @param platform
121
- * @param plugins
122
120
  */
123
121
  getBuildCjsOption({ deps, platform }: { deps: string[]; platform: Platform }): BuildOptions {
124
122
  return {
@@ -132,14 +130,13 @@ export class ESBuildProgram {
132
130
  minify: !this.options.isWatch,
133
131
  incremental: this.options.isWatch,
134
132
  metafile: this.options.isWatch,
133
+ plugins: [resolve([['@liuli-util/esbuild-plugins/src/', '@liuli-util/esbuild-plugins']])] as any,
135
134
  }
136
135
  }
137
136
 
138
137
  /**
139
138
  * 获取构建 esm 的选项
140
139
  * @param deps
141
- * @param platform
142
- * @param plugins
143
140
  */
144
141
  getBuildESMOption({ deps, platform }: { deps: string[]; platform: Platform }): BuildOptions {
145
142
  return {
@@ -153,13 +150,13 @@ export class ESBuildProgram {
153
150
  minify: !this.options.isWatch,
154
151
  incremental: this.options.isWatch,
155
152
  metafile: this.options.isWatch,
153
+ plugins: [resolve([['@liuli-util/esbuild-plugins/src/', '@liuli-util/esbuild-plugins']])] as any,
156
154
  }
157
155
  }
158
156
 
159
157
  /**
160
158
  * 获取构建 iife 的选项
161
159
  * @param deps
162
- * @param platform
163
160
  */
164
161
  getBuildIifeOption({ platform, globalName }: { platform: Platform; globalName: string }): BuildOptions {
165
162
  return {
@@ -180,7 +177,6 @@ export class ESBuildProgram {
180
177
  /**
181
178
  * 获取构建 cli 的选项
182
179
  * @param deps
183
- * @param platform
184
180
  */
185
181
  getBuildCliOption({ platform }: { deps: string[]; platform: Platform }): BuildOptions {
186
182
  const plugins = ESBuildProgram.getPlugins(platform)
@@ -205,7 +201,7 @@ export class ESBuildProgram {
205
201
  static getPlugins(platform: string): Plugin[] {
206
202
  const plugins: Plugin[] = []
207
203
  if (platform === 'node') {
208
- plugins.push(nodeExternals(), nativeNodeModules())
204
+ plugins.push(nodeExternal() as any, nativeNodeModules() as any)
209
205
  }
210
206
  return plugins
211
207
  }
@@ -3,8 +3,8 @@ import * as path from 'path'
3
3
  import { mkdirp, pathExists, remove, writeFile, writeJson } from 'fs-extra'
4
4
  import { PackageJson } from 'type-fest'
5
5
  import { build, Platform } from 'esbuild'
6
- import { nativeNodeModules, nodeExternals } from '../util/esbuildPlugins'
7
6
  import { findParent } from '../../../utils'
7
+ import { nativeNodeModules, nodeExternals } from '@liuli-util/esbuild-plugins/src'
8
8
 
9
9
  describe('测试 ESBuildProgram', () => {
10
10
  const base: string = path.resolve(__dirname, '.temp')
@@ -159,7 +159,7 @@ it('测试 esbuild', async () => {
159
159
  // ...(await ESBuildProgram.getDeps(path.resolve())),
160
160
  ],
161
161
  platform: 'node',
162
- plugins: [nativeNodeModules(), nodeExternals()],
162
+ plugins: [nativeNodeModules(), nodeExternals()] as any,
163
163
  treeShaking: true,
164
164
  })
165
165
  })
@@ -0,0 +1,22 @@
1
+ import { Plugin } from 'esbuild'
2
+
3
+ /**
4
+ * 自动排除所有依赖项
5
+ * golang 不支持 js 的一些语法,参考 https://github.com/evanw/esbuild/issues/1634
6
+ */
7
+ export function autoExternal(): Plugin {
8
+ return {
9
+ name: 'autoExternal',
10
+ setup(build) {
11
+ build.onResolve({ filter: /.*/ }, (args) => {
12
+ if (/^\.{1,2}\//.test(args.path)) {
13
+ return
14
+ }
15
+ return {
16
+ path: args.path,
17
+ external: true,
18
+ }
19
+ })
20
+ },
21
+ }
22
+ }