@betterstart/cli 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.
@@ -0,0 +1,260 @@
1
+ // src/config/import-resolver.ts
2
+ var ImportResolver = class {
3
+ constructor(imports) {
4
+ this.imports = imports;
5
+ }
6
+ /** Import path for database package (db instance, table schemas) */
7
+ get database() {
8
+ return this.imports.database;
9
+ }
10
+ /** Import path for admin UI components */
11
+ get adminUi() {
12
+ return this.imports.adminUi;
13
+ }
14
+ /** Import path for public/web UI components */
15
+ get webUi() {
16
+ return this.imports.webUi;
17
+ }
18
+ /** Import path for React Query hooks */
19
+ get hooks() {
20
+ return this.imports.hooks;
21
+ }
22
+ /** Import path for utility functions (cn, truncate, hexToOklab) */
23
+ get utils() {
24
+ return this.imports.utils;
25
+ }
26
+ /** Import path for lib base (renderMarkdownInline, etc.) */
27
+ get lib() {
28
+ return this.imports.lib;
29
+ }
30
+ /** Import path for lib/markdown sub-module */
31
+ get libMarkdown() {
32
+ return this.imports.libMarkdown;
33
+ }
34
+ /** Import path for table-meta type augmentation */
35
+ get tableMeta() {
36
+ return `${this.imports.types}/table-meta`;
37
+ }
38
+ /**
39
+ * Resolve the import path for a schema's server actions.
40
+ * Replaces `{name}` placeholder with the actual schema name.
41
+ */
42
+ actions(schemaName) {
43
+ return this.imports.actions.replace("{name}", schemaName);
44
+ }
45
+ /**
46
+ * Get the escaped lib import path for use in regex matching.
47
+ * Used by hook.ts to update existing hook files.
48
+ */
49
+ get libEscaped() {
50
+ return this.imports.lib.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
51
+ }
52
+ };
53
+
54
+ // src/config/presets.ts
55
+ import fs from "fs";
56
+ import path from "path";
57
+ var DEFAULT_OUTPUT_PATHS = {
58
+ actions: "src/actions",
59
+ hooks: "src",
60
+ components: "components",
61
+ pages: "app/(admin)/admin",
62
+ emails: "emails"
63
+ };
64
+ var DEFAULT_DATABASE_CONFIG = {
65
+ provider: "drizzle",
66
+ schemaFile: "src/schema.ts",
67
+ migrationsDir: "drizzle",
68
+ autoMigrate: true
69
+ };
70
+ var DEFAULT_UI_CONFIG = {
71
+ framework: "shadcn",
72
+ components: {
73
+ path: "@/components/ui",
74
+ adminPath: "@/components/admin"
75
+ }
76
+ };
77
+ var MONOREPO_IMPORT_PATHS = {
78
+ database: "@betterstart/database",
79
+ adminUi: "@betterstart/admin-ui",
80
+ webUi: "@betterstart/web-ui",
81
+ hooks: "@betterstart/hooks",
82
+ utils: "@betterstart/utils",
83
+ types: "@betterstart/types",
84
+ lib: "@betterstart/lib",
85
+ actions: "@betterstart/lib/actions/{name}",
86
+ libMarkdown: "@betterstart/lib/markdown"
87
+ };
88
+ var STANDALONE_IMPORT_PATHS = {
89
+ database: "@/lib/db",
90
+ adminUi: "@/components/ui",
91
+ webUi: "@/components/ui",
92
+ hooks: "@/hooks",
93
+ utils: "@/lib/utils",
94
+ types: "@/types",
95
+ lib: "@/lib",
96
+ actions: "@/lib/actions/{name}",
97
+ libMarkdown: "@/lib/markdown"
98
+ };
99
+ var DEFAULT_GENERATOR_CONFIG = {
100
+ core: [
101
+ "database",
102
+ "actions",
103
+ "hooks",
104
+ "columns",
105
+ "table",
106
+ "page",
107
+ "page-content",
108
+ "form",
109
+ "create-page",
110
+ "edit-page",
111
+ "navigation"
112
+ ],
113
+ optional: ["csv-upload", "json-upload"]
114
+ };
115
+ var nextjsMonorepoPreset = {
116
+ name: "nextjs-monorepo",
117
+ description: "Next.js app in a Turborepo/pnpm monorepo structure",
118
+ detect: (cwd) => {
119
+ const hasPnpmWorkspace = fs.existsSync(path.join(cwd, "pnpm-workspace.yaml"));
120
+ const hasTurboJson = fs.existsSync(path.join(cwd, "turbo.json"));
121
+ const hasAppsDir = fs.existsSync(path.join(cwd, "apps"));
122
+ const hasPackagesDir = fs.existsSync(path.join(cwd, "packages"));
123
+ return (hasPnpmWorkspace || hasTurboJson) && (hasAppsDir || hasPackagesDir);
124
+ },
125
+ config: {
126
+ paths: {
127
+ app: "apps/web",
128
+ database: "packages/database",
129
+ lib: "packages/lib",
130
+ hooks: "packages/hooks",
131
+ schemas: "packages/codegen/src/schemas",
132
+ output: {
133
+ actions: "src/actions",
134
+ hooks: "src",
135
+ components: "app/(admin)/admin",
136
+ pages: "app/(admin)/admin",
137
+ emails: "emails"
138
+ }
139
+ },
140
+ imports: MONOREPO_IMPORT_PATHS,
141
+ database: {
142
+ ...DEFAULT_DATABASE_CONFIG
143
+ },
144
+ ui: {
145
+ framework: "shadcn",
146
+ components: {
147
+ path: "@betterstart/admin-ui",
148
+ adminPath: "@betterstart/admin-ui"
149
+ }
150
+ },
151
+ generators: {
152
+ ...DEFAULT_GENERATOR_CONFIG
153
+ },
154
+ plugins: []
155
+ }
156
+ };
157
+ var nextjsStandalonePreset = {
158
+ name: "nextjs-standalone",
159
+ description: "Standalone Next.js application",
160
+ detect: (cwd) => {
161
+ const hasNextConfig = fs.existsSync(path.join(cwd, "next.config.js")) || fs.existsSync(path.join(cwd, "next.config.mjs")) || fs.existsSync(path.join(cwd, "next.config.ts"));
162
+ const hasPackageJson = fs.existsSync(path.join(cwd, "package.json"));
163
+ if (!hasNextConfig || !hasPackageJson) return false;
164
+ const hasPnpmWorkspace = fs.existsSync(path.join(cwd, "pnpm-workspace.yaml"));
165
+ const hasTurboJson = fs.existsSync(path.join(cwd, "turbo.json"));
166
+ return !(hasPnpmWorkspace || hasTurboJson);
167
+ },
168
+ config: {
169
+ paths: {
170
+ app: ".",
171
+ database: ".",
172
+ lib: ".",
173
+ hooks: ".",
174
+ schemas: "schemas",
175
+ output: {
176
+ actions: "src/actions",
177
+ hooks: "src/hooks",
178
+ components: "src/components/admin",
179
+ pages: "src/app/(admin)/admin",
180
+ emails: "src/emails"
181
+ }
182
+ },
183
+ imports: STANDALONE_IMPORT_PATHS,
184
+ database: {
185
+ ...DEFAULT_DATABASE_CONFIG,
186
+ schemaFile: "src/db/schema.ts",
187
+ migrationsDir: "src/db/migrations"
188
+ },
189
+ ui: {
190
+ ...DEFAULT_UI_CONFIG
191
+ },
192
+ generators: {
193
+ ...DEFAULT_GENERATOR_CONFIG
194
+ },
195
+ plugins: []
196
+ }
197
+ };
198
+ var customPreset = {
199
+ name: "custom",
200
+ description: "Custom project structure - configure paths manually",
201
+ config: {
202
+ paths: {
203
+ app: ".",
204
+ database: ".",
205
+ lib: ".",
206
+ hooks: ".",
207
+ schemas: "schemas",
208
+ output: DEFAULT_OUTPUT_PATHS
209
+ },
210
+ imports: STANDALONE_IMPORT_PATHS,
211
+ database: DEFAULT_DATABASE_CONFIG,
212
+ ui: DEFAULT_UI_CONFIG,
213
+ generators: DEFAULT_GENERATOR_CONFIG,
214
+ plugins: []
215
+ }
216
+ };
217
+ var presets = {
218
+ "nextjs-monorepo": nextjsMonorepoPreset,
219
+ "nextjs-standalone": nextjsStandalonePreset,
220
+ custom: customPreset
221
+ };
222
+ function getPreset(name) {
223
+ return presets[name];
224
+ }
225
+ function getPresetNames() {
226
+ return Object.keys(presets);
227
+ }
228
+ function detectPreset(cwd) {
229
+ const presetOrder = ["nextjs-monorepo", "nextjs-standalone"];
230
+ for (const presetName of presetOrder) {
231
+ const preset = presets[presetName];
232
+ if (preset.detect?.(cwd)) {
233
+ return preset;
234
+ }
235
+ }
236
+ return customPreset;
237
+ }
238
+ function getDefaultConfig(cwd) {
239
+ const preset = detectPreset(cwd);
240
+ return preset.config;
241
+ }
242
+
243
+ export {
244
+ ImportResolver,
245
+ DEFAULT_OUTPUT_PATHS,
246
+ DEFAULT_DATABASE_CONFIG,
247
+ DEFAULT_UI_CONFIG,
248
+ MONOREPO_IMPORT_PATHS,
249
+ STANDALONE_IMPORT_PATHS,
250
+ DEFAULT_GENERATOR_CONFIG,
251
+ nextjsMonorepoPreset,
252
+ nextjsStandalonePreset,
253
+ customPreset,
254
+ presets,
255
+ getPreset,
256
+ getPresetNames,
257
+ detectPreset,
258
+ getDefaultConfig
259
+ };
260
+ //# sourceMappingURL=chunk-PWRI4LKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/import-resolver.ts","../src/config/presets.ts"],"sourcesContent":["import type { ImportPaths } from './types'\n\n/**\n * Resolves import paths from config for use in generated code.\n * All generators should use this instead of hardcoding import paths.\n */\nexport class ImportResolver {\n constructor(private readonly imports: ImportPaths) {}\n\n /** Import path for database package (db instance, table schemas) */\n get database(): string {\n return this.imports.database\n }\n\n /** Import path for admin UI components */\n get adminUi(): string {\n return this.imports.adminUi\n }\n\n /** Import path for public/web UI components */\n get webUi(): string {\n return this.imports.webUi\n }\n\n /** Import path for React Query hooks */\n get hooks(): string {\n return this.imports.hooks\n }\n\n /** Import path for utility functions (cn, truncate, hexToOklab) */\n get utils(): string {\n return this.imports.utils\n }\n\n /** Import path for lib base (renderMarkdownInline, etc.) */\n get lib(): string {\n return this.imports.lib\n }\n\n /** Import path for lib/markdown sub-module */\n get libMarkdown(): string {\n return this.imports.libMarkdown\n }\n\n /** Import path for table-meta type augmentation */\n get tableMeta(): string {\n return `${this.imports.types}/table-meta`\n }\n\n /**\n * Resolve the import path for a schema's server actions.\n * Replaces `{name}` placeholder with the actual schema name.\n */\n actions(schemaName: string): string {\n return this.imports.actions.replace('{name}', schemaName)\n }\n\n /**\n * Get the escaped lib import path for use in regex matching.\n * Used by hook.ts to update existing hook files.\n */\n get libEscaped(): string {\n return this.imports.lib.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n }\n}\n","/**\n * Project presets for common project structures\n * Each preset provides default configuration for a specific project type\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport type { ImportPaths, Preset, UserConfig } from './types'\n\n// ============================================================================\n// Default Configuration Values\n// ============================================================================\n\n/**\n * Default output paths\n */\nexport const DEFAULT_OUTPUT_PATHS = {\n actions: 'src/actions',\n hooks: 'src',\n components: 'components',\n pages: 'app/(admin)/admin',\n emails: 'emails'\n}\n\n/**\n * Default database configuration\n */\nexport const DEFAULT_DATABASE_CONFIG = {\n provider: 'drizzle' as const,\n schemaFile: 'src/schema.ts',\n migrationsDir: 'drizzle',\n autoMigrate: true\n}\n\n/**\n * Default UI configuration\n */\nexport const DEFAULT_UI_CONFIG = {\n framework: 'shadcn' as const,\n components: {\n path: '@/components/ui',\n adminPath: '@/components/admin'\n }\n}\n\n/**\n * Monorepo import paths (for @betterstart/* packages)\n */\nexport const MONOREPO_IMPORT_PATHS: ImportPaths = {\n database: '@betterstart/database',\n adminUi: '@betterstart/admin-ui',\n webUi: '@betterstart/web-ui',\n hooks: '@betterstart/hooks',\n utils: '@betterstart/utils',\n types: '@betterstart/types',\n lib: '@betterstart/lib',\n actions: '@betterstart/lib/actions/{name}',\n libMarkdown: '@betterstart/lib/markdown'\n}\n\n/**\n * Standalone import paths (for @/ alias in single Next.js apps)\n */\nexport const STANDALONE_IMPORT_PATHS: ImportPaths = {\n database: '@/lib/db',\n adminUi: '@/components/ui',\n webUi: '@/components/ui',\n hooks: '@/hooks',\n utils: '@/lib/utils',\n types: '@/types',\n lib: '@/lib',\n actions: '@/lib/actions/{name}',\n libMarkdown: '@/lib/markdown'\n}\n\n/**\n * Default generator configuration\n */\nexport const DEFAULT_GENERATOR_CONFIG = {\n core: [\n 'database',\n 'actions',\n 'hooks',\n 'columns',\n 'table',\n 'page',\n 'page-content',\n 'form',\n 'create-page',\n 'edit-page',\n 'navigation'\n ] as string[],\n optional: ['csv-upload', 'json-upload'] as string[]\n}\n\n// ============================================================================\n// Presets\n// ============================================================================\n\n/**\n * Next.js monorepo preset (Turborepo/pnpm style)\n * Similar to the current betterstart structure\n */\nexport const nextjsMonorepoPreset: Preset = {\n name: 'nextjs-monorepo',\n description: 'Next.js app in a Turborepo/pnpm monorepo structure',\n detect: (cwd: string) => {\n // Check for pnpm-workspace.yaml or turbo.json\n const hasPnpmWorkspace = fs.existsSync(path.join(cwd, 'pnpm-workspace.yaml'))\n const hasTurboJson = fs.existsSync(path.join(cwd, 'turbo.json'))\n const hasAppsDir = fs.existsSync(path.join(cwd, 'apps'))\n const hasPackagesDir = fs.existsSync(path.join(cwd, 'packages'))\n\n return (hasPnpmWorkspace || hasTurboJson) && (hasAppsDir || hasPackagesDir)\n },\n config: {\n paths: {\n app: 'apps/web',\n database: 'packages/database',\n lib: 'packages/lib',\n hooks: 'packages/hooks',\n schemas: 'packages/codegen/src/schemas',\n output: {\n actions: 'src/actions',\n hooks: 'src',\n components: 'app/(admin)/admin',\n pages: 'app/(admin)/admin',\n emails: 'emails'\n }\n },\n imports: MONOREPO_IMPORT_PATHS,\n database: {\n ...DEFAULT_DATABASE_CONFIG\n },\n ui: {\n framework: 'shadcn',\n components: {\n path: '@betterstart/admin-ui',\n adminPath: '@betterstart/admin-ui'\n }\n },\n generators: {\n ...DEFAULT_GENERATOR_CONFIG\n },\n plugins: []\n }\n}\n\n/**\n * Standalone Next.js preset\n * For single Next.js apps without monorepo structure\n */\nexport const nextjsStandalonePreset: Preset = {\n name: 'nextjs-standalone',\n description: 'Standalone Next.js application',\n detect: (cwd: string) => {\n const hasNextConfig =\n fs.existsSync(path.join(cwd, 'next.config.js')) ||\n fs.existsSync(path.join(cwd, 'next.config.mjs')) ||\n fs.existsSync(path.join(cwd, 'next.config.ts'))\n const hasPackageJson = fs.existsSync(path.join(cwd, 'package.json'))\n\n if (!hasNextConfig || !hasPackageJson) return false\n\n // Make sure it's not a monorepo\n const hasPnpmWorkspace = fs.existsSync(path.join(cwd, 'pnpm-workspace.yaml'))\n const hasTurboJson = fs.existsSync(path.join(cwd, 'turbo.json'))\n\n return !(hasPnpmWorkspace || hasTurboJson)\n },\n config: {\n paths: {\n app: '.',\n database: '.',\n lib: '.',\n hooks: '.',\n schemas: 'schemas',\n output: {\n actions: 'src/actions',\n hooks: 'src/hooks',\n components: 'src/components/admin',\n pages: 'src/app/(admin)/admin',\n emails: 'src/emails'\n }\n },\n imports: STANDALONE_IMPORT_PATHS,\n database: {\n ...DEFAULT_DATABASE_CONFIG,\n schemaFile: 'src/db/schema.ts',\n migrationsDir: 'src/db/migrations'\n },\n ui: {\n ...DEFAULT_UI_CONFIG\n },\n generators: {\n ...DEFAULT_GENERATOR_CONFIG\n },\n plugins: []\n }\n}\n\n/**\n * Custom/minimal preset\n * Provides minimal defaults, user must configure paths\n */\nexport const customPreset: Preset = {\n name: 'custom',\n description: 'Custom project structure - configure paths manually',\n config: {\n paths: {\n app: '.',\n database: '.',\n lib: '.',\n hooks: '.',\n schemas: 'schemas',\n output: DEFAULT_OUTPUT_PATHS\n },\n imports: STANDALONE_IMPORT_PATHS,\n database: DEFAULT_DATABASE_CONFIG,\n ui: DEFAULT_UI_CONFIG,\n generators: DEFAULT_GENERATOR_CONFIG,\n plugins: []\n }\n}\n\n// ============================================================================\n// Preset Registry\n// ============================================================================\n\n/**\n * All available presets\n */\nexport const presets: Record<string, Preset> = {\n 'nextjs-monorepo': nextjsMonorepoPreset,\n 'nextjs-standalone': nextjsStandalonePreset,\n custom: customPreset\n}\n\n/**\n * Get a preset by name\n */\nexport function getPreset(name: string): Preset | undefined {\n return presets[name]\n}\n\n/**\n * Get all preset names\n */\nexport function getPresetNames(): string[] {\n return Object.keys(presets)\n}\n\n/**\n * Auto-detect the best preset for a project\n * @param cwd - The project root directory\n * @returns The detected preset or 'custom' if none match\n */\nexport function detectPreset(cwd: string): Preset {\n // Try presets in order of specificity\n const presetOrder = ['nextjs-monorepo', 'nextjs-standalone']\n\n for (const presetName of presetOrder) {\n const preset = presets[presetName]\n if (preset.detect?.(cwd)) {\n return preset\n }\n }\n\n return customPreset\n}\n\n/**\n * Get the default configuration based on project detection\n */\nexport function getDefaultConfig(cwd: string): UserConfig {\n const preset = detectPreset(cwd)\n return preset.config\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,357 @@
1
+ // src/core/errors.ts
2
+ var CodegenError = class extends Error {
3
+ code;
4
+ context;
5
+ constructor(message, code, context) {
6
+ super(message);
7
+ this.name = "CodegenError";
8
+ this.code = code;
9
+ this.context = context;
10
+ if (Error.captureStackTrace) {
11
+ Error.captureStackTrace(this, this.constructor);
12
+ }
13
+ }
14
+ /**
15
+ * Format error for display
16
+ */
17
+ toString() {
18
+ let result = `[${this.code}] ${this.message}`;
19
+ if (this.context) {
20
+ result += `
21
+ Context: ${JSON.stringify(this.context, null, 2)}`;
22
+ }
23
+ return result;
24
+ }
25
+ };
26
+ var SchemaValidationError = class extends CodegenError {
27
+ validationErrors;
28
+ constructor(message, validationErrors, context) {
29
+ super(message, "SCHEMA_VALIDATION_ERROR", context);
30
+ this.name = "SchemaValidationError";
31
+ this.validationErrors = validationErrors;
32
+ }
33
+ toString() {
34
+ let result = `[${this.code}] ${this.message}`;
35
+ if (this.validationErrors.length > 0) {
36
+ result += "\nValidation errors:";
37
+ for (const error of this.validationErrors) {
38
+ result += `
39
+ - ${error}`;
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+ };
45
+ var ConfigurationError = class extends CodegenError {
46
+ constructor(message, context) {
47
+ super(message, "CONFIGURATION_ERROR", context);
48
+ this.name = "ConfigurationError";
49
+ }
50
+ };
51
+ var GeneratorError = class extends CodegenError {
52
+ generatorName;
53
+ constructor(message, generatorName, context) {
54
+ super(message, "GENERATOR_ERROR", context);
55
+ this.name = "GeneratorError";
56
+ this.generatorName = generatorName;
57
+ }
58
+ toString() {
59
+ return `[${this.code}] Generator "${this.generatorName}": ${this.message}`;
60
+ }
61
+ };
62
+ var PluginError = class extends CodegenError {
63
+ pluginName;
64
+ constructor(message, pluginName, context) {
65
+ super(message, "PLUGIN_ERROR", context);
66
+ this.name = "PluginError";
67
+ this.pluginName = pluginName;
68
+ }
69
+ toString() {
70
+ return `[${this.code}] Plugin "${this.pluginName}": ${this.message}`;
71
+ }
72
+ };
73
+ var FileOperationError = class extends CodegenError {
74
+ filePath;
75
+ operation;
76
+ constructor(message, filePath, operation, context) {
77
+ super(message, "FILE_OPERATION_ERROR", context);
78
+ this.name = "FileOperationError";
79
+ this.filePath = filePath;
80
+ this.operation = operation;
81
+ }
82
+ toString() {
83
+ return `[${this.code}] Failed to ${this.operation} file "${this.filePath}": ${this.message}`;
84
+ }
85
+ };
86
+ var MissingFieldError = class extends CodegenError {
87
+ fieldName;
88
+ schemaName;
89
+ constructor(fieldName, schemaName, context) {
90
+ super(
91
+ `Missing required field "${fieldName}" in schema "${schemaName}"`,
92
+ "MISSING_FIELD_ERROR",
93
+ context
94
+ );
95
+ this.name = "MissingFieldError";
96
+ this.fieldName = fieldName;
97
+ this.schemaName = schemaName;
98
+ }
99
+ };
100
+ var UnsupportedFieldTypeError = class extends CodegenError {
101
+ fieldType;
102
+ fieldName;
103
+ constructor(fieldType, fieldName, context) {
104
+ super(
105
+ `Unsupported field type "${fieldType}" for field "${fieldName}"`,
106
+ "UNSUPPORTED_FIELD_TYPE_ERROR",
107
+ context
108
+ );
109
+ this.name = "UnsupportedFieldTypeError";
110
+ this.fieldType = fieldType;
111
+ this.fieldName = fieldName;
112
+ }
113
+ };
114
+ var ERROR_CODES = {
115
+ SCHEMA_VALIDATION_ERROR: "SCHEMA_VALIDATION_ERROR",
116
+ CONFIGURATION_ERROR: "CONFIGURATION_ERROR",
117
+ GENERATOR_ERROR: "GENERATOR_ERROR",
118
+ PLUGIN_ERROR: "PLUGIN_ERROR",
119
+ FILE_OPERATION_ERROR: "FILE_OPERATION_ERROR",
120
+ MISSING_FIELD_ERROR: "MISSING_FIELD_ERROR",
121
+ UNSUPPORTED_FIELD_TYPE_ERROR: "UNSUPPORTED_FIELD_TYPE_ERROR"
122
+ };
123
+ function isCodegenError(error) {
124
+ return error instanceof CodegenError;
125
+ }
126
+ function wrapError(error, code, message) {
127
+ if (isCodegenError(error)) {
128
+ return error;
129
+ }
130
+ const errorMessage = error instanceof Error ? error.message : String(error);
131
+ return new CodegenError(message || errorMessage, code, { originalError: error });
132
+ }
133
+
134
+ // src/core/logger.ts
135
+ var ConsoleLogger = class {
136
+ level = "info";
137
+ shouldLog(level) {
138
+ if (this.level === "silent") return false;
139
+ const levels = ["debug", "info", "warn", "error"];
140
+ const currentIndex = levels.indexOf(this.level);
141
+ const messageIndex = levels.indexOf(level);
142
+ return messageIndex >= currentIndex;
143
+ }
144
+ debug(message, ...args) {
145
+ if (this.shouldLog("debug")) {
146
+ console.log(`\x1B[90m[DEBUG]\x1B[0m ${message}`, ...args);
147
+ }
148
+ }
149
+ info(message, ...args) {
150
+ if (this.shouldLog("info")) {
151
+ console.log(message, ...args);
152
+ }
153
+ }
154
+ warn(message, ...args) {
155
+ if (this.shouldLog("warn")) {
156
+ console.warn(`\x1B[33m\u26A0\uFE0F ${message}\x1B[0m`, ...args);
157
+ }
158
+ }
159
+ error(message, ...args) {
160
+ if (this.shouldLog("error")) {
161
+ console.error(`\x1B[31m\u274C ${message}\x1B[0m`, ...args);
162
+ }
163
+ }
164
+ success(message, ...args) {
165
+ if (this.shouldLog("info")) {
166
+ console.log(`\x1B[32m\u2713 ${message}\x1B[0m`, ...args);
167
+ }
168
+ }
169
+ step(stepNumber, message) {
170
+ if (this.shouldLog("info")) {
171
+ const emoji = this.getStepEmoji(stepNumber);
172
+ console.log(`${emoji} ${message}`);
173
+ }
174
+ }
175
+ stepComplete(message) {
176
+ if (this.shouldLog("info")) {
177
+ console.log(` \x1B[32m\u2713\x1B[0m ${message}`);
178
+ }
179
+ }
180
+ setLevel(level) {
181
+ this.level = level;
182
+ }
183
+ getLevel() {
184
+ return this.level;
185
+ }
186
+ getStepEmoji(step) {
187
+ const emojis = ["1\uFE0F\u20E3", "2\uFE0F\u20E3", "3\uFE0F\u20E3", "4\uFE0F\u20E3", "5\uFE0F\u20E3", "6\uFE0F\u20E3", "7\uFE0F\u20E3", "8\uFE0F\u20E3", "9\uFE0F\u20E3", "\u{1F51F}"];
188
+ if (step >= 1 && step <= 10) {
189
+ return emojis[step - 1];
190
+ }
191
+ if (step >= 11 && step <= 15) {
192
+ return `1\uFE0F\u20E3${emojis[step - 11]}`;
193
+ }
194
+ return `${step}.`;
195
+ }
196
+ };
197
+ var SilentLogger = class {
198
+ debug() {
199
+ }
200
+ info() {
201
+ }
202
+ warn() {
203
+ }
204
+ error() {
205
+ }
206
+ success() {
207
+ }
208
+ step() {
209
+ }
210
+ stepComplete() {
211
+ }
212
+ setLevel() {
213
+ }
214
+ getLevel() {
215
+ return "silent";
216
+ }
217
+ };
218
+ var BufferedLogger = class {
219
+ level = "info";
220
+ entries = [];
221
+ shouldLog(level) {
222
+ if (this.level === "silent") return false;
223
+ const levels = ["debug", "info", "warn", "error"];
224
+ const currentIndex = levels.indexOf(this.level);
225
+ const messageIndex = levels.indexOf(level);
226
+ return messageIndex >= currentIndex;
227
+ }
228
+ addEntry(level, message, args) {
229
+ this.entries.push({
230
+ level,
231
+ message,
232
+ args,
233
+ timestamp: /* @__PURE__ */ new Date()
234
+ });
235
+ }
236
+ debug(message, ...args) {
237
+ if (this.shouldLog("debug")) {
238
+ this.addEntry("debug", message, args);
239
+ }
240
+ }
241
+ info(message, ...args) {
242
+ if (this.shouldLog("info")) {
243
+ this.addEntry("info", message, args);
244
+ }
245
+ }
246
+ warn(message, ...args) {
247
+ if (this.shouldLog("warn")) {
248
+ this.addEntry("warn", message, args);
249
+ }
250
+ }
251
+ error(message, ...args) {
252
+ if (this.shouldLog("error")) {
253
+ this.addEntry("error", message, args);
254
+ }
255
+ }
256
+ success(message, ...args) {
257
+ if (this.shouldLog("info")) {
258
+ this.addEntry("success", message, args);
259
+ }
260
+ }
261
+ step(stepNumber, message) {
262
+ if (this.shouldLog("info")) {
263
+ this.addEntry("step", message, [stepNumber]);
264
+ }
265
+ }
266
+ stepComplete(message) {
267
+ if (this.shouldLog("info")) {
268
+ this.addEntry("stepComplete", message, []);
269
+ }
270
+ }
271
+ setLevel(level) {
272
+ this.level = level;
273
+ }
274
+ getLevel() {
275
+ return this.level;
276
+ }
277
+ /**
278
+ * Get all logged entries
279
+ */
280
+ getEntries() {
281
+ return [...this.entries];
282
+ }
283
+ /**
284
+ * Clear all logged entries
285
+ */
286
+ clear() {
287
+ this.entries = [];
288
+ }
289
+ };
290
+ function createConsoleLogger(level = "info") {
291
+ const logger2 = new ConsoleLogger();
292
+ logger2.setLevel(level);
293
+ return logger2;
294
+ }
295
+ function createSilentLogger() {
296
+ return new SilentLogger();
297
+ }
298
+ function createBufferedLogger(level = "info") {
299
+ const logger2 = new BufferedLogger();
300
+ logger2.setLevel(level);
301
+ return logger2;
302
+ }
303
+ var globalLogger = createConsoleLogger();
304
+ function getLogger() {
305
+ return globalLogger;
306
+ }
307
+ function setLogger(logger2) {
308
+ globalLogger = logger2;
309
+ }
310
+ function resetLogger() {
311
+ globalLogger = createConsoleLogger();
312
+ }
313
+ var logger = {
314
+ get debug() {
315
+ return globalLogger.debug.bind(globalLogger);
316
+ },
317
+ get info() {
318
+ return globalLogger.info.bind(globalLogger);
319
+ },
320
+ get warn() {
321
+ return globalLogger.warn.bind(globalLogger);
322
+ },
323
+ get error() {
324
+ return globalLogger.error.bind(globalLogger);
325
+ },
326
+ get success() {
327
+ return globalLogger.success.bind(globalLogger);
328
+ },
329
+ get step() {
330
+ return globalLogger.step.bind(globalLogger);
331
+ },
332
+ get stepComplete() {
333
+ return globalLogger.stepComplete.bind(globalLogger);
334
+ }
335
+ };
336
+
337
+ export {
338
+ CodegenError,
339
+ SchemaValidationError,
340
+ ConfigurationError,
341
+ GeneratorError,
342
+ PluginError,
343
+ FileOperationError,
344
+ MissingFieldError,
345
+ UnsupportedFieldTypeError,
346
+ ERROR_CODES,
347
+ isCodegenError,
348
+ wrapError,
349
+ createConsoleLogger,
350
+ createSilentLogger,
351
+ createBufferedLogger,
352
+ getLogger,
353
+ setLogger,
354
+ resetLogger,
355
+ logger
356
+ };
357
+ //# sourceMappingURL=chunk-WY6BC55D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/logger.ts"],"sourcesContent":["/**\n * Custom error classes for the codegen package\n * Provides structured errors with codes and context for better debugging\n */\n\n/**\n * Base error class for all codegen errors\n */\nexport class CodegenError extends Error {\n readonly code: string\n readonly context?: unknown\n\n constructor(message: string, code: string, context?: unknown) {\n super(message)\n this.name = 'CodegenError'\n this.code = code\n this.context = context\n\n // Maintains proper stack trace for where error was thrown (only in V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n /**\n * Format error for display\n */\n toString(): string {\n let result = `[${this.code}] ${this.message}`\n if (this.context) {\n result += `\\nContext: ${JSON.stringify(this.context, null, 2)}`\n }\n return result\n }\n}\n\n/**\n * Error thrown when schema validation fails\n */\nexport class SchemaValidationError extends CodegenError {\n readonly validationErrors: string[]\n\n constructor(message: string, validationErrors: string[], context?: unknown) {\n super(message, 'SCHEMA_VALIDATION_ERROR', context)\n this.name = 'SchemaValidationError'\n this.validationErrors = validationErrors\n }\n\n toString(): string {\n let result = `[${this.code}] ${this.message}`\n if (this.validationErrors.length > 0) {\n result += '\\nValidation errors:'\n for (const error of this.validationErrors) {\n result += `\\n - ${error}`\n }\n }\n return result\n }\n}\n\n/**\n * Error thrown when configuration is invalid or missing\n */\nexport class ConfigurationError extends CodegenError {\n constructor(message: string, context?: unknown) {\n super(message, 'CONFIGURATION_ERROR', context)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Error thrown during code generation\n */\nexport class GeneratorError extends CodegenError {\n readonly generatorName: string\n\n constructor(message: string, generatorName: string, context?: unknown) {\n super(message, 'GENERATOR_ERROR', context)\n this.name = 'GeneratorError'\n this.generatorName = generatorName\n }\n\n toString(): string {\n return `[${this.code}] Generator \"${this.generatorName}\": ${this.message}`\n }\n}\n\n/**\n * Error thrown when a plugin fails\n */\nexport class PluginError extends CodegenError {\n readonly pluginName: string\n\n constructor(message: string, pluginName: string, context?: unknown) {\n super(message, 'PLUGIN_ERROR', context)\n this.name = 'PluginError'\n this.pluginName = pluginName\n }\n\n toString(): string {\n return `[${this.code}] Plugin \"${this.pluginName}\": ${this.message}`\n }\n}\n\n/**\n * Error thrown when a file operation fails\n */\nexport class FileOperationError extends CodegenError {\n readonly filePath: string\n readonly operation: 'read' | 'write' | 'delete' | 'create'\n\n constructor(\n message: string,\n filePath: string,\n operation: 'read' | 'write' | 'delete' | 'create',\n context?: unknown\n ) {\n super(message, 'FILE_OPERATION_ERROR', context)\n this.name = 'FileOperationError'\n this.filePath = filePath\n this.operation = operation\n }\n\n toString(): string {\n return `[${this.code}] Failed to ${this.operation} file \"${this.filePath}\": ${this.message}`\n }\n}\n\n/**\n * Error thrown when a required field is missing\n */\nexport class MissingFieldError extends CodegenError {\n readonly fieldName: string\n readonly schemaName: string\n\n constructor(fieldName: string, schemaName: string, context?: unknown) {\n super(\n `Missing required field \"${fieldName}\" in schema \"${schemaName}\"`,\n 'MISSING_FIELD_ERROR',\n context\n )\n this.name = 'MissingFieldError'\n this.fieldName = fieldName\n this.schemaName = schemaName\n }\n}\n\n/**\n * Error thrown when a field type is not supported\n */\nexport class UnsupportedFieldTypeError extends CodegenError {\n readonly fieldType: string\n readonly fieldName: string\n\n constructor(fieldType: string, fieldName: string, context?: unknown) {\n super(\n `Unsupported field type \"${fieldType}\" for field \"${fieldName}\"`,\n 'UNSUPPORTED_FIELD_TYPE_ERROR',\n context\n )\n this.name = 'UnsupportedFieldTypeError'\n this.fieldType = fieldType\n this.fieldName = fieldName\n }\n}\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport const ERROR_CODES = {\n SCHEMA_VALIDATION_ERROR: 'SCHEMA_VALIDATION_ERROR',\n CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',\n GENERATOR_ERROR: 'GENERATOR_ERROR',\n PLUGIN_ERROR: 'PLUGIN_ERROR',\n FILE_OPERATION_ERROR: 'FILE_OPERATION_ERROR',\n MISSING_FIELD_ERROR: 'MISSING_FIELD_ERROR',\n UNSUPPORTED_FIELD_TYPE_ERROR: 'UNSUPPORTED_FIELD_TYPE_ERROR'\n} as const\n\n// ============================================================================\n// Error Utilities\n// ============================================================================\n\n/**\n * Check if an error is a CodegenError\n */\nexport function isCodegenError(error: unknown): error is CodegenError {\n return error instanceof CodegenError\n}\n\n/**\n * Wrap an unknown error in a CodegenError\n */\nexport function wrapError(error: unknown, code: string, message?: string): CodegenError {\n if (isCodegenError(error)) {\n return error\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error)\n return new CodegenError(message || errorMessage, code, { originalError: error })\n}\n","/**\n * Logger abstraction for the codegen package\n * Replaces direct console.log calls to support library usage and testing\n */\n\n/**\n * Log levels\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent'\n\n/**\n * Logger interface\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void\n info(message: string, ...args: unknown[]): void\n warn(message: string, ...args: unknown[]): void\n error(message: string, ...args: unknown[]): void\n success(message: string, ...args: unknown[]): void\n\n /**\n * Log a step in a process (e.g., \"1️⃣ Generating database schema...\")\n */\n step(stepNumber: number, message: string): void\n\n /**\n * Log a completed step\n */\n stepComplete(message: string): void\n\n /**\n * Set the log level\n */\n setLevel(level: LogLevel): void\n\n /**\n * Get the current log level\n */\n getLevel(): LogLevel\n}\n\n/**\n * Console logger implementation with colored output\n */\nclass ConsoleLogger implements Logger {\n private level: LogLevel = 'info'\n\n private shouldLog(level: LogLevel): boolean {\n if (this.level === 'silent') return false\n\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error']\n const currentIndex = levels.indexOf(this.level)\n const messageIndex = levels.indexOf(level)\n\n return messageIndex >= currentIndex\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog('debug')) {\n console.log(`\\x1b[90m[DEBUG]\\x1b[0m ${message}`, ...args)\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog('info')) {\n console.log(message, ...args)\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog('warn')) {\n console.warn(`\\x1b[33m⚠️ ${message}\\x1b[0m`, ...args)\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog('error')) {\n console.error(`\\x1b[31m❌ ${message}\\x1b[0m`, ...args)\n }\n }\n\n success(message: string, ...args: unknown[]): void {\n if (this.shouldLog('info')) {\n console.log(`\\x1b[32m✓ ${message}\\x1b[0m`, ...args)\n }\n }\n\n step(stepNumber: number, message: string): void {\n if (this.shouldLog('info')) {\n const emoji = this.getStepEmoji(stepNumber)\n console.log(`${emoji} ${message}`)\n }\n }\n\n stepComplete(message: string): void {\n if (this.shouldLog('info')) {\n console.log(` \\x1b[32m✓\\x1b[0m ${message}`)\n }\n }\n\n setLevel(level: LogLevel): void {\n this.level = level\n }\n\n getLevel(): LogLevel {\n return this.level\n }\n\n private getStepEmoji(step: number): string {\n const emojis = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']\n if (step >= 1 && step <= 10) {\n return emojis[step - 1]\n }\n if (step >= 11 && step <= 15) {\n return `1️⃣${emojis[step - 11]}`\n }\n return `${step}.`\n }\n}\n\n/**\n * Silent logger implementation for testing and library usage\n */\nclass SilentLogger implements Logger {\n debug(): void {}\n info(): void {}\n warn(): void {}\n error(): void {}\n success(): void {}\n step(): void {}\n stepComplete(): void {}\n setLevel(): void {}\n getLevel(): LogLevel {\n return 'silent'\n }\n}\n\n/**\n * Buffered logger that stores log messages for later retrieval\n */\nexport interface LogEntry {\n level: LogLevel | 'success' | 'step' | 'stepComplete'\n message: string\n args: unknown[]\n timestamp: Date\n}\n\nclass BufferedLogger implements Logger {\n private level: LogLevel = 'info'\n private entries: LogEntry[] = []\n\n private shouldLog(level: LogLevel): boolean {\n if (this.level === 'silent') return false\n\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error']\n const currentIndex = levels.indexOf(this.level)\n const messageIndex = levels.indexOf(level)\n\n return messageIndex >= currentIndex\n }\n\n private addEntry(level: LogEntry['level'], message: string, args: unknown[]): void {\n this.entries.push({\n level,\n message,\n args,\n timestamp: new Date()\n })\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog('debug')) {\n this.addEntry('debug', message, args)\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog('info')) {\n this.addEntry('info', message, args)\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog('warn')) {\n this.addEntry('warn', message, args)\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog('error')) {\n this.addEntry('error', message, args)\n }\n }\n\n success(message: string, ...args: unknown[]): void {\n if (this.shouldLog('info')) {\n this.addEntry('success', message, args)\n }\n }\n\n step(stepNumber: number, message: string): void {\n if (this.shouldLog('info')) {\n this.addEntry('step', message, [stepNumber])\n }\n }\n\n stepComplete(message: string): void {\n if (this.shouldLog('info')) {\n this.addEntry('stepComplete', message, [])\n }\n }\n\n setLevel(level: LogLevel): void {\n this.level = level\n }\n\n getLevel(): LogLevel {\n return this.level\n }\n\n /**\n * Get all logged entries\n */\n getEntries(): LogEntry[] {\n return [...this.entries]\n }\n\n /**\n * Clear all logged entries\n */\n clear(): void {\n this.entries = []\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a console logger\n */\nexport function createConsoleLogger(level: LogLevel = 'info'): Logger {\n const logger = new ConsoleLogger()\n logger.setLevel(level)\n return logger\n}\n\n/**\n * Create a silent logger (for testing or library usage)\n */\nexport function createSilentLogger(): Logger {\n return new SilentLogger()\n}\n\n/**\n * Create a buffered logger (for testing)\n */\nexport function createBufferedLogger(\n level: LogLevel = 'info'\n): Logger & { getEntries(): LogEntry[]; clear(): void } {\n const logger = new BufferedLogger()\n logger.setLevel(level)\n return logger\n}\n\n// ============================================================================\n// Global Logger Instance\n// ============================================================================\n\n/**\n * Global logger instance\n * This is the default logger used throughout the package\n */\nlet globalLogger: Logger = createConsoleLogger()\n\n/**\n * Get the global logger\n */\nexport function getLogger(): Logger {\n return globalLogger\n}\n\n/**\n * Set the global logger\n */\nexport function setLogger(logger: Logger): void {\n globalLogger = logger\n}\n\n/**\n * Reset the global logger to the default console logger\n */\nexport function resetLogger(): void {\n globalLogger = createConsoleLogger()\n}\n\n// Export the logger as a convenience\nexport const logger = {\n get debug() {\n return globalLogger.debug.bind(globalLogger)\n },\n get info() {\n return globalLogger.info.bind(globalLogger)\n },\n get warn() {\n return globalLogger.warn.bind(globalLogger)\n },\n get error() {\n return globalLogger.error.bind(globalLogger)\n },\n get success() {\n return globalLogger.success.bind(globalLogger)\n },\n get step() {\n return globalLogger.step.bind(globalLogger)\n },\n get stepComplete() {\n return globalLogger.stepComplete.bind(globalLogger)\n }\n}\n"],"mappings":"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","names":["logger"]}