create-taserjs 0.0.2 → 0.0.3

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.
Files changed (111) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/addons/arktype/index.cjs.map +1 -1
  3. package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
  4. package/dist/cjs/addons/kysely/index.cjs.map +1 -1
  5. package/dist/cjs/addons/pino/index.cjs.map +1 -1
  6. package/dist/cjs/addons/prisma/index.cjs +84 -24
  7. package/dist/cjs/addons/prisma/index.cjs.map +1 -1
  8. package/dist/cjs/addons/registry.cjs +1 -1
  9. package/dist/cjs/addons/registry.cjs.map +1 -1
  10. package/dist/cjs/addons/types.d.cts +1 -1
  11. package/dist/cjs/addons/valibot/index.cjs.map +1 -1
  12. package/dist/cjs/addons/validators.cjs.map +1 -1
  13. package/dist/cjs/addons/winston/index.cjs.map +1 -1
  14. package/dist/cjs/addons/zod/index.cjs.map +1 -1
  15. package/dist/cjs/cli.cjs +5 -0
  16. package/dist/cjs/cli.cjs.map +1 -1
  17. package/dist/cjs/commands/create.cjs +44 -11
  18. package/dist/cjs/commands/create.cjs.map +1 -1
  19. package/dist/cjs/commands/create.d.cts +1 -0
  20. package/dist/cjs/core/json-output.cjs.map +1 -1
  21. package/dist/cjs/core/package-manager.cjs.map +1 -1
  22. package/dist/cjs/core/package-manager.d.cts +1 -1
  23. package/dist/cjs/core/parse-options.cjs +7 -7
  24. package/dist/cjs/core/parse-options.cjs.map +1 -1
  25. package/dist/cjs/core/parse-options.d.cts +3 -3
  26. package/dist/cjs/core/project-config.cjs +1 -1
  27. package/dist/cjs/core/project-config.cjs.map +1 -1
  28. package/dist/cjs/core/resolve-packages.cjs +41 -7
  29. package/dist/cjs/core/resolve-packages.cjs.map +1 -1
  30. package/dist/cjs/core/resolve-packages.d.cts +2 -2
  31. package/dist/cjs/core/scaffold-engine.cjs +33 -6
  32. package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
  33. package/dist/cjs/core/types.cjs +11 -3
  34. package/dist/cjs/core/types.cjs.map +1 -1
  35. package/dist/cjs/core/types.d.cts +8 -8
  36. package/dist/cjs/core/validate-project-name.cjs.map +1 -1
  37. package/dist/cjs/frameworks/index.cjs +138 -17
  38. package/dist/cjs/frameworks/index.cjs.map +1 -1
  39. package/dist/cjs/frameworks/index.d.cts +3 -3
  40. package/dist/cjs/scaffold.d.cts +1 -1
  41. package/dist/cjs/templates/base.cjs +6 -6
  42. package/dist/cjs/templates/base.cjs.map +1 -1
  43. package/dist/cjs/types.d.cts +1 -1
  44. package/dist/esm/addons/arktype/index.js.map +1 -1
  45. package/dist/esm/addons/drizzle/index.js.map +1 -1
  46. package/dist/esm/addons/kysely/index.js.map +1 -1
  47. package/dist/esm/addons/pino/index.js.map +1 -1
  48. package/dist/esm/addons/prisma/index.js +84 -24
  49. package/dist/esm/addons/prisma/index.js.map +1 -1
  50. package/dist/esm/addons/registry.js +2 -2
  51. package/dist/esm/addons/registry.js.map +1 -1
  52. package/dist/esm/addons/types.d.ts +1 -1
  53. package/dist/esm/addons/valibot/index.js.map +1 -1
  54. package/dist/esm/addons/validators.js.map +1 -1
  55. package/dist/esm/addons/winston/index.js.map +1 -1
  56. package/dist/esm/addons/zod/index.js.map +1 -1
  57. package/dist/esm/cli.js +5 -0
  58. package/dist/esm/cli.js.map +1 -1
  59. package/dist/esm/commands/create.d.ts +1 -0
  60. package/dist/esm/commands/create.js +46 -13
  61. package/dist/esm/commands/create.js.map +1 -1
  62. package/dist/esm/core/json-output.js.map +1 -1
  63. package/dist/esm/core/package-manager.d.ts +1 -1
  64. package/dist/esm/core/package-manager.js.map +1 -1
  65. package/dist/esm/core/parse-options.d.ts +3 -3
  66. package/dist/esm/core/parse-options.js +8 -8
  67. package/dist/esm/core/parse-options.js.map +1 -1
  68. package/dist/esm/core/project-config.js +1 -1
  69. package/dist/esm/core/project-config.js.map +1 -1
  70. package/dist/esm/core/resolve-packages.d.ts +2 -2
  71. package/dist/esm/core/resolve-packages.js +41 -7
  72. package/dist/esm/core/resolve-packages.js.map +1 -1
  73. package/dist/esm/core/scaffold-engine.js +34 -7
  74. package/dist/esm/core/scaffold-engine.js.map +1 -1
  75. package/dist/esm/core/types.d.ts +8 -8
  76. package/dist/esm/core/types.js +11 -3
  77. package/dist/esm/core/types.js.map +1 -1
  78. package/dist/esm/core/validate-project-name.js.map +1 -1
  79. package/dist/esm/frameworks/index.d.ts +3 -3
  80. package/dist/esm/frameworks/index.js +138 -17
  81. package/dist/esm/frameworks/index.js.map +1 -1
  82. package/dist/esm/scaffold.d.ts +1 -1
  83. package/dist/esm/templates/base.js +6 -6
  84. package/dist/esm/templates/base.js.map +1 -1
  85. package/dist/esm/types.d.ts +1 -1
  86. package/package.json +13 -13
  87. package/src/addons/arktype/index.ts +2 -2
  88. package/src/addons/drizzle/index.ts +53 -53
  89. package/src/addons/kysely/index.ts +42 -42
  90. package/src/addons/pino/index.ts +12 -12
  91. package/src/addons/prisma/index.ts +128 -55
  92. package/src/addons/registry.ts +37 -37
  93. package/src/addons/types.ts +14 -14
  94. package/src/addons/valibot/index.ts +2 -2
  95. package/src/addons/validators.ts +9 -9
  96. package/src/addons/winston/index.ts +12 -12
  97. package/src/addons/zod/index.ts +2 -2
  98. package/src/cli.ts +27 -26
  99. package/src/commands/create.ts +181 -152
  100. package/src/core/json-output.ts +4 -4
  101. package/src/core/package-manager.ts +38 -31
  102. package/src/core/parse-options.ts +50 -48
  103. package/src/core/project-config.ts +10 -14
  104. package/src/core/resolve-packages.ts +79 -41
  105. package/src/core/scaffold-engine.ts +106 -36
  106. package/src/core/types.ts +61 -36
  107. package/src/core/validate-project-name.ts +40 -40
  108. package/src/frameworks/index.ts +164 -29
  109. package/src/scaffold.ts +3 -3
  110. package/src/templates/base.ts +57 -51
  111. package/src/types.ts +5 -4
@@ -1,21 +1,21 @@
1
- import { arktypeAddon } from './arktype/index.js'
2
- import { drizzleAddon } from './drizzle/index.js'
3
- import { kyselyAddon } from './kysely/index.js'
4
- import { pinoAddon } from './pino/index.js'
5
- import { prismaAddon } from './prisma/index.js'
6
- import { valibotAddon } from './valibot/index.js'
7
- import { winstonAddon } from './winston/index.js'
8
- import { zodAddon } from './zod/index.js'
9
- import type { AddonDefinition } from './types.js'
10
- import type { CapabilitiesCatalog, ScaffoldContext } from '../core/types.js'
1
+ import { arktypeAddon } from "./arktype/index.js";
2
+ import { drizzleAddon } from "./drizzle/index.js";
3
+ import { kyselyAddon } from "./kysely/index.js";
4
+ import { pinoAddon } from "./pino/index.js";
5
+ import { prismaAddon } from "./prisma/index.js";
6
+ import { valibotAddon } from "./valibot/index.js";
7
+ import { winstonAddon } from "./winston/index.js";
8
+ import { zodAddon } from "./zod/index.js";
9
+ import type { AddonDefinition } from "./types.js";
10
+ import type { CapabilitiesCatalog, ScaffoldContext } from "../core/types.js";
11
11
  import {
12
12
  DB_DRIVERS,
13
13
  DB_ODMS,
14
14
  DEFAULT_DB_DRIVER,
15
- FRAMEWORKS,
16
15
  LOGGERS,
16
+ PROJECT_TYPES,
17
17
  VALIDATORS,
18
- } from '../core/types.js'
18
+ } from "../core/types.js";
19
19
 
20
20
  const ALL_ADDONS: AddonDefinition[] = [
21
21
  drizzleAddon,
@@ -26,15 +26,15 @@ const ALL_ADDONS: AddonDefinition[] = [
26
26
  zodAddon,
27
27
  arktypeAddon,
28
28
  valibotAddon,
29
- ]
29
+ ];
30
30
 
31
- const DB_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'database')
32
- const LOGGER_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'logger')
33
- const VALIDATOR_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'validator')
31
+ const DB_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "database");
32
+ const LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "logger");
33
+ const VALIDATOR_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "validator");
34
34
 
35
35
  export function getCapabilitiesCatalog(): CapabilitiesCatalog {
36
36
  return {
37
- frameworks: [...FRAMEWORKS],
37
+ types: [...PROJECT_TYPES],
38
38
  db: {
39
39
  odms: [...DB_ODMS],
40
40
  drivers: [...DB_DRIVERS],
@@ -42,56 +42,56 @@ export function getCapabilitiesCatalog(): CapabilitiesCatalog {
42
42
  },
43
43
  loggers: [...LOGGERS],
44
44
  validators: [...VALIDATORS],
45
- }
45
+ };
46
46
  }
47
47
 
48
48
  export function resolveAddons(ctx: ScaffoldContext): AddonDefinition[] {
49
- const selected: AddonDefinition[] = []
49
+ const selected: AddonDefinition[] = [];
50
50
 
51
51
  if (ctx.db) {
52
- const dbAddon = DB_ADDONS.find(addon => addon.id === ctx.db)
52
+ const dbAddon = DB_ADDONS.find((addon) => addon.id === ctx.db);
53
53
  if (!dbAddon) {
54
- throw new Error(`Unknown database addon "${ctx.db}"`)
54
+ throw new Error(`Unknown database addon "${ctx.db}"`);
55
55
  }
56
- selected.push(dbAddon)
56
+ selected.push(dbAddon);
57
57
  }
58
58
 
59
59
  if (ctx.logger) {
60
- const loggerAddon = LOGGER_ADDONS.find(addon => addon.id === ctx.logger)
60
+ const loggerAddon = LOGGER_ADDONS.find((addon) => addon.id === ctx.logger);
61
61
  if (!loggerAddon) {
62
- throw new Error(`Unknown logger addon "${ctx.logger}"`)
62
+ throw new Error(`Unknown logger addon "${ctx.logger}"`);
63
63
  }
64
- selected.push(loggerAddon)
64
+ selected.push(loggerAddon);
65
65
  }
66
66
 
67
- const dbCount = selected.filter(addon => addon.category === 'database').length
67
+ const dbCount = selected.filter((addon) => addon.category === "database").length;
68
68
  if (dbCount > 1) {
69
- throw new Error('Only one database addon can be selected')
69
+ throw new Error("Only one database addon can be selected");
70
70
  }
71
71
 
72
- const loggerCount = selected.filter(addon => addon.category === 'logger').length
72
+ const loggerCount = selected.filter((addon) => addon.category === "logger").length;
73
73
  if (loggerCount > 1) {
74
- throw new Error('Only one logger addon can be selected')
74
+ throw new Error("Only one logger addon can be selected");
75
75
  }
76
76
 
77
77
  if (ctx.validator) {
78
- const validatorAddon = VALIDATOR_ADDONS.find(addon => addon.id === ctx.validator)
78
+ const validatorAddon = VALIDATOR_ADDONS.find((addon) => addon.id === ctx.validator);
79
79
  if (!validatorAddon) {
80
- throw new Error(`Unknown validator addon "${ctx.validator}"`)
80
+ throw new Error(`Unknown validator addon "${ctx.validator}"`);
81
81
  }
82
- selected.push(validatorAddon)
82
+ selected.push(validatorAddon);
83
83
  }
84
84
 
85
- const validatorCount = selected.filter(addon => addon.category === 'validator').length
85
+ const validatorCount = selected.filter((addon) => addon.category === "validator").length;
86
86
  if (validatorCount > 1) {
87
- throw new Error('Only one validator addon can be selected')
87
+ throw new Error("Only one validator addon can be selected");
88
88
  }
89
89
 
90
- return selected
90
+ return selected;
91
91
  }
92
92
 
93
93
  export function collectBootBindings(ctx: ScaffoldContext) {
94
94
  return resolveAddons(ctx)
95
- .map(addon => addon.bootBinding?.(ctx))
96
- .filter((v): v is NonNullable<typeof v> => Boolean(v))
95
+ .map((addon) => addon.bootBinding?.(ctx))
96
+ .filter((v): v is NonNullable<typeof v> => Boolean(v));
97
97
  }
@@ -1,19 +1,19 @@
1
- import type { ScaffoldContext } from '../core/types.js'
1
+ import type { ScaffoldContext } from "../core/types.js";
2
2
 
3
3
  export type BootBinding = {
4
- key: string
5
- importPath: string
6
- factoryName: string
7
- }
4
+ key: string;
5
+ importPath: string;
6
+ factoryName: string;
7
+ };
8
8
 
9
- export type FileWriter = (filePath: string, contents: string) => Promise<void>
9
+ export type FileWriter = (filePath: string, contents: string) => Promise<void>;
10
10
 
11
11
  export type AddonDefinition = {
12
- id: string
13
- category: 'database' | 'logger' | 'validator'
14
- dependencies: (ctx: ScaffoldContext) => string[]
15
- devDependencies: (ctx: ScaffoldContext) => string[]
16
- scripts?: (ctx: ScaffoldContext) => Record<string, string>
17
- bootBinding?: (ctx: ScaffoldContext) => BootBinding
18
- apply: (ctx: ScaffoldContext, write: FileWriter) => Promise<void>
19
- }
12
+ id: string;
13
+ category: "database" | "logger" | "validator";
14
+ dependencies: (ctx: ScaffoldContext) => string[];
15
+ devDependencies: (ctx: ScaffoldContext) => string[];
16
+ scripts?: (ctx: ScaffoldContext) => Record<string, string>;
17
+ bootBinding?: (ctx: ScaffoldContext) => BootBinding;
18
+ apply: (ctx: ScaffoldContext, write: FileWriter) => Promise<void>;
19
+ };
@@ -1,3 +1,3 @@
1
- import { ValidatorAddon } from '../validators.js'
1
+ import { ValidatorAddon } from "../validators.js";
2
2
 
3
- export const valibotAddon = ValidatorAddon('valibot')
3
+ export const valibotAddon = ValidatorAddon("valibot");
@@ -1,11 +1,11 @@
1
- import type { ValidatorId } from '../core/types'
2
- import type { AddonDefinition } from './types'
1
+ import type { ValidatorId } from "../core/types";
2
+ import type { AddonDefinition } from "./types";
3
3
 
4
4
  export const IMPORT_LINES: Record<ValidatorId, string> = {
5
5
  zod: `import { z } from 'zod'`,
6
6
  arktype: `import { type } from 'arktype'`,
7
7
  valibot: `import * as v from 'valibot'`,
8
- }
8
+ };
9
9
 
10
10
  export const VALIDATION_BLOCK_TEMPLATE: Record<ValidatorId, string> = {
11
11
  zod: `, {
@@ -17,7 +17,7 @@ export const VALIDATION_BLOCK_TEMPLATE: Record<ValidatorId, string> = {
17
17
  valibot: `, {
18
18
  query: v.object({ name: v.string() }),
19
19
  }`,
20
- }
20
+ };
21
21
 
22
22
  const ROUTE_TEMPLATE = (validator: ValidatorId) => `import { reply } from '@taserjs/router'
23
23
  import { t } from '#src/taser.js'
@@ -26,14 +26,14 @@ ${IMPORT_LINES[validator]}
26
26
  export const Route = t.get('/'${VALIDATION_BLOCK_TEMPLATE[validator]}).handler((ctx) => {
27
27
  return reply.json({ message: \`Hello, \${ctx.query.name}!\` })
28
28
  })
29
- `
29
+ `;
30
30
 
31
31
  export const ValidatorAddon = (validator: ValidatorId): AddonDefinition => {
32
32
  return {
33
33
  id: validator,
34
- category: 'validator',
34
+ category: "validator",
35
35
  dependencies: () => [validator],
36
36
  devDependencies: () => [],
37
- apply: (ctx, write) => write('src/routes/index.get.ts', ROUTE_TEMPLATE(validator)),
38
- }
39
- }
37
+ apply: (ctx, write) => write("src/routes/index.get.ts", ROUTE_TEMPLATE(validator)),
38
+ };
39
+ };
@@ -1,24 +1,24 @@
1
- import type { AddonDefinition } from '../types.js'
1
+ import type { AddonDefinition } from "../types.js";
2
2
 
3
3
  export const winstonAddon: AddonDefinition = {
4
- id: 'winston',
5
- category: 'logger',
4
+ id: "winston",
5
+ category: "logger",
6
6
  dependencies() {
7
- return ['winston']
7
+ return ["winston"];
8
8
  },
9
9
  devDependencies() {
10
- return []
10
+ return [];
11
11
  },
12
12
  bootBinding() {
13
13
  return {
14
- key: 'logger',
15
- importPath: './logger.js',
16
- factoryName: 'createLogger',
17
- }
14
+ key: "logger",
15
+ importPath: "./logger.js",
16
+ factoryName: "createLogger",
17
+ };
18
18
  },
19
19
  async apply(_ctx, write) {
20
20
  await write(
21
- 'src/logger.ts',
21
+ "src/logger.ts",
22
22
  `import winston from 'winston'
23
23
 
24
24
  export function createLogger() {
@@ -29,6 +29,6 @@ export function createLogger() {
29
29
  })
30
30
  }
31
31
  `,
32
- )
32
+ );
33
33
  },
34
- }
34
+ };
@@ -1,3 +1,3 @@
1
- import { ValidatorAddon } from '../validators.js'
1
+ import { ValidatorAddon } from "../validators.js";
2
2
 
3
- export const zodAddon = ValidatorAddon('zod')
3
+ export const zodAddon = ValidatorAddon("zod");
package/src/cli.ts CHANGED
@@ -1,29 +1,31 @@
1
1
  #!/usr/bin/env node
2
- import { parseArgs } from 'node:util'
2
+ import { parseArgs } from "node:util";
3
3
 
4
- import * as p from '@clack/prompts'
5
- import color from 'picocolors'
4
+ import * as p from "@clack/prompts";
5
+ import color from "picocolors";
6
6
 
7
- import { buildParsedArgsFromCli, runCreateCommand } from './commands/create.js'
8
- import { printJsonError } from './core/json-output.js'
7
+ import { buildParsedArgsFromCli, runCreateCommand } from "./commands/create.js";
8
+ import { printJsonError } from "./core/json-output.js";
9
9
 
10
10
  async function main(): Promise<void> {
11
11
  const { values, positionals } = parseArgs({
12
12
  args: process.argv.slice(2),
13
13
  options: {
14
- framework: { type: 'string' },
15
- db: { type: 'string' },
16
- logger: { type: 'string' },
17
- validator: { type: 'string' },
18
- y: { type: 'boolean', short: 'y' },
19
- noInstall: { type: 'boolean' },
20
- json: { type: 'boolean' },
14
+ type: { type: "string", short: "t" },
15
+ framework: { type: "string" },
16
+ db: { type: "string" },
17
+ logger: { type: "string" },
18
+ validator: { type: "string" },
19
+ y: { type: "boolean", short: "y" },
20
+ noInstall: { type: "boolean" },
21
+ json: { type: "boolean" },
21
22
  },
22
23
  allowPositionals: true,
23
- })
24
+ });
24
25
 
25
26
  const parsed = buildParsedArgsFromCli(
26
27
  {
28
+ ...(values.type !== undefined ? { type: values.type } : {}),
27
29
  ...(values.framework !== undefined ? { framework: values.framework } : {}),
28
30
  ...(values.db !== undefined ? { db: values.db } : {}),
29
31
  ...(values.logger !== undefined ? { logger: values.logger } : {}),
@@ -33,27 +35,26 @@ async function main(): Promise<void> {
33
35
  ...(values.json !== undefined ? { json: values.json } : {}),
34
36
  },
35
37
  positionals,
36
- )
38
+ );
37
39
 
38
40
  if (!parsed.json) {
39
- console.clear()
40
- p.intro(color.bgCyan(color.black(' create-taser ')))
41
+ console.clear();
42
+ p.intro(color.bgCyan(color.black(" create-taser ")));
41
43
  }
42
44
 
43
45
  try {
44
- await runCreateCommand(parsed)
45
- }
46
- catch (error) {
47
- const message = error instanceof Error ? error.message : String(error)
46
+ await runCreateCommand(parsed);
47
+ } catch (error) {
48
+ const message = error instanceof Error ? error.message : String(error);
48
49
  if (parsed.json) {
49
- printJsonError(message)
50
- process.exit(1)
50
+ printJsonError(message);
51
+ process.exit(1);
51
52
  }
52
- throw error
53
+ throw error;
53
54
  }
54
55
  }
55
56
 
56
57
  main().catch((error: unknown) => {
57
- console.error(error)
58
- process.exit(1)
59
- })
58
+ console.error(error);
59
+ process.exit(1);
60
+ });