@sidgaikwad/orm-setup 1.0.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.
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/bin/cli.js +2 -0
- package/dist/detector.d.ts +12 -0
- package/dist/detector.d.ts.map +1 -0
- package/dist/file-writer.d.ts +6 -0
- package/dist/file-writer.d.ts.map +1 -0
- package/dist/generators/drizzle.d.ts +10 -0
- package/dist/generators/drizzle.d.ts.map +1 -0
- package/dist/generators/kysely.d.ts +10 -0
- package/dist/generators/kysely.d.ts.map +1 -0
- package/dist/generators/prisma.d.ts +9 -0
- package/dist/generators/prisma.d.ts.map +1 -0
- package/dist/generators/table-generators.d.ts +9 -0
- package/dist/generators/table-generators.d.ts.map +1 -0
- package/dist/generators/templates/drizzle-client.d.ts +2 -0
- package/dist/generators/templates/drizzle-client.d.ts.map +1 -0
- package/dist/generators/templates/drizzle-config.d.ts +2 -0
- package/dist/generators/templates/drizzle-config.d.ts.map +1 -0
- package/dist/generators/templates/drizzle-migrate.d.ts +2 -0
- package/dist/generators/templates/drizzle-migrate.d.ts.map +1 -0
- package/dist/generators/templates/drizzle-schema.d.ts +2 -0
- package/dist/generators/templates/drizzle-schema.d.ts.map +1 -0
- package/dist/generators/templates.d.ts +7 -0
- package/dist/generators/templates.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +315 -0
- package/dist/package-manager.d.ts +7 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/paths.d.ts +11 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/prompts.d.ts +13 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/templates/table-definitions.d.ts +46 -0
- package/dist/templates/table-definitions.d.ts.map +1 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Siddharth Gaikwad
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# @sidgaikwad/orm-setup
|
|
2
|
+
|
|
3
|
+
Framework-agnostic CLI for setting up Drizzle, Prisma, or Kysely ORM with best practices.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🎯 **Multi-ORM Support** - Choose between Drizzle, Prisma, or Kysely
|
|
8
|
+
- 🗄️ **Multi-Database** - PostgreSQL, MySQL, or SQLite
|
|
9
|
+
- 🚀 **Zero Config** - Smart defaults, works everywhere
|
|
10
|
+
- 📦 **Batteries Included** - Client, migrations, and scripts
|
|
11
|
+
- ⚡ **Fast** - Built with Bun
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Using bunx (recommended)
|
|
17
|
+
bunx @sidgaikwad/orm-setup
|
|
18
|
+
|
|
19
|
+
# Using npx
|
|
20
|
+
npx @sidgaikwad/orm-setup
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## What It Does
|
|
24
|
+
|
|
25
|
+
1. Detects your project structure (TypeScript, package manager, folders)
|
|
26
|
+
2. Asks what ORM and database you want
|
|
27
|
+
3. Installs dependencies
|
|
28
|
+
4. Generates schema, client, and config files
|
|
29
|
+
5. Adds helpful scripts to package.json
|
|
30
|
+
|
|
31
|
+
## Generated Files
|
|
32
|
+
|
|
33
|
+
**For Drizzle:**
|
|
34
|
+
src/lib/db.ts # Database client
|
|
35
|
+
src/lib/db/schema.ts # Schema definition
|
|
36
|
+
src/lib/db/migrate.ts # Migration runner
|
|
37
|
+
drizzle.config.ts # Drizzle config
|
|
38
|
+
|
|
39
|
+
**For Prisma:**
|
|
40
|
+
prisma/schema.prisma # Schema definition
|
|
41
|
+
src/lib/prisma.ts # Prisma client
|
|
42
|
+
|
|
43
|
+
**For Kysely:**
|
|
44
|
+
src/lib/db.ts # Kysely client
|
|
45
|
+
src/lib/db/schema.ts # TypeScript types
|
|
46
|
+
src/lib/db/migrate.ts # Migration runner
|
|
47
|
+
|
|
48
|
+
## Usage
|
|
49
|
+
|
|
50
|
+
After running the CLI:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Add your database URL
|
|
54
|
+
echo "DATABASE_URL=your-connection-string" > .env
|
|
55
|
+
|
|
56
|
+
# For Drizzle/Kysely
|
|
57
|
+
bun db:generate # Generate migrations
|
|
58
|
+
bun db:migrate # Apply migrations
|
|
59
|
+
bun db:studio # Open DB GUI (Drizzle only)
|
|
60
|
+
|
|
61
|
+
# For Prisma
|
|
62
|
+
bun db:generate # Generate Prisma Client
|
|
63
|
+
bun db:migrate # Create & apply migration
|
|
64
|
+
bun db:studio # Open Prisma Studio
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Requirements
|
|
68
|
+
|
|
69
|
+
- Node.js 18+ or Bun
|
|
70
|
+
- A database (PostgreSQL, MySQL, or SQLite)
|
|
71
|
+
|
|
72
|
+
## License
|
|
73
|
+
|
|
74
|
+
MIT © Siddharth Gaikwad
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ProjectInfo {
|
|
2
|
+
hasTypescript: boolean;
|
|
3
|
+
packageManager: "bun" | "npm" | "pnpm" | "yarn";
|
|
4
|
+
srcDir: string | null;
|
|
5
|
+
hasDrizzle: boolean;
|
|
6
|
+
database: {
|
|
7
|
+
type: "postgresql" | "mysql" | "sqlite" | "unknown";
|
|
8
|
+
url: string | null;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function detectProject(): Promise<ProjectInfo>;
|
|
12
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAChD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE;QACR,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;QACpD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KACpB,CAAC;CACH;AAuED,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,CAiB1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-writer.d.ts","sourceRoot":"","sources":["../src/file-writer.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResolvedPaths } from "../paths";
|
|
2
|
+
interface GenerateOptions {
|
|
3
|
+
paths: ResolvedPaths;
|
|
4
|
+
database: "postgresql" | "mysql" | "sqlite";
|
|
5
|
+
typescript: boolean;
|
|
6
|
+
includeExamples: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateDrizzleSetup(options: GenerateOptions): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=drizzle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/generators/drizzle.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,UAAU,eAAe;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResolvedPaths } from "../paths";
|
|
2
|
+
import type { TableDefinition } from "../templates/table-definitions";
|
|
3
|
+
interface GenerateOptions {
|
|
4
|
+
paths: ResolvedPaths;
|
|
5
|
+
database: "postgresql" | "mysql" | "sqlite";
|
|
6
|
+
selectedTables: TableDefinition[];
|
|
7
|
+
}
|
|
8
|
+
export declare function generateKyselySetup(options: GenerateOptions): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=kysely.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely.d.ts","sourceRoot":"","sources":["../../src/generators/kysely.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,UAAU,eAAe;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,cAAc,EAAE,eAAe,EAAE,CAAC;CACnC;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ResolvedPaths } from "../paths";
|
|
2
|
+
interface GenerateOptions {
|
|
3
|
+
paths: ResolvedPaths;
|
|
4
|
+
database: "postgresql" | "mysql" | "sqlite";
|
|
5
|
+
includeExamples: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function generatePrismaSetup(options: GenerateOptions): Promise<void>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=prisma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/generators/prisma.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,UAAU,eAAe;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TableDefinition } from "../templates/table-definitions";
|
|
2
|
+
type Database = "postgresql" | "mysql" | "sqlite";
|
|
3
|
+
type ORM = "drizzle" | "prisma" | "kysely";
|
|
4
|
+
export declare function generateDrizzleTables(tables: TableDefinition[], database: Database): string;
|
|
5
|
+
export declare function generatePrismaTables(tables: TableDefinition[], database: Database): string;
|
|
6
|
+
export declare function generateKyselyTables(tables: TableDefinition[], database: Database): string;
|
|
7
|
+
export declare function generateSchemaForORM(orm: ORM, tables: TableDefinition[], database: Database): string;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=table-generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-generators.d.ts","sourceRoot":"","sources":["../../src/generators/table-generators.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAS,MAAM,gCAAgC,CAAC;AAE7E,KAAK,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClD,KAAK,GAAG,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAM3C,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,EAAE,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CA2ER;AA0ED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,eAAe,EAAE,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAuCR;AAsFD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,eAAe,EAAE,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAyCR;AAgCD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,eAAe,EAAE,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAWR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-client.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/drizzle-client.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,EAC3C,UAAU,EAAE,MAAM,GACjB,MAAM,CAyCR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-config.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/drizzle-config.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,EAC3C,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,MAAM,CAmBR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-migrate.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/drizzle-migrate.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,GAC1C,MAAM,CAwCR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-schema.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/drizzle-schema.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,EAC3C,eAAe,EAAE,OAAO,GACvB,MAAM,CA6CR"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type Database = "postgresql" | "mysql" | "sqlite";
|
|
2
|
+
export declare function generateSchema(database: Database, includeExamples: boolean): string;
|
|
3
|
+
export declare function generateClient(database: Database): string;
|
|
4
|
+
export declare function generateConfig(database: Database, schemaPath: string, migrationsDir: string): string;
|
|
5
|
+
export declare function generateMigrate(database: Database): string;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/generators/templates.ts"],"names":[],"mappings":"AAGA,KAAK,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAKlD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,OAAO,GACvB,MAAM,CA6CR;AAKD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAyCzD;AAKD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,MAAM,CAwBR;AAKD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA2C1D"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import{createRequire as QI}from"node:module";var JI=Object.create;var{getPrototypeOf:ZI,defineProperty:O1,getOwnPropertyNames:UI}=Object;var XI=Object.prototype.hasOwnProperty;var m=($,I,G)=>{G=$!=null?JI(ZI($)):{};let V=I||!$||!$.__esModule?O1(G,"default",{value:$,enumerable:!0}):G;for(let S of UI($))if(!XI.call(V,S))O1(V,S,{get:()=>$[S],enumerable:!0});return V};var j=($,I)=>()=>(I||$((I={exports:{}}).exports,I),I.exports);var w=QI(import.meta.url);var y$=j((m3,v1)=>{var z$={to($,I){if(!I)return`\x1B[${$+1}G`;return`\x1B[${I+1};${$+1}H`},move($,I){let G="";if($<0)G+=`\x1B[${-$}D`;else if($>0)G+=`\x1B[${$}C`;if(I<0)G+=`\x1B[${-I}A`;else if(I>0)G+=`\x1B[${I}B`;return G},up:($=1)=>`\x1B[${$}A`,down:($=1)=>`\x1B[${$}B`,forward:($=1)=>`\x1B[${$}C`,backward:($=1)=>`\x1B[${$}D`,nextLine:($=1)=>"\x1B[E".repeat($),prevLine:($=1)=>"\x1B[F".repeat($),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},WI={up:($=1)=>"\x1B[S".repeat($),down:($=1)=>"\x1B[T".repeat($)},YI={screen:"\x1B[2J",up:($=1)=>"\x1B[1J".repeat($),down:($=1)=>"\x1B[J".repeat($),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines($){let I="";for(let G=0;G<$;G++)I+=this.line+(G<$-1?z$.up():"");if($)I+=z$.left;return I}};v1.exports={cursor:z$,scroll:WI,erase:YI,beep:"\x07"}});var O$=j((h3,_$)=>{var G$=process||{},x1=G$.argv||[],I$=G$.env||{},LI=!(!!I$.NO_COLOR||x1.includes("--no-color"))&&(!!I$.FORCE_COLOR||x1.includes("--color")||G$.platform==="win32"||(G$.stdout||{}).isTTY&&I$.TERM!=="dumb"||!!I$.CI),RI=($,I,G=$)=>(V)=>{let S=""+V,M=S.indexOf(I,$.length);return~M?$+bI(S,I,G,M)+I:$+S+I},bI=($,I,G,V)=>{let S="",M=0;do S+=$.substring(M,V)+G,M=V+I.length,V=$.indexOf(I,M);while(~V);return S+$.substring(M)},w1=($=LI)=>{let I=$?RI:()=>String;return{isColorSupported:$,reset:I("\x1B[0m","\x1B[0m"),bold:I("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:I("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:I("\x1B[3m","\x1B[23m"),underline:I("\x1B[4m","\x1B[24m"),inverse:I("\x1B[7m","\x1B[27m"),hidden:I("\x1B[8m","\x1B[28m"),strikethrough:I("\x1B[9m","\x1B[29m"),black:I("\x1B[30m","\x1B[39m"),red:I("\x1B[31m","\x1B[39m"),green:I("\x1B[32m","\x1B[39m"),yellow:I("\x1B[33m","\x1B[39m"),blue:I("\x1B[34m","\x1B[39m"),magenta:I("\x1B[35m","\x1B[39m"),cyan:I("\x1B[36m","\x1B[39m"),white:I("\x1B[37m","\x1B[39m"),gray:I("\x1B[90m","\x1B[39m"),bgBlack:I("\x1B[40m","\x1B[49m"),bgRed:I("\x1B[41m","\x1B[49m"),bgGreen:I("\x1B[42m","\x1B[49m"),bgYellow:I("\x1B[43m","\x1B[49m"),bgBlue:I("\x1B[44m","\x1B[49m"),bgMagenta:I("\x1B[45m","\x1B[49m"),bgCyan:I("\x1B[46m","\x1B[49m"),bgWhite:I("\x1B[47m","\x1B[49m"),blackBright:I("\x1B[90m","\x1B[39m"),redBright:I("\x1B[91m","\x1B[39m"),greenBright:I("\x1B[92m","\x1B[39m"),yellowBright:I("\x1B[93m","\x1B[39m"),blueBright:I("\x1B[94m","\x1B[39m"),magentaBright:I("\x1B[95m","\x1B[39m"),cyanBright:I("\x1B[96m","\x1B[39m"),whiteBright:I("\x1B[97m","\x1B[39m"),bgBlackBright:I("\x1B[100m","\x1B[49m"),bgRedBright:I("\x1B[101m","\x1B[49m"),bgGreenBright:I("\x1B[102m","\x1B[49m"),bgYellowBright:I("\x1B[103m","\x1B[49m"),bgBlueBright:I("\x1B[104m","\x1B[49m"),bgMagentaBright:I("\x1B[105m","\x1B[49m"),bgCyanBright:I("\x1B[106m","\x1B[49m"),bgWhiteBright:I("\x1B[107m","\x1B[49m")}};_$.exports=w1();_$.exports.createColors=w1});var w0=j((m4,x0)=>{x0.exports=v0;v0.sync=mG;var _0=w("fs");function CG($,I){var G=I.pathExt!==void 0?I.pathExt:process.env.PATHEXT;if(!G)return!0;if(G=G.split(";"),G.indexOf("")!==-1)return!0;for(var V=0;V<G.length;V++){var S=G[V].toLowerCase();if(S&&$.substr(-S.length).toLowerCase()===S)return!0}return!1}function O0($,I,G){if(!$.isSymbolicLink()&&!$.isFile())return!1;return CG(I,G)}function v0($,I,G){_0.stat($,function(V,S){G(V,V?!1:O0(S,$,I))})}function mG($,I){return O0(_0.statSync($),$,I)}});var m0=j((h4,C0)=>{C0.exports=E0;E0.sync=hG;var P0=w("fs");function E0($,I,G){P0.stat($,function(V,S){G(V,V?!1:c0(S,I))})}function hG($,I){return c0(P0.statSync($),I)}function c0($,I){return $.isFile()&&kG($,I)}function kG($,I){var{mode:G,uid:V,gid:S}=$,M=I.uid!==void 0?I.uid:process.getuid&&process.getuid(),q=I.gid!==void 0?I.gid:process.getgid&&process.getgid(),H=parseInt("100",8),Z=parseInt("010",8),J=parseInt("001",8),X=H|Z,Q=G&J||G&Z&&S===q||G&H&&V===M||G&X&&M===0;return Q}});var k0=j((n4,h0)=>{var k4=w("fs"),U$;if(process.platform==="win32"||global.TESTING_WINDOWS)U$=w0();else U$=m0();h0.exports=D$;D$.sync=nG;function D$($,I,G){if(typeof I==="function")G=I,I={};if(!G){if(typeof Promise!=="function")throw TypeError("callback not provided");return new Promise(function(V,S){D$($,I||{},function(M,q){if(M)S(M);else V(q)})})}U$($,I||{},function(V,S){if(V){if(V.code==="EACCES"||I&&I.ignoreErrors)V=null,S=!1}G(V,S)})}function nG($,I){try{return U$.sync($,I||{})}catch(G){if(I&&I.ignoreErrors||G.code==="EACCES")return!1;else throw G}}});var D0=j((F4,i0)=>{var g=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",n0=w("path"),FG=g?";":":",F0=k0(),u0=($)=>Object.assign(Error(`not found: ${$}`),{code:"ENOENT"}),f0=($,I)=>{let G=I.colon||FG,V=$.match(/\//)||g&&$.match(/\\/)?[""]:[...g?[process.cwd()]:[],...(I.path||process.env.PATH||"").split(G)],S=g?I.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",M=g?S.split(G):[""];if(g){if($.indexOf(".")!==-1&&M[0]!=="")M.unshift("")}return{pathEnv:V,pathExt:M,pathExtExe:S}},g0=($,I,G)=>{if(typeof I==="function")G=I,I={};if(!I)I={};let{pathEnv:V,pathExt:S,pathExtExe:M}=f0($,I),q=[],H=(J)=>new Promise((X,Q)=>{if(J===V.length)return I.all&&q.length?X(q):Q(u0($));let W=V[J],A=/^".*"$/.test(W)?W.slice(1,-1):W,N=n0.join(A,$),x=!A&&/^\.[\\\/]/.test($)?$.slice(0,2)+N:N;X(Z(x,J,0))}),Z=(J,X,Q)=>new Promise((W,A)=>{if(Q===S.length)return W(H(X+1));let N=S[Q];F0(J+N,{pathExt:M},(x,C)=>{if(!x&&C)if(I.all)q.push(J+N);else return W(J+N);return W(Z(J,X,Q+1))})});return G?H(0).then((J)=>G(null,J),G):H(0)},uG=($,I)=>{I=I||{};let{pathEnv:G,pathExt:V,pathExtExe:S}=f0($,I),M=[];for(let q=0;q<G.length;q++){let H=G[q],Z=/^".*"$/.test(H)?H.slice(1,-1):H,J=n0.join(Z,$),X=!Z&&/^\.[\\\/]/.test($)?$.slice(0,2)+J:J;for(let Q=0;Q<V.length;Q++){let W=X+V[Q];try{if(F0.sync(W,{pathExt:S}))if(I.all)M.push(W);else return W}catch(A){}}}if(I.all&&M.length)return M;if(I.nothrow)return null;throw u0($)};i0.exports=g0;g0.sync=uG});var t0=j((u4,d$)=>{var d0=($={})=>{let I=$.env||process.env;if(($.platform||process.platform)!=="win32")return"PATH";return Object.keys(I).reverse().find((V)=>V.toUpperCase()==="PATH")||"Path"};d$.exports=d0;d$.exports.default=d0});var o0=j((f4,r0)=>{var l0=w("path"),fG=D0(),gG=t0();function p0($,I){let G=$.options.env||process.env,V=process.cwd(),S=$.options.cwd!=null,M=S&&process.chdir!==void 0&&!process.chdir.disabled;if(M)try{process.chdir($.options.cwd)}catch(H){}let q;try{q=fG.sync($.command,{path:G[gG({env:G})],pathExt:I?l0.delimiter:void 0})}catch(H){}finally{if(M)process.chdir(V)}if(q)q=l0.resolve(S?$.options.cwd:"",q);return q}function iG($){return p0($)||p0($,!0)}r0.exports=iG});var a0=j((tG,l$)=>{var t$=/([()\][%!^"`<>&|;, *?])/g;function DG($){return $=$.replace(t$,"^$1"),$}function dG($,I){if($=`${$}`,$=$.replace(/(?=(\\+?)?)\1"/g,"$1$1\\\""),$=$.replace(/(?=(\\+?)?)\1$/,"$1$1"),$=`"${$}"`,$=$.replace(t$,"^$1"),I)$=$.replace(t$,"^$1");return $}tG.command=DG;tG.argument=dG});var e0=j((g4,s0)=>{s0.exports=/^#!(.*)/});var I2=j((i4,$2)=>{var rG=e0();$2.exports=($="")=>{let I=$.match(rG);if(!I)return null;let[G,V]=I[0].replace(/#! ?/,"").split(" "),S=G.split("/").pop();if(S==="env")return V;return V?`${S} ${V}`:S}});var q2=j((D4,G2)=>{var p$=w("fs"),oG=I2();function aG($){let G=Buffer.alloc(150),V;try{V=p$.openSync($,"r"),p$.readSync(V,G,0,150,0),p$.closeSync(V)}catch(S){}return oG(G.toString())}G2.exports=aG});var H2=j((d4,M2)=>{var sG=w("path"),V2=o0(),S2=a0(),eG=q2(),$9=process.platform==="win32",I9=/\.(?:com|exe)$/i,G9=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function q9($){$.file=V2($);let I=$.file&&eG($.file);if(I)return $.args.unshift($.file),$.command=I,V2($);return $.file}function V9($){if(!$9)return $;let I=q9($),G=!I9.test(I);if($.options.forceShell||G){let V=G9.test(I);$.command=sG.normalize($.command),$.command=S2.command($.command),$.args=$.args.map((M)=>S2.argument(M,V));let S=[$.command].concat($.args).join(" ");$.args=["/d","/s","/c",`"${S}"`],$.command=process.env.comspec||"cmd.exe",$.options.windowsVerbatimArguments=!0}return $}function S9($,I,G){if(I&&!Array.isArray(I))G=I,I=null;I=I?I.slice(0):[],G=Object.assign({},G);let V={command:$,args:I,options:G,file:void 0,original:{command:$,args:I}};return G.shell?V:V9(V)}M2.exports=S9});var U2=j((t4,Z2)=>{var r$=process.platform==="win32";function o$($,I){return Object.assign(Error(`${I} ${$.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${I} ${$.command}`,path:$.command,spawnargs:$.args})}function M9($,I){if(!r$)return;let G=$.emit;$.emit=function(V,S){if(V==="exit"){let M=J2(S,I);if(M)return G.call($,"error",M)}return G.apply($,arguments)}}function J2($,I){if(r$&&$===1&&!I.file)return o$(I.original,"spawn");return null}function H9($,I){if(r$&&$===1&&!I.file)return o$(I.original,"spawnSync");return null}Z2.exports={hookChildProcess:M9,verifyENOENT:J2,verifyENOENTSync:H9,notFoundError:o$}});var W2=j((l4,i)=>{var X2=w("child_process"),a$=H2(),s$=U2();function Q2($,I,G){let V=a$($,I,G),S=X2.spawn(V.command,V.args,V.options);return s$.hookChildProcess(S,V),S}function J9($,I,G){let V=a$($,I,G),S=X2.spawnSync(V.command,V.args,V.options);return S.error=S.error||s$.verifyENOENTSync(S.status,V),S}i.exports=Q2;i.exports.spawn=Q2;i.exports.sync=J9;i.exports._parse=a$;i.exports._enoent=s$});var i2=j((s5,g2)=>{var{PassThrough:M3}=w("stream");g2.exports=function(){var $=[],I=new M3({objectMode:!0});return I.setMaxListeners(0),I.add=G,I.isEmpty=V,I.on("unpipe",S),Array.prototype.slice.call(arguments).forEach(G),I;function G(M){if(Array.isArray(M))return M.forEach(G),this;return $.push(M),M.once("end",S.bind(null,M)),M.once("error",I.emit.bind(I,"error")),M.pipe(I,{end:!1}),this}function V(){return $.length==0}function S(M){if($=$.filter(function(q){return q!==M}),!$.length&&I.readable)I.end()}}});var z=m(y$(),1),V$=m(O$(),1);import{stdin as u1,stdout as f1}from"node:process";import*as P from"node:readline";import P1 from"node:readline";import{WriteStream as BI}from"node:tty";function KI({onlyFirst:$=!1}={}){let I=["[\\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(I,$?void 0:"g")}var AI=KI();function g1($){if(typeof $!="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);return $.replace(AI,"")}function i1($){return $&&$.__esModule&&Object.prototype.hasOwnProperty.call($,"default")?$.default:$}var D1={exports:{}};(function($){var I={};$.exports=I,I.eastAsianWidth=function(V){var S=V.charCodeAt(0),M=V.length==2?V.charCodeAt(1):0,q=S;return 55296<=S&&S<=56319&&56320<=M&&M<=57343&&(S&=1023,M&=1023,q=S<<10|M,q+=65536),q==12288||65281<=q&&q<=65376||65504<=q&&q<=65510?"F":q==8361||65377<=q&&q<=65470||65474<=q&&q<=65479||65482<=q&&q<=65487||65490<=q&&q<=65495||65498<=q&&q<=65500||65512<=q&&q<=65518?"H":4352<=q&&q<=4447||4515<=q&&q<=4519||4602<=q&&q<=4607||9001<=q&&q<=9002||11904<=q&&q<=11929||11931<=q&&q<=12019||12032<=q&&q<=12245||12272<=q&&q<=12283||12289<=q&&q<=12350||12353<=q&&q<=12438||12441<=q&&q<=12543||12549<=q&&q<=12589||12593<=q&&q<=12686||12688<=q&&q<=12730||12736<=q&&q<=12771||12784<=q&&q<=12830||12832<=q&&q<=12871||12880<=q&&q<=13054||13056<=q&&q<=19903||19968<=q&&q<=42124||42128<=q&&q<=42182||43360<=q&&q<=43388||44032<=q&&q<=55203||55216<=q&&q<=55238||55243<=q&&q<=55291||63744<=q&&q<=64255||65040<=q&&q<=65049||65072<=q&&q<=65106||65108<=q&&q<=65126||65128<=q&&q<=65131||110592<=q&&q<=110593||127488<=q&&q<=127490||127504<=q&&q<=127546||127552<=q&&q<=127560||127568<=q&&q<=127569||131072<=q&&q<=194367||177984<=q&&q<=196605||196608<=q&&q<=262141?"W":32<=q&&q<=126||162<=q&&q<=163||165<=q&&q<=166||q==172||q==175||10214<=q&&q<=10221||10629<=q&&q<=10630?"Na":q==161||q==164||167<=q&&q<=168||q==170||173<=q&&q<=174||176<=q&&q<=180||182<=q&&q<=186||188<=q&&q<=191||q==198||q==208||215<=q&&q<=216||222<=q&&q<=225||q==230||232<=q&&q<=234||236<=q&&q<=237||q==240||242<=q&&q<=243||247<=q&&q<=250||q==252||q==254||q==257||q==273||q==275||q==283||294<=q&&q<=295||q==299||305<=q&&q<=307||q==312||319<=q&&q<=322||q==324||328<=q&&q<=331||q==333||338<=q&&q<=339||358<=q&&q<=359||q==363||q==462||q==464||q==466||q==468||q==470||q==472||q==474||q==476||q==593||q==609||q==708||q==711||713<=q&&q<=715||q==717||q==720||728<=q&&q<=731||q==733||q==735||768<=q&&q<=879||913<=q&&q<=929||931<=q&&q<=937||945<=q&&q<=961||963<=q&&q<=969||q==1025||1040<=q&&q<=1103||q==1105||q==8208||8211<=q&&q<=8214||8216<=q&&q<=8217||8220<=q&&q<=8221||8224<=q&&q<=8226||8228<=q&&q<=8231||q==8240||8242<=q&&q<=8243||q==8245||q==8251||q==8254||q==8308||q==8319||8321<=q&&q<=8324||q==8364||q==8451||q==8453||q==8457||q==8467||q==8470||8481<=q&&q<=8482||q==8486||q==8491||8531<=q&&q<=8532||8539<=q&&q<=8542||8544<=q&&q<=8555||8560<=q&&q<=8569||q==8585||8592<=q&&q<=8601||8632<=q&&q<=8633||q==8658||q==8660||q==8679||q==8704||8706<=q&&q<=8707||8711<=q&&q<=8712||q==8715||q==8719||q==8721||q==8725||q==8730||8733<=q&&q<=8736||q==8739||q==8741||8743<=q&&q<=8748||q==8750||8756<=q&&q<=8759||8764<=q&&q<=8765||q==8776||q==8780||q==8786||8800<=q&&q<=8801||8804<=q&&q<=8807||8810<=q&&q<=8811||8814<=q&&q<=8815||8834<=q&&q<=8835||8838<=q&&q<=8839||q==8853||q==8857||q==8869||q==8895||q==8978||9312<=q&&q<=9449||9451<=q&&q<=9547||9552<=q&&q<=9587||9600<=q&&q<=9615||9618<=q&&q<=9621||9632<=q&&q<=9633||9635<=q&&q<=9641||9650<=q&&q<=9651||9654<=q&&q<=9655||9660<=q&&q<=9661||9664<=q&&q<=9665||9670<=q&&q<=9672||q==9675||9678<=q&&q<=9681||9698<=q&&q<=9701||q==9711||9733<=q&&q<=9734||q==9737||9742<=q&&q<=9743||9748<=q&&q<=9749||q==9756||q==9758||q==9792||q==9794||9824<=q&&q<=9825||9827<=q&&q<=9829||9831<=q&&q<=9834||9836<=q&&q<=9837||q==9839||9886<=q&&q<=9887||9918<=q&&q<=9919||9924<=q&&q<=9933||9935<=q&&q<=9953||q==9955||9960<=q&&q<=9983||q==10045||q==10071||10102<=q&&q<=10111||11093<=q&&q<=11097||12872<=q&&q<=12879||57344<=q&&q<=63743||65024<=q&&q<=65039||q==65533||127232<=q&&q<=127242||127248<=q&&q<=127277||127280<=q&&q<=127337||127344<=q&&q<=127386||917760<=q&&q<=917999||983040<=q&&q<=1048573||1048576<=q&&q<=1114109?"A":"N"},I.characterLength=function(V){var S=this.eastAsianWidth(V);return S=="F"||S=="W"||S=="A"?2:1};function G(V){return V.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}I.length=function(V){for(var S=G(V),M=0,q=0;q<S.length;q++)M=M+this.characterLength(S[q]);return M},I.slice=function(V,S,M){textLen=I.length(V),S=S||0,M=M||1,S<0&&(S=textLen+S),M<0&&(M=textLen+M);for(var q="",H=0,Z=G(V),J=0;J<Z.length;J++){var X=Z[J],Q=I.length(X);if(H>=S-(Q==2?1:0))if(H+Q<=M)q+=X;else break;H+=Q}return q}})(D1);var TI=D1.exports,NI=i1(TI),jI=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},zI=i1(jI);function D($,I={}){if(typeof $!="string"||$.length===0||(I={ambiguousIsNarrow:!0,...I},$=g1($),$.length===0))return 0;$=$.replace(zI()," ");let G=I.ambiguousIsNarrow?1:2,V=0;for(let S of $){let M=S.codePointAt(0);if(M<=31||M>=127&&M<=159||M>=768&&M<=879)continue;switch(NI.eastAsianWidth(S)){case"F":case"W":V+=2;break;case"A":V+=G;break;default:V+=1}}return V}var v$=10,E1=($=0)=>(I)=>`\x1B[${I+$}m`,c1=($=0)=>(I)=>`\x1B[${38+$};5;${I}m`,C1=($=0)=>(I,G,V)=>`\x1B[${38+$};2;${I};${G};${V}m`,L={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(L.modifier);var yI=Object.keys(L.color),_I=Object.keys(L.bgColor);[...yI,..._I];function OI(){let $=new Map;for(let[I,G]of Object.entries(L)){for(let[V,S]of Object.entries(G))L[V]={open:`\x1B[${S[0]}m`,close:`\x1B[${S[1]}m`},G[V]=L[V],$.set(S[0],S[1]);Object.defineProperty(L,I,{value:G,enumerable:!1})}return Object.defineProperty(L,"codes",{value:$,enumerable:!1}),L.color.close="\x1B[39m",L.bgColor.close="\x1B[49m",L.color.ansi=E1(),L.color.ansi256=c1(),L.color.ansi16m=C1(),L.bgColor.ansi=E1(v$),L.bgColor.ansi256=c1(v$),L.bgColor.ansi16m=C1(v$),Object.defineProperties(L,{rgbToAnsi256:{value:(I,G,V)=>I===G&&G===V?I<8?16:I>248?231:Math.round((I-8)/247*24)+232:16+36*Math.round(I/255*5)+6*Math.round(G/255*5)+Math.round(V/255*5),enumerable:!1},hexToRgb:{value:(I)=>{let G=/[a-f\d]{6}|[a-f\d]{3}/i.exec(I.toString(16));if(!G)return[0,0,0];let[V]=G;V.length===3&&(V=[...V].map((M)=>M+M).join(""));let S=Number.parseInt(V,16);return[S>>16&255,S>>8&255,S&255]},enumerable:!1},hexToAnsi256:{value:(I)=>L.rgbToAnsi256(...L.hexToRgb(I)),enumerable:!1},ansi256ToAnsi:{value:(I)=>{if(I<8)return 30+I;if(I<16)return 90+(I-8);let G,V,S;if(I>=232)G=((I-232)*10+8)/255,V=G,S=G;else{I-=16;let H=I%36;G=Math.floor(I/36)/5,V=Math.floor(H/6)/5,S=H%6/5}let M=Math.max(G,V,S)*2;if(M===0)return 30;let q=30+(Math.round(S)<<2|Math.round(V)<<1|Math.round(G));return M===2&&(q+=60),q},enumerable:!1},rgbToAnsi:{value:(I,G,V)=>L.ansi256ToAnsi(L.rgbToAnsi256(I,G,V)),enumerable:!1},hexToAnsi:{value:(I)=>L.ansi256ToAnsi(L.hexToAnsi256(I)),enumerable:!1}}),L}var vI=OI(),S$=new Set(["\x1B",""]),xI=39,w$="\x07",d1="[",wI="]",t1="m",P$=`${wI}8;;`,m1=($)=>`${S$.values().next().value}${d1}${$}${t1}`,h1=($)=>`${S$.values().next().value}${P$}${$}${w$}`,PI=($)=>$.split(" ").map((I)=>D(I)),x$=($,I,G)=>{let V=[...I],S=!1,M=!1,q=D(g1($[$.length-1]));for(let[H,Z]of V.entries()){let J=D(Z);if(q+J<=G?$[$.length-1]+=Z:($.push(Z),q=0),S$.has(Z)&&(S=!0,M=V.slice(H+1).join("").startsWith(P$)),S){M?Z===w$&&(S=!1,M=!1):Z===t1&&(S=!1);continue}q+=J,q===G&&H<V.length-1&&($.push(""),q=0)}!q&&$[$.length-1].length>0&&$.length>1&&($[$.length-2]+=$.pop())},EI=($)=>{let I=$.split(" "),G=I.length;for(;G>0&&!(D(I[G-1])>0);)G--;return G===I.length?$:I.slice(0,G).join(" ")+I.slice(G).join("")},cI=($,I,G={})=>{if(G.trim!==!1&&$.trim()==="")return"";let V="",S,M,q=PI($),H=[""];for(let[J,X]of $.split(" ").entries()){G.trim!==!1&&(H[H.length-1]=H[H.length-1].trimStart());let Q=D(H[H.length-1]);if(J!==0&&(Q>=I&&(G.wordWrap===!1||G.trim===!1)&&(H.push(""),Q=0),(Q>0||G.trim===!1)&&(H[H.length-1]+=" ",Q++)),G.hard&&q[J]>I){let W=I-Q,A=1+Math.floor((q[J]-W-1)/I);Math.floor((q[J]-1)/I)<A&&H.push(""),x$(H,X,I);continue}if(Q+q[J]>I&&Q>0&&q[J]>0){if(G.wordWrap===!1&&Q<I){x$(H,X,I);continue}H.push("")}if(Q+q[J]>I&&G.wordWrap===!1){x$(H,X,I);continue}H[H.length-1]+=X}G.trim!==!1&&(H=H.map((J)=>EI(J)));let Z=[...H.join(`
|
|
3
|
+
`)];for(let[J,X]of Z.entries()){if(V+=X,S$.has(X)){let{groups:W}=new RegExp(`(?:\\${d1}(?<code>\\d+)m|\\${P$}(?<uri>.*)${w$})`).exec(Z.slice(J).join(""))||{groups:{}};if(W.code!==void 0){let A=Number.parseFloat(W.code);S=A===xI?void 0:A}else W.uri!==void 0&&(M=W.uri.length===0?void 0:W.uri)}let Q=vI.codes.get(Number(S));Z[J+1]===`
|
|
4
|
+
`?(M&&(V+=h1("")),S&&Q&&(V+=m1(Q))):X===`
|
|
5
|
+
`&&(S&&Q&&(V+=m1(S)),M&&(V+=h1(M)))}return V};function k1($,I,G){return String($).normalize().replace(/\r\n/g,`
|
|
6
|
+
`).split(`
|
|
7
|
+
`).map((V)=>cI(V,I,G)).join(`
|
|
8
|
+
`)}var CI=Object.defineProperty,mI=($,I,G)=>(I in $)?CI($,I,{enumerable:!0,configurable:!0,writable:!0,value:G}):$[I]=G,y=($,I,G)=>(mI($,typeof I!="symbol"?I+"":I,G),G);function hI($,I){if($===I)return;let G=$.split(`
|
|
9
|
+
`),V=I.split(`
|
|
10
|
+
`),S=[];for(let M=0;M<Math.max(G.length,V.length);M++)G[M]!==V[M]&&S.push(M);return S}var l1=Symbol("clack:cancel");function d($){return $===l1}function q$($,I){$.isTTY&&$.setRawMode(I)}var n1=new Map([["k","up"],["j","down"],["h","left"],["l","right"]]),kI=new Set(["up","down","left","right","space","enter"]);class M${constructor({render:$,input:I=u1,output:G=f1,...V},S=!0){y(this,"input"),y(this,"output"),y(this,"rl"),y(this,"opts"),y(this,"_track",!1),y(this,"_render"),y(this,"_cursor",0),y(this,"state","initial"),y(this,"value"),y(this,"error",""),y(this,"subscribers",new Map),y(this,"_prevFrame",""),this.opts=V,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=$.bind(this),this._track=S,this.input=I,this.output=G}prompt(){let $=new BI(0);return $._write=(I,G,V)=>{this._track&&(this.value=this.rl.line.replace(/\t/g,""),this._cursor=this.rl.cursor,this.emit("value",this.value)),V()},this.input.pipe($),this.rl=P1.createInterface({input:this.input,output:$,tabSize:2,prompt:"",escapeCodeTimeout:50}),P1.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),q$(this.input,!0),this.output.on("resize",this.render),this.render(),new Promise((I,G)=>{this.once("submit",()=>{this.output.write(z.cursor.show),this.output.off("resize",this.render),q$(this.input,!1),I(this.value)}),this.once("cancel",()=>{this.output.write(z.cursor.show),this.output.off("resize",this.render),q$(this.input,!1),I(l1)})})}on($,I){let G=this.subscribers.get($)??[];G.push({cb:I}),this.subscribers.set($,G)}once($,I){let G=this.subscribers.get($)??[];G.push({cb:I,once:!0}),this.subscribers.set($,G)}emit($,...I){let G=this.subscribers.get($)??[],V=[];for(let S of G)S.cb(...I),S.once&&V.push(()=>G.splice(G.indexOf(S),1));for(let S of V)S()}unsubscribe(){this.subscribers.clear()}onKeypress($,I){if(this.state==="error"&&(this.state="active"),I?.name&&!this._track&&n1.has(I.name)&&this.emit("cursor",n1.get(I.name)),I?.name&&kI.has(I.name)&&this.emit("cursor",I.name),$&&($.toLowerCase()==="y"||$.toLowerCase()==="n")&&this.emit("confirm",$.toLowerCase()==="y"),$==="\t"&&this.opts.placeholder&&(this.value||(this.rl.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),$&&this.emit("key",$.toLowerCase()),I?.name==="return"){if(this.opts.validate){let G=this.opts.validate(this.value);G&&(this.error=G,this.state="error",this.rl.write(this.value))}this.state!=="error"&&(this.state="submit")}$==="\x03"&&(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
|
+
`),q$(this.input,!1),this.rl.close(),this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let $=k1(this._prevFrame,process.stdout.columns,{hard:!0}).split(`
|
|
12
|
+
`).length-1;this.output.write(z.cursor.move(-999,$*-1))}render(){let $=k1(this._render(this)??"",process.stdout.columns,{hard:!0});if($!==this._prevFrame){if(this.state==="initial")this.output.write(z.cursor.hide);else{let I=hI(this._prevFrame,$);if(this.restoreCursor(),I&&I?.length===1){let G=I[0];this.output.write(z.cursor.move(0,G)),this.output.write(z.erase.lines(1));let V=$.split(`
|
|
13
|
+
`);this.output.write(V[G]),this._prevFrame=$,this.output.write(z.cursor.move(0,V.length-G-1));return}else if(I&&I?.length>1){let G=I[0];this.output.write(z.cursor.move(0,G)),this.output.write(z.erase.down());let V=$.split(`
|
|
14
|
+
`).slice(G);this.output.write(V.join(`
|
|
15
|
+
`)),this._prevFrame=$;return}this.output.write(z.erase.down())}this.output.write($),this.state==="initial"&&(this.state="active"),this._prevFrame=$}}}class E$ extends M${get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor($){super($,!1),this.value=!!$.initialValue,this.on("value",()=>{this.value=this._value}),this.on("confirm",(I)=>{this.output.write(z.cursor.move(0,-1)),this.value=I,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}var nI=Object.defineProperty,FI=($,I,G)=>(I in $)?nI($,I,{enumerable:!0,configurable:!0,writable:!0,value:G}):$[I]=G,F1=($,I,G)=>(FI($,typeof I!="symbol"?I+"":I,G),G),p1=class extends M${constructor($){super($,!1),F1(this,"options"),F1(this,"cursor",0),this.options=$.options,this.cursor=this.options.findIndex(({value:I})=>I===$.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",(I)=>{switch(I){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}};var uI=Object.defineProperty,fI=($,I,G)=>(I in $)?uI($,I,{enumerable:!0,configurable:!0,writable:!0,value:G}):$[I]=G,gI=($,I,G)=>(fI($,typeof I!="symbol"?I+"":I,G),G);class c$ extends M${constructor($){super($),gI(this,"valueWithCursor",""),this.on("finalize",()=>{this.value||(this.value=$.defaultValue),this.valueWithCursor=this.value}),this.on("value",()=>{if(this.cursor>=this.value.length)this.valueWithCursor=`${this.value}${V$.default.inverse(V$.default.hidden("_"))}`;else{let I=this.value.slice(0,this.cursor),G=this.value.slice(this.cursor);this.valueWithCursor=`${I}${V$.default.inverse(G[0])}${G.slice(1)}`}})}get cursor(){return this._cursor}}var iI=globalThis.process.platform.startsWith("win");function r1({input:$=u1,output:I=f1,overwrite:G=!0,hideCursor:V=!0}={}){let S=P.createInterface({input:$,output:I,prompt:"",tabSize:1});P.emitKeypressEvents($,S),$.isTTY&&$.setRawMode(!0);let M=(q,{name:H})=>{if(String(q)==="\x03"){V&&I.write(z.cursor.show),process.exit(0);return}if(!G)return;P.moveCursor(I,H==="return"?0:-1,H==="return"?-1:0,()=>{P.clearLine(I,1,()=>{$.once("keypress",M)})})};return V&&I.write(z.cursor.hide),$.once("keypress",M),()=>{$.off("keypress",M),V&&I.write(z.cursor.show),$.isTTY&&!iI&&$.setRawMode(!1),S.terminal=!1,S.close()}}var U=m(O$(),1),h=m(y$(),1);import O from"node:process";function DI(){return O.platform!=="win32"?O.env.TERM!=="linux":Boolean(O.env.CI)||Boolean(O.env.WT_SESSION)||Boolean(O.env.TERMINUS_SUBLIME)||O.env.ConEmuTask==="{cmd::Cmder}"||O.env.TERM_PROGRAM==="Terminus-Sublime"||O.env.TERM_PROGRAM==="vscode"||O.env.TERM==="xterm-256color"||O.env.TERM==="alacritty"||O.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var C$=DI(),K=($,I)=>C$?$:I,dI=K("◆","*"),o1=K("■","x"),a1=K("▲","x"),k$=K("◇","o"),tI=K("┌","T"),B=K("│","|"),k=K("└","—"),m$=K("●",">"),h$=K("○"," "),p3=K("◻","[•]"),r3=K("◼","[+]"),o3=K("◻","[ ]"),a3=K("▪","•"),s3=K("─","-"),e3=K("╮","+"),$4=K("├","+"),I4=K("╯","+"),lI=K("●","•"),pI=K("◆","*"),rI=K("▲","!"),oI=K("■","x"),n$=($)=>{switch($){case"initial":case"active":return U.default.cyan(dI);case"cancel":return U.default.red(o1);case"error":return U.default.yellow(a1);case"submit":return U.default.green(k$)}},s1=($)=>new c$({validate:$.validate,placeholder:$.placeholder,defaultValue:$.defaultValue,initialValue:$.initialValue,render(){let I=`${U.default.gray(B)}
|
|
16
|
+
${n$(this.state)} ${$.message}
|
|
17
|
+
`,G=$.placeholder?U.default.inverse($.placeholder[0])+U.default.dim($.placeholder.slice(1)):U.default.inverse(U.default.hidden("_")),V=this.value?this.valueWithCursor:G;switch(this.state){case"error":return`${I.trim()}
|
|
18
|
+
${U.default.yellow(B)} ${V}
|
|
19
|
+
${U.default.yellow(k)} ${U.default.yellow(this.error)}
|
|
20
|
+
`;case"submit":return`${I}${U.default.gray(B)} ${U.default.dim(this.value||$.placeholder)}`;case"cancel":return`${I}${U.default.gray(B)} ${U.default.strikethrough(U.default.dim(this.value??""))}${this.value?.trim()?`
|
|
21
|
+
`+U.default.gray(B):""}`;default:return`${I}${U.default.cyan(B)} ${V}
|
|
22
|
+
${U.default.cyan(k)}
|
|
23
|
+
`}}}).prompt();var n=($)=>{let I=$.active??"Yes",G=$.inactive??"No";return new E$({active:I,inactive:G,initialValue:$.initialValue??!0,render(){let V=`${U.default.gray(B)}
|
|
24
|
+
${n$(this.state)} ${$.message}
|
|
25
|
+
`,S=this.value?I:G;switch(this.state){case"submit":return`${V}${U.default.gray(B)} ${U.default.dim(S)}`;case"cancel":return`${V}${U.default.gray(B)} ${U.default.strikethrough(U.default.dim(S))}
|
|
26
|
+
${U.default.gray(B)}`;default:return`${V}${U.default.cyan(B)} ${this.value?`${U.default.green(m$)} ${I}`:`${U.default.dim(h$)} ${U.default.dim(I)}`} ${U.default.dim("/")} ${this.value?`${U.default.dim(h$)} ${U.default.dim(G)}`:`${U.default.green(m$)} ${G}`}
|
|
27
|
+
${U.default.cyan(k)}
|
|
28
|
+
`}}}).prompt()},F$=($)=>{let I=(V,S)=>{let M=V.label??String(V.value);return S==="active"?`${U.default.green(m$)} ${M} ${V.hint?U.default.dim(`(${V.hint})`):""}`:S==="selected"?`${U.default.dim(M)}`:S==="cancelled"?`${U.default.strikethrough(U.default.dim(M))}`:`${U.default.dim(h$)} ${U.default.dim(M)}`},G=0;return new p1({options:$.options,initialValue:$.initialValue,render(){let V=`${U.default.gray(B)}
|
|
29
|
+
${n$(this.state)} ${$.message}
|
|
30
|
+
`;switch(this.state){case"submit":return`${V}${U.default.gray(B)} ${I(this.options[this.cursor],"selected")}`;case"cancel":return`${V}${U.default.gray(B)} ${I(this.options[this.cursor],"cancelled")}
|
|
31
|
+
${U.default.gray(B)}`;default:{let S=$.maxItems===void 0?1/0:Math.max($.maxItems,5);this.cursor>=G+S-3?G=Math.max(Math.min(this.cursor-S+3,this.options.length-S),0):this.cursor<G+2&&(G=Math.max(this.cursor-2,0));let M=S<this.options.length&&G>0,q=S<this.options.length&&G+S<this.options.length;return`${V}${U.default.cyan(B)} ${this.options.slice(G,G+S).map((H,Z,J)=>Z===0&&M?U.default.dim("..."):Z===J.length-1&&q?U.default.dim("..."):I(H,Z+G===this.cursor?"active":"inactive")).join(`
|
|
32
|
+
${U.default.cyan(B)} `)}
|
|
33
|
+
${U.default.cyan(k)}
|
|
34
|
+
`}}}}).prompt()};var e1=($="")=>{process.stdout.write(`${U.default.gray(k)} ${U.default.red($)}
|
|
35
|
+
|
|
36
|
+
`)},$0=($="")=>{process.stdout.write(`${U.default.gray(tI)} ${$}
|
|
37
|
+
`)},I0=($="")=>{process.stdout.write(`${U.default.gray(B)}
|
|
38
|
+
${U.default.gray(k)} ${$}
|
|
39
|
+
|
|
40
|
+
`)},T={message:($="",{symbol:I=U.default.gray(B)}={})=>{let G=[`${U.default.gray(B)}`];if($){let[V,...S]=$.split(`
|
|
41
|
+
`);G.push(`${I} ${V}`,...S.map((M)=>`${U.default.gray(B)} ${M}`))}process.stdout.write(`${G.join(`
|
|
42
|
+
`)}
|
|
43
|
+
`)},info:($)=>{T.message($,{symbol:U.default.blue(lI)})},success:($)=>{T.message($,{symbol:U.default.green(pI)})},step:($)=>{T.message($,{symbol:U.default.green(k$)})},warn:($)=>{T.message($,{symbol:U.default.yellow(rI)})},warning:($)=>{T.warn($)},error:($)=>{T.message($,{symbol:U.default.red(oI)})}},G0=()=>{let $=C$?["◒","◐","◓","◑"]:["•","o","O","0"],I=C$?80:120,G,V,S=!1,M="",q=(X="")=>{S=!0,G=r1(),M=X.replace(/\.+$/,""),process.stdout.write(`${U.default.gray(B)}
|
|
44
|
+
`);let Q=0,W=0;V=setInterval(()=>{let A=U.default.magenta($[Q]),N=".".repeat(Math.floor(W)).slice(0,3);process.stdout.write(h.cursor.move(-999,0)),process.stdout.write(h.erase.down(1)),process.stdout.write(`${A} ${M}${N}`),Q=Q+1<$.length?Q+1:0,W=W<$.length?W+0.125:0},I)},H=(X="",Q=0)=>{M=X??M,S=!1,clearInterval(V);let W=Q===0?U.default.green(k$):Q===1?U.default.red(o1):U.default.red(a1);process.stdout.write(h.cursor.move(-999,0)),process.stdout.write(h.erase.down(1)),process.stdout.write(`${W} ${M}
|
|
45
|
+
`),G()},Z=(X="")=>{M=X??M},J=(X)=>{let Q=X>1?"Something went wrong":"Canceled";S&&H(Q,X)};return process.on("uncaughtExceptionMonitor",()=>J(2)),process.on("unhandledRejection",()=>J(2)),process.on("SIGINT",()=>J(1)),process.on("SIGTERM",()=>J(1)),process.on("exit",J),{start:q,stop:H,message:Z}};var q0=($=0)=>(I)=>`\x1B[${I+$}m`,V0=($=0)=>(I)=>`\x1B[${38+$};5;${I}m`,S0=($=0)=>(I,G,V)=>`\x1B[${38+$};2;${I};${G};${V}m`,R={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]}},V4=Object.keys(R.modifier),aI=Object.keys(R.color),sI=Object.keys(R.bgColor),S4=[...aI,...sI];function eI(){let $=new Map;for(let[I,G]of Object.entries(R)){for(let[V,S]of Object.entries(G))R[V]={open:`\x1B[${S[0]}m`,close:`\x1B[${S[1]}m`},G[V]=R[V],$.set(S[0],S[1]);Object.defineProperty(R,I,{value:G,enumerable:!1})}return Object.defineProperty(R,"codes",{value:$,enumerable:!1}),R.color.close="\x1B[39m",R.bgColor.close="\x1B[49m",R.color.ansi=q0(),R.color.ansi256=V0(),R.color.ansi16m=S0(),R.bgColor.ansi=q0(10),R.bgColor.ansi256=V0(10),R.bgColor.ansi16m=S0(10),Object.defineProperties(R,{rgbToAnsi256:{value(I,G,V){if(I===G&&G===V){if(I<8)return 16;if(I>248)return 231;return Math.round((I-8)/247*24)+232}return 16+36*Math.round(I/255*5)+6*Math.round(G/255*5)+Math.round(V/255*5)},enumerable:!1},hexToRgb:{value(I){let G=/[a-f\d]{6}|[a-f\d]{3}/i.exec(I.toString(16));if(!G)return[0,0,0];let[V]=G;if(V.length===3)V=[...V].map((M)=>M+M).join("");let S=Number.parseInt(V,16);return[S>>16&255,S>>8&255,S&255]},enumerable:!1},hexToAnsi256:{value:(I)=>R.rgbToAnsi256(...R.hexToRgb(I)),enumerable:!1},ansi256ToAnsi:{value(I){if(I<8)return 30+I;if(I<16)return 90+(I-8);let G,V,S;if(I>=232)G=((I-232)*10+8)/255,V=G,S=G;else{I-=16;let H=I%36;G=Math.floor(I/36)/5,V=Math.floor(H/6)/5,S=H%6/5}let M=Math.max(G,V,S)*2;if(M===0)return 30;let q=30+(Math.round(S)<<2|Math.round(V)<<1|Math.round(G));if(M===2)q+=60;return q},enumerable:!1},rgbToAnsi:{value:(I,G,V)=>R.ansi256ToAnsi(R.rgbToAnsi256(I,G,V)),enumerable:!1},hexToAnsi:{value:(I)=>R.ansi256ToAnsi(R.hexToAnsi256(I)),enumerable:!1}}),R}var $G=eI(),v=$G;import u$ from"node:process";import IG from"node:os";import M0 from"node:tty";function _($,I=globalThis.Deno?globalThis.Deno.args:u$.argv){let G=$.startsWith("-")?"":$.length===1?"-":"--",V=I.indexOf(G+$),S=I.indexOf("--");return V!==-1&&(S===-1||V<S)}var{env:b}=u$,H$;if(_("no-color")||_("no-colors")||_("color=false")||_("color=never"))H$=0;else if(_("color")||_("colors")||_("color=true")||_("color=always"))H$=1;function GG(){if("FORCE_COLOR"in b){if(b.FORCE_COLOR==="true")return 1;if(b.FORCE_COLOR==="false")return 0;return b.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(b.FORCE_COLOR,10),3)}}function qG($){if($===0)return!1;return{level:$,hasBasic:!0,has256:$>=2,has16m:$>=3}}function VG($,{streamIsTTY:I,sniffFlags:G=!0}={}){let V=GG();if(V!==void 0)H$=V;let S=G?H$:V;if(S===0)return 0;if(G){if(_("color=16m")||_("color=full")||_("color=truecolor"))return 3;if(_("color=256"))return 2}if("TF_BUILD"in b&&"AGENT_NAME"in b)return 1;if($&&!I&&S===void 0)return 0;let M=S||0;if(b.TERM==="dumb")return M;if(u$.platform==="win32"){let q=IG.release().split(".");if(Number(q[0])>=10&&Number(q[2])>=10586)return Number(q[2])>=14931?3:2;return 1}if("CI"in b){if(["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some((q)=>(q in b)))return 3;if(["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some((q)=>(q in b))||b.CI_NAME==="codeship")return 1;return M}if("TEAMCITY_VERSION"in b)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(b.TEAMCITY_VERSION)?1:0;if(b.COLORTERM==="truecolor")return 3;if(b.TERM==="xterm-kitty")return 3;if(b.TERM==="xterm-ghostty")return 3;if(b.TERM==="wezterm")return 3;if("TERM_PROGRAM"in b){let q=Number.parseInt((b.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(b.TERM_PROGRAM){case"iTerm.app":return q>=3?3:2;case"Apple_Terminal":return 2}}if(/-256(color)?$/i.test(b.TERM))return 2;if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(b.TERM))return 1;if("COLORTERM"in b)return 1;return M}function H0($,I={}){let G=VG($,{streamIsTTY:$&&$.isTTY,...I});return qG(G)}var SG={stdout:H0({isTTY:M0.isatty(1)}),stderr:H0({isTTY:M0.isatty(2)})},J0=SG;function Z0($,I,G){let V=$.indexOf(I);if(V===-1)return $;let S=I.length,M=0,q="";do q+=$.slice(M,V)+I+G,M=V+S,V=$.indexOf(I,M);while(V!==-1);return q+=$.slice(M),q}function U0($,I,G,V){let S=0,M="";do{let q=$[V-1]==="\r";M+=$.slice(S,q?V-1:V)+I+(q?`\r
|
|
46
|
+
`:`
|
|
47
|
+
`)+G,S=V+1,V=$.indexOf(`
|
|
48
|
+
`,S)}while(V!==-1);return M+=$.slice(S),M}var{stdout:X0,stderr:Q0}=J0,f$=Symbol("GENERATOR"),F=Symbol("STYLER"),t=Symbol("IS_EMPTY"),W0=["ansi","ansi","ansi256","ansi16m"],u=Object.create(null),MG=($,I={})=>{if(I.level&&!(Number.isInteger(I.level)&&I.level>=0&&I.level<=3))throw Error("The `level` option should be an integer from 0 to 3");let G=X0?X0.level:0;$.level=I.level===void 0?G:I.level};var HG=($)=>{let I=(...G)=>G.join(" ");return MG(I,$),Object.setPrototypeOf(I,l.prototype),I};function l($){return HG($)}Object.setPrototypeOf(l.prototype,Function.prototype);for(let[$,I]of Object.entries(v))u[$]={get(){let G=J$(this,i$(I.open,I.close,this[F]),this[t]);return Object.defineProperty(this,$,{value:G}),G}};u.visible={get(){let $=J$(this,this[F],!0);return Object.defineProperty(this,"visible",{value:$}),$}};var g$=($,I,G,...V)=>{if($==="rgb"){if(I==="ansi16m")return v[G].ansi16m(...V);if(I==="ansi256")return v[G].ansi256(v.rgbToAnsi256(...V));return v[G].ansi(v.rgbToAnsi(...V))}if($==="hex")return g$("rgb",I,G,...v.hexToRgb(...V));return v[G][$](...V)},JG=["rgb","hex","ansi256"];for(let $ of JG){u[$]={get(){let{level:G}=this;return function(...V){let S=i$(g$($,W0[G],"color",...V),v.color.close,this[F]);return J$(this,S,this[t])}}};let I="bg"+$[0].toUpperCase()+$.slice(1);u[I]={get(){let{level:G}=this;return function(...V){let S=i$(g$($,W0[G],"bgColor",...V),v.bgColor.close,this[F]);return J$(this,S,this[t])}}}}var ZG=Object.defineProperties(()=>{},{...u,level:{enumerable:!0,get(){return this[f$].level},set($){this[f$].level=$}}}),i$=($,I,G)=>{let V,S;if(G===void 0)V=$,S=I;else V=G.openAll+$,S=I+G.closeAll;return{open:$,close:I,openAll:V,closeAll:S,parent:G}},J$=($,I,G)=>{let V=(...S)=>UG(V,S.length===1?""+S[0]:S.join(" "));return Object.setPrototypeOf(V,ZG),V[f$]=$,V[F]=I,V[t]=G,V},UG=($,I)=>{if($.level<=0||!I)return $[t]?"":I;let G=$[F];if(G===void 0)return I;let{openAll:V,closeAll:S}=G;if(I.includes("\x1B"))while(G!==void 0)I=Z0(I,G.close,G.open),G=G.parent;let M=I.indexOf(`
|
|
49
|
+
`);if(M!==-1)I=U0(I,S,V,M);return V+I+S};Object.defineProperties(l.prototype,u);var XG=l(),L4=l({level:Q0?Q0.level:0});var Y=XG;import{readFile as QG,access as WG}from"node:fs/promises";async function E($){try{return await WG($),!0}catch{return!1}}async function YG(){if(await E("bun.lockb"))return"bun";if(await E("pnpm-lock.yaml"))return"pnpm";if(await E("yarn.lock"))return"yarn";return"npm"}async function LG(){if(await E("src"))return"src";if(await E("app"))return"app";return null}async function RG(){let $=[".env",".env.local",".env.development"];for(let I of $)try{let V=(await QG(I,"utf-8")).match(/DATABASE_URL=["']?([^"'\n]+)/);if(V){let S=V[1];return{type:S.includes("postgres")?"postgresql":S.includes("mysql")?"mysql":S.includes("sqlite")||S.includes(".db")?"sqlite":"unknown",url:S}}}catch{continue}return{type:"unknown",url:null}}async function bG(){let $=["drizzle.config.ts","drizzle.config.js","drizzle/migrations"];for(let I of $)if(await E(I))return!0;return!1}async function Y0(){let[$,I,G,V,S]=await Promise.all([E("tsconfig.json"),YG(),LG(),bG(),RG()]);return{hasTypescript:$,packageManager:I,srcDir:G,hasDrizzle:V,database:S}}async function L0($){let I=await F$({message:"Select your ORM",options:[{value:"drizzle",label:"Drizzle"},{value:"prisma",label:"Prisma"},{value:"kysely",label:"Kysely"}],initialValue:"drizzle"});if(d(I))process.exit(0);let G=I,V=await F$({message:"Select your database",options:[{value:"postgresql",label:"PostgreSQL"},{value:"mysql",label:"MySQL/MariaDB"},{value:"sqlite",label:"SQLite"}],initialValue:$.database.type!=="unknown"?$.database.type:"postgresql"});if(d(V))process.exit(0);let S=V,M=await n({message:"Include starter schema (User model)?",initialValue:!0}),q=!1;if(G==="drizzle")q=await n({message:"Include Drizzle Studio? (database GUI)",initialValue:!0});let H=await n({message:"Use custom path for database client?",initialValue:!1}),Z;if(H)Z=await s1({message:"Enter path (e.g., src/lib/database)",placeholder:$.srcDir?`${$.srcDir}/lib/db`:"lib/db"});return{orm:G,database:S,includeSchema:M,includeStudio:q,clientPath:Z}}function R0($,I){let G;if(I)G=I.replace(/\\/g,"/");else if($)G=`${$}/lib`;else G="lib";let V={clientDir:G,clientFile:`${G}/db.ts`,schemaDir:`${G}/db`,schemaFile:`${G}/db/schema.ts`,migrateFile:`${G}/db/migrate.ts`,configFile:"drizzle.config.ts",migrationsDir:"drizzle/migrations"};return console.log(`
|
|
50
|
+
\uD83D\uDD0D Debug - Resolved paths:`),console.log(" Base directory:",G),console.log(" Client file:",V.clientFile),console.log(" Schema file:",V.schemaFile),console.log(""),V}import{mkdir as BG,writeFile as KG}from"node:fs/promises";import{dirname as AG,resolve as TG}from"node:path";async function NG($,I){try{let G=TG(process.cwd(),$),V=AG(G);await BG(V,{recursive:!0}),await KG(G,I,"utf-8")}catch(G){if(G instanceof Error)throw Error(`Failed to write file ${$}: ${G.message}`);throw G}}async function f($){for(let{path:I,content:G}of $)await NG(I,G)}function b0($,I){let G=$==="postgresql"?"pg-core":$==="mysql"?"mysql-core":"sqlite-core",V=$==="postgresql"?"pgTable":$==="mysql"?"mysqlTable":"sqliteTable",S=`import { ${V}, text, timestamp, integer } from 'drizzle-orm/${G}'`;if(!I)return`${S}
|
|
51
|
+
|
|
52
|
+
// Define your schema here
|
|
53
|
+
// Example:
|
|
54
|
+
// export const users = ${V}('users', {
|
|
55
|
+
// id: integer('id').primaryKey(),
|
|
56
|
+
// email: text('email').notNull().unique(),
|
|
57
|
+
// })
|
|
58
|
+
`;return`${S}
|
|
59
|
+
|
|
60
|
+
export const users = ${V}('users', {
|
|
61
|
+
id: ${$==="sqlite"?"integer('id').primaryKey({ autoIncrement: true })":"text('id').primaryKey().$defaultFn(() => crypto.randomUUID())"},
|
|
62
|
+
email: text('email').notNull().unique(),
|
|
63
|
+
name: text('name'),
|
|
64
|
+
createdAt: timestamp('created_at').defaultNow().notNull(),
|
|
65
|
+
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
|
66
|
+
})
|
|
67
|
+
`}function B0($){if($==="postgresql")return`import { drizzle } from 'drizzle-orm/postgres-js'
|
|
68
|
+
import postgres from 'postgres'
|
|
69
|
+
import * as schema from './db/schema'
|
|
70
|
+
|
|
71
|
+
if (!process.env.DATABASE_URL) {
|
|
72
|
+
throw new Error('DATABASE_URL is not set')
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const client = postgres(process.env.DATABASE_URL)
|
|
76
|
+
export const db = drizzle(client, { schema })
|
|
77
|
+
`;if($==="mysql")return`import { drizzle } from 'drizzle-orm/mysql2'
|
|
78
|
+
import mysql from 'mysql2/promise'
|
|
79
|
+
import * as schema from './db/schema'
|
|
80
|
+
|
|
81
|
+
if (!process.env.DATABASE_URL) {
|
|
82
|
+
throw new Error('DATABASE_URL is not set')
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const connection = await mysql.createConnection(process.env.DATABASE_URL)
|
|
86
|
+
export const db = drizzle(connection, { schema })
|
|
87
|
+
`;return`import { drizzle } from 'drizzle-orm/better-sqlite3'
|
|
88
|
+
import Database from 'better-sqlite3'
|
|
89
|
+
import * as schema from './db/schema'
|
|
90
|
+
|
|
91
|
+
if (!process.env.DATABASE_URL) {
|
|
92
|
+
throw new Error('DATABASE_URL is not set')
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const sqlite = new Database(process.env.DATABASE_URL)
|
|
96
|
+
export const db = drizzle(sqlite, { schema })
|
|
97
|
+
`}function K0($,I,G){return`import { defineConfig } from 'drizzle-kit'
|
|
98
|
+
|
|
99
|
+
export default defineConfig({
|
|
100
|
+
schema: './${I}',
|
|
101
|
+
out: './${G}',
|
|
102
|
+
dialect: '${$==="postgresql"?"postgresql":$==="mysql"?"mysql":"sqlite"}',
|
|
103
|
+
dbCredentials: {
|
|
104
|
+
${$==="sqlite"?"url: process.env.DATABASE_URL!":"url: process.env.DATABASE_URL!"},
|
|
105
|
+
},
|
|
106
|
+
})
|
|
107
|
+
`}function A0($){if($==="postgresql")return`import { drizzle } from 'drizzle-orm/postgres-js'
|
|
108
|
+
import { migrate } from 'drizzle-orm/postgres-js/migrator'
|
|
109
|
+
import postgres from 'postgres'
|
|
110
|
+
|
|
111
|
+
const connection = postgres(process.env.DATABASE_URL!, { max: 1 })
|
|
112
|
+
const db = drizzle(connection)
|
|
113
|
+
|
|
114
|
+
await migrate(db, { migrationsFolder: './drizzle/migrations' })
|
|
115
|
+
await connection.end()
|
|
116
|
+
|
|
117
|
+
console.log('✅ Migrations complete!')
|
|
118
|
+
`;if($==="mysql")return`import { drizzle } from 'drizzle-orm/mysql2'
|
|
119
|
+
import { migrate } from 'drizzle-orm/mysql2/migrator'
|
|
120
|
+
import mysql from 'mysql2/promise'
|
|
121
|
+
|
|
122
|
+
const connection = await mysql.createConnection(process.env.DATABASE_URL!)
|
|
123
|
+
const db = drizzle(connection)
|
|
124
|
+
|
|
125
|
+
await migrate(db, { migrationsFolder: './drizzle/migrations' })
|
|
126
|
+
await connection.end()
|
|
127
|
+
|
|
128
|
+
console.log('✅ Migrations complete!')
|
|
129
|
+
`;return`import { drizzle } from 'drizzle-orm/better-sqlite3'
|
|
130
|
+
import { migrate } from 'drizzle-orm/better-sqlite3/migrator'
|
|
131
|
+
import Database from 'better-sqlite3'
|
|
132
|
+
|
|
133
|
+
const sqlite = new Database(process.env.DATABASE_URL!)
|
|
134
|
+
const db = drizzle(sqlite)
|
|
135
|
+
|
|
136
|
+
migrate(db, { migrationsFolder: './drizzle/migrations' })
|
|
137
|
+
sqlite.close()
|
|
138
|
+
|
|
139
|
+
console.log('✅ Migrations complete!')
|
|
140
|
+
`}async function T0($){let{paths:I,database:G,includeExamples:V}=$,S=[{path:I.schemaFile,content:b0(G,V)},{path:I.clientFile,content:B0(G)},{path:I.configFile,content:K0(G,I.schemaFile,I.migrationsDir)},{path:I.migrateFile,content:A0(G)}];await f(S)}async function N0($){let{paths:I,database:G,includeExamples:V}=$,S=[{path:"prisma/schema.prisma",content:jG(G,V)},{path:I.clientFile.replace("/db.ts","/prisma.ts"),content:zG()}];await f(S)}function jG($,I){let V=`datasource db {
|
|
141
|
+
provider = "${$==="postgresql"?"postgresql":$==="mysql"?"mysql":"sqlite"}"
|
|
142
|
+
url = env("DATABASE_URL")
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
generator client {
|
|
146
|
+
provider = "prisma-client-js"
|
|
147
|
+
}
|
|
148
|
+
`;if(!I)return`${V}
|
|
149
|
+
// Define your models here
|
|
150
|
+
// Example:
|
|
151
|
+
// model User {
|
|
152
|
+
// id String @id @default(uuid())
|
|
153
|
+
// email String @unique
|
|
154
|
+
// }
|
|
155
|
+
`;return`${V}${`
|
|
156
|
+
model User {
|
|
157
|
+
id String @id @default(uuid())
|
|
158
|
+
email String @unique
|
|
159
|
+
name String?
|
|
160
|
+
createdAt DateTime @default(now())
|
|
161
|
+
updatedAt DateTime @updatedAt
|
|
162
|
+
}
|
|
163
|
+
`}`}function zG(){return`import { PrismaClient } from '@prisma/client'
|
|
164
|
+
|
|
165
|
+
const globalForPrisma = globalThis as unknown as {
|
|
166
|
+
prisma: PrismaClient | undefined
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export const prisma = globalForPrisma.prisma ?? new PrismaClient()
|
|
170
|
+
|
|
171
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
172
|
+
globalForPrisma.prisma = prisma
|
|
173
|
+
}
|
|
174
|
+
`}function yG($,I){let G=I==="postgresql"?"pg-core":I==="mysql"?"mysql-core":"sqlite-core",V=I==="postgresql"?"pgTable":I==="mysql"?"mysqlTable":"sqliteTable",S=new Set(["text","timestamp"]);$.forEach((J)=>{J.fields.forEach((X)=>{let Q=j0(X);S.add(Q.split("(")[0])})});let M=`import { ${V}, ${Array.from(S).join(", ")} } from 'drizzle-orm/${G}'`,q=$.map((J)=>{let X=J.fields.map((Q)=>{return` ${Q.name}: ${_G(Q,I)},`}).join(`
|
|
175
|
+
`);return`export const ${J.name} = ${V}('${J.name}', {
|
|
176
|
+
${X}
|
|
177
|
+
})`}).join(`
|
|
178
|
+
|
|
179
|
+
`),H=$.some((J)=>J.relations&&J.relations.length>0),Z="";if(H)Z=`
|
|
180
|
+
|
|
181
|
+
import { relations } from 'drizzle-orm'
|
|
182
|
+
|
|
183
|
+
`,Z+=$.filter((J)=>J.relations&&J.relations.length>0).map((J)=>{let X=J.relations.map((Q)=>{if(Q.type==="one-to-many")return` ${Q.fieldName}: many(${Q.toTable}),`;else if(Q.type==="many-to-one")return` ${Q.fieldName}: one(${Q.toTable}, {
|
|
184
|
+
fields: [${J.name}.${Q.fieldName}Id],
|
|
185
|
+
references: [${Q.toTable}.id],
|
|
186
|
+
}),`;return""}).join(`
|
|
187
|
+
`);return`export const ${J.name}Relations = relations(${J.name}, ({ one, many }) => ({
|
|
188
|
+
${X}
|
|
189
|
+
}))`}).join(`
|
|
190
|
+
|
|
191
|
+
`);return`${M}
|
|
192
|
+
|
|
193
|
+
${q}${Z}`}function j0($){switch($.type){case"uuid":return"text";case"string":return"text";case"text":return"text";case"number":return"integer";case"boolean":return"boolean";case"date":return"timestamp";case"json":return"json";default:return"text"}}function _G($,I){let G=j0($);if(G+=`('${$.name}'`,$.length)G+=`, { length: ${$.length} }`;if(G+=")",$.isPrimaryKey)G+=".primaryKey()";if($.required&&!$.isPrimaryKey)G+=".notNull()";if($.unique)G+=".unique()";if($.default!==void 0)if($.default==="now")G+=".defaultNow()";else if(typeof $.default==="string")G+=`.default('${$.default}')`;else G+=`.default(${$.default})`;if($.isPrimaryKey&&$.type==="uuid")G+=".$defaultFn(() => crypto.randomUUID())";if($.references){if(G+=`.references(() => ${$.references.table}.${$.references.field}`,$.references.onDelete)G+=`, { onDelete: '${$.references.onDelete}' }`;G+=")"}return G}function OG($,I){let G=`datasource db {
|
|
194
|
+
provider = "${I==="postgresql"?"postgresql":I==="mysql"?"mysql":"sqlite"}"
|
|
195
|
+
url = env("DATABASE_URL")
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
generator client {
|
|
199
|
+
provider = "prisma-client-js"
|
|
200
|
+
}
|
|
201
|
+
`,V=$.map((S)=>{let M=S.fields.map((H)=>{return` ${vG(H)}`}).join(`
|
|
202
|
+
`),q=S.fields.filter((H)=>H.references).map((H)=>` @@index([${H.name}])`).join(`
|
|
203
|
+
`);return`model ${Z$(S.displayName)} {
|
|
204
|
+
${M}
|
|
205
|
+
${q?`
|
|
206
|
+
`+q:""}
|
|
207
|
+
}`}).join(`
|
|
208
|
+
|
|
209
|
+
`);return`${G}
|
|
210
|
+
${V}`}function vG($){let I=$.name;I+=" ";let G=xG($);if(I+=G,!$.required&&!$.isPrimaryKey)I+="?";let V=[];if($.isPrimaryKey)if($.type==="uuid")V.push("@id @default(uuid())");else if($.isAutoIncrement)V.push("@id @default(autoincrement())");else V.push("@id");if($.unique&&!$.isPrimaryKey)V.push("@unique");if($.default!==void 0&&!$.isPrimaryKey)if($.default==="now")V.push("@default(now())");else if(typeof $.default==="string")V.push(`@default("${$.default}")`);else if(typeof $.default==="boolean")V.push(`@default(${$.default})`);else V.push(`@default(${$.default})`);if($.references){if(V.push(`@relation(fields: [${$.name}], references: [${$.references.field}]`),$.references.onDelete)V.push(`, onDelete: ${Z$($.references.onDelete)}`);V.push(")")}if(V.length>0)I+=" "+V.join(" ");return I}function xG($){switch($.type){case"uuid":return"String";case"string":return"String";case"text":return"String";case"number":return"Int";case"boolean":return"Boolean";case"date":return"DateTime";case"json":return"Json";default:return"String"}}function wG($,I){let V=$.map((M)=>{let q=M.fields.map((Z)=>{let J=PG(Z);if(Z.isPrimaryKey&&Z.isAutoIncrement)J=`Generated<${J}>`;if(!Z.required&&!Z.isPrimaryKey)J+=" | null";return` ${Z.name}: ${J}`}).join(`
|
|
211
|
+
`),H=Z$(M.displayName);return`export interface ${H}Table {
|
|
212
|
+
${q}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export type ${H} = Selectable<${H}Table>
|
|
216
|
+
export type New${H} = Insertable<${H}Table>
|
|
217
|
+
export type ${H}Update = Updateable<${H}Table>`}).join(`
|
|
218
|
+
|
|
219
|
+
`),S=`export interface Database {
|
|
220
|
+
${$.map((M)=>` ${M.name}: ${Z$(M.displayName)}Table`).join(`
|
|
221
|
+
`)}
|
|
222
|
+
}`;return`import { Generated, Insertable, Selectable, Updateable } from 'kysely'
|
|
223
|
+
|
|
224
|
+
${V}
|
|
225
|
+
|
|
226
|
+
${S}`}function PG($){switch($.type){case"uuid":return"string";case"string":return"string";case"text":return"string";case"number":return"number";case"boolean":return"boolean";case"date":return"Date";case"json":return"unknown";default:return"string"}}function Z$($){return $.charAt(0).toUpperCase()+$.slice(1)}function z0($,I,G){switch($){case"drizzle":return yG(I,G);case"prisma":return OG(I,G);case"kysely":return wG(I,G);default:throw Error(`Unsupported ORM: ${$}`)}}async function y0($){let{paths:I,database:G,selectedTables:V}=$,S=z0("kysely",V,G),M=[{path:I.schemaFile,content:S},{path:I.clientFile,content:EG(G)},{path:I.migrateFile,content:cG(G)}];await f(M)}function EG($){if($==="postgresql")return`import { Kysely, PostgresDialect } from 'kysely'
|
|
227
|
+
import { Pool } from 'pg'
|
|
228
|
+
import type { Database } from './db/schema'
|
|
229
|
+
|
|
230
|
+
if (!process.env.DATABASE_URL) {
|
|
231
|
+
throw new Error('DATABASE_URL is not set')
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const dialect = new PostgresDialect({
|
|
235
|
+
pool: new Pool({
|
|
236
|
+
connectionString: process.env.DATABASE_URL,
|
|
237
|
+
}),
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
export const db = new Kysely<Database>({
|
|
241
|
+
dialect,
|
|
242
|
+
})
|
|
243
|
+
`;if($==="mysql")return`import { Kysely, MysqlDialect } from 'kysely'
|
|
244
|
+
import { createPool } from 'mysql2'
|
|
245
|
+
import type { Database } from './db/schema'
|
|
246
|
+
|
|
247
|
+
if (!process.env.DATABASE_URL) {
|
|
248
|
+
throw new Error('DATABASE_URL is not set')
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const dialect = new MysqlDialect({
|
|
252
|
+
pool: createPool(process.env.DATABASE_URL),
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
export const db = new Kysely<Database>({
|
|
256
|
+
dialect,
|
|
257
|
+
})
|
|
258
|
+
`;return`import { Kysely, SqliteDialect } from 'kysely'
|
|
259
|
+
import Database from 'better-sqlite3'
|
|
260
|
+
import type { Database as DatabaseType } from './db/schema'
|
|
261
|
+
|
|
262
|
+
if (!process.env.DATABASE_URL) {
|
|
263
|
+
throw new Error('DATABASE_URL is not set')
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const dialect = new SqliteDialect({
|
|
267
|
+
database: new Database(process.env.DATABASE_URL),
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
export const db = new Kysely<DatabaseType>({
|
|
271
|
+
dialect,
|
|
272
|
+
})
|
|
273
|
+
`}function cG($){return`import { promises as fs } from 'fs'
|
|
274
|
+
import { Migrator, FileMigrationProvider } from 'kysely'
|
|
275
|
+
import { db } from '../db'
|
|
276
|
+
import * as path from 'path'
|
|
277
|
+
|
|
278
|
+
async function migrateToLatest() {
|
|
279
|
+
const migrator = new Migrator({
|
|
280
|
+
db,
|
|
281
|
+
provider: new FileMigrationProvider({
|
|
282
|
+
fs,
|
|
283
|
+
path,
|
|
284
|
+
migrationFolder: path.join(__dirname, '../../migrations'),
|
|
285
|
+
}),
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
const { error, results } = await migrator.migrateToLatest()
|
|
289
|
+
|
|
290
|
+
results?.forEach((it) => {
|
|
291
|
+
if (it.status === 'Success') {
|
|
292
|
+
console.log(\`✅ Migration "\${it.migrationName}" was executed successfully\`)
|
|
293
|
+
} else if (it.status === 'Error') {
|
|
294
|
+
console.error(\`❌ Failed to execute migration "\${it.migrationName}"\`)
|
|
295
|
+
}
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
if (error) {
|
|
299
|
+
console.error('❌ Failed to migrate')
|
|
300
|
+
console.error(error)
|
|
301
|
+
process.exit(1)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
await db.destroy()
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
migrateToLatest()
|
|
308
|
+
`}var GI=m(W2(),1);import{Buffer as z3}from"node:buffer";import y3 from"node:path";import N1 from"node:child_process";import N$ from"node:process";function e$($){let I=typeof $==="string"?`
|
|
309
|
+
`:`
|
|
310
|
+
`.charCodeAt(),G=typeof $==="string"?"\r":"\r".charCodeAt();if($[$.length-1]===I)$=$.slice(0,-1);if($[$.length-1]===G)$=$.slice(0,-1);return $}import Q$ from"node:process";import p from"node:path";import{fileURLToPath as Y2}from"node:url";function X$($={}){let{env:I=process.env,platform:G=process.platform}=$;if(G!=="win32")return"PATH";return Object.keys(I).reverse().find((V)=>V.toUpperCase()==="PATH")||"Path"}var Z9=({cwd:$=Q$.cwd(),path:I=Q$.env[X$()],preferLocal:G=!0,execPath:V=Q$.execPath,addExecPath:S=!0}={})=>{let M=$ instanceof URL?Y2($):$,q=p.resolve(M),H=[];if(G)U9(H,q);if(S)X9(H,V,q);return[...H,I].join(p.delimiter)},U9=($,I)=>{let G;while(G!==I)$.push(p.join(I,"node_modules/.bin")),G=I,I=p.resolve(I,"..")},X9=($,I,G)=>{let V=I instanceof URL?Y2(I):I;$.push(p.resolve(G,V,".."))},L2=({env:$=Q$.env,...I}={})=>{$={...$};let G=X$({env:$});return I.path=$[G],$[G]=Z9(I),$};var Q9=($,I,G,V)=>{if(G==="length"||G==="prototype")return;if(G==="arguments"||G==="caller")return;let S=Object.getOwnPropertyDescriptor($,G),M=Object.getOwnPropertyDescriptor(I,G);if(!W9(S,M)&&V)return;Object.defineProperty($,G,M)},W9=function($,I){return $===void 0||$.configurable||$.writable===I.writable&&$.enumerable===I.enumerable&&$.configurable===I.configurable&&($.writable||$.value===I.value)},Y9=($,I)=>{let G=Object.getPrototypeOf(I);if(G===Object.getPrototypeOf($))return;Object.setPrototypeOf($,G)},L9=($,I)=>`/* Wrapped ${$}*/
|
|
311
|
+
${I}`,R9=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),b9=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),B9=($,I,G)=>{let V=G===""?"":`with ${G.trim()}() `,S=L9.bind(null,V,I.toString());Object.defineProperty(S,"name",b9),Object.defineProperty($,"toString",{...R9,value:S})};function $1($,I,{ignoreNonConfigurable:G=!1}={}){let{name:V}=$;for(let S of Reflect.ownKeys(I))Q9($,I,S,G);return Y9($,I),B9($,I,V),$}var W$=new WeakMap,R2=($,I={})=>{if(typeof $!=="function")throw TypeError("Expected a function");let G,V=0,S=$.displayName||$.name||"<anonymous>",M=function(...q){if(W$.set(M,++V),V===1)G=$.apply(this,q),$=null;else if(I.throw===!0)throw Error(`Function \`${S}\` can only be called once`);return G};return $1(M,$),W$.set(M,V),M};R2.callCount=($)=>{if(!W$.has($))throw Error(`The given function \`${$.name}\` is not wrapped by the \`onetime\` package`);return W$.get($)};var b2=R2;import v9 from"node:process";import{constants as N9}from"node:os";var B2=()=>{let $=I1-K2+1;return Array.from({length:$},K9)},K9=($,I)=>({name:`SIGRT${I+1}`,number:K2+I,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),K2=34,I1=64;import{constants as A9}from"node:os";var A2=[{name:"SIGHUP",number:1,action:"terminate",description:"Terminal closed",standard:"posix"},{name:"SIGINT",number:2,action:"terminate",description:"User interruption with CTRL-C",standard:"ansi"},{name:"SIGQUIT",number:3,action:"core",description:"User interruption with CTRL-\\",standard:"posix"},{name:"SIGILL",number:4,action:"core",description:"Invalid machine instruction",standard:"ansi"},{name:"SIGTRAP",number:5,action:"core",description:"Debugger breakpoint",standard:"posix"},{name:"SIGABRT",number:6,action:"core",description:"Aborted",standard:"ansi"},{name:"SIGIOT",number:6,action:"core",description:"Aborted",standard:"bsd"},{name:"SIGBUS",number:7,action:"core",description:"Bus error due to misaligned, non-existing address or paging error",standard:"bsd"},{name:"SIGEMT",number:7,action:"terminate",description:"Command should be emulated but is not implemented",standard:"other"},{name:"SIGFPE",number:8,action:"core",description:"Floating point arithmetic error",standard:"ansi"},{name:"SIGKILL",number:9,action:"terminate",description:"Forced termination",standard:"posix",forced:!0},{name:"SIGUSR1",number:10,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGSEGV",number:11,action:"core",description:"Segmentation fault",standard:"ansi"},{name:"SIGUSR2",number:12,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGPIPE",number:13,action:"terminate",description:"Broken pipe or socket",standard:"posix"},{name:"SIGALRM",number:14,action:"terminate",description:"Timeout or timer",standard:"posix"},{name:"SIGTERM",number:15,action:"terminate",description:"Termination",standard:"ansi"},{name:"SIGSTKFLT",number:16,action:"terminate",description:"Stack is empty or overflowed",standard:"other"},{name:"SIGCHLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"posix"},{name:"SIGCLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"other"},{name:"SIGCONT",number:18,action:"unpause",description:"Unpaused",standard:"posix",forced:!0},{name:"SIGSTOP",number:19,action:"pause",description:"Paused",standard:"posix",forced:!0},{name:"SIGTSTP",number:20,action:"pause",description:'Paused using CTRL-Z or "suspend"',standard:"posix"},{name:"SIGTTIN",number:21,action:"pause",description:"Background process cannot read terminal input",standard:"posix"},{name:"SIGBREAK",number:21,action:"terminate",description:"User interruption with CTRL-BREAK",standard:"other"},{name:"SIGTTOU",number:22,action:"pause",description:"Background process cannot write to terminal output",standard:"posix"},{name:"SIGURG",number:23,action:"ignore",description:"Socket received out-of-band data",standard:"bsd"},{name:"SIGXCPU",number:24,action:"core",description:"Process timed out",standard:"bsd"},{name:"SIGXFSZ",number:25,action:"core",description:"File too big",standard:"bsd"},{name:"SIGVTALRM",number:26,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGPROF",number:27,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGWINCH",number:28,action:"ignore",description:"Terminal window size changed",standard:"bsd"},{name:"SIGIO",number:29,action:"terminate",description:"I/O is available",standard:"other"},{name:"SIGPOLL",number:29,action:"terminate",description:"Watched event",standard:"other"},{name:"SIGINFO",number:29,action:"ignore",description:"Request for process information",standard:"other"},{name:"SIGPWR",number:30,action:"terminate",description:"Device running out of power",standard:"systemv"},{name:"SIGSYS",number:31,action:"core",description:"Invalid system call",standard:"other"},{name:"SIGUNUSED",number:31,action:"terminate",description:"Invalid system call",standard:"other"}];var G1=()=>{let $=B2();return[...A2,...$].map(T9)},T9=({name:$,number:I,description:G,action:V,forced:S=!1,standard:M})=>{let{signals:{[$]:q}}=A9,H=q!==void 0;return{name:$,number:H?q:I,description:G,supported:H,action:V,forced:S,standard:M}};var j9=()=>{let $=G1();return Object.fromEntries($.map(z9))},z9=({name:$,number:I,description:G,supported:V,action:S,forced:M,standard:q})=>[$,{name:$,number:I,description:G,supported:V,action:S,forced:M,standard:q}],T2=j9(),y9=()=>{let $=G1(),I=I1+1,G=Array.from({length:I},(V,S)=>_9(S,$));return Object.assign({},...G)},_9=($,I)=>{let G=O9($,I);if(G===void 0)return{};let{name:V,description:S,supported:M,action:q,forced:H,standard:Z}=G;return{[$]:{name:V,number:$,description:S,supported:M,action:q,forced:H,standard:Z}}},O9=($,I)=>{let G=I.find(({name:V})=>N9.signals[V]===$);if(G!==void 0)return G;return I.find((V)=>V.number===$)},W5=y9();var x9=({timedOut:$,timeout:I,errorCode:G,signal:V,signalDescription:S,exitCode:M,isCanceled:q})=>{if($)return`timed out after ${I} milliseconds`;if(q)return"was canceled";if(G!==void 0)return`failed with ${G}`;if(V!==void 0)return`was killed with ${V} (${S})`;if(M!==void 0)return`failed with exit code ${M}`;return"failed"},r=({stdout:$,stderr:I,all:G,error:V,signal:S,exitCode:M,command:q,escapedCommand:H,timedOut:Z,isCanceled:J,killed:X,parsed:{options:{timeout:Q,cwd:W=v9.cwd()}}})=>{M=M===null?void 0:M,S=S===null?void 0:S;let A=S===void 0?void 0:T2[S].description,N=V&&V.code,C=`Command ${x9({timedOut:Z,timeout:Q,errorCode:N,signal:S,signalDescription:A,exitCode:M,isCanceled:J})}: ${q}`,s=Object.prototype.toString.call(V)==="[object Error]",e=s?`${C}
|
|
312
|
+
${V.message}`:C,$$=[e,I,$].filter(Boolean).join(`
|
|
313
|
+
`);if(s)V.originalMessage=V.message,V.message=$$;else V=Error($$);if(V.shortMessage=e,V.command=q,V.escapedCommand=H,V.exitCode=M,V.signal=S,V.signalDescription=A,V.stdout=$,V.stderr=I,V.cwd=W,G!==void 0)V.all=G;if("bufferedData"in V)delete V.bufferedData;return V.failed=!0,V.timedOut=Boolean(Z),V.isCanceled=J,V.killed=X&&!Z,V};var Y$=["stdin","stdout","stderr"],w9=($)=>Y$.some((I)=>$[I]!==void 0),N2=($)=>{if(!$)return;let{stdio:I}=$;if(I===void 0)return Y$.map((V)=>$[V]);if(w9($))throw Error(`It's not possible to provide \`stdio\` in combination with one of ${Y$.map((V)=>`\`${V}\``).join(", ")}`);if(typeof I==="string")return I;if(!Array.isArray(I))throw TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof I}\``);let G=Math.max(I.length,Y$.length);return Array.from({length:G},(V,S)=>I[S])};import c9 from"node:os";var c=[];c.push("SIGHUP","SIGINT","SIGTERM");if(process.platform!=="win32")c.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");if(process.platform==="linux")c.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var L$=($)=>!!$&&typeof $==="object"&&typeof $.removeListener==="function"&&typeof $.emit==="function"&&typeof $.reallyExit==="function"&&typeof $.listeners==="function"&&typeof $.kill==="function"&&typeof $.pid==="number"&&typeof $.on==="function",q1=Symbol.for("signal-exit emitter"),V1=globalThis,P9=Object.defineProperty.bind(Object);class j2{emitted={afterExit:!1,exit:!1};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(V1[q1])return V1[q1];P9(V1,q1,{value:this,writable:!1,enumerable:!1,configurable:!1})}on($,I){this.listeners[$].push(I)}removeListener($,I){let G=this.listeners[$],V=G.indexOf(I);if(V===-1)return;if(V===0&&G.length===1)G.length=0;else G.splice(V,1)}emit($,I,G){if(this.emitted[$])return!1;this.emitted[$]=!0;let V=!1;for(let S of this.listeners[$])V=S(I,G)===!0||V;if($==="exit")V=this.emit("afterExit",I,G)||V;return V}}class M1{}var E9=($)=>{return{onExit(I,G){return $.onExit(I,G)},load(){return $.load()},unload(){return $.unload()}}};class z2 extends M1{onExit(){return()=>{}}load(){}unload(){}}class y2 extends M1{#M=S1.platform==="win32"?"SIGINT":"SIGHUP";#I=new j2;#$;#V;#S;#q={};#G=!1;constructor($){super();this.#$=$,this.#q={};for(let I of c)this.#q[I]=()=>{let G=this.#$.listeners(I),{count:V}=this.#I,S=$;if(typeof S.__signal_exit_emitter__==="object"&&typeof S.__signal_exit_emitter__.count==="number")V+=S.__signal_exit_emitter__.count;if(G.length===V){this.unload();let M=this.#I.emit("exit",null,I),q=I==="SIGHUP"?this.#M:I;if(!M)$.kill($.pid,q)}};this.#S=$.reallyExit,this.#V=$.emit}onExit($,I){if(!L$(this.#$))return()=>{};if(this.#G===!1)this.load();let G=I?.alwaysLast?"afterExit":"exit";return this.#I.on(G,$),()=>{if(this.#I.removeListener(G,$),this.#I.listeners.exit.length===0&&this.#I.listeners.afterExit.length===0)this.unload()}}load(){if(this.#G)return;this.#G=!0,this.#I.count+=1;for(let $ of c)try{let I=this.#q[$];if(I)this.#$.on($,I)}catch(I){}this.#$.emit=($,...I)=>{return this.#J($,...I)},this.#$.reallyExit=($)=>{return this.#H($)}}unload(){if(!this.#G)return;this.#G=!1,c.forEach(($)=>{let I=this.#q[$];if(!I)throw Error("Listener not defined for signal: "+$);try{this.#$.removeListener($,I)}catch(G){}}),this.#$.emit=this.#V,this.#$.reallyExit=this.#S,this.#I.count-=1}#H($){if(!L$(this.#$))return 0;return this.#$.exitCode=$||0,this.#I.emit("exit",this.#$.exitCode,null),this.#S.call(this.#$,this.#$.exitCode)}#J($,...I){let G=this.#V;if($==="exit"&&L$(this.#$)){if(typeof I[0]==="number")this.#$.exitCode=I[0];let V=G.call(this.#$,$,...I);return this.#I.emit("exit",this.#$.exitCode,null),V}else return G.call(this.#$,$,...I)}}var S1=globalThis.process,{onExit:_2,load:T5,unload:N5}=E9(L$(S1)?new y2(S1):new z2);var C9=5000,O2=($,I="SIGTERM",G={})=>{let V=$(I);return m9($,I,G,V),V},m9=($,I,G,V)=>{if(!h9(I,G,V))return;let S=n9(G),M=setTimeout(()=>{$("SIGKILL")},S);if(M.unref)M.unref()},h9=($,{forceKillAfterTimeout:I},G)=>k9($)&&I!==!1&&G,k9=($)=>$===c9.constants.signals.SIGTERM||typeof $==="string"&&$.toUpperCase()==="SIGTERM",n9=({forceKillAfterTimeout:$=!0})=>{if($===!0)return C9;if(!Number.isFinite($)||$<0)throw TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${$}\` (${typeof $})`);return $},v2=($,I)=>{if($.kill())I.isCanceled=!0},F9=($,I,G)=>{$.kill(I),G(Object.assign(Error("Timed out"),{timedOut:!0,signal:I}))},x2=($,{timeout:I,killSignal:G="SIGTERM"},V)=>{if(I===0||I===void 0)return V;let S,M=new Promise((H,Z)=>{S=setTimeout(()=>{F9($,G,Z)},I)}),q=V.finally(()=>{clearTimeout(S)});return Promise.race([M,q])},w2=({timeout:$})=>{if($!==void 0&&(!Number.isFinite($)||$<0))throw TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${$}\` (${typeof $})`)},P2=async($,{cleanup:I,detached:G},V)=>{if(!I||G)return V;let S=_2(()=>{$.kill()});return V.finally(()=>{S()})};import{createWriteStream as u9}from"node:fs";import{ChildProcess as f9}from"node:child_process";function R$($){return $!==null&&typeof $==="object"&&typeof $.pipe==="function"}function H1($){return R$($)&&$.writable!==!1&&typeof $._write==="function"&&typeof $._writableState==="object"}var g9=($)=>$ instanceof f9&&typeof $.then==="function",J1=($,I,G)=>{if(typeof G==="string")return $[I].pipe(u9(G)),$;if(H1(G))return $[I].pipe(G),$;if(!g9(G))throw TypeError("The second argument must be a string, a stream or an Execa child process.");if(!H1(G.stdin))throw TypeError("The target child process's stdin must be available.");return $[I].pipe(G.stdin),G},E2=($)=>{if($.stdout!==null)$.pipeStdout=J1.bind(void 0,$,"stdout");if($.stderr!==null)$.pipeStderr=J1.bind(void 0,$,"stderr");if($.all!==void 0)$.pipeAll=J1.bind(void 0,$,"all")};import{createReadStream as H3,readFileSync as J3}from"node:fs";import{setTimeout as Z3}from"node:timers/promises";var o=async($,{init:I,convertChunk:G,getSize:V,truncateChunk:S,addChunk:M,getFinalChunk:q,finalize:H},{maxBuffer:Z=Number.POSITIVE_INFINITY}={})=>{if(!D9($))throw Error("The first argument must be a Readable, a ReadableStream, or an async iterable.");let J=I();J.length=0;try{for await(let X of $){let Q=d9(X),W=G[Q](X,J);m2({convertedChunk:W,state:J,getSize:V,truncateChunk:S,addChunk:M,maxBuffer:Z})}return i9({state:J,convertChunk:G,getSize:V,truncateChunk:S,addChunk:M,getFinalChunk:q,maxBuffer:Z}),H(J)}catch(X){throw X.bufferedData=H(J),X}},i9=({state:$,getSize:I,truncateChunk:G,addChunk:V,getFinalChunk:S,maxBuffer:M})=>{let q=S($);if(q!==void 0)m2({convertedChunk:q,state:$,getSize:I,truncateChunk:G,addChunk:V,maxBuffer:M})},m2=({convertedChunk:$,state:I,getSize:G,truncateChunk:V,addChunk:S,maxBuffer:M})=>{let q=G($),H=I.length+q;if(H<=M){c2($,I,S,H);return}let Z=V($,M-I.length);if(Z!==void 0)c2(Z,I,S,M);throw new Z1},c2=($,I,G,V)=>{I.contents=G($,I,V),I.length=V},D9=($)=>typeof $==="object"&&$!==null&&typeof $[Symbol.asyncIterator]==="function",d9=($)=>{let I=typeof $;if(I==="string")return"string";if(I!=="object"||$===null)return"others";if(globalThis.Buffer?.isBuffer($))return"buffer";let G=C2.call($);if(G==="[object ArrayBuffer]")return"arrayBuffer";if(G==="[object DataView]")return"dataView";if(Number.isInteger($.byteLength)&&Number.isInteger($.byteOffset)&&C2.call($.buffer)==="[object ArrayBuffer]")return"typedArray";return"others"},{toString:C2}=Object.prototype;class Z1 extends Error{name="MaxBufferError";constructor(){super("maxBuffer exceeded")}}var U1=($)=>$,X1=()=>{return},Q1=({contents:$})=>$,b$=($)=>{throw Error(`Streams in object mode are not supported: ${String($)}`)},B$=($)=>$.length;async function W1($,I){return o($,$3,I)}var t9=()=>({contents:new ArrayBuffer(0)}),l9=($)=>p9.encode($),p9=new TextEncoder,h2=($)=>new Uint8Array($),k2=($)=>new Uint8Array($.buffer,$.byteOffset,$.byteLength),r9=($,I)=>$.slice(0,I),o9=($,{contents:I,length:G},V)=>{let S=u2()?s9(I,V):a9(I,V);return new Uint8Array(S).set($,G),S},a9=($,I)=>{if(I<=$.byteLength)return $;let G=new ArrayBuffer(F2(I));return new Uint8Array(G).set(new Uint8Array($),0),G},s9=($,I)=>{if(I<=$.maxByteLength)return $.resize(I),$;let G=new ArrayBuffer(I,{maxByteLength:F2(I)});return new Uint8Array(G).set(new Uint8Array($),0),G},F2=($)=>n2**Math.ceil(Math.log($)/Math.log(n2)),n2=2,e9=({contents:$,length:I})=>u2()?$:$.slice(0,I),u2=()=>("resize"in ArrayBuffer.prototype),$3={init:t9,convertChunk:{string:l9,buffer:h2,arrayBuffer:h2,dataView:k2,typedArray:k2,others:b$},getSize:B$,truncateChunk:r9,addChunk:o9,getFinalChunk:X1,finalize:e9};async function K$($,I){if(!("Buffer"in globalThis))throw Error("getStreamAsBuffer() is only supported in Node.js");try{return f2(await W1($,I))}catch(G){if(G.bufferedData!==void 0)G.bufferedData=f2(G.bufferedData);throw G}}var f2=($)=>globalThis.Buffer.from($);async function Y1($,I){return o($,S3,I)}var I3=()=>({contents:"",textDecoder:new TextDecoder}),A$=($,{textDecoder:I})=>I.decode($,{stream:!0}),G3=($,{contents:I})=>I+$,q3=($,I)=>$.slice(0,I),V3=({textDecoder:$})=>{let I=$.decode();return I===""?void 0:I},S3={init:I3,convertChunk:{string:U1,buffer:A$,arrayBuffer:A$,dataView:A$,typedArray:A$,others:b$},getSize:B$,truncateChunk:q3,addChunk:G3,getFinalChunk:V3,finalize:Q1};var D2=m(i2(),1),d2=($)=>{if($!==void 0)throw TypeError("The `input` and `inputFile` options cannot be both set.")},U3=({input:$,inputFile:I})=>{if(typeof I!=="string")return $;return d2($),J3(I)},t2=($)=>{let I=U3($);if(R$(I))throw TypeError("The `input` option cannot be a stream in sync mode");return I},X3=({input:$,inputFile:I})=>{if(typeof I!=="string")return $;return d2($),H3(I)},l2=($,I)=>{let G=X3(I);if(G===void 0)return;if(R$(G))G.pipe($.stdin);else $.stdin.end(G)},p2=($,{all:I})=>{if(!I||!$.stdout&&!$.stderr)return;let G=D2.default();if($.stdout)G.add($.stdout);if($.stderr)G.add($.stderr);return G},L1=async($,I)=>{if(!$||I===void 0)return;await Z3(0),$.destroy();try{return await I}catch(G){return G.bufferedData}},R1=($,{encoding:I,buffer:G,maxBuffer:V})=>{if(!$||!G)return;if(I==="utf8"||I==="utf-8")return Y1($,{maxBuffer:V});if(I===null||I==="buffer")return K$($,{maxBuffer:V});return Q3($,V,I)},Q3=async($,I,G)=>{return(await K$($,{maxBuffer:I})).toString(G)},r2=async({stdout:$,stderr:I,all:G},{encoding:V,buffer:S,maxBuffer:M},q)=>{let H=R1($,{encoding:V,buffer:S,maxBuffer:M}),Z=R1(I,{encoding:V,buffer:S,maxBuffer:M}),J=R1(G,{encoding:V,buffer:S,maxBuffer:M*2});try{return await Promise.all([q,H,Z,J])}catch(X){return Promise.all([{error:X,signal:X.signal,timedOut:X.timedOut},L1($,H),L1(I,Z),L1(G,J)])}};var W3=(async()=>{})().constructor.prototype,Y3=["then","catch","finally"].map(($)=>[$,Reflect.getOwnPropertyDescriptor(W3,$)]),b1=($,I)=>{for(let[G,V]of Y3){let S=typeof I==="function"?(...M)=>Reflect.apply(V.value,I(),M):V.value.bind(I);Reflect.defineProperty($,G,{...V,value:S})}},o2=($)=>new Promise((I,G)=>{if($.on("exit",(V,S)=>{I({exitCode:V,signal:S})}),$.on("error",(V)=>{G(V)}),$.stdin)$.stdin.on("error",(V)=>{G(V)})});import{Buffer as L3}from"node:buffer";import{ChildProcess as R3}from"node:child_process";var e2=($,I=[])=>{if(!Array.isArray(I))return[$];return[$,...I]},b3=/^[\w.-]+$/,B3=($)=>{if(typeof $!=="string"||b3.test($))return $;return`"${$.replaceAll('"',"\\\"")}"`},B1=($,I)=>e2($,I).join(" "),K1=($,I)=>e2($,I).map((G)=>B3(G)).join(" "),K3=/ +/g;var a2=($)=>{let I=typeof $;if(I==="string")return $;if(I==="number")return String($);if(I==="object"&&$!==null&&!($ instanceof R3)&&"stdout"in $){let G=typeof $.stdout;if(G==="string")return $.stdout;if(L3.isBuffer($.stdout))return $.stdout.toString();throw TypeError(`Unexpected "${G}" stdout in template expression`)}throw TypeError(`Unexpected "${I}" in template expression`)},s2=($,I,G)=>G||$.length===0||I.length===0?[...$,...I]:[...$.slice(0,-1),`${$.at(-1)}${I[0]}`,...I.slice(1)],A3=({templates:$,expressions:I,tokens:G,index:V,template:S})=>{let M=S??$.raw[V],q=M.split(K3).filter(Boolean),H=s2(G,q,M.startsWith(" "));if(V===I.length)return H;let Z=I[V],J=Array.isArray(Z)?Z.map((X)=>a2(X)):[a2(Z)];return s2(H,J,M.endsWith(" "))},A1=($,I)=>{let G=[];for(let[V,S]of $.entries())G=A3({templates:$,expressions:I,tokens:G,index:V,template:S});return G};import{debuglog as T3}from"node:util";import N3 from"node:process";var $I=T3("execa").enabled,T$=($,I)=>String($).padStart(I,"0"),j3=()=>{let $=new Date;return`${T$($.getHours(),2)}:${T$($.getMinutes(),2)}:${T$($.getSeconds(),2)}.${T$($.getMilliseconds(),3)}`},T1=($,{verbose:I})=>{if(!I)return;N3.stderr.write(`[${j3()}] ${$}
|
|
314
|
+
`)};var _3=1e8,O3=({env:$,extendEnv:I,preferLocal:G,localDir:V,execPath:S})=>{let M=I?{...N$.env,...$}:$;if(G)return L2({env:M,cwd:V,execPath:S});return M},qI=($,I,G={})=>{let V=GI.default._parse($,I,G);if($=V.command,I=V.args,G=V.options,G={maxBuffer:_3,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:G.cwd||N$.cwd(),execPath:N$.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:$I,...G},G.env=O3(G),G.stdio=N2(G),N$.platform==="win32"&&y3.basename($,".exe")==="cmd")I.unshift("/q");return{file:$,args:I,options:G,parsed:V}},a=($,I,G)=>{if(typeof I!=="string"&&!z3.isBuffer(I))return G===void 0?void 0:"";if($.stripFinalNewline)return e$(I);return I};function j$($,I,G){let V=qI($,I,G),S=B1($,I),M=K1($,I);T1(M,V.options),w2(V.options);let q;try{q=N1.spawn(V.file,V.args,V.options)}catch(A){let N=new N1.ChildProcess,x=Promise.reject(r({error:A,stdout:"",stderr:"",all:"",command:S,escapedCommand:M,parsed:V,timedOut:!1,isCanceled:!1,killed:!1}));return b1(N,x),N}let H=o2(q),Z=x2(q,V.options,H),J=P2(q,V.options,Z),X={isCanceled:!1};q.kill=O2.bind(null,q.kill.bind(q)),q.cancel=v2.bind(null,q,X);let W=b2(async()=>{let[{error:A,exitCode:N,signal:x,timedOut:C},s,e,$$]=await r2(q,V.options,J),j1=a(V.options,s),z1=a(V.options,e),y1=a(V.options,$$);if(A||N!==0||x!==null){let _1=r({error:A,exitCode:N,signal:x,stdout:j1,stderr:z1,all:y1,command:S,escapedCommand:M,parsed:V,timedOut:C,isCanceled:X.isCanceled||(V.options.signal?V.options.signal.aborted:!1),killed:q.killed});if(!V.options.reject)return _1;throw _1}return{command:S,escapedCommand:M,exitCode:0,stdout:j1,stderr:z1,all:y1,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}});return l2(q,V.options),q.all=p2(q,V.options),E2(q),b1(q,W),q}function v3($,I,G){let V=qI($,I,G),S=B1($,I),M=K1($,I);T1(M,V.options);let q=t2(V.options),H;try{H=N1.spawnSync(V.file,V.args,{...V.options,input:q})}catch(X){throw r({error:X,stdout:"",stderr:"",all:"",command:S,escapedCommand:M,parsed:V,timedOut:!1,isCanceled:!1,killed:!1})}let Z=a(V.options,H.stdout,H.error),J=a(V.options,H.stderr,H.error);if(H.error||H.status!==0||H.signal!==null){let X=r({stdout:Z,stderr:J,error:H.error,signal:H.signal,exitCode:H.status,command:S,escapedCommand:M,parsed:V,timedOut:H.error&&H.error.code==="ETIMEDOUT",isCanceled:!1,killed:H.signal!==null});if(!V.options.reject)return X;throw X}return{command:S,escapedCommand:M,exitCode:0,stdout:Z,stderr:J,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}}var x3=({input:$,inputFile:I,stdio:G})=>$===void 0&&I===void 0&&G===void 0?{stdin:"inherit"}:{},II=($={})=>({preferLocal:!0,...x3($),...$});function VI($){function I(G,...V){if(!Array.isArray(G))return VI({...$,...G});let[S,...M]=A1(G,V);return j$(S,M,II($))}return I.sync=(G,...V)=>{if(!Array.isArray(G))throw TypeError("Please use $(options).sync`command` instead of $.sync(options)`command`.");let[S,...M]=A1(G,V);return v3(S,M,II($))},I}var vq=VI();import{readFile as w3,writeFile as P3}from"node:fs/promises";function SI($,I){if(I==="prisma")return"";switch($){case"postgresql":return I==="kysely"?"pg":"postgres";case"mysql":return"mysql2";case"sqlite":return"better-sqlite3"}}async function MI($,I,G,V){let S=[],M=[];switch(I){case"drizzle":S=["drizzle-orm",SI(G,I)],M=["drizzle-kit"];break;case"prisma":S=["@prisma/client"],M=["prisma"];break;case"kysely":S=["kysely",SI(G,I)],M=[];break}let q=$==="npm"?"install":"add",H=$==="npm"?"--save-dev":"-D";if(S.length>0)await j$($,[q,...S],{stdio:"inherit"});if(M.length>0)await j$($,[q,H,...M],{stdio:"inherit"})}async function HI($,I){let V=await w3("package.json","utf-8"),S=JSON.parse(V),M={};switch($){case"drizzle":M={"db:generate":"drizzle-kit generate","db:migrate":"drizzle-kit migrate","db:push":"drizzle-kit push","db:studio":"drizzle-kit studio"};break;case"prisma":M={"db:generate":"prisma generate","db:migrate":"prisma migrate dev","db:push":"prisma db push","db:studio":"prisma studio","db:seed":"prisma db seed"};break;case"kysely":M={"db:migrate":"bun src/lib/db/migrate.ts"};break}S.scripts={...S.scripts,...M},await P3("package.json",JSON.stringify(S,null,2)+`
|
|
315
|
+
`)}async function E3(){console.clear(),$0(Y.bold.blue("\uD83D\uDDC4️ ORM Setup CLI v1.0.0"));try{let $=G0();$.start("Analyzing your project...");let I=await Y0();if($.stop("Project analyzed"),T.info(`${Y.green("✓")} ${I.hasTypescript?"TypeScript":"JavaScript"} project`),T.info(`${Y.green("✓")} Package manager: ${I.packageManager}`),I.srcDir)T.info(`${Y.green("✓")} Source directory: ${I.srcDir}/`);if(I.database.url)T.info(`${Y.green("✓")} Database: ${I.database.type} (from .env)`);else T.warn(`${Y.yellow("!")} No DATABASE_URL found in .env`);if(I.hasDrizzle){if(T.warn(`${Y.yellow("⚠")} Drizzle is already set up in this project`),!await n({message:"Continue anyway? (this may overwrite files)",initialValue:!1}))e1("Operation cancelled"),process.exit(0)}let G=await L0(I),V=R0(I.srcDir,G.clientPath);switch($.start("Installing dependencies..."),await MI(I.packageManager,G.orm,G.database,G.includeStudio),$.stop("Dependencies installed"),$.start("Generating files..."),G.orm){case"drizzle":await T0({paths:V,database:G.database,typescript:I.hasTypescript,includeExamples:G.includeSchema});break;case"prisma":await N0({paths:V,database:G.database,includeExamples:G.includeSchema});break;case"kysely":await y0({paths:V,database:G.database,selectedTables:[]});break}if($.stop("Files generated"),$.start("Updating package.json..."),await HI(G.orm,G.database),$.stop("package.json updated"),I0(Y.green.bold(`✅ ${G.orm==="drizzle"?"Drizzle":G.orm==="prisma"?"Prisma":"Kysely"} ORM setup complete!`)),console.log(),T.step("Import your database client:"),G.orm==="drizzle")console.log(Y.cyan(" import { db } from '@/lib/db'"));else if(G.orm==="prisma")console.log(Y.cyan(" import { prisma } from '@/lib/prisma'"));else console.log(Y.cyan(" import { db } from '@/lib/db'"));if(console.log(),T.step("Next steps:"),G.orm==="drizzle"){if(console.log(` ${Y.gray("1.")} Add DATABASE_URL to .env`),console.log(` ${Y.gray("2.")} Run: ${Y.cyan("bun db:generate")} (create migration)`),console.log(` ${Y.gray("3.")} Run: ${Y.cyan("bun db:migrate")} (apply migration)`),G.includeStudio)console.log(` ${Y.gray("4.")} Run: ${Y.cyan("bun db:studio")} (open database GUI)`)}else if(G.orm==="prisma")console.log(` ${Y.gray("1.")} Add DATABASE_URL to .env`),console.log(` ${Y.gray("2.")} Run: ${Y.cyan("bun db:generate")} (generate client)`),console.log(` ${Y.gray("3.")} Run: ${Y.cyan("bun db:migrate")} (create & apply migration)`),console.log(` ${Y.gray("4.")} Run: ${Y.cyan("bun db:studio")} (open Prisma Studio)`);else console.log(` ${Y.gray("1.")} Add DATABASE_URL to .env`),console.log(` ${Y.gray("2.")} Create migrations in migrations/ folder`),console.log(` ${Y.gray("3.")} Run: ${Y.cyan("bun db:migrate")} (apply migrations)`);console.log();let S=G.orm==="drizzle"?"https://orm.drizzle.team/docs":G.orm==="prisma"?"https://www.prisma.io/docs":"https://kysely.dev/docs";T.info(`Documentation: ${Y.cyan(S)}`)}catch($){if($ instanceof Error)T.error(Y.red(`Error: ${$.message}`));process.exit(1)}}E3();
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type PackageManager = "bun" | "npm" | "pnpm" | "yarn";
|
|
2
|
+
type Database = "postgresql" | "mysql" | "sqlite";
|
|
3
|
+
type ORM = "drizzle" | "prisma" | "kysely";
|
|
4
|
+
export declare function installDependencies(pm: PackageManager, orm: ORM, database: Database, includeStudio: boolean): Promise<void>;
|
|
5
|
+
export declare function addPackageScripts(orm: ORM, database: Database): Promise<void>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAIA,KAAK,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACtD,KAAK,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClD,KAAK,GAAG,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAkB3C,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ResolvedPaths {
|
|
2
|
+
clientDir: string;
|
|
3
|
+
clientFile: string;
|
|
4
|
+
schemaDir: string;
|
|
5
|
+
schemaFile: string;
|
|
6
|
+
migrateFile: string;
|
|
7
|
+
configFile: string;
|
|
8
|
+
migrationsDir: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolvePaths(srcDir: string | null, customPath?: string): ResolvedPaths;
|
|
11
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CAiCf"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ProjectInfo } from "./detector";
|
|
2
|
+
export interface SetupConfig {
|
|
3
|
+
orm: OrmType;
|
|
4
|
+
database: DatabaseType;
|
|
5
|
+
includeSchema: boolean;
|
|
6
|
+
includeStudio: boolean;
|
|
7
|
+
clientPath?: string;
|
|
8
|
+
}
|
|
9
|
+
type OrmType = "drizzle" | "prisma" | "kysely";
|
|
10
|
+
type DatabaseType = "postgresql" | "mysql" | "sqlite";
|
|
11
|
+
export declare function promptOrmSetup(project: ProjectInfo): Promise<SetupConfig>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/C,KAAK,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtD,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAsEtB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface Field {
|
|
2
|
+
name: string;
|
|
3
|
+
type: "string" | "number" | "boolean" | "date" | "uuid" | "text" | "json";
|
|
4
|
+
required?: boolean;
|
|
5
|
+
unique?: boolean;
|
|
6
|
+
default?: string | number | boolean;
|
|
7
|
+
isPrimaryKey?: boolean;
|
|
8
|
+
isAutoIncrement?: boolean;
|
|
9
|
+
length?: number;
|
|
10
|
+
references?: {
|
|
11
|
+
table: string;
|
|
12
|
+
field: string;
|
|
13
|
+
onDelete?: "cascade" | "set null" | "restrict";
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface TableDefinition {
|
|
17
|
+
name: string;
|
|
18
|
+
displayName: string;
|
|
19
|
+
fields: Field[];
|
|
20
|
+
relations?: Array<{
|
|
21
|
+
type: "one-to-many" | "many-to-one" | "many-to-many";
|
|
22
|
+
toTable: string;
|
|
23
|
+
fieldName: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export declare const userTable: TableDefinition;
|
|
27
|
+
export declare const postTable: TableDefinition;
|
|
28
|
+
export declare const commentTable: TableDefinition;
|
|
29
|
+
export declare const categoryTable: TableDefinition;
|
|
30
|
+
export declare const tagTable: TableDefinition;
|
|
31
|
+
export declare const productTable: TableDefinition;
|
|
32
|
+
export declare const orderTable: TableDefinition;
|
|
33
|
+
export declare const organizationTable: TableDefinition;
|
|
34
|
+
export declare const subscriptionTable: TableDefinition;
|
|
35
|
+
export interface SchemaTemplate {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
icon: string;
|
|
40
|
+
tables: TableDefinition[];
|
|
41
|
+
}
|
|
42
|
+
export declare const schemaTemplates: SchemaTemplate[];
|
|
43
|
+
export declare const allTables: TableDefinition[];
|
|
44
|
+
export declare function getTableByName(name: string): TableDefinition | undefined;
|
|
45
|
+
export declare function getTablesWithDependencies(tableNames: string[]): TableDefinition[];
|
|
46
|
+
//# sourceMappingURL=table-definitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-definitions.d.ts","sourceRoot":"","sources":["../../src/templates/table-definitions.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;KAChD,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;QACrD,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAMD,eAAO,MAAM,SAAS,EAAE,eAkBvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAwBvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eA0B1B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAU3B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,eAStB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAgB1B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAiCxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAY/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eA0B/B,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe,EAAE,cAAc,EA2C3C,CAAC;AAMF,eAAO,MAAM,SAAS,EAAE,eAAe,EAUtC,CAAC;AAGF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAExE;AAGD,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAAE,GACnB,eAAe,EAAE,CAuBnB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sidgaikwad/orm-setup",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Framework-agnostic CLI for setting up Drizzle, Prisma, or Kysely ORM with best practices",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"orm-setup": "./bin/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"bin",
|
|
14
|
+
"templates"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"dev": "bun run src/index.ts",
|
|
18
|
+
"build": "bun build src/index.ts --outdir dist --target node --minify && tsc --emitDeclarationOnly",
|
|
19
|
+
"prepublishOnly": "bun run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"orm",
|
|
23
|
+
"drizzle",
|
|
24
|
+
"prisma",
|
|
25
|
+
"kysely",
|
|
26
|
+
"database",
|
|
27
|
+
"cli",
|
|
28
|
+
"setup",
|
|
29
|
+
"postgresql",
|
|
30
|
+
"mysql",
|
|
31
|
+
"sqlite",
|
|
32
|
+
"typescript",
|
|
33
|
+
"bun"
|
|
34
|
+
],
|
|
35
|
+
"author": "Siddharth Gaikwad",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/sidgaikwad/orm-setup"
|
|
40
|
+
},
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/sidgaikwad/orm-setup/issues"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/sidgaikwad/orm-setup#readme",
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@clack/prompts": "^0.7.0",
|
|
47
|
+
"chalk": "^5.3.0",
|
|
48
|
+
"execa": "^8.0.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/bun": "latest",
|
|
52
|
+
"@types/node": "^20.11.0",
|
|
53
|
+
"typescript": "^5.3.3"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=18.0.0"
|
|
57
|
+
}
|
|
58
|
+
}
|