create-frootjs 1.0.6 → 1.0.7
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/database.d.ts +13 -0
- package/dist/addons/database.d.ts.map +1 -0
- package/dist/addons/database.js +85 -0
- package/dist/addons/database.js.map +1 -0
- package/dist/addons/docker.d.ts +12 -0
- package/dist/addons/docker.d.ts.map +1 -0
- package/dist/addons/docker.js +68 -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/addons/testing.d.ts +10 -0
- package/dist/addons/testing.d.ts.map +1 -0
- package/dist/addons/testing.js +62 -0
- package/dist/addons/testing.js.map +1 -0
- package/dist/generator.d.ts +7 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +18 -1
- package/dist/generator.js.map +1 -1
- package/dist/index.js +89 -9
- package/dist/index.js.map +1 -1
- package/dist/templates/modular.d.ts.map +1 -1
- package/dist/templates/modular.js +8 -1
- package/dist/templates/modular.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database & ORM Add-on for create-frootjs
|
|
3
|
+
* Injects Drizzle ORM or Prisma into generated 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,CAuFN"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database & ORM Add-on for create-frootjs
|
|
3
|
+
* Injects Drizzle ORM or Prisma into generated 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
|
+
export * from './schema.js';
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
else if (dbOption === 'prisma') {
|
|
55
|
+
pkg.dependencies['@prisma/client'] = '^6.4.0';
|
|
56
|
+
pkg.devDependencies['prisma'] = '^6.4.0';
|
|
57
|
+
pkg.scripts['db:push'] = 'prisma db push';
|
|
58
|
+
pkg.scripts['db:studio'] = 'prisma studio';
|
|
59
|
+
pkg.scripts['db:generate'] = 'prisma generate';
|
|
60
|
+
files['prisma/schema.prisma'] = `datasource db {
|
|
61
|
+
provider = "sqlite"
|
|
62
|
+
url = "file:./dev.db"
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
generator client {
|
|
66
|
+
provider = "prisma-client-js"
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
model User {
|
|
70
|
+
id String @id @default(cuid())
|
|
71
|
+
name String
|
|
72
|
+
email String @unique
|
|
73
|
+
createdAt DateTime @default(now())
|
|
74
|
+
}
|
|
75
|
+
`;
|
|
76
|
+
files['src/db/index.ts'] = `import { PrismaClient } from '@prisma/client';
|
|
77
|
+
|
|
78
|
+
export const prisma = new PrismaClient();
|
|
79
|
+
export * from '@prisma/client';
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
// Update package.json
|
|
83
|
+
files['package.json'] = JSON.stringify(pkg, null, 2) + '\n';
|
|
84
|
+
}
|
|
85
|
+
//# 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;;;;;;;CAO9B,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,SAAS,CAAC,GAAG,gBAAgB,CAAC;QAC1C,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,iBAAiB,CAAC;QAE/C,KAAK,CAAC,sBAAsB,CAAC,GAAG;;;;;;;;;;;;;;;CAenC,CAAC;QAEE,KAAK,CAAC,iBAAiB,CAAC,GAAG;;;;CAI9B,CAAC;IACA,CAAC;IAED,sBAAsB;IACtB,KAAK,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker & Containerization Add-on for create-frootjs
|
|
3
|
+
* Generates production-ready multi-stage Dockerfile, docker-compose.yml, and .dockerignore.
|
|
4
|
+
*/
|
|
5
|
+
export interface DockerAddonConfig {
|
|
6
|
+
projectName: string;
|
|
7
|
+
pkgManager: 'pnpm' | 'npm' | 'yarn' | 'bun';
|
|
8
|
+
entryPoint: 'dist/server.js' | 'dist/index.js';
|
|
9
|
+
port?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function applyDockerAddon(files: Record<string, string>, config: DockerAddonConfig): void;
|
|
12
|
+
//# 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,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAC5C,UAAU,EAAE,gBAAgB,GAAG,eAAe,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAiEN"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker & Containerization Add-on for create-frootjs
|
|
3
|
+
* Generates production-ready multi-stage Dockerfile, docker-compose.yml, and .dockerignore.
|
|
4
|
+
*/
|
|
5
|
+
export function applyDockerAddon(files, config) {
|
|
6
|
+
const { projectName, pkgManager, entryPoint, port = 3000 } = config;
|
|
7
|
+
// 1. .dockerignore
|
|
8
|
+
files['.dockerignore'] = `node_modules/
|
|
9
|
+
dist/
|
|
10
|
+
.git/
|
|
11
|
+
.gitignore
|
|
12
|
+
.env
|
|
13
|
+
.env.local
|
|
14
|
+
*.log
|
|
15
|
+
.pnpm-store/
|
|
16
|
+
npm-debug.log*
|
|
17
|
+
yarn-debug.log*
|
|
18
|
+
yarn-error.log*
|
|
19
|
+
`;
|
|
20
|
+
// 2. Multi-stage Dockerfile
|
|
21
|
+
files['Dockerfile'] = `# Stage 1: Build & bundle
|
|
22
|
+
FROM node:22-alpine AS builder
|
|
23
|
+
WORKDIR /app
|
|
24
|
+
|
|
25
|
+
# Enable Corepack for pnpm/yarn
|
|
26
|
+
RUN corepack enable
|
|
27
|
+
|
|
28
|
+
COPY package*.json ./
|
|
29
|
+
${pkgManager === 'pnpm' ? 'COPY pnpm-lock.yaml ./\nRUN pnpm install --frozen-lockfile' : ''}${pkgManager === 'npm' ? 'COPY package-lock.json* ./\nRUN npm ci' : ''}${pkgManager === 'yarn' ? 'COPY yarn.lock* ./\nRUN yarn install --frozen-lockfile' : ''}${pkgManager === 'bun' ? 'RUN npm install -g bun && bun install' : ''}
|
|
30
|
+
|
|
31
|
+
COPY tsconfig.json ./
|
|
32
|
+
COPY src/ ./src/
|
|
33
|
+
${files['drizzle.config.ts'] ? 'COPY drizzle.config.ts ./\n' : ''}${files['prisma/schema.prisma'] ? 'COPY prisma/ ./prisma/\nRUN npx prisma generate\n' : ''}
|
|
34
|
+
RUN ${pkgManager === 'bun' ? 'bun' : 'npm'} run build
|
|
35
|
+
|
|
36
|
+
# Stage 2: Lean Production Runtime
|
|
37
|
+
FROM node:22-alpine AS runner
|
|
38
|
+
WORKDIR /app
|
|
39
|
+
|
|
40
|
+
ENV NODE_ENV=production
|
|
41
|
+
ENV PORT=${port}
|
|
42
|
+
|
|
43
|
+
# Run as non-root user
|
|
44
|
+
USER node
|
|
45
|
+
|
|
46
|
+
COPY --from=builder --chown=node:node /app/package*.json ./
|
|
47
|
+
COPY --from=builder --chown=node:node /app/node_modules/ ./node_modules/
|
|
48
|
+
COPY --from=builder --chown=node:node /app/dist/ ./dist/
|
|
49
|
+
|
|
50
|
+
EXPOSE ${port}
|
|
51
|
+
|
|
52
|
+
CMD ["node", "${entryPoint}"]
|
|
53
|
+
`;
|
|
54
|
+
// 3. docker-compose.yml
|
|
55
|
+
files['docker-compose.yml'] = `services:
|
|
56
|
+
${projectName}:
|
|
57
|
+
build:
|
|
58
|
+
context: .
|
|
59
|
+
dockerfile: Dockerfile
|
|
60
|
+
ports:
|
|
61
|
+
- "${port}:${port}"
|
|
62
|
+
environment:
|
|
63
|
+
- NODE_ENV=production
|
|
64
|
+
- PORT=${port}
|
|
65
|
+
restart: unless-stopped
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/addons/docker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,UAAU,gBAAgB,CAC9B,KAA6B,EAC7B,MAAyB;IAEzB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAEpE,mBAAmB;IACnB,KAAK,CAAC,eAAe,CAAC,GAAG;;;;;;;;;;;CAW1B,CAAC;IAEA,4BAA4B;IAC5B,KAAK,CAAC,YAAY,CAAC,GAAG;;;;;;;;EAQtB,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,4DAA4D,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,EAAE;;;;EAI9T,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE;MACtJ,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;;;;;;;WAO/B,IAAI;;;;;;;;;SASN,IAAI;;gBAEG,UAAU;CACzB,CAAC;IAEA,wBAAwB;IACxB,KAAK,CAAC,oBAAoB,CAAC,GAAG;IAC5B,WAAW;;;;;WAKJ,IAAI,IAAI,IAAI;;;eAGR,IAAI;;CAElB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linter & Code Formatter Add-on for create-frootjs
|
|
3
|
+
* Injects Biome (Rust-based ultra-fast linter) or ESLint + Prettier into generated 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-frootjs
|
|
3
|
+
* Injects Biome (Rust-based ultra-fast linter) or ESLint + Prettier into generated 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"]
|
|
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.21.0';
|
|
53
|
+
pkg.devDependencies['@eslint/js'] = '^9.21.0';
|
|
54
|
+
pkg.devDependencies['typescript-eslint'] = '^8.25.0';
|
|
55
|
+
pkg.devDependencies['prettier'] = '^3.5.0';
|
|
56
|
+
pkg.scripts['lint'] = 'eslint src/';
|
|
57
|
+
pkg.scripts['format'] = 'prettier --write src/';
|
|
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: ['dist/**', 'node_modules/**'],
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
`;
|
|
69
|
+
files['.prettierrc'] = `{
|
|
70
|
+
"semi": true,
|
|
71
|
+
"singleQuote": 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,uBAAuB,CAAC;QAEhD,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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Framework Add-on for create-frootjs
|
|
3
|
+
* Injects Vitest or Node:test suite into generated Froot projects.
|
|
4
|
+
*/
|
|
5
|
+
export type TestingOption = 'none' | 'vitest' | 'node';
|
|
6
|
+
export interface TestingAddonOptions {
|
|
7
|
+
projectName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function applyTestingAddon(files: Record<string, string>, testing: TestingOption, options: TestingAddonOptions): void;
|
|
10
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/addons/testing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AASD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,mBAAmB,GAC3B,IAAI,CA4DN"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Framework Add-on for create-frootjs
|
|
3
|
+
* Injects Vitest or Node:test suite into generated Froot projects.
|
|
4
|
+
*/
|
|
5
|
+
export function applyTestingAddon(files, testing, options) {
|
|
6
|
+
if (testing === '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
|
+
// Resolve where app is exported
|
|
15
|
+
let appImport = '../src/index.js';
|
|
16
|
+
if (files['src/app.ts']) {
|
|
17
|
+
appImport = '../src/app.js';
|
|
18
|
+
}
|
|
19
|
+
else if (files['src/server.ts']) {
|
|
20
|
+
appImport = '../src/server.js';
|
|
21
|
+
}
|
|
22
|
+
if (testing === 'vitest') {
|
|
23
|
+
pkg.devDependencies['vitest'] = '^3.0.0';
|
|
24
|
+
pkg.scripts['test'] = 'vitest run';
|
|
25
|
+
pkg.scripts['test:watch'] = 'vitest';
|
|
26
|
+
files['vitest.config.ts'] = `import { defineConfig } from 'vitest/config';
|
|
27
|
+
|
|
28
|
+
export default defineConfig({
|
|
29
|
+
test: {
|
|
30
|
+
environment: 'node',
|
|
31
|
+
globals: true,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
`;
|
|
35
|
+
files['tests/app.test.ts'] = `import { describe, it, expect } from 'vitest';
|
|
36
|
+
import { app } from '${appImport}';
|
|
37
|
+
|
|
38
|
+
describe('${options.projectName} HTTP tests', () => {
|
|
39
|
+
it('responds with status 200 on GET /', async () => {
|
|
40
|
+
const res = await app.fetch(new Request('http://localhost/'));
|
|
41
|
+
expect(res.status).toBe(200);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
else if (testing === 'node') {
|
|
47
|
+
pkg.scripts['test'] = 'node --test tests/*.test.ts';
|
|
48
|
+
files['tests/app.test.ts'] = `import { describe, it } from 'node:test';
|
|
49
|
+
import assert from 'node:assert/strict';
|
|
50
|
+
import { app } from '${appImport}';
|
|
51
|
+
|
|
52
|
+
describe('${options.projectName} HTTP tests', () => {
|
|
53
|
+
it('responds with status 200 on GET /', async () => {
|
|
54
|
+
const res = await app.fetch(new Request('http://localhost/'));
|
|
55
|
+
assert.equal(res.status, 200);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
files['package.json'] = JSON.stringify(pkg, null, 2) + '\n';
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/addons/testing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,UAAU,iBAAiB,CAC/B,KAA6B,EAC7B,OAAsB,EACtB,OAA4B;IAE5B,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO;IAE/B,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,gCAAgC;IAChC,IAAI,SAAS,GAAG,iBAAiB,CAAC;IAClC,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACxB,SAAS,GAAG,eAAe,CAAC;IAC9B,CAAC;SAAM,IAAI,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QAClC,SAAS,GAAG,kBAAkB,CAAC;IACjC,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QACzC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;QACnC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;QAErC,KAAK,CAAC,kBAAkB,CAAC,GAAG;;;;;;;;CAQ/B,CAAC;QAEE,KAAK,CAAC,mBAAmB,CAAC,GAAG;uBACV,SAAS;;YAEpB,OAAO,CAAC,WAAW;;;;;;CAM9B,CAAC;IACA,CAAC;SAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC9B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,6BAA6B,CAAC;QAEpD,KAAK,CAAC,mBAAmB,CAAC,GAAG;;uBAEV,SAAS;;YAEpB,OAAO,CAAC,WAAW;;;;;;CAM9B,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/generator.d.ts
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
* Writes template files to disk, initializes git, and executes dependency installation with animated spinners.
|
|
4
4
|
*/
|
|
5
5
|
import { TemplateDefinition } from './templates/index.js';
|
|
6
|
+
import { DatabaseOption } from './addons/database.js';
|
|
7
|
+
import { LinterOption } from './addons/linter.js';
|
|
8
|
+
import { TestingOption } from './addons/testing.js';
|
|
6
9
|
export interface ScaffoldOptions {
|
|
7
10
|
targetDir: string;
|
|
8
11
|
projectName: string;
|
|
@@ -10,6 +13,10 @@ export interface ScaffoldOptions {
|
|
|
10
13
|
pkgManager: 'pnpm' | 'npm' | 'yarn' | 'bun';
|
|
11
14
|
gitInit: boolean;
|
|
12
15
|
installDeps: boolean;
|
|
16
|
+
database?: DatabaseOption;
|
|
17
|
+
docker?: boolean;
|
|
18
|
+
linter?: LinterOption;
|
|
19
|
+
testing?: TestingOption;
|
|
13
20
|
}
|
|
14
21
|
export interface ScaffoldResult {
|
|
15
22
|
targetDir: string;
|
package/dist/generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAIvE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA0EvF"}
|
package/dist/generator.js
CHANGED
|
@@ -7,14 +7,31 @@ import * as path from 'node:path';
|
|
|
7
7
|
import { exec } from 'node:child_process';
|
|
8
8
|
import { promisify } from 'node:util';
|
|
9
9
|
import { c, Spinner } from './ui.js';
|
|
10
|
+
import { applyDatabaseAddon } from './addons/database.js';
|
|
11
|
+
import { applyDockerAddon } from './addons/docker.js';
|
|
12
|
+
import { applyLinterAddon } from './addons/linter.js';
|
|
13
|
+
import { applyTestingAddon } from './addons/testing.js';
|
|
10
14
|
const execAsync = promisify(exec);
|
|
11
15
|
export async function scaffoldProject(options) {
|
|
12
|
-
const { targetDir, projectName, template, pkgManager, gitInit, installDeps } = options;
|
|
16
|
+
const { targetDir, projectName, template, pkgManager, gitInit, installDeps, database, docker, linter, testing } = options;
|
|
13
17
|
// 1. Ensure target directory exists
|
|
14
18
|
await fs.mkdir(targetDir, { recursive: true });
|
|
15
19
|
// 2. Generate files map from template
|
|
16
20
|
const writeSpinner = new Spinner(`Scaffolding ${template.name} template`).start();
|
|
17
21
|
const files = template.generate(projectName);
|
|
22
|
+
if (database && database !== 'none') {
|
|
23
|
+
applyDatabaseAddon(files, database);
|
|
24
|
+
}
|
|
25
|
+
if (docker) {
|
|
26
|
+
const entryPoint = template.id === 'minimal' ? 'dist/index.js' : 'dist/server.js';
|
|
27
|
+
applyDockerAddon(files, { projectName, pkgManager, entryPoint });
|
|
28
|
+
}
|
|
29
|
+
if (linter && linter !== 'none') {
|
|
30
|
+
applyLinterAddon(files, linter);
|
|
31
|
+
}
|
|
32
|
+
if (testing && testing !== 'none') {
|
|
33
|
+
applyTestingAddon(files, testing, { projectName });
|
|
34
|
+
}
|
|
18
35
|
const fileKeys = Object.keys(files);
|
|
19
36
|
// 3. Write each file to destination
|
|
20
37
|
for (const relativePath of fileKeys) {
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,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;AAEtC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAgB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import * as fs from 'node:fs';
|
|
|
8
8
|
import { printBanner, printStep, printError, printNextSteps, promptText, promptSelect, promptConfirm, c, } from './ui.js';
|
|
9
9
|
import { TEMPLATES, TEMPLATE_LIST, getTemplate } from './templates/index.js';
|
|
10
10
|
import { scaffoldProject } from './generator.js';
|
|
11
|
-
const VERSION = '1.0.
|
|
11
|
+
const VERSION = '1.0.7';
|
|
12
12
|
function parseCliArgs(argv) {
|
|
13
13
|
const args = {};
|
|
14
14
|
const raw = argv.slice(2);
|
|
@@ -35,6 +35,33 @@ function parseCliArgs(argv) {
|
|
|
35
35
|
else if (item === '--no-install') {
|
|
36
36
|
args.install = false;
|
|
37
37
|
}
|
|
38
|
+
else if (item === '--docker') {
|
|
39
|
+
args.docker = true;
|
|
40
|
+
}
|
|
41
|
+
else if (item === '--no-docker') {
|
|
42
|
+
args.docker = false;
|
|
43
|
+
}
|
|
44
|
+
else if (item === '--biome') {
|
|
45
|
+
args.linter = 'biome';
|
|
46
|
+
}
|
|
47
|
+
else if (item === '--eslint') {
|
|
48
|
+
args.linter = 'eslint';
|
|
49
|
+
}
|
|
50
|
+
else if (item === '--linter') {
|
|
51
|
+
args.linter = raw[++i];
|
|
52
|
+
}
|
|
53
|
+
else if (item.startsWith('--linter=')) {
|
|
54
|
+
args.linter = item.split('=')[1];
|
|
55
|
+
}
|
|
56
|
+
else if (item === '--vitest') {
|
|
57
|
+
args.testing = 'vitest';
|
|
58
|
+
}
|
|
59
|
+
else if (item === '--test' || item === '--testing') {
|
|
60
|
+
args.testing = raw[++i];
|
|
61
|
+
}
|
|
62
|
+
else if (item.startsWith('--testing=') || item.startsWith('--test=')) {
|
|
63
|
+
args.testing = item.split('=')[1];
|
|
64
|
+
}
|
|
38
65
|
else if (item === '--template' || item === '-t') {
|
|
39
66
|
args.template = raw[++i];
|
|
40
67
|
}
|
|
@@ -47,6 +74,12 @@ function parseCliArgs(argv) {
|
|
|
47
74
|
else if (item.startsWith('--pm=')) {
|
|
48
75
|
args.pkgManager = item.split('=')[1];
|
|
49
76
|
}
|
|
77
|
+
else if (item === '--db' || item === '--database') {
|
|
78
|
+
args.db = raw[++i];
|
|
79
|
+
}
|
|
80
|
+
else if (item.startsWith('--db=')) {
|
|
81
|
+
args.db = item.split('=')[1];
|
|
82
|
+
}
|
|
50
83
|
else if (!item.startsWith('-') && !args.targetDir) {
|
|
51
84
|
args.targetDir = item;
|
|
52
85
|
}
|
|
@@ -69,6 +102,10 @@ function printUsage() {
|
|
|
69
102
|
• fullstack Server-rendered JSX views
|
|
70
103
|
• minimal Lean single-file starter
|
|
71
104
|
--pm <manager> Package manager: pnpm | npm | yarn | bun
|
|
105
|
+
--db <orm> Database ORM: none | drizzle | prisma
|
|
106
|
+
--linter <tool> Linter & formatter: none | biome | eslint
|
|
107
|
+
--test <tool> Testing framework: none | vitest | node
|
|
108
|
+
--docker / --no-docker Generate Docker setup
|
|
72
109
|
--git / --no-git Initialize a git repository
|
|
73
110
|
--install / --no-install Automatically install dependencies
|
|
74
111
|
-y, --yes Accept all defaults non-interactively
|
|
@@ -106,7 +143,7 @@ async function main() {
|
|
|
106
143
|
targetDir = 'froot-app';
|
|
107
144
|
}
|
|
108
145
|
else {
|
|
109
|
-
printStep(1,
|
|
146
|
+
printStep(1, 7, 'Directory');
|
|
110
147
|
targetDir = await promptText('Project directory:', 'my-froot-app', (input) => {
|
|
111
148
|
if (!input.trim())
|
|
112
149
|
return 'Project name cannot be empty';
|
|
@@ -121,7 +158,7 @@ async function main() {
|
|
|
121
158
|
if (fs.existsSync(resolvedTarget)) {
|
|
122
159
|
const existingFiles = fs.readdirSync(resolvedTarget);
|
|
123
160
|
if (existingFiles.length > 0 && !args.yes) {
|
|
124
|
-
printStep(1,
|
|
161
|
+
printStep(1, 7, 'Directory warning');
|
|
125
162
|
const proceed = await promptConfirm(`Directory "${targetDir}" is not empty. Continue?`, false);
|
|
126
163
|
console.log();
|
|
127
164
|
if (!proceed) {
|
|
@@ -142,7 +179,7 @@ async function main() {
|
|
|
142
179
|
selectedTemplate = TEMPLATES['mvc'];
|
|
143
180
|
}
|
|
144
181
|
else {
|
|
145
|
-
printStep(2,
|
|
182
|
+
printStep(2, 7, 'Template');
|
|
146
183
|
const choice = await promptSelect('Select a template:', TEMPLATE_LIST.map((t) => ({
|
|
147
184
|
value: t.id,
|
|
148
185
|
label: t.name,
|
|
@@ -152,11 +189,44 @@ async function main() {
|
|
|
152
189
|
console.log();
|
|
153
190
|
}
|
|
154
191
|
}
|
|
155
|
-
// 3.
|
|
192
|
+
// 3. Database ORM Selection
|
|
193
|
+
let dbOption = args.db || 'none';
|
|
194
|
+
if (!args.db && !args.yes) {
|
|
195
|
+
printStep(3, 7, 'Database');
|
|
196
|
+
dbOption = await promptSelect('Include database ORM?', [
|
|
197
|
+
{ value: 'none', label: 'None', hint: 'In-memory / no database' },
|
|
198
|
+
{ value: 'drizzle', label: 'Drizzle', hint: 'Drizzle ORM & SQLite' },
|
|
199
|
+
{ value: 'prisma', label: 'Prisma', hint: 'Prisma & SQLite starter' },
|
|
200
|
+
]);
|
|
201
|
+
console.log();
|
|
202
|
+
}
|
|
203
|
+
// 4. Linter & Formatter Selection
|
|
204
|
+
let linterOption = args.linter || 'none';
|
|
205
|
+
if (!args.linter && !args.yes) {
|
|
206
|
+
printStep(4, 7, 'Linter & Formatter');
|
|
207
|
+
linterOption = await promptSelect('Code quality tooling:', [
|
|
208
|
+
{ value: 'none', label: 'None', hint: 'No linter config' },
|
|
209
|
+
{ value: 'biome', label: 'Biome', hint: 'Fast Rust linter & formatter' },
|
|
210
|
+
{ value: 'eslint', label: 'ESLint', hint: 'ESLint 9 & Prettier' },
|
|
211
|
+
]);
|
|
212
|
+
console.log();
|
|
213
|
+
}
|
|
214
|
+
// 5. Testing Framework Selection
|
|
215
|
+
let testingOption = args.testing || 'none';
|
|
216
|
+
if (!args.testing && !args.yes) {
|
|
217
|
+
printStep(5, 7, 'Testing');
|
|
218
|
+
testingOption = await promptSelect('Testing framework:', [
|
|
219
|
+
{ value: 'vitest', label: 'Vitest', hint: 'Fast modern unit test runner' },
|
|
220
|
+
{ value: 'node', label: 'Node:test', hint: 'Native Node.js test runner' },
|
|
221
|
+
{ value: 'none', label: 'None', hint: 'No testing setup' },
|
|
222
|
+
]);
|
|
223
|
+
console.log();
|
|
224
|
+
}
|
|
225
|
+
// 6. Package Manager Selection
|
|
156
226
|
const detectedPm = detectCurrentPackageManager();
|
|
157
227
|
let pkgManager = args.pkgManager || detectedPm;
|
|
158
228
|
if (!args.pkgManager && !args.yes) {
|
|
159
|
-
printStep(
|
|
229
|
+
printStep(6, 7, 'Package manager');
|
|
160
230
|
pkgManager = await promptSelect('Select package manager:', [
|
|
161
231
|
{ value: 'pnpm', label: 'pnpm', hint: 'Fast, disk-efficient' },
|
|
162
232
|
{ value: 'npm', label: 'npm', hint: 'Standard' },
|
|
@@ -165,14 +235,18 @@ async function main() {
|
|
|
165
235
|
]);
|
|
166
236
|
console.log();
|
|
167
237
|
}
|
|
168
|
-
//
|
|
238
|
+
// 7. Git, Docker & Install Preferences
|
|
169
239
|
let gitInit = args.git;
|
|
240
|
+
let docker = args.docker;
|
|
170
241
|
let installDeps = args.install;
|
|
171
242
|
if (!args.yes) {
|
|
172
|
-
printStep(
|
|
243
|
+
printStep(7, 7, 'Preferences');
|
|
173
244
|
if (gitInit === undefined) {
|
|
174
245
|
gitInit = await promptConfirm('Initialize git repository?', true);
|
|
175
246
|
}
|
|
247
|
+
if (docker === undefined) {
|
|
248
|
+
docker = await promptConfirm('Include Docker container setup?', false);
|
|
249
|
+
}
|
|
176
250
|
if (installDeps === undefined) {
|
|
177
251
|
installDeps = await promptConfirm(`Install dependencies with ${pkgManager}?`, true);
|
|
178
252
|
}
|
|
@@ -181,10 +255,12 @@ async function main() {
|
|
|
181
255
|
else {
|
|
182
256
|
if (gitInit === undefined)
|
|
183
257
|
gitInit = true;
|
|
258
|
+
if (docker === undefined)
|
|
259
|
+
docker = false;
|
|
184
260
|
if (installDeps === undefined)
|
|
185
261
|
installDeps = true;
|
|
186
262
|
}
|
|
187
|
-
//
|
|
263
|
+
// 8. Scaffold Project
|
|
188
264
|
const startTime = performance.now();
|
|
189
265
|
try {
|
|
190
266
|
const result = await scaffoldProject({
|
|
@@ -194,6 +270,10 @@ async function main() {
|
|
|
194
270
|
pkgManager,
|
|
195
271
|
gitInit: Boolean(gitInit),
|
|
196
272
|
installDeps: Boolean(installDeps),
|
|
273
|
+
database: dbOption,
|
|
274
|
+
docker: Boolean(docker),
|
|
275
|
+
linter: linterOption,
|
|
276
|
+
testing: testingOption,
|
|
197
277
|
});
|
|
198
278
|
const durationMs = Math.round(performance.now() - startTime);
|
|
199
279
|
// 6. Print stylized next steps card
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,SAAS,EACT,UAAU,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,CAAC,GACF,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modular.d.ts","sourceRoot":"","sources":["../../src/templates/modular.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"modular.d.ts","sourceRoot":"","sources":["../../src/templates/modular.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,eAAe,EAAE,kBAgU7B,CAAC"}
|
|
@@ -279,7 +279,14 @@ app.route('/api', authModule);
|
|
|
279
279
|
app.route('/api', usersModule);
|
|
280
280
|
app.route('/api', productsModule);
|
|
281
281
|
|
|
282
|
-
// Health check
|
|
282
|
+
// Root & Health check
|
|
283
|
+
app.get('/', (c) => {
|
|
284
|
+
return c.json({
|
|
285
|
+
message: 'Welcome to Froot Modular API',
|
|
286
|
+
health: '/health',
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
|
|
283
290
|
app.get('/health', (c) => {
|
|
284
291
|
return c.json({
|
|
285
292
|
status: 'ok',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modular.js","sourceRoot":"","sources":["../../src/templates/modular.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,8BAA8B;IAC3C,QAAQ,EAAE,CAAC,WAAmB,EAAmB,EAAE;QACjD,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAC5B;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE;oBACP,GAAG,EAAE,yBAAyB;oBAC9B,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,qBAAqB;oBAC5B,IAAI,EAAE,6BAA6B;iBACpC;gBACD,YAAY,EAAE;oBACZ,OAAO,EAAE,QAAQ;iBAClB;gBACD,eAAe,EAAE;oBACf,aAAa,EAAE,UAAU;oBACzB,GAAG,EAAE,SAAS;oBACd,UAAU,EAAE,QAAQ;iBACrB;aACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI;YAER,eAAe,EAAE,eAAe;YAChC,YAAY,EAAE,gBAAgB;YAE9B,WAAW,EAAE,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ClC;YAEK,iCAAiC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxC;YAEK,oCAAoC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;CAyB3C;YAEK,kCAAkC,EAAE;;;;;;;;;;;;;;;;;CAiBzC;YAEK,iCAAiC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;CAyBxC;YAEK,kCAAkC,EAAE;;;;;;CAMzC;YAEK,oCAAoC,EAAE;;;;;;;;;;;;;;;;;CAiB3C;YAEK,mCAAmC,EAAE;;;;;;;;;;;;;;;;;;;;CAoB1C;YAEK,wCAAwC,EAAE;;;;;;CAM/C;YAEK,0CAA0C,EAAE;;;;;;;;;;;;;;;;;CAiBjD;YAEK,yCAAyC,EAAE;;;;;;;;;;;;;;;;;CAiBhD;YAEK,YAAY,EAAE
|
|
1
|
+
{"version":3,"file":"modular.js","sourceRoot":"","sources":["../../src/templates/modular.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,8BAA8B;IAC3C,QAAQ,EAAE,CAAC,WAAmB,EAAmB,EAAE;QACjD,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAC5B;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE;oBACP,GAAG,EAAE,yBAAyB;oBAC9B,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,qBAAqB;oBAC5B,IAAI,EAAE,6BAA6B;iBACpC;gBACD,YAAY,EAAE;oBACZ,OAAO,EAAE,QAAQ;iBAClB;gBACD,eAAe,EAAE;oBACf,aAAa,EAAE,UAAU;oBACzB,GAAG,EAAE,SAAS;oBACd,UAAU,EAAE,QAAQ;iBACrB;aACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI;YAER,eAAe,EAAE,eAAe;YAChC,YAAY,EAAE,gBAAgB;YAE9B,WAAW,EAAE,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ClC;YAEK,iCAAiC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxC;YAEK,oCAAoC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;CAyB3C;YAEK,kCAAkC,EAAE;;;;;;;;;;;;;;;;;CAiBzC;YAEK,iCAAiC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;CAyBxC;YAEK,kCAAkC,EAAE;;;;;;CAMzC;YAEK,oCAAoC,EAAE;;;;;;;;;;;;;;;;;CAiB3C;YAEK,mCAAmC,EAAE;;;;;;;;;;;;;;;;;;;;CAoB1C;YAEK,wCAAwC,EAAE;;;;;;CAM/C;YAEK,0CAA0C,EAAE;;;;;;;;;;;;;;;;;CAiBjD;YAEK,yCAAyC,EAAE;;;;;;;;;;;;;;;;;CAiBhD;YAEK,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCnB;YAEK,eAAe,EAAE;;;;;;;CAOtB;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|