create-baeta 1.0.9 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,878 @@
1
+ // lib/constants.ts
2
+ var defaultPackageManager = "npm";
3
+ var lockfileNames = {
4
+ npm: "package-lock.json",
5
+ yarn: "yarn.lock",
6
+ pnpm: "pnpm-lock.yaml",
7
+ bun: "bun.lockb"
8
+ };
9
+ var packageManagers = Object.keys(lockfileNames);
10
+ var runtimes = ["node", "deno", "bun"];
11
+ var defaultJavaScriptRuntime = "node";
12
+ var templates = ["yoga", "apollo"];
13
+
14
+ // lib/app-name.ts
15
+ import path from "path";
16
+ import { logger } from "@docusaurus/logger";
17
+ import fs from "fs-extra";
18
+ import prompts from "prompts";
19
+ async function getAppName(reqName, rootDir) {
20
+ async function validateAppName(appName) {
21
+ if (!appName) {
22
+ return "An app name is required.";
23
+ }
24
+ const dest = path.resolve(rootDir, appName);
25
+ if (await fs.pathExists(dest)) {
26
+ return logger.interpolate`Directory already exists at path=${dest}!`;
27
+ }
28
+ return true;
29
+ }
30
+ if (reqName) {
31
+ const res = await validateAppName(reqName);
32
+ if (typeof res === "string") {
33
+ throw new Error(res);
34
+ }
35
+ return reqName;
36
+ }
37
+ return prompts(
38
+ {
39
+ type: "text",
40
+ name: "appName",
41
+ message: "What should we name this app?",
42
+ initial: "baeta-app",
43
+ validate: validateAppName
44
+ },
45
+ {
46
+ onCancel() {
47
+ logger.error("An app name is required.");
48
+ process.exit(1);
49
+ }
50
+ }
51
+ ).then((result) => result.appName);
52
+ }
53
+
54
+ // lib/package-manager.ts
55
+ import path2 from "path";
56
+ import { logger as logger2 } from "@docusaurus/logger";
57
+ import fs2 from "fs-extra";
58
+ import prompts2 from "prompts";
59
+ import shell from "shelljs";
60
+ async function findPackageManagerFromLockFile(rootDir) {
61
+ for (const packageManager of packageManagers) {
62
+ const lockFilePath = path2.join(rootDir, lockfileNames[packageManager]);
63
+ if (await fs2.pathExists(lockFilePath)) {
64
+ return packageManager;
65
+ }
66
+ }
67
+ return void 0;
68
+ }
69
+ function findPackageManagerFromUserAgent() {
70
+ return packageManagers.find(
71
+ (packageManager) => process.env.npm_config_user_agent?.startsWith(packageManager)
72
+ );
73
+ }
74
+ async function askForPackageManagerChoice() {
75
+ const hasYarn = shell.exec("yarn --version", { silent: true }).code === 0;
76
+ const hasPnpm = shell.exec("pnpm --version", { silent: true }).code === 0;
77
+ const hasBun = shell.exec("bun --version", { silent: true }).code === 0;
78
+ if (!hasYarn && !hasPnpm && !hasBun) {
79
+ return "npm";
80
+ }
81
+ const choices = ["npm", hasYarn && "yarn", hasPnpm && "pnpm", hasBun && "bun"].filter((p) => Boolean(p)).map((p) => ({ title: p, value: p }));
82
+ const manager = await prompts2(
83
+ {
84
+ type: "select",
85
+ name: "packageManager",
86
+ message: "Select a package manager...",
87
+ choices
88
+ },
89
+ {
90
+ onCancel() {
91
+ logger2.info`Falling back to name=${defaultPackageManager}`;
92
+ }
93
+ }
94
+ ).then((result) => result.packageManager);
95
+ return manager ?? defaultPackageManager;
96
+ }
97
+ async function getPackageManager(dest, { packageManager, skipInstall }) {
98
+ if (packageManager && !packageManagers.includes(packageManager)) {
99
+ throw new Error(
100
+ `Invalid package manager choice ${packageManager}. Must be one of ${packageManagers.join(
101
+ ", "
102
+ )}`
103
+ );
104
+ }
105
+ const fromLockfile = await findPackageManagerFromLockFile(dest);
106
+ if (fromLockfile) {
107
+ return fromLockfile;
108
+ }
109
+ if (packageManager) {
110
+ return packageManager;
111
+ }
112
+ const fromLockfileInCwd = await findPackageManagerFromLockFile(".");
113
+ if (fromLockfileInCwd) {
114
+ return fromLockfileInCwd;
115
+ }
116
+ const fromUserAgent = findPackageManagerFromUserAgent();
117
+ if (fromUserAgent) {
118
+ return fromUserAgent;
119
+ }
120
+ if (skipInstall) {
121
+ return defaultPackageManager;
122
+ }
123
+ return askForPackageManagerChoice();
124
+ }
125
+ function getInstallCommand(pkgManager) {
126
+ if (pkgManager === "yarn") {
127
+ return "yarn";
128
+ }
129
+ if (pkgManager === "bun") {
130
+ return "bun install";
131
+ }
132
+ return `${pkgManager} install --color always`;
133
+ }
134
+
135
+ // lib/runtime.ts
136
+ import { logger as logger3 } from "@docusaurus/logger";
137
+ import prompts3 from "prompts";
138
+ import shell2 from "shelljs";
139
+ async function getRuntime() {
140
+ const hasBun = shell2.exec("bun --version", { silent: true }).code === 0;
141
+ const hasDeno = shell2.exec("deno --version", { silent: true }).code === 0;
142
+ if (!hasDeno && !hasBun) {
143
+ return "node";
144
+ }
145
+ const choices = ["node", hasBun && "bun", hasDeno && "deno"].filter((p) => Boolean(p)).map((p) => ({ title: p, value: p }));
146
+ const runtime = await prompts3(
147
+ {
148
+ type: "select",
149
+ name: "runtime",
150
+ message: "Select a runtime...",
151
+ choices
152
+ },
153
+ {
154
+ onCancel() {
155
+ logger3.info`Falling back to name=${defaultJavaScriptRuntime}`;
156
+ }
157
+ }
158
+ ).then((result) => result.runtime);
159
+ return runtime ?? defaultJavaScriptRuntime;
160
+ }
161
+
162
+ // lib/templates.ts
163
+ import path3 from "path";
164
+ import { logger as logger4 } from "@docusaurus/logger";
165
+ import fs3 from "fs-extra";
166
+ import prompts4 from "prompts";
167
+
168
+ // meta/apollo/package.json
169
+ var package_default = {
170
+ name: "@baeta/template-apollo",
171
+ version: "0.0.0",
172
+ private: true,
173
+ type: "module",
174
+ scripts: {
175
+ build: "baeta build --generate",
176
+ start: "baeta build --watch --generate --onSuccess='node --enable-source-maps --inspect dist/app.js'"
177
+ },
178
+ dependencies: {
179
+ "@apollo/server": "^4.12.2",
180
+ "@baeta/core": "workspace:^",
181
+ "@baeta/errors": "workspace:^",
182
+ "@baeta/extension-complexity": "workspace:^",
183
+ graphql: "^16.11.0"
184
+ },
185
+ devDependencies: {
186
+ "@baeta/cli": "workspace:^",
187
+ "@baeta/compiler": "workspace:^",
188
+ "@baeta/plugin-autoload": "workspace:^",
189
+ "@types/bun": "^1.2.15",
190
+ "@types/deno": "^2.3.0",
191
+ "@types/node": "^22.15.30",
192
+ typescript: "^5.8.3"
193
+ }
194
+ };
195
+
196
+ // ../../tools/tsconfig/tsconfig.json
197
+ var tsconfig_default = {
198
+ $schema: "https://json.schemastore.org/tsconfig",
199
+ compilerOptions: {
200
+ target: "es2024",
201
+ lib: [
202
+ "es2024"
203
+ ],
204
+ module: "esnext",
205
+ noEmit: true,
206
+ strict: true,
207
+ noImplicitAny: true,
208
+ isolatedModules: true,
209
+ esModuleInterop: true,
210
+ verbatimModuleSyntax: true,
211
+ allowImportingTsExtensions: true,
212
+ allowSyntheticDefaultImports: true,
213
+ skipLibCheck: true,
214
+ forceConsistentCasingInFileNames: true,
215
+ moduleResolution: "bundler"
216
+ }
217
+ };
218
+
219
+ // versions.json
220
+ var versions_default = {
221
+ "@baeta/cli": "1.0.12",
222
+ "@baeta/compiler": "1.0.12",
223
+ "@baeta/core": "1.0.12",
224
+ "create-baeta": "1.0.12",
225
+ "@baeta/directives": "1.0.12",
226
+ "@baeta/env": "1.0.12",
227
+ "@baeta/errors": "1.0.12",
228
+ "@baeta/extension-auth": "1.0.12",
229
+ "@baeta/extension-cache": "1.0.12",
230
+ "@baeta/extension-cache-cloudflare": "1.0.12",
231
+ "@baeta/extension-cache-keyv": "1.0.12",
232
+ "@baeta/extension-cache-redis": "1.0.12",
233
+ "@baeta/extension-cache-upstash": "1.0.12",
234
+ "@baeta/extension-complexity": "1.0.12",
235
+ "@baeta/generator": "1.0.3",
236
+ "@baeta/generator-sdk": "1.0.3",
237
+ "@baeta/plugin": "1.0.2",
238
+ "@baeta/plugin-autoload": "1.0.12",
239
+ "@baeta/plugin-cloudflare": "1.0.12",
240
+ "@baeta/plugin-directives": "1.0.12",
241
+ "@baeta/plugin-exec": "1.0.12",
242
+ "@baeta/plugin-gitignore": "1.0.12",
243
+ "@baeta/plugin-graphql": "1.0.12",
244
+ "@baeta/plugin-pagination": "1.0.12",
245
+ "@baeta/plugin-prisma": "1.0.12",
246
+ "@baeta/subscriptions-cloudflare": "0.1.7",
247
+ "@baeta/subscriptions-pubsub": "1.0.12",
248
+ "@baeta/util-encoding": "1.0.2",
249
+ "@baeta/util-env": "1.0.2",
250
+ "@baeta/util-log": "1.0.2",
251
+ "@baeta/util-path": "1.0.2"
252
+ };
253
+
254
+ // templates/shared.ts
255
+ function makeSharedTemplate(appName, runtime, packageJson) {
256
+ return [
257
+ makePackageJson(appName, runtime, packageJson),
258
+ {
259
+ relativePath: "./tsconfig.json",
260
+ content: JSON.stringify(
261
+ {
262
+ ...tsconfig_default,
263
+ compilerOptions: {
264
+ ...tsconfig_default.compilerOptions,
265
+ rootDir: "src",
266
+ outDir: "dist",
267
+ noEmit: true,
268
+ emitDeclarationOnly: false
269
+ },
270
+ exclude: ["baeta.ts"]
271
+ },
272
+ null,
273
+ 2
274
+ )
275
+ },
276
+ {
277
+ relativePath: "./src/lib/extensions.ts",
278
+ content: `import { createExtensions } from '@baeta/core';
279
+ import { complexityExtension } from '@baeta/extension-complexity';
280
+ import type { Context } from '../types/context.ts';
281
+
282
+ const complexity = complexityExtension<Context>({
283
+ defaultComplexity: 1,
284
+ defaultListMultiplier: 10,
285
+ async limit(ctx) {
286
+ return {
287
+ depth: 10,
288
+ breadth: 50,
289
+ complexity: 1000,
290
+ };
291
+ },
292
+ });
293
+
294
+ export default createExtensions(complexity);
295
+ `
296
+ },
297
+ {
298
+ relativePath: "./src/modules/user/user.gql",
299
+ content: `type User {
300
+ id: ID!
301
+ email: String!
302
+ lastName: String!
303
+ profile: String
304
+ givenName: String
305
+ }
306
+
307
+ input UserWhereUniqueInput {
308
+ id: ID!
309
+ }
310
+
311
+ type Query {
312
+ user(where: UserWhereUniqueInput!): User
313
+ users: [User!]
314
+ }
315
+ `
316
+ },
317
+ {
318
+ relativePath: "./src/modules/user/user.resolvers.ts",
319
+ content: `import { getUserModule } from './typedef.ts';
320
+
321
+ const { Query } = getUserModule();
322
+
323
+ Query.user(({ args }) => {
324
+ return {
325
+ id: args.where.id,
326
+ email: 'jon.doe@baeta.io',
327
+ lastName: 'Doe',
328
+ };
329
+ });
330
+
331
+ Query.user.$use(async ({ args }, next) => {
332
+ const result = await next();
333
+ console.log('Got user:', result, 'for args:', args);
334
+ return result;
335
+ });
336
+
337
+ Query.users(() => {
338
+ const users = Array.from({ length: 10 }).map((_, i) => ({
339
+ id: i.toString(),
340
+ email: \`jon.doe\${i}@baeta.io\`,
341
+ lastName: \`Doe \${i}\`,
342
+ }));
343
+ return users;
344
+ });
345
+ `
346
+ },
347
+ {
348
+ relativePath: "./src/modules/user-photos/user-photos.gql",
349
+ content: `type UserPhoto {
350
+ id: ID!
351
+ userId: ID!
352
+ url: String!
353
+ }
354
+
355
+ extend type User {
356
+ photos: [UserPhoto!]
357
+ }
358
+ `
359
+ },
360
+ {
361
+ relativePath: "./src/modules/user-photos/user-photos.resolvers.ts",
362
+ content: `import { getUserPhotosModule } from './typedef.ts';
363
+
364
+ const { User } = getUserPhotosModule();
365
+
366
+ User.photos(({ root }) => {
367
+ return Array.from({ length: 10 }).map((_, i) => ({
368
+ id: \`u\${root.id}_p\${i}\`,
369
+ userId: root.id,
370
+ url: \`https://baeta.io/user/\${root.id}/photo/\${i}.png\`,
371
+ }));
372
+ });
373
+ `
374
+ },
375
+ {
376
+ relativePath: "./baeta.ts",
377
+ content: `import { defineConfig } from '@baeta/cli';
378
+ import { autoloadPlugin } from '@baeta/plugin-autoload';
379
+
380
+ export default defineConfig({
381
+ graphql: {
382
+ schemas: ['src/**/*.gql'],
383
+ contextType: 'src/types/context#Context',
384
+ extensions: 'src/lib/extensions.ts',
385
+ },
386
+ compiler: {
387
+ src: 'src/app.ts',
388
+ dist: 'dist',
389
+ bundleWorkspaces: true,
390
+ esbuild: {
391
+ format: 'esm',
392
+ },
393
+ },
394
+ plugins: [autoloadPlugin()],
395
+ });
396
+ `
397
+ },
398
+ {
399
+ relativePath: "./.gitignore",
400
+ content: `# Logs
401
+ logs
402
+ *.log
403
+ npm-debug.log*
404
+ yarn-debug.log*
405
+ yarn-error.log*
406
+ lerna-debug.log*
407
+ .pnpm-debug.log*
408
+
409
+ # Diagnostic reports (https://nodejs.org/api/report.html)
410
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
411
+
412
+ # Runtime data
413
+ pids
414
+ *.pid
415
+ *.seed
416
+ *.pid.lock
417
+
418
+ # Directory for instrumented libs generated by jscoverage/JSCover
419
+ lib-cov
420
+
421
+ # Coverage directory used by tools like istanbul
422
+ coverage
423
+ *.lcov
424
+
425
+ # nyc test coverage
426
+ .nyc_output
427
+
428
+ # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
429
+ .grunt
430
+
431
+ # Bower dependency directory (https://bower.io/)
432
+ bower_components
433
+
434
+ # node-waf configuration
435
+ .lock-wscript
436
+
437
+ # Compiled binary addons (https://nodejs.org/api/addons.html)
438
+ build/Release
439
+
440
+ # Dependency directories
441
+ node_modules/
442
+ jspm_packages/
443
+
444
+ # Snowpack dependency directory (https://snowpack.dev/)
445
+ web_modules/
446
+
447
+ # TypeScript cache
448
+ *.tsbuildinfo
449
+
450
+ # Optional npm cache directory
451
+ .npm
452
+
453
+ # Optional eslint cache
454
+ .eslintcache
455
+
456
+ # Optional stylelint cache
457
+ .stylelintcache
458
+
459
+ # Microbundle cache
460
+ .rpt2_cache/
461
+ .rts2_cache_cjs/
462
+ .rts2_cache_es/
463
+ .rts2_cache_umd/
464
+
465
+ # Optional REPL history
466
+ .node_repl_history
467
+
468
+ # Output of 'npm pack'
469
+ *.tgz
470
+
471
+ # Yarn Integrity file
472
+ .yarn-integrity
473
+
474
+ # dotenv environment variable files
475
+ .env
476
+ .env.development.local
477
+ .env.test.local
478
+ .env.production.local
479
+ .env.local
480
+
481
+ # parcel-bundler cache (https://parceljs.org/)
482
+ .cache
483
+ .parcel-cache
484
+
485
+ # Next.js build output
486
+ .next
487
+ out
488
+
489
+ # Nuxt.js build / generate output
490
+ .nuxt
491
+ dist
492
+
493
+ # Gatsby files
494
+ .cache/
495
+ # Comment in the public line in if your project uses Gatsby and not Next.js
496
+ # https://nextjs.org/blog/next-9-1#public-directory-support
497
+ # public
498
+
499
+ # vuepress build output
500
+ .vuepress/dist
501
+
502
+ # vuepress v2.x temp and cache directory
503
+ .temp
504
+ .cache
505
+
506
+ # vitepress build output
507
+ **/.vitepress/dist
508
+
509
+ # vitepress cache directory
510
+ **/.vitepress/cache
511
+
512
+ # Docusaurus cache and generated files
513
+ .docusaurus
514
+
515
+ # Serverless directories
516
+ .serverless/
517
+
518
+ # FuseBox cache
519
+ .fusebox/
520
+
521
+ # DynamoDB Local files
522
+ .dynamodb/
523
+
524
+ # TernJS port file
525
+ .tern-port
526
+
527
+ # Stores VSCode versions used for testing VSCode extensions
528
+ .vscode-test
529
+
530
+ # yarn v2
531
+ .yarn/cache
532
+ .yarn/unplugged
533
+ .yarn/build-state.yml
534
+ .yarn/install-state.gz
535
+ .pnp.*
536
+ `
537
+ }
538
+ ];
539
+ }
540
+ function makePackageJson(appName, runtime, packageJson) {
541
+ const meta = structuredClone(packageJson);
542
+ for (const [dep, version] of Object.entries(versions_default)) {
543
+ if (dep in meta.dependencies) {
544
+ meta.dependencies[dep] = version;
545
+ } else if (dep in packageJson.devDependencies) {
546
+ meta.devDependencies[dep] = version;
547
+ }
548
+ }
549
+ if (runtime === "node") {
550
+ meta.devDependencies["@types/bun"] = void 0;
551
+ meta.devDependencies["@types/deno"] = void 0;
552
+ }
553
+ if (runtime === "bun") {
554
+ meta.scripts.start = `baeta generate --watch --run='bun --watch --inspect src/app.ts'`;
555
+ meta.devDependencies["@types/node"] = void 0;
556
+ meta.devDependencies["@types/deno"] = void 0;
557
+ }
558
+ if (runtime === "deno") {
559
+ meta.scripts.start = `baeta generate --watch --run='deno --watch --allow-env --allow-read --allow-net src/app.ts'`;
560
+ meta.devDependencies["@types/node"] = void 0;
561
+ meta.devDependencies["@types/bun"] = void 0;
562
+ }
563
+ meta.name = appName;
564
+ return {
565
+ relativePath: "./package.json",
566
+ content: JSON.stringify(meta, null, 2)
567
+ };
568
+ }
569
+
570
+ // templates/apollo.ts
571
+ async function makeApolloTemplate(appName, runtime) {
572
+ return [
573
+ ...makeSharedTemplate(appName, runtime, package_default),
574
+ {
575
+ relativePath: "./src/types/context.ts",
576
+ content: `export type Context = {
577
+ userId?: string;
578
+ };
579
+ `
580
+ },
581
+ {
582
+ relativePath: "./src/app.ts",
583
+ content: `import { ApolloServer } from '@apollo/server';
584
+ import { startStandaloneServer } from '@apollo/server/standalone';
585
+ import { createApplication } from '@baeta/core';
586
+ import { modules } from './modules/autoload.ts';
587
+ import type { Context } from './types/context.ts';
588
+
589
+ const baeta = createApplication({
590
+ modules,
591
+ });
592
+
593
+ const server = new ApolloServer<Context>({
594
+ schema: baeta.schema,
595
+ });
596
+
597
+ const { url } = await startStandaloneServer(server, {
598
+ listen: { port: 4000 },
599
+ });
600
+
601
+ console.log(\`\u{1F680} Server ready at: \${url}\`);
602
+ `
603
+ }
604
+ ];
605
+ }
606
+
607
+ // meta/yoga/package.json
608
+ var package_default2 = {
609
+ name: "@baeta/template-yoga",
610
+ version: "0.0.0",
611
+ private: true,
612
+ type: "module",
613
+ scripts: {
614
+ build: "baeta build --generate",
615
+ start: "baeta build --watch --generate --onSuccess='node --enable-source-maps --inspect dist/app.js'"
616
+ },
617
+ dependencies: {
618
+ "@baeta/core": "workspace:^",
619
+ "@baeta/errors": "workspace:^",
620
+ "@baeta/extension-complexity": "workspace:^",
621
+ graphql: "^16.11.0",
622
+ "graphql-yoga": "^5.13.5"
623
+ },
624
+ devDependencies: {
625
+ "@baeta/cli": "workspace:^",
626
+ "@baeta/compiler": "workspace:^",
627
+ "@baeta/plugin-autoload": "workspace:^",
628
+ "@types/bun": "^1.2.15",
629
+ "@types/deno": "^2.3.0",
630
+ "@types/node": "^22.15.30",
631
+ typescript: "^5.8.3"
632
+ }
633
+ };
634
+
635
+ // templates/yoga.ts
636
+ async function makeYogaTemplate(appName, runtime) {
637
+ return [
638
+ ...makeSharedTemplate(appName, runtime, package_default2),
639
+ ...makeRuntimeFiles(runtime),
640
+ {
641
+ relativePath: "./src/types/context.ts",
642
+ content: `export type Context = {
643
+ appVersion: string;
644
+ };
645
+
646
+ // biome-ignore lint/complexity/noBannedTypes: Empty context
647
+ export type ServerContext = {};
648
+ `
649
+ }
650
+ ];
651
+ }
652
+ function makeRuntimeFiles(runtime) {
653
+ switch (runtime) {
654
+ case "bun":
655
+ return makeBunFiles();
656
+ case "deno":
657
+ return makeDenoFiles();
658
+ case "node":
659
+ return makeNodeFiles();
660
+ default:
661
+ return [];
662
+ }
663
+ }
664
+ function makeBunFiles() {
665
+ return [
666
+ {
667
+ relativePath: "./src/app.ts",
668
+ content: `import { createApplication } from '@baeta/core';
669
+ import { createYoga } from 'graphql-yoga';
670
+ import { modules } from './modules/autoload.ts';
671
+ import type { Context, ServerContext } from './types/context.ts';
672
+
673
+ const baeta = createApplication({
674
+ modules,
675
+ });
676
+
677
+ export const yoga = createYoga<ServerContext, Context>({
678
+ schema: baeta.schema,
679
+ context: {
680
+ appVersion: '1.0.0',
681
+ },
682
+ });
683
+
684
+ Bun.serve({
685
+ fetch: yoga.fetch,
686
+ port: 4000,
687
+ });
688
+
689
+ console.log(\`\u{1F680} Server ready at http://localhost:4000\${yoga.graphqlEndpoint}\`);
690
+ `
691
+ }
692
+ ];
693
+ }
694
+ function makeDenoFiles() {
695
+ return [
696
+ {
697
+ relativePath: "./src/app.ts",
698
+ content: `import { createApplication } from '@baeta/core';
699
+ import { createYoga } from 'graphql-yoga';
700
+ import { modules } from './modules/autoload.ts';
701
+ import type { Context, ServerContext } from './types/context.ts';
702
+
703
+ const baeta = createApplication({
704
+ modules,
705
+ });
706
+
707
+ export const yoga = createYoga<ServerContext, Context>({
708
+ schema: baeta.schema,
709
+ context: {
710
+ appVersion: '1.0.0',
711
+ },
712
+ });
713
+
714
+ Deno.serve(
715
+ {
716
+ port: 4000,
717
+ onListen() {
718
+ console.log(\`\u{1F680} Server ready at http://localhost:4000\${yoga.graphqlEndpoint}\`);
719
+ },
720
+ },
721
+ yoga.fetch,
722
+ );
723
+ `
724
+ }
725
+ ];
726
+ }
727
+ function makeNodeFiles() {
728
+ return [
729
+ {
730
+ relativePath: "./src/app.ts",
731
+ content: `import { createServer } from 'node:http';
732
+ import { createApplication } from '@baeta/core';
733
+ import { createYoga } from 'graphql-yoga';
734
+ import { modules } from './modules/autoload.ts';
735
+ import type { Context, ServerContext } from './types/context.ts';
736
+
737
+ const baeta = createApplication({
738
+ modules,
739
+ });
740
+
741
+ export const yoga = createYoga<ServerContext, Context>({
742
+ schema: baeta.schema,
743
+ context: {
744
+ appVersion: '1.0.0',
745
+ },
746
+ });
747
+
748
+ const server = createServer(yoga);
749
+
750
+ server.listen(4000, () => {
751
+ console.log(\`\u{1F680} Server ready at http://localhost:4000\${yoga.graphqlEndpoint}\`);
752
+ });
753
+ `
754
+ }
755
+ ];
756
+ }
757
+
758
+ // lib/templates.ts
759
+ function createTemplateChoices() {
760
+ return templates.map((template) => ({ title: template, value: template }));
761
+ }
762
+ async function askTemplateChoice() {
763
+ return prompts4(
764
+ {
765
+ type: "select",
766
+ name: "template",
767
+ message: "Select a template below...",
768
+ choices: createTemplateChoices()
769
+ },
770
+ {
771
+ onCancel() {
772
+ logger4.error("A choice is required.");
773
+ process.exit(1);
774
+ }
775
+ }
776
+ ).then((result) => {
777
+ return result.template;
778
+ });
779
+ }
780
+ async function getTemplate(reqTemplate) {
781
+ const userProvided = reqTemplate ? templates.find((t) => t === reqTemplate) : null;
782
+ const template = userProvided ?? await askTemplateChoice();
783
+ if (!template) {
784
+ throw new Error("Template not found");
785
+ }
786
+ return template;
787
+ }
788
+ function getTemplateFiles(template, appName, runtime) {
789
+ switch (template) {
790
+ case "yoga":
791
+ return makeYogaTemplate(appName, runtime);
792
+ case "apollo":
793
+ return makeApolloTemplate(appName, runtime);
794
+ default:
795
+ return [];
796
+ }
797
+ }
798
+ async function copyTemplate(appName, runtime, template, dest) {
799
+ const files = await getTemplateFiles(template, appName, runtime);
800
+ const promises = files.map((file) => {
801
+ const filePath = path3.join(dest, file.relativePath);
802
+ return fs3.ensureDir(path3.dirname(filePath)).then(() => fs3.writeFile(filePath, file.content));
803
+ });
804
+ await Promise.all(promises);
805
+ }
806
+
807
+ // lib/handler.ts
808
+ import path4 from "path";
809
+ import { logger as logger5 } from "@docusaurus/logger";
810
+ import shell3 from "shelljs";
811
+ import supportsColor from "supports-color";
812
+ async function handler(args) {
813
+ const appName = await getAppName(args.appName, args.rootDir);
814
+ const dest = path4.resolve(args.rootDir, appName);
815
+ const template = await getTemplate(args.template);
816
+ const runtime = await getRuntime();
817
+ logger5.info("Creating new Baeta project...");
818
+ try {
819
+ await copyTemplate(appName, runtime, template, dest);
820
+ } catch (err) {
821
+ logger5.error`Copying Baeta template name=${template} failed!`;
822
+ throw err;
823
+ }
824
+ const pkgManager = await getPackageManager(dest, args);
825
+ if (!args.skipInstall) {
826
+ shell3.cd(dest);
827
+ logger5.info`Installing dependencies with name=${pkgManager}...`;
828
+ const result = shell3.exec(getInstallCommand(pkgManager), {
829
+ env: {
830
+ ...process.env,
831
+ ...supportsColor.stdout ? { FORCE_COLOR: "1" } : {}
832
+ }
833
+ });
834
+ if (result.code !== 0) {
835
+ console.error("Dependency installation failed.");
836
+ logger5.error("Dependency installation failed.");
837
+ logger5.info`The app directory has already been created, and you can retry by typing:
838
+
839
+ code=${`cd ${dest}`}
840
+ code=${`${pkgManager} install`}`;
841
+ process.exit(0);
842
+ }
843
+ }
844
+ const useNpm = pkgManager === "npm";
845
+ const useBun = pkgManager === "bun";
846
+ const useRunCommand = useNpm || useBun;
847
+ logger5.success`Created name=${dest}.`;
848
+ logger5.info`Inside that directory, you can run several commands:
849
+
850
+ code=${`${pkgManager} start`}
851
+ Starts the development server.
852
+
853
+ code=${`${pkgManager} ${useRunCommand ? "run " : ""}build`}
854
+ Bundles your server application.
855
+
856
+ We recommend that you begin by typing:
857
+
858
+ code=${`cd ${dest}`}
859
+ code=${`${pkgManager} start`}
860
+ `;
861
+ }
862
+
863
+ export {
864
+ defaultPackageManager,
865
+ lockfileNames,
866
+ packageManagers,
867
+ runtimes,
868
+ defaultJavaScriptRuntime,
869
+ templates,
870
+ getAppName,
871
+ getPackageManager,
872
+ getInstallCommand,
873
+ getRuntime,
874
+ getTemplate,
875
+ copyTemplate,
876
+ handler
877
+ };
878
+ //# sourceMappingURL=chunk-CJP3Q273.js.map