startx 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/apps/cli/package.json +11 -5
  2. package/apps/cli/src/utils/inquirer.ts +1 -1
  3. package/apps/cli/vitest.config.ts +3 -0
  4. package/apps/core-server/package.json +4 -3
  5. package/apps/core-server/vitest.config.ts +3 -0
  6. package/apps/startx-cli/dist/index.mjs +2 -2
  7. package/apps/startx-cli/package.json +9 -2
  8. package/apps/startx-cli/src/commands/init.ts +6 -2
  9. package/apps/startx-cli/src/configs/files.ts +2 -3
  10. package/apps/startx-cli/src/configs/scripts.ts +1 -1
  11. package/apps/startx-cli/vitest.config.ts +3 -0
  12. package/configs/eslint-config/package.json +5 -3
  13. package/configs/eslint-config/src/rules/no-json-parse-json-stringify.test.ts +8 -9
  14. package/configs/eslint-config/src/rules/no-json-parse-json-stringify.ts +18 -8
  15. package/configs/tsdown-config/package.json +4 -1
  16. package/configs/vitest-config/package.json +2 -1
  17. package/configs/vitest-config/src/base.ts +1 -0
  18. package/configs/vitest-config/src/frontend.ts +11 -11
  19. package/configs/vitest-config/src/node.ts +2 -2
  20. package/configs/vitest-config/tsconfig.json +3 -1
  21. package/package.json +1 -1
  22. package/packages/@repo/constants/package.json +2 -1
  23. package/packages/@repo/constants/vitest.config.ts +3 -0
  24. package/packages/@repo/db/package.json +1 -0
  25. package/packages/@repo/db/vitest.config.ts +3 -0
  26. package/packages/@repo/env/vitest.config.ts +3 -0
  27. package/packages/@repo/lib/vitest.config.ts +3 -0
  28. package/packages/@repo/logger/vitest.config.ts +3 -0
  29. package/packages/@repo/mail/package.json +4 -3
  30. package/packages/@repo/mail/vitest.config.ts +3 -0
  31. package/packages/@repo/redis/package.json +1 -0
  32. package/packages/@repo/redis/vitest.config.ts +3 -0
  33. package/packages/ui/package.json +2 -1
  34. package/packages/ui/vitest.config.ts +3 -0
  35. package/startx.json +1 -0
@@ -5,9 +5,17 @@
5
5
  "type": "module",
6
6
  "main": "index.js",
7
7
  "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1",
9
8
  "build": "tsdown --config-loader unrun",
10
- "cli": "tsx src/index.ts"
9
+ "cli": "tsx src/index.ts",
10
+ "start": "node dist/index.mjs",
11
+ "lint": "eslint .",
12
+ "lint:fix": "eslint . src/**/*.ts --fix",
13
+ "clean": "rimraf dist .turbo dist",
14
+ "deep:clean": "rimraf node_modules dist .turbo",
15
+ "typecheck": "tsc --noEmit",
16
+ "format": "prettier --write .",
17
+ "format:check": "prettier --check .",
18
+ "test": "vitest run"
11
19
  },
12
20
  "keywords": [],
13
21
  "author": "",
@@ -21,9 +29,7 @@
21
29
  "dependencies": {
22
30
  "@inquirer/prompts": "^8.3.0",
23
31
  "@repo/logger": "workspace:*",
24
- "chokidar": "^4.0.3",
25
- "commander": "^14.0.0",
26
- "type-fest": "^5.4.4"
32
+ "commander": "^14.0.0"
27
33
  },
28
34
  "startx": {
29
35
  "gTags": [
@@ -131,7 +131,7 @@ export class CommonInquirer {
131
131
  const answer = await checkbox({
132
132
  message,
133
133
  choices,
134
- validate: (input: string[]) => {
134
+ validate: input => {
135
135
  if (required && input.length === 0) {
136
136
  return "You must select at least one option.";
137
137
  }
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -8,13 +8,13 @@
8
8
  "dev": "tsx watch src/index.ts",
9
9
  "dev:debug": "tsx watch --inspect src/index.ts",
10
10
  "bun:dev": "bun --watch src/index.ts",
11
+ "build": "tsdown --config-loader unrun",
11
12
  "start": "node dist/index.mjs",
12
13
  "lint": "eslint .",
13
- "build": "tsdown --config-loader unrun",
14
- "clean": "rimraf dist",
14
+ "lint:fix": "eslint . src/**/*.ts --fix",
15
+ "clean": "rimraf dist .turbo dist",
15
16
  "deep:clean": "rimraf node_modules dist .turbo",
16
17
  "typecheck": "tsc --noEmit",
17
- "lint:fix": "eslint . src/**/*.ts --fix",
18
18
  "format": "biome format --write .",
19
19
  "format:check": "biome ci .",
20
20
  "test": "vitest run"
@@ -42,6 +42,7 @@
42
42
  "@types/express-fileupload": "catalog:",
43
43
  "@types/morgan": "catalog:",
44
44
  "eslint-config": "workspace:*",
45
+ "vitest-config": "workspace:*",
45
46
  "tsdown-config": "workspace:*",
46
47
  "typescript-config": "workspace:*"
47
48
  },
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -184,7 +184,7 @@ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\
184
184
  `)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(`
185
185
  `,e)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(this.onKeyLine=!1,t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let n=!this.onKeyLine&&this.indent===e.indent,r=n&&(t.sep||t.explicitKey)&&this.type!==`seq-item-ind`,a=[];if(r&&t.sep&&!t.value){let n=[];for(let r=0;r<t.sep.length;++r){let i=t.sep[r];switch(i.type){case`newline`:n.push(r);break;case`space`:break;case`comment`:i.indent>e.indent&&(n.length=0);break;default:n.length=0}}n.length>=2&&(a=t.sep.splice(n[1]))}switch(this.type){case`anchor`:case`tag`:r||t.value?(a.push(this.sourceToken),e.items.push({start:a}),this.onKeyLine=!0):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`explicit-key-ind`:!t.sep&&!t.explicitKey?(t.start.push(this.sourceToken),t.explicitKey=!0):r||t.value?(a.push(this.sourceToken),e.items.push({start:a,explicitKey:!0})):this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case`map-value-ind`:if(t.explicitKey)if(!t.sep)if(i(t.start,`newline`))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let e=c(t.start);this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:null,sep:[this.sourceToken]}]})}else if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(i(t.sep,`map-value-ind`))this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]});else if(o(t.key)&&!i(t.sep,`newline`)){let e=c(t.start),n=t.key,r=t.sep;r.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:n,sep:r}]})}else a.length>0?t.sep=t.sep.concat(a,this.sourceToken):t.sep.push(this.sourceToken);else t.sep?t.value||r?e.items.push({start:a,key:null,sep:[this.sourceToken]}):i(t.sep,`map-value-ind`)?this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);r||t.value?(e.items.push({start:a,key:n,sep:[]}),this.onKeyLine=!0):t.sep?this.stack.push(n):(Object.assign(t,{key:n,sep:[]}),this.onKeyLine=!0);return}default:{let r=this.startBlockValue(e);if(r){if(r.type===`block-seq`){if(!t.explicitKey&&t.sep&&!i(t.sep,`newline`)){yield*this.pop({type:`error`,offset:this.offset,message:`Unexpected block-seq-ind on same line with key`,source:this.source});return}}else n&&e.items.push({start:a});this.stack.push(r);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case`anchor`:case`tag`:if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case`seq-item-ind`:if(this.indent!==e.indent)break;t.value||i(t.start,`seq-item-ind`)?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return}if(this.indent>e.indent){let t=this.startBlockValue(e);if(t){this.stack.push(t);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type===`flow-error-end`){let e;do yield*this.pop(),e=this.peek(1);while(e?.type===`flow-collection`)}else if(e.end.length===0){switch(this.type){case`comma`:case`explicit-key-ind`:!t||t.sep?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return;case`map-value-ind`:!t||t.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});return;case`space`:case`comment`:case`newline`:case`anchor`:case`tag`:!t||t.value?e.items.push({start:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:n,sep:[]}):t.sep?this.stack.push(n):Object.assign(t,{key:n,sep:[]});return}case`flow-map-end`:case`flow-seq-end`:e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{let t=this.peek(2);if(t.type===`block-map`&&(this.type===`map-value-ind`&&t.indent===e.indent||this.type===`newline`&&!t.items[t.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type===`map-value-ind`&&t.type!==`flow-collection`){let n=c(s(t));l(e);let r=e.end.splice(1,e.end.length);r.push(this.sourceToken);let i={type:`block-map`,offset:e.offset,indent:e.indent,items:[{start:n,key:e,sep:r}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let e=this.source.indexOf(`
186
186
  `)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(`
187
- `,e)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return this.flowScalar(this.type);case`block-scalar-header`:return{type:`block-scalar`,offset:this.offset,indent:this.indent,props:[this.sourceToken],source:``};case`flow-map-start`:case`flow-seq-start`:return{type:`flow-collection`,offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case`seq-item-ind`:return{type:`block-seq`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case`explicit-key-ind`:{this.onKeyLine=!0;let t=c(s(e));return t.push(this.sourceToken),{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,explicitKey:!0}]}}case`map-value-ind`:{this.onKeyLine=!0;let t=c(s(e));return{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!==`comment`||this.indent<=t?!1:e.every(e=>e.type===`newline`||e.type===`space`)}*documentEnd(e){this.type!==`doc-mode`&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case`comma`:case`doc-start`:case`doc-end`:case`flow-seq-end`:case`flow-map-end`:case`map-value-ind`:yield*this.pop(),yield*this.step();break;case`newline`:this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop())}}}})),N_=_((e=>{var t=T_(),n=c_(),r=l_(),i=Ng(),a=X(),o=j_(),s=M_();function c(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new o.LineCounter||null,prettyErrors:t}}function l(e,n={}){let{lineCounter:i,prettyErrors:a}=c(n),o=new s.Parser(i?.addNewLine),l=new t.Composer(n),u=Array.from(l.compose(o.parse(e)));if(a&&i)for(let t of u)t.errors.forEach(r.prettifyError(e,i)),t.warnings.forEach(r.prettifyError(e,i));return u.length>0?u:Object.assign([],{empty:!0},l.streamInfo())}function u(e,n={}){let{lineCounter:i,prettyErrors:a}=c(n),o=new s.Parser(i?.addNewLine),l=new t.Composer(n),u=null;for(let t of l.compose(o.parse(e),!0,e.length))if(!u)u=t;else if(u.options.logLevel!==`silent`){u.errors.push(new r.YAMLParseError(t.range.slice(0,2),`MULTIPLE_DOCS`,`Source contains multiple documents; please use YAML.parseAllDocuments()`));break}return a&&i&&(u.errors.forEach(r.prettifyError(e,i)),u.warnings.forEach(r.prettifyError(e,i))),u}function d(e,t,n){let r;typeof t==`function`?r=t:n===void 0&&t&&typeof t==`object`&&(n=t);let a=u(e,n);if(!a)return null;if(a.warnings.forEach(e=>i.warn(a.options.logLevel,e)),a.errors.length>0){if(a.options.logLevel!==`silent`)throw a.errors[0];a.errors=[]}return a.toJS(Object.assign({reviver:r},n))}function f(e,t,r){let i=null;if(typeof t==`function`||Array.isArray(t)?i=t:r===void 0&&t&&(r=t),typeof r==`string`&&(r=r.length),typeof r==`number`){let e=Math.round(r);r=e<1?void 0:e>8?{indent:8}:{indent:e}}if(e===void 0){let{keepUndefined:e}=r??t??{};if(!e)return}return a.isDocument(e)&&!i?e.toString(r):new n.Document(e,i,r).toString(r)}e.parse=d,e.parseAllDocuments=l,e.parseDocument=u,e.stringify=f})),P_=b(_((e=>{var t=T_(),n=c_(),r=o_(),i=l_(),a=Tg(),o=X(),s=Ig(),c=Z(),l=Rg(),u=Bg();k_();var d=A_(),f=j_(),p=M_(),m=N_(),h=yg();e.Composer=t.Composer,e.Document=n.Document,e.Schema=r.Schema,e.YAMLError=i.YAMLError,e.YAMLParseError=i.YAMLParseError,e.YAMLWarning=i.YAMLWarning,e.Alias=a.Alias,e.isAlias=o.isAlias,e.isCollection=o.isCollection,e.isDocument=o.isDocument,e.isMap=o.isMap,e.isNode=o.isNode,e.isPair=o.isPair,e.isScalar=o.isScalar,e.isSeq=o.isSeq,e.Pair=s.Pair,e.Scalar=c.Scalar,e.YAMLMap=l.YAMLMap,e.YAMLSeq=u.YAMLSeq,e.Lexer=d.Lexer,e.LineCounter=f.LineCounter,e.Parser=p.Parser,e.parse=m.parse,e.parseAllDocuments=m.parseAllDocuments,e.parseDocument=m.parseDocument,e.stringify=m.stringify,e.visit=h.visit,e.visitAsync=h.visitAsync}))(),1);function F_(){return $p.NODE_ENV===`development`?t.resolve(process.cwd(),`../../`):process.cwd()}const I_=new class{root=F_();async pathExists(e){try{return await a.access(e),!0}catch{return!1}}async writeFile({file:e,content:n}){await a.writeFile(t.resolve(this.root,e),n)}async writeJSONFile({file:e,content:n,dir:r}){e=`${e}.json`;let i=t.resolve(this.root,e);if(r){let n=t.resolve(this.root,r);await this.ensurePathExists({dir:r}),i=t.resolve(n,e)}await a.writeFile(i,JSON.stringify(n,null,2))}async readFile({file:e}){return await a.readFile(t.resolve(this.root,e),`utf-8`)}async readJSONFile({file:e,dir:n}){try{e=`${e}.json`;let r=t.resolve(this.root,n??``,e),i=await a.readFile(r,`utf-8`);return JSON.parse(i)}catch(t){return console.error(`Failed to read JSON file at ${e}:`,t),null}}async readYamlFile({file:e,dir:n}){try{e=`${e}.yaml`;let r=t.resolve(this.root,n??``,e),i=await a.readFile(r,`utf-8`);return P_.parseDocument(i)}catch(t){return console.error(`Failed to read Yaml file at ${e}:`,t),null}}async ensurePathExists({dir:e}){let n=t.resolve(this.root,e);await this.pathExists(n)||await a.mkdir(n,{recursive:!0})}async avoidOverriding({file:e}){let n=t.resolve(this.root,e);if(await this.pathExists(n))throw Error(`File ${n} already exists`)}async removeFile({file:e}){let n=t.resolve(this.root,e);await this.pathExists(n)&&await a.unlink(n)}async removeDirectory({dir:e,target:n}){let r=t.resolve(this.root,e,n);await this.pathExists(r)&&await a.rm(r,{recursive:!0,force:!0})}async copyFile({from:e,to:n}){await this.ensurePathExists({dir:t.dirname(n)}),await a.copyFile(t.resolve(this.root,e),t.resolve(this.root,n))}async copyDirectory({from:e,to:n,recursive:r=!0,include:i,exclude:o}){let s=t.resolve(this.root,e),c=t.resolve(this.root,n);if(!await this.pathExists(s))return;await this.ensurePathExists({dir:t.join(n)});let l=await a.readdir(s,{withFileTypes:!0});for(let u of l){let l=t.join(s,u.name),d=t.join(c,u.name),f=(!i||i.test(u.name))&&(!o||!o.test(u.name));u.isDirectory()?r&&await this.copyDirectory({from:t.join(e,u.name),to:t.join(n,u.name),recursive:r,include:i,exclude:o}):u.isFile()&&f&&await a.copyFile(l,d)}}async listDirectories({dir:e}){try{return(await a.readdir(t.resolve(this.root,e),{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch(t){return console.error(`Error listing directories in ${e}:`,t),[]}}async listFiles({dir:e}){try{return(await a.readdir(t.resolve(this.root,e),{withFileTypes:!0})).filter(e=>e.isFile()).map(e=>e.name)}catch(t){return console.error(`Error listing files in ${e}:`,t),[]}}},L_={"startx.json":{tags:[`never`]},".npmignore":{tags:[`never`]},".npmrc":{tags:[`never`]},".prettierignore":{tags:[`prettier`]},".prettier.js":{tags:[`prettier`]},"biome.json":{tags:[`biome`]},"pnpm-lock.yaml":{tags:[`never`]},"pnpm-workspace.yaml":{tags:[`root`]},"turbo.json":{tags:[`root`]},LICENSE:{tags:[`never`]},".env":{tags:[`never`]},"tsdown.config.ts":{tags:[`tsdown`]},"eslint.config.ts":{tags:[`never`]},"vitest.config.ts":{tags:[`never`]},"package.json":{tags:[`never`]}},R_=Qp({STARTX_ENV:Gp.enum([`development`,`production`,`test`,`staging`]).default(`production`)});var z_=class{static getDirectory(){let e=n(import.meta.url),r=t.dirname(e),i=process.cwd();return r=R_.STARTX_ENV===`development`?t.resolve(r,`../../../../`):t.resolve(r,`../../../`),{template:r,workspace:i}}static async getPackageList(){let e=[],n=this.getDirectory().template,r=async e=>{try{return await I_.listDirectories({dir:e})}catch(e){return console.error(`Error listing directory:`,e),[]}},[i,a,o,s]=await Promise.all([r(t.join(n,`apps`)),r(t.join(n,`configs`)),r(t.join(n,`packages`)),r(t.join(n,`packages`,`@repo`))]);return i.forEach(r=>{e.push({type:`apps`,path:t.join(n,`apps`,r),name:r})}),a.forEach(r=>{e.push({type:`configs`,path:t.join(n,`configs`,r),name:r})}),o.forEach(r=>{r!==`@repo`&&e.push({type:`packages`,path:t.join(n,`packages`,r),name:r})}),s.forEach(r=>{e.push({type:`packages`,path:t.join(n,`packages`,`@repo`,r),name:`@repo/${r}`})}),e}static async parsePackageJson({dir:e,file:t=`package`}){return await I_.readJSONFile({dir:e,file:t})}static async parsePnpmWorkspace({dir:e}){return(await I_.readYamlFile({file:`pnpm-workspace`,dir:e}))?.toJSON()}};const B_={"@biomejs/biome":{tags:[`node`,`biome`,`root`],version:`catalog:`},prettier:{tags:[`node`,`prettier`,`root`],version:`catalog:`},eslint:{tags:[`node`,`eslint`,`root`],version:`catalog:`},vitest:{tags:[`node`,`vitest`,`root`],version:`catalog:`},tsdown:{tags:[`node`,`tsdown`,`root`],version:`catalog:`},"@types/node":{tags:[`node`,`root`],version:`catalog:`,isDevDependency:!0},"typescript-config":{tags:[`node`],version:`workspace:^`,isDevDependency:!0},"eslint-config":{tags:[`node`,`eslint`],version:`workspace:^`,isDevDependency:!0},"vitest-config":{tags:[`node`,`vitest`],version:`workspace:^`,isDevDependency:!0}},V_={dev:[{script:`turbo run dev`,tags:[`runnable`,`root`]},{script:`tsx watch src/index.ts`,tags:[`runnable`,`node`,`backend`,`dev`]},{script:`email dev --port 3014 --dir ./src`,tags:[`node`,`mail`]}],"dev:debug":[{script:`turbo run dev:debug`,tags:[`node`,`runnable`,`root`]},{script:`tsx watch --inspect src/index.ts`,tags:[`backend`,`node`,`runnable`,`dev`]}],"bun:dev":[{script:`turbo run bun:dev`,tags:[`node`,`runnable`,`root`]},{script:`bun --watch src/index.ts`,tags:[`backend`,`node`,`runnable`,`dev`]}],build:[{script:`turbo run build`,tags:[`runnable`,`root`]},{script:`tsdown --config-loader unrun`,tags:[`runnable`,`node`]}],cli:[{script:`turbo run cli`,tags:[`runnable`,`node`,`cli`,`root`]},{script:`tsx src/index.ts`,tags:[`runnable`,`node`,`cli`,`commander`]}],start:[{script:`turbo run start`,tags:[`backend`,`runnable`,`node`,`root`]},{script:`node dist/index.mjs`,tags:[`node`,`runnable`]}],lint:[{script:`turbo run eslint`,tags:[`node`,`eslint`,`root`]},{script:`eslint .`,tags:[`node`,`eslint`]}],"lint:fix":[{script:`turbo run lint:fix`,tags:[`node`,`eslint`,`root`]},{script:`eslint . src/**/*.ts --fix`,tags:[`node`,`eslint`]}],clean:[{script:`turbo run clean`,tags:[`root`]},{script:`rimraf dist .turbo dist`,tags:[]}],"deep:clean":[{script:`turbo run deep:clean`,tags:[`root`]},{script:`rimraf node_modules dist .turbo`,tags:[`node`]}],typecheck:[{script:`turbo run typecheck`,tags:[`node`,`root`]},{script:`tsc --noEmit`,tags:[`node`]}],format:[{script:`turbo run format`,tags:[`node`,`root`]},{script:`biome format --write .`,tags:[`node`,`biome`,`prettier`]},{script:`prettier --write .`,tags:[`node`,`prettier`]}],"format:check":[{script:`turbo run format:check`,tags:[`node`,`root`]},{script:`biome ci .`,tags:[`node`,`biome`,`prettier`]},{script:`prettier --check .`,tags:[`node`,`prettier`]}],test:[{script:`turbo run test`,tags:[`node`,`vitest`,`root`]},{script:`vitest run`,tags:[`node`,`vitest`]}]},H_={packageManager:`pnpm@10.28.2`,node:`>=22`};var U_=class{static objSorter(e,t=[]){let n=Object.fromEntries(Object.entries(e).filter(([,e])=>e!=null)),r=[];for(let e of t)e in n&&(r.push([e,n[e]]),delete n[e]);for(let e of Object.entries(n))r.push(e);return Object.fromEntries(r)}static handlePackageJson(e){let t=!!e.app.devDependencies?.turbo,n=t?[...e.tags,`root`]:[...e.tags],r=t?{version:`1.0.0`,packageManager:H_.packageManager,engines:{node:H_.node}}:{},i=Object.fromEntries(Object.entries(V_).map(([e,t])=>{let r=t.find(e=>e.tags.every(e=>n.includes(e)));return r?[e,r.script]:null}).filter(e=>e!==null)),a=e=>Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let t=B_[e];return!t||t.tags.every(e=>n.includes(e))})),o=a(e.app.dependencies),s=a(e.app.devDependencies);for(let[e,t]of Object.entries(s))t.includes(`workspace:`)&&delete s[e];if(e.dependencies)for(let[t,n]of Object.entries(e.dependencies))o[t]||(o[t]=n);for(let[e,r]of Object.entries(B_))r.tags.every(e=>n.includes(e))&&(t&&!r.tags.includes(`root`)||(r.isDevDependency&&!s[e]?s[e]=r.version:o[e]||(o[e]=r.version)));for(let t of e.app.startx?.ignore??[])delete o[t],delete s[t];let c={name:e.name||e.app.name,description:e.app.description,type:`module`,exports:e.app.exports,files:e.app.files,scripts:i,dependencies:o,devDependencies:s,...r};return{packageJson:this.objSorter(c,[`name`,`description`,`version`,`type`,`scripts`,`files`,`exports`,`dependencies`,`devDependencies`,`packageManager`,`engines`]),isWorkspace:t}}};const W_=(e,t=[])=>e.name===`up`||t.includes(`vim`)&&e.name===`k`||t.includes(`emacs`)&&e.ctrl&&e.name===`p`,G_=(e,t=[])=>e.name===`down`||t.includes(`vim`)&&e.name===`j`||t.includes(`emacs`)&&e.ctrl&&e.name===`n`,K_=e=>e.name===`space`,q_=e=>e.name===`backspace`,J_=e=>e.name===`tab`,Y_=e=>`1234567890`.includes(e.name),X_=e=>e.name===`enter`||e.name===`return`;var Z_=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},Q_=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},$_=class extends Error{name=`ExitPromptError`},ev=class extends Error{name=`HookError`},tv=class extends Error{name=`ValidationError`};const nv=new o;function rv(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function iv(e,t){let n=rv(e);return nv.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function av(){let e=nv.getStore();if(!e)throw new ev(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function ov(){return av().rl}function sv(e){return s.bind((...t)=>{let n=av(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function cv(e){let t=av(),{index:n}=t,r=e({get(){return t.hooks[n]},set(e){t.hooks[n]=e},initialized:n in t.hooks});return t.index++,r}function lv(){av().handleChange()}const uv={queue(e){let t=av(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(ov());if(r!=null&&typeof r!=`function`)throw new tv(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=av();sv(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=av();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function Q(e){return cv(t=>{let n=s.bind(function(e){t.get()!==e&&(t.set(e),lv())});if(t.initialized)return[t.get(),n];let r=typeof e==`function`?e():e;return t.set(r),[r,n]})}function dv(e,t){cv(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&uv.queue(e),n.set(t)})}function fv(){return i.platform===`win32`?!!i.env.WT_SESSION||!!i.env.TERMINUS_SUBLIME||i.env.ConEmuTask===`{cmd::Cmder}`||i.env.TERM_PROGRAM===`Terminus-Sublime`||i.env.TERM_PROGRAM===`vscode`||i.env.TERM===`xterm-256color`||i.env.TERM===`alacritty`||i.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:i.env.TERM!==`linux`}const pv={circleQuestionMark:`(?)`,questionMarkPrefix:`(?)`,square:`█`,squareDarkShade:`▓`,squareMediumShade:`▒`,squareLightShade:`░`,squareTop:`▀`,squareBottom:`▄`,squareLeft:`▌`,squareRight:`▐`,squareCenter:`■`,bullet:`●`,dot:`․`,ellipsis:`…`,pointerSmall:`›`,triangleUp:`▲`,triangleUpSmall:`▴`,triangleDown:`▼`,triangleDownSmall:`▾`,triangleLeftSmall:`◂`,triangleRightSmall:`▸`,home:`⌂`,heart:`♥`,musicNote:`♪`,musicNoteBeamed:`♫`,arrowUp:`↑`,arrowDown:`↓`,arrowLeft:`←`,arrowRight:`→`,arrowLeftRight:`↔`,arrowUpDown:`↕`,almostEqual:`≈`,notEqual:`≠`,lessOrEqual:`≤`,greaterOrEqual:`≥`,identical:`≡`,infinity:`∞`,subscriptZero:`₀`,subscriptOne:`₁`,subscriptTwo:`₂`,subscriptThree:`₃`,subscriptFour:`₄`,subscriptFive:`₅`,subscriptSix:`₆`,subscriptSeven:`₇`,subscriptEight:`₈`,subscriptNine:`₉`,oneHalf:`½`,oneThird:`⅓`,oneQuarter:`¼`,oneFifth:`⅕`,oneSixth:`⅙`,oneEighth:`⅛`,twoThirds:`⅔`,twoFifths:`⅖`,threeQuarters:`¾`,threeFifths:`⅗`,threeEighths:`⅜`,fourFifths:`⅘`,fiveSixths:`⅚`,fiveEighths:`⅝`,sevenEighths:`⅞`,line:`─`,lineBold:`━`,lineDouble:`═`,lineDashed0:`┄`,lineDashed1:`┅`,lineDashed2:`┈`,lineDashed3:`┉`,lineDashed4:`╌`,lineDashed5:`╍`,lineDashed6:`╴`,lineDashed7:`╶`,lineDashed8:`╸`,lineDashed9:`╺`,lineDashed10:`╼`,lineDashed11:`╾`,lineDashed12:`−`,lineDashed13:`–`,lineDashed14:`‐`,lineDashed15:`⁃`,lineVertical:`│`,lineVerticalBold:`┃`,lineVerticalDouble:`║`,lineVerticalDashed0:`┆`,lineVerticalDashed1:`┇`,lineVerticalDashed2:`┊`,lineVerticalDashed3:`┋`,lineVerticalDashed4:`╎`,lineVerticalDashed5:`╏`,lineVerticalDashed6:`╵`,lineVerticalDashed7:`╷`,lineVerticalDashed8:`╹`,lineVerticalDashed9:`╻`,lineVerticalDashed10:`╽`,lineVerticalDashed11:`╿`,lineDownLeft:`┐`,lineDownLeftArc:`╮`,lineDownBoldLeftBold:`┓`,lineDownBoldLeft:`┒`,lineDownLeftBold:`┑`,lineDownDoubleLeftDouble:`╗`,lineDownDoubleLeft:`╖`,lineDownLeftDouble:`╕`,lineDownRight:`┌`,lineDownRightArc:`╭`,lineDownBoldRightBold:`┏`,lineDownBoldRight:`┎`,lineDownRightBold:`┍`,lineDownDoubleRightDouble:`╔`,lineDownDoubleRight:`╓`,lineDownRightDouble:`╒`,lineUpLeft:`┘`,lineUpLeftArc:`╯`,lineUpBoldLeftBold:`┛`,lineUpBoldLeft:`┚`,lineUpLeftBold:`┙`,lineUpDoubleLeftDouble:`╝`,lineUpDoubleLeft:`╜`,lineUpLeftDouble:`╛`,lineUpRight:`└`,lineUpRightArc:`╰`,lineUpBoldRightBold:`┗`,lineUpBoldRight:`┖`,lineUpRightBold:`┕`,lineUpDoubleRightDouble:`╚`,lineUpDoubleRight:`╙`,lineUpRightDouble:`╘`,lineUpDownLeft:`┤`,lineUpBoldDownBoldLeftBold:`┫`,lineUpBoldDownBoldLeft:`┨`,lineUpDownLeftBold:`┥`,lineUpBoldDownLeftBold:`┩`,lineUpDownBoldLeftBold:`┪`,lineUpDownBoldLeft:`┧`,lineUpBoldDownLeft:`┦`,lineUpDoubleDownDoubleLeftDouble:`╣`,lineUpDoubleDownDoubleLeft:`╢`,lineUpDownLeftDouble:`╡`,lineUpDownRight:`├`,lineUpBoldDownBoldRightBold:`┣`,lineUpBoldDownBoldRight:`┠`,lineUpDownRightBold:`┝`,lineUpBoldDownRightBold:`┡`,lineUpDownBoldRightBold:`┢`,lineUpDownBoldRight:`┟`,lineUpBoldDownRight:`┞`,lineUpDoubleDownDoubleRightDouble:`╠`,lineUpDoubleDownDoubleRight:`╟`,lineUpDownRightDouble:`╞`,lineDownLeftRight:`┬`,lineDownBoldLeftBoldRightBold:`┳`,lineDownLeftBoldRightBold:`┯`,lineDownBoldLeftRight:`┰`,lineDownBoldLeftBoldRight:`┱`,lineDownBoldLeftRightBold:`┲`,lineDownLeftRightBold:`┮`,lineDownLeftBoldRight:`┭`,lineDownDoubleLeftDoubleRightDouble:`╦`,lineDownDoubleLeftRight:`╥`,lineDownLeftDoubleRightDouble:`╤`,lineUpLeftRight:`┴`,lineUpBoldLeftBoldRightBold:`┻`,lineUpLeftBoldRightBold:`┷`,lineUpBoldLeftRight:`┸`,lineUpBoldLeftBoldRight:`┹`,lineUpBoldLeftRightBold:`┺`,lineUpLeftRightBold:`┶`,lineUpLeftBoldRight:`┵`,lineUpDoubleLeftDoubleRightDouble:`╩`,lineUpDoubleLeftRight:`╨`,lineUpLeftDoubleRightDouble:`╧`,lineUpDownLeftRight:`┼`,lineUpBoldDownBoldLeftBoldRightBold:`╋`,lineUpDownBoldLeftBoldRightBold:`╈`,lineUpBoldDownLeftBoldRightBold:`╇`,lineUpBoldDownBoldLeftRightBold:`╊`,lineUpBoldDownBoldLeftBoldRight:`╉`,lineUpBoldDownLeftRight:`╀`,lineUpDownBoldLeftRight:`╁`,lineUpDownLeftBoldRight:`┽`,lineUpDownLeftRightBold:`┾`,lineUpBoldDownBoldLeftRight:`╂`,lineUpDownLeftBoldRightBold:`┿`,lineUpBoldDownLeftBoldRight:`╃`,lineUpBoldDownLeftRightBold:`╄`,lineUpDownBoldLeftBoldRight:`╅`,lineUpDownBoldLeftRightBold:`╆`,lineUpDoubleDownDoubleLeftDoubleRightDouble:`╬`,lineUpDoubleDownDoubleLeftRight:`╫`,lineUpDownLeftDoubleRightDouble:`╪`,lineCross:`╳`,lineBackslash:`╲`,lineSlash:`╱`},mv={tick:`✔`,info:`ℹ`,warning:`⚠`,cross:`✘`,squareSmall:`◻`,squareSmallFilled:`◼`,circle:`◯`,circleFilled:`◉`,circleDotted:`◌`,circleDouble:`◎`,circleCircle:`ⓞ`,circleCross:`ⓧ`,circlePipe:`Ⓘ`,radioOn:`◉`,radioOff:`◯`,checkboxOn:`☒`,checkboxOff:`☐`,checkboxCircleOn:`ⓧ`,checkboxCircleOff:`Ⓘ`,pointer:`❯`,triangleUpOutline:`△`,triangleLeft:`◀`,triangleRight:`▶`,lozenge:`◆`,lozengeOutline:`◇`,hamburger:`☰`,smiley:`㋡`,mustache:`෴`,star:`★`,play:`▶`,nodejs:`⬢`,oneSeventh:`⅐`,oneNinth:`⅑`,oneTenth:`⅒`},hv={tick:`√`,info:`i`,warning:`‼`,cross:`×`,squareSmall:`□`,squareSmallFilled:`■`,circle:`( )`,circleFilled:`(*)`,circleDotted:`( )`,circleDouble:`( )`,circleCircle:`(○)`,circleCross:`(×)`,circlePipe:`(│)`,radioOn:`(*)`,radioOff:`( )`,checkboxOn:`[×]`,checkboxOff:`[ ]`,checkboxCircleOn:`(×)`,checkboxCircleOff:`( )`,pointer:`>`,triangleUpOutline:`∆`,triangleLeft:`◄`,triangleRight:`►`,lozenge:`♦`,lozengeOutline:`◊`,hamburger:`≡`,smiley:`☺`,mustache:`┌─┐`,star:`✶`,play:`►`,nodejs:`♦`,oneSeventh:`1/7`,oneNinth:`1/9`,oneTenth:`1/10`},gv={...pv,...mv},_v={...pv,...hv};var vv=fv()?gv:_v;Object.entries(mv);const yv={prefix:{idle:l(`blue`,`?`),done:l(`green`,vv.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>l(`yellow`,e))},style:{answer:e=>l(`cyan`,e),message:e=>l(`bold`,e),error:e=>l(`red`,`> ${e}`),defaultAnswer:e=>l(`dim`,`(${e})`),help:e=>l(`dim`,e),highlight:e=>l(`cyan`,e),key:e=>l(`cyan`,l(`bold`,`<${e}>`))}};function bv(e){if(typeof e!=`object`||!e)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function xv(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=bv(n)&&bv(r)?xv(n,r):r}return t}function Sv(...e){return xv(yv,...e.filter(e=>e!=null))}function Cv({status:e=`idle`,theme:t}){let[n,r]=Q(!1),[i,a]=Q(0),{prefix:o,spinner:s}=Sv(t);return dv(()=>{if(e===`loading`){let e,t=-1,n=setTimeout(()=>{r(!0),e=setInterval(()=>{t+=1,a(t%s.frames.length)},s.interval)},300);return()=>{clearTimeout(n),clearInterval(e)}}else r(!1)},[e]),n?s.frames[i]:typeof o==`string`?o:o[e===`loading`?`idle`:e]??o.idle}function wv(e,t){return cv(n=>{let r=n.get();if(!r||r.dependencies.length!==t.length||r.dependencies.some((e,n)=>e!==t[n])){let r=e();return n.set({value:r,dependencies:t}),r}return r.value})}function Tv(e){return Q({current:e})[0]}function Ev(e){let t=Tv(e);t.current=e,dv(e=>{let n=!1,r=sv((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var Dv=_(((e,t)=>{t.exports=r;function n(e){let t={defaultWidth:0,output:process.stdout,tty:x(`tty`)};return e?(Object.keys(t).forEach(function(n){e[n]||(e[n]=t[n])}),e):t}function r(e){let t=n(e);if(t.output.getWindowSize)return t.output.getWindowSize()[0]||t.defaultWidth;if(t.tty.getWindowSize)return t.tty.getWindowSize()[1]||t.defaultWidth;if(t.output.columns)return t.output.columns;if(process.env.CLI_WIDTH){let e=parseInt(process.env.CLI_WIDTH,10);if(!isNaN(e)&&e!==0)return e}return t.defaultWidth}}));const Ov=(()=>{let e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return t=>{let n=0;for(e.lastIndex=0;e.test(t);)n+=1;return t.length-n}})(),kv=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,Av=e=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141,jv=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Mv=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,Nv=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,Pv=/\t{1,1000}/y,Fv=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/uy,Iv=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Lv=/\p{M}+/gu,Rv={limit:1/0,ellipsis:``},zv=(e,t={},n={})=>{let r=t.limit??1/0,i=t.ellipsis??``,a=t?.ellipsisWidth??(i?zv(i,Rv,n).width:0),o=n.controlWidth??0,s=n.tabWidth??8,c=n.emojiWidth??2,l=n.regularWidth??1,u=n.wideWidth??2,d=[[Iv,l],[jv,0],[Mv,o],[Pv,s],[Fv,c],[Nv,u]],f=0,p=0,m=e.length,h=0,g=!1,_=m,v=Math.max(0,r-a),y=0,b=0,x=0,S=0;outer:for(;;){if(b>y||p>=m&&p>f){let t=e.slice(y,b)||e.slice(f,p);h=0;for(let e of t.replaceAll(Lv,``)){let t=e.codePointAt(0)||0;if(S=kv(t)?2:Av(t)?u:l,x+S>v&&(_=Math.min(_,Math.max(y,f)+h)),x+S>r){g=!0;break outer}h+=e.length,x+=S}y=b=0}if(p>=m)break outer;for(let t=0,n=d.length;t<n;t++){let[n,i]=d[t];if(n.lastIndex=p,n.test(e)){if(h=n===Nv?Ov(e.slice(p,n.lastIndex)):n===Fv?1:n.lastIndex-p,S=h*i,x+S>v&&(_=Math.min(_,p+Math.floor((v-x)/i))),x+S>r){g=!0;break outer}x+=S,y=f,b=p,p=f=n.lastIndex;continue outer}}p+=1}return{width:g?v:x,index:g?_:m,truncated:g,ellipsed:g&&r>=a}};var Bv=zv;const Vv={limit:1/0,ellipsis:``,ellipsisWidth:0};var Hv=(e,t={})=>Bv(e,Vv,t).width;const Uv=`]8;;`,Wv=RegExp(`(?:\\[(?<code>\\d+)m|\\${Uv}(?<uri>.*))`,`y`),Gv=e=>{if(e>=30&&e<=37||e>=90&&e<=97)return 39;if(e>=40&&e<=47||e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0},Kv=e=>`[${e}m`,qv=e=>`${Uv}${e}`,Jv=(e,t,n)=>{let r=t[Symbol.iterator](),i=!1,a=!1,o=e.at(-1),s=o===void 0?0:Hv(o),c=r.next(),l=r.next(),u=0;for(;!c.done;){let o=c.value,d=Hv(o);s+d<=n?e[e.length-1]+=o:(e.push(o),s=0),(o===`\x1B`||o===`›`)&&(i=!0,a=t.startsWith(Uv,u+1)),i?a?o===`\x07`&&(i=!1,a=!1):o===`m`&&(i=!1):(s+=d,s===n&&!l.done&&(e.push(``),s=0)),c=l,l=r.next(),u+=o.length}o=e.at(-1),!s&&o!==void 0&&o.length&&e.length>1&&(e[e.length-2]+=e.pop())},Yv=e=>{let t=e.split(` `),n=t.length;for(;n&&!Hv(t[n-1]);)n--;return n===t.length?e:t.slice(0,n).join(` `)+t.slice(n).join(``)},Xv=(e,t,n={})=>{if(n.trim!==!1&&e.trim()===``)return``;let r=``,i,a,o=e.split(` `),s=[``],c=0;for(let e=0;e<o.length;e++){let r=o[e];if(n.trim!==!1){let e=s.at(-1)??``,t=e.trimStart();e.length!==t.length&&(s[s.length-1]=t,c=Hv(t))}e!==0&&(c>=t&&(n.wordWrap===!1||n.trim===!1)&&(s.push(``),c=0),(c||n.trim===!1)&&(s[s.length-1]+=` `,c++));let i=Hv(r);if(n.hard&&i>t){let e=t-c,n=1+Math.floor((i-e-1)/t);Math.floor((i-1)/t)<n&&s.push(``),Jv(s,r,t),c=Hv(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){Jv(s,r,t),c=Hv(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){Jv(s,r,t),c=Hv(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>Yv(e)));let l=s.join(`
187
+ `,e)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return this.flowScalar(this.type);case`block-scalar-header`:return{type:`block-scalar`,offset:this.offset,indent:this.indent,props:[this.sourceToken],source:``};case`flow-map-start`:case`flow-seq-start`:return{type:`flow-collection`,offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case`seq-item-ind`:return{type:`block-seq`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case`explicit-key-ind`:{this.onKeyLine=!0;let t=c(s(e));return t.push(this.sourceToken),{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,explicitKey:!0}]}}case`map-value-ind`:{this.onKeyLine=!0;let t=c(s(e));return{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!==`comment`||this.indent<=t?!1:e.every(e=>e.type===`newline`||e.type===`space`)}*documentEnd(e){this.type!==`doc-mode`&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case`comma`:case`doc-start`:case`doc-end`:case`flow-seq-end`:case`flow-map-end`:case`map-value-ind`:yield*this.pop(),yield*this.step();break;case`newline`:this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop())}}}})),N_=_((e=>{var t=T_(),n=c_(),r=l_(),i=Ng(),a=X(),o=j_(),s=M_();function c(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new o.LineCounter||null,prettyErrors:t}}function l(e,n={}){let{lineCounter:i,prettyErrors:a}=c(n),o=new s.Parser(i?.addNewLine),l=new t.Composer(n),u=Array.from(l.compose(o.parse(e)));if(a&&i)for(let t of u)t.errors.forEach(r.prettifyError(e,i)),t.warnings.forEach(r.prettifyError(e,i));return u.length>0?u:Object.assign([],{empty:!0},l.streamInfo())}function u(e,n={}){let{lineCounter:i,prettyErrors:a}=c(n),o=new s.Parser(i?.addNewLine),l=new t.Composer(n),u=null;for(let t of l.compose(o.parse(e),!0,e.length))if(!u)u=t;else if(u.options.logLevel!==`silent`){u.errors.push(new r.YAMLParseError(t.range.slice(0,2),`MULTIPLE_DOCS`,`Source contains multiple documents; please use YAML.parseAllDocuments()`));break}return a&&i&&(u.errors.forEach(r.prettifyError(e,i)),u.warnings.forEach(r.prettifyError(e,i))),u}function d(e,t,n){let r;typeof t==`function`?r=t:n===void 0&&t&&typeof t==`object`&&(n=t);let a=u(e,n);if(!a)return null;if(a.warnings.forEach(e=>i.warn(a.options.logLevel,e)),a.errors.length>0){if(a.options.logLevel!==`silent`)throw a.errors[0];a.errors=[]}return a.toJS(Object.assign({reviver:r},n))}function f(e,t,r){let i=null;if(typeof t==`function`||Array.isArray(t)?i=t:r===void 0&&t&&(r=t),typeof r==`string`&&(r=r.length),typeof r==`number`){let e=Math.round(r);r=e<1?void 0:e>8?{indent:8}:{indent:e}}if(e===void 0){let{keepUndefined:e}=r??t??{};if(!e)return}return a.isDocument(e)&&!i?e.toString(r):new n.Document(e,i,r).toString(r)}e.parse=d,e.parseAllDocuments=l,e.parseDocument=u,e.stringify=f})),P_=b(_((e=>{var t=T_(),n=c_(),r=o_(),i=l_(),a=Tg(),o=X(),s=Ig(),c=Z(),l=Rg(),u=Bg();k_();var d=A_(),f=j_(),p=M_(),m=N_(),h=yg();e.Composer=t.Composer,e.Document=n.Document,e.Schema=r.Schema,e.YAMLError=i.YAMLError,e.YAMLParseError=i.YAMLParseError,e.YAMLWarning=i.YAMLWarning,e.Alias=a.Alias,e.isAlias=o.isAlias,e.isCollection=o.isCollection,e.isDocument=o.isDocument,e.isMap=o.isMap,e.isNode=o.isNode,e.isPair=o.isPair,e.isScalar=o.isScalar,e.isSeq=o.isSeq,e.Pair=s.Pair,e.Scalar=c.Scalar,e.YAMLMap=l.YAMLMap,e.YAMLSeq=u.YAMLSeq,e.Lexer=d.Lexer,e.LineCounter=f.LineCounter,e.Parser=p.Parser,e.parse=m.parse,e.parseAllDocuments=m.parseAllDocuments,e.parseDocument=m.parseDocument,e.stringify=m.stringify,e.visit=h.visit,e.visitAsync=h.visitAsync}))(),1);function F_(){return $p.NODE_ENV===`development`?t.resolve(process.cwd(),`../../`):process.cwd()}const I_=new class{root=F_();async pathExists(e){try{return await a.access(e),!0}catch{return!1}}async writeFile({file:e,content:n}){await a.writeFile(t.resolve(this.root,e),n)}async writeJSONFile({file:e,content:n,dir:r}){e=`${e}.json`;let i=t.resolve(this.root,e);if(r){let n=t.resolve(this.root,r);await this.ensurePathExists({dir:r}),i=t.resolve(n,e)}await a.writeFile(i,JSON.stringify(n,null,2))}async readFile({file:e}){return await a.readFile(t.resolve(this.root,e),`utf-8`)}async readJSONFile({file:e,dir:n}){try{e=`${e}.json`;let r=t.resolve(this.root,n??``,e),i=await a.readFile(r,`utf-8`);return JSON.parse(i)}catch(t){return console.error(`Failed to read JSON file at ${e}:`,t),null}}async readYamlFile({file:e,dir:n}){try{e=`${e}.yaml`;let r=t.resolve(this.root,n??``,e),i=await a.readFile(r,`utf-8`);return P_.parseDocument(i)}catch(t){return console.error(`Failed to read Yaml file at ${e}:`,t),null}}async ensurePathExists({dir:e}){let n=t.resolve(this.root,e);await this.pathExists(n)||await a.mkdir(n,{recursive:!0})}async avoidOverriding({file:e}){let n=t.resolve(this.root,e);if(await this.pathExists(n))throw Error(`File ${n} already exists`)}async removeFile({file:e}){let n=t.resolve(this.root,e);await this.pathExists(n)&&await a.unlink(n)}async removeDirectory({dir:e,target:n}){let r=t.resolve(this.root,e,n);await this.pathExists(r)&&await a.rm(r,{recursive:!0,force:!0})}async copyFile({from:e,to:n}){await this.ensurePathExists({dir:t.dirname(n)}),await a.copyFile(t.resolve(this.root,e),t.resolve(this.root,n))}async copyDirectory({from:e,to:n,recursive:r=!0,include:i,exclude:o}){let s=t.resolve(this.root,e),c=t.resolve(this.root,n);if(!await this.pathExists(s))return;await this.ensurePathExists({dir:t.join(n)});let l=await a.readdir(s,{withFileTypes:!0});for(let u of l){let l=t.join(s,u.name),d=t.join(c,u.name),f=(!i||i.test(u.name))&&(!o||!o.test(u.name));u.isDirectory()?r&&await this.copyDirectory({from:t.join(e,u.name),to:t.join(n,u.name),recursive:r,include:i,exclude:o}):u.isFile()&&f&&await a.copyFile(l,d)}}async listDirectories({dir:e}){try{return(await a.readdir(t.resolve(this.root,e),{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch(t){return console.error(`Error listing directories in ${e}:`,t),[]}}async listFiles({dir:e}){try{return(await a.readdir(t.resolve(this.root,e),{withFileTypes:!0})).filter(e=>e.isFile()).map(e=>e.name)}catch(t){return console.error(`Error listing files in ${e}:`,t),[]}}},L_={"startx.json":{tags:[`never`]},".npmignore":{tags:[`never`]},".npmrc":{tags:[`never`]},".prettierignore":{tags:[`prettier`]},".prettier.js":{tags:[`prettier`]},"biome.json":{tags:[`biome`]},"pnpm-lock.yaml":{tags:[`never`]},"pnpm-workspace.yaml":{tags:[`root`]},"turbo.json":{tags:[`root`]},LICENSE:{tags:[`never`]},".env":{tags:[`never`]},"tsdown.config.ts":{tags:[`tsdown`]},"eslint.config.ts":{tags:[`eslint`,`node`]},"vitest.config.ts":{tags:[`vitest`,`node`]},"package.json":{tags:[`never`]}},R_=Qp({STARTX_ENV:Gp.enum([`development`,`production`,`test`,`staging`]).default(`production`)});var z_=class{static getDirectory(){let e=n(import.meta.url),r=t.dirname(e),i=process.cwd();return r=R_.STARTX_ENV===`development`?t.resolve(r,`../../../../`):t.resolve(r,`../../../`),{template:r,workspace:i}}static async getPackageList(){let e=[],n=this.getDirectory().template,r=async e=>{try{return await I_.listDirectories({dir:e})}catch(e){return console.error(`Error listing directory:`,e),[]}},[i,a,o,s]=await Promise.all([r(t.join(n,`apps`)),r(t.join(n,`configs`)),r(t.join(n,`packages`)),r(t.join(n,`packages`,`@repo`))]);return i.forEach(r=>{e.push({type:`apps`,path:t.join(n,`apps`,r),name:r})}),a.forEach(r=>{e.push({type:`configs`,path:t.join(n,`configs`,r),name:r})}),o.forEach(r=>{r!==`@repo`&&e.push({type:`packages`,path:t.join(n,`packages`,r),name:r})}),s.forEach(r=>{e.push({type:`packages`,path:t.join(n,`packages`,`@repo`,r),name:`@repo/${r}`})}),e}static async parsePackageJson({dir:e,file:t=`package`}){return await I_.readJSONFile({dir:e,file:t})}static async parsePnpmWorkspace({dir:e}){return(await I_.readYamlFile({file:`pnpm-workspace`,dir:e}))?.toJSON()}};const B_={"@biomejs/biome":{tags:[`node`,`biome`,`root`],version:`catalog:`},prettier:{tags:[`node`,`prettier`,`root`],version:`catalog:`},eslint:{tags:[`node`,`eslint`,`root`],version:`catalog:`},vitest:{tags:[`node`,`vitest`,`root`],version:`catalog:`},tsdown:{tags:[`node`,`tsdown`,`root`],version:`catalog:`},"@types/node":{tags:[`node`,`root`],version:`catalog:`,isDevDependency:!0},"typescript-config":{tags:[`node`],version:`workspace:^`,isDevDependency:!0},"eslint-config":{tags:[`node`,`eslint`],version:`workspace:^`,isDevDependency:!0},"vitest-config":{tags:[`node`,`vitest`],version:`workspace:^`,isDevDependency:!0}},V_={dev:[{script:`turbo run dev`,tags:[`runnable`,`root`]},{script:`tsx watch src/index.ts`,tags:[`runnable`,`node`,`backend`,`dev`]},{script:`email dev --port 3014 --dir ./src`,tags:[`node`,`mail`]}],"dev:debug":[{script:`turbo run dev:debug`,tags:[`node`,`runnable`,`root`]},{script:`tsx watch --inspect src/index.ts`,tags:[`backend`,`node`,`runnable`,`dev`]}],"bun:dev":[{script:`turbo run bun:dev`,tags:[`node`,`runnable`,`root`]},{script:`bun --watch src/index.ts`,tags:[`backend`,`node`,`runnable`,`dev`]}],build:[{script:`turbo run build`,tags:[`runnable`,`root`]},{script:`tsdown --config-loader unrun`,tags:[`runnable`,`node`]}],cli:[{script:`turbo run cli -- `,tags:[`runnable`,`node`,`cli`,`root`]},{script:`tsx src/index.ts`,tags:[`runnable`,`node`,`cli`,`commander`]}],start:[{script:`turbo run start`,tags:[`backend`,`runnable`,`node`,`root`]},{script:`node dist/index.mjs`,tags:[`node`,`runnable`]}],lint:[{script:`turbo run eslint`,tags:[`node`,`eslint`,`root`]},{script:`eslint .`,tags:[`node`,`eslint`]}],"lint:fix":[{script:`turbo run lint:fix`,tags:[`node`,`eslint`,`root`]},{script:`eslint . src/**/*.ts --fix`,tags:[`node`,`eslint`]}],clean:[{script:`turbo run clean`,tags:[`root`]},{script:`rimraf dist .turbo dist`,tags:[]}],"deep:clean":[{script:`turbo run deep:clean`,tags:[`root`]},{script:`rimraf node_modules dist .turbo`,tags:[`node`]}],typecheck:[{script:`turbo run typecheck`,tags:[`node`,`root`]},{script:`tsc --noEmit`,tags:[`node`]}],format:[{script:`turbo run format`,tags:[`node`,`root`]},{script:`biome format --write .`,tags:[`node`,`biome`,`prettier`]},{script:`prettier --write .`,tags:[`node`,`prettier`]}],"format:check":[{script:`turbo run format:check`,tags:[`node`,`root`]},{script:`biome ci .`,tags:[`node`,`biome`,`prettier`]},{script:`prettier --check .`,tags:[`node`,`prettier`]}],test:[{script:`turbo run test`,tags:[`node`,`vitest`,`root`]},{script:`vitest run`,tags:[`node`,`vitest`]}]},H_={packageManager:`pnpm@10.28.2`,node:`>=22`};var U_=class{static objSorter(e,t=[]){let n=Object.fromEntries(Object.entries(e).filter(([,e])=>e!=null)),r=[];for(let e of t)e in n&&(r.push([e,n[e]]),delete n[e]);for(let e of Object.entries(n))r.push(e);return Object.fromEntries(r)}static handlePackageJson(e){let t=!!e.app.devDependencies?.turbo,n=t?[...e.tags,`root`]:[...e.tags],r=t?{version:`1.0.0`,packageManager:H_.packageManager,engines:{node:H_.node}}:{},i=Object.fromEntries(Object.entries(V_).map(([e,t])=>{let r=t.find(e=>e.tags.every(e=>n.includes(e)));return r?[e,r.script]:null}).filter(e=>e!==null)),a=e=>Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let t=B_[e];return!t||t.tags.every(e=>n.includes(e))})),o=a(e.app.dependencies),s=a(e.app.devDependencies);for(let[e,t]of Object.entries(s))t.includes(`workspace:`)&&delete s[e];if(e.dependencies)for(let[t,n]of Object.entries(e.dependencies))o[t]||(o[t]=n);for(let[e,r]of Object.entries(B_))r.tags.every(e=>n.includes(e))&&(t&&!r.tags.includes(`root`)||(r.isDevDependency&&!s[e]?s[e]=r.version:o[e]||(o[e]=r.version)));for(let t of e.app.startx?.ignore??[])delete o[t],delete s[t];let c={name:e.name||e.app.name,description:e.app.description,type:`module`,exports:e.app.exports,files:e.app.files,scripts:i,dependencies:o,devDependencies:s,...r};return{packageJson:this.objSorter(c,[`name`,`description`,`version`,`type`,`scripts`,`files`,`exports`,`dependencies`,`devDependencies`,`packageManager`,`engines`]),isWorkspace:t}}};const W_=(e,t=[])=>e.name===`up`||t.includes(`vim`)&&e.name===`k`||t.includes(`emacs`)&&e.ctrl&&e.name===`p`,G_=(e,t=[])=>e.name===`down`||t.includes(`vim`)&&e.name===`j`||t.includes(`emacs`)&&e.ctrl&&e.name===`n`,K_=e=>e.name===`space`,q_=e=>e.name===`backspace`,J_=e=>e.name===`tab`,Y_=e=>`1234567890`.includes(e.name),X_=e=>e.name===`enter`||e.name===`return`;var Z_=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},Q_=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},$_=class extends Error{name=`ExitPromptError`},ev=class extends Error{name=`HookError`},tv=class extends Error{name=`ValidationError`};const nv=new o;function rv(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function iv(e,t){let n=rv(e);return nv.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function av(){let e=nv.getStore();if(!e)throw new ev(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function ov(){return av().rl}function sv(e){return s.bind((...t)=>{let n=av(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function cv(e){let t=av(),{index:n}=t,r=e({get(){return t.hooks[n]},set(e){t.hooks[n]=e},initialized:n in t.hooks});return t.index++,r}function lv(){av().handleChange()}const uv={queue(e){let t=av(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(ov());if(r!=null&&typeof r!=`function`)throw new tv(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=av();sv(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=av();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function Q(e){return cv(t=>{let n=s.bind(function(e){t.get()!==e&&(t.set(e),lv())});if(t.initialized)return[t.get(),n];let r=typeof e==`function`?e():e;return t.set(r),[r,n]})}function dv(e,t){cv(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&uv.queue(e),n.set(t)})}function fv(){return i.platform===`win32`?!!i.env.WT_SESSION||!!i.env.TERMINUS_SUBLIME||i.env.ConEmuTask===`{cmd::Cmder}`||i.env.TERM_PROGRAM===`Terminus-Sublime`||i.env.TERM_PROGRAM===`vscode`||i.env.TERM===`xterm-256color`||i.env.TERM===`alacritty`||i.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:i.env.TERM!==`linux`}const pv={circleQuestionMark:`(?)`,questionMarkPrefix:`(?)`,square:`█`,squareDarkShade:`▓`,squareMediumShade:`▒`,squareLightShade:`░`,squareTop:`▀`,squareBottom:`▄`,squareLeft:`▌`,squareRight:`▐`,squareCenter:`■`,bullet:`●`,dot:`․`,ellipsis:`…`,pointerSmall:`›`,triangleUp:`▲`,triangleUpSmall:`▴`,triangleDown:`▼`,triangleDownSmall:`▾`,triangleLeftSmall:`◂`,triangleRightSmall:`▸`,home:`⌂`,heart:`♥`,musicNote:`♪`,musicNoteBeamed:`♫`,arrowUp:`↑`,arrowDown:`↓`,arrowLeft:`←`,arrowRight:`→`,arrowLeftRight:`↔`,arrowUpDown:`↕`,almostEqual:`≈`,notEqual:`≠`,lessOrEqual:`≤`,greaterOrEqual:`≥`,identical:`≡`,infinity:`∞`,subscriptZero:`₀`,subscriptOne:`₁`,subscriptTwo:`₂`,subscriptThree:`₃`,subscriptFour:`₄`,subscriptFive:`₅`,subscriptSix:`₆`,subscriptSeven:`₇`,subscriptEight:`₈`,subscriptNine:`₉`,oneHalf:`½`,oneThird:`⅓`,oneQuarter:`¼`,oneFifth:`⅕`,oneSixth:`⅙`,oneEighth:`⅛`,twoThirds:`⅔`,twoFifths:`⅖`,threeQuarters:`¾`,threeFifths:`⅗`,threeEighths:`⅜`,fourFifths:`⅘`,fiveSixths:`⅚`,fiveEighths:`⅝`,sevenEighths:`⅞`,line:`─`,lineBold:`━`,lineDouble:`═`,lineDashed0:`┄`,lineDashed1:`┅`,lineDashed2:`┈`,lineDashed3:`┉`,lineDashed4:`╌`,lineDashed5:`╍`,lineDashed6:`╴`,lineDashed7:`╶`,lineDashed8:`╸`,lineDashed9:`╺`,lineDashed10:`╼`,lineDashed11:`╾`,lineDashed12:`−`,lineDashed13:`–`,lineDashed14:`‐`,lineDashed15:`⁃`,lineVertical:`│`,lineVerticalBold:`┃`,lineVerticalDouble:`║`,lineVerticalDashed0:`┆`,lineVerticalDashed1:`┇`,lineVerticalDashed2:`┊`,lineVerticalDashed3:`┋`,lineVerticalDashed4:`╎`,lineVerticalDashed5:`╏`,lineVerticalDashed6:`╵`,lineVerticalDashed7:`╷`,lineVerticalDashed8:`╹`,lineVerticalDashed9:`╻`,lineVerticalDashed10:`╽`,lineVerticalDashed11:`╿`,lineDownLeft:`┐`,lineDownLeftArc:`╮`,lineDownBoldLeftBold:`┓`,lineDownBoldLeft:`┒`,lineDownLeftBold:`┑`,lineDownDoubleLeftDouble:`╗`,lineDownDoubleLeft:`╖`,lineDownLeftDouble:`╕`,lineDownRight:`┌`,lineDownRightArc:`╭`,lineDownBoldRightBold:`┏`,lineDownBoldRight:`┎`,lineDownRightBold:`┍`,lineDownDoubleRightDouble:`╔`,lineDownDoubleRight:`╓`,lineDownRightDouble:`╒`,lineUpLeft:`┘`,lineUpLeftArc:`╯`,lineUpBoldLeftBold:`┛`,lineUpBoldLeft:`┚`,lineUpLeftBold:`┙`,lineUpDoubleLeftDouble:`╝`,lineUpDoubleLeft:`╜`,lineUpLeftDouble:`╛`,lineUpRight:`└`,lineUpRightArc:`╰`,lineUpBoldRightBold:`┗`,lineUpBoldRight:`┖`,lineUpRightBold:`┕`,lineUpDoubleRightDouble:`╚`,lineUpDoubleRight:`╙`,lineUpRightDouble:`╘`,lineUpDownLeft:`┤`,lineUpBoldDownBoldLeftBold:`┫`,lineUpBoldDownBoldLeft:`┨`,lineUpDownLeftBold:`┥`,lineUpBoldDownLeftBold:`┩`,lineUpDownBoldLeftBold:`┪`,lineUpDownBoldLeft:`┧`,lineUpBoldDownLeft:`┦`,lineUpDoubleDownDoubleLeftDouble:`╣`,lineUpDoubleDownDoubleLeft:`╢`,lineUpDownLeftDouble:`╡`,lineUpDownRight:`├`,lineUpBoldDownBoldRightBold:`┣`,lineUpBoldDownBoldRight:`┠`,lineUpDownRightBold:`┝`,lineUpBoldDownRightBold:`┡`,lineUpDownBoldRightBold:`┢`,lineUpDownBoldRight:`┟`,lineUpBoldDownRight:`┞`,lineUpDoubleDownDoubleRightDouble:`╠`,lineUpDoubleDownDoubleRight:`╟`,lineUpDownRightDouble:`╞`,lineDownLeftRight:`┬`,lineDownBoldLeftBoldRightBold:`┳`,lineDownLeftBoldRightBold:`┯`,lineDownBoldLeftRight:`┰`,lineDownBoldLeftBoldRight:`┱`,lineDownBoldLeftRightBold:`┲`,lineDownLeftRightBold:`┮`,lineDownLeftBoldRight:`┭`,lineDownDoubleLeftDoubleRightDouble:`╦`,lineDownDoubleLeftRight:`╥`,lineDownLeftDoubleRightDouble:`╤`,lineUpLeftRight:`┴`,lineUpBoldLeftBoldRightBold:`┻`,lineUpLeftBoldRightBold:`┷`,lineUpBoldLeftRight:`┸`,lineUpBoldLeftBoldRight:`┹`,lineUpBoldLeftRightBold:`┺`,lineUpLeftRightBold:`┶`,lineUpLeftBoldRight:`┵`,lineUpDoubleLeftDoubleRightDouble:`╩`,lineUpDoubleLeftRight:`╨`,lineUpLeftDoubleRightDouble:`╧`,lineUpDownLeftRight:`┼`,lineUpBoldDownBoldLeftBoldRightBold:`╋`,lineUpDownBoldLeftBoldRightBold:`╈`,lineUpBoldDownLeftBoldRightBold:`╇`,lineUpBoldDownBoldLeftRightBold:`╊`,lineUpBoldDownBoldLeftBoldRight:`╉`,lineUpBoldDownLeftRight:`╀`,lineUpDownBoldLeftRight:`╁`,lineUpDownLeftBoldRight:`┽`,lineUpDownLeftRightBold:`┾`,lineUpBoldDownBoldLeftRight:`╂`,lineUpDownLeftBoldRightBold:`┿`,lineUpBoldDownLeftBoldRight:`╃`,lineUpBoldDownLeftRightBold:`╄`,lineUpDownBoldLeftBoldRight:`╅`,lineUpDownBoldLeftRightBold:`╆`,lineUpDoubleDownDoubleLeftDoubleRightDouble:`╬`,lineUpDoubleDownDoubleLeftRight:`╫`,lineUpDownLeftDoubleRightDouble:`╪`,lineCross:`╳`,lineBackslash:`╲`,lineSlash:`╱`},mv={tick:`✔`,info:`ℹ`,warning:`⚠`,cross:`✘`,squareSmall:`◻`,squareSmallFilled:`◼`,circle:`◯`,circleFilled:`◉`,circleDotted:`◌`,circleDouble:`◎`,circleCircle:`ⓞ`,circleCross:`ⓧ`,circlePipe:`Ⓘ`,radioOn:`◉`,radioOff:`◯`,checkboxOn:`☒`,checkboxOff:`☐`,checkboxCircleOn:`ⓧ`,checkboxCircleOff:`Ⓘ`,pointer:`❯`,triangleUpOutline:`△`,triangleLeft:`◀`,triangleRight:`▶`,lozenge:`◆`,lozengeOutline:`◇`,hamburger:`☰`,smiley:`㋡`,mustache:`෴`,star:`★`,play:`▶`,nodejs:`⬢`,oneSeventh:`⅐`,oneNinth:`⅑`,oneTenth:`⅒`},hv={tick:`√`,info:`i`,warning:`‼`,cross:`×`,squareSmall:`□`,squareSmallFilled:`■`,circle:`( )`,circleFilled:`(*)`,circleDotted:`( )`,circleDouble:`( )`,circleCircle:`(○)`,circleCross:`(×)`,circlePipe:`(│)`,radioOn:`(*)`,radioOff:`( )`,checkboxOn:`[×]`,checkboxOff:`[ ]`,checkboxCircleOn:`(×)`,checkboxCircleOff:`( )`,pointer:`>`,triangleUpOutline:`∆`,triangleLeft:`◄`,triangleRight:`►`,lozenge:`♦`,lozengeOutline:`◊`,hamburger:`≡`,smiley:`☺`,mustache:`┌─┐`,star:`✶`,play:`►`,nodejs:`♦`,oneSeventh:`1/7`,oneNinth:`1/9`,oneTenth:`1/10`},gv={...pv,...mv},_v={...pv,...hv};var vv=fv()?gv:_v;Object.entries(mv);const yv={prefix:{idle:l(`blue`,`?`),done:l(`green`,vv.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>l(`yellow`,e))},style:{answer:e=>l(`cyan`,e),message:e=>l(`bold`,e),error:e=>l(`red`,`> ${e}`),defaultAnswer:e=>l(`dim`,`(${e})`),help:e=>l(`dim`,e),highlight:e=>l(`cyan`,e),key:e=>l(`cyan`,l(`bold`,`<${e}>`))}};function bv(e){if(typeof e!=`object`||!e)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function xv(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=bv(n)&&bv(r)?xv(n,r):r}return t}function Sv(...e){return xv(yv,...e.filter(e=>e!=null))}function Cv({status:e=`idle`,theme:t}){let[n,r]=Q(!1),[i,a]=Q(0),{prefix:o,spinner:s}=Sv(t);return dv(()=>{if(e===`loading`){let e,t=-1,n=setTimeout(()=>{r(!0),e=setInterval(()=>{t+=1,a(t%s.frames.length)},s.interval)},300);return()=>{clearTimeout(n),clearInterval(e)}}else r(!1)},[e]),n?s.frames[i]:typeof o==`string`?o:o[e===`loading`?`idle`:e]??o.idle}function wv(e,t){return cv(n=>{let r=n.get();if(!r||r.dependencies.length!==t.length||r.dependencies.some((e,n)=>e!==t[n])){let r=e();return n.set({value:r,dependencies:t}),r}return r.value})}function Tv(e){return Q({current:e})[0]}function Ev(e){let t=Tv(e);t.current=e,dv(e=>{let n=!1,r=sv((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var Dv=_(((e,t)=>{t.exports=r;function n(e){let t={defaultWidth:0,output:process.stdout,tty:x(`tty`)};return e?(Object.keys(t).forEach(function(n){e[n]||(e[n]=t[n])}),e):t}function r(e){let t=n(e);if(t.output.getWindowSize)return t.output.getWindowSize()[0]||t.defaultWidth;if(t.tty.getWindowSize)return t.tty.getWindowSize()[1]||t.defaultWidth;if(t.output.columns)return t.output.columns;if(process.env.CLI_WIDTH){let e=parseInt(process.env.CLI_WIDTH,10);if(!isNaN(e)&&e!==0)return e}return t.defaultWidth}}));const Ov=(()=>{let e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return t=>{let n=0;for(e.lastIndex=0;e.test(t);)n+=1;return t.length-n}})(),kv=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,Av=e=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141,jv=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Mv=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,Nv=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,Pv=/\t{1,1000}/y,Fv=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/uy,Iv=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Lv=/\p{M}+/gu,Rv={limit:1/0,ellipsis:``},zv=(e,t={},n={})=>{let r=t.limit??1/0,i=t.ellipsis??``,a=t?.ellipsisWidth??(i?zv(i,Rv,n).width:0),o=n.controlWidth??0,s=n.tabWidth??8,c=n.emojiWidth??2,l=n.regularWidth??1,u=n.wideWidth??2,d=[[Iv,l],[jv,0],[Mv,o],[Pv,s],[Fv,c],[Nv,u]],f=0,p=0,m=e.length,h=0,g=!1,_=m,v=Math.max(0,r-a),y=0,b=0,x=0,S=0;outer:for(;;){if(b>y||p>=m&&p>f){let t=e.slice(y,b)||e.slice(f,p);h=0;for(let e of t.replaceAll(Lv,``)){let t=e.codePointAt(0)||0;if(S=kv(t)?2:Av(t)?u:l,x+S>v&&(_=Math.min(_,Math.max(y,f)+h)),x+S>r){g=!0;break outer}h+=e.length,x+=S}y=b=0}if(p>=m)break outer;for(let t=0,n=d.length;t<n;t++){let[n,i]=d[t];if(n.lastIndex=p,n.test(e)){if(h=n===Nv?Ov(e.slice(p,n.lastIndex)):n===Fv?1:n.lastIndex-p,S=h*i,x+S>v&&(_=Math.min(_,p+Math.floor((v-x)/i))),x+S>r){g=!0;break outer}x+=S,y=f,b=p,p=f=n.lastIndex;continue outer}}p+=1}return{width:g?v:x,index:g?_:m,truncated:g,ellipsed:g&&r>=a}};var Bv=zv;const Vv={limit:1/0,ellipsis:``,ellipsisWidth:0};var Hv=(e,t={})=>Bv(e,Vv,t).width;const Uv=`]8;;`,Wv=RegExp(`(?:\\[(?<code>\\d+)m|\\${Uv}(?<uri>.*))`,`y`),Gv=e=>{if(e>=30&&e<=37||e>=90&&e<=97)return 39;if(e>=40&&e<=47||e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0},Kv=e=>`[${e}m`,qv=e=>`${Uv}${e}`,Jv=(e,t,n)=>{let r=t[Symbol.iterator](),i=!1,a=!1,o=e.at(-1),s=o===void 0?0:Hv(o),c=r.next(),l=r.next(),u=0;for(;!c.done;){let o=c.value,d=Hv(o);s+d<=n?e[e.length-1]+=o:(e.push(o),s=0),(o===`\x1B`||o===`›`)&&(i=!0,a=t.startsWith(Uv,u+1)),i?a?o===`\x07`&&(i=!1,a=!1):o===`m`&&(i=!1):(s+=d,s===n&&!l.done&&(e.push(``),s=0)),c=l,l=r.next(),u+=o.length}o=e.at(-1),!s&&o!==void 0&&o.length&&e.length>1&&(e[e.length-2]+=e.pop())},Yv=e=>{let t=e.split(` `),n=t.length;for(;n&&!Hv(t[n-1]);)n--;return n===t.length?e:t.slice(0,n).join(` `)+t.slice(n).join(``)},Xv=(e,t,n={})=>{if(n.trim!==!1&&e.trim()===``)return``;let r=``,i,a,o=e.split(` `),s=[``],c=0;for(let e=0;e<o.length;e++){let r=o[e];if(n.trim!==!1){let e=s.at(-1)??``,t=e.trimStart();e.length!==t.length&&(s[s.length-1]=t,c=Hv(t))}e!==0&&(c>=t&&(n.wordWrap===!1||n.trim===!1)&&(s.push(``),c=0),(c||n.trim===!1)&&(s[s.length-1]+=` `,c++));let i=Hv(r);if(n.hard&&i>t){let e=t-c,n=1+Math.floor((i-e-1)/t);Math.floor((i-1)/t)<n&&s.push(``),Jv(s,r,t),c=Hv(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){Jv(s,r,t),c=Hv(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){Jv(s,r,t),c=Hv(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>Yv(e)));let l=s.join(`
188
188
  `),u=!1;for(let e=0;e<l.length;e++){let t=l[e];if(r+=t,u)u=!1;else if(u=t>=`\ud800`&&t<=`\udbff`,u)continue;if(t===`\x1B`||t===`›`){Wv.lastIndex=e+1;let t=Wv.exec(l)?.groups;if(t?.code!==void 0){let e=Number.parseFloat(t.code);i=e===39?void 0:e}else t?.uri!==void 0&&(a=t.uri.length===0?void 0:t.uri)}if(l[e+1]===`
189
189
  `){a&&(r+=qv(``));let e=i?Gv(i):void 0;i&&e&&(r+=Kv(e))}else t===`
190
190
  `&&(i&&Gv(i)&&(r+=Kv(i)),a&&(r+=qv(a)))}return r},Zv=/\r?\n/;function Qv(e,t,n){return String(e).normalize().split(Zv).map(e=>Xv(e,t,n)).join(`
@@ -200,4 +200,4 @@ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\
200
200
  `+t:``),o=Math.floor(n.length/i)-this.cursorPos.rows+(t?Ty(t):0);o>0&&(a+=by(o)),a+=Sy(this.cursorPos.cols),this.write(xy(this.extraLinesUnderPrompt)+wy(this.height)+a),this.extraLinesUnderPrompt=o,this.height=Ty(a)}checkCursorPos(){let e=this.rl.getCursorPos();e.cols!==this.cursorPos.cols&&(this.write(Sy(e.cols)),this.cursorPos=e)}done({clearContent:e}){this.rl.setPrompt(``);let t=xy(this.extraLinesUnderPrompt);t+=e?wy(this.height):`
201
201
  `,t+=`\x1B[?25h`,this.write(t),this.rl.close()}},Oy=class extends Promise{static withResolver(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}},ky=b(iy(),1);const Ay=globalThis.setImmediate;function jy(){let e=Error.prepareStackTrace,t=[];try{Error.prepareStackTrace=(e,n)=>{let r=n.slice(1);return t=r,r},Error().stack}catch{return t}return Error.prepareStackTrace=e,t}function My(e){let t=jy();return(n,r={})=>{let{input:i=process.stdin,signal:a}=r,o=new Set,c=new ky.default;c.pipe(r.output??process.stdout),c.mute();let l=u.createInterface({terminal:!0,input:i,output:c}),d=new Dy(l),{promise:f,resolve:p,reject:m}=Oy.withResolver(),h=()=>m(new Q_);if(a){let e=()=>m(new Z_({cause:a.reason}));if(a.aborted)return e(),Object.assign(f,{cancel:h});a.addEventListener(`abort`,e),o.add(()=>a.removeEventListener(`abort`,e))}o.add(gy((e,t)=>{m(new $_(`User force closed the prompt with ${e} ${t}`))}));let g=()=>m(new $_(`User force closed the prompt with SIGINT`));return l.on(`SIGINT`,g),o.add(()=>l.removeListener(`SIGINT`,g)),iv(l,a=>{let u=s.bind(()=>uv.clearAll());l.on(`close`,u),o.add(()=>l.removeListener(`close`,u));let g=()=>{let r=()=>d.checkCursorPos();l.input.on(`keypress`,r),o.add(()=>l.input.removeListener(`keypress`,r)),a(()=>{try{let r=e(n,e=>{setImmediate(()=>p(e))});if(r===void 0){let e=t[1]?.getFileName();throw Error(`Prompt functions must return a string.\n at ${e}`)}let[i,a]=typeof r==`string`?[r]:r;d.render(i,a),uv.run()}catch(e){m(e)}})};return`readableFlowing`in i?Ay(g):g(),Object.assign(f.then(e=>(uv.clearAll(),e),e=>{throw uv.clearAll(),e}).finally(()=>{o.forEach(e=>e()),d.done({clearContent:!!r.clearPromptOnDone}),c.end()}).then(()=>f),{cancel:h})})}}var $=class{separator=l(`dim`,Array.from({length:15}).join(vv.line));type=`separator`;constructor(e){e&&(this.separator=e)}static isSeparator(e){return!!(e&&typeof e==`object`&&`type`in e&&e.type===`separator`)}};const Ny={icon:{checked:l(`green`,vv.circleFilled),unchecked:vv.circle,cursor:vv.pointer,disabledChecked:l(`green`,vv.circleDouble),disabledUnchecked:`-`},style:{disabled:e=>l(`dim`,e),renderSelectedChoices:e=>e.map(e=>e.short).join(`, `),description:e=>l(`cyan`,e),keysHelpTip:e=>e.map(([e,t])=>`${l(`bold`,e)} ${l(`dim`,t)}`).join(l(`dim`,` • `))},i18n:{disabledError:`This option is disabled and cannot be toggled.`},keybindings:[]};function Py(e){return!$.isSeparator(e)&&!e.disabled}function Fy(e){return!$.isSeparator(e)}function Iy(e){return!$.isSeparator(e)&&e.checked}function Ly(e){return Py(e)?{...e,checked:!e.checked}:e}function Ry(e){return function(t){return Py(t)?{...t,checked:e}:t}}function zy(e){return e.map(e=>{if($.isSeparator(e))return e;if(typeof e==`string`)return{value:e,name:e,short:e,checkedName:e,disabled:!1,checked:!1};let t=e.name??String(e.value),n={value:e.value,name:t,short:e.short??t,checkedName:e.checkedName??t,disabled:e.disabled??!1,checked:e.checked??!1};return e.description&&(n.description=e.description),n})}var By=My((e,t)=>{let{pageSize:n=7,loop:r=!0,required:i,validate:a=()=>!0}=e,o={all:`a`,invert:`i`,...e.shortcuts},s=Sv(Ny,e.theme),{keybindings:c}=s,[l,u]=Q(`idle`),d=Cv({status:l,theme:s}),[f,p]=Q(zy(e.choices)),m=wv(()=>{let e=f.findIndex(Fy),t=f.findLastIndex(Fy);if(e===-1)throw new tv(`[checkbox prompt] No selectable choices. All choices are disabled.`);return{first:e,last:t}},[f]),[h,g]=Q(m.first),[_,v]=Q();Ev(async e=>{if(X_(e)){let e=f.filter(Iy),n=await a([...e]);i&&!e.length?v(`At least one choice must be selected`):n===!0?(u(`done`),t(e.map(e=>e.value))):v(n||`You must select a valid value`)}else if(W_(e,c)||G_(e,c)){if(_&&v(void 0),r||W_(e,c)&&h!==m.first||G_(e,c)&&h!==m.last){let t=W_(e,c)?-1:1,n=h;do n=(n+t+f.length)%f.length;while(!Fy(f[n]));g(n)}}else if(K_(e)){let e=f[h];e&&!$.isSeparator(e)&&(e.disabled?v(s.i18n.disabledError):(v(void 0),p(f.map((e,t)=>t===h?Ly(e):e))))}else if(e.name===o.all){let e=f.some(e=>Py(e)&&!e.checked);p(f.map(Ry(e)))}else if(e.name===o.invert)p(f.map(Ly));else if(Y_(e)){let t=Number(e.name)-1,n=-1,r=f.findIndex(e=>$.isSeparator(e)?!1:(n++,n===t)),i=f[r];i&&Py(i)&&(g(r),p(f.map((e,t)=>t===r?Ly(e):e)))}});let y=s.style.message(e.message,l),b,x=ry({items:f,active:h,renderItem({item:e,isActive:t}){if($.isSeparator(e))return` ${e.separator}`;let n=t?s.icon.cursor:` `;if(e.disabled){let t=typeof e.disabled==`string`?e.disabled:`(disabled)`,r=e.checked?s.icon.disabledChecked:s.icon.disabledUnchecked;return s.style.disabled(`${n}${r} ${e.name} ${t}`)}t&&(b=e.description);let r=e.checked?s.icon.checked:s.icon.unchecked,i=e.checked?e.checkedName:e.name;return(t?s.style.highlight:e=>e)(`${n}${r} ${i}`)},pageSize:n,loop:r});if(l===`done`){let e=f.filter(Iy);return[d,y,s.style.answer(s.style.renderSelectedChoices(e,f))].filter(Boolean).join(` `)}let S=[[`↑↓`,`navigate`],[`space`,`select`]];o.all&&S.push([o.all,`all`]),o.invert&&S.push([o.invert,`invert`]),S.push([`⏎`,`submit`]);let C=s.style.keysHelpTip(S);return`${[[d,y].filter(Boolean).join(` `),x,` `,b?s.style.description(b):``,_?s.style.error(_):``,C].filter(Boolean).join(`
202
202
  `).trimEnd()}${yy}`});const Vy={validationFailureMode:`keep`};var Hy=My((e,t)=>{let{prefill:n=`tab`}=e,r=Sv(Vy,e.theme),[i,a]=Q(`idle`),[o,s]=Q(String(e.default??``)),[c,l]=Q(),[u,d]=Q(``),f=Cv({status:i,theme:r});async function p(t){let{required:n,pattern:r,patternError:i=`Invalid input`}=e;return n&&!t?`You must provide a value`:r&&!r.test(t)?i:typeof e.validate==`function`?await e.validate(t)||`You must provide a valid value`:!0}Ev(async(e,n)=>{if(i===`idle`)if(X_(e)){let e=u||o;a(`loading`);let i=await p(e);i===!0?(d(e),a(`done`),t(e)):(r.validationFailureMode===`clear`?d(``):n.write(u),l(i),a(`idle`))}else q_(e)&&!u?s(``):J_(e)&&!u?(s(``),n.clearLine(0),n.write(o),d(o)):(d(n.line),l(void 0))}),dv(e=>{n===`editable`&&o&&(e.write(o),d(o))},[]);let m=r.style.message(e.message,i),h=u;typeof e.transformer==`function`?h=e.transformer(u,{isFinal:i===`done`}):i===`done`&&(h=r.style.answer(u));let g;o&&i!==`done`&&!u&&(g=r.style.defaultAnswer(o));let _=``;return c&&(_=r.style.error(c)),[[f,m,g,h].filter(e=>e!==void 0).join(` `),_]});const Uy={icon:{cursor:vv.pointer},style:{disabled:e=>l(`dim`,e),description:e=>l(`cyan`,e),keysHelpTip:e=>e.map(([e,t])=>`${l(`bold`,e)} ${l(`dim`,t)}`).join(l(`dim`,` • `))},i18n:{disabledError:`This option is disabled and cannot be selected.`},indexMode:`hidden`,keybindings:[]};function Wy(e){return!$.isSeparator(e)&&!e.disabled}function Gy(e){return!$.isSeparator(e)}function Ky(e){return e.map(e=>{if($.isSeparator(e))return e;if(typeof e!=`object`||!e||!(`value`in e)){let t=String(e);return{value:e,name:t,short:t,disabled:!1}}let t=e.name??String(e.value),n={value:e.value,name:t,short:e.short??t,disabled:e.disabled??!1};return e.description&&(n.description=e.description),n})}var qy=My((e,t)=>{let{loop:n=!0,pageSize:r=7}=e,i=Sv(Uy,e.theme),{keybindings:a}=i,[o,s]=Q(`idle`),c=Cv({status:o,theme:i}),l=Tv(),u=!a.includes(`vim`),d=wv(()=>Ky(e.choices),[e.choices]),f=wv(()=>{let e=d.findIndex(Gy),t=d.findLastIndex(Gy);if(e===-1)throw new tv(`[select prompt] No selectable choices. All choices are disabled.`);return{first:e,last:t}},[d]),p=wv(()=>`default`in e?d.findIndex(t=>Wy(t)&&t.value===e.default):-1,[e.default,d]),[m,h]=Q(p===-1?f.first:p),g=d[m],[_,v]=Q();Ev((e,r)=>{if(clearTimeout(l.current),_&&v(void 0),X_(e))g.disabled?v(i.i18n.disabledError):(s(`done`),t(g.value));else if(W_(e,a)||G_(e,a)){if(r.clearLine(0),n||W_(e,a)&&m!==f.first||G_(e,a)&&m!==f.last){let t=W_(e,a)?-1:1,n=m;do n=(n+t+d.length)%d.length;while(!Gy(d[n]));h(n)}}else if(Y_(e)&&!Number.isNaN(Number(r.line))){let e=Number(r.line)-1,t=-1,n=d.findIndex(n=>$.isSeparator(n)?!1:(t++,t===e)),i=d[n];i!=null&&Wy(i)&&h(n),l.current=setTimeout(()=>{r.clearLine(0)},700)}else if(q_(e))r.clearLine(0);else if(u){let e=r.line.toLowerCase(),t=d.findIndex(t=>$.isSeparator(t)||!Wy(t)?!1:t.name.toLowerCase().startsWith(e));t!==-1&&h(t),l.current=setTimeout(()=>{r.clearLine(0)},700)}}),dv(()=>()=>{clearTimeout(l.current)},[]);let y=i.style.message(e.message,o),b=i.style.keysHelpTip([[`↑↓`,`navigate`],[`⏎`,`select`]]),x=0,S=ry({items:d,active:m,renderItem({item:e,isActive:t,index:n}){if($.isSeparator(e))return x++,` ${e.separator}`;let r=t?i.icon.cursor:` `,a=i.indexMode===`number`?`${n+1-x}. `:``;if(e.disabled){let n=typeof e.disabled==`string`?e.disabled:`(disabled)`,r=t?i.icon.cursor:`-`;return i.style.disabled(`${r} ${a}${e.name} ${n}`)}return(t?i.style.highlight:e=>e)(`${r} ${a}${e.name}`)},pageSize:r,loop:n});if(o===`done`)return[c,y,i.style.answer(g.short)].filter(Boolean).join(` `);let{description:C}=g;return`${[[c,y].filter(Boolean).join(` `),S,` `,C?i.style.description(C):``,_?i.style.error(_):``,b].filter(Boolean).join(`
203
- `).trimEnd()}${yy}`}),Jy=class{static async getText(e){let{message:t,schema:n,default:r}=e,i;if(n&&r!==void 0){let e=n.safeParse(r);e.success&&(i=e.data)}else !n&&r!==void 0&&(i=r);if(n&&n instanceof Af)return await qy({message:t,choices:n.options.map(e=>({value:e})),default:i});let a=await Hy({message:t,default:i,validate:e=>{if(!n)return!0;let t=e;if(n instanceof Dd){if(e.trim()===``)return`Input cannot be empty`;let n=Number(e);if(Number.isNaN(n))return`Please enter a valid number`;t=n}let r=n.safeParse(t);return r.success?!0:r.error.issues[0]?.message??`Invalid input`}});if(!n)return a;let o=n instanceof Dd?Number(a):a;return n.parse(o)}static async choose(e){let{message:t,options:n,mode:r=`single`,default:i,includeAllOption:a=!1,required:o=!1}=e,s=`__all__`,c=r===`single`?[i]:[...i||[]],l=[...r===`multiple`&&a?[{name:`All`,value:s,checked:c.includes(s)}]:[],...n.map(e=>({name:e,value:e,checked:c.includes(e)}))];if(r===`multiple`){let e=await By({message:t,choices:l,validate:e=>o&&e.length===0?`You must select at least one option.`:!0});return a&&e.includes(s)?n:e}return await qy({message:t,choices:n.map(e=>({name:e,value:e})),default:typeof i==`string`?i:void 0})}},Yy=class e{static command=new hg(`init`).argument(`[projectName]`).option(`-d, --dir <path>`,`workspace directory`).action(e.run.bind(e));static async run(t,n){let r=await Promise.all((await z_.getPackageList()).map(async e=>({...e,packageJson:await z_.parsePackageJson({dir:e.path})}))),i=await e.getPrefs({projectName:t,options:n,projects:r.filter(e=>!(e.type!==`apps`||e.packageJson?.startx?.mode===`silent`))}),a=await Promise.all(r.filter(e=>e.type!==`apps`).map(async e=>({...e,packageJson:await z_.parsePackageJson({dir:e.path})}))),o=await this.getConfigPrefs({selectedApps:i.selectedApps,packages:a}),s=await this.getPackagesPrefs({selectedApps:i.selectedApps,selectedPackages:o.selectedConfigs,packages:a,tags:o.tags});await this.installWorkspace({name:i.projectName,tags:[...s.tags,`runnable`],dir:{workspace:i.directory.workspace,template:i.directory.template}}),await Promise.all(s.selectedPackages.concat(i.selectedApps).map(async e=>{let t=new Map,n=new Set(s.tags);e.packageJson?.startx?.mode===`standalone`&&n.add(`runnable`),e.type===`apps`&&(n.add(`runnable`),s.selectedPackages.filter(t=>t.packageJson?.startx?.mode!==`standalone`&&t.packageJson?.startx?.iTags?.every(t=>e.packageJson?.startx?.tags?.includes(t))).forEach(e=>t.set(e.packageJson?.name||e.name,`workspace:^`))),await this.installPackage({packages:e,directory:{workspace:i.directory.workspace,template:i.directory.template},tags:Array.from(n),dependencies:Object.fromEntries(t)})}))}static async getPrefs(e){e.projectName||=await Jy.getText({message:`Project name`,name:`projectName`,schema:Gp.string().min(2).trim()});let n=z_.getDirectory(),r;if(e.options.dir)try{r=t.resolve(n.workspace,e.options.dir)}catch{throw Error(`Invalid template directory`)}else r=t.join(n.workspace,e.projectName);if(e.projects.length===0)throw Error(`No apps found`);let i=await Jy.choose({message:`Select apps to install`,options:e.projects.map(e=>e.name),includeAllOption:!0,mode:`multiple`,required:!0}),a=e.projects.filter(e=>i.includes(e.name));return{projectName:e.projectName,directory:{workspace:r,template:n.template},selectedApps:a}}static async getConfigPrefs(e){let t=new Set([`common`]),n=new Map;e.selectedApps.flatMap(e=>e.packageJson?.startx?.gTags||[]).forEach(e=>t.add(e)),e.selectedApps.flatMap(e=>[...e.packageJson?.startx?.requiredDeps||[],...e.packageJson?.startx?.requiredDevDeps||[]]).forEach(t=>{let r=e.packages.find(e=>e.packageJson?.name===t);r&&n.set(r.name,r)});let r=e.packages.filter(e=>!(e.type!==`configs`||e.packageJson?.startx?.mode===`silent`||n.has(e.name)||!e.packageJson?.startx?.iTags?.every(e=>t.has(e))));if(r.length===0)return{tags:Array.from(t),selectedConfigs:Array.from(n.values())};let i=await Jy.choose({message:`Select configs to install`,options:r.map(e=>e.name),includeAllOption:!0,mode:`multiple`,required:!1});return r.filter(e=>i.includes(e.name)).forEach(e=>n.set(e.name,e)),t.has(`node`)&&(await Jy.choose({message:`Select formatter`,options:[`prettier + biome`,`prettier`],mode:`single`,default:`prettier`,required:!0})===`prettier`||t.add(`biome`),t.add(`prettier`)),Array.from(n.values()).forEach(t=>{let r=t.packageJson?.startx?.requiredDeps||[],i=t.packageJson?.startx?.requiredDevDeps||[];[...r,...i].forEach(t=>{let r=e.packages.find(e=>e.packageJson?.name===t);r&&n.set(r.name,r)})}),Array.from(n.values()).forEach(e=>{(e.packageJson?.startx?.gTags||[]).forEach(e=>t.add(e))}),{tags:Array.from(t),selectedConfigs:Array.from(n.values())}}static async getPackagesPrefs(e){let t=new Set(e.tags),n=new Map(e.selectedPackages.map(e=>[e.name,e])),r=e.packages.filter(e=>!(e.type!==`packages`||e.packageJson?.startx?.mode===`silent`||n.has(e.name)||!e.packageJson?.startx?.iTags?.every(e=>t.has(e))));if(!r.length)return{selectedPackages:Array.from(n.values()),tags:Array.from(t)};let i=await Jy.choose({message:`Select packages to install`,options:r.map(e=>e.name),includeAllOption:!0,mode:`multiple`,required:!1});return r.filter(e=>i.includes(e.name)).forEach(e=>n.set(e.name,e)),Array.from(n.values()).forEach(t=>{let r=t.packageJson?.startx?.requiredDeps||[],i=t.packageJson?.startx?.requiredDevDeps||[];[...r,...i].forEach(t=>{let r=e.packages.find(e=>e.packageJson?.name===t);r&&n.set(r.name,r)})}),Array.from(n.values()).forEach(e=>{(e.packageJson?.startx?.gTags||[]).forEach(e=>t.add(e))}),{tags:Array.from(t),selectedPackages:Array.from(n.values())}}static async installPackage(e){let n=new Set(e.tags.concat(e.packages.packageJson?.startx?.tags||[])),{packageJson:r,isWorkspace:i}=U_.handlePackageJson({app:e.packages.packageJson,tags:Array.from(n),name:e.packages.name});if(i)throw Error(`Can't install workspace as package.`);let a=t.join(e.directory.workspace,e.packages.type),o=t.join(e.directory.template,e.packages.type);if(e.packages.packageJson?.name?.startsWith(`@repo`)){let n=e.packages.packageJson.name.split(`/`)[1];a=t.join(a,`@repo`,n),o=t.join(o,`@repo`,n)}else a=t.join(a,e.packages.name),o=t.join(o,e.packages.name);await I_.writeJSONFile({dir:a,file:`package`,content:r});let s=await I_.listFiles({dir:o});for(let n of s){let r=L_[n];if(!(r&&!r.tags.every(t=>e.tags.includes(t))))try{await I_.copyFile({from:t.join(o,n),to:t.join(a,n)})}catch(e){tg.error(`Failed to copy file ${n}:`,e)}}await I_.copyDirectory({from:t.join(o,`src`),to:t.join(a,`src`),exclude:e.tags.includes(`vitest`)?void 0:/\.test\.tsx?$/}),tg.info(`Successfully installed ${e.packages.name}`)}static async installWorkspace(e){let n=[`root`,...e.tags],r=await z_.parsePackageJson({dir:e.dir.template}),i=await z_.parsePackageJson({dir:e.dir.template,file:`startx`});if(!r)throw Error(`Failed to parse package.json`);r.dependencies=i?.dependencies||{},r.devDependencies=i?.devDependencies||{};let{packageJson:a}=U_.handlePackageJson({app:r,tags:n,name:e.name});await I_.writeJSONFile({dir:e.dir.workspace,file:`package`,content:a});let o=await I_.listFiles({dir:e.dir.template});for(let r of o){let i=L_[r];if(!(i&&!i.tags.every(e=>n.includes(e))))try{await I_.copyFile({from:t.join(e.dir.template,r),to:t.join(e.dir.workspace,r)})}catch(e){tg.error(`Failed to copy file ${r}:`,e)}}}},Xy=`0.6.1`;const Zy=new hg;Zy.name(`startx`).description(`StartX CLI - Your all in one monorepo startup tool.`).version(Xy),Zy.command(`ping`).action(()=>{tg.info(`pong`)}),Zy.addCommand(Yy.command),Zy.parse(process.argv);export{};
203
+ `).trimEnd()}${yy}`}),Jy=class{static async getText(e){let{message:t,schema:n,default:r}=e,i;if(n&&r!==void 0){let e=n.safeParse(r);e.success&&(i=e.data)}else !n&&r!==void 0&&(i=r);if(n&&n instanceof Af)return await qy({message:t,choices:n.options.map(e=>({value:e})),default:i});let a=await Hy({message:t,default:i,validate:e=>{if(!n)return!0;let t=e;if(n instanceof Dd){if(e.trim()===``)return`Input cannot be empty`;let n=Number(e);if(Number.isNaN(n))return`Please enter a valid number`;t=n}let r=n.safeParse(t);return r.success?!0:r.error.issues[0]?.message??`Invalid input`}});if(!n)return a;let o=n instanceof Dd?Number(a):a;return n.parse(o)}static async choose(e){let{message:t,options:n,mode:r=`single`,default:i,includeAllOption:a=!1,required:o=!1}=e,s=`__all__`,c=r===`single`?[i]:[...i||[]],l=[...r===`multiple`&&a?[{name:`All`,value:s,checked:c.includes(s)}]:[],...n.map(e=>({name:e,value:e,checked:c.includes(e)}))];if(r===`multiple`){let e=await By({message:t,choices:l,validate:e=>o&&e.length===0?`You must select at least one option.`:!0});return a&&e.includes(s)?n:e}return await qy({message:t,choices:n.map(e=>({name:e,value:e})),default:typeof i==`string`?i:void 0})}},Yy=class e{static command=new hg(`init`).argument(`[projectName]`).option(`-d, --dir <path>`,`workspace directory`).action(e.run.bind(e));static async run(t,n){let r=await Promise.all((await z_.getPackageList()).map(async e=>({...e,packageJson:await z_.parsePackageJson({dir:e.path})}))),i=await e.getPrefs({projectName:t,options:n,projects:r.filter(e=>!(e.type!==`apps`||e.packageJson?.startx?.mode===`silent`))}),a=await Promise.all(r.filter(e=>e.type!==`apps`).map(async e=>({...e,packageJson:await z_.parsePackageJson({dir:e.path})}))),o=await this.getConfigPrefs({selectedApps:i.selectedApps,packages:a}),s=await this.getPackagesPrefs({selectedApps:i.selectedApps,selectedPackages:o.selectedConfigs,packages:a,tags:o.tags});await this.installWorkspace({name:i.projectName,tags:[...s.tags,`runnable`],dir:{workspace:i.directory.workspace,template:i.directory.template}}),await Promise.all(s.selectedPackages.concat(i.selectedApps).map(async e=>{let t=new Map,n=new Set(s.tags);e.packageJson?.startx?.mode===`standalone`&&n.add(`runnable`),e.type===`apps`&&(n.add(`runnable`),s.selectedPackages.filter(t=>t.packageJson?.startx?.mode!==`standalone`&&t.packageJson?.startx?.iTags?.every(t=>e.packageJson?.startx?.tags?.includes(t))).forEach(e=>t.set(e.packageJson?.name||e.name,`workspace:^`))),await this.installPackage({packages:e,directory:{workspace:i.directory.workspace,template:i.directory.template},tags:Array.from(n),dependencies:Object.fromEntries(t)})}))}static async getPrefs(e){e.projectName||=await Jy.getText({message:`Project name`,name:`projectName`,schema:Gp.string().min(2).trim()});let n=z_.getDirectory(),r;if(e.options.dir)try{r=t.resolve(n.workspace,e.options.dir)}catch{throw Error(`Invalid template directory`)}else r=t.join(n.workspace,e.projectName);if(e.projects.length===0)throw Error(`No apps found`);let i=await Jy.choose({message:`Select apps to install`,options:e.projects.map(e=>e.name),includeAllOption:!0,mode:`multiple`,required:!0}),a=e.projects.filter(e=>i.includes(e.name));return{projectName:e.projectName,directory:{workspace:r,template:n.template},selectedApps:a}}static async getConfigPrefs(e){let t=new Set([`common`]),n=new Map;e.selectedApps.flatMap(e=>e.packageJson?.startx?.gTags||[]).forEach(e=>t.add(e)),e.selectedApps.flatMap(e=>[...e.packageJson?.startx?.requiredDeps||[],...e.packageJson?.startx?.requiredDevDeps||[]]).forEach(t=>{let r=e.packages.find(e=>e.packageJson?.name===t);r&&n.set(r.name,r)});let r=e.packages.filter(e=>!(e.type!==`configs`||e.packageJson?.startx?.mode===`silent`||n.has(e.name)||!e.packageJson?.startx?.iTags?.every(e=>t.has(e))));if(r.length===0)return{tags:Array.from(t),selectedConfigs:Array.from(n.values())};let i=await Jy.choose({message:`Select configs to install`,options:r.map(e=>e.name),includeAllOption:!0,mode:`multiple`,required:!1});return r.filter(e=>i.includes(e.name)).forEach(e=>n.set(e.name,e)),t.has(`node`)&&(await Jy.choose({message:`Select formatter`,options:[`prettier + biome`,`prettier`],mode:`single`,default:`prettier`,required:!0})===`prettier`||t.add(`biome`),t.add(`prettier`)),Array.from(n.values()).forEach(t=>{let r=t.packageJson?.startx?.requiredDeps||[],i=t.packageJson?.startx?.requiredDevDeps||[];[...r,...i].forEach(t=>{let r=e.packages.find(e=>e.packageJson?.name===t);r&&n.set(r.name,r)})}),Array.from(n.values()).forEach(e=>{(e.packageJson?.startx?.gTags||[]).forEach(e=>t.add(e))}),{tags:Array.from(t),selectedConfigs:Array.from(n.values())}}static async getPackagesPrefs(e){let t=new Set(e.tags),n=new Map(e.selectedPackages.map(e=>[e.name,e])),r=e.packages.filter(e=>!(e.type!==`packages`||e.packageJson?.startx?.mode===`silent`||n.has(e.name)||!e.packageJson?.startx?.iTags?.every(e=>t.has(e))));if(!r.length)return{selectedPackages:Array.from(n.values()),tags:Array.from(t)};let i=await Jy.choose({message:`Select packages to install`,options:r.map(e=>e.name),includeAllOption:!0,mode:`multiple`,required:!1});return r.filter(e=>i.includes(e.name)).forEach(e=>n.set(e.name,e)),Array.from(n.values()).forEach(t=>{let r=t.packageJson?.startx?.requiredDeps||[],i=t.packageJson?.startx?.requiredDevDeps||[];[...r,...i].forEach(t=>{let r=e.packages.find(e=>e.packageJson?.name===t);r&&n.set(r.name,r)})}),Array.from(n.values()).forEach(e=>{(e.packageJson?.startx?.gTags||[]).forEach(e=>t.add(e))}),{tags:Array.from(t),selectedPackages:Array.from(n.values())}}static async installPackage(e){let n=new Set(e.tags.concat(e.packages.packageJson?.startx?.tags||[]));e.packages.packageJson?.startx?.ignore?.find(e=>e===`eslint-config`)&&n.delete(`eslint`),e.packages.packageJson?.startx?.ignore?.find(e=>e===`vitest-config`)&&n.delete(`vitest`);let{packageJson:r,isWorkspace:i}=U_.handlePackageJson({app:e.packages.packageJson,tags:Array.from(n),name:e.packages.name});if(i)throw Error(`Can't install workspace as package.`);let a=t.join(e.directory.workspace,e.packages.type),o=t.join(e.directory.template,e.packages.type);if(e.packages.packageJson?.name?.startsWith(`@repo`)){let n=e.packages.packageJson.name.split(`/`)[1];a=t.join(a,`@repo`,n),o=t.join(o,`@repo`,n)}else a=t.join(a,e.packages.name),o=t.join(o,e.packages.name);await I_.writeJSONFile({dir:a,file:`package`,content:r});let s=await I_.listFiles({dir:o});for(let e of s){let r=L_[e];if(!(r&&!r.tags.every(e=>n.has(e))))try{await I_.copyFile({from:t.join(o,e),to:t.join(a,e)})}catch(t){tg.error(`Failed to copy file ${e}:`,t)}}await I_.copyDirectory({from:t.join(o,`src`),to:t.join(a,`src`),exclude:n.has(`vitest`)?void 0:/\.test\.tsx?$/}),tg.info(`Successfully installed ${e.packages.name}`)}static async installWorkspace(e){let n=[`root`,...e.tags],r=await z_.parsePackageJson({dir:e.dir.template}),i=await z_.parsePackageJson({dir:e.dir.template,file:`startx`});if(!r)throw Error(`Failed to parse package.json`);r.dependencies=i?.dependencies||{},r.devDependencies=i?.devDependencies||{};let{packageJson:a}=U_.handlePackageJson({app:r,tags:n,name:e.name});await I_.writeJSONFile({dir:e.dir.workspace,file:`package`,content:a});let o=await I_.listFiles({dir:e.dir.template});for(let r of o){let i=L_[r];if(!(i&&!i.tags.every(e=>n.includes(e))))try{await I_.copyFile({from:t.join(e.dir.template,r),to:t.join(e.dir.workspace,r)})}catch(e){tg.error(`Failed to copy file ${r}:`,e)}}}},Xy=`0.7.0`;const Zy=new hg;Zy.name(`startx`).description(`StartX CLI - Your all in one monorepo startup tool.`).version(Xy),Zy.command(`ping`).action(()=>{tg.info(`pong`)}),Zy.addCommand(Yy.command),Zy.parse(process.argv);export{};
@@ -5,9 +5,16 @@
5
5
  "type": "module",
6
6
  "main": "index.js",
7
7
  "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1",
9
8
  "build": "tsdown --config-loader unrun",
10
- "cli": "cross-env STARTX_ENV=development tsx src/index.ts"
9
+ "cli": "cross-env STARTX_ENV=development tsx src/index.ts",
10
+ "lint": "eslint .",
11
+ "lint:fix": "eslint . src/**/*.ts --fix",
12
+ "clean": "rimraf dist .turbo dist",
13
+ "deep:clean": "rimraf node_modules dist .turbo",
14
+ "typecheck": "tsc --noEmit",
15
+ "format": "prettier --write .",
16
+ "format:check": "prettier --check .",
17
+ "test": "vitest run"
11
18
  },
12
19
  "keywords": [],
13
20
  "author": "",
@@ -320,6 +320,10 @@ export class InitCommand {
320
320
  dependencies: Record<string, string>;
321
321
  }) {
322
322
  const tags = new Set(props.tags.concat(props.packages.packageJson?.startx?.tags || []));
323
+ if (props.packages.packageJson?.startx?.ignore?.find(e => e === "eslint-config"))
324
+ tags.delete("eslint");
325
+ if (props.packages.packageJson?.startx?.ignore?.find(e => e === "vitest-config"))
326
+ tags.delete("vitest");
323
327
  const { packageJson, isWorkspace } = FileHandler.handlePackageJson({
324
328
  app: props.packages.packageJson!,
325
329
  tags: Array.from(tags),
@@ -348,7 +352,7 @@ export class InitCommand {
348
352
  const files = await fsTool.listFiles({ dir: iTemplate });
349
353
  for (const file of files) {
350
354
  const checked = FileCheck[file];
351
- if (checked && !checked.tags.every(e => props.tags.includes(e))) continue;
355
+ if (checked && !checked.tags.every(e => tags.has(e))) continue;
352
356
  try {
353
357
  await fsTool.copyFile({
354
358
  from: path.join(iTemplate, file),
@@ -363,7 +367,7 @@ export class InitCommand {
363
367
  await fsTool.copyDirectory({
364
368
  from: path.join(iTemplate, "src"),
365
369
  to: path.join(iDirectory, "src"),
366
- exclude: !props.tags.includes("vitest") ? /\.test\.tsx?$/ : undefined,
370
+ exclude: !tags.has("vitest") ? /\.test\.tsx?$/ : undefined,
367
371
  });
368
372
  logger.info(`Successfully installed ${props.packages.name}`);
369
373
  }
@@ -38,12 +38,11 @@ export const FileCheck: WHITELIST_FILES = {
38
38
  "tsdown.config.ts": {
39
39
  tags: ["tsdown"],
40
40
  },
41
- // Handled manually
42
41
  "eslint.config.ts": {
43
- tags: ["never"],
42
+ tags: ["eslint", "node"],
44
43
  },
45
44
  "vitest.config.ts": {
46
- tags: ["never"],
45
+ tags: ["vitest", "node"],
47
46
  },
48
47
  "package.json": {
49
48
  tags: ["never"],
@@ -49,7 +49,7 @@ export const scripts: SCRIPT = {
49
49
  ],
50
50
  "cli": [
51
51
  {
52
- script: "turbo run cli",
52
+ script: "turbo run cli -- ",
53
53
  tags: ["runnable", "node", "cli", "root"],
54
54
  },
55
55
  {
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -10,7 +10,9 @@
10
10
  "./extend": "./src/configs/extend.ts"
11
11
  },
12
12
  "scripts": {
13
- "clean": "rimraf dist .turbo",
13
+ "lint": "eslint .",
14
+ "lint:fix": "eslint . src/**/*.ts --fix",
15
+ "clean": "rimraf dist .turbo dist",
14
16
  "deep:clean": "rimraf node_modules dist .turbo",
15
17
  "typecheck": "tsc --noEmit",
16
18
  "format": "biome format --write .",
@@ -30,10 +32,10 @@
30
32
  "eslint-plugin-react-hooks": "^5.0.0",
31
33
  "eslint-plugin-unicorn": "^55.0.0",
32
34
  "eslint-plugin-unused-imports": "^4.0.0",
33
- "globals": "^15.9.0",
34
- "typescript-eslint": "^8.54.0"
35
+ "globals": "^15.9.0"
35
36
  },
36
37
  "devDependencies": {
38
+ "typescript-eslint": "^8.54.0",
37
39
  "@types/eslint-config-prettier": "^6.11.3",
38
40
  "@types/eslint-plugin-jsx-a11y": "^6.10.1",
39
41
  "@typescript-eslint/eslint-plugin": "^8.0.0",
@@ -1,6 +1,11 @@
1
1
  import { RuleTester } from "@typescript-eslint/rule-tester";
2
+ import { afterAll, describe, it } from "vitest";
2
3
  import { NoJsonParseJsonStringifyRule } from "./no-json-parse-json-stringify.js";
3
4
 
5
+ RuleTester.afterAll = afterAll;
6
+ RuleTester.describe = describe;
7
+ RuleTester.it = it;
8
+
4
9
  const ruleTester = new RuleTester({
5
10
  languageOptions: {
6
11
  parserOptions: {
@@ -12,15 +17,9 @@ const ruleTester = new RuleTester({
12
17
 
13
18
  ruleTester.run("no-json-parse-json-stringify", NoJsonParseJsonStringifyRule, {
14
19
  valid: [
15
- {
16
- code: "structuredClone(foo)",
17
- },
18
- {
19
- code: "JSON.parse(foo)",
20
- },
21
- {
22
- code: "JSON.stringify(foo)",
23
- },
20
+ { code: "structuredClone(foo)" },
21
+ { code: "JSON.parse(foo)" },
22
+ { code: "JSON.stringify(foo)" },
24
23
  ],
25
24
  invalid: [
26
25
  {
@@ -1,5 +1,4 @@
1
1
  import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
- import { isJsonParseCall, isJsonStringifyCall } from "../utils/json.js";
3
2
 
4
3
  export const NoJsonParseJsonStringifyRule = ESLintUtils.RuleCreator.withoutDocs({
5
4
  name: "no-json-parse-json-stringify",
@@ -19,25 +18,36 @@ export const NoJsonParseJsonStringifyRule = ESLintUtils.RuleCreator.withoutDocs(
19
18
  create(context) {
20
19
  return {
21
20
  CallExpression(node) {
22
- // Must be JSON.parse(...)
23
- if (!isJsonParseCall(node)) return;
21
+ // 1. Explicitly check if the outer call is exactly JSON.parse(...)
22
+ if (
23
+ node.callee.type !== TSESTree.AST_NODE_TYPES.MemberExpression ||
24
+ node.callee.object.type !== TSESTree.AST_NODE_TYPES.Identifier ||
25
+ node.callee.object.name !== "JSON" ||
26
+ node.callee.property.type !== TSESTree.AST_NODE_TYPES.Identifier ||
27
+ node.callee.property.name !== "parse"
28
+ ) {
29
+ return;
30
+ }
24
31
 
25
- const [inner] = node.arguments;
32
+ const inner = node.arguments[0];
26
33
 
27
- // Must be JSON.stringify(...)
34
+ // 2. Explicitly check if the inner call is exactly JSON.stringify(...)
28
35
  if (
29
36
  !inner ||
30
37
  inner.type !== TSESTree.AST_NODE_TYPES.CallExpression ||
31
- !isJsonStringifyCall(inner)
38
+ inner.callee.type !== TSESTree.AST_NODE_TYPES.MemberExpression ||
39
+ inner.callee.object.type !== TSESTree.AST_NODE_TYPES.Identifier ||
40
+ inner.callee.object.name !== "JSON" ||
41
+ inner.callee.property.type !== TSESTree.AST_NODE_TYPES.Identifier ||
42
+ inner.callee.property.name !== "stringify"
32
43
  ) {
33
44
  return;
34
45
  }
35
46
 
36
- if (inner.arguments.length !== 1) return;
37
-
38
47
  const arg = inner.arguments[0];
39
48
  if (!arg) return;
40
49
 
50
+ // 3. Extract the text and report/fix
41
51
  const argText = context.sourceCode.getText(arg);
42
52
 
43
53
  context.report({
@@ -6,7 +6,10 @@
6
6
  "exports": "./src/config/tsdown.base.ts",
7
7
  "scripts": {
8
8
  "clean": "rimraf dist",
9
- "deep:clean": "rimraf node_modules dist"
9
+ "deep:clean": "rimraf node_modules dist",
10
+ "typecheck": "tsc --noEmit",
11
+ "format": "biome format --write .",
12
+ "format:check": "biome ci ."
10
13
  },
11
14
  "startx": {
12
15
  "gTags": [
@@ -31,7 +31,8 @@
31
31
  "typescript-config"
32
32
  ],
33
33
  "ignore": [
34
- "vitest-config"
34
+ "vitest-config",
35
+ "eslint-config"
35
36
  ]
36
37
  }
37
38
  }
@@ -4,6 +4,7 @@ import type { InlineConfig } from "vitest/node";
4
4
  export const baseVitestConfig = (options: InlineConfig = {}) =>
5
5
  defineConfig({
6
6
  test: {
7
+ passWithNoTests: true,
7
8
  silent: true,
8
9
  globals: true,
9
10
  include: ["src/**/*.{test,spec}.{ts,tsx}"],
@@ -1,15 +1,15 @@
1
- import { baseVitestConfig } from "./base.js";
1
+ import { baseVitestConfig } from "./base.ts";
2
2
 
3
3
  export default baseVitestConfig({
4
- environment: "jsdom",
5
- setupFiles: ["./src/__tests__/setup.ts"],
6
- css: {
7
- modules: {
8
- classNameStrategy: "non-scoped",
9
- },
10
- },
4
+ environment: "jsdom",
5
+ setupFiles: ["./src/__tests__/setup.ts"],
6
+ css: {
7
+ modules: {
8
+ classNameStrategy: "non-scoped",
9
+ },
10
+ },
11
11
 
12
- coverage: {
13
- reporter: ["text-summary", "lcov", "html"],
14
- }
12
+ coverage: {
13
+ reporter: ["text-summary", "lcov", "html"],
14
+ },
15
15
  });
@@ -1,5 +1,5 @@
1
- import { baseVitestConfig } from "./base.js";
1
+ import { baseVitestConfig } from "./base.ts";
2
2
 
3
3
  export default baseVitestConfig({
4
- environment: "node",
4
+ environment: "node",
5
5
  });
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "extends": "typescript-config/tsconfig.node.json",
3
3
  "compilerOptions": {
4
- "baseUrl": "./src"
4
+ "baseUrl": "./src",
5
+ "allowImportingTsExtensions": true
5
6
  },
7
+
6
8
  "include": ["src/**/*.ts"]
7
9
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "startx",
3
3
  "description": "",
4
- "version": "0.6.1",
4
+ "version": "0.7.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/avinashid/startx.git"
@@ -16,7 +16,8 @@
16
16
  "exports": "./src/index.ts",
17
17
  "devDependencies": {
18
18
  "typescript-config": "workspace:*",
19
- "eslint-config": "workspace:*"
19
+ "eslint-config": "workspace:*",
20
+ "vitest-config": "workspace:*"
20
21
  },
21
22
  "startx": {
22
23
  "iTags": [
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -17,6 +17,7 @@
17
17
  "devDependencies": {
18
18
  "@types/pg": "catalog:",
19
19
  "eslint-config": "workspace:*",
20
+ "vitest-config": "workspace:*",
20
21
  "typescript-config": "workspace:*"
21
22
  },
22
23
  "dependencies": {
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -14,7 +14,9 @@
14
14
  "@react-email/preview-server": "catalog:",
15
15
  "@types/react": "catalog:",
16
16
  "@types/react-dom": "catalog:",
17
- "react-email": "catalog:"
17
+ "react-email": "catalog:",
18
+ "typescript-config": "workspace:*",
19
+ "vitest-config": "workspace:^"
18
20
  },
19
21
  "dependencies": {
20
22
  "@react-email/components": "catalog:",
@@ -22,8 +24,7 @@
22
24
  "@react-email/tailwind": "catalog:",
23
25
  "eslint-config": "workspace:*",
24
26
  "react": "catalog:",
25
- "react-dom": "catalog:",
26
- "typescript-config": "workspace:*"
27
+ "react-dom": "catalog:"
27
28
  },
28
29
  "startx": {
29
30
  "iTags": [
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/frontend";
2
+
3
+ export default vitestConfig;
@@ -16,6 +16,7 @@
16
16
  "exports": "./src/index.ts",
17
17
  "devDependencies": {
18
18
  "eslint-config": "workspace:*",
19
+ "vitest-config": "workspace:*",
19
20
  "typescript-config": "workspace:*"
20
21
  },
21
22
  "dependencies": {
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/node";
2
+
3
+ export default vitestConfig;
@@ -24,7 +24,8 @@
24
24
  "postcss": "^8.4.49",
25
25
  "postcss-load-config": "^6",
26
26
  "tailwindcss": "catalog:",
27
- "typescript-config": "workspace:*"
27
+ "typescript-config": "workspace:*",
28
+ "vitest-config": "workspace:*"
28
29
  },
29
30
  "dependencies": {
30
31
  "@hookform/resolvers": "^3.9.1",
@@ -0,0 +1,3 @@
1
+ import vitestConfig from "vitest-config/frontend";
2
+
3
+ export default vitestConfig;
package/startx.json CHANGED
@@ -4,6 +4,7 @@
4
4
  "@biomejs/biome": "catalog:",
5
5
  "prettier": "catalog:",
6
6
  "eslint": "catalog:",
7
+ "vitest": "catalog:",
7
8
  "rimraf": "catalog:",
8
9
  "turbo": "catalog:",
9
10
  "typescript": "catalog:",