create-playcanvas 0.2.5 → 0.3.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 (33) hide show
  1. package/README.md +39 -47
  2. package/dist/index.mjs +51 -45
  3. package/package.json +53 -49
  4. package/templates/index.ts +15 -57
  5. package/templates/react-ts/README.md +32 -59
  6. package/templates/react-ts/eslint.config.mjs +14 -0
  7. package/templates/react-ts/index.html +10 -10
  8. package/templates/react-ts/package.json +34 -27
  9. package/templates/react-ts/prettier.config.mjs +1 -0
  10. package/templates/react-ts/src/App.css +37 -49
  11. package/templates/react-ts/src/App.tsx +38 -41
  12. package/templates/react-ts/src/Scene.tsx +50 -50
  13. package/templates/react-ts/src/index.css +30 -52
  14. package/templates/react-ts/src/main.tsx +9 -8
  15. package/templates/react-ts/src/vite-env.d.ts +12 -0
  16. package/templates/react-ts/tsconfig.json +24 -5
  17. package/templates/react-ts/vite.config.ts +4 -4
  18. package/templates/vanilla-ts/README.md +31 -91
  19. package/templates/vanilla-ts/eslint.config.mjs +3 -0
  20. package/templates/vanilla-ts/index.html +10 -10
  21. package/templates/vanilla-ts/package.json +28 -21
  22. package/templates/vanilla-ts/prettier.config.mjs +1 -0
  23. package/templates/vanilla-ts/src/App.ts +149 -151
  24. package/templates/vanilla-ts/src/main.ts +7 -7
  25. package/templates/vanilla-ts/src/style.css +60 -93
  26. package/templates/vanilla-ts/src/utils.ts +9 -8
  27. package/templates/vanilla-ts/src/vite-env.d.ts +12 -0
  28. package/templates/vanilla-ts/tsconfig.json +22 -22
  29. package/index.js +0 -3
  30. package/templates/react-ts/scripts/ensure-node-version.cjs +0 -12
  31. package/templates/react-ts/tsconfig.app.json +0 -27
  32. package/templates/react-ts/tsconfig.node.json +0 -25
  33. package/templates/vanilla-ts/scripts/ensure-node-version.cjs +0 -12
package/README.md CHANGED
@@ -1,78 +1,70 @@
1
1
  # create-playcanvas
2
2
 
3
3
  [![NPM Version](https://img.shields.io/npm/v/create-playcanvas)](https://www.npmjs.com/package/create-playcanvas)
4
- [![CI](https://github.com/playcanvas/create-playcanvas/actions/workflows/ci.yml/badge.svg)](https://github.com/playcanvas/create-playcanvas/actions/workflows/ci.yml)
4
+ [![NPM Downloads](https://img.shields.io/npm/dw/create-playcanvas)](https://npmtrends.com/create-playcanvas)
5
+ [![License](https://img.shields.io/npm/l/create-playcanvas)](https://github.com/playcanvas/create-playcanvas/blob/main/LICENSE)
6
+ [![Discord](https://img.shields.io/badge/Discord-5865F2?style=flat&logo=discord&logoColor=white&color=black)](https://discord.gg/RSaMRzg)
7
+ [![Reddit](https://img.shields.io/badge/Reddit-FF4500?style=flat&logo=reddit&logoColor=white&color=black)](https://www.reddit.com/r/PlayCanvas)
8
+ [![X](https://img.shields.io/badge/X-000000?style=flat&logo=x&logoColor=white&color=black)](https://x.com/intent/follow?screen_name=playcanvas)
5
9
 
6
- Spin up a ready-to-code [PlayCanvas](https://playcanvas.com/) project in seconds.
10
+ | [Engine Manual](https://developer.playcanvas.com/user-manual/engine/) | [React Manual](https://developer.playcanvas.com/user-manual/react/) | [Examples](https://playcanvas.github.io/) | [Forum](https://forum.playcanvas.com/) |
7
11
 
8
- ```bash
9
- npm create playcanvas@latest
10
- ```
12
+ Scaffold a Vite-powered PlayCanvas project with TypeScript. Choose the PlayCanvas Engine directly or build with [`@playcanvas/react`](https://github.com/playcanvas/react).
11
13
 
12
- Also works with other package managers:
14
+ ## Getting Started
15
+
16
+ Requires Node.js 22.23.2 or later.
13
17
 
14
18
  ```bash
15
- pnpm create playcanvas
16
- yarn create playcanvas
17
- bun create playcanvas
19
+ npm create playcanvas@latest
20
+ cd playcanvas-project
21
+ npm install
22
+ npm run dev
18
23
  ```
19
24
 
20
- The CLI will prompt you for:
21
-
22
- 1. **Project name** - folder to create (defaults to `playcanvas-project`)
23
- 2. **Overwrite behavior** - if the folder already exists
24
- 3. **Package name** - used in `package.json`
25
- 4. **Framework & variant** - pick from templates below
26
-
27
- ## Non-interactive Usage
25
+ The interactive setup asks for a project name, handles an existing target directory, sets the package name and lets you choose a template.
28
26
 
29
- Skip the prompts when scripting or if you know what you want:
27
+ You can also use another package manager:
30
28
 
31
29
  ```bash
32
- npm create playcanvas@latest my-game -- -t react-ts --overwrite
30
+ pnpm create playcanvas@latest
31
+ yarn create playcanvas
32
+ bun x create-playcanvas@latest
33
33
  ```
34
34
 
35
- | Flag | Shorthand | Description |
36
- | ------------------- | --------- | -------------------------------------------------- |
37
- | `--template <name>` | `-t` | Directly choose template variant (see list below) |
38
- | `--overwrite` | | Remove existing files in target directory |
39
- | `--help` | `-h` | Show help/usage information |
40
-
41
35
  ## Templates
42
36
 
43
- | Template | Description |
44
- | ------------ | -------------------------------------- |
45
- | `vanilla-ts` | Vanilla TypeScript + PlayCanvas Engine |
46
- | `react-ts` | React + TypeScript + PlayCanvas React |
37
+ | Template | Description |
38
+ | ------------ | ----------------------------------- |
39
+ | `vanilla-ts` | TypeScript with PlayCanvas Engine |
40
+ | `react-ts` | TypeScript with `@playcanvas/react` |
47
41
 
48
- _To add your own template, drop a folder in `templates/<name>` and update `templates/index.js`._
42
+ Both templates include Vite, hot module replacement, ESLint, Prettier and a production build.
49
43
 
50
- ## Development
44
+ ## CLI Options
51
45
 
52
- Clone the repo, then:
46
+ Pass a project name and template to skip the prompts:
53
47
 
54
48
  ```bash
55
- npm install
56
- npm run dev # stub build for local development
57
- node index.js # test the CLI locally
49
+ npm create playcanvas@latest my-game -- --template react-ts
58
50
  ```
59
51
 
60
- Or use `npm link` to test as if installed globally:
52
+ | Option | Shorthand | Description |
53
+ | ------------------- | --------- | ------------------------------------------------------- |
54
+ | `--template <name>` | `-t` | Use a template from the list above |
55
+ | `--overwrite` | | Remove existing files from a non-empty target directory |
56
+ | `--help` | `-h` | Show command help |
57
+
58
+ ## Development
61
59
 
62
60
  ```bash
63
- npm link
64
- create-playcanvas
61
+ npm install
62
+ npm run build
63
+ node dist/index.mjs
65
64
  ```
66
65
 
67
- ## Contributing
68
-
69
- Bug reports, feature requests and PRs are welcome! Want to create a new template? Please file an issue first if you plan major changes.
70
-
71
- 1. Fork / clone
72
- 2. Create a branch: `git checkout -b feat/my-awesome-idea`
73
- 3. Commit with conventional-commit messages
74
- 4. Push and open a PR
66
+ Contributions are welcome. Please open an issue before proposing a new template or another substantial change.
75
67
 
76
68
  ## License
77
69
 
78
- MIT
70
+ [MIT](LICENSE)
package/dist/index.mjs CHANGED
@@ -1,53 +1,59 @@
1
- import"node:util";import b,{stdin as pD,stdout as fD}from"node:process";import Y from"node:readline";import{Writable as bD}from"node:stream";import B from"node:fs";import m from"node:path";import{fileURLToPath as dD}from"node:url";import{promises as AD}from"fs";import vD from"path";function P(e){return e==null?[]:Array.isArray(e)?e:[e]}function xD(e,u,t,r){var i,s=e[u],D=~r.string.indexOf(u)?t==null||t===!0?"":String(t):typeof t=="boolean"?t:~r.boolean.indexOf(u)?t==="false"?!1:t==="true"||(e._.push((i=+t,i*0===0?i:t)),!!t):(i=+t,i*0===0?i:t);e[u]=s==null?D:Array.isArray(s)?s.concat(D):[s,D]}function $D(e,u){e=e||[],u=u||{};var t,r,i,s,D,n={_:[]},F=0,a=0,o=0,l=e.length;const c=u.alias!==void 0,p=u.unknown!==void 0,v=u.default!==void 0;if(u.alias=u.alias||{},u.string=P(u.string),u.boolean=P(u.boolean),c)for(t in u.alias)for(r=u.alias[t]=P(u.alias[t]),F=0;F<r.length;F++)(u.alias[r[F]]=r.concat(t)).splice(F,1);for(F=u.boolean.length;F-- >0;)for(r=u.alias[u.boolean[F]]||[],a=r.length;a-- >0;)u.boolean.push(r[a]);for(F=u.string.length;F-- >0;)for(r=u.alias[u.string[F]]||[],a=r.length;a-- >0;)u.string.push(r[a]);if(v){for(t in u.default)if(s=typeof u.default[t],r=u.alias[t]=u.alias[t]||[],u[s]!==void 0)for(u[s].push(t),F=0;F<r.length;F++)u[s].push(r[F])}const d=p?Object.keys(u.alias):[];for(F=0;F<l;F++){if(i=e[F],i==="--"){n._=n._.concat(e.slice(++F));break}for(a=0;a<i.length&&i.charCodeAt(a)===45;a++);if(a===0)n._.push(i);else if(i.substring(a,a+3)==="no-"){if(s=i.substring(a+3),p&&!~d.indexOf(s))return u.unknown(i);n[s]=!1}else{for(o=a+1;o<i.length&&i.charCodeAt(o)!==61;o++);for(s=i.substring(a,o),D=i.substring(++o)||F+1===l||(""+e[F+1]).charCodeAt(0)===45||e[++F],r=a===2?[s]:s,o=0;o<r.length;o++){if(s=r[o],p&&!~d.indexOf(s))return u.unknown("-".repeat(a)+s);xD(n,s,o+1<r.length||D,u)}}}if(v)for(t in u.default)n[t]===void 0&&(n[t]=u.default[t]);if(c)for(t in n)for(r=u.alias[t]||[];r.length>0;)n[r.shift()]=n[t];return n}function yD(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var I,q;function wD(){if(q)return I;q=1;const e="\x1B",u=`${e}[`,t="\x07",r={to(D,n){return n?`${u}${n+1};${D+1}H`:`${u}${D+1}G`},move(D,n){let F="";return D<0?F+=`${u}${-D}D`:D>0&&(F+=`${u}${D}C`),n<0?F+=`${u}${-n}A`:n>0&&(F+=`${u}${n}B`),F},up:(D=1)=>`${u}${D}A`,down:(D=1)=>`${u}${D}B`,forward:(D=1)=>`${u}${D}C`,backward:(D=1)=>`${u}${D}D`,nextLine:(D=1)=>`${u}E`.repeat(D),prevLine:(D=1)=>`${u}F`.repeat(D),left:`${u}G`,hide:`${u}?25l`,show:`${u}?25h`,save:`${e}7`,restore:`${e}8`},i={up:(D=1)=>`${u}S`.repeat(D),down:(D=1)=>`${u}T`.repeat(D)},s={screen:`${u}2J`,up:(D=1)=>`${u}1J`.repeat(D),down:(D=1)=>`${u}J`.repeat(D),line:`${u}2K`,lineEnd:`${u}K`,lineStart:`${u}1K`,lines(D){let n="";for(let F=0;F<D;F++)n+=this.line+(F<D-1?r.up():"");return D&&(n+=r.left),n}};return I={cursor:r,scroll:i,erase:s,beep:t},I}var A=wD(),T={exports:{}},U;function SD(){if(U)return T.exports;U=1;let e=process||{},u=e.argv||[],t=e.env||{},r=!(t.NO_COLOR||u.includes("--no-color"))&&(!!t.FORCE_COLOR||u.includes("--color")||e.platform==="win32"||(e.stdout||{}).isTTY&&t.TERM!=="dumb"||!!t.CI),i=(n,F,a=n)=>o=>{let l=""+o,c=l.indexOf(F,n.length);return~c?n+s(l,F,a,c)+F:n+l+F},s=(n,F,a,o)=>{let l="",c=0;do l+=n.substring(c,o)+a,c=o+F.length,o=n.indexOf(F,c);while(~o);return l+n.substring(c)},D=(n=r)=>{let F=n?i:()=>String;return{isColorSupported:n,reset:F("\x1B[0m","\x1B[0m"),bold:F("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:F("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:F("\x1B[3m","\x1B[23m"),underline:F("\x1B[4m","\x1B[24m"),inverse:F("\x1B[7m","\x1B[27m"),hidden:F("\x1B[8m","\x1B[28m"),strikethrough:F("\x1B[9m","\x1B[29m"),black:F("\x1B[30m","\x1B[39m"),red:F("\x1B[31m","\x1B[39m"),green:F("\x1B[32m","\x1B[39m"),yellow:F("\x1B[33m","\x1B[39m"),blue:F("\x1B[34m","\x1B[39m"),magenta:F("\x1B[35m","\x1B[39m"),cyan:F("\x1B[36m","\x1B[39m"),white:F("\x1B[37m","\x1B[39m"),gray:F("\x1B[90m","\x1B[39m"),bgBlack:F("\x1B[40m","\x1B[49m"),bgRed:F("\x1B[41m","\x1B[49m"),bgGreen:F("\x1B[42m","\x1B[49m"),bgYellow:F("\x1B[43m","\x1B[49m"),bgBlue:F("\x1B[44m","\x1B[49m"),bgMagenta:F("\x1B[45m","\x1B[49m"),bgCyan:F("\x1B[46m","\x1B[49m"),bgWhite:F("\x1B[47m","\x1B[49m"),blackBright:F("\x1B[90m","\x1B[39m"),redBright:F("\x1B[91m","\x1B[39m"),greenBright:F("\x1B[92m","\x1B[39m"),yellowBright:F("\x1B[93m","\x1B[39m"),blueBright:F("\x1B[94m","\x1B[39m"),magentaBright:F("\x1B[95m","\x1B[39m"),cyanBright:F("\x1B[96m","\x1B[39m"),whiteBright:F("\x1B[97m","\x1B[39m"),bgBlackBright:F("\x1B[100m","\x1B[49m"),bgRedBright:F("\x1B[101m","\x1B[49m"),bgGreenBright:F("\x1B[102m","\x1B[49m"),bgYellowBright:F("\x1B[103m","\x1B[49m"),bgBlueBright:F("\x1B[104m","\x1B[49m"),bgMagentaBright:F("\x1B[105m","\x1B[49m"),bgCyanBright:F("\x1B[106m","\x1B[49m"),bgWhiteBright:F("\x1B[107m","\x1B[49m")}};return T.exports=D(),T.exports.createColors=D,T.exports}var Z=SD();const C=yD(Z);function _D({onlyFirst:e=!1}={}){const u=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(u,e?void 0:"g")}const TD=_D();function H(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(TD,"")}function Q(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var X={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(r){var i=r.charCodeAt(0),s=r.length==2?r.charCodeAt(1):0,D=i;return 55296<=i&&i<=56319&&56320<=s&&s<=57343&&(i&=1023,s&=1023,D=i<<10|s,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(r){var i=this.eastAsianWidth(r);return i=="F"||i=="W"||i=="A"?2:1};function t(r){return r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(r){for(var i=t(r),s=0,D=0;D<i.length;D++)s=s+this.characterLength(i[D]);return s},u.slice=function(r,i,s){textLen=u.length(r),i=i||0,s=s||1,i<0&&(i=textLen+i),s<0&&(s=textLen+s);for(var D="",n=0,F=t(r),a=0;a<F.length;a++){var o=F[a],l=u.length(o);if(n>=i-(l==2?1:0))if(n+l<=s)D+=o;else break;n+=l}return D}})(X);var kD=X.exports;const MD=Q(kD);var jD=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const OD=Q(jD);function y(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:!0,...u},e=H(e),e.length===0))return 0;e=e.replace(OD()," ");const t=u.ambiguousIsNarrow?1:2;let r=0;for(const i of e){const s=i.codePointAt(0);if(!(s<=31||s>=127&&s<=159||s>=768&&s<=879))switch(MD.eastAsianWidth(i)){case"F":case"W":r+=2;break;case"A":r+=t;break;default:r+=1}}return r}const L=10,DD=(e=0)=>u=>`\x1B[${u+e}m`,uD=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,eD=(e=0)=>(u,t,r)=>`\x1B[${38+e};2;${u};${t};${r}m`,E={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(E.modifier);const RD=Object.keys(E.color),PD=Object.keys(E.bgColor);[...RD,...PD];function ID(){const e=new Map;for(const[u,t]of Object.entries(E)){for(const[r,i]of Object.entries(t))E[r]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},t[r]=E[r],e.set(i[0],i[1]);Object.defineProperty(E,u,{value:t,enumerable:!1})}return Object.defineProperty(E,"codes",{value:e,enumerable:!1}),E.color.close="\x1B[39m",E.bgColor.close="\x1B[49m",E.color.ansi=DD(),E.color.ansi256=uD(),E.color.ansi16m=eD(),E.bgColor.ansi=DD(L),E.bgColor.ansi256=uD(L),E.bgColor.ansi16m=eD(L),Object.defineProperties(E,{rgbToAnsi256:{value:(u,t,r)=>u===t&&t===r?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(t/255*5)+Math.round(r/255*5),enumerable:!1},hexToRgb:{value:u=>{const t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!t)return[0,0,0];let[r]=t;r.length===3&&(r=[...r].map(s=>s+s).join(""));const i=Number.parseInt(r,16);return[i>>16&255,i>>8&255,i&255]},enumerable:!1},hexToAnsi256:{value:u=>E.rgbToAnsi256(...E.hexToRgb(u)),enumerable:!1},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let t,r,i;if(u>=232)t=((u-232)*10+8)/255,r=t,i=t;else{u-=16;const n=u%36;t=Math.floor(u/36)/5,r=Math.floor(n/6)/5,i=n%6/5}const s=Math.max(t,r,i)*2;if(s===0)return 30;let D=30+(Math.round(i)<<2|Math.round(r)<<1|Math.round(t));return s===2&&(D+=60),D},enumerable:!1},rgbToAnsi:{value:(u,t,r)=>E.ansi256ToAnsi(E.rgbToAnsi256(u,t,r)),enumerable:!1},hexToAnsi:{value:u=>E.ansi256ToAnsi(E.hexToAnsi256(u)),enumerable:!1}}),E}const LD=ID(),k=new Set(["\x1B","\x9B"]),ND=39,N="\x07",tD="[",WD="]",rD="m",W=`${WD}8;;`,iD=e=>`${k.values().next().value}${tD}${e}${rD}`,FD=e=>`${k.values().next().value}${W}${e}${N}`,VD=e=>e.split(" ").map(u=>y(u)),V=(e,u,t)=>{const r=[...u];let i=!1,s=!1,D=y(H(e[e.length-1]));for(const[n,F]of r.entries()){const a=y(F);if(D+a<=t?e[e.length-1]+=F:(e.push(F),D=0),k.has(F)&&(i=!0,s=r.slice(n+1).join("").startsWith(W)),i){s?F===N&&(i=!1,s=!1):F===rD&&(i=!1);continue}D+=a,D===t&&n<r.length-1&&(e.push(""),D=0)}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop())},zD=e=>{const u=e.split(" ");let t=u.length;for(;t>0&&!(y(u[t-1])>0);)t--;return t===u.length?e:u.slice(0,t).join(" ")+u.slice(t).join("")},KD=(e,u,t={})=>{if(t.trim!==!1&&e.trim()==="")return"";let r="",i,s;const D=VD(e);let n=[""];for(const[a,o]of e.split(" ").entries()){t.trim!==!1&&(n[n.length-1]=n[n.length-1].trimStart());let l=y(n[n.length-1]);if(a!==0&&(l>=u&&(t.wordWrap===!1||t.trim===!1)&&(n.push(""),l=0),(l>0||t.trim===!1)&&(n[n.length-1]+=" ",l++)),t.hard&&D[a]>u){const c=u-l,p=1+Math.floor((D[a]-c-1)/u);Math.floor((D[a]-1)/u)<p&&n.push(""),V(n,o,u);continue}if(l+D[a]>u&&l>0&&D[a]>0){if(t.wordWrap===!1&&l<u){V(n,o,u);continue}n.push("")}if(l+D[a]>u&&t.wordWrap===!1){V(n,o,u);continue}n[n.length-1]+=o}t.trim!==!1&&(n=n.map(a=>zD(a)));const F=[...n.join(`
2
- `)];for(const[a,o]of F.entries()){if(r+=o,k.has(o)){const{groups:c}=new RegExp(`(?:\\${tD}(?<code>\\d+)m|\\${W}(?<uri>.*)${N})`).exec(F.slice(a).join(""))||{groups:{}};if(c.code!==void 0){const p=Number.parseFloat(c.code);i=p===ND?void 0:p}else c.uri!==void 0&&(s=c.uri.length===0?void 0:c.uri)}const l=LD.codes.get(Number(i));F[a+1]===`
3
- `?(s&&(r+=FD("")),i&&l&&(r+=iD(l))):o===`
4
- `&&(i&&l&&(r+=iD(i)),s&&(r+=FD(s)))}return r};function sD(e,u,t){return String(e).normalize().replace(/\r\n/g,`
5
- `).split(`
6
- `).map(r=>KD(r,u,t)).join(`
7
- `)}const GD=["up","down","left","right","space","enter","cancel"],M={actions:new Set(GD),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]])};function nD(e,u){if(typeof e=="string")return M.aliases.get(e)===u;for(const t of e)if(t!==void 0&&nD(t,u))return!0;return!1}function JD(e,u){if(e===u)return;const t=e.split(`
8
- `),r=u.split(`
9
- `),i=[];for(let s=0;s<Math.max(t.length,r.length);s++)t[s]!==r[s]&&i.push(s);return i}globalThis.process.platform.startsWith("win");const z=Symbol("clack:cancel");function j(e){return e===z}function O(e,u){const t=e;t.isTTY&&t.setRawMode(u)}var YD=Object.defineProperty,qD=(e,u,t)=>u in e?YD(e,u,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[u]=t,g=(e,u,t)=>(qD(e,typeof u!="symbol"?u+"":u,t),t);class aD{constructor(u,t=!0){g(this,"input"),g(this,"output"),g(this,"_abortSignal"),g(this,"rl"),g(this,"opts"),g(this,"_render"),g(this,"_track",!1),g(this,"_prevFrame",""),g(this,"_subscribers",new Map),g(this,"_cursor",0),g(this,"state","initial"),g(this,"error",""),g(this,"value");const{input:r=pD,output:i=fD,render:s,signal:D,...n}=u;this.opts=n,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=s.bind(this),this._track=t,this._abortSignal=D,this.input=r,this.output=i}unsubscribe(){this._subscribers.clear()}setSubscriber(u,t){const r=this._subscribers.get(u)??[];r.push(t),this._subscribers.set(u,r)}on(u,t){this.setSubscriber(u,{cb:t})}once(u,t){this.setSubscriber(u,{cb:t,once:!0})}emit(u,...t){const r=this._subscribers.get(u)??[],i=[];for(const s of r)s.cb(...t),s.once&&i.push(()=>r.splice(r.indexOf(s),1));for(const s of i)s()}prompt(){return new Promise((u,t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),u(z);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}const r=new bD;r._write=(i,s,D)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),D()},this.input.pipe(r),this.rl=Y.createInterface({input:this.input,output:r,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),Y.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),O(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(A.cursor.show),this.output.off("resize",this.render),O(this.input,!1),u(this.value)}),this.once("cancel",()=>{this.output.write(A.cursor.show),this.output.off("resize",this.render),O(this.input,!1),u(z)})})}onKeypress(u,t){if(this.state==="error"&&(this.state="active"),t?.name&&(!this._track&&M.aliases.has(t.name)&&this.emit("cursor",M.aliases.get(t.name)),M.actions.has(t.name)&&this.emit("cursor",t.name)),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),t?.name==="return"){if(this.opts.validate){const r=this.opts.validate(this.value);r&&(this.error=r instanceof Error?r.message:r,this.state="error",this.rl?.write(this.value))}this.state!=="error"&&(this.state="submit")}nD([u,t?.name,t?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
10
- `),O(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){const u=sD(this._prevFrame,process.stdout.columns,{hard:!0}).split(`
11
- `).length-1;this.output.write(A.cursor.move(-999,u*-1))}render(){const u=sD(this._render(this)??"",process.stdout.columns,{hard:!0});if(u!==this._prevFrame){if(this.state==="initial")this.output.write(A.cursor.hide);else{const t=JD(this._prevFrame,u);if(this.restoreCursor(),t&&t?.length===1){const r=t[0];this.output.write(A.cursor.move(0,r)),this.output.write(A.erase.lines(1));const i=u.split(`
12
- `);this.output.write(i[r]),this._prevFrame=u,this.output.write(A.cursor.move(0,i.length-r-1));return}if(t&&t?.length>1){const r=t[0];this.output.write(A.cursor.move(0,r)),this.output.write(A.erase.down());const i=u.split(`
13
- `).slice(r);this.output.write(i.join(`
14
- `)),this._prevFrame=u;return}this.output.write(A.erase.down())}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u}}}var UD=Object.defineProperty,ZD=(e,u,t)=>u in e?UD(e,u,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[u]=t,CD=(e,u,t)=>(ZD(e,typeof u!="symbol"?u+"":u,t),t);class HD extends aD{constructor(u){super(u,!1),CD(this,"options"),CD(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case"left":case"up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case"down":case"right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue()})}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value}}class QD extends aD{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return`${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...r]=this.value.slice(this.cursor);return`${u}${C.inverse(t)}${r.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue)})}}function XD(){return b.platform!=="win32"?b.env.TERM!=="linux":!!b.env.CI||!!b.env.WT_SESSION||!!b.env.TERMINUS_SUBLIME||b.env.ConEmuTask==="{cmd::Cmder}"||b.env.TERM_PROGRAM==="Terminus-Sublime"||b.env.TERM_PROGRAM==="vscode"||b.env.TERM==="xterm-256color"||b.env.TERM==="alacritty"||b.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const Du=XD(),f=(e,u)=>Du?e:u,uu=f("\u25C6","*"),eu=f("\u25A0","x"),tu=f("\u25B2","x"),oD=f("\u25C7","o"),h=f("\u2502","|"),w=f("\u2514","\u2014"),ru=f("\u25CF",">"),iu=f("\u25CB"," "),Fu=f("\u25CF","\u2022"),su=f("\u25C6","*"),nu=f("\u25B2","!"),au=f("\u25A0","x"),lD=e=>{switch(e){case"initial":case"active":return C.cyan(uu);case"cancel":return C.red(eu);case"error":return C.yellow(tu);case"submit":return C.green(oD)}},Cu=e=>{const{cursor:u,options:t,style:r}=e,i=e.maxItems??Number.POSITIVE_INFINITY,s=Math.max(process.stdout.rows-4,0),D=Math.min(s,Math.max(i,5));let n=0;u>=n+D-3?n=Math.max(Math.min(u-D+3,t.length-D),0):u<n+2&&(n=Math.max(u-2,0));const F=D<t.length&&n>0,a=D<t.length&&n+D<t.length;return t.slice(n,n+D).map((o,l,c)=>{const p=l===0&&F,v=l===c.length-1&&a;return p||v?C.dim("..."):r(o,l+n===u)})},ED=e=>new QD({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,render(){const u=`${C.gray(h)}
15
- ${lD(this.state)} ${e.message}
16
- `,t=e.placeholder?C.inverse(e.placeholder[0])+C.dim(e.placeholder.slice(1)):C.inverse(C.hidden("_")),r=this.value?this.valueWithCursor:t;switch(this.state){case"error":return`${u.trim()}
17
- ${C.yellow(h)} ${r}
18
- ${C.yellow(w)} ${C.yellow(this.error)}
19
- `;case"submit":return`${u}${C.gray(h)} ${C.dim(this.value||e.placeholder)}`;case"cancel":return`${u}${C.gray(h)} ${C.strikethrough(C.dim(this.value??""))}${this.value?.trim()?`
20
- ${C.gray(h)}`:""}`;default:return`${u}${C.cyan(h)} ${r}
21
- ${C.cyan(w)}
22
- `}}}).prompt(),K=e=>{const u=(t,r)=>{const i=t.label??String(t.value);switch(r){case"selected":return`${C.dim(i)}`;case"active":return`${C.green(ru)} ${i} ${t.hint?C.dim(`(${t.hint})`):""}`;case"cancelled":return`${C.strikethrough(C.dim(i))}`;default:return`${C.dim(iu)} ${C.dim(i)}`}};return new HD({options:e.options,initialValue:e.initialValue,render(){const t=`${C.gray(h)}
23
- ${lD(this.state)} ${e.message}
24
- `;switch(this.state){case"submit":return`${t}${C.gray(h)} ${u(this.options[this.cursor],"selected")}`;case"cancel":return`${t}${C.gray(h)} ${u(this.options[this.cursor],"cancelled")}
25
- ${C.gray(h)}`;default:return`${t}${C.cyan(h)} ${Cu({cursor:this.cursor,options:this.options,maxItems:e.maxItems,style:(r,i)=>u(r,i?"active":"inactive")}).join(`
26
- ${C.cyan(h)} `)}
27
- ${C.cyan(w)}
28
- `}}}).prompt()},ou=(e="")=>{process.stdout.write(`${C.gray(w)} ${C.red(e)}
1
+ #!/usr/bin/env node
2
+ import{styleText as c}from"node:util";import C,{stdin as Tt,stdout as rt}from"node:process";import Ct from"node:readline";import"node:tty";import R from"node:fs";import F from"node:path";import{fileURLToPath as Rt}from"node:url";const At=(()=>{const t=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return e=>{let r=0;for(t.lastIndex=0;t.test(e);)r+=1;return e.length-r}})(),Lt=t=>t===12288||t>=65281&&t<=65376||t>=65504&&t<=65510,kt=t=>t===8987||t===9001||t>=12272&&t<=12287||t>=12289&&t<=12350||t>=12441&&t<=12543||t>=12549&&t<=12591||t>=12593&&t<=12686||t>=12688&&t<=12771||t>=12783&&t<=12830||t>=12832&&t<=12871||t>=12880&&t<=19903||t>=65040&&t<=65049||t>=65072&&t<=65106||t>=65108&&t<=65126||t>=65128&&t<=65131||t>=127488&&t<=127490||t>=127504&&t<=127547||t>=127552&&t<=127560||t>=131072&&t<=196605||t>=196608&&t<=262141,Ot=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Bt=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,it=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,Mt=/\t{1,1000}/y,st=new RegExp("[\\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?))*","yu"),Nt=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Pt=new RegExp("\\p{M}+","gu"),Dt={limit:1/0,ellipsis:""},nt=(t,e={},r={})=>{const i=e.limit??1/0,o=e.ellipsis??"",l=e?.ellipsisWidth??(o?nt(o,Dt,r).width:0),n=0,a=r.controlWidth??0,s=r.tabWidth??8,u=r.emojiWidth??2,m=2,h=r.regularWidth??1,d=r.wideWidth??m,p=[[Nt,h],[Ot,n],[Bt,a],[Mt,s],[st,u],[it,d]];let f=0,g=0,b=t.length,_=0,I=!1,O=b,L=Math.max(0,i-l),w=0,v=0,x=0,y=0;t:for(;;){if(v>w||g>=b&&g>f){const E=t.slice(w,v)||t.slice(f,g);_=0;for(const B of E.replaceAll(Pt,"")){const S=B.codePointAt(0)||0;if(Lt(S)?y=m:kt(S)?y=d:y=h,x+y>L&&(O=Math.min(O,Math.max(w,f)+_)),x+y>i){I=!0;break t}_+=B.length,x+=y}w=v=0}if(g>=b)break t;for(let E=0,B=p.length;E<B;E++){const[S,et]=p[E];if(S.lastIndex=g,S.test(t)){if(_=S===it?At(t.slice(g,S.lastIndex)):S===st?1:S.lastIndex-g,y=_*et,x+y>L&&(O=Math.min(O,g+Math.floor((L-x)/et))),x+y>i){I=!0;break t}x+=y,w=f,v=g,g=f=S.lastIndex;continue t}}g+=1}return{width:I?L:x,index:I?O:b,truncated:I,ellipsed:I&&i>=l}},jt={limit:1/0,ellipsis:"",ellipsisWidth:0},k=(t,e={})=>nt(t,jt,e).width,j="\x1B",at="\x9B",Wt=39,z="\x07",ot="[",Vt="]",lt="m",J=`${Vt}8;;`,ct=new RegExp(`(?:\\${ot}(?<code>\\d+)m|\\${J}(?<uri>.*)${z})`,"y"),ut=t=>{if(t>=30&&t<=37||t>=90&&t<=97)return 39;if(t>=40&&t<=47||t>=100&&t<=107)return 49;if(t===1||t===2)return 22;if(t===3)return 23;if(t===4)return 24;if(t===7)return 27;if(t===8)return 28;if(t===9)return 29;if(t===0)return 0},ht=t=>`${j}${ot}${t}${lt}`,mt=t=>`${j}${J}${t}${z}`,q=(t,e,r)=>{const i=e[Symbol.iterator]();let o=!1,l=!1,n=t.at(-1),a=n===void 0?0:k(n),s=i.next(),u=i.next(),m=0;for(;!s.done;){const h=s.value,d=k(h);a+d<=r?t[t.length-1]+=h:(t.push(h),a=0),(h===j||h===at)&&(o=!0,l=e.startsWith(J,m+1)),o?l?h===z&&(o=!1,l=!1):h===lt&&(o=!1):(a+=d,a===r&&!u.done&&(t.push(""),a=0)),s=u,u=i.next(),m+=h.length}n=t.at(-1),!a&&n!==void 0&&n.length&&t.length>1&&(t[t.length-2]+=t.pop())},Ut=t=>{const e=t.split(" ");let r=e.length;for(;r&&!k(e[r-1]);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},Gt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let i="",o,l;const n=t.split(" ");let a=[""],s=0;for(let h=0;h<n.length;h++){const d=n[h];if(r.trim!==!1){const f=a.at(-1)??"",g=f.trimStart();f.length!==g.length&&(a[a.length-1]=g,s=k(g))}h!==0&&(s>=e&&(r.wordWrap===!1||r.trim===!1)&&(a.push(""),s=0),(s||r.trim===!1)&&(a[a.length-1]+=" ",s++));const p=k(d);if(r.hard&&p>e){const f=e-s,g=1+Math.floor((p-f-1)/e);Math.floor((p-1)/e)<g&&a.push(""),q(a,d,e),s=k(a.at(-1)??"");continue}if(s+p>e&&s&&p){if(r.wordWrap===!1&&s<e){q(a,d,e),s=k(a.at(-1)??"");continue}a.push(""),s=0}if(s+p>e&&r.wordWrap===!1){q(a,d,e),s=k(a.at(-1)??"");continue}a[a.length-1]+=d,s+=p}r.trim!==!1&&(a=a.map(h=>Ut(h)));const u=a.join(`
3
+ `);let m=!1;for(let h=0;h<u.length;h++){const d=u[h];if(i+=d,m)m=!1;else if(m=d>="\uD800"&&d<="\uDBFF",m)continue;if(d===j||d===at){ct.lastIndex=h+1;const f=ct.exec(u)?.groups;if(f?.code!==void 0){const g=Number.parseFloat(f.code);o=g===Wt?void 0:g}else f?.uri!==void 0&&(l=f.uri.length===0?void 0:f.uri)}if(u[h+1]===`
4
+ `){l&&(i+=mt(""));const p=o?ut(o):void 0;o&&p&&(i+=ht(p))}else d===`
5
+ `&&(o&&ut(o)&&(i+=ht(o)),l&&(i+=mt(l)))}return i},Kt=/\r?\n/;function W(t,e,r){return String(t).normalize().split(Kt).map(i=>Gt(i,e,r)).join(`
6
+ `)}function Ht(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Y,dt;function zt(){if(dt)return Y;dt=1;const t="\x1B",e=`${t}[`,r="\x07",i={to(n,a){return a?`${e}${a+1};${n+1}H`:`${e}${n+1}G`},move(n,a){let s="";return n<0?s+=`${e}${-n}D`:n>0&&(s+=`${e}${n}C`),a<0?s+=`${e}${-a}A`:a>0&&(s+=`${e}${a}B`),s},up:(n=1)=>`${e}${n}A`,down:(n=1)=>`${e}${n}B`,forward:(n=1)=>`${e}${n}C`,backward:(n=1)=>`${e}${n}D`,nextLine:(n=1)=>`${e}E`.repeat(n),prevLine:(n=1)=>`${e}F`.repeat(n),left:`${e}G`,hide:`${e}?25l`,show:`${e}?25h`,save:`${t}7`,restore:`${t}8`},o={up:(n=1)=>`${e}S`.repeat(n),down:(n=1)=>`${e}T`.repeat(n)},l={screen:`${e}2J`,up:(n=1)=>`${e}1J`.repeat(n),down:(n=1)=>`${e}J`.repeat(n),line:`${e}2K`,lineEnd:`${e}K`,lineStart:`${e}1K`,lines(n){let a="";for(let s=0;s<n;s++)a+=this.line+(s<n-1?i.up():"");return n&&(a+=i.left),a}};return Y={cursor:i,scroll:o,erase:l,beep:r},Y}var A=zt();function V(t,e,r){if(!r.some(n=>!n.disabled))return t;const i=t+e,o=Math.max(r.length-1,0),l=i<0?o:i>o?0:i;return r[l]?.disabled?V(l,e<0?-1:1,r):l}const Jt=["up","down","left","right","space","enter","cancel"],M={actions:new Set(Jt),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]]),withGuide:!0};function ft(t,e){if(typeof t=="string")return M.aliases.get(t)===e;for(const r of t)if(r!==void 0&&ft(r,e))return!0;return!1}function qt(t,e){if(t===e)return;const r=t.split(`
7
+ `),i=e.split(`
8
+ `),o=Math.max(r.length,i.length),l=[];for(let n=0;n<o;n++)r[n]!==i[n]&&l.push(n);return{lines:l,numLinesBefore:r.length,numLinesAfter:i.length,numLines:o}}globalThis.process.platform.startsWith("win");const X=Symbol("clack:cancel");function U(t){return t===X}function G(t,e){const r=t;r.isTTY&&r.setRawMode(e)}const pt=t=>"columns"in t&&typeof t.columns=="number"?t.columns:80,gt=t=>"rows"in t&&typeof t.rows=="number"?t.rows:20;function Z(t,e,r,i=r,o=r,l){const n=pt(t??rt);return W(e,n-r.length,{hard:!0,trim:!1}).split(`
9
+ `).map((a,s,u)=>{const m=a;return s===0?`${i}${m}`:s===u.length-1?`${o}${m}`:`${r}${m}`}).join(`
10
+ `)}function Yt(t,e){if("~standard"in t){const r=t["~standard"].validate(e);if(r instanceof Promise)throw new TypeError("Schema validation must be synchronous. Update `validate()` and remove any asynchronous logic.");return r.issues?.at(0)?.message}return t(e)}class bt{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(e,r=!0){const{input:i=Tt,output:o=rt,render:l,signal:n,...a}=e;this.opts=a,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=l.bind(this),this._track=r,this._abortSignal=n,this.input=i,this.output=o}unsubscribe(){this._subscribers.clear()}setSubscriber(e,r){const i=this._subscribers.get(e)??[];i.push(r),this._subscribers.set(e,i)}on(e,r){this.setSubscriber(e,{cb:r})}once(e,r){this.setSubscriber(e,{cb:r,once:!0})}emit(e,...r){const i=this._subscribers.get(e)??[],o=[];for(const l of i)l.cb(...r),l.once&&o.push(()=>i.splice(i.indexOf(l),1));for(const l of o)l()}prompt(){return new Promise(e=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),e(X);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=Ct.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),G(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(A.cursor.show),this.output.off("resize",this.render),G(this.input,!1),e(this.value)}),this.once("cancel",()=>{this.output.write(A.cursor.show),this.output.off("resize",this.render),G(this.input,!1),e(X)})})}_isActionKey(e,r){return e===" "}_shouldSubmit(e,r){return!0}_setValue(e){this.value=e,this.emit("value",this.value)}_setUserInput(e,r){this.userInput=e??"",this.emit("userInput",this.userInput),r&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(e,r){if(this._track&&r.name!=="return"&&(r.name&&this._isActionKey(e,r)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),r?.name&&(!this._track&&M.aliases.has(r.name)&&this.emit("cursor",M.aliases.get(r.name)),M.actions.has(r.name)&&this.emit("cursor",r.name)),e&&(e.toLowerCase()==="y"||e.toLowerCase()==="n")&&this.emit("confirm",e.toLowerCase()==="y"),this.emit("key",e,r),r?.name==="return"&&this._shouldSubmit(e,r)){if(this.opts.validate){const i=Yt(this.opts.validate,this.value);i&&(this.error=i instanceof Error?i.message:i,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}ft([e,r?.name,r?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
11
+ `),G(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){const e=W(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
12
+ `).length-1;this.output.write(A.cursor.move(-999,e*-1))}render(){const e=W(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state==="initial")this.output.write(A.cursor.hide);else{const r=qt(this._prevFrame,e),i=gt(this.output);if(this.restoreCursor(),r){const o=Math.max(0,r.numLinesAfter-i),l=Math.max(0,r.numLinesBefore-i);let n=r.lines.find(a=>a>=o);if(n===void 0){this._prevFrame=e;return}if(r.lines.length===1){this.output.write(A.cursor.move(0,n-l)),this.output.write(A.erase.lines(1));const a=e.split(`
13
+ `);this.output.write(a[n]),this._prevFrame=e,this.output.write(A.cursor.move(0,a.length-n-1));return}else if(r.lines.length>1){if(o<l)n=o;else{const s=n-l;s>0&&this.output.write(A.cursor.move(0,s))}this.output.write(A.erase.down());const a=e.split(`
14
+ `).slice(n);this.output.write(a.join(`
15
+ `)),this._prevFrame=e;return}}this.output.write(A.erase.down())}this.output.write(e),this.state==="initial"&&(this.state="active"),this._prevFrame=e}}}let Xt=class extends bt{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){const e=this._selectedValue;this.value=e===void 0?void 0:e.value}constructor(e){super(e,!1),this.options=e.options;const r=this.options.findIndex(({value:o})=>o===e.initialValue),i=r===-1?0:r;this.cursor=this.options[i]?.disabled?V(i,1,this.options):i,this.changeValue(),this.on("cursor",o=>{switch(o){case"left":case"up":this.cursor=V(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=V(this.cursor,1,this.options);break}this.changeValue()})}};class Zt extends bt{get userInputWithCursor(){if(this.state==="submit")return this.userInput;const e=this.userInput;if(this.cursor>=e.length)return`${this.userInput}\u2588`;const r=e.slice(0,this.cursor),i=e.slice(this.cursor,this.cursor+1),o=e.slice(this.cursor+1);return`${r}${c("inverse",i)}${o}`}get cursor(){return this._cursor}constructor(e){super({...e,initialUserInput:e.initialUserInput??e.initialValue}),this.on("userInput",r=>{this._setValue(r)}),this.on("finalize",()=>{this.value||(this.value=e.defaultValue),this.value===void 0&&(this.value="")})}}function Qt(){return C.platform!=="win32"?C.env.TERM!=="linux":!!C.env.CI||!!C.env.WT_SESSION||!!C.env.TERMINUS_SUBLIME||C.env.ConEmuTask==="{cmd::Cmder}"||C.env.TERM_PROGRAM==="Terminus-Sublime"||C.env.TERM_PROGRAM==="vscode"||C.env.TERM==="xterm-256color"||C.env.TERM==="alacritty"||C.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const te=Qt(),T=(t,e)=>te?t:e,ee=T("\u25C6","*"),re=T("\u25A0","x"),ie=T("\u25B2","x"),xt=T("\u25C7","o"),$=T("\u2502","|"),P=T("\u2514","\u2014"),se=T("\u25CF",">"),$t=T("\u25CB"," "),ne=T("\u25CF","\u2022"),ae=T("\u25C6","*"),oe=T("\u25B2","!"),le=T("\u25A0","x"),wt=t=>{switch(t){case"initial":case"active":return c("cyan",ee);case"cancel":return c("red",re);case"error":return c("yellow",ie);case"submit":return c("green",xt)}},ce=t=>{switch(t){case"initial":case"active":return c("cyan",$);case"cancel":return c("red",$);case"error":return c("yellow",$);case"submit":return c("green",$)}};function ue(t,e){const r=[`${e?`${c("cyan",$)} `:""}${t.join(" \u2022 ")}`];return e&&r.push(c("cyan",P)),r}const _t=(t,e,r,i,o,l=!1)=>{let n=e,a=0;if(l)for(let s=i-1;s>=r;s--){const u=t[s];if(u&&(n-=u.length),a++,n<=o)break}else for(let s=r;s<i;s++){const u=t[s];if(u&&(n-=u.length),a++,n<=o)break}return{lineCount:n,removals:a}},he=({cursor:t,options:e,style:r,output:i=process.stdout,maxItems:o=Number.POSITIVE_INFINITY,columnPadding:l=0,rowPadding:n=4})=>{const a=pt(i)-l,s=gt(i),u=c("dim","..."),m=Math.max(s-n,0),h=Math.max(Math.min(o,m),5);let d=0;t>=h-3&&(d=Math.max(Math.min(t-h+3,e.length-h),0));let p=h<e.length&&d>0,f=h<e.length&&d+h<e.length;const g=Math.min(d+h,e.length),b=[];let _=0;p&&_++,f&&_++;const I=d+(p?1:0),O=g-(f?1:0);for(let w=I;w<O;w++){const v=e[w],x=v?r(v,w===t):"",y=W(x,a,{hard:!0,trim:!1}).split(`
16
+ `);b.push(y),_+=y.length}if(_>m){let w=0,v=0,x=_;const y=t-I;let E=m;const B=()=>_t(b,x,0,y,E),S=()=>_t(b,x,y+1,b.length,E,!0);p?({lineCount:x,removals:w}=B(),x>E&&(f||(E-=1),{lineCount:x,removals:v}=S())):(f||(E-=1),{lineCount:x,removals:v}=S(),x>E&&(E-=1,{lineCount:x,removals:w}=B())),w>0&&(p=!0,b.splice(0,w)),v>0&&(f=!0,b.splice(b.length-v,v))}const L=[];p&&L.push(u);for(const w of b)for(const v of w)L.push(v);return f&&L.push(u),L};`${c("dim","\u2191/\u2193")}`,`${c("dim","Space:")}`,`${c("dim","Enter:")}`;const N={message:(t=[],{symbol:e=c("gray",$),secondarySymbol:r=c("gray",$),output:i=process.stdout,spacing:o=1,withGuide:l}={})=>{const n=[],a=l??M.withGuide,s=a?r:"",u=a?`${e} `:"",m=a?`${r} `:"";for(let d=0;d<o;d++)n.push(s);const h=Array.isArray(t)?t:t.split(`
17
+ `);if(h.length>0){const[d,...p]=h;d.length>0?n.push(`${u}${d}`):n.push(a?e:"");for(const f of p)f.length>0?n.push(`${m}${f}`):n.push(a?r:"")}i.write(`${n.join(`
18
+ `)}
19
+ `)},info:(t,e)=>{N.message(t,{...e,symbol:c("blue",ne)})},success:(t,e)=>{N.message(t,{...e,symbol:c("green",ae)})},step:(t,e)=>{N.message(t,{...e,symbol:c("green",xt)})},warn:(t,e)=>{N.message(t,{...e,symbol:c("yellow",oe)})},warning:(t,e)=>{N.warn(t,e)},error:(t,e)=>{N.message(t,{...e,symbol:c("red",le)})}},me=(t="",e)=>{const r=process.stdout,i=`${c("gray",P)} `;r.write(`${i}${c("red",t)}
29
20
 
30
- `)},lu=(e="")=>{process.stdout.write(`${C.gray(h)}
31
- ${C.gray(w)} ${e}
21
+ `)},de=(t="",e)=>{const r=process.stdout,i=`${c("gray",$)}
22
+ ${c("gray",P)} `;r.write(`${i}${t}
32
23
 
33
- `)},$={message:(e="",{symbol:u=C.gray(h)}={})=>{const t=[`${C.gray(h)}`];if(e){const[r,...i]=e.split(`
34
- `);t.push(`${u} ${r}`,...i.map(s=>`${C.gray(h)} ${s}`))}process.stdout.write(`${t.join(`
35
- `)}
36
- `)},info:e=>{$.message(e,{symbol:C.blue(Fu)})},success:e=>{$.message(e,{symbol:C.green(su)})},step:e=>{$.message(e,{symbol:C.green(oD)})},warn:e=>{$.message(e,{symbol:C.yellow(nu)})},warning:e=>{$.warn(e)},error:e=>{$.message(e,{symbol:C.red(au)})}};`${C.gray(h)}`;function G(e){return e.trim().replace(/\/+$/g,"")}function Eu(e){const u=B.readdirSync(e);return u.length===0||u.length===1&&u[0]===".git"}function cu(e){if(B.existsSync(e))for(const u of B.readdirSync(e))u!==".git"&&B.rmSync(m.resolve(e,u),{recursive:!0,force:!0})}function cD(e,u){B.statSync(e).isDirectory()?hu(e,u):B.copyFileSync(e,u)}function hu(e,u){B.mkdirSync(u,{recursive:!0});for(const t of B.readdirSync(e)){const r=m.resolve(e,t),i=m.resolve(u,t);cD(r,i)}}function Bu(e,u){const t=u?u.name:"npm",r=t==="yarn"&&u?.version.startsWith("1.");return e.replace(/^npm create /,()=>t==="bun"?"bun x create-":`${t} create `).replace("@latest",()=>r?"":"@latest").replace(/^npm exec/,()=>t==="pnpm"?"pnpm dlx":t==="yarn"&&!r?"yarn dlx":t==="bun"?"bun x":"npm exec")}async function mu(e,u,t="VITE_"){const r=Object.entries(e).map(([s,D])=>`${t}${s.toUpperCase()}=${JSON.stringify(D)}`).join(`
37
- `),i=vD.join(u,".env");await AD.writeFile(i,r,"utf8")}async function gu(e){const{cwd:u,targetDir:t,template:r,packageName:i,renameFiles:s,pkgInfo:D}=e,n=m.join(u,t);B.mkdirSync(n,{recursive:!0}),await mu({},n);const F=D?D.name:"npm";$.step(`Creating project in ${n}...`);const a=dD(import.meta.url),o=m.dirname(a),l=[m.resolve(o,"../templates",r),m.resolve(o,"../../templates",r)].find(x=>B.existsSync(x));if(!l)throw new Error(`Template directory not found for: ${r}`);const c=(x,_)=>{const J=m.join(n,s[x]??x);_?B.writeFileSync(J,_):cD(m.join(l,x),J)},p=B.readdirSync(l);for(const x of p.filter(_=>_!=="package.json"))c(x);const v=JSON.parse(B.readFileSync(m.join(l,"package.json"),"utf-8"));v.name=i,c("package.json",JSON.stringify(v,null,2)+`
38
- `);let d="";const R=m.relative(u,n);switch(d+=`Project created. Now run:
39
- `,n!==u&&(d+=`
40
- cd ${R.includes(" ")?`"${R}"`:R}`),F){case"yarn":d+=`
41
- yarn`,d+=`
42
- yarn dev`;break;default:d+=`
43
- ${F} install`,d+=`
44
- ${F} run dev`;break}lu(d)}const{blue:hD,cyan:pu}=C,BD=[{name:"vanilla",display:"Vanilla",description:"with playcanvas engine",color:Z.yellow,variants:[{name:"vanilla-ts",display:"TypeScript",color:hD}]},{name:"react",display:"React",description:"with @playcanvas/react",color:pu,variants:[{name:"react-ts",display:"TypeScript",color:hD}]}],fu=BD.flatMap(e=>e.variants.map(u=>u.name));async function bu({argTargetDir:e,defaultTargetDir:u,cancel:t}){let r=e?G(String(e)):void 0;if(!r){const i=await ED({message:"Project name:",defaultValue:u,placeholder:u});j(i)&&t(),r=G(i)}return r}async function du({targetDir:e,argOverwrite:u,cancel:t}){if(B.existsSync(e)&&!Eu(e)){const r=u?"yes":await K({message:(e==="."?"Current directory":`Target directory "${e}"`)+" is not empty. Please choose how to proceed:",options:[{label:"Cancel operation",value:"no"},{label:"Remove existing files and continue",value:"yes"},{label:"Ignore files and continue",value:"ignore"}]});if(j(r))return t();switch(r){case"yes":cu(e);break;case"no":t();return}}}function mD(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function gD(e){return e.trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z\d\-~]+/g,"-")}async function Au({targetDir:e,cancel:u}){let t=m.basename(m.resolve(e));if(!mD(t)){const r=await ED({message:"Package name:",defaultValue:gD(t),placeholder:gD(t),validate(i){if(!mD(i))return"Invalid package.json name"}});if(j(r))return u();t=r}return t}async function vu({argTemplate:e,FRAMEWORKS:u,TEMPLATES:t,pkgInfo:r,getFullCustomCommand:i,cancel:s}){let D=e,n=!1;if(e&&!t.includes(e)&&(D=void 0,n=!0),!D){const F=await K({message:n?`"${e}" isn't a valid template. Please choose from below: `:"Select a framework:",options:u.map(a=>{const o=a.color;return{label:o(a.display||a.name),value:a,hint:a.description}})});if(j(F))return s();await K({message:"Select a variant:",options:F.variants.map(a=>{const o=a.color,l=a.customCommand?i(a.customCommand,r).replace(/ TARGET_DIR$/,""):void 0;return{label:o(a.display||a.name),value:a.name,hint:l}})}),D=F.variants[0].name}return D}const S=$D(process.argv.slice(2),{alias:{h:"help",t:"template",d:"delete"},boolean:["help","overwrite"],string:["template"]}),xu=process.cwd(),$u=`Usage: npm create playcanvas@latest [OPTION]...
24
+ `)},fe=[`${c("dim","\u2191/\u2193")} to navigate`,`${c("dim","Enter:")} confirm`],K=(t,e)=>t.includes(`
25
+ `)?t.split(`
26
+ `).map(r=>e(r)).join(`
27
+ `):e(t),yt=t=>{const e=(i,o)=>{if(i===void 0)return"";const l=i.label??String(i.value);switch(o){case"disabled":return`${c("gray",$t)} ${K(l,n=>c("gray",n))}${i.hint?` ${c("dim",`(${i.hint??"disabled"})`)}`:""}`;case"selected":return`${K(l,n=>c("dim",n))}`;case"active":return`${c("green",se)} ${l}${i.hint?` ${c("dim",`(${i.hint})`)}`:""}`;case"cancelled":return`${K(l,n=>c(["strikethrough","dim"],n))}`;default:return`${c("dim",$t)} ${K(l,n=>c("dim",n))}`}},r=t.showInstructions??!0;return new Xt({options:t.options,signal:t.signal,input:t.input,output:t.output,initialValue:t.initialValue,render(){const i=t.withGuide??M.withGuide,o=`${wt(this.state)} `,l=`${ce(this.state)} `,n=Z(t.output,t.message,l,o),a=`${i?`${c("gray",$)}
28
+ `:""}${n}
29
+ `;switch(this.state){case"submit":{const s=i?`${c("gray",$)} `:"",u=Z(t.output,e(this.options[this.cursor],"selected"),s);return`${a}${u}`}case"cancel":{const s=i?`${c("gray",$)} `:"",u=Z(t.output,e(this.options[this.cursor],"cancelled"),s);return`${a}${u}${i?`
30
+ ${c("gray",$)}`:""}`}default:{const s=i?`${c("cyan",$)} `:"",u=a.split(`
31
+ `).length,m=r?ue(fe,i):i?[c("cyan",P)]:[],h=m.join(`
32
+ `),d=m.length+1;return`${a}${s}${he({output:t.output,cursor:this.cursor,options:this.options,maxItems:t.maxItems,columnPadding:s.length,rowPadding:u+d,style:(p,f)=>e(p,p.disabled?"disabled":f?"active":"inactive")}).join(`
33
+ ${s}`)}
34
+ ${h}
35
+ `}}}}).prompt()};`${c("gray",$)}`;const vt=t=>new Zt({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,output:t.output,signal:t.signal,input:t.input,render(){const e=t?.withGuide??M.withGuide,r=`${`${e?`${c("gray",$)}
36
+ `:""}${wt(this.state)} `}${t.message}
37
+ `,i=t.placeholder&&t.placeholder.length>0?c("inverse",t.placeholder[0])+c("dim",t.placeholder.slice(1)):c(["inverse","hidden"],"_"),o=this.userInput?this.userInputWithCursor:i,l=this.value??"";switch(this.state){case"error":{const n=this.error?` ${c("yellow",this.error)}`:"",a=e?`${c("yellow",$)} `:"",s=e?c("yellow",P):"";return`${r.trim()}
38
+ ${a}${o}
39
+ ${s}${n}
40
+ `}case"submit":{const n=l?` ${c("dim",l)}`:"",a=e?c("gray",$):"";return`${r}${a}${n}`}case"cancel":{const n=l?` ${c(["strikethrough","dim"],l)}`:"",a=e?c("gray",$):"";return`${r}${a}${n}${l.trim()?`
41
+ ${a}`:""}`}default:{const n=e?`${c("cyan",$)} `:"",a=e?c("cyan",P):"";return`${r}${n}${o}
42
+ ${a}
43
+ `}}}}).prompt();function Q(t){return t==null?[]:Array.isArray(t)?t:[t]}function pe(t,e,r,i){var o,l=t[e],n=~i.string.indexOf(e)?r==null||r===!0?"":String(r):typeof r=="boolean"?r:~i.boolean.indexOf(e)?r==="false"?!1:r==="true"||(t._.push((o=+r,o*0===0?o:r)),!!r):(o=+r,o*0===0?o:r);t[e]=l==null?n:Array.isArray(l)?l.concat(n):[l,n]}function ge(t,e){t=t||[],e=e||{};var r,i,o,l,n,a={_:[]},s=0,u=0,m=0,h=t.length;const d=e.alias!==void 0,p=e.unknown!==void 0,f=e.default!==void 0;if(e.alias=e.alias||{},e.string=Q(e.string),e.boolean=Q(e.boolean),d)for(r in e.alias)for(i=e.alias[r]=Q(e.alias[r]),s=0;s<i.length;s++)(e.alias[i[s]]=i.concat(r)).splice(s,1);for(s=e.boolean.length;s-- >0;)for(i=e.alias[e.boolean[s]]||[],u=i.length;u-- >0;)e.boolean.push(i[u]);for(s=e.string.length;s-- >0;)for(i=e.alias[e.string[s]]||[],u=i.length;u-- >0;)e.string.push(i[u]);if(f){for(r in e.default)if(l=typeof e.default[r],i=e.alias[r]=e.alias[r]||[],e[l]!==void 0)for(e[l].push(r),s=0;s<i.length;s++)e[l].push(i[s])}const g=p?Object.keys(e.alias):[];for(s=0;s<h;s++){if(o=t[s],o==="--"){a._=a._.concat(t.slice(++s));break}for(u=0;u<o.length&&o.charCodeAt(u)===45;u++);if(u===0)a._.push(o);else if(o.substring(u,u+3)==="no-"){if(l=o.substring(u+3),p&&!~g.indexOf(l))return e.unknown(o);a[l]=!1}else{for(m=u+1;m<o.length&&o.charCodeAt(m)!==61;m++);for(l=o.substring(u,m),n=o.substring(++m)||s+1===h||(""+t[s+1]).charCodeAt(0)===45||t[++s],i=u===2?[l]:l,m=0;m<i.length;m++){if(l=i[m],p&&!~g.indexOf(l))return e.unknown("-".repeat(u)+l);pe(a,l,m+1<i.length||n,e)}}}if(f)for(r in e.default)a[r]===void 0&&(a[r]=e.default[r]);if(d)for(r in a)for(i=e.alias[r]||[];i.length>0;)a[i.shift()]=a[r];return a}var H={exports:{}},Et;function be(){if(Et)return H.exports;Et=1;let t=process||{},e=t.argv||[],r=t.env||{},i=!(r.NO_COLOR||e.includes("--no-color"))&&(!!r.FORCE_COLOR||e.includes("--color")||t.platform==="win32"||(t.stdout||{}).isTTY&&r.TERM!=="dumb"||!!r.CI),o=(a,s,u=a)=>m=>{let h=""+m,d=h.indexOf(s,a.length);return~d?a+l(h,s,u,d)+s:a+h+s},l=(a,s,u,m)=>{let h="",d=0;do h+=a.substring(d,m)+u,d=m+s.length,m=a.indexOf(s,d);while(~m);return h+a.substring(d)},n=(a=i)=>{let s=a?o:()=>String;return{isColorSupported:a,reset:s("\x1B[0m","\x1B[0m"),bold:s("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:s("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:s("\x1B[3m","\x1B[23m"),underline:s("\x1B[4m","\x1B[24m"),inverse:s("\x1B[7m","\x1B[27m"),hidden:s("\x1B[8m","\x1B[28m"),strikethrough:s("\x1B[9m","\x1B[29m"),black:s("\x1B[30m","\x1B[39m"),red:s("\x1B[31m","\x1B[39m"),green:s("\x1B[32m","\x1B[39m"),yellow:s("\x1B[33m","\x1B[39m"),blue:s("\x1B[34m","\x1B[39m"),magenta:s("\x1B[35m","\x1B[39m"),cyan:s("\x1B[36m","\x1B[39m"),white:s("\x1B[37m","\x1B[39m"),gray:s("\x1B[90m","\x1B[39m"),bgBlack:s("\x1B[40m","\x1B[49m"),bgRed:s("\x1B[41m","\x1B[49m"),bgGreen:s("\x1B[42m","\x1B[49m"),bgYellow:s("\x1B[43m","\x1B[49m"),bgBlue:s("\x1B[44m","\x1B[49m"),bgMagenta:s("\x1B[45m","\x1B[49m"),bgCyan:s("\x1B[46m","\x1B[49m"),bgWhite:s("\x1B[47m","\x1B[49m"),blackBright:s("\x1B[90m","\x1B[39m"),redBright:s("\x1B[91m","\x1B[39m"),greenBright:s("\x1B[92m","\x1B[39m"),yellowBright:s("\x1B[93m","\x1B[39m"),blueBright:s("\x1B[94m","\x1B[39m"),magentaBright:s("\x1B[95m","\x1B[39m"),cyanBright:s("\x1B[96m","\x1B[39m"),whiteBright:s("\x1B[97m","\x1B[39m"),bgBlackBright:s("\x1B[100m","\x1B[49m"),bgRedBright:s("\x1B[101m","\x1B[49m"),bgGreenBright:s("\x1B[102m","\x1B[49m"),bgYellowBright:s("\x1B[103m","\x1B[49m"),bgBlueBright:s("\x1B[104m","\x1B[49m"),bgMagentaBright:s("\x1B[105m","\x1B[49m"),bgCyanBright:s("\x1B[106m","\x1B[49m"),bgWhiteBright:s("\x1B[107m","\x1B[49m")}};return H.exports=n(),H.exports.createColors=n,H.exports}var xe=be();const $e=Ht(xe),{cyan:we,yellow:_e}=$e,St=[{name:"vanilla-ts",display:"Vanilla",description:"with PlayCanvas Engine",color:_e},{name:"react-ts",display:"React",description:"with @playcanvas/react",color:we}],ye=async({argTemplate:t,cancel:e})=>{if(t&&St.some(i=>i.name===t))return t;const r=await yt({message:t?`"${t}" isn't a valid template. Please choose from below: `:"Select a template:",options:St.map(i=>({label:i.color(i.display),value:i.name,hint:i.description}))});return U(r)&&e(),r},It=t=>/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(t),Ft=t=>t.trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z\d\-~]+/g,"-"),ve=async({targetDir:t,cancel:e})=>{let r=F.basename(F.resolve(t));if(!It(r)){const i=await vt({message:"Package name:",defaultValue:Ft(r),placeholder:Ft(r),validate:o=>{if(!o||!It(o))return"Invalid package.json name"}});if(U(i))return e();r=i}return r},tt=t=>t.trim().replace(/\/+$/g,""),Ee=t=>{const e=R.readdirSync(t);return e.length===0||e.length===1&&e[0]===".git"},Se=t=>{if(R.existsSync(t))for(const e of R.readdirSync(t))e!==".git"&&R.rmSync(F.resolve(t,e),{recursive:!0,force:!0})},Ie=async({argTargetDir:t,defaultTargetDir:e,cancel:r})=>{let i=t?tt(String(t)):void 0;if(!i){const o=await vt({message:"Project name:",defaultValue:e,placeholder:e});U(o)&&r(),i=tt(o)}return i},Fe=async({targetDir:t,argOverwrite:e,cancel:r})=>{if(R.existsSync(t)&&!Ee(t)){const i=e?"yes":await yt({message:(t==="."?"Current directory":`Target directory "${t}"`)+" is not empty. Please choose how to proceed:",options:[{label:"Cancel operation",value:"no"},{label:"Remove existing files and continue",value:"yes"},{label:"Ignore files and continue",value:"ignore"}]});if(U(i))return r();switch(i){case"yes":Se(t);break;case"no":r();return}}},Te=t=>{const{cwd:e,targetDir:r,template:i,packageName:o,renameFiles:l}=t,n=F.resolve(e,r);R.mkdirSync(n,{recursive:!0});const a=process.env.npm_config_user_agent?.split("/")[0]??"npm";N.step(`Creating project in ${n}...`);const s=Rt(import.meta.url),u=F.dirname(s),m=[F.resolve(u,"../templates",i),F.resolve(u,"../../templates",i)].find(b=>R.existsSync(b));if(!m)throw new Error(`Template directory not found for: ${i}`);const h=(b,_)=>{const I=F.join(n,l[b]??b);_!==void 0?R.writeFileSync(I,_):R.cpSync(F.join(m,b),I,{recursive:!0})},d=R.readdirSync(m);for(const b of d.filter(_=>_!=="package.json"))h(b);const p=JSON.parse(R.readFileSync(F.join(m,"package.json"),"utf-8"));p.name=o,h("package.json",JSON.stringify(p,null,4)+`
44
+ `);let f=`Project created. Now run:
45
+ `;const g=F.isAbsolute(r)?n:F.relative(e,n);switch(n!==e&&(f+=`
46
+ cd ${g.includes(" ")?`"${g}"`:g}`),a){case"yarn":f+=`
47
+ yarn`,f+=`
48
+ yarn dev`;break;default:f+=`
49
+ ${a} install`,f+=`
50
+ ${a} run dev`;break}de(f)},D=ge(process.argv.slice(2),{alias:{h:"help",t:"template"},boolean:["help","overwrite"],string:["template"]}),Ce=process.cwd(),Re=`Usage: npm create playcanvas@latest [OPTION]...
45
51
 
46
- Create a new PlayCanvas project in JavaScript or TypeScript.
52
+ Create a new PlayCanvas project with TypeScript.
47
53
  With no arguments, start the CLI in interactive mode.
48
54
 
49
55
  Options:
50
56
  -t, --template NAME use a specific template
57
+ --overwrite remove existing files from a non-empty target directory
51
58
  -h, --help show help
52
- -d, --delete delete the project directory if it exists
53
- `,yu={_gitignore:".gitignore"},wu="playcanvas-project";async function Su(){const e=S._[0]?G(String(S._[0])):void 0,u=S.template,t=S.overwrite;if(S.help){console.log($u);return}const r=_u(process.env.npm_config_user_agent),i=()=>ou("Operation cancelled"),s=await bu({argTargetDir:e,defaultTargetDir:wu,cancel:i});await du({targetDir:s,argOverwrite:t,cancel:i});const D=await Au({targetDir:s,cancel:i}),n=await vu({argTemplate:u,FRAMEWORKS:BD,TEMPLATES:fu,pkgInfo:r,getFullCustomCommand:Bu,cancel:i});await gu({cwd:xu,targetDir:s,template:n,packageName:D,renameFiles:yu,pkgInfo:r})}function _u(e){if(!e)return;const u=e.split(" ")[0].split("/");return{name:u[0],version:u[1]}}Su().catch(e=>{console.error(e)});
59
+ `,Ae={_gitignore:".gitignore"},Le="playcanvas-project",ke=async()=>{const t=D._[0]?tt(String(D._[0])):void 0,e=D.template,r=D.overwrite;if(D.help){console.log(Re);return}const i=()=>{me("Operation cancelled"),process.exit(0)},o=await Ie({argTargetDir:t,defaultTargetDir:Le,cancel:i});await Fe({targetDir:o,argOverwrite:r,cancel:i});const l=await ve({targetDir:o,cancel:i}),n=await ye({argTemplate:e,cancel:i});await Te({cwd:Ce,targetDir:o,template:n,packageName:l,renameFiles:Ae})};ke().catch(t=>{console.error(t),process.exitCode=1});
package/package.json CHANGED
@@ -1,51 +1,55 @@
1
1
  {
2
- "name": "create-playcanvas",
3
- "version": "0.2.5",
4
- "author": "PlayCanvas <support@playcanvas.com>",
5
- "homepage": "https://github.com/playcanvas/create-playcanvas#readme",
6
- "description": "Scaffold a PlayCanvas project",
7
- "repository": {
8
- "type": "git",
9
- "url": "https://github.com/playcanvas/create-playcanvas.git"
10
- },
11
- "keywords": [
12
- "playcanvas",
13
- "create",
14
- "scaffold",
15
- "template",
16
- "vite",
17
- "react",
18
- "typescript",
19
- "webgl",
20
- "webgpu",
21
- "game",
22
- "3d"
23
- ],
24
- "type": "module",
25
- "bin": {
26
- "create-playcanvas": "index.js"
27
- },
28
- "files": [
29
- "index.js",
30
- "templates",
31
- "dist"
32
- ],
33
- "scripts": {
34
- "dev": "unbuild --stub",
35
- "build": "unbuild",
36
- "typecheck": "tsc --noEmit",
37
- "prepublishOnly": "npm run build"
38
- },
39
- "license": "MIT",
40
- "devDependencies": {
41
- "@clack/prompts": "^0.11.0",
42
- "@types/node": "^25.0.10",
43
- "cross-spawn": "^7.0.6",
44
- "mri": "^1.2.0",
45
- "picocolors": "^1.1.1",
46
- "unbuild": "^3.6.1"
47
- },
48
- "engines": {
49
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
50
- }
2
+ "name": "create-playcanvas",
3
+ "version": "0.3.0",
4
+ "description": "Scaffold a PlayCanvas project",
5
+ "keywords": [
6
+ "playcanvas",
7
+ "create",
8
+ "scaffold",
9
+ "template",
10
+ "vite",
11
+ "react",
12
+ "typescript",
13
+ "webgl",
14
+ "webgpu",
15
+ "game",
16
+ "3d"
17
+ ],
18
+ "homepage": "https://github.com/playcanvas/create-playcanvas#readme",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/playcanvas/create-playcanvas.git"
22
+ },
23
+ "license": "MIT",
24
+ "author": "PlayCanvas <support@playcanvas.com>",
25
+ "type": "module",
26
+ "bin": {
27
+ "create-playcanvas": "dist/index.mjs"
28
+ },
29
+ "files": [
30
+ "templates",
31
+ "dist"
32
+ ],
33
+ "scripts": {
34
+ "build": "unbuild",
35
+ "dev": "unbuild --stub",
36
+ "fmt": "prettier --check .",
37
+ "fmt:fix": "prettier --write .",
38
+ "lint": "eslint .",
39
+ "lint:fix": "eslint . --fix",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "devDependencies": {
43
+ "@clack/prompts": "^1.7.0",
44
+ "@playcanvas/eslint-config": "3.0.0-beta.8",
45
+ "@types/node": "22.20.1",
46
+ "eslint": "^9.39.5",
47
+ "mri": "^1.2.0",
48
+ "picocolors": "^1.1.1",
49
+ "prettier": "^3.9.6",
50
+ "unbuild": "^3.6.1"
51
+ },
52
+ "engines": {
53
+ "node": ">=22.23.2"
54
+ }
51
55
  }
@@ -1,60 +1,18 @@
1
- import colors, { yellow } from 'picocolors'
2
- const { blue, cyan } = colors
1
+ import colors from 'picocolors';
3
2
 
4
- /**
5
- * You can add new frameworks here.
6
- *
7
- * The framework name is used to create the directory name.
8
- * The framework display name is used to display the framework name in the CLI.
9
- * The framework description is used to display the framework description in the CLI.
10
- * The framework color is used to display the framework color in the CLI.
11
- * The framework variants are used to display the framework variants in the CLI.
12
- *
13
- */
14
- export const FRAMEWORKS: Framework[] = [
15
- {
16
- name: 'vanilla',
17
- display: 'Vanilla',
18
- description: 'with playcanvas engine',
19
- color: yellow,
20
- variants: [
21
- {
3
+ const { cyan, yellow } = colors;
4
+
5
+ export const TEMPLATES = [
6
+ {
22
7
  name: 'vanilla-ts',
23
- display: 'TypeScript',
24
- color: blue,
25
- },
26
- ],
27
- },
28
- {
29
- name: 'react',
30
- display: 'React',
31
- description: 'with @playcanvas/react',
32
- color: cyan,
33
- variants: [
34
- {
8
+ display: 'Vanilla',
9
+ description: 'with PlayCanvas Engine',
10
+ color: yellow
11
+ },
12
+ {
35
13
  name: 'react-ts',
36
- display: 'TypeScript',
37
- color: blue,
38
- },
39
- ],
40
- }
41
- ]
42
-
43
- export const TEMPLATES = FRAMEWORKS.flatMap((f) => f.variants.map((v) => v.name))
44
-
45
- export type ColorFunc = (str: string | number) => string
46
-
47
- export type FrameworkVariant = {
48
- name: string
49
- display: string
50
- color: ColorFunc
51
- customCommand?: string
52
- }
53
-
54
- export type Framework = {
55
- name: string
56
- display: string
57
- color: ColorFunc
58
- description?: string
59
- variants: FrameworkVariant[]
60
- }
14
+ display: 'React',
15
+ description: 'with @playcanvas/react',
16
+ color: cyan
17
+ }
18
+ ];