create-vonosan 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +315 -0
- package/dist/templates.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ──────────────────────────────────────────────────────────────────
|
|
4
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
5
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
6
|
+
* 🐙 GitHub: oyenet1
|
|
7
|
+
* 📅 Created Date: 2026-04-05
|
|
8
|
+
* 🔄 Updated Date: 2026-04-05
|
|
9
|
+
* ──────────────────────────────────────────────────────────────────
|
|
10
|
+
*/
|
|
11
|
+
import { execa } from 'execa';
|
|
12
|
+
import { runWizard } from './wizard.js';
|
|
13
|
+
import { scaffoldProject } from './scaffold.js';
|
|
14
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
15
|
+
const green = (s) => `\x1b[32m${s}\x1b[0m`;
|
|
16
|
+
const bold = (s) => `\x1b[1m${s}\x1b[0m`;
|
|
17
|
+
const dim = (s) => `\x1b[2m${s}\x1b[0m`;
|
|
18
|
+
// ─── Main ─────────────────────────────────────────────────────────────
|
|
19
|
+
async function main() {
|
|
20
|
+
const args = process.argv.slice(2);
|
|
21
|
+
// Parse project name (first positional arg)
|
|
22
|
+
const projectName = args.find((a) => !a.startsWith('--')) ?? 'my-vonosan-app';
|
|
23
|
+
// Parse flags
|
|
24
|
+
const saasFlag = args.includes('--saas');
|
|
25
|
+
process.stdout.write(bold(`\ncreate-vonosan v0.1.0\n\n`));
|
|
26
|
+
// ── Run interactive wizard ────────────────────────────────────────
|
|
27
|
+
const answers = await runWizard(projectName, saasFlag);
|
|
28
|
+
// ── Scaffold project files ────────────────────────────────────────
|
|
29
|
+
process.stdout.write(`\nScaffolding project "${projectName}"...\n`);
|
|
30
|
+
try {
|
|
31
|
+
scaffoldProject(answers, projectName);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
process.stderr.write(`\x1b[31mError: ${String(err)}\x1b[0m\n`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
process.stdout.write(green(`✔ Project files created.\n\n`));
|
|
38
|
+
// ── Install dependencies ──────────────────────────────────────────
|
|
39
|
+
const pm = answers.packageManager;
|
|
40
|
+
const installCmd = pm === 'bun' ? 'bun install' : `${pm} install`;
|
|
41
|
+
process.stdout.write(`Installing dependencies with ${bold(pm)}...\n`);
|
|
42
|
+
try {
|
|
43
|
+
await execa(pm, ['install'], {
|
|
44
|
+
cwd: projectName,
|
|
45
|
+
stdio: 'inherit',
|
|
46
|
+
});
|
|
47
|
+
process.stdout.write(green(`✔ Dependencies installed.\n\n`));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
process.stdout.write(`\x1b[33m⚠ Dependency install failed. Run "${installCmd}" manually.\x1b[0m\n\n`);
|
|
51
|
+
}
|
|
52
|
+
// ── Initialize git ────────────────────────────────────────────────
|
|
53
|
+
process.stdout.write(`Initializing git repository...\n`);
|
|
54
|
+
try {
|
|
55
|
+
await execa('git', ['init'], { cwd: projectName, stdio: 'pipe' });
|
|
56
|
+
await execa('git', ['add', '-A'], { cwd: projectName, stdio: 'pipe' });
|
|
57
|
+
await execa('git', ['commit', '-m', 'chore: initial project scaffold'], {
|
|
58
|
+
cwd: projectName,
|
|
59
|
+
stdio: 'pipe',
|
|
60
|
+
});
|
|
61
|
+
process.stdout.write(green(`✔ Git repository initialized.\n\n`));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
process.stdout.write(`\x1b[33m⚠ Git init failed. Initialize manually with "git init".\x1b[0m\n\n`);
|
|
65
|
+
}
|
|
66
|
+
// ── Done ──────────────────────────────────────────────────────────
|
|
67
|
+
process.stdout.write([
|
|
68
|
+
green(`✔ ${projectName} is ready!\n`),
|
|
69
|
+
'',
|
|
70
|
+
` ${dim('Next steps:')}`,
|
|
71
|
+
` ${bold(`cd ${projectName}`)}`,
|
|
72
|
+
` ${bold(`${pm === 'bun' ? 'bun' : pm} run dev`)}`,
|
|
73
|
+
'',
|
|
74
|
+
].join('\n'));
|
|
75
|
+
}
|
|
76
|
+
main().catch((err) => {
|
|
77
|
+
process.stderr.write(`\x1b[31mFatal: ${String(err)}\x1b[0m\n`);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAYhD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmUhF"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
const HEADER = (date) => `/**
|
|
11
|
+
* ──────────────────────────────────────────────────────────────────
|
|
12
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
13
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
14
|
+
* 🐙 GitHub: oyenet1
|
|
15
|
+
* 📅 Created Date: ${date}
|
|
16
|
+
* 🔄 Updated Date: ${date}
|
|
17
|
+
* ──────────────────────────────────────────────────────────────────
|
|
18
|
+
*/`;
|
|
19
|
+
export function generateTemplates(answers) {
|
|
20
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
21
|
+
const h = HEADER(date);
|
|
22
|
+
const { projectName, deploymentTarget, database, auth, apiDocs, saas, testing } = answers;
|
|
23
|
+
return {
|
|
24
|
+
'vonosan.config.ts': `${h}
|
|
25
|
+
|
|
26
|
+
import { defineVonosanConfig } from 'vonosan'
|
|
27
|
+
|
|
28
|
+
export default defineVonosanConfig({
|
|
29
|
+
app: {
|
|
30
|
+
name: '${projectName}',
|
|
31
|
+
url: process.env.APP_URL ?? 'http://localhost:4000',
|
|
32
|
+
env: process.env.NODE_ENV ?? 'development',
|
|
33
|
+
key: process.env.APP_KEY ?? 'change-me',
|
|
34
|
+
language: 'ts',
|
|
35
|
+
},
|
|
36
|
+
runtime: '${deploymentTarget}',
|
|
37
|
+
mode: '${answers.projectType}',
|
|
38
|
+
${saas ? 'saas: true,' : ''}
|
|
39
|
+
${apiDocs ? `docs: {
|
|
40
|
+
swagger: true,
|
|
41
|
+
fiberplane: false,
|
|
42
|
+
scalar: true,
|
|
43
|
+
openapi: '/openapi.json',
|
|
44
|
+
},` : ''}
|
|
45
|
+
${testing !== 'none' ? `test: { driver: '${testing}' },` : ''}
|
|
46
|
+
})
|
|
47
|
+
`,
|
|
48
|
+
'vite.config.ts': `${h}
|
|
49
|
+
|
|
50
|
+
import { defineConfig } from 'vite'
|
|
51
|
+
import { vonosan } from 'vonosan/vite'
|
|
52
|
+
import vonoConfig from './vonosan.config.js'
|
|
53
|
+
|
|
54
|
+
export default defineConfig({
|
|
55
|
+
plugins: [vonosan(vonoConfig)],
|
|
56
|
+
})
|
|
57
|
+
`,
|
|
58
|
+
'drizzle.config.ts': `${h}
|
|
59
|
+
|
|
60
|
+
import { defineConfig } from 'drizzle-kit'
|
|
61
|
+
|
|
62
|
+
export default defineConfig({
|
|
63
|
+
schema: './src/db/schema.ts',
|
|
64
|
+
out: './src/db/migrations',
|
|
65
|
+
dialect: '${database === 'postgres' ? 'postgresql' : database === 'mysql' ? 'mysql' : 'sqlite'}',
|
|
66
|
+
dbCredentials: {
|
|
67
|
+
url: process.env.DATABASE_URL!,
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
`,
|
|
71
|
+
'.env': `# ──────────────────────────────────────────────────────────────────
|
|
72
|
+
# ${projectName} — Environment Variables
|
|
73
|
+
# ──────────────────────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
NODE_ENV=development
|
|
76
|
+
PORT=4000
|
|
77
|
+
APP_URL=http://localhost:4000
|
|
78
|
+
APP_KEY=change-me-to-a-random-secret
|
|
79
|
+
|
|
80
|
+
DATABASE_URL=postgresql://postgres:password@localhost:5432/${projectName.replace(/-/g, '_')}
|
|
81
|
+
JWT_SECRET=change-me-to-a-random-jwt-secret
|
|
82
|
+
CLIENT_URL=http://localhost:5173
|
|
83
|
+
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:4000
|
|
84
|
+
`,
|
|
85
|
+
'.env.example': `# ──────────────────────────────────────────────────────────────────
|
|
86
|
+
# ${projectName} — Environment Variables Example
|
|
87
|
+
# Copy this file to .env and fill in the values.
|
|
88
|
+
# ──────────────────────────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
NODE_ENV=
|
|
91
|
+
PORT=
|
|
92
|
+
APP_URL=
|
|
93
|
+
APP_KEY=
|
|
94
|
+
|
|
95
|
+
DATABASE_URL=
|
|
96
|
+
JWT_SECRET=
|
|
97
|
+
CLIENT_URL=
|
|
98
|
+
ALLOWED_ORIGINS=
|
|
99
|
+
`,
|
|
100
|
+
'llms.txt': `# ${projectName}
|
|
101
|
+
|
|
102
|
+
> A Vonosan full-stack TypeScript application.
|
|
103
|
+
|
|
104
|
+
## Stack
|
|
105
|
+
- Runtime: ${deploymentTarget}
|
|
106
|
+
- Database: ${database}
|
|
107
|
+
- Auth: ${auth ? 'JWT + refresh tokens' : 'none'}
|
|
108
|
+
- Queue: ${answers.queue}
|
|
109
|
+
- Cache: ${answers.cache}
|
|
110
|
+
- Email: ${answers.email}
|
|
111
|
+
- Storage: ${answers.storage}
|
|
112
|
+
|
|
113
|
+
## Structure
|
|
114
|
+
- \`src/modules/\` — feature modules (routes, controller, service, schema)
|
|
115
|
+
- \`src/db/\` — Drizzle ORM schema and migrations
|
|
116
|
+
- \`src/shared/\` — shared utilities, gates, policies
|
|
117
|
+
- \`src/emails/\` — email templates
|
|
118
|
+
- \`src/jobs/\` — cron jobs
|
|
119
|
+
|
|
120
|
+
## Commands
|
|
121
|
+
- \`vonosan make:module <name>\` — scaffold a new module
|
|
122
|
+
- \`vonosan migrate:run\` — run pending migrations
|
|
123
|
+
- \`vonosan lint\` — check code quality
|
|
124
|
+
`,
|
|
125
|
+
'index.html': `<!DOCTYPE html>
|
|
126
|
+
<html lang="en" class="h-full">
|
|
127
|
+
<head>
|
|
128
|
+
<meta charset="UTF-8" />
|
|
129
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
130
|
+
<title>${projectName}</title>
|
|
131
|
+
</head>
|
|
132
|
+
<body class="h-full">
|
|
133
|
+
<div id="app" class="isolate"><!--ssr-outlet--></div>
|
|
134
|
+
<script type="module" src="/src/main.ts"></script>
|
|
135
|
+
</body>
|
|
136
|
+
</html>
|
|
137
|
+
`,
|
|
138
|
+
'src/App.vue': `<!--
|
|
139
|
+
${projectName} — Root App Component
|
|
140
|
+
-->
|
|
141
|
+
<template>
|
|
142
|
+
<UApp>
|
|
143
|
+
<RouterView />
|
|
144
|
+
</UApp>
|
|
145
|
+
</template>
|
|
146
|
+
`,
|
|
147
|
+
'src/main.ts': `${h}
|
|
148
|
+
|
|
149
|
+
import { createSSRApp } from 'vue'
|
|
150
|
+
import { createPinia } from 'pinia'
|
|
151
|
+
import { createHead } from '@unhead/vue'
|
|
152
|
+
import { ui } from '@nuxt/ui/vue-plugin'
|
|
153
|
+
import App from './App.vue'
|
|
154
|
+
import { createRouter } from './router.js'
|
|
155
|
+
|
|
156
|
+
export function createApp() {
|
|
157
|
+
const app = createSSRApp(App)
|
|
158
|
+
const pinia = createPinia()
|
|
159
|
+
const head = createHead()
|
|
160
|
+
const router = createRouter()
|
|
161
|
+
|
|
162
|
+
app.use(pinia)
|
|
163
|
+
app.use(head)
|
|
164
|
+
app.use(ui)
|
|
165
|
+
app.use(router)
|
|
166
|
+
|
|
167
|
+
return { app, pinia, head, router }
|
|
168
|
+
}
|
|
169
|
+
`,
|
|
170
|
+
'src/app.ts': `${h}
|
|
171
|
+
|
|
172
|
+
import { createVonosanApp } from 'vonosan/server'
|
|
173
|
+
import config from '../vonosan.config.js'
|
|
174
|
+
${apiDocs ? "import openApiSpec from './openapi.js'" : ''}
|
|
175
|
+
|
|
176
|
+
const app = createVonosanApp({
|
|
177
|
+
config,
|
|
178
|
+
${apiDocs ? 'openApiSpec,' : ''}
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
export default app
|
|
182
|
+
`,
|
|
183
|
+
'src/server.ts': `${h}
|
|
184
|
+
|
|
185
|
+
import app from './app.js'
|
|
186
|
+
|
|
187
|
+
const port = Number(process.env.PORT ?? 4000)
|
|
188
|
+
|
|
189
|
+
export default {
|
|
190
|
+
port,
|
|
191
|
+
fetch: app.fetch,
|
|
192
|
+
}
|
|
193
|
+
`,
|
|
194
|
+
'src/router.ts': `${h}
|
|
195
|
+
|
|
196
|
+
import { createRouter as _createRouter, createWebHistory, createMemoryHistory } from 'vue-router'
|
|
197
|
+
|
|
198
|
+
const routes = [
|
|
199
|
+
{
|
|
200
|
+
path: '/',
|
|
201
|
+
component: () => import('./modules/home/index.page.vue'),
|
|
202
|
+
},
|
|
203
|
+
]
|
|
204
|
+
|
|
205
|
+
export function createRouter() {
|
|
206
|
+
return _createRouter({
|
|
207
|
+
history: import.meta.env.SSR ? createMemoryHistory() : createWebHistory(),
|
|
208
|
+
routes,
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
`,
|
|
212
|
+
'src/route-rules.ts': `${h}
|
|
213
|
+
|
|
214
|
+
import type { RouteRules } from 'vonosan/server'
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Route rules — control SSR/SPA rendering per path.
|
|
218
|
+
* Matched top-to-bottom; first match wins.
|
|
219
|
+
*/
|
|
220
|
+
export const routeRules: RouteRules = {
|
|
221
|
+
'/': { ssr: true },
|
|
222
|
+
'/dashboard/**': { ssr: false },
|
|
223
|
+
'/admin/**': { ssr: false },
|
|
224
|
+
}
|
|
225
|
+
`,
|
|
226
|
+
'src/index.ts': `${h}
|
|
227
|
+
|
|
228
|
+
export { default } from './server.js'
|
|
229
|
+
`,
|
|
230
|
+
...(apiDocs
|
|
231
|
+
? {
|
|
232
|
+
'src/openapi.ts': `${h}
|
|
233
|
+
|
|
234
|
+
import { generateOpenApiSpec } from 'vonosan/server'
|
|
235
|
+
|
|
236
|
+
export default generateOpenApiSpec(
|
|
237
|
+
'${projectName}',
|
|
238
|
+
'1.0.0',
|
|
239
|
+
process.env.APP_URL ?? 'http://localhost:4000',
|
|
240
|
+
)
|
|
241
|
+
`,
|
|
242
|
+
}
|
|
243
|
+
: {}),
|
|
244
|
+
'src/db/index.ts': `${h}
|
|
245
|
+
|
|
246
|
+
import { createDb } from '@vonosan/drizzle'
|
|
247
|
+
|
|
248
|
+
export const { db, client } = createDb(process.env.DATABASE_URL!)
|
|
249
|
+
`,
|
|
250
|
+
'src/db/schema.ts': `${h}
|
|
251
|
+
|
|
252
|
+
// Auto-generated by vonosan schema:sync
|
|
253
|
+
// Add your schema imports here
|
|
254
|
+
|
|
255
|
+
export {}
|
|
256
|
+
`,
|
|
257
|
+
'src/db/relations.ts': `${h}
|
|
258
|
+
|
|
259
|
+
// Cross-module Drizzle relations
|
|
260
|
+
// Import and re-export relations from each module schema here
|
|
261
|
+
|
|
262
|
+
export {}
|
|
263
|
+
`,
|
|
264
|
+
'package.json': JSON.stringify({
|
|
265
|
+
name: projectName,
|
|
266
|
+
version: '0.1.0',
|
|
267
|
+
type: 'module',
|
|
268
|
+
scripts: {
|
|
269
|
+
dev: 'vite',
|
|
270
|
+
build: 'vite build',
|
|
271
|
+
preview: 'vite preview',
|
|
272
|
+
start: 'bun dist/server/index.js',
|
|
273
|
+
'migrate:run': 'vonosan migrate:run',
|
|
274
|
+
'migrate:make': 'vonosan migrate:make',
|
|
275
|
+
lint: 'vonosan lint',
|
|
276
|
+
...(testing !== 'none' ? { test: testing === 'bun' ? 'bun test' : testing } : {}),
|
|
277
|
+
},
|
|
278
|
+
dependencies: {
|
|
279
|
+
vonosan: 'latest',
|
|
280
|
+
'@vonosan/drizzle': 'latest',
|
|
281
|
+
hono: 'latest',
|
|
282
|
+
vue: 'latest',
|
|
283
|
+
'vue-router': 'latest',
|
|
284
|
+
pinia: 'latest',
|
|
285
|
+
'@unhead/vue': 'latest',
|
|
286
|
+
'@nuxt/ui': 'latest',
|
|
287
|
+
'drizzle-orm': 'latest',
|
|
288
|
+
zod: 'latest',
|
|
289
|
+
},
|
|
290
|
+
devDependencies: {
|
|
291
|
+
'@vonosan/cli': 'latest',
|
|
292
|
+
typescript: 'latest',
|
|
293
|
+
vite: 'latest',
|
|
294
|
+
'drizzle-kit': 'latest',
|
|
295
|
+
'@types/bun': 'latest',
|
|
296
|
+
},
|
|
297
|
+
}, null, 2),
|
|
298
|
+
'tsconfig.json': JSON.stringify({
|
|
299
|
+
compilerOptions: {
|
|
300
|
+
target: 'ESNext',
|
|
301
|
+
module: 'ESNext',
|
|
302
|
+
moduleResolution: 'bundler',
|
|
303
|
+
strict: true,
|
|
304
|
+
jsx: 'preserve',
|
|
305
|
+
lib: ['ESNext', 'DOM'],
|
|
306
|
+
paths: {
|
|
307
|
+
'@@ws-adapter': ['./node_modules/@vonosan/ws/adapters/bun.js'],
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
include: ['src/**/*', 'vonosan.config.ts'],
|
|
311
|
+
exclude: ['node_modules', 'dist'],
|
|
312
|
+
}, null, 2),
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-vonosan",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Create a new Vonosan project",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Bowofade Oyerinde",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/oyenet1/vonosan.git",
|
|
11
|
+
"directory": "packages/create-vonosan"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/oyenet1/vonosan#readme",
|
|
14
|
+
"keywords": ["vonosan", "vue", "vite", "ssr", "create", "scaffold", "cli"],
|
|
15
|
+
"bin": {
|
|
16
|
+
"create-vonosan": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"files": ["dist"],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"dev": "tsc -p tsconfig.json --watch"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@clack/prompts": "0.11.0",
|
|
26
|
+
"execa": "9.5.2",
|
|
27
|
+
"giget": "1.2.3",
|
|
28
|
+
"kolorist": "1.8.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/bun": "1.2.14",
|
|
32
|
+
"@types/node": "25.5.2",
|
|
33
|
+
"typescript": "5.8.3"
|
|
34
|
+
}
|
|
35
|
+
}
|