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.
@@ -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 scaffolder for FrootKit (Next.js Alternative).
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAOH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
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 scaffolder for FrootKit (Next.js Alternative).
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
- async function main() {
13
- const args = process.argv.slice(2);
14
- if (args.includes('-h') || args.includes('--help')) {
15
- console.log(`
16
- ▲ create-frootkit — The Next.js Alternative Project Scaffolder
17
-
18
- Usage:
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
- -y, --yes Accept all defaults non-interactively
24
- --pm <manager> Package manager: pnpm | npm | yarn | bun
25
- --git / --no-git Initialize git repository
26
- --install Install dependencies automatically
27
- -h, --help Show help message
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
- process.exit(0);
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
- let projectDir = args.find((a) => !a.startsWith('-')) || '';
32
- const isNonInteractive = args.includes('-y') || args.includes('--yes');
33
- if (!projectDir && isNonInteractive) {
34
- projectDir = 'my-frootkit-app';
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
- let pkgManager = 'npm';
37
- const pmArg = args.indexOf('--pm');
38
- if (pmArg !== -1 && args[pmArg + 1]) {
39
- pkgManager = args[pmArg + 1];
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
- else if (process.env.npm_config_user_agent?.includes('pnpm')) {
42
- pkgManager = 'pnpm';
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
- else if (process.env.npm_config_user_agent?.includes('bun')) {
45
- pkgManager = 'bun';
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
- let gitInit = args.includes('--git');
48
- let installDeps = args.includes('--install');
49
- if (!isNonInteractive) {
50
- const rl = readline.createInterface({ input, output });
51
- console.log(`
52
- ▲ FrootKit — Next.js Alternative Scaffolder
53
- ──────────────────────────────────────────
54
- `);
55
- if (!projectDir) {
56
- projectDir = (await rl.question(' Project directory: (my-frootkit-app) ')).trim() || 'my-frootkit-app';
57
- }
58
- const gitAnswer = (await rl.question(' Initialize git repository? (Y/n) ')).trim().toLowerCase();
59
- gitInit = gitAnswer === '' || gitAnswer === 'y' || gitAnswer === 'yes';
60
- const installAnswer = (await rl.question(` Install dependencies with ${pkgManager}? (y/N) `)).trim().toLowerCase();
61
- installDeps = installAnswer === 'y' || installAnswer === 'yes';
62
- rl.close();
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
- const targetDir = path.resolve(process.cwd(), projectDir);
65
- const projectName = path.basename(targetDir);
66
- console.log(`\n Creating FrootKit application in ${targetDir}...`);
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
- console.log(`
75
- ✓ Created ${result.fileCount} files
76
- ${gitInit ? '✓ Initialized git repository\n' : ''}
77
- Success! Next steps:
78
- $ cd ${projectDir}
79
- $ ${pkgManager} install
80
- $ ${pkgManager} run dev
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 && !process.env['NODE_TEST_CONTEXT']) {
333
+ if (isDirectCli) {
97
334
  main().catch((err) => {
98
- console.error('Fatal CLI error:', err);
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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"}
@@ -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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAQA,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,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,CAqC9F"}
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);
@@ -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;AAEzD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAUlC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,MAAM,EACJ,SAAS,EACT,WAAW,EACX,UAAU,GAAG,KAAK,EAClB,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;IACpD,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"}
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"}
@@ -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,CA6S7E;AAED,eAAO,MAAM,yBAAyB,iCAA2B,CAAC"}
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': '^1.2.2',
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';
@@ -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
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-frootkit",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Interactive CLI for scaffolding high-performance FrootKit (Next.js Alternative) applications",
5
5
  "type": "module",
6
6
  "bin": {