create-frootjs 1.0.5 → 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/fullstack.d.ts.map +1 -1
- package/dist/templates/fullstack.js +3 -2
- package/dist/templates/fullstack.js.map +1 -1
- package/dist/templates/minimal.d.ts.map +1 -1
- package/dist/templates/minimal.js +3 -2
- package/dist/templates/minimal.js.map +1 -1
- package/dist/templates/modular.d.ts.map +1 -1
- package/dist/templates/modular.js +22 -13
- package/dist/templates/modular.js.map +1 -1
- package/dist/templates/mvc.d.ts.map +1 -1
- package/dist/templates/mvc.js +7 -4
- package/dist/templates/mvc.js.map +1 -1
- package/dist/templates/openapi.d.ts.map +1 -1
- package/dist/templates/openapi.js +3 -2
- package/dist/templates/openapi.js.map +1 -1
- package/dist/templates/streaming.d.ts.map +1 -1
- package/dist/templates/streaming.js +3 -2
- package/dist/templates/streaming.js.map +1 -1
- package/dist/templates/websocket.d.ts.map +1 -1
- package/dist/templates/websocket.js +3 -2
- package/dist/templates/websocket.js.map +1 -1
- package/package.json +2 -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":"fullstack.d.ts","sourceRoot":"","sources":["../../src/templates/fullstack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"fullstack.d.ts","sourceRoot":"","sources":["../../src/templates/fullstack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,iBAAiB,EAAE,kBAqO/B,CAAC"}
|
|
@@ -14,15 +14,16 @@ export const fullstackTemplate = {
|
|
|
14
14
|
version: '1.0.0',
|
|
15
15
|
type: 'module',
|
|
16
16
|
scripts: {
|
|
17
|
-
dev: '
|
|
17
|
+
dev: 'tsx watch src/server.tsx',
|
|
18
18
|
build: 'tsc',
|
|
19
19
|
start: 'node dist/server.js',
|
|
20
20
|
},
|
|
21
21
|
dependencies: {
|
|
22
|
-
frootjs: '^1.0.
|
|
22
|
+
frootjs: '^1.0.2',
|
|
23
23
|
},
|
|
24
24
|
devDependencies: {
|
|
25
25
|
'@types/node': '^22.10.0',
|
|
26
|
+
tsx: '^4.19.0',
|
|
26
27
|
typescript: '^5.8.0',
|
|
27
28
|
},
|
|
28
29
|
}, null, 2) + '\n',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fullstack.js","sourceRoot":"","sources":["../../src/templates/fullstack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,2BAA2B;IACxC,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,
|
|
1
|
+
{"version":3,"file":"fullstack.js","sourceRoot":"","sources":["../../src/templates/fullstack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,2BAA2B;IACxC,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,0BAA0B;oBAC/B,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,qBAAqB;iBAC7B;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;;;;;;;;;;;;;;;;;;;;;;CAsBlC;YAEK,2BAA2B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyClC;YAEK,yBAAyB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmChC;YAEK,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B3B;YAEK,qBAAqB,EAAE;;;;;;;;;;;;;;;;CAgB5B;YAEK,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCvB;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/templates/minimal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/templates/minimal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,eAAe,EAAE,kBA0F7B,CAAC"}
|
|
@@ -14,15 +14,16 @@ export const minimalTemplate = {
|
|
|
14
14
|
version: '1.0.0',
|
|
15
15
|
type: 'module',
|
|
16
16
|
scripts: {
|
|
17
|
-
dev: '
|
|
17
|
+
dev: 'tsx watch src/index.ts',
|
|
18
18
|
build: 'tsc',
|
|
19
19
|
start: 'node dist/index.js',
|
|
20
20
|
},
|
|
21
21
|
dependencies: {
|
|
22
|
-
frootjs: '^1.0.
|
|
22
|
+
frootjs: '^1.0.2',
|
|
23
23
|
},
|
|
24
24
|
devDependencies: {
|
|
25
25
|
'@types/node': '^22.10.0',
|
|
26
|
+
tsx: '^4.19.0',
|
|
26
27
|
typescript: '^5.8.0',
|
|
27
28
|
},
|
|
28
29
|
}, null, 2) + '\n',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimal.js","sourceRoot":"","sources":["../../src/templates/minimal.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,0BAA0B;IACvC,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,
|
|
1
|
+
{"version":3,"file":"minimal.js","sourceRoot":"","sources":["../../src/templates/minimal.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,0BAA0B;IACvC,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,wBAAwB;oBAC7B,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,oBAAoB;iBAC5B;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;;;;;;;;;;;;;;;;CAgBlC;YAEK,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCrB;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -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"}
|
|
@@ -14,16 +14,17 @@ export const modularTemplate = {
|
|
|
14
14
|
version: '1.0.0',
|
|
15
15
|
type: 'module',
|
|
16
16
|
scripts: {
|
|
17
|
-
dev: '
|
|
17
|
+
dev: 'tsx watch src/server.ts',
|
|
18
18
|
build: 'tsc',
|
|
19
19
|
start: 'node dist/server.js',
|
|
20
20
|
test: 'node --test tests/*.test.ts',
|
|
21
21
|
},
|
|
22
22
|
dependencies: {
|
|
23
|
-
frootjs: '^1.0.
|
|
23
|
+
frootjs: '^1.0.2',
|
|
24
24
|
},
|
|
25
25
|
devDependencies: {
|
|
26
26
|
'@types/node': '^22.10.0',
|
|
27
|
+
tsx: '^4.19.0',
|
|
27
28
|
typescript: '^5.8.0',
|
|
28
29
|
},
|
|
29
30
|
}, null, 2) + '\n',
|
|
@@ -92,14 +93,13 @@ export const authGuard: MiddlewareHandler = async (c, next) => {
|
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
const token = authHeader.slice(7).trim();
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
try {
|
|
97
|
+
const payload = await verifyJwt(token, JWT_SECRET);
|
|
98
|
+
c.set('user', payload);
|
|
99
|
+
await next();
|
|
100
|
+
} catch {
|
|
98
101
|
return c.json({ error: 'Unauthorized: token is invalid or expired' }, 401);
|
|
99
102
|
}
|
|
100
|
-
|
|
101
|
-
c.set('user', payload);
|
|
102
|
-
await next();
|
|
103
103
|
};
|
|
104
104
|
`,
|
|
105
105
|
'src/common/filters/error.filter.ts': `import type { Context } from 'frootjs';
|
|
@@ -139,9 +139,9 @@ export class AuthService {
|
|
|
139
139
|
sub: user.id,
|
|
140
140
|
email: user.email,
|
|
141
141
|
role: user.role,
|
|
142
|
-
exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24, // 24 hours
|
|
143
142
|
},
|
|
144
|
-
JWT_SECRET
|
|
143
|
+
JWT_SECRET,
|
|
144
|
+
{ expiresIn: 60 * 60 * 24 }
|
|
145
145
|
);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
@@ -191,7 +191,8 @@ export class UsersService {
|
|
|
191
191
|
return mockUsers;
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
static getById(id
|
|
194
|
+
static getById(id?: string): UserProfile | undefined {
|
|
195
|
+
if (!id) return undefined;
|
|
195
196
|
return mockUsers.find((u) => u.id === id);
|
|
196
197
|
}
|
|
197
198
|
}
|
|
@@ -236,7 +237,8 @@ export class ProductsService {
|
|
|
236
237
|
return productsTable;
|
|
237
238
|
}
|
|
238
239
|
|
|
239
|
-
static find(id
|
|
240
|
+
static find(id?: string): Product | undefined {
|
|
241
|
+
if (!id) return undefined;
|
|
240
242
|
return productsTable.find((p) => p.id === id);
|
|
241
243
|
}
|
|
242
244
|
}
|
|
@@ -277,7 +279,14 @@ app.route('/api', authModule);
|
|
|
277
279
|
app.route('/api', usersModule);
|
|
278
280
|
app.route('/api', productsModule);
|
|
279
281
|
|
|
280
|
-
// 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
|
+
|
|
281
290
|
app.get('/health', (c) => {
|
|
282
291
|
return c.json({
|
|
283
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
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mvc.d.ts","sourceRoot":"","sources":["../../src/templates/mvc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"mvc.d.ts","sourceRoot":"","sources":["../../src/templates/mvc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,WAAW,EAAE,kBA2PzB,CAAC"}
|
package/dist/templates/mvc.js
CHANGED
|
@@ -14,16 +14,17 @@ export const mvcTemplate = {
|
|
|
14
14
|
version: '1.0.0',
|
|
15
15
|
type: 'module',
|
|
16
16
|
scripts: {
|
|
17
|
-
dev: '
|
|
17
|
+
dev: 'tsx watch src/server.ts',
|
|
18
18
|
build: 'tsc',
|
|
19
19
|
start: 'node dist/server.js',
|
|
20
20
|
test: 'node --test tests/*.test.ts',
|
|
21
21
|
},
|
|
22
22
|
dependencies: {
|
|
23
|
-
frootjs: '^1.0.
|
|
23
|
+
frootjs: '^1.0.2',
|
|
24
24
|
},
|
|
25
25
|
devDependencies: {
|
|
26
26
|
'@types/node': '^22.10.0',
|
|
27
|
+
tsx: '^4.19.0',
|
|
27
28
|
typescript: '^5.8.0',
|
|
28
29
|
},
|
|
29
30
|
}, null, 2) + '\n',
|
|
@@ -95,7 +96,8 @@ export class UserService {
|
|
|
95
96
|
return Array.from(usersTable.values());
|
|
96
97
|
}
|
|
97
98
|
|
|
98
|
-
static async findById(id
|
|
99
|
+
static async findById(id?: string): Promise<User | null> {
|
|
100
|
+
if (!id) return null;
|
|
99
101
|
return usersTable.get(id) ?? null;
|
|
100
102
|
}
|
|
101
103
|
|
|
@@ -112,7 +114,8 @@ export class UserService {
|
|
|
112
114
|
return user;
|
|
113
115
|
}
|
|
114
116
|
|
|
115
|
-
static async delete(id
|
|
117
|
+
static async delete(id?: string): Promise<boolean> {
|
|
118
|
+
if (!id) return false;
|
|
116
119
|
return usersTable.delete(id);
|
|
117
120
|
}
|
|
118
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mvc.js","sourceRoot":"","sources":["../../src/templates/mvc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,WAAW,GAAuB;IAC7C,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,+BAA+B;IAC5C,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
|
|
1
|
+
{"version":3,"file":"mvc.js","sourceRoot":"","sources":["../../src/templates/mvc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,WAAW,GAAuB;IAC7C,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,+BAA+B;IAC5C,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsClC;YAEK,0BAA0B,EAAE;;;;;;;;;;;;;CAajC;YAEK,8BAA8B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCrC;YAEK,sCAAsC,EAAE;;;;;;;;;;;CAW7C;YAEK,oCAAoC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC3C;YAEK,6BAA6B,EAAE;;;;;;CAMpC;YAEK,2BAA2B,EAAE;;;;;;;;;CASlC;YAEK,qBAAqB,EAAE;;;;;;;;;CAS5B;YAEK,kCAAkC,EAAE;;;;;;;;CAQzC;YAEK,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBnB;YAEK,eAAe,EAAE;;;;;;;CAOtB;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/templates/openapi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/templates/openapi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,eAAe,EAAE,kBAiN7B,CAAC"}
|
|
@@ -14,16 +14,17 @@ export const openapiTemplate = {
|
|
|
14
14
|
version: '1.0.0',
|
|
15
15
|
type: 'module',
|
|
16
16
|
scripts: {
|
|
17
|
-
dev: '
|
|
17
|
+
dev: 'tsx watch src/server.ts',
|
|
18
18
|
build: 'tsc',
|
|
19
19
|
start: 'node dist/server.js',
|
|
20
20
|
test: 'node --test tests/*.test.ts',
|
|
21
21
|
},
|
|
22
22
|
dependencies: {
|
|
23
|
-
frootjs: '^1.0.
|
|
23
|
+
frootjs: '^1.0.2',
|
|
24
24
|
},
|
|
25
25
|
devDependencies: {
|
|
26
26
|
'@types/node': '^22.10.0',
|
|
27
|
+
tsx: '^4.19.0',
|
|
27
28
|
typescript: '^5.8.0',
|
|
28
29
|
},
|
|
29
30
|
}, null, 2) + '\n',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/templates/openapi.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,wBAAwB;IACrC,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
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/templates/openapi.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,wBAAwB;IACrC,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;;;;;;;;;;;;;;;;;;;;;;CAsBlC;YAEK,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvB;YAEK,qBAAqB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F5B;YAEK,eAAe,EAAE;;;;;;;;;;;;;;;;;;YAkBX,WAAW;;;;;;;;;;;CAWtB;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/templates/streaming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/templates/streaming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,iBAAiB,EAAE,kBAoN/B,CAAC"}
|
|
@@ -14,15 +14,16 @@ export const streamingTemplate = {
|
|
|
14
14
|
version: '1.0.0',
|
|
15
15
|
type: 'module',
|
|
16
16
|
scripts: {
|
|
17
|
-
dev: '
|
|
17
|
+
dev: 'tsx watch src/server.ts',
|
|
18
18
|
build: 'tsc',
|
|
19
19
|
start: 'node dist/server.js',
|
|
20
20
|
},
|
|
21
21
|
dependencies: {
|
|
22
|
-
frootjs: '^1.0.
|
|
22
|
+
frootjs: '^1.0.2',
|
|
23
23
|
},
|
|
24
24
|
devDependencies: {
|
|
25
25
|
'@types/node': '^22.10.0',
|
|
26
|
+
tsx: '^4.19.0',
|
|
26
27
|
typescript: '^5.8.0',
|
|
27
28
|
},
|
|
28
29
|
}, null, 2) + '\n',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/templates/streaming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,0BAA0B;IACvC,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
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/templates/streaming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,0BAA0B;IACvC,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;iBAC7B;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;;;;;;;;;;;;;;;;;;;;;;CAsBlC;YAEK,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyJtB;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/templates/websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/templates/websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAsD,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,iBAAiB,EAAE,kBAuM/B,CAAC"}
|
|
@@ -14,15 +14,16 @@ export const websocketTemplate = {
|
|
|
14
14
|
version: '1.0.0',
|
|
15
15
|
type: 'module',
|
|
16
16
|
scripts: {
|
|
17
|
-
dev: '
|
|
17
|
+
dev: 'tsx watch src/server.ts',
|
|
18
18
|
build: 'tsc',
|
|
19
19
|
start: 'node dist/server.js',
|
|
20
20
|
},
|
|
21
21
|
dependencies: {
|
|
22
|
-
frootjs: '^1.0.
|
|
22
|
+
frootjs: '^1.0.2',
|
|
23
23
|
},
|
|
24
24
|
devDependencies: {
|
|
25
25
|
'@types/node': '^22.10.0',
|
|
26
|
+
tsx: '^4.19.0',
|
|
26
27
|
typescript: '^5.8.0',
|
|
27
28
|
},
|
|
28
29
|
}, null, 2) + '\n',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/templates/websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,yBAAyB;IACtC,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
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/templates/websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,yBAAyB;IACtC,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;iBAC7B;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;;;;;;;;;;;;;;;;;;;;;;CAsBlC;YAEK,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4ItB;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-frootjs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Interactive CLI generator for scaffolding high-performance Froot applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^22.10.0",
|
|
48
|
+
"frootjs": "link:E:/Business/MetaTools/froot/froot-framework",
|
|
48
49
|
"typescript": "^5.8.0"
|
|
49
50
|
}
|
|
50
51
|
}
|