forgestack-os-cli 0.2.1 → 0.3.1
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/README.md +78 -0
- package/dist/commands/create.d.ts +1 -1
- package/dist/commands/create.js +55 -60
- package/dist/commands/create.js.map +1 -1
- package/dist/generators/api.js +42 -38
- package/dist/generators/api.js.map +1 -1
- package/dist/generators/auth.js +171 -356
- package/dist/generators/auth.js.map +1 -1
- package/dist/generators/backend.js +146 -129
- package/dist/generators/backend.js.map +1 -1
- package/dist/generators/common.js +50 -15
- package/dist/generators/common.js.map +1 -1
- package/dist/generators/database.js +18 -24
- package/dist/generators/database.js.map +1 -1
- package/dist/generators/docker.js +17 -21
- package/dist/generators/docker.js.map +1 -1
- package/dist/generators/frontend.js +164 -157
- package/dist/generators/frontend.js.map +1 -1
- package/dist/generators/index.js +69 -34
- package/dist/generators/index.js.map +1 -1
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.js +1 -2
- package/dist/utils/logger.js +9 -15
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/prompts.d.ts +15 -1
- package/dist/utils/prompts.js +111 -33
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/security.d.ts +4 -0
- package/dist/utils/security.js +8 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/validators.js +7 -9
- package/dist/utils/validators.js.map +1 -1
- package/package.json +36 -14
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# ForgeStack OS CLI
|
|
2
|
+
|
|
3
|
+
Generate production-ready full-stack SaaS projects with one command.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Recommended: npx (no install)
|
|
9
|
+
npx forgestack-os-cli create my-app
|
|
10
|
+
|
|
11
|
+
# Or install globally
|
|
12
|
+
npm install -g forgestack-os-cli
|
|
13
|
+
# then
|
|
14
|
+
forgestack create my-app
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
forgestack create <project-name> [options]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Common flags**
|
|
24
|
+
|
|
25
|
+
- `--frontend <framework>`: react-vite | nextjs
|
|
26
|
+
- `--backend <framework>`: express | fastify | nestjs | bun-elysia | go-fiber
|
|
27
|
+
- `--auth <provider>`: jwt | clerk | supabase | authjs | firebase
|
|
28
|
+
- `--database <db>`: postgresql | mongodb | mysql | sqlite | supabase-db
|
|
29
|
+
- `--api <style>`: rest | graphql | trpc
|
|
30
|
+
- `--preset <name>`: use a predefined stack (e.g., next-nest-clerk-pg)
|
|
31
|
+
- `--stack <json>`: provide full stack config as JSON
|
|
32
|
+
- `--docker` / `--no-docker`: include or skip Docker config
|
|
33
|
+
- `--multi-tenant`: enable multi-tenancy scaffolding
|
|
34
|
+
- `--skip-install`: skip dependency installation
|
|
35
|
+
- `--skip-git`: skip git init
|
|
36
|
+
|
|
37
|
+
### Examples
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Interactive
|
|
41
|
+
forgestack create my-saas
|
|
42
|
+
|
|
43
|
+
# Preset
|
|
44
|
+
forgestack create my-enterprise --preset next-nest-clerk-pg
|
|
45
|
+
|
|
46
|
+
# Full JSON config
|
|
47
|
+
forgestack create my-app --stack '{"frontend":"nextjs","backend":"fastify","auth":"supabase","database":"supabase-db","apiStyle":"trpc","docker":true,"multiTenant":true}'
|
|
48
|
+
|
|
49
|
+
# Minimal flags
|
|
50
|
+
forgestack create api-only --frontend=react-vite --backend=express --auth=jwt --database=postgresql --api=rest --no-docker
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Features
|
|
54
|
+
|
|
55
|
+
- 150+ stack combinations across frontend, backend, auth, database, and API styles
|
|
56
|
+
- Multi-tenancy ready scaffolds
|
|
57
|
+
- Docker Compose and env templates
|
|
58
|
+
- API docs (Swagger) for REST backends
|
|
59
|
+
- TypeScript-first across generated code
|
|
60
|
+
|
|
61
|
+
## Generated Project
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
my-app/
|
|
65
|
+
├─ frontend/ # Next.js or React+Vite
|
|
66
|
+
├─ backend/ # Express, Fastify, NestJS, Bun+Elysia, or Go+Fiber
|
|
67
|
+
├─ .env.example
|
|
68
|
+
├─ package.json (workspaces)
|
|
69
|
+
└─ README.md (per-project runbook)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Author
|
|
73
|
+
|
|
74
|
+
Built and maintained by **Sumit Chauhan** ([halloffame12](https://github.com/halloffame12)).
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function createCommand(projectName: string, options:
|
|
1
|
+
export declare function createCommand(projectName: string, options: Record<string, unknown>): Promise<void>;
|
package/dist/commands/create.js
CHANGED
|
@@ -1,90 +1,85 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
const validators_1 = require("../utils/validators");
|
|
13
|
-
const generators_1 = require("../generators");
|
|
14
|
-
async function createCommand(projectName, options) {
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { createRequire } from 'module';
|
|
5
|
+
import { logger } from '../utils/logger';
|
|
6
|
+
import { promptForStack } from '../utils/prompts';
|
|
7
|
+
import { validateStackConfig } from '../utils/validators';
|
|
8
|
+
import { generateProject } from '../generators';
|
|
9
|
+
const pkgRequire = createRequire(import.meta.url);
|
|
10
|
+
const { version: CLI_VERSION } = pkgRequire('../../package.json');
|
|
11
|
+
export async function createCommand(projectName, options) {
|
|
15
12
|
try {
|
|
16
13
|
// Display welcome banner
|
|
17
|
-
console.log(
|
|
18
|
-
console.log(
|
|
19
|
-
console.log(
|
|
20
|
-
console.log(
|
|
21
|
-
console.log(
|
|
22
|
-
console.log(
|
|
23
|
-
console.log(
|
|
14
|
+
console.log(chalk.bold.cyan('\n╔═══════════════════════════════════════╗'));
|
|
15
|
+
console.log(chalk.bold.cyan('║ ║'));
|
|
16
|
+
console.log(chalk.bold.cyan(`║ 🚀 ForgeStack OS v${CLI_VERSION} ║`));
|
|
17
|
+
console.log(chalk.bold.cyan('║ ║'));
|
|
18
|
+
console.log(chalk.bold.cyan('║ One platform. Any stack. Production. ║'));
|
|
19
|
+
console.log(chalk.bold.cyan('║ ║'));
|
|
20
|
+
console.log(chalk.bold.cyan('╚═══════════════════════════════════════╝\n'));
|
|
24
21
|
// Check if directory already exists
|
|
25
|
-
const targetDir =
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
process.exit(1);
|
|
30
|
-
}
|
|
31
|
-
if (await fs_extra_1.default.pathExists(targetDir)) {
|
|
32
|
-
logger_1.logger.error(`Directory "${projectName}" already exists!`);
|
|
22
|
+
const targetDir = path.resolve(process.cwd(), projectName);
|
|
23
|
+
const actualProjectName = path.basename(targetDir);
|
|
24
|
+
if (await fs.pathExists(targetDir)) {
|
|
25
|
+
logger.error(`Directory "${projectName}" already exists!`);
|
|
33
26
|
process.exit(1);
|
|
34
27
|
}
|
|
35
28
|
// Test write permissions
|
|
36
29
|
try {
|
|
37
|
-
await
|
|
38
|
-
await
|
|
30
|
+
await fs.ensureDir(targetDir);
|
|
31
|
+
await fs.remove(targetDir);
|
|
39
32
|
}
|
|
40
|
-
catch
|
|
41
|
-
|
|
33
|
+
catch {
|
|
34
|
+
logger.error(`Permission denied! Cannot create directory at "${targetDir}".`);
|
|
42
35
|
process.exit(1);
|
|
43
36
|
}
|
|
44
37
|
// Prompt for stack configuration
|
|
45
|
-
|
|
46
|
-
const config = await
|
|
38
|
+
logger.title('📋 Configure Your Stack');
|
|
39
|
+
const config = await promptForStack(actualProjectName, options);
|
|
47
40
|
// Validate configuration
|
|
48
|
-
const validation =
|
|
41
|
+
const validation = validateStackConfig(config);
|
|
49
42
|
if (validation.warnings.length > 0) {
|
|
50
43
|
console.log('');
|
|
51
|
-
validation.warnings.forEach(warning =>
|
|
44
|
+
validation.warnings.forEach((warning) => logger.warning(warning));
|
|
52
45
|
}
|
|
53
46
|
if (!validation.valid) {
|
|
54
47
|
console.log('');
|
|
55
|
-
validation.errors.forEach(error =>
|
|
48
|
+
validation.errors.forEach((error) => logger.error(error));
|
|
56
49
|
process.exit(1);
|
|
57
50
|
}
|
|
58
51
|
// Display selected stack
|
|
59
52
|
console.log('');
|
|
60
|
-
|
|
61
|
-
console.log(
|
|
62
|
-
console.log(`${
|
|
63
|
-
console.log(`${
|
|
64
|
-
console.log(`${
|
|
65
|
-
console.log(`${
|
|
66
|
-
console.log(`${
|
|
67
|
-
console.log(`${
|
|
68
|
-
console.log(`${
|
|
69
|
-
console.log(`${
|
|
70
|
-
console.log(
|
|
53
|
+
logger.title('✨ Your Stack Configuration');
|
|
54
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
55
|
+
console.log(`${chalk.bold('Project:')} ${chalk.cyan(config.projectName)}`);
|
|
56
|
+
console.log(`${chalk.bold('Frontend:')} ${chalk.cyan(config.frontend)}`);
|
|
57
|
+
console.log(`${chalk.bold('Backend:')} ${chalk.cyan(config.backend)}`);
|
|
58
|
+
console.log(`${chalk.bold('Auth:')} ${chalk.cyan(config.auth)}`);
|
|
59
|
+
console.log(`${chalk.bold('Database:')} ${chalk.cyan(config.database)}`);
|
|
60
|
+
console.log(`${chalk.bold('API Style:')} ${chalk.cyan(config.apiStyle)}`);
|
|
61
|
+
console.log(`${chalk.bold('Docker:')} ${chalk.cyan(config.docker ? 'Yes' : 'No')}`);
|
|
62
|
+
console.log(`${chalk.bold('Multi-Tenant:')} ${chalk.cyan(config.multiTenant ? 'Yes' : 'No')}`);
|
|
63
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
71
64
|
console.log('');
|
|
72
65
|
// Generate project
|
|
73
|
-
await
|
|
66
|
+
await generateProject(config, targetDir);
|
|
74
67
|
// Success message
|
|
75
68
|
console.log('');
|
|
76
|
-
|
|
77
|
-
console.log(
|
|
78
|
-
console.log(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
console.log(
|
|
83
|
-
console.log(
|
|
84
|
-
console.log(
|
|
69
|
+
logger.success(chalk.bold('🎉 Project created successfully!\n'));
|
|
70
|
+
console.log(chalk.bold('Next steps:\n'));
|
|
71
|
+
console.log(chalk.cyan(` cd ${projectName}`));
|
|
72
|
+
if (config.skipInstall) {
|
|
73
|
+
console.log(chalk.cyan(' npm install'));
|
|
74
|
+
}
|
|
75
|
+
console.log(chalk.cyan(' npm run dev\n'));
|
|
76
|
+
console.log(chalk.gray('For more information, check out the README.md in your project.\n'));
|
|
77
|
+
console.log(chalk.bold('Built by Sumit Chauhan'));
|
|
78
|
+
console.log(chalk.gray('GitHub: https://github.com/halloffame12'));
|
|
79
|
+
console.log(chalk.gray('LinkedIn: https://www.linkedin.com/in/sumit-chauhan-a4ba98325/\n'));
|
|
85
80
|
}
|
|
86
81
|
catch (error) {
|
|
87
|
-
|
|
82
|
+
logger.error('Failed to create project');
|
|
88
83
|
console.error(error);
|
|
89
84
|
process.exit(1);
|
|
90
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
package/dist/generators/api.js
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generateGraphQL = generateGraphQL;
|
|
7
|
-
exports.generateTRPC = generateTRPC;
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
-
async function generateGraphQL(config, backendDir) {
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
export async function generateGraphQL(config, backendDir) {
|
|
11
4
|
if (config.backend === 'express') {
|
|
12
5
|
await generateExpressGraphQL(config, backendDir);
|
|
13
6
|
}
|
|
@@ -17,16 +10,16 @@ async function generateGraphQL(config, backendDir) {
|
|
|
17
10
|
}
|
|
18
11
|
async function generateExpressGraphQL(config, backendDir) {
|
|
19
12
|
// Update package.json
|
|
20
|
-
const packageJson = await
|
|
13
|
+
const packageJson = await fs.readJSON(path.join(backendDir, 'package.json'));
|
|
21
14
|
packageJson.dependencies['graphql'] = '^16.8.1';
|
|
22
15
|
packageJson.dependencies['@apollo/server'] = '^4.10.0';
|
|
23
16
|
packageJson.dependencies['@graphql-tools/schema'] = '^10.0.2';
|
|
24
|
-
await
|
|
17
|
+
await fs.writeJSON(path.join(backendDir, 'package.json'), packageJson, { spaces: 2 });
|
|
25
18
|
// Create GraphQL directory
|
|
26
|
-
const graphqlDir =
|
|
27
|
-
await
|
|
28
|
-
await
|
|
29
|
-
await
|
|
19
|
+
const graphqlDir = path.join(backendDir, 'src', 'graphql');
|
|
20
|
+
await fs.ensureDir(graphqlDir);
|
|
21
|
+
await fs.ensureDir(path.join(graphqlDir, 'resolvers'));
|
|
22
|
+
await fs.ensureDir(path.join(graphqlDir, 'types'));
|
|
30
23
|
// Schema
|
|
31
24
|
const schema = `import { gql } from 'graphql-tag';
|
|
32
25
|
|
|
@@ -54,7 +47,7 @@ export const typeDefs = gql\`
|
|
|
54
47
|
}
|
|
55
48
|
\`;
|
|
56
49
|
`;
|
|
57
|
-
await
|
|
50
|
+
await fs.writeFile(path.join(graphqlDir, 'schema.ts'), schema);
|
|
58
51
|
// Resolvers
|
|
59
52
|
const resolvers = `import bcrypt from 'bcrypt';
|
|
60
53
|
import jwt from 'jsonwebtoken';
|
|
@@ -136,7 +129,7 @@ export const resolvers = {
|
|
|
136
129
|
},
|
|
137
130
|
};
|
|
138
131
|
`;
|
|
139
|
-
await
|
|
132
|
+
await fs.writeFile(path.join(graphqlDir, 'resolvers', 'index.ts'), resolvers);
|
|
140
133
|
// Apollo Server setup
|
|
141
134
|
const apolloSetup = `import { ApolloServer } from '@apollo/server';
|
|
142
135
|
import { expressMiddleware } from '@apollo/server/express4';
|
|
@@ -170,16 +163,16 @@ export async function createApolloServer() {
|
|
|
170
163
|
});
|
|
171
164
|
}
|
|
172
165
|
`;
|
|
173
|
-
await
|
|
166
|
+
await fs.writeFile(path.join(graphqlDir, 'server.ts'), apolloSetup);
|
|
174
167
|
}
|
|
175
168
|
async function generateNestJSGraphQL(config, backendDir) {
|
|
176
169
|
// Update package.json
|
|
177
|
-
const packageJson = await
|
|
170
|
+
const packageJson = await fs.readJSON(path.join(backendDir, 'package.json'));
|
|
178
171
|
packageJson.dependencies['@nestjs/graphql'] = '^12.0.11';
|
|
179
172
|
packageJson.dependencies['@nestjs/apollo'] = '^12.0.11';
|
|
180
173
|
packageJson.dependencies['@apollo/server'] = '^4.10.0';
|
|
181
174
|
packageJson.dependencies['graphql'] = '^16.8.1';
|
|
182
|
-
await
|
|
175
|
+
await fs.writeJSON(path.join(backendDir, 'package.json'), packageJson, { spaces: 2 });
|
|
183
176
|
// GraphQL module
|
|
184
177
|
const graphqlModule = `import { Module } from '@nestjs/common';
|
|
185
178
|
import { GraphQLModule } from '@nestjs/graphql';
|
|
@@ -199,7 +192,7 @@ import { join } from 'path';
|
|
|
199
192
|
})
|
|
200
193
|
export class GraphqlModule {}
|
|
201
194
|
`;
|
|
202
|
-
await
|
|
195
|
+
await fs.writeFile(path.join(backendDir, 'src', 'graphql.module.ts'), graphqlModule);
|
|
203
196
|
// User resolver
|
|
204
197
|
const userResolver = `import { Resolver, Query, Mutation, Args } from '@nestjs/graphql';
|
|
205
198
|
import { UseGuards } from '@nestjs/common';
|
|
@@ -238,18 +231,25 @@ export class UserResolver {
|
|
|
238
231
|
}
|
|
239
232
|
}
|
|
240
233
|
`;
|
|
241
|
-
await
|
|
234
|
+
await fs.writeFile(path.join(backendDir, 'src', 'users', 'users.resolver.ts'), userResolver);
|
|
242
235
|
}
|
|
243
|
-
async function generateTRPC(config, backendDir, frontendDir) {
|
|
236
|
+
export async function generateTRPC(config, backendDir, frontendDir) {
|
|
244
237
|
// Backend setup
|
|
245
|
-
const packageJson = await
|
|
238
|
+
const packageJson = await fs.readJSON(path.join(backendDir, 'package.json'));
|
|
246
239
|
packageJson.dependencies['@trpc/server'] = '^10.45.0';
|
|
247
240
|
packageJson.dependencies['zod'] = '^3.22.4';
|
|
248
|
-
|
|
241
|
+
// Add auth dependencies - tRPC auth router always uses bcryptjs/jwt
|
|
242
|
+
packageJson.dependencies['bcryptjs'] = '^2.4.3';
|
|
243
|
+
packageJson.dependencies['jsonwebtoken'] = '^9.0.2';
|
|
244
|
+
if (!packageJson.devDependencies)
|
|
245
|
+
packageJson.devDependencies = {};
|
|
246
|
+
packageJson.devDependencies['@types/bcryptjs'] = '^2.4.6';
|
|
247
|
+
packageJson.devDependencies['@types/jsonwebtoken'] = '^9.0.7';
|
|
248
|
+
await fs.writeJSON(path.join(backendDir, 'package.json'), packageJson, { spaces: 2 });
|
|
249
249
|
// tRPC router
|
|
250
|
-
const trpcDir =
|
|
251
|
-
await
|
|
252
|
-
await
|
|
250
|
+
const trpcDir = path.join(backendDir, 'src', 'trpc');
|
|
251
|
+
await fs.ensureDir(trpcDir);
|
|
252
|
+
await fs.ensureDir(path.join(trpcDir, 'routers'));
|
|
253
253
|
const trpcSetup = `import { initTRPC } from '@trpc/server';
|
|
254
254
|
import { z } from 'zod';
|
|
255
255
|
|
|
@@ -258,10 +258,10 @@ const t = initTRPC.create();
|
|
|
258
258
|
export const router = t.router;
|
|
259
259
|
export const publicProcedure = t.procedure;
|
|
260
260
|
`;
|
|
261
|
-
await
|
|
262
|
-
const authRouter = `import { router, publicProcedure } from '../trpc';
|
|
261
|
+
await fs.writeFile(path.join(trpcDir, 'trpc.ts'), trpcSetup);
|
|
262
|
+
const authRouter = `import { router, publicProcedure } from '../trpc.js';
|
|
263
263
|
import { z } from 'zod';
|
|
264
|
-
import bcrypt from '
|
|
264
|
+
import bcrypt from 'bcryptjs';
|
|
265
265
|
import jwt from 'jsonwebtoken';
|
|
266
266
|
${config.database === 'mongodb' ? "import User from '../../models/User';" : "import prisma from '../../lib/prisma';"}
|
|
267
267
|
|
|
@@ -329,18 +329,22 @@ export const authRouter = router({
|
|
|
329
329
|
}),
|
|
330
330
|
});
|
|
331
331
|
`;
|
|
332
|
-
await
|
|
332
|
+
await fs.writeFile(path.join(trpcDir, 'routers', 'auth.ts'), authRouter);
|
|
333
333
|
// Frontend tRPC client
|
|
334
|
-
const frontendPackageJson = await
|
|
334
|
+
const frontendPackageJson = await fs.readJSON(path.join(frontendDir, 'package.json'));
|
|
335
335
|
frontendPackageJson.dependencies['@trpc/client'] = '^10.45.0';
|
|
336
336
|
frontendPackageJson.dependencies['@trpc/react-query'] = '^10.45.0';
|
|
337
|
-
frontendPackageJson.dependencies['@tanstack/react-query'] = '^
|
|
338
|
-
await
|
|
337
|
+
frontendPackageJson.dependencies['@tanstack/react-query'] = '^4.36.1';
|
|
338
|
+
await fs.writeJSON(path.join(frontendDir, 'package.json'), frontendPackageJson, { spaces: 2 });
|
|
339
|
+
const isNext = config.frontend === 'nextjs';
|
|
340
|
+
const frontendLibDir = path.join(frontendDir, isNext ? 'lib' : 'src/lib');
|
|
341
|
+
await fs.ensureDir(frontendLibDir);
|
|
342
|
+
const relativePath = isNext ? '../../backend/src/trpc/routers' : '../../../backend/src/trpc/routers';
|
|
339
343
|
const trpcClient = `import { createTRPCReact } from '@trpc/react-query';
|
|
340
|
-
import type { AppRouter } from '
|
|
344
|
+
import type { AppRouter } from '${relativePath}';
|
|
341
345
|
|
|
342
346
|
export const trpc = createTRPCReact<AppRouter>();
|
|
343
347
|
`;
|
|
344
|
-
await
|
|
348
|
+
await fs.writeFile(path.join(frontendLibDir, 'trpc.ts'), trpcClient);
|
|
345
349
|
}
|
|
346
350
|
//# sourceMappingURL=api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/generators/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/generators/api.ts"],"names":[],"mappings":"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"}
|