create-frootkit 1.0.1 → 1.1.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/dist/addons/agent.d.ts +6 -0
- package/dist/addons/agent.d.ts.map +1 -0
- package/dist/addons/agent.js +56 -0
- package/dist/addons/agent.js.map +1 -0
- package/dist/addons/database.d.ts +13 -0
- package/dist/addons/database.d.ts.map +1 -0
- package/dist/addons/database.js +82 -0
- package/dist/addons/database.js.map +1 -0
- package/dist/addons/docker.d.ts +6 -0
- package/dist/addons/docker.d.ts.map +1 -0
- package/dist/addons/docker.js +54 -0
- package/dist/addons/docker.js.map +1 -0
- package/dist/addons/linter.d.ts +7 -0
- package/dist/addons/linter.d.ts.map +1 -0
- package/dist/addons/linter.js +79 -0
- package/dist/addons/linter.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +300 -63
- package/dist/index.js.map +1 -1
- package/dist/scaffold.d.ts +6 -0
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +18 -1
- package/dist/scaffold.js.map +1 -1
- package/dist/template.d.ts.map +1 -1
- package/dist/template.js +28 -1
- package/dist/template.js.map +1 -1
- package/dist/ui.d.ts +43 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +196 -0
- package/dist/ui.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Coding Assistant Rules Add-on for create-frootkit
|
|
3
|
+
* Generates AGENT.md and .cursorrules specifically tailored for FrootKit projects.
|
|
4
|
+
*/
|
|
5
|
+
export declare function applyAgentAddon(files: Record<string, string>, projectName: string): void;
|
|
6
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/addons/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAmDxF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Coding Assistant Rules Add-on for create-frootkit
|
|
3
|
+
* Generates AGENT.md and .cursorrules specifically tailored for FrootKit projects.
|
|
4
|
+
*/
|
|
5
|
+
export function applyAgentAddon(files, projectName) {
|
|
6
|
+
files['AGENT.md'] = `# ${projectName} — AI Coding Assistant Guide
|
|
7
|
+
|
|
8
|
+
This project is built on **FrootKit**, the high-performance Next.js alternative powered by Preact SSR, App Router architecture, and Froot.
|
|
9
|
+
|
|
10
|
+
## Architectural Conventions
|
|
11
|
+
|
|
12
|
+
### 1. App Router File-Based Routing (\`src/app\`)
|
|
13
|
+
- **Pages:** \`src/app/**/page.tsx\` defines view routes.
|
|
14
|
+
- **Layouts:** \`src/app/**/layout.tsx\` defines nested layout boundaries.
|
|
15
|
+
- Receives \`children: ComponentChild\` and \`params\`.
|
|
16
|
+
- Root layout (\`src/app/layout.tsx\`) contains \`<html>\`, \`<head>\`, and \`<body>\`.
|
|
17
|
+
- Sub-layouts (e.g. \`src/app/docs/layout.tsx\`) must NOT repeat \`<html>\` or \`<body>\`.
|
|
18
|
+
- **API Routes:** \`src/app/api/**/route.ts\` defines HTTP endpoints.
|
|
19
|
+
- Export standard HTTP method handlers: \`GET\`, \`POST\`, \`PUT\`, \`DELETE\`, \`PATCH\`.
|
|
20
|
+
- Receive \`(request: Request, { params }: { params: Record<string, string> })\`.
|
|
21
|
+
- Return Web standard \`Response.json(...)\` or \`new Response(...)\`.
|
|
22
|
+
- **Dynamic Segments:**
|
|
23
|
+
- Single parameter: \`[slug]/page.tsx\` -> \`params.slug\`
|
|
24
|
+
- Catch-all: \`[...slug]/page.tsx\` -> wildcard match
|
|
25
|
+
|
|
26
|
+
### 2. Preact JSX Pragmas
|
|
27
|
+
Always include the Preact JSX directive at the top of \`.tsx\` files:
|
|
28
|
+
\`\`\`tsx
|
|
29
|
+
/** @jsxImportSource preact */
|
|
30
|
+
\`\`\`
|
|
31
|
+
|
|
32
|
+
### 3. Tailwind CSS v4
|
|
33
|
+
- Styled using Tailwind CSS v4 in \`src/styles.css\`.
|
|
34
|
+
- \`@import "tailwindcss";\` is the single required import.
|
|
35
|
+
- Customize design tokens directly with the \`@theme\` block.
|
|
36
|
+
|
|
37
|
+
### 4. Build and Production
|
|
38
|
+
- Build output goes into \`.froot/\` (hidden, like \`.next/\` in Next.js).
|
|
39
|
+
- Static pre-rendering (SSG) runs via \`frootkit build\`.
|
|
40
|
+
- Dynamic API routes and SSR are served via \`frootkit start\` or \`frootkit dev\`.
|
|
41
|
+
`;
|
|
42
|
+
files['.cursorrules'] = `# Cursor AI Rules for FrootKit Project
|
|
43
|
+
|
|
44
|
+
- Framework: FrootKit (Next.js alternative for Preact and Froot)
|
|
45
|
+
- Component engine: Preact (zero React runtime overhead)
|
|
46
|
+
- Routing: File-based App Router convention inside \`src/app\`
|
|
47
|
+
- Pages: \`page.tsx\`
|
|
48
|
+
- Layouts: \`layout.tsx\`
|
|
49
|
+
- API Routes: \`route.ts\` exporting named GET, POST, PUT, DELETE functions
|
|
50
|
+
- Top of all TSX files must include: /** @jsxImportSource preact */
|
|
51
|
+
- Never import from 'react' or 'react-dom'. Use 'preact'.
|
|
52
|
+
- CSS: Tailwind CSS v4 configured via \`src/styles.css\` with \`@import "tailwindcss";\` and \`@theme\`
|
|
53
|
+
- Build output is in \`.froot/\` — never commit \`.froot/\`
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/addons/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,eAAe,CAAC,KAA6B,EAAE,WAAmB;IAChF,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCrC,CAAC;IAEA,KAAK,CAAC,cAAc,CAAC,GAAG;;;;;;;;;;;;CAYzB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database & ORM Add-on for create-frootkit
|
|
3
|
+
* Injects Drizzle ORM or Prisma into generated FrootKit projects with SQLite starters.
|
|
4
|
+
*/
|
|
5
|
+
export type DatabaseOption = 'none' | 'drizzle' | 'prisma';
|
|
6
|
+
export interface PackageJsonLike {
|
|
7
|
+
scripts?: Record<string, string>;
|
|
8
|
+
dependencies?: Record<string, string>;
|
|
9
|
+
devDependencies?: Record<string, string>;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
export declare function applyDatabaseAddon(files: Record<string, string>, dbOption: DatabaseOption): void;
|
|
13
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/addons/database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,QAAQ,EAAE,cAAc,GACvB,IAAI,CAoFN"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database & ORM Add-on for create-frootkit
|
|
3
|
+
* Injects Drizzle ORM or Prisma into generated FrootKit projects with SQLite starters.
|
|
4
|
+
*/
|
|
5
|
+
export function applyDatabaseAddon(files, dbOption) {
|
|
6
|
+
if (dbOption === 'none')
|
|
7
|
+
return;
|
|
8
|
+
const pkgJsonStr = files['package.json'];
|
|
9
|
+
if (!pkgJsonStr)
|
|
10
|
+
return;
|
|
11
|
+
const pkg = JSON.parse(pkgJsonStr);
|
|
12
|
+
pkg.scripts = pkg.scripts || {};
|
|
13
|
+
pkg.dependencies = pkg.dependencies || {};
|
|
14
|
+
pkg.devDependencies = pkg.devDependencies || {};
|
|
15
|
+
if (dbOption === 'drizzle') {
|
|
16
|
+
pkg.dependencies['drizzle-orm'] = '^0.39.0';
|
|
17
|
+
pkg.dependencies['better-sqlite3'] = '^11.8.0';
|
|
18
|
+
pkg.devDependencies['@types/better-sqlite3'] = '^7.6.12';
|
|
19
|
+
pkg.devDependencies['drizzle-kit'] = '^0.30.0';
|
|
20
|
+
pkg.scripts['db:push'] = 'drizzle-kit push';
|
|
21
|
+
pkg.scripts['db:studio'] = 'drizzle-kit studio';
|
|
22
|
+
files['drizzle.config.ts'] = `import { defineConfig } from 'drizzle-kit';
|
|
23
|
+
|
|
24
|
+
export default defineConfig({
|
|
25
|
+
schema: './src/db/schema.ts',
|
|
26
|
+
out: './drizzle',
|
|
27
|
+
dialect: 'sqlite',
|
|
28
|
+
dbCredentials: {
|
|
29
|
+
url: 'sqlite.db',
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
`;
|
|
33
|
+
files['src/db/schema.ts'] = `import { sqliteTable, text } from 'drizzle-orm/sqlite-core';
|
|
34
|
+
|
|
35
|
+
export const users = sqliteTable('users', {
|
|
36
|
+
id: text('id').primaryKey(),
|
|
37
|
+
name: text('name').notNull(),
|
|
38
|
+
email: text('email').notNull().unique(),
|
|
39
|
+
createdAt: text('created_at').notNull().$defaultFn(() => new Date().toISOString()),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export type User = typeof users.$inferSelect;
|
|
43
|
+
export type NewUser = typeof users.$inferInsert;
|
|
44
|
+
`;
|
|
45
|
+
files['src/db/index.ts'] = `import Database from 'better-sqlite3';
|
|
46
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
47
|
+
import * as schema from './schema.js';
|
|
48
|
+
|
|
49
|
+
const sqlite = new Database('sqlite.db');
|
|
50
|
+
export const db = drizzle(sqlite, { schema });
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
else if (dbOption === 'prisma') {
|
|
54
|
+
pkg.dependencies['@prisma/client'] = '^6.4.0';
|
|
55
|
+
pkg.devDependencies['prisma'] = '^6.4.0';
|
|
56
|
+
pkg.scripts['db:generate'] = 'prisma generate';
|
|
57
|
+
pkg.scripts['db:push'] = 'prisma db push';
|
|
58
|
+
pkg.scripts['db:studio'] = 'prisma studio';
|
|
59
|
+
files['prisma/schema.prisma'] = `datasource db {
|
|
60
|
+
provider = "sqlite"
|
|
61
|
+
url = "file:./dev.db"
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
generator client {
|
|
65
|
+
provider = "prisma-client-js"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
model User {
|
|
69
|
+
id String @id @default(uuid())
|
|
70
|
+
email String @unique
|
|
71
|
+
name String
|
|
72
|
+
createdAt DateTime @default(now())
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
75
|
+
files['src/db/index.ts'] = `import { PrismaClient } from '@prisma/client';
|
|
76
|
+
|
|
77
|
+
export const prisma = new PrismaClient();
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
files['package.json'] = JSON.stringify(pkg, null, 2) + '\n';
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/addons/database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,UAAU,kBAAkB,CAChC,KAA6B,EAC7B,QAAwB;IAExB,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO;IAEhC,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,MAAM,GAAG,GAAoB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpD,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAChC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAC1C,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;IAEhD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QAC5C,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;QAC/C,GAAG,CAAC,eAAe,CAAC,uBAAuB,CAAC,GAAG,SAAS,CAAC;QACzD,GAAG,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QAE/C,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC;QAC5C,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,oBAAoB,CAAC;QAEhD,KAAK,CAAC,mBAAmB,CAAC,GAAG;;;;;;;;;;CAUhC,CAAC;QAEE,KAAK,CAAC,kBAAkB,CAAC,GAAG;;;;;;;;;;;CAW/B,CAAC;QAEE,KAAK,CAAC,iBAAiB,CAAC,GAAG;;;;;;CAM9B,CAAC;IACA,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC;QAC9C,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAEzC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,iBAAiB,CAAC;QAC/C,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC;QAC1C,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC;QAE3C,KAAK,CAAC,sBAAsB,CAAC,GAAG;;;;;;;;;;;;;;;CAenC,CAAC;QAEE,KAAK,CAAC,iBAAiB,CAAC,GAAG;;;CAG9B,CAAC;IACA,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Containerization Add-on for create-frootkit
|
|
3
|
+
* Multi-stage Dockerfile and docker-compose setup for FrootKit applications.
|
|
4
|
+
*/
|
|
5
|
+
export declare function applyDockerAddon(files: Record<string, string>, pkgManager?: 'pnpm' | 'npm' | 'yarn' | 'bun'): void;
|
|
6
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/addons/docker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,GAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAa,GAClD,IAAI,CAoDN"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Containerization Add-on for create-frootkit
|
|
3
|
+
* Multi-stage Dockerfile and docker-compose setup for FrootKit applications.
|
|
4
|
+
*/
|
|
5
|
+
export function applyDockerAddon(files, pkgManager = 'npm') {
|
|
6
|
+
const installCmd = pkgManager === 'pnpm'
|
|
7
|
+
? 'pnpm install --frozen-lockfile'
|
|
8
|
+
: pkgManager === 'bun'
|
|
9
|
+
? 'bun install --frozen-lockfile'
|
|
10
|
+
: pkgManager === 'yarn'
|
|
11
|
+
? 'yarn install --frozen-lockfile'
|
|
12
|
+
: 'npm ci';
|
|
13
|
+
files['Dockerfile'] = `# Multi-stage Dockerfile for FrootKit Application
|
|
14
|
+
FROM node:22-alpine AS builder
|
|
15
|
+
WORKDIR /app
|
|
16
|
+
|
|
17
|
+
COPY package*.json ./
|
|
18
|
+
${pkgManager === 'pnpm' ? 'RUN npm install -g pnpm && pnpm install --frozen-lockfile' : `RUN ${installCmd}`}
|
|
19
|
+
|
|
20
|
+
COPY . .
|
|
21
|
+
RUN npm run build
|
|
22
|
+
|
|
23
|
+
FROM node:22-alpine AS runner
|
|
24
|
+
WORKDIR /app
|
|
25
|
+
ENV NODE_ENV=production
|
|
26
|
+
ENV PORT=3000
|
|
27
|
+
|
|
28
|
+
COPY package*.json ./
|
|
29
|
+
${pkgManager === 'pnpm' ? 'RUN npm install -g pnpm && pnpm install --prod' : 'RUN npm ci --omit=dev'}
|
|
30
|
+
COPY --from=builder /app/.froot ./.froot
|
|
31
|
+
COPY --from=builder /app/dist ./dist 2>/dev/null || true
|
|
32
|
+
COPY --from=builder /app/src ./src
|
|
33
|
+
|
|
34
|
+
EXPOSE 3000
|
|
35
|
+
CMD ["npm", "run", "start"]
|
|
36
|
+
`;
|
|
37
|
+
files['docker-compose.yml'] = `services:
|
|
38
|
+
app:
|
|
39
|
+
build: .
|
|
40
|
+
ports:
|
|
41
|
+
- "3000:3000"
|
|
42
|
+
environment:
|
|
43
|
+
- NODE_ENV=production
|
|
44
|
+
- PORT=3000
|
|
45
|
+
restart: unless-stopped
|
|
46
|
+
`;
|
|
47
|
+
files['.dockerignore'] = `node_modules
|
|
48
|
+
.froot
|
|
49
|
+
dist
|
|
50
|
+
.git
|
|
51
|
+
*.log
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/addons/docker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,gBAAgB,CAC9B,KAA6B,EAC7B,aAA8C,KAAK;IAEnD,MAAM,UAAU,GACd,UAAU,KAAK,MAAM;QACnB,CAAC,CAAC,gCAAgC;QAClC,CAAC,CAAC,UAAU,KAAK,KAAK;YACpB,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,UAAU,KAAK,MAAM;gBACrB,CAAC,CAAC,gCAAgC;gBAClC,CAAC,CAAC,QAAQ,CAAC;IAEnB,KAAK,CAAC,YAAY,CAAC,GAAG;;;;;EAKtB,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,2DAA2D,CAAC,CAAC,CAAC,OAAO,UAAU,EAAE;;;;;;;;;;;EAWzG,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,uBAAuB;;;;;;;CAOnG,CAAC;IAEA,KAAK,CAAC,oBAAoB,CAAC,GAAG;;;;;;;;;CAS/B,CAAC;IAEA,KAAK,CAAC,eAAe,CAAC,GAAG;;;;;CAK1B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linter & Code Formatter Add-on for create-frootkit
|
|
3
|
+
* Injects Biome or ESLint + Prettier into generated FrootKit projects.
|
|
4
|
+
*/
|
|
5
|
+
export type LinterOption = 'none' | 'biome' | 'eslint';
|
|
6
|
+
export declare function applyLinterAddon(files: Record<string, string>, linter: LinterOption): void;
|
|
7
|
+
//# sourceMappingURL=linter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/addons/linter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AASvD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,EAAE,YAAY,GACnB,IAAI,CA8EN"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linter & Code Formatter Add-on for create-frootkit
|
|
3
|
+
* Injects Biome or ESLint + Prettier into generated FrootKit projects.
|
|
4
|
+
*/
|
|
5
|
+
export function applyLinterAddon(files, linter) {
|
|
6
|
+
if (linter === 'none')
|
|
7
|
+
return;
|
|
8
|
+
const pkgJsonStr = files['package.json'];
|
|
9
|
+
if (!pkgJsonStr)
|
|
10
|
+
return;
|
|
11
|
+
const pkg = JSON.parse(pkgJsonStr);
|
|
12
|
+
pkg.scripts = pkg.scripts || {};
|
|
13
|
+
pkg.devDependencies = pkg.devDependencies || {};
|
|
14
|
+
if (linter === 'biome') {
|
|
15
|
+
pkg.devDependencies['@biomejs/biome'] = '^1.9.4';
|
|
16
|
+
pkg.scripts['lint'] = 'biome lint src/';
|
|
17
|
+
pkg.scripts['format'] = 'biome format --write src/';
|
|
18
|
+
pkg.scripts['check'] = 'biome check src/';
|
|
19
|
+
files['biome.json'] = `{
|
|
20
|
+
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
|
21
|
+
"vcs": {
|
|
22
|
+
"enabled": true,
|
|
23
|
+
"clientKind": "git",
|
|
24
|
+
"useIgnoreFile": true
|
|
25
|
+
},
|
|
26
|
+
"files": {
|
|
27
|
+
"ignoreUnknown": false,
|
|
28
|
+
"ignore": ["node_modules", "dist", ".froot"]
|
|
29
|
+
},
|
|
30
|
+
"formatter": {
|
|
31
|
+
"enabled": true,
|
|
32
|
+
"indentStyle": "space",
|
|
33
|
+
"indentWidth": 2,
|
|
34
|
+
"lineWidth": 100
|
|
35
|
+
},
|
|
36
|
+
"linter": {
|
|
37
|
+
"enabled": true,
|
|
38
|
+
"rules": {
|
|
39
|
+
"recommended": true
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"javascript": {
|
|
43
|
+
"formatter": {
|
|
44
|
+
"quoteStyle": "single",
|
|
45
|
+
"semicolons": "always"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
else if (linter === 'eslint') {
|
|
52
|
+
pkg.devDependencies['eslint'] = '^9.20.0';
|
|
53
|
+
pkg.devDependencies['@eslint/js'] = '^9.20.0';
|
|
54
|
+
pkg.devDependencies['typescript-eslint'] = '^8.24.0';
|
|
55
|
+
pkg.devDependencies['prettier'] = '^3.5.0';
|
|
56
|
+
pkg.scripts['lint'] = 'eslint src/';
|
|
57
|
+
pkg.scripts['format'] = 'prettier --write "src/**/*.{ts,tsx,css,json}"';
|
|
58
|
+
files['eslint.config.js'] = `import js from '@eslint/js';
|
|
59
|
+
import tseslint from 'typescript-eslint';
|
|
60
|
+
|
|
61
|
+
export default tseslint.config(
|
|
62
|
+
js.configs.recommended,
|
|
63
|
+
...tseslint.configs.recommended,
|
|
64
|
+
{
|
|
65
|
+
ignores: ['node_modules/', 'dist/', '.froot/'],
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
`;
|
|
69
|
+
files['.prettierrc'] = `{
|
|
70
|
+
"singleQuote": true,
|
|
71
|
+
"semi": true,
|
|
72
|
+
"tabWidth": 2,
|
|
73
|
+
"trailingComma": "es5"
|
|
74
|
+
}
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
files['package.json'] = JSON.stringify(pkg, null, 2) + '\n';
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=linter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/addons/linter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,UAAU,gBAAgB,CAC9B,KAA6B,EAC7B,MAAoB;IAEpB,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO;IAE9B,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,MAAM,GAAG,GAAoB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpD,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAChC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;IAEhD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,GAAG,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC;QACjD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC;QACxC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,2BAA2B,CAAC;QACpD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC;QAE1C,KAAK,CAAC,YAAY,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BzB,CAAC;IACA,CAAC;SAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QAC1C,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;QAC9C,GAAG,CAAC,eAAe,CAAC,mBAAmB,CAAC,GAAG,SAAS,CAAC;QACrD,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;QAE3C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;QACpC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,+CAA+C,CAAC;QAExE,KAAK,CAAC,kBAAkB,CAAC,GAAG;;;;;;;;;;CAU/B,CAAC;QAEE,KAAK,CAAC,aAAa,CAAC,GAAG;;;;;;CAM1B,CAAC;IACA,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9D,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* create-frootkit CLI
|
|
4
|
-
* The official project
|
|
4
|
+
* The official project generator for FrootKit (Next.js Alternative).
|
|
5
5
|
*/
|
|
6
6
|
export * from './template.js';
|
|
7
7
|
export * from './scaffold.js';
|
|
8
|
+
export * from './ui.js';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAoBH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,88 +1,325 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* create-frootkit CLI
|
|
4
|
-
* The official project
|
|
4
|
+
* The official project generator for FrootKit (Next.js Alternative).
|
|
5
5
|
*/
|
|
6
|
-
import * as readline from 'node:readline/promises';
|
|
7
|
-
import { stdin as input, stdout as output } from 'node:process';
|
|
8
6
|
import * as path from 'node:path';
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { printBanner, printStep, printSuccess, printError, printNextSteps, promptSelect, promptText, promptConfirm, c, } from './ui.js';
|
|
9
10
|
import { scaffoldProject } from './scaffold.js';
|
|
10
11
|
export * from './template.js';
|
|
11
12
|
export * from './scaffold.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
export * from './ui.js';
|
|
14
|
+
const VERSION = '1.1.0';
|
|
15
|
+
function parseCliArgs(argv) {
|
|
16
|
+
const raw = argv.slice(2);
|
|
17
|
+
const args = {};
|
|
18
|
+
for (let i = 0; i < raw.length; i++) {
|
|
19
|
+
const item = raw[i];
|
|
20
|
+
if (item === '--help' || item === '-h') {
|
|
21
|
+
args.help = true;
|
|
22
|
+
}
|
|
23
|
+
else if (item === '--version' || item === '-v') {
|
|
24
|
+
args.version = true;
|
|
25
|
+
}
|
|
26
|
+
else if (item === '--schema' || item === '--json-schema') {
|
|
27
|
+
args.schema = true;
|
|
28
|
+
}
|
|
29
|
+
else if (item === '--yes' || item === '-y') {
|
|
30
|
+
args.yes = true;
|
|
31
|
+
}
|
|
32
|
+
else if (item === '--git') {
|
|
33
|
+
args.git = true;
|
|
34
|
+
}
|
|
35
|
+
else if (item === '--no-git') {
|
|
36
|
+
args.git = false;
|
|
37
|
+
}
|
|
38
|
+
else if (item === '--install') {
|
|
39
|
+
args.install = true;
|
|
40
|
+
}
|
|
41
|
+
else if (item === '--no-install') {
|
|
42
|
+
args.install = false;
|
|
43
|
+
}
|
|
44
|
+
else if (item === '--docker') {
|
|
45
|
+
args.docker = true;
|
|
46
|
+
}
|
|
47
|
+
else if (item === '--no-docker') {
|
|
48
|
+
args.docker = false;
|
|
49
|
+
}
|
|
50
|
+
else if (item === '--agent' || item === '--ai') {
|
|
51
|
+
args.agent = true;
|
|
52
|
+
}
|
|
53
|
+
else if (item === '--no-agent' || item === '--no-ai') {
|
|
54
|
+
args.agent = false;
|
|
55
|
+
}
|
|
56
|
+
else if (item === '--biome') {
|
|
57
|
+
args.linter = 'biome';
|
|
58
|
+
}
|
|
59
|
+
else if (item === '--eslint') {
|
|
60
|
+
args.linter = 'eslint';
|
|
61
|
+
}
|
|
62
|
+
else if (item === '--linter') {
|
|
63
|
+
args.linter = raw[++i];
|
|
64
|
+
}
|
|
65
|
+
else if (item.startsWith('--linter=')) {
|
|
66
|
+
args.linter = item.split('=')[1];
|
|
67
|
+
}
|
|
68
|
+
else if (item === '--drizzle') {
|
|
69
|
+
args.db = 'drizzle';
|
|
70
|
+
}
|
|
71
|
+
else if (item === '--prisma') {
|
|
72
|
+
args.db = 'prisma';
|
|
73
|
+
}
|
|
74
|
+
else if (item === '--db' || item === '--database') {
|
|
75
|
+
args.db = raw[++i];
|
|
76
|
+
}
|
|
77
|
+
else if (item.startsWith('--db=')) {
|
|
78
|
+
args.db = item.split('=')[1];
|
|
79
|
+
}
|
|
80
|
+
else if (item === '--pm') {
|
|
81
|
+
args.pkgManager = raw[++i];
|
|
82
|
+
}
|
|
83
|
+
else if (item.startsWith('--pm=')) {
|
|
84
|
+
args.pkgManager = item.split('=')[1];
|
|
85
|
+
}
|
|
86
|
+
else if (!item.startsWith('-') && !args.targetDir) {
|
|
87
|
+
args.targetDir = item;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return args;
|
|
91
|
+
}
|
|
92
|
+
function printUsage() {
|
|
93
|
+
console.log(`
|
|
94
|
+
${c.bold}Usage:${c.reset}
|
|
19
95
|
npm create frootkit [project-directory] [options]
|
|
96
|
+
pnpm create frootkit [project-directory] [options]
|
|
97
|
+
bun create frootkit [project-directory] [options]
|
|
20
98
|
npx create-frootkit [project-directory] [options]
|
|
21
99
|
|
|
22
|
-
Options
|
|
23
|
-
|
|
24
|
-
--
|
|
25
|
-
--
|
|
26
|
-
--
|
|
27
|
-
|
|
100
|
+
${c.bold}Options:${c.reset}
|
|
101
|
+
--pm <manager> Package manager: pnpm | npm | yarn | bun
|
|
102
|
+
--db <orm> Database ORM: none | drizzle | prisma
|
|
103
|
+
--linter <tool> Linter & formatter: none | biome | eslint
|
|
104
|
+
--docker / --no-docker Generate Dockerfile and docker-compose.yml
|
|
105
|
+
--agent / --no-agent Generate AGENT.md & .cursorrules for AI coding assistants
|
|
106
|
+
--git / --no-git Initialize git repository (default: true)
|
|
107
|
+
--install / --no-install Automatically install dependencies
|
|
108
|
+
--schema Output machine-readable JSON schema for AI agents
|
|
109
|
+
-y, --yes Accept all defaults non-interactively
|
|
110
|
+
-v, --version Display version
|
|
111
|
+
-h, --help Display help information
|
|
28
112
|
`);
|
|
29
|
-
|
|
113
|
+
}
|
|
114
|
+
function detectCurrentPackageManager() {
|
|
115
|
+
const ua = process.env['npm_config_user_agent'] || '';
|
|
116
|
+
if (ua.includes('pnpm'))
|
|
117
|
+
return 'pnpm';
|
|
118
|
+
if (ua.includes('bun'))
|
|
119
|
+
return 'bun';
|
|
120
|
+
if (ua.includes('yarn'))
|
|
121
|
+
return 'yarn';
|
|
122
|
+
return 'npm';
|
|
123
|
+
}
|
|
124
|
+
function printAgentSchema() {
|
|
125
|
+
const schema = {
|
|
126
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
127
|
+
name: 'create-frootkit',
|
|
128
|
+
version: VERSION,
|
|
129
|
+
description: 'CLI generator for scaffolding high-performance FrootKit (Next.js alternative) web applications',
|
|
130
|
+
usage: 'npm create frootkit [project-directory] [options]',
|
|
131
|
+
nonInteractiveFlag: '-y or --yes',
|
|
132
|
+
options: {
|
|
133
|
+
packageManager: {
|
|
134
|
+
flag: '--pm <manager>',
|
|
135
|
+
choices: ['pnpm', 'npm', 'yarn', 'bun'],
|
|
136
|
+
default: 'auto-detected',
|
|
137
|
+
description: 'Package manager for dependency installation',
|
|
138
|
+
},
|
|
139
|
+
database: {
|
|
140
|
+
flag: '--db <orm>',
|
|
141
|
+
choices: ['none', 'drizzle', 'prisma'],
|
|
142
|
+
default: 'none',
|
|
143
|
+
description: 'Database ORM integration with SQLite starter',
|
|
144
|
+
},
|
|
145
|
+
linter: {
|
|
146
|
+
flag: '--linter <tool>',
|
|
147
|
+
choices: ['none', 'biome', 'eslint'],
|
|
148
|
+
default: 'none',
|
|
149
|
+
description: 'Linter and code quality formatter',
|
|
150
|
+
},
|
|
151
|
+
docker: {
|
|
152
|
+
flag: '--docker / --no-docker',
|
|
153
|
+
type: 'boolean',
|
|
154
|
+
default: false,
|
|
155
|
+
description: 'Generate multi-stage Docker container setup',
|
|
156
|
+
},
|
|
157
|
+
agentRules: {
|
|
158
|
+
flag: '--agent / --no-agent',
|
|
159
|
+
type: 'boolean',
|
|
160
|
+
default: true,
|
|
161
|
+
description: 'Generate AGENT.md and .cursorrules for AI assistants',
|
|
162
|
+
},
|
|
163
|
+
git: {
|
|
164
|
+
flag: '--git / --no-git',
|
|
165
|
+
type: 'boolean',
|
|
166
|
+
default: true,
|
|
167
|
+
description: 'Initialize a Git repository',
|
|
168
|
+
},
|
|
169
|
+
install: {
|
|
170
|
+
flag: '--install / --no-install',
|
|
171
|
+
type: 'boolean',
|
|
172
|
+
default: false,
|
|
173
|
+
description: 'Automatically install dependencies',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
console.log(JSON.stringify(schema, null, 2));
|
|
178
|
+
}
|
|
179
|
+
async function main() {
|
|
180
|
+
const args = parseCliArgs(process.argv);
|
|
181
|
+
if (args.schema) {
|
|
182
|
+
printAgentSchema();
|
|
183
|
+
return;
|
|
30
184
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
185
|
+
if (args.version) {
|
|
186
|
+
console.log(`create-frootkit v${VERSION}`);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (args.help) {
|
|
190
|
+
printBanner(VERSION);
|
|
191
|
+
printUsage();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
printBanner(VERSION);
|
|
195
|
+
const detectedPm = detectCurrentPackageManager();
|
|
196
|
+
// 1. Target Directory & Project Name
|
|
197
|
+
let targetDir = args.targetDir;
|
|
198
|
+
if (!targetDir) {
|
|
199
|
+
if (args.yes) {
|
|
200
|
+
targetDir = 'my-frootkit-app';
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
printStep(1, 6, 'Project Directory');
|
|
204
|
+
targetDir = await promptText('Directory name:', 'my-frootkit-app', (input) => {
|
|
205
|
+
if (!input.trim())
|
|
206
|
+
return 'Project name cannot be empty';
|
|
207
|
+
return true;
|
|
208
|
+
});
|
|
209
|
+
console.log();
|
|
210
|
+
}
|
|
35
211
|
}
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
|
|
212
|
+
const resolvedTarget = path.resolve(process.cwd(), targetDir);
|
|
213
|
+
const projectName = path.basename(resolvedTarget);
|
|
214
|
+
if (fs.existsSync(resolvedTarget)) {
|
|
215
|
+
const existing = fs.readdirSync(resolvedTarget);
|
|
216
|
+
if (existing.length > 0 && !args.yes) {
|
|
217
|
+
const proceed = await promptConfirm(`Directory "${targetDir}" is not empty. Continue anyway?`, false);
|
|
218
|
+
if (!proceed) {
|
|
219
|
+
printError('Aborted by user.');
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
console.log();
|
|
223
|
+
}
|
|
40
224
|
}
|
|
41
|
-
|
|
42
|
-
|
|
225
|
+
// 2. Package Manager Selection
|
|
226
|
+
let pkgManager = args.pkgManager;
|
|
227
|
+
if (!pkgManager) {
|
|
228
|
+
if (args.yes) {
|
|
229
|
+
pkgManager = detectedPm;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
printStep(2, 6, 'Package Manager');
|
|
233
|
+
pkgManager = await promptSelect('Choose your package manager:', [
|
|
234
|
+
{ value: 'pnpm', label: 'pnpm', hint: 'Fast, disk space efficient (recommended)' },
|
|
235
|
+
{ value: 'npm', label: 'npm', hint: 'Standard Node.js package manager' },
|
|
236
|
+
{ value: 'bun', label: 'bun', hint: 'All-in-one JavaScript runtime & toolkit' },
|
|
237
|
+
{ value: 'yarn', label: 'yarn', hint: 'Classic package manager' },
|
|
238
|
+
], ['pnpm', 'npm', 'bun', 'yarn'].indexOf(detectedPm) >= 0
|
|
239
|
+
? ['pnpm', 'npm', 'bun', 'yarn'].indexOf(detectedPm)
|
|
240
|
+
: 0);
|
|
241
|
+
console.log();
|
|
242
|
+
}
|
|
43
243
|
}
|
|
44
|
-
|
|
45
|
-
|
|
244
|
+
// 3. Database ORM Selection
|
|
245
|
+
let db = args.db;
|
|
246
|
+
if (!db) {
|
|
247
|
+
if (args.yes) {
|
|
248
|
+
db = 'none';
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
printStep(3, 6, 'Database / ORM');
|
|
252
|
+
db = await promptSelect('Include a database integration?', [
|
|
253
|
+
{ value: 'none', label: 'None', hint: 'No database / static & API starters' },
|
|
254
|
+
{ value: 'drizzle', label: 'Drizzle ORM', hint: 'TypeScript ORM with SQLite starter & Studio' },
|
|
255
|
+
{ value: 'prisma', label: 'Prisma', hint: 'Next-gen ORM with SQLite starter' },
|
|
256
|
+
], 0);
|
|
257
|
+
console.log();
|
|
258
|
+
}
|
|
46
259
|
}
|
|
47
|
-
|
|
48
|
-
let
|
|
49
|
-
if (!
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
260
|
+
// 4. Linter & Formatter Selection
|
|
261
|
+
let linter = args.linter;
|
|
262
|
+
if (!linter) {
|
|
263
|
+
if (args.yes) {
|
|
264
|
+
linter = 'none';
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
printStep(4, 6, 'Linter & Formatter');
|
|
268
|
+
linter = await promptSelect('Include code quality and linting tools?', [
|
|
269
|
+
{ value: 'none', label: 'None', hint: 'Standard TypeScript compiler only' },
|
|
270
|
+
{ value: 'biome', label: 'Biome', hint: 'Ultra-fast Rust-based linter and formatter' },
|
|
271
|
+
{ value: 'eslint', label: 'ESLint + Prettier', hint: 'Classic ecosystem standard' },
|
|
272
|
+
], 0);
|
|
273
|
+
console.log();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// 5. AI Rules & Docker
|
|
277
|
+
let agent = args.agent ?? true;
|
|
278
|
+
let docker = args.docker ?? false;
|
|
279
|
+
// 6. Git & Install
|
|
280
|
+
let gitInit = args.git;
|
|
281
|
+
if (gitInit === undefined) {
|
|
282
|
+
if (args.yes) {
|
|
283
|
+
gitInit = true;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
printStep(5, 6, 'Git Repository');
|
|
287
|
+
gitInit = await promptConfirm('Initialize a new Git repository?', true);
|
|
288
|
+
console.log();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
let installDeps = args.install;
|
|
292
|
+
if (installDeps === undefined) {
|
|
293
|
+
if (args.yes) {
|
|
294
|
+
installDeps = false;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
printStep(6, 6, 'Dependencies');
|
|
298
|
+
installDeps = await promptConfirm(`Install dependencies with ${pkgManager}?`, true);
|
|
299
|
+
console.log();
|
|
300
|
+
}
|
|
63
301
|
}
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
const result = await scaffoldProject({
|
|
68
|
-
targetDir,
|
|
302
|
+
console.log(` Creating FrootKit application in ${c.cyan}${resolvedTarget}${c.reset}...`);
|
|
303
|
+
const scaffoldResult = await scaffoldProject({
|
|
304
|
+
targetDir: resolvedTarget,
|
|
69
305
|
projectName,
|
|
70
306
|
pkgManager,
|
|
307
|
+
db,
|
|
308
|
+
linter,
|
|
309
|
+
docker,
|
|
310
|
+
agent,
|
|
71
311
|
gitInit,
|
|
72
312
|
installDeps,
|
|
73
313
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
Server starts on http://localhost:3000
|
|
83
|
-
`);
|
|
314
|
+
printSuccess(`Created ${scaffoldResult.fileCount} project files`);
|
|
315
|
+
if (gitInit) {
|
|
316
|
+
printSuccess('Initialized Git repository');
|
|
317
|
+
}
|
|
318
|
+
if (installDeps) {
|
|
319
|
+
printSuccess(`Installed dependencies with ${pkgManager}`);
|
|
320
|
+
}
|
|
321
|
+
printNextSteps(targetDir, pkgManager, installDeps);
|
|
84
322
|
}
|
|
85
|
-
import { fileURLToPath } from 'node:url';
|
|
86
323
|
// Only execute when invoked directly as CLI
|
|
87
324
|
const thisFile = fileURLToPath(import.meta.url);
|
|
88
325
|
const invokedFile = process.argv[1] ? path.resolve(process.argv[1]) : '';
|
|
@@ -93,9 +330,9 @@ const isDirectCli = invokedFile === thisFile ||
|
|
|
93
330
|
invokedFile.endsWith('create-froot-fullstack') ||
|
|
94
331
|
invokedFile.endsWith('create-froot-fullstack\\dist\\index.js') ||
|
|
95
332
|
invokedFile.endsWith('create-froot-fullstack/dist/index.js');
|
|
96
|
-
if (isDirectCli
|
|
333
|
+
if (isDirectCli) {
|
|
97
334
|
main().catch((err) => {
|
|
98
|
-
|
|
335
|
+
printError(`Fatal error: ${err.message || err}`);
|
|
99
336
|
process.exit(1);
|
|
100
337
|
});
|
|
101
338
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { type DatabaseOption } from './addons/database.js';
|
|
2
|
+
import { type LinterOption } from './addons/linter.js';
|
|
1
3
|
export interface ScaffoldOptions {
|
|
2
4
|
targetDir: string;
|
|
3
5
|
projectName: string;
|
|
4
6
|
pkgManager?: 'pnpm' | 'npm' | 'yarn' | 'bun';
|
|
7
|
+
db?: DatabaseOption;
|
|
8
|
+
linter?: LinterOption;
|
|
9
|
+
docker?: boolean;
|
|
10
|
+
agent?: boolean;
|
|
5
11
|
gitInit?: boolean;
|
|
6
12
|
installDeps?: boolean;
|
|
7
13
|
}
|
package/dist/scaffold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMzE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAC7C,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAwD9F"}
|
package/dist/scaffold.js
CHANGED
|
@@ -3,11 +3,28 @@ import * as path from 'node:path';
|
|
|
3
3
|
import { exec } from 'node:child_process';
|
|
4
4
|
import { promisify } from 'node:util';
|
|
5
5
|
import { generateFrootKitTemplate } from './template.js';
|
|
6
|
+
import { applyDatabaseAddon } from './addons/database.js';
|
|
7
|
+
import { applyLinterAddon } from './addons/linter.js';
|
|
8
|
+
import { applyAgentAddon } from './addons/agent.js';
|
|
9
|
+
import { applyDockerAddon } from './addons/docker.js';
|
|
6
10
|
const execAsync = promisify(exec);
|
|
7
11
|
export async function scaffoldProject(options) {
|
|
8
|
-
const { targetDir, projectName, pkgManager = 'npm', gitInit = false, installDeps = false, } = options;
|
|
12
|
+
const { targetDir, projectName, pkgManager = 'npm', db = 'none', linter = 'none', docker = false, agent = true, gitInit = false, installDeps = false, } = options;
|
|
9
13
|
await fs.mkdir(targetDir, { recursive: true });
|
|
10
14
|
const files = generateFrootKitTemplate(projectName);
|
|
15
|
+
// Apply Add-ons
|
|
16
|
+
if (db !== 'none') {
|
|
17
|
+
applyDatabaseAddon(files, db);
|
|
18
|
+
}
|
|
19
|
+
if (linter !== 'none') {
|
|
20
|
+
applyLinterAddon(files, linter);
|
|
21
|
+
}
|
|
22
|
+
if (docker) {
|
|
23
|
+
applyDockerAddon(files, pkgManager);
|
|
24
|
+
}
|
|
25
|
+
if (agent) {
|
|
26
|
+
applyAgentAddon(files, projectName);
|
|
27
|
+
}
|
|
11
28
|
const filePaths = Object.keys(files);
|
|
12
29
|
for (const relPath of filePaths) {
|
|
13
30
|
const fullPath = path.join(targetDir, relPath);
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAuB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAqB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAclC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,MAAM,EACJ,SAAS,EACT,WAAW,EACX,UAAU,GAAG,KAAK,EAClB,EAAE,GAAG,MAAM,EACX,MAAM,GAAG,MAAM,EACf,MAAM,GAAG,KAAK,EACd,KAAK,GAAG,IAAI,EACZ,OAAO,GAAG,KAAK,EACf,WAAW,GAAG,KAAK,GACpB,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAEpD,gBAAgB;IAChB,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QAClB,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAE,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,GAAG,UAAU,UAAU,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;AACzC,CAAC"}
|
package/dist/template.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAyU7E;AAED,eAAO,MAAM,yBAAyB,iCAA2B,CAAC"}
|
package/dist/template.js
CHANGED
|
@@ -14,7 +14,8 @@ export function generateFrootKitTemplate(projectName) {
|
|
|
14
14
|
start: 'frootkit start',
|
|
15
15
|
},
|
|
16
16
|
dependencies: {
|
|
17
|
-
'froot-kit
|
|
17
|
+
frootkit: 'npm:froot-kit@^1.3.0',
|
|
18
|
+
'froot-kit': '^1.3.0',
|
|
18
19
|
frootjs: '^1.0.6',
|
|
19
20
|
preact: '^11.1.0',
|
|
20
21
|
'preact-render-to-string': '^6.8.2',
|
|
@@ -23,6 +24,7 @@ export function generateFrootKitTemplate(projectName) {
|
|
|
23
24
|
'@tailwindcss/cli': '^4.0.0',
|
|
24
25
|
tailwindcss: '^4.0.0',
|
|
25
26
|
'@types/node': '^22.10.0',
|
|
27
|
+
tsx: '^4.19.2',
|
|
26
28
|
typescript: '^5.8.0',
|
|
27
29
|
},
|
|
28
30
|
}, null, 2) + '\n',
|
|
@@ -146,6 +148,31 @@ export default function HomePage() {
|
|
|
146
148
|
</div>
|
|
147
149
|
);
|
|
148
150
|
}
|
|
151
|
+
`,
|
|
152
|
+
'src/app/api/health/route.ts': `/**
|
|
153
|
+
* Next.js-Style API Route for FrootKit.
|
|
154
|
+
* Runs directly on top of high-performance Froot router.
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
export async function GET() {
|
|
158
|
+
return Response.json({
|
|
159
|
+
status: 'ok',
|
|
160
|
+
timestamp: new Date().toISOString(),
|
|
161
|
+
framework: 'frootkit',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export async function POST(request: Request) {
|
|
166
|
+
const body = await request.json().catch(() => ({}));
|
|
167
|
+
return Response.json(
|
|
168
|
+
{
|
|
169
|
+
message: 'Payload received',
|
|
170
|
+
data: body,
|
|
171
|
+
receivedAt: new Date().toISOString(),
|
|
172
|
+
},
|
|
173
|
+
{ status: 201 }
|
|
174
|
+
);
|
|
175
|
+
}
|
|
149
176
|
`,
|
|
150
177
|
'src/app/docs/layout.tsx': `/** @jsxImportSource preact */
|
|
151
178
|
import type { ComponentChildren } from 'preact';
|
package/dist/template.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAC5B;YACE,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,GAAG,EAAE,cAAc;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,KAAK,EAAE,gBAAgB;aACxB;YACD,YAAY,EAAE;gBACZ,WAAW,EAAE,QAAQ;gBACrB,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,SAAS;gBACjB,yBAAyB,EAAE,QAAQ;aACpC;YACD,eAAe,EAAE;gBACf,kBAAkB,EAAE,QAAQ;gBAC5B,WAAW,EAAE,QAAQ;gBACrB,aAAa,EAAE,UAAU;gBACzB,UAAU,EAAE,QAAQ;aACrB;SACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI;QAER,eAAe,EAAE;;;;;;;;;;;;;CAapB;QAEG,YAAY,EAAE;;;;;;;;;;;;;;;CAejB;QAEG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BrB;QAEG,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BzB;QAEG,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BvB;QAEG,yBAAyB,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuB9B;QAEG,uBAAuB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B5B;QAEG,8BAA8B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCnC;QAEG,0BAA0B,EAAE;;;;;;;;;;;;;CAa/B;QAEG,4BAA4B,EAAE;;;;;;;;;;;;;;;;;CAiBjC;QAEG,WAAW,EAAE;;;;;;;;;;;;;;;;;;;CAmBhB;KACE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAC5B;YACE,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,GAAG,EAAE,cAAc;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,KAAK,EAAE,gBAAgB;aACxB;YACD,YAAY,EAAE;gBACZ,QAAQ,EAAE,sBAAsB;gBAChC,WAAW,EAAE,QAAQ;gBACrB,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,SAAS;gBACjB,yBAAyB,EAAE,QAAQ;aACpC;YACD,eAAe,EAAE;gBACf,kBAAkB,EAAE,QAAQ;gBAC5B,WAAW,EAAE,QAAQ;gBACrB,aAAa,EAAE,UAAU;gBACzB,GAAG,EAAE,SAAS;gBACd,UAAU,EAAE,QAAQ;aACrB;SACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI;QAER,eAAe,EAAE;;;;;;;;;;;;;CAapB;QAEG,YAAY,EAAE;;;;;;;;;;;;;;;CAejB;QAEG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BrB;QAEG,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BzB;QAEG,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BvB;QAEG,6BAA6B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;CAwBlC;QAEG,yBAAyB,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuB9B;QAEG,uBAAuB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B5B;QAEG,8BAA8B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCnC;QAEG,0BAA0B,EAAE;;;;;;;;;;;;;CAa/B;QAEG,4BAA4B,EAAE;;;;;;;;;;;;;;;;;CAiBjC;QAEG,WAAW,EAAE;;;;;;;;;;;;;;;;;;;CAmBhB;KACE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal UI and interactive prompt utilities for create-frootkit.
|
|
3
|
+
* Zero-dependency implementation with 24-bit RGB gradients, raw-mode TTY, and animated spinners.
|
|
4
|
+
*/
|
|
5
|
+
export declare const c: {
|
|
6
|
+
reset: string;
|
|
7
|
+
bold: string;
|
|
8
|
+
dim: string;
|
|
9
|
+
italic: string;
|
|
10
|
+
underline: string;
|
|
11
|
+
black: string;
|
|
12
|
+
red: string;
|
|
13
|
+
green: string;
|
|
14
|
+
yellow: string;
|
|
15
|
+
blue: string;
|
|
16
|
+
magenta: string;
|
|
17
|
+
cyan: string;
|
|
18
|
+
white: string;
|
|
19
|
+
gray: string;
|
|
20
|
+
emerald: string;
|
|
21
|
+
sky: string;
|
|
22
|
+
violet: string;
|
|
23
|
+
amber: string;
|
|
24
|
+
rose: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Apply a multi-color gradient across a line of text.
|
|
28
|
+
*/
|
|
29
|
+
export declare function gradientLine(text: string, stops?: [number, number, number][]): string;
|
|
30
|
+
export declare function printBanner(version?: string): void;
|
|
31
|
+
export declare function printStep(current: number, total: number, title: string): void;
|
|
32
|
+
export declare function printSuccess(message: string): void;
|
|
33
|
+
export declare function printError(message: string): void;
|
|
34
|
+
export interface SelectOption<T = string> {
|
|
35
|
+
value: T;
|
|
36
|
+
label: string;
|
|
37
|
+
hint?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function promptSelect<T = string>(title: string, options: SelectOption<T>[], defaultIndex?: number): Promise<T>;
|
|
40
|
+
export declare function promptConfirm(title: string, defaultVal?: boolean): Promise<boolean>;
|
|
41
|
+
export declare function promptText(title: string, defaultValue?: string, validate?: (val: string) => boolean | string): Promise<string>;
|
|
42
|
+
export declare function printNextSteps(projectDir: string, pkgManager: 'pnpm' | 'npm' | 'yarn' | 'bun', installed: boolean): void;
|
|
43
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;CAwBb,CAAC;AAiBF;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAI9B,GACA,MAAM,CAoBR;AAMD,wBAAgB,WAAW,CAAC,OAAO,SAAU,GAAG,IAAI,CAsBnD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI7E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAMD,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM;IACtC,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,CAAC,GAAG,MAAM,EAC3C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAC1B,YAAY,SAAI,GACf,OAAO,CAAC,CAAC,CAAC,CAyDZ;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAMtF;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,YAAY,SAAK,EACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,GAC3C,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,EAC3C,SAAS,EAAE,OAAO,GACjB,IAAI,CAiBN"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal UI and interactive prompt utilities for create-frootkit.
|
|
3
|
+
* Zero-dependency implementation with 24-bit RGB gradients, raw-mode TTY, and animated spinners.
|
|
4
|
+
*/
|
|
5
|
+
import * as readline from 'node:readline';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// ANSI Color & Styling Codes
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export const c = {
|
|
10
|
+
reset: '\x1b[0m',
|
|
11
|
+
bold: '\x1b[1m',
|
|
12
|
+
dim: '\x1b[2m',
|
|
13
|
+
italic: '\x1b[3m',
|
|
14
|
+
underline: '\x1b[4m',
|
|
15
|
+
// Foreground colors
|
|
16
|
+
black: '\x1b[30m',
|
|
17
|
+
red: '\x1b[31m',
|
|
18
|
+
green: '\x1b[32m',
|
|
19
|
+
yellow: '\x1b[33m',
|
|
20
|
+
blue: '\x1b[34m',
|
|
21
|
+
magenta: '\x1b[35m',
|
|
22
|
+
cyan: '\x1b[36m',
|
|
23
|
+
white: '\x1b[37m',
|
|
24
|
+
gray: '\x1b[90m',
|
|
25
|
+
// 24-bit RGB colors
|
|
26
|
+
emerald: '\x1b[38;2;16;185;129m',
|
|
27
|
+
sky: '\x1b[38;2;14;165;233m',
|
|
28
|
+
violet: '\x1b[38;2;168;85;247m',
|
|
29
|
+
amber: '\x1b[38;2;245;158;11m',
|
|
30
|
+
rose: '\x1b[38;2;244;63;94m',
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Interpolate RGB colors along a multi-stop gradient.
|
|
34
|
+
*/
|
|
35
|
+
function interpolateRgb(colorA, colorB, factor) {
|
|
36
|
+
return [
|
|
37
|
+
Math.round(colorA[0] + (colorB[0] - colorA[0]) * factor),
|
|
38
|
+
Math.round(colorA[1] + (colorB[1] - colorA[1]) * factor),
|
|
39
|
+
Math.round(colorA[2] + (colorB[2] - colorA[2]) * factor),
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Apply a multi-color gradient across a line of text.
|
|
44
|
+
*/
|
|
45
|
+
export function gradientLine(text, stops = [
|
|
46
|
+
[16, 185, 129], // Emerald
|
|
47
|
+
[14, 165, 233], // Sky
|
|
48
|
+
[168, 85, 247], // Violet
|
|
49
|
+
]) {
|
|
50
|
+
const len = text.length;
|
|
51
|
+
if (len === 0)
|
|
52
|
+
return '';
|
|
53
|
+
if (stops.length < 2)
|
|
54
|
+
return text;
|
|
55
|
+
let out = '';
|
|
56
|
+
for (let i = 0; i < len; i++) {
|
|
57
|
+
const progress = i / Math.max(1, len - 1);
|
|
58
|
+
const scaled = progress * (stops.length - 1);
|
|
59
|
+
const segmentIndex = Math.min(Math.floor(scaled), stops.length - 2);
|
|
60
|
+
const segmentFactor = scaled - segmentIndex;
|
|
61
|
+
const [r, g, b] = interpolateRgb(stops[segmentIndex], stops[segmentIndex + 1], segmentFactor);
|
|
62
|
+
out += `\x1b[38;2;${r};${g};${b}m${text[i]}`;
|
|
63
|
+
}
|
|
64
|
+
return out + c.reset;
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Header Banner
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
export function printBanner(version = '1.1.0') {
|
|
70
|
+
const logo = [
|
|
71
|
+
' ███████╗██████╗ ██████╗ ██████╗ ████████╗██╗ ██╗██╗████████╗',
|
|
72
|
+
' ██╔════╝██╔══██╗██╔═══██╗██╔═══██╗╚══██╔══╝██║ ██╔╝██║╚══██╔══╝',
|
|
73
|
+
' █████╗ ██████╔╝██║ ██║██║ ██║ ██║ █████╔╝ ██║ ██║ ',
|
|
74
|
+
' ██╔══╝ ██╔══██╗██║ ██║██║ ██║ ██║ ██╔═██╗ ██║ ██║ ',
|
|
75
|
+
' ██║ ██║ ██║╚██████╔╝╚██████╔╝ ██║ ██║ ██╗██║ ██║ ',
|
|
76
|
+
' ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ',
|
|
77
|
+
];
|
|
78
|
+
console.log();
|
|
79
|
+
for (const line of logo) {
|
|
80
|
+
console.log(gradientLine(line));
|
|
81
|
+
}
|
|
82
|
+
console.log();
|
|
83
|
+
console.log(` ${c.bold}FrootKit${c.reset} ${c.gray}v${version}${c.reset} — ${c.emerald}The Next.js Alternative for Preact & Froot${c.reset}`);
|
|
84
|
+
console.log(` ${c.dim}Next.js App Router • Dynamic Layouts • Tailwind CSS v4 • SSG Export • API Routes${c.reset}`);
|
|
85
|
+
console.log();
|
|
86
|
+
}
|
|
87
|
+
export function printStep(current, total, title) {
|
|
88
|
+
console.log(` ${c.emerald}${c.bold}[${current}/${total}]${c.reset} ${c.bold}${title}${c.reset}`);
|
|
89
|
+
}
|
|
90
|
+
export function printSuccess(message) {
|
|
91
|
+
console.log(` ${c.emerald}✓${c.reset} ${message}`);
|
|
92
|
+
}
|
|
93
|
+
export function printError(message) {
|
|
94
|
+
console.error(` ${c.rose}✕${c.reset} ${c.rose}${message}${c.reset}`);
|
|
95
|
+
}
|
|
96
|
+
export async function promptSelect(title, options, defaultIndex = 0) {
|
|
97
|
+
if (!process.stdin.isTTY) {
|
|
98
|
+
return options[defaultIndex].value;
|
|
99
|
+
}
|
|
100
|
+
let selected = Math.max(0, Math.min(defaultIndex, options.length - 1));
|
|
101
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
102
|
+
const render = (isInitial = false) => {
|
|
103
|
+
if (!isInitial) {
|
|
104
|
+
readline.moveCursor(process.stdout, 0, -options.length - 1);
|
|
105
|
+
}
|
|
106
|
+
console.log(` ${c.cyan}?${c.reset} ${c.bold}${title}${c.reset}`);
|
|
107
|
+
for (let i = 0; i < options.length; i++) {
|
|
108
|
+
const opt = options[i];
|
|
109
|
+
const isCurrent = i === selected;
|
|
110
|
+
const marker = isCurrent ? `${c.emerald}❯${c.reset}` : ' ';
|
|
111
|
+
const text = isCurrent
|
|
112
|
+
? `${c.bold}${c.emerald}${opt.label}${c.reset}`
|
|
113
|
+
: `${c.gray}${opt.label}${c.reset}`;
|
|
114
|
+
const hint = opt.hint ? ` ${c.dim}${opt.hint}${c.reset}` : '';
|
|
115
|
+
console.log(` ${marker} ${text}${hint}`);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
render(true);
|
|
119
|
+
return new Promise((resolve) => {
|
|
120
|
+
process.stdin.setRawMode(true);
|
|
121
|
+
process.stdin.resume();
|
|
122
|
+
const onKeypress = (_str, key) => {
|
|
123
|
+
if (!key)
|
|
124
|
+
return;
|
|
125
|
+
if (key.ctrl && key.name === 'c') {
|
|
126
|
+
process.stdin.setRawMode(false);
|
|
127
|
+
process.stdin.pause();
|
|
128
|
+
process.exit(130);
|
|
129
|
+
}
|
|
130
|
+
if (key.name === 'up' || (key.ctrl && key.name === 'p')) {
|
|
131
|
+
selected = (selected - 1 + options.length) % options.length;
|
|
132
|
+
render();
|
|
133
|
+
}
|
|
134
|
+
else if (key.name === 'down' || (key.ctrl && key.name === 'n')) {
|
|
135
|
+
selected = (selected + 1) % options.length;
|
|
136
|
+
render();
|
|
137
|
+
}
|
|
138
|
+
else if (key.name === 'return' || key.name === 'enter') {
|
|
139
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
140
|
+
process.stdin.setRawMode(false);
|
|
141
|
+
rl.close();
|
|
142
|
+
resolve(options[selected].value);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
readline.emitKeypressEvents(process.stdin, rl);
|
|
146
|
+
process.stdin.on('keypress', onKeypress);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
export async function promptConfirm(title, defaultVal = true) {
|
|
150
|
+
const defaultText = defaultVal ? 'Y/n' : 'y/N';
|
|
151
|
+
const answer = await promptText(`${title} (${defaultText})`, defaultVal ? 'y' : 'n');
|
|
152
|
+
const lower = answer.trim().toLowerCase();
|
|
153
|
+
if (lower === '')
|
|
154
|
+
return defaultVal;
|
|
155
|
+
return lower === 'y' || lower === 'yes';
|
|
156
|
+
}
|
|
157
|
+
export async function promptText(title, defaultValue = '', validate) {
|
|
158
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
159
|
+
const ask = () => {
|
|
160
|
+
return new Promise((resolve) => {
|
|
161
|
+
const hint = defaultValue ? ` ${c.dim}(${defaultValue})${c.reset}` : '';
|
|
162
|
+
rl.question(` ${c.cyan}?${c.reset} ${c.bold}${title}${hint}: `, (answer) => {
|
|
163
|
+
const val = answer.trim() || defaultValue;
|
|
164
|
+
if (validate) {
|
|
165
|
+
const res = validate(val);
|
|
166
|
+
if (res !== true) {
|
|
167
|
+
console.log(` ${c.rose}⚠ ${typeof res === 'string' ? res : 'Invalid input'}${c.reset}`);
|
|
168
|
+
return resolve(ask());
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
resolve(val);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
const result = await ask();
|
|
176
|
+
rl.close();
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
export function printNextSteps(projectDir, pkgManager, installed) {
|
|
180
|
+
const cdCmd = `cd ${projectDir}`;
|
|
181
|
+
const runCmd = pkgManager === 'npm' ? 'npm run dev' : `${pkgManager} dev`;
|
|
182
|
+
const buildCmd = pkgManager === 'npm' ? 'npm run build' : `${pkgManager} build`;
|
|
183
|
+
console.log(`
|
|
184
|
+
${c.bold}${c.emerald}Success! Created FrootKit application.${c.reset}
|
|
185
|
+
|
|
186
|
+
${c.bold}To get started:${c.reset}
|
|
187
|
+
${c.cyan}$ ${cdCmd}${c.reset}
|
|
188
|
+
${installed ? '' : `${c.cyan}$ ${pkgManager} install${c.reset}\n `}${c.cyan}$ ${runCmd}${c.reset}
|
|
189
|
+
|
|
190
|
+
${c.bold}Available Commands:${c.reset}
|
|
191
|
+
${c.dim}${runCmd.padEnd(20)}${c.reset} Starts development server with Tailwind hot-reload
|
|
192
|
+
${c.dim}${buildCmd.padEnd(20)}${c.reset} Builds production SSG HTML and assets into .froot/
|
|
193
|
+
${c.dim}${(pkgManager === 'npm' ? 'npm run start' : `${pkgManager} start`).padEnd(20)}${c.reset} Serves production build with dynamic API routes
|
|
194
|
+
`);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;IAEpB,oBAAoB;IACpB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,UAAU;IAEhB,oBAAoB;IACpB,OAAO,EAAE,uBAAuB;IAChC,GAAG,EAAE,uBAAuB;IAC5B,MAAM,EAAE,uBAAuB;IAC/B,KAAK,EAAE,uBAAuB;IAC9B,IAAI,EAAE,sBAAsB;CAC7B,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc,CACrB,MAAgC,EAChC,MAAgC,EAChC,MAAc;IAEd,OAAO;QACL,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;KACzD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,QAAoC;IAClC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,UAAU;IAC3B,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,MAAM;IACvB,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAG,SAAS;CAC3B;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACxB,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;QAE5C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,CAC9B,KAAK,CAAC,YAAY,CAAE,EACpB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAE,EACxB,aAAa,CACd,CAAC;QACF,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;AACvB,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,UAAU,WAAW,CAAC,OAAO,GAAG,OAAO;IAC3C,MAAM,IAAI,GAAG;QACX,mEAAmE;QACnE,mEAAmE;QACnE,mEAAmE;QACnE,mEAAmE;QACnE,mEAAmE;QACnE,mEAAmE;KACpE,CAAC;IAEF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,6CAA6C,CAAC,CAAC,KAAK,EAAE,CAClI,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,GAAG,mFAAmF,CAAC,CAAC,KAAK,EAAE,CACvG,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,KAAa,EAAE,KAAa;IACrE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CACrF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACxE,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAa,EACb,OAA0B,EAC1B,YAAY,GAAG,CAAC;IAEhB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,YAAY,CAAE,CAAC,KAAK,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAG,CAAC,SAAS,GAAG,KAAK,EAAE,EAAE;QACnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YACxB,MAAM,SAAS,GAAG,CAAC,KAAK,QAAQ,CAAC;YACjC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3D,MAAM,IAAI,GAAG,SAAS;gBACpB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;gBAC/C,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,EAAE;QAChC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAEvB,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,GAAiB,EAAE,EAAE;YACrD,IAAI,CAAC,GAAG;gBAAE,OAAO;YAEjB,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACxD,QAAQ,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC5D,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACjE,QAAQ,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC3C,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,UAAU,GAAG,IAAI;IAClE,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,KAAK,KAAK,WAAW,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,UAAU,CAAC;IACpC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAa,EACb,YAAY,GAAG,EAAE,EACjB,QAA4C;IAE5C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtF,MAAM,GAAG,GAAG,GAAoB,EAAE;QAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC1E,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC;gBAC1C,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAC1B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;wBACjB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;wBAC3F,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;IAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,UAA2C,EAC3C,SAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,UAAU,MAAM,CAAC;IAC1E,MAAM,QAAQ,GAAG,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,UAAU,QAAQ,CAAC;IAEhF,OAAO,CAAC,GAAG,CAAC;IACV,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,yCAAyC,CAAC,CAAC,KAAK;;IAElE,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,KAAK;MAC7B,CAAC,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK;MAC1B,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,WAAW,CAAC,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK;;IAEnG,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,KAAK;MACjC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK;MACnC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK;MACrC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,UAAU,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK;CAClG,CAAC,CAAC;AACH,CAAC"}
|