@bairock/lenz 0.0.15 → 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.
- package/README.md +195 -19
- package/dist/cli/commands/generate/crud.d.ts +3 -0
- package/dist/cli/commands/generate/crud.d.ts.map +1 -0
- package/dist/cli/commands/generate/crud.js +123 -0
- package/dist/cli/commands/generate/crud.js.map +1 -0
- package/dist/cli/commands/generate/index.d.ts +3 -0
- package/dist/cli/commands/generate/index.d.ts.map +1 -0
- package/dist/cli/commands/generate/index.js +8 -0
- package/dist/cli/commands/generate/index.js.map +1 -0
- package/dist/cli/commands/generate/orm.d.ts +3 -0
- package/dist/cli/commands/generate/orm.d.ts.map +1 -0
- package/dist/cli/commands/generate/orm.js +107 -0
- package/dist/cli/commands/generate/orm.js.map +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +34 -8
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +0 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/index.js +1 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +4 -6
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +24 -3
- package/dist/config/index.js.map +1 -1
- package/dist/engine/CodeGenerator.d.ts +8 -28
- package/dist/engine/CodeGenerator.d.ts.map +1 -1
- package/dist/engine/CodeGenerator.js +28 -1969
- package/dist/engine/CodeGenerator.js.map +1 -1
- package/dist/engine/GraphQLParseHelpers.d.ts +25 -0
- package/dist/engine/GraphQLParseHelpers.d.ts.map +1 -0
- package/dist/engine/GraphQLParseHelpers.js +128 -0
- package/dist/engine/GraphQLParseHelpers.js.map +1 -0
- package/dist/engine/GraphQLParser.d.ts +23 -10
- package/dist/engine/GraphQLParser.d.ts.map +1 -1
- package/dist/engine/GraphQLParser.js +154 -240
- package/dist/engine/GraphQLParser.js.map +1 -1
- package/dist/engine/GraphQLRelationAnalyzer.d.ts +10 -0
- package/dist/engine/GraphQLRelationAnalyzer.d.ts.map +1 -0
- package/dist/engine/GraphQLRelationAnalyzer.js +117 -0
- package/dist/engine/GraphQLRelationAnalyzer.js.map +1 -0
- package/dist/engine/LenzEngine.d.ts +1 -1
- package/dist/engine/LenzEngine.d.ts.map +1 -1
- package/dist/engine/LenzEngine.js +33 -13
- package/dist/engine/LenzEngine.js.map +1 -1
- package/dist/engine/SchemaRelationValidator.d.ts +15 -0
- package/dist/engine/SchemaRelationValidator.d.ts.map +1 -0
- package/dist/engine/SchemaRelationValidator.js +133 -0
- package/dist/engine/SchemaRelationValidator.js.map +1 -0
- package/dist/engine/SchemaValidator.d.ts +11 -10
- package/dist/engine/SchemaValidator.d.ts.map +1 -1
- package/dist/engine/SchemaValidator.js +151 -169
- package/dist/engine/SchemaValidator.js.map +1 -1
- package/dist/engine/directives.d.ts +10 -0
- package/dist/engine/directives.d.ts.map +1 -1
- package/dist/engine/directives.js +152 -6
- package/dist/engine/directives.js.map +1 -1
- package/dist/engine/generators/ClientGenerator.d.ts +7 -0
- package/dist/engine/generators/ClientGenerator.d.ts.map +1 -0
- package/dist/engine/generators/ClientGenerator.js +386 -0
- package/dist/engine/generators/ClientGenerator.js.map +1 -0
- package/dist/engine/generators/CrudModuleGenerator.d.ts +10 -0
- package/dist/engine/generators/CrudModuleGenerator.d.ts.map +1 -0
- package/dist/engine/generators/CrudModuleGenerator.js +141 -0
- package/dist/engine/generators/CrudModuleGenerator.js.map +1 -0
- package/dist/engine/generators/DelegateGenerator.d.ts +9 -0
- package/dist/engine/generators/DelegateGenerator.d.ts.map +1 -0
- package/dist/engine/generators/DelegateGenerator.js +453 -0
- package/dist/engine/generators/DelegateGenerator.js.map +1 -0
- package/dist/engine/generators/DelegateHelpers.d.ts +7 -0
- package/dist/engine/generators/DelegateHelpers.d.ts.map +1 -0
- package/dist/engine/generators/DelegateHelpers.js +144 -0
- package/dist/engine/generators/DelegateHelpers.js.map +1 -0
- package/dist/engine/generators/DelegateRelations.d.ts +11 -0
- package/dist/engine/generators/DelegateRelations.d.ts.map +1 -0
- package/dist/engine/generators/DelegateRelations.js +794 -0
- package/dist/engine/generators/DelegateRelations.js.map +1 -0
- package/dist/engine/generators/DelegateTemplateBody.d.ts +8 -0
- package/dist/engine/generators/DelegateTemplateBody.d.ts.map +1 -0
- package/dist/engine/generators/DelegateTemplateBody.js +776 -0
- package/dist/engine/generators/DelegateTemplateBody.js.map +1 -0
- package/dist/engine/generators/GenerateRuntimeErrors.d.ts +2 -0
- package/dist/engine/generators/GenerateRuntimeErrors.d.ts.map +1 -0
- package/dist/engine/generators/GenerateRuntimeErrors.js +140 -0
- package/dist/engine/generators/GenerateRuntimeErrors.js.map +1 -0
- package/dist/engine/generators/GenerateRuntimeIndex.d.ts +2 -0
- package/dist/engine/generators/GenerateRuntimeIndex.d.ts.map +1 -0
- package/dist/engine/generators/GenerateRuntimeIndex.js +21 -0
- package/dist/engine/generators/GenerateRuntimeIndex.js.map +1 -0
- package/dist/engine/generators/GenerateRuntimeLogger.d.ts +2 -0
- package/dist/engine/generators/GenerateRuntimeLogger.d.ts.map +1 -0
- package/dist/engine/generators/GenerateRuntimeLogger.js +125 -0
- package/dist/engine/generators/GenerateRuntimeLogger.js.map +1 -0
- package/dist/engine/generators/GenerateRuntimePagination.d.ts +2 -0
- package/dist/engine/generators/GenerateRuntimePagination.d.ts.map +1 -0
- package/dist/engine/generators/GenerateRuntimePagination.js +159 -0
- package/dist/engine/generators/GenerateRuntimePagination.js.map +1 -0
- package/dist/engine/generators/GenerateRuntimeQuery.d.ts +2 -0
- package/dist/engine/generators/GenerateRuntimeQuery.d.ts.map +1 -0
- package/dist/engine/generators/GenerateRuntimeQuery.js +427 -0
- package/dist/engine/generators/GenerateRuntimeQuery.js.map +1 -0
- package/dist/engine/generators/GenerateRuntimeRelations.d.ts +2 -0
- package/dist/engine/generators/GenerateRuntimeRelations.d.ts.map +1 -0
- package/dist/engine/generators/GenerateRuntimeRelations.js +130 -0
- package/dist/engine/generators/GenerateRuntimeRelations.js.map +1 -0
- package/dist/engine/generators/RuntimeGenerator.d.ts +16 -0
- package/dist/engine/generators/RuntimeGenerator.d.ts.map +1 -0
- package/dist/engine/generators/RuntimeGenerator.js +16 -0
- package/dist/engine/generators/RuntimeGenerator.js.map +1 -0
- package/dist/engine/generators/SDLInputTypesGenerator.d.ts +6 -0
- package/dist/engine/generators/SDLInputTypesGenerator.d.ts.map +1 -0
- package/dist/engine/generators/SDLInputTypesGenerator.js +763 -0
- package/dist/engine/generators/SDLInputTypesGenerator.js.map +1 -0
- package/dist/engine/generators/TypeFilterTypes.d.ts +2 -0
- package/dist/engine/generators/TypeFilterTypes.d.ts.map +1 -0
- package/dist/engine/generators/TypeFilterTypes.js +220 -0
- package/dist/engine/generators/TypeFilterTypes.js.map +1 -0
- package/dist/engine/generators/TypeGenerator.d.ts +16 -0
- package/dist/engine/generators/TypeGenerator.d.ts.map +1 -0
- package/dist/engine/generators/TypeGenerator.js +493 -0
- package/dist/engine/generators/TypeGenerator.js.map +1 -0
- package/dist/engine/generators/helpers.d.ts +13 -0
- package/dist/engine/generators/helpers.d.ts.map +1 -0
- package/dist/engine/generators/helpers.js +316 -0
- package/dist/engine/generators/helpers.js.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +11 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -1,18 +1,107 @@
|
|
|
1
|
-
# Lenz
|
|
1
|
+
# Lenz
|
|
2
2
|
|
|
3
|
-
GraphQL
|
|
3
|
+
GraphQL SDL → MongoDB ORM — TypeScript-клиент и Apollo Server модули из SDL
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- ✅ **GraphQL SDL Schema**
|
|
8
|
-
- ✅ **TypeScript First**
|
|
9
|
-
- ✅ **MongoDB
|
|
10
|
-
- ✅ **Prisma Style**
|
|
11
|
-
- ✅ **Auto-generated Client**
|
|
12
|
-
- ✅ **
|
|
13
|
-
- ✅ **
|
|
14
|
-
- ✅ **
|
|
15
|
-
- ✅ **
|
|
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
|
|
17
|
+
|
|
18
|
+
## Сравнение с Prisma
|
|
19
|
+
|
|
20
|
+
Lenz вдохновлён Prisma, но имеет важные отличия, связанные с MongoDB. Ниже — подробное сравнение.
|
|
21
|
+
|
|
22
|
+
### Таблица директив
|
|
23
|
+
|
|
24
|
+
| Prisma атрибут | Lenz директива | Статус |
|
|
25
|
+
|---------------|----------------|--------|
|
|
26
|
+
| `@id` | `@id` | ✅ Полная поддержка (ObjectId) |
|
|
27
|
+
| `@unique` | `@unique` | ✅ Полная поддержка |
|
|
28
|
+
| `@index` | `@index` | ✅ Полная поддержка |
|
|
29
|
+
| `@default(value)` | `@default(value: "...")` | ✅ Полная поддержка |
|
|
30
|
+
| `@default(uuid())` | `@default(generator: "uuid")` | ✅ Эквивалент |
|
|
31
|
+
| `@default(now())` | `@default(generator: "now")` | ✅ Эквивалент |
|
|
32
|
+
| `@default(cuid())` | `@default(generator: "cuid")` | ✅ Базовый CUID |
|
|
33
|
+
| `@default(cuid2())` | `@default(generator: "cuid2")` | ✅ CUID2-совместимый |
|
|
34
|
+
| `@default(autoincrement())` | — | ❌ Не применимо к MongoDB |
|
|
35
|
+
| `@default(dbgenerated())` | — | ❌ Не применимо |
|
|
36
|
+
| `@relation(fields, references)` | `@relation(field)` | ⚠️ Упрощённый синтаксис (одно поле) |
|
|
37
|
+
| `@updatedAt` | `@updatedAt` | ✅ Полная поддержка |
|
|
38
|
+
| `@map` | `@map(name)` | ✅ Полная поддержка |
|
|
39
|
+
| `@@map` | `@modelMap(name)` | ✅ Полная поддержка |
|
|
40
|
+
| `@ignore` | `@ignore` | ✅ Полная поддержка |
|
|
41
|
+
| `@hidden` | `@hide` | ✅ Аналог |
|
|
42
|
+
| `@@unique([a, b])` | `@compoundUnique(fields: [...])` | ✅ Полная поддержка |
|
|
43
|
+
| `@@index([a, b])` | `@compoundIndex(fields: [...])` | ✅ Полная поддержка |
|
|
44
|
+
| `@@id([a, b])` | `@compoundId(fields: [...])` | ✅ Полная поддержка |
|
|
45
|
+
| `@@index([...], type: "text")` | `@fulltext(fields: [...])` | ✅ Эквивалент (MongoDB text index) |
|
|
46
|
+
| `@email` | `@email` | ✅ Полная поддержка |
|
|
47
|
+
| `@url` | `@url` | ✅ Полная поддержка |
|
|
48
|
+
| `@@index(map: "...")` | `@compoundIndex(fields: [...], name: "...")` | ✅ name аргумент |
|
|
49
|
+
| `@id(map: "...")` | `@id(map: "...")` | ✅ Полная поддержка |
|
|
50
|
+
| `@unique(map: "...")` | `@unique(map: "...")` | ✅ Полная поддержка |
|
|
51
|
+
| `@@schema` | — | ❌ Не применимо (multi-schema) |
|
|
52
|
+
| `@@view` | — | ❌ Не реализован |
|
|
53
|
+
| `@relation(onDelete: Restrict)` | `@relation(onDelete: "Restrict")` | ✅ Полная поддержка |
|
|
54
|
+
| `@embedded` (Prisma MongoDB) | `@embedded` | ✅ Полная поддержка |
|
|
55
|
+
| — | `@regex(pattern)` | ✅ Только в Lenz |
|
|
56
|
+
| — | `@@fulltext` | ✅ Только в Lenz (MongoDB text index) |
|
|
57
|
+
|
|
58
|
+
### Возможности
|
|
59
|
+
|
|
60
|
+
| Возможность | Prisma | Lenz |
|
|
61
|
+
|------------|--------|------|
|
|
62
|
+
| **Поддерживаемые БД** | PostgreSQL, MySQL, SQLite, MongoDB, SQL Server, CockroachDB | **MongoDB** |
|
|
63
|
+
| **CLI генерация** | `prisma generate` | `lenz generate` |
|
|
64
|
+
| **Schema DSL** | Prisma Schema Language (.prisma) | GraphQL SDL (.graphql) |
|
|
65
|
+
| **Типизация** | Полная (генерация типов) | Полная (генерация типов) |
|
|
66
|
+
| **CRUD** | ✅ | ✅ |
|
|
67
|
+
| **Relations (1:1, 1:m, m:n)** | ✅ | ✅ |
|
|
68
|
+
| **Pagination (offset + cursor)** | ✅ | ✅ |
|
|
69
|
+
| **Transactions** | ✅ | ✅ (требуется replica set) |
|
|
70
|
+
| **Aggregation** | `groupBy`, `aggregate` | Пайплайн MongoDB + `aggregate` |
|
|
71
|
+
| **Raw queries** | `$queryRaw`, `$executeRaw` | `$raw`, `aggregateRaw` |
|
|
72
|
+
| **Client extensions** | `$extends` | `$extends` |
|
|
73
|
+
| **Middleware** | `$use` (удалён в Prisma 6.14) | ❌ (используйте `$extends`) |
|
|
74
|
+
| **Миграции** | Prisma Migrate | ❌ (ленивое создание коллекций) |
|
|
75
|
+
| **Интроспекция** | `prisma db pull` | ❌ |
|
|
76
|
+
| **Seed** | `prisma db seed` | ❌ |
|
|
77
|
+
| **Studio** | Prisma Studio | ❌ |
|
|
78
|
+
| **Драйверы** | Встроенные + driver adapters | MongoDB Native Driver |
|
|
79
|
+
| **Views** | `@@view` (v5+) | ❌ |
|
|
80
|
+
| **Multi-schema** | `@@schema` (PostgreSQL) | ❌ |
|
|
81
|
+
|
|
82
|
+
### Чего нет в Lenz (но есть в Prisma)
|
|
83
|
+
|
|
84
|
+
1. **Другие БД** — Lenz поддерживает только MongoDB. Prisma работает с PostgreSQL, MySQL, SQLite, SQL Server, CockroachDB и MongoDB.
|
|
85
|
+
2. **Миграции** — нет аналога Prisma Migrate. Коллекции и индексы создаются лениво при первом подключении.
|
|
86
|
+
3. **Интроспекция** — нет `prisma db pull` для импорта схемы из существующей БД.
|
|
87
|
+
4. **Типы данных** — `Decimal`, `Unsupported("...")` не реализованы. `Bytes` и `BigInt` ✅ реализованы.
|
|
88
|
+
5. **Views** — нет поддержки представлений (`@@view`).
|
|
89
|
+
6. **Seed** — нет встроенного фреймворка для наполнения тестовыми данными.
|
|
90
|
+
7. **Studio** — нет графического редактора данных (аналога Prisma Studio).
|
|
91
|
+
8. **Составные внешние ключи** — `@relation` поддерживает только одно поле, не `fields: [a, b], references: [c, d]`.
|
|
92
|
+
|
|
93
|
+
### Что есть в Lenz, чего нет в Prisma
|
|
94
|
+
|
|
95
|
+
1. **`@embedded`** — встроенные документы (MongoDB-специфичная возможность).
|
|
96
|
+
2. **`@hide`** — исключение полей из результатов по умолчанию.
|
|
97
|
+
3. **`@regex(pattern)`** — кастомная валидация через регулярные выражения.
|
|
98
|
+
4. **Стратегии загрузки** — автоматический выбор между `populate` (отдельные запросы) и `lookup` (`$lookup` aggregation) в зависимости от типа связи.
|
|
99
|
+
5. **Гео-пространственные фильтры** — `near`, `nearSphere`, `geoWithin`, `geoIntersects`.
|
|
100
|
+
6. **Атомарные операции с массивами** — `push`, `pull`, `addToSet`, `pop`, `pullAll`, `pushAll`.
|
|
101
|
+
7. **`@fulltext`** — декларативное создание MongoDB text index для полнотекстового поиска.
|
|
102
|
+
8. **Автоматическая инициализация массивов** — обязательные поля-массивы автоматически инициализируются пустым массивом.
|
|
103
|
+
9. **Bytes** — тип `Buffer` для бинарных данных (MongoDB BinData).
|
|
104
|
+
10. **BigInt** — тип `bigint` для 64-битных целых чисел (MongoDB Long).
|
|
16
105
|
|
|
17
106
|
## CRUD Operations
|
|
18
107
|
|
|
@@ -496,11 +585,9 @@ export default defineConfig({
|
|
|
496
585
|
generate: {
|
|
497
586
|
client: {
|
|
498
587
|
output: '../generated/lenz/client',
|
|
499
|
-
generator: 'lenz-client-js',
|
|
500
588
|
},
|
|
501
589
|
},
|
|
502
590
|
log: ['query', 'info', 'warn', 'error'] as const,
|
|
503
|
-
autoCreateCollections: true,
|
|
504
591
|
})
|
|
505
592
|
```
|
|
506
593
|
|
|
@@ -521,11 +608,9 @@ export default {
|
|
|
521
608
|
generate: {
|
|
522
609
|
client: {
|
|
523
610
|
output: '../generated/lenz/client',
|
|
524
|
-
generator: 'lenz-client-js',
|
|
525
611
|
},
|
|
526
612
|
},
|
|
527
613
|
log: ['query', 'info', 'warn', 'error'],
|
|
528
|
-
autoCreateCollections: true,
|
|
529
614
|
};
|
|
530
615
|
```
|
|
531
616
|
|
|
@@ -893,14 +978,23 @@ type Author @model {
|
|
|
893
978
|
# Initialize project
|
|
894
979
|
npx lenz init
|
|
895
980
|
|
|
896
|
-
# Generate client
|
|
897
|
-
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
|
|
898
989
|
|
|
899
|
-
# Generate with custom
|
|
900
|
-
npx lenz generate --
|
|
990
|
+
# Generate CRUD modules with custom paths
|
|
991
|
+
npx lenz generate crud --schema lenz/schema.graphql --output ./src
|
|
901
992
|
|
|
902
993
|
# Show help
|
|
903
994
|
npx lenz --help
|
|
995
|
+
|
|
996
|
+
# Show generate subcommands
|
|
997
|
+
npx lenz generate
|
|
904
998
|
```
|
|
905
999
|
|
|
906
1000
|
## Structure After Generation
|
|
@@ -917,11 +1011,93 @@ my-app/
|
|
|
917
1011
|
│ ├── client.ts # LenzClient class
|
|
918
1012
|
│ ├── types.ts # TypeScript types
|
|
919
1013
|
│ ├── enums.ts # Enum definitions
|
|
1014
|
+
│ ├── inputTypes.ts # GraphQL input types (filters, CreateInput, UpdateInput)
|
|
920
1015
|
│ ├── runtime/ # Runtime utilities
|
|
921
1016
|
│ └── models/ # Model delegates
|
|
922
1017
|
└── .env # Environment variables
|
|
923
1018
|
```
|
|
924
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
|
+
|
|
925
1101
|
## Development
|
|
926
1102
|
|
|
927
1103
|
### Build
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,eAAe,SAkHxB,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { LenzEngine } from '../../engine/LenzEngine.js';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
3
|
+
import { existsSync, promises as fs } from 'fs';
|
|
4
4
|
import { resolve, dirname } from 'path';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
+
import * as ts from 'typescript';
|
|
7
|
+
import { ConfigurationError } from '../../errors/index.js';
|
|
6
8
|
export const generateCommand = new Command('generate')
|
|
7
9
|
.description('Generate Lenz client from GraphQL schema')
|
|
8
10
|
.option('-c, --config <path>', 'Path to lenz config file', 'lenz/lenz.config.ts')
|
|
@@ -27,9 +29,32 @@ export const generateCommand = new Command('generate')
|
|
|
27
29
|
// Загружаем конфигурацию
|
|
28
30
|
if (existsSync(configPath)) {
|
|
29
31
|
if (configPath.endsWith('.ts')) {
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
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
|
+
}
|
|
33
58
|
}
|
|
34
59
|
else if (configPath.endsWith('.js') || configPath.endsWith('.mjs')) {
|
|
35
60
|
// Для JavaScript конфига (только ESM)
|
|
@@ -43,9 +68,7 @@ export const generateCommand = new Command('generate')
|
|
|
43
68
|
// Определяем пути
|
|
44
69
|
const schemaPath = resolve(dirname(configPath), options.schema || config.schema || 'schema.graphql');
|
|
45
70
|
if (!existsSync(schemaPath)) {
|
|
46
|
-
|
|
47
|
-
console.log(chalk.yellow('💡 Try running: lenz init'));
|
|
48
|
-
process.exit(1);
|
|
71
|
+
throw new ConfigurationError(`Schema file not found: ${schemaPath}. Try running: lenz init`, { schemaPath });
|
|
49
72
|
}
|
|
50
73
|
const outputPath = resolve(dirname(configPath), options.output || config.generate?.client?.output || '../generated/lenz/client');
|
|
51
74
|
// Создаем движок и генерируем
|
|
@@ -75,7 +98,10 @@ export const generateCommand = new Command('generate')
|
|
|
75
98
|
catch (error) {
|
|
76
99
|
console.log(chalk.red('❌ Generation failed:'));
|
|
77
100
|
console.log(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
78
|
-
|
|
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;
|
|
79
105
|
}
|
|
80
106
|
});
|
|
81
107
|
//# sourceMappingURL=generate.js.map
|