@bairock/lenz 0.0.16 → 0.0.17

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 (30) hide show
  1. package/README.md +107 -15
  2. package/dist/cli/commands/generate/crud.d.ts +3 -0
  3. package/dist/cli/commands/generate/crud.d.ts.map +1 -0
  4. package/dist/cli/commands/generate/crud.js +123 -0
  5. package/dist/cli/commands/generate/crud.js.map +1 -0
  6. package/dist/cli/commands/generate/index.d.ts +3 -0
  7. package/dist/cli/commands/generate/index.d.ts.map +1 -0
  8. package/dist/cli/commands/generate/index.js +8 -0
  9. package/dist/cli/commands/generate/index.js.map +1 -0
  10. package/dist/cli/commands/generate/orm.d.ts +3 -0
  11. package/dist/cli/commands/generate/orm.d.ts.map +1 -0
  12. package/dist/cli/commands/generate/orm.js +107 -0
  13. package/dist/cli/commands/generate/orm.js.map +1 -0
  14. package/dist/cli/index.js +1 -1
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/engine/CodeGenerator.d.ts +1 -0
  17. package/dist/engine/CodeGenerator.d.ts.map +1 -1
  18. package/dist/engine/CodeGenerator.js +3 -0
  19. package/dist/engine/CodeGenerator.js.map +1 -1
  20. package/dist/engine/generators/CrudModuleGenerator.d.ts +10 -0
  21. package/dist/engine/generators/CrudModuleGenerator.d.ts.map +1 -0
  22. package/dist/engine/generators/CrudModuleGenerator.js +141 -0
  23. package/dist/engine/generators/CrudModuleGenerator.js.map +1 -0
  24. package/dist/engine/generators/SDLInputTypesGenerator.d.ts +6 -0
  25. package/dist/engine/generators/SDLInputTypesGenerator.d.ts.map +1 -0
  26. package/dist/engine/generators/SDLInputTypesGenerator.js +763 -0
  27. package/dist/engine/generators/SDLInputTypesGenerator.js.map +1 -0
  28. package/dist/index.js +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/package.json +9 -3
package/README.md CHANGED
@@ -1,18 +1,19 @@
1
- # Lenz 🚀
1
+ # Lenz
2
2
 
3
- GraphQL-based ORM for MongoDB (Prisma style)
3
+ GraphQL SDL MongoDB ORM — TypeScript-клиент и Apollo Server модули из SDL
4
4
 
5
5
  ## Features
6
6
 
7
- - ✅ **GraphQL SDL Schema** - Define models using GraphQL syntax
8
- - ✅ **TypeScript First** - Full type safety and autocompletion
9
- - ✅ **MongoDB Native** - Leverage all MongoDB features including aggregation
10
- - ✅ **Prisma Style** - Familiar configuration and client generation
11
- - ✅ **Auto-generated Client** - Generate TypeScript client from GraphQL schema
12
- - ✅ **Relations Support** - One-to-One, One-to-Many, Many-to-Many
13
- - ✅ **Smart Loading Strategies** - Automatic choice between populate (separate queries) and lookup (server-side joins)
14
- - ✅ **Automatic Indexing** - Intelligent index creation for foreign key fields
15
- - ✅ **Transactions** - ACID transactions with MongoDB
7
+ - ✅ **GraphQL SDL Schema** Define models using GraphQL syntax
8
+ - ✅ **TypeScript First** Full type safety and autocompletion
9
+ - ✅ **MongoDB Only** Native MongoDB, no SQL
10
+ - ✅ **Prisma Style** Familiar configuration and client generation
11
+ - ✅ **Auto-generated Client** Generate TypeScript client from GraphQL schema
12
+ - ✅ **CRUD Modules** Generate Apollo Server typeDefs + resolvers (`lenz generate crud`)
13
+ - ✅ **Relations Support** — One-to-One, One-to-Many, Many-to-Many
14
+ - ✅ **Smart Loading Strategies** Automatic choice between populate (separate queries) and lookup (server-side joins)
15
+ - ✅ **Automatic Indexing** Intelligent index creation for foreign key fields
16
+ - ✅ **Transactions** — ACID transactions with MongoDB
16
17
 
17
18
  ## Сравнение с Prisma
18
19
 
@@ -977,14 +978,23 @@ type Author @model {
977
978
  # Initialize project
978
979
  npx lenz init
979
980
 
980
- # Generate client
981
- npx lenz generate
981
+ # Generate ORM client
982
+ npx lenz generate orm
983
+
984
+ # Generate ORM client with custom config
985
+ npx lenz generate orm --config lenz/lenz.config.ts
986
+
987
+ # Generate Apollo Server CRUD modules
988
+ npx lenz generate crud
982
989
 
983
- # Generate with custom config (use .ts for TypeScript, .js for JavaScript)
984
- npx lenz generate --config lenz/lenz.config.ts
990
+ # Generate CRUD modules with custom paths
991
+ npx lenz generate crud --schema lenz/schema.graphql --output ./src
985
992
 
986
993
  # Show help
987
994
  npx lenz --help
995
+
996
+ # Show generate subcommands
997
+ npx lenz generate
988
998
  ```
989
999
 
990
1000
  ## Structure After Generation
@@ -1001,11 +1011,93 @@ my-app/
1001
1011
  │ ├── client.ts # LenzClient class
1002
1012
  │ ├── types.ts # TypeScript types
1003
1013
  │ ├── enums.ts # Enum definitions
1014
+ │ ├── inputTypes.ts # GraphQL input types (filters, CreateInput, UpdateInput)
1004
1015
  │ ├── runtime/ # Runtime utilities
1005
1016
  │ └── models/ # Model delegates
1006
1017
  └── .env # Environment variables
1007
1018
  ```
1008
1019
 
1020
+ ### `lenz generate crud` — Apollo Server CRUD Modules
1021
+
1022
+ Generates per-model Apollo Server modules (typeDefs + resolvers) from `lenz/schema.graphql`.
1023
+
1024
+ **Опции:**
1025
+ - `-c, --config <path>` — путь к конфиг-файлу (по умолчанию: `lenz/lenz.config.ts`, с автоопределением `lenz/lenz.config.js`)
1026
+ - `-s, --schema <path>` — путь к схеме (по умолчанию: из конфига или `schema.graphql`)
1027
+ - `-o, --output <path>` — выходная директория (по умолчанию: из конфига `generate.crud.output` или `./src`)
1028
+
1029
+ **Определение языка:** генератор определяет TypeScript или JavaScript по расширению конфиг-файла:
1030
+ - `lenz/lenz.config.ts` → генерирует `.ts` файлы
1031
+ - `lenz/lenz.config.js` → генерирует `.js` файлы
1032
+
1033
+ Если конфиг не найден, по умолчанию используются `.ts` файлы.
1034
+
1035
+ **Структура выхода:**
1036
+ ```
1037
+ src/
1038
+ ├── index.ts # Баррель-файл: typeDefs + resolvers всех модулей
1039
+ ├── Category/
1040
+ │ ├── typeDefs/
1041
+ │ │ ├── mutations.ts # createCategory, updateCategory, deleteCategory
1042
+ │ │ └── queries.ts # findUniqueCategory, findFirstCategory, findManyCategory, findManyCategoryCount
1043
+ │ ├── resolvers/
1044
+ │ │ ├── mutations.ts # Resolvers using { lenz } from context
1045
+ │ │ └── queries.ts
1046
+ │ └── index.ts # Aggregated typeDefs and resolvers
1047
+ ├── User/
1048
+ │ ├── ...
1049
+ │ └── index.ts
1050
+ └── ... (все модели)
1051
+ ```
1052
+
1053
+ Баррель `src/index.ts` автоматически импортирует `inputTypes` из ORM-клиента и собирает все модули:
1054
+
1055
+ ```typescript
1056
+ // src/index.ts (сгенерировано)
1057
+ import { mergeTypeDefs, mergeResolvers } from '@graphql-tools/merge';
1058
+ import { inputTypes } from '../generated/lenz/client/inputTypes.js';
1059
+ import { categoryTypeDefs, categoryResolvers } from './Category/index.js';
1060
+ import { userTypeDefs, userResolvers } from './User/index.js';
1061
+
1062
+ export const typeDefs = mergeTypeDefs([inputTypes, ...categoryTypeDefs, ...userTypeDefs]);
1063
+ export const resolvers = mergeResolvers([categoryResolvers, userResolvers]);
1064
+ ```
1065
+
1066
+ **Пример конфига (опционально):**
1067
+ ```js
1068
+ // lenz/lenz.config.js
1069
+ export default {
1070
+ schema: 'lenz/schema.graphql',
1071
+ generate: {
1072
+ crud: {
1073
+ output: './src',
1074
+ },
1075
+ },
1076
+ };
1077
+ ```
1078
+
1079
+ **Использование с Apollo Server:**
1080
+
1081
+ Резолверы получают экземпляр `LenzClient` через поле `lenz` GraphQL контекста — без импорта сервисов. Баррель `src/index.ts` уже собирает все typeDefs и resolvers:
1082
+
1083
+ ```typescript
1084
+ import { ApolloServer } from '@apollo/server';
1085
+ import { startStandaloneServer } from '@apollo/server/standalone';
1086
+ import { LenzClient } from '../generated/lenz/client/index.js';
1087
+ import { typeDefs, resolvers } from './src/index.js';
1088
+
1089
+ const lenz = new LenzClient({ url: process.env.MONGO_URL });
1090
+ await lenz.$connect();
1091
+
1092
+ const server = new ApolloServer({ typeDefs, resolvers });
1093
+
1094
+ const { url } = await startStandaloneServer(server, {
1095
+ context: async () => ({ lenz }),
1096
+ });
1097
+ ```
1098
+
1099
+ > **Важно:** `src/index.ts` автоматически импортирует `inputTypes` из ORM-клиента и объединяет их со всеми CRUD-модулями через `mergeTypeDefs` / `mergeResolvers`. Путь к ORM-клиенту берётся из конфига (`generate.client.output`) или используется `../generated/lenz/client` по умолчанию.
1100
+
1009
1101
  ## Development
1010
1102
 
1011
1103
  ### Build
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const generateCrudCommand: Command;
3
+ //# sourceMappingURL=crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/crud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,mBAAmB,SA0I5B,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { Command } from 'commander';
2
+ import { promises as fs, existsSync } from 'fs';
3
+ import { resolve, dirname, relative, sep, join } from 'path';
4
+ import chalk from 'chalk';
5
+ import * as ts from 'typescript';
6
+ import { GraphQLParser } from '../../../engine/GraphQLParser.js';
7
+ import { CrudModuleGenerator } from '../../../engine/generators/CrudModuleGenerator.js';
8
+ import { ConfigurationError } from '../../../errors/index.js';
9
+ export const generateCrudCommand = new Command('crud')
10
+ .description('Generate Apollo Server CRUD modules from GraphQL schema')
11
+ .option('-c, --config <path>', 'Path to lenz config file', 'lenz/lenz.config.ts')
12
+ .option('-s, --schema <path>', 'Path to GraphQL schema file')
13
+ .option('-o, --output <path>', 'Output directory for generated modules')
14
+ .action(async (options) => {
15
+ console.log(chalk.blue('🚀 Generating Apollo Server CRUD modules...'));
16
+ try {
17
+ // 1. Load config (for path resolution and language detection)
18
+ let config = {};
19
+ let configFile = options.config;
20
+ // Auto-detect JS config if default TS config doesn't exist
21
+ if (configFile === 'lenz/lenz.config.ts') {
22
+ const tsConfigPath = resolve(process.cwd(), 'lenz/lenz.config.ts');
23
+ const jsConfigPath = resolve(process.cwd(), 'lenz/lenz.config.js');
24
+ if (!existsSync(tsConfigPath) && existsSync(jsConfigPath)) {
25
+ configFile = 'lenz/lenz.config.js';
26
+ console.log(chalk.gray(`📦 Using JavaScript config: ${configFile}`));
27
+ }
28
+ }
29
+ const configPath = resolve(process.cwd(), configFile);
30
+ if (existsSync(configPath)) {
31
+ if (configPath.endsWith('.ts')) {
32
+ try {
33
+ const configModule = await import(configPath);
34
+ config = configModule.default || configModule;
35
+ }
36
+ catch {
37
+ const tsCode = await fs.readFile(configPath, 'utf-8');
38
+ const jsCode = ts.transpileModule(tsCode, {
39
+ compilerOptions: {
40
+ target: ts.ScriptTarget.ES2020,
41
+ module: ts.ModuleKind.ESNext,
42
+ strict: false,
43
+ esModuleInterop: true,
44
+ }
45
+ }).outputText;
46
+ const tempPath = resolve(dirname(configPath), `.lenz-config-${Date.now()}.mjs`);
47
+ await fs.writeFile(tempPath, jsCode, 'utf-8');
48
+ try {
49
+ const configModule = await import(tempPath);
50
+ config = configModule.default || configModule;
51
+ }
52
+ finally {
53
+ await fs.unlink(tempPath).catch(() => { });
54
+ }
55
+ }
56
+ }
57
+ else if (configPath.endsWith('.js') || configPath.endsWith('.mjs')) {
58
+ const configModule = await import(configPath);
59
+ config = configModule.default || configModule;
60
+ }
61
+ }
62
+ else {
63
+ console.log(chalk.yellow('⚠️ Config file not found, using defaults'));
64
+ }
65
+ // 2. Resolve paths
66
+ const isTypeScript = configPath.endsWith('.ts');
67
+ const schemaPath = resolve(dirname(configPath), options.schema || config.schema || 'schema.graphql');
68
+ if (!existsSync(schemaPath)) {
69
+ throw new ConfigurationError(`Schema file not found: ${schemaPath}. Try running: lenz init`, { schemaPath });
70
+ }
71
+ const outputPath = resolve(dirname(configPath), options.output || config.generate?.crud?.output || './src');
72
+ // Compute inputTypes path relative to CRUD output
73
+ const ormOutputDir = resolve(dirname(configPath), config.generate?.client?.output || '../generated/lenz/client');
74
+ const inputTypesRel = relative(outputPath, join(ormOutputDir, 'inputTypes.js')).split(sep).join('/');
75
+ const inputTypesPath = inputTypesRel.startsWith('.') ? inputTypesRel : `./${inputTypesRel}`;
76
+ // 3. Read and parse schema
77
+ const schemaSDL = await fs.readFile(schemaPath, 'utf-8');
78
+ const parser = new GraphQLParser(schemaSDL);
79
+ parser.validate();
80
+ const schemaInfo = parser.getSchemaInfo();
81
+ const models = schemaInfo.models;
82
+ const nonEmbedded = models.filter(m => !m.isEmbedded);
83
+ console.log(chalk.blue(`📊 Found ${nonEmbedded.length} non-embedded models`));
84
+ console.log(chalk.gray(`📁 Detected ${isTypeScript ? 'TypeScript' : 'JavaScript'} project`));
85
+ // 4. Validate required input types exist in schema
86
+ const generator = new CrudModuleGenerator(inputTypesPath);
87
+ generator.validate(models, schemaSDL);
88
+ // 5. Generate files with proper extension
89
+ const files = generator.generate(models);
90
+ // 6. Write files
91
+ let fileCount = 0;
92
+ for (let [relativePath, content] of Object.entries(files)) {
93
+ // Change extension from .ts to .js for JS projects
94
+ if (!isTypeScript) {
95
+ relativePath = relativePath.replace(/\.ts$/, '.js');
96
+ }
97
+ const fullPath = resolve(outputPath, relativePath);
98
+ const dir = resolve(outputPath, relativePath.split('/').slice(0, -1).join('/'));
99
+ await fs.mkdir(dir, { recursive: true });
100
+ await fs.writeFile(fullPath, content, 'utf-8');
101
+ fileCount++;
102
+ }
103
+ // 7. Print summary
104
+ console.log(chalk.green(`✅ CRUD modules generated!`));
105
+ console.log(chalk.gray('================================'));
106
+ console.log(chalk.cyan('📊 Generated:'));
107
+ console.log(chalk.white(` • ${nonEmbedded.length} model modules`));
108
+ console.log(chalk.white(` • ${fileCount} files total`));
109
+ console.log(chalk.gray('================================\n'));
110
+ console.log(chalk.yellow('📋 Next steps:'));
111
+ console.log(chalk.white(` 1. Import from barrel: ${chalk.cyan(`import { typeDefs, resolvers } from '${options.output || './src'}/index${isTypeScript ? '.ts' : '.js'}'`)}`));
112
+ console.log(chalk.white(` 2. Add lenz client to Apollo context: ${chalk.cyan(`context: ({ req }) => ({ lenz })`)}\n`));
113
+ }
114
+ catch (error) {
115
+ console.log(chalk.red('❌ CRUD generation failed:'));
116
+ console.log(chalk.red(error instanceof Error ? error.message : String(error)));
117
+ if (typeof error === 'object' && error !== null && 'details' in error) {
118
+ console.log(chalk.gray(' Details:', JSON.stringify(error.details, null, 2)));
119
+ }
120
+ throw error;
121
+ }
122
+ });
123
+ //# sourceMappingURL=crud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.js","sourceRoot":"","sources":["../../../../src/cli/commands/generate/crud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const generateCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,eAAe,SAGM,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ import { generateOrmCommand } from './orm.js';
3
+ import { generateCrudCommand } from './crud.js';
4
+ export const generateCommand = new Command('generate')
5
+ .description('Generate code from lenz/schema.graphql')
6
+ .addCommand(generateOrmCommand)
7
+ .addCommand(generateCrudCommand);
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,wCAAwC,CAAC;KACrD,UAAU,CAAC,kBAAkB,CAAC;KAC9B,UAAU,CAAC,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const generateOrmCommand: Command;
3
+ //# sourceMappingURL=orm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orm.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/orm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,kBAAkB,SAkH3B,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { Command } from 'commander';
2
+ import { LenzEngine } from '../../../engine/LenzEngine.js';
3
+ import { existsSync, promises as fs } from 'fs';
4
+ import { resolve, dirname } from 'path';
5
+ import chalk from 'chalk';
6
+ import * as ts from 'typescript';
7
+ import { ConfigurationError } from '../../../errors/index.js';
8
+ export const generateOrmCommand = new Command('orm')
9
+ .description('Generate Lenz ORM client from GraphQL schema')
10
+ .option('-c, --config <path>', 'Path to lenz config file', 'lenz/lenz.config.ts')
11
+ .option('-s, --schema <path>', 'Path to GraphQL schema file')
12
+ .option('-o, --output <path>', 'Output directory for generated client')
13
+ .option('-n, --name <name>', 'Name of the generated client', 'LenzClient')
14
+ .action(async (options) => {
15
+ console.log(chalk.blue('🚀 Generating Lenz client...'));
16
+ try {
17
+ let config = {};
18
+ // Автоматически определяем конфиг по типу проекта, если используется значение по умолчанию
19
+ let configFile = options.config;
20
+ if (configFile === 'lenz/lenz.config.ts') {
21
+ const tsConfigPath = resolve(process.cwd(), 'lenz/lenz.config.ts');
22
+ const jsConfigPath = resolve(process.cwd(), 'lenz/lenz.config.js');
23
+ if (!existsSync(tsConfigPath) && existsSync(jsConfigPath)) {
24
+ configFile = 'lenz/lenz.config.js';
25
+ console.log(chalk.gray(`📦 Using JavaScript config: ${configFile}`));
26
+ }
27
+ }
28
+ const configPath = resolve(process.cwd(), configFile);
29
+ // Загружаем конфигурацию
30
+ if (existsSync(configPath)) {
31
+ if (configPath.endsWith('.ts')) {
32
+ // Try direct import first (works when running via tsx), fallback to transpile
33
+ try {
34
+ const configModule = await import(configPath);
35
+ config = configModule.default || configModule;
36
+ }
37
+ catch {
38
+ // Fallback: transpile with TypeScript compiler
39
+ const tsCode = await fs.readFile(configPath, 'utf-8');
40
+ const jsCode = ts.transpileModule(tsCode, {
41
+ compilerOptions: {
42
+ target: ts.ScriptTarget.ES2020,
43
+ module: ts.ModuleKind.ESNext,
44
+ strict: false,
45
+ esModuleInterop: true,
46
+ }
47
+ }).outputText;
48
+ const tempPath = resolve(dirname(configPath), `.lenz-config-${Date.now()}.mjs`);
49
+ await fs.writeFile(tempPath, jsCode, 'utf-8');
50
+ try {
51
+ const configModule = await import(tempPath);
52
+ config = configModule.default || configModule;
53
+ }
54
+ finally {
55
+ await fs.unlink(tempPath).catch(() => { });
56
+ }
57
+ }
58
+ }
59
+ else if (configPath.endsWith('.js') || configPath.endsWith('.mjs')) {
60
+ // Для JavaScript конфига (только ESM)
61
+ const configModule = await import(configPath);
62
+ config = configModule.default || configModule;
63
+ }
64
+ }
65
+ else {
66
+ console.log(chalk.yellow('⚠️ Config file not found, using defaults'));
67
+ }
68
+ // Определяем пути
69
+ const schemaPath = resolve(dirname(configPath), options.schema || config.schema || 'schema.graphql');
70
+ if (!existsSync(schemaPath)) {
71
+ throw new ConfigurationError(`Schema file not found: ${schemaPath}. Try running: lenz init`, { schemaPath });
72
+ }
73
+ const outputPath = resolve(dirname(configPath), options.output || config.generate?.client?.output || '../generated/lenz/client');
74
+ // Создаем движок и генерируем
75
+ const engine = new LenzEngine({
76
+ schemaPath,
77
+ outputPath,
78
+ clientName: options.name
79
+ });
80
+ await engine.generate();
81
+ // Отображаем информацию
82
+ const schemaInfo = engine.getSchemaInfo();
83
+ if (schemaInfo) {
84
+ console.log(chalk.green('✅ Generation complete!'));
85
+ console.log(chalk.gray('================================'));
86
+ console.log(chalk.cyan('📊 Generated:'));
87
+ console.log(chalk.white(` • ${schemaInfo.modelCount} models`));
88
+ console.log(chalk.white(` • ${schemaInfo.enumCount} enums`));
89
+ console.log(chalk.white(` • ${schemaInfo.relationCount} relations`));
90
+ console.log(chalk.gray('================================\n'));
91
+ console.log(chalk.yellow('🚀 Next steps:'));
92
+ console.log(chalk.white(` 1. Import client: ${chalk.cyan(`import { LenzClient } from '../generated/lenz/client'`)}`));
93
+ console.log(chalk.white(` 2. Create instance: ${chalk.cyan(`const lenz = new LenzClient({ url: 'mongodb://...' })`)}`));
94
+ console.log(chalk.white(` 3. Connect: ${chalk.cyan(`await lenz.$connect()`)}`));
95
+ console.log(chalk.white(` 4. Use models: ${chalk.cyan(`await lenz.user.findMany()`)}\n`));
96
+ }
97
+ }
98
+ catch (error) {
99
+ console.log(chalk.red('❌ Generation failed:'));
100
+ console.log(chalk.red(error instanceof Error ? error.message : String(error)));
101
+ if (typeof error === 'object' && error !== null && 'details' in error) {
102
+ console.log(chalk.gray(' Details:', JSON.stringify(error.details, null, 2)));
103
+ }
104
+ throw error;
105
+ }
106
+ });
107
+ //# sourceMappingURL=orm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orm.js","sourceRoot":"","sources":["../../../../src/cli/commands/generate/orm.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
- import { generateCommand } from './commands/generate.js';
3
+ import { generateCommand } from './commands/generate/index.js';
4
4
  import { initCommand } from './commands/init.js';
5
5
  import chalk from 'chalk';
6
6
  import figlet from 'figlet';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,OAAO,CAAC;KAChB,eAAe,CAAC;IACf,WAAW,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACnD,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAEpC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,OAAO,CAAC;KAChB,eAAe,CAAC;IACf,WAAW,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACnD,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAEpC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -14,6 +14,7 @@ export declare class CodeGenerator {
14
14
  private clientGenerator;
15
15
  private delegateGenerator;
16
16
  private runtimeGenerator;
17
+ private sdlInputTypesGenerator;
17
18
  generate(options: GenerateOptions): GeneratedFiles;
18
19
  }
19
20
  //# sourceMappingURL=CodeGenerator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeGenerator.d.ts","sourceRoot":"","sources":["../../src/engine/CodeGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAO9E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAA0B;IAElD,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc;CAkCnD"}
1
+ {"version":3,"file":"CodeGenerator.d.ts","sourceRoot":"","sources":["../../src/engine/CodeGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQ9E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,sBAAsB,CAAgC;IAE9D,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc;CAmCnD"}
@@ -3,12 +3,14 @@ import { TypeGenerator } from './generators/TypeGenerator.js';
3
3
  import { ClientGenerator } from './generators/ClientGenerator.js';
4
4
  import { DelegateGenerator } from './generators/DelegateGenerator.js';
5
5
  import { RuntimeGenerator } from './generators/RuntimeGenerator.js';
6
+ import { SDLInputTypesGenerator } from './generators/SDLInputTypesGenerator.js';
6
7
  export class CodeGenerator {
7
8
  constructor() {
8
9
  this.typeGenerator = new TypeGenerator();
9
10
  this.clientGenerator = new ClientGenerator();
10
11
  this.delegateGenerator = new DelegateGenerator();
11
12
  this.runtimeGenerator = new RuntimeGenerator();
13
+ this.sdlInputTypesGenerator = new SDLInputTypesGenerator();
12
14
  }
13
15
  generate(options) {
14
16
  const { models, enums, clientName = 'LenzClient' } = options;
@@ -24,6 +26,7 @@ export class CodeGenerator {
24
26
  'runtime/relations.ts': this.runtimeGenerator.generateRuntimeRelations(),
25
27
  'runtime/errors.ts': this.runtimeGenerator.generateRuntimeErrors(),
26
28
  'runtime/logger.ts': this.runtimeGenerator.generateRuntimeLogger(),
29
+ 'inputTypes.ts': this.sdlInputTypesGenerator.generateSDLOutput(models, enums),
27
30
  'models/index.ts': this.delegateGenerator.generateModelsIndex(nonEmbeddedModels),
28
31
  ...this.delegateGenerator.generateModelFiles(nonEmbeddedModels)
29
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"CodeGenerator.js","sourceRoot":"","sources":["../../src/engine/CodeGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACxH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAcpE,MAAM,OAAO,aAAa;IAA1B;QACU,kBAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,sBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC5C,qBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAoCpD,CAAC;IAlCC,QAAQ,CAAC,OAAwB;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;QAC7D,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAE5D,MAAM,KAAK,GAAmB;YAC5B,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC;YAC1D,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,EAAE,iBAAiB,CAAC;YAC/E,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;YAC3D,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;YACnD,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE;YAChE,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE;YAChE,uBAAuB,EAAE,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,EAAE;YAC1E,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,EAAE;YACxE,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,EAAE;YAClE,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,EAAE;YAClE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;YAChF,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;SAChE,CAAC;QAEF,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAEhD,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACvD,MAAM,CAAC,MAAM,CAAC,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"CodeGenerator.js","sourceRoot":"","sources":["../../src/engine/CodeGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { GraphQLModel } from '../GraphQLParser.js';
2
+ export declare class CrudModuleGenerator {
3
+ private inputTypesPath;
4
+ constructor(inputTypesPath?: string);
5
+ generate(models: GraphQLModel[]): Record<string, string>;
6
+ private genBarrelIndex;
7
+ /** Validate that all required SDL input types exist in the schema SDL string */
8
+ validate(models: GraphQLModel[], schemaSDL: string): void;
9
+ }
10
+ //# sourceMappingURL=CrudModuleGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrudModuleGenerator.d.ts","sourceRoot":"","sources":["../../../src/engine/generators/CrudModuleGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAqFnD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,cAAc,CAAS;gBAEnB,cAAc,GAAE,MAAiD;IAI7E,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAoBxD,OAAO,CAAC,cAAc;IAsBtB,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CA0B1D"}