@bairock/lenz 0.0.14 → 0.0.16
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 +119 -8
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +66 -79
- 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 +22 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/studio.js +15 -21
- package/dist/cli/commands/studio.js.map +1 -1
- package/dist/cli/index.js +11 -18
- 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 +31 -15
- 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 +26 -1935
- 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 -8
- package/dist/engine/GraphQLParser.d.ts.map +1 -1
- package/dist/engine/GraphQLParser.js +165 -248
- 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 +4 -4
- package/dist/engine/LenzEngine.d.ts.map +1 -1
- package/dist/engine/LenzEngine.js +59 -46
- 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 +12 -11
- package/dist/engine/SchemaValidator.d.ts.map +1 -1
- package/dist/engine/SchemaValidator.js +163 -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 +192 -47
- 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/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/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/engine/index.d.ts +3 -3
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +3 -9
- package/dist/engine/index.js.map +1 -1
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +25 -32
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -30
- package/dist/index.js.map +1 -1
- package/package.json +6 -7
package/README.md
CHANGED
|
@@ -14,6 +14,94 @@ GraphQL-based ORM for MongoDB (Prisma style)
|
|
|
14
14
|
- ✅ **Automatic Indexing** - Intelligent index creation for foreign key fields
|
|
15
15
|
- ✅ **Transactions** - ACID transactions with MongoDB
|
|
16
16
|
|
|
17
|
+
## Сравнение с Prisma
|
|
18
|
+
|
|
19
|
+
Lenz вдохновлён Prisma, но имеет важные отличия, связанные с MongoDB. Ниже — подробное сравнение.
|
|
20
|
+
|
|
21
|
+
### Таблица директив
|
|
22
|
+
|
|
23
|
+
| Prisma атрибут | Lenz директива | Статус |
|
|
24
|
+
|---------------|----------------|--------|
|
|
25
|
+
| `@id` | `@id` | ✅ Полная поддержка (ObjectId) |
|
|
26
|
+
| `@unique` | `@unique` | ✅ Полная поддержка |
|
|
27
|
+
| `@index` | `@index` | ✅ Полная поддержка |
|
|
28
|
+
| `@default(value)` | `@default(value: "...")` | ✅ Полная поддержка |
|
|
29
|
+
| `@default(uuid())` | `@default(generator: "uuid")` | ✅ Эквивалент |
|
|
30
|
+
| `@default(now())` | `@default(generator: "now")` | ✅ Эквивалент |
|
|
31
|
+
| `@default(cuid())` | `@default(generator: "cuid")` | ✅ Базовый CUID |
|
|
32
|
+
| `@default(cuid2())` | `@default(generator: "cuid2")` | ✅ CUID2-совместимый |
|
|
33
|
+
| `@default(autoincrement())` | — | ❌ Не применимо к MongoDB |
|
|
34
|
+
| `@default(dbgenerated())` | — | ❌ Не применимо |
|
|
35
|
+
| `@relation(fields, references)` | `@relation(field)` | ⚠️ Упрощённый синтаксис (одно поле) |
|
|
36
|
+
| `@updatedAt` | `@updatedAt` | ✅ Полная поддержка |
|
|
37
|
+
| `@map` | `@map(name)` | ✅ Полная поддержка |
|
|
38
|
+
| `@@map` | `@modelMap(name)` | ✅ Полная поддержка |
|
|
39
|
+
| `@ignore` | `@ignore` | ✅ Полная поддержка |
|
|
40
|
+
| `@hidden` | `@hide` | ✅ Аналог |
|
|
41
|
+
| `@@unique([a, b])` | `@compoundUnique(fields: [...])` | ✅ Полная поддержка |
|
|
42
|
+
| `@@index([a, b])` | `@compoundIndex(fields: [...])` | ✅ Полная поддержка |
|
|
43
|
+
| `@@id([a, b])` | `@compoundId(fields: [...])` | ✅ Полная поддержка |
|
|
44
|
+
| `@@index([...], type: "text")` | `@fulltext(fields: [...])` | ✅ Эквивалент (MongoDB text index) |
|
|
45
|
+
| `@email` | `@email` | ✅ Полная поддержка |
|
|
46
|
+
| `@url` | `@url` | ✅ Полная поддержка |
|
|
47
|
+
| `@@index(map: "...")` | `@compoundIndex(fields: [...], name: "...")` | ✅ name аргумент |
|
|
48
|
+
| `@id(map: "...")` | `@id(map: "...")` | ✅ Полная поддержка |
|
|
49
|
+
| `@unique(map: "...")` | `@unique(map: "...")` | ✅ Полная поддержка |
|
|
50
|
+
| `@@schema` | — | ❌ Не применимо (multi-schema) |
|
|
51
|
+
| `@@view` | — | ❌ Не реализован |
|
|
52
|
+
| `@relation(onDelete: Restrict)` | `@relation(onDelete: "Restrict")` | ✅ Полная поддержка |
|
|
53
|
+
| `@embedded` (Prisma MongoDB) | `@embedded` | ✅ Полная поддержка |
|
|
54
|
+
| — | `@regex(pattern)` | ✅ Только в Lenz |
|
|
55
|
+
| — | `@@fulltext` | ✅ Только в Lenz (MongoDB text index) |
|
|
56
|
+
|
|
57
|
+
### Возможности
|
|
58
|
+
|
|
59
|
+
| Возможность | Prisma | Lenz |
|
|
60
|
+
|------------|--------|------|
|
|
61
|
+
| **Поддерживаемые БД** | PostgreSQL, MySQL, SQLite, MongoDB, SQL Server, CockroachDB | **MongoDB** |
|
|
62
|
+
| **CLI генерация** | `prisma generate` | `lenz generate` |
|
|
63
|
+
| **Schema DSL** | Prisma Schema Language (.prisma) | GraphQL SDL (.graphql) |
|
|
64
|
+
| **Типизация** | Полная (генерация типов) | Полная (генерация типов) |
|
|
65
|
+
| **CRUD** | ✅ | ✅ |
|
|
66
|
+
| **Relations (1:1, 1:m, m:n)** | ✅ | ✅ |
|
|
67
|
+
| **Pagination (offset + cursor)** | ✅ | ✅ |
|
|
68
|
+
| **Transactions** | ✅ | ✅ (требуется replica set) |
|
|
69
|
+
| **Aggregation** | `groupBy`, `aggregate` | Пайплайн MongoDB + `aggregate` |
|
|
70
|
+
| **Raw queries** | `$queryRaw`, `$executeRaw` | `$raw`, `aggregateRaw` |
|
|
71
|
+
| **Client extensions** | `$extends` | `$extends` |
|
|
72
|
+
| **Middleware** | `$use` (удалён в Prisma 6.14) | ❌ (используйте `$extends`) |
|
|
73
|
+
| **Миграции** | Prisma Migrate | ❌ (ленивое создание коллекций) |
|
|
74
|
+
| **Интроспекция** | `prisma db pull` | ❌ |
|
|
75
|
+
| **Seed** | `prisma db seed` | ❌ |
|
|
76
|
+
| **Studio** | Prisma Studio | ❌ |
|
|
77
|
+
| **Драйверы** | Встроенные + driver adapters | MongoDB Native Driver |
|
|
78
|
+
| **Views** | `@@view` (v5+) | ❌ |
|
|
79
|
+
| **Multi-schema** | `@@schema` (PostgreSQL) | ❌ |
|
|
80
|
+
|
|
81
|
+
### Чего нет в Lenz (но есть в Prisma)
|
|
82
|
+
|
|
83
|
+
1. **Другие БД** — Lenz поддерживает только MongoDB. Prisma работает с PostgreSQL, MySQL, SQLite, SQL Server, CockroachDB и MongoDB.
|
|
84
|
+
2. **Миграции** — нет аналога Prisma Migrate. Коллекции и индексы создаются лениво при первом подключении.
|
|
85
|
+
3. **Интроспекция** — нет `prisma db pull` для импорта схемы из существующей БД.
|
|
86
|
+
4. **Типы данных** — `Decimal`, `Unsupported("...")` не реализованы. `Bytes` и `BigInt` ✅ реализованы.
|
|
87
|
+
5. **Views** — нет поддержки представлений (`@@view`).
|
|
88
|
+
6. **Seed** — нет встроенного фреймворка для наполнения тестовыми данными.
|
|
89
|
+
7. **Studio** — нет графического редактора данных (аналога Prisma Studio).
|
|
90
|
+
8. **Составные внешние ключи** — `@relation` поддерживает только одно поле, не `fields: [a, b], references: [c, d]`.
|
|
91
|
+
|
|
92
|
+
### Что есть в Lenz, чего нет в Prisma
|
|
93
|
+
|
|
94
|
+
1. **`@embedded`** — встроенные документы (MongoDB-специфичная возможность).
|
|
95
|
+
2. **`@hide`** — исключение полей из результатов по умолчанию.
|
|
96
|
+
3. **`@regex(pattern)`** — кастомная валидация через регулярные выражения.
|
|
97
|
+
4. **Стратегии загрузки** — автоматический выбор между `populate` (отдельные запросы) и `lookup` (`$lookup` aggregation) в зависимости от типа связи.
|
|
98
|
+
5. **Гео-пространственные фильтры** — `near`, `nearSphere`, `geoWithin`, `geoIntersects`.
|
|
99
|
+
6. **Атомарные операции с массивами** — `push`, `pull`, `addToSet`, `pop`, `pullAll`, `pushAll`.
|
|
100
|
+
7. **`@fulltext`** — декларативное создание MongoDB text index для полнотекстового поиска.
|
|
101
|
+
8. **Автоматическая инициализация массивов** — обязательные поля-массивы автоматически инициализируются пустым массивом.
|
|
102
|
+
9. **Bytes** — тип `Buffer` для бинарных данных (MongoDB BinData).
|
|
103
|
+
10. **BigInt** — тип `bigint` для 64-битных целых чисел (MongoDB Long).
|
|
104
|
+
|
|
17
105
|
## CRUD Operations
|
|
18
106
|
|
|
19
107
|
Lenz provides a comprehensive set of CRUD operations similar to Prisma, with full TypeScript support and MongoDB-native performance.
|
|
@@ -489,9 +577,6 @@ import { defineConfig } from 'lenz/config'
|
|
|
489
577
|
|
|
490
578
|
export default defineConfig({
|
|
491
579
|
schema: 'schema.graphql',
|
|
492
|
-
migrations: {
|
|
493
|
-
path: 'migrations',
|
|
494
|
-
},
|
|
495
580
|
datasource: {
|
|
496
581
|
url: process.env.MONGODB_URI,
|
|
497
582
|
database: process.env.MONGODB_DATABASE || 'myapp',
|
|
@@ -499,11 +584,9 @@ export default defineConfig({
|
|
|
499
584
|
generate: {
|
|
500
585
|
client: {
|
|
501
586
|
output: '../generated/lenz/client',
|
|
502
|
-
generator: 'lenz-client-js',
|
|
503
587
|
},
|
|
504
588
|
},
|
|
505
589
|
log: ['query', 'info', 'warn', 'error'] as const,
|
|
506
|
-
autoCreateCollections: true,
|
|
507
590
|
})
|
|
508
591
|
```
|
|
509
592
|
|
|
@@ -524,11 +607,9 @@ export default {
|
|
|
524
607
|
generate: {
|
|
525
608
|
client: {
|
|
526
609
|
output: '../generated/lenz/client',
|
|
527
|
-
generator: 'lenz-client-js',
|
|
528
610
|
},
|
|
529
611
|
},
|
|
530
612
|
log: ['query', 'info', 'warn', 'error'],
|
|
531
|
-
autoCreateCollections: true,
|
|
532
613
|
};
|
|
533
614
|
```
|
|
534
615
|
|
|
@@ -543,7 +624,7 @@ Lenz extends GraphQL with custom directives:
|
|
|
543
624
|
- `@unique` - Creates a unique index
|
|
544
625
|
- `@index` - Creates a regular index
|
|
545
626
|
- `@default(value: "...")` - Sets default value
|
|
546
|
-
- `@relation(field: "...", strategy: "populate|lookup", index: true|false)` - Defines relation with loading strategy and
|
|
627
|
+
- `@relation(field: "...", strategy: "populate|lookup", index: true|false, onDelete: "NoAction|Cascade|SetNull")` - Defines relation with loading strategy, index control, and cascade delete behavior (default: `NoAction`)
|
|
547
628
|
- `@createdAt` - Auto-sets creation timestamp
|
|
548
629
|
- `@updatedAt` - Auto-updates timestamp
|
|
549
630
|
- `@embedded` - Marks a type as embedded document
|
|
@@ -762,6 +843,36 @@ type Category @model {
|
|
|
762
843
|
}
|
|
763
844
|
```
|
|
764
845
|
|
|
846
|
+
### Cascade Delete Behavior (`onDelete`)
|
|
847
|
+
|
|
848
|
+
Lenz supports cascade delete operations on relations. By default, **no cascade is performed** (`onDelete: "NoAction"`) for performance and safety. You must explicitly opt in.
|
|
849
|
+
|
|
850
|
+
| Value | Behavior |
|
|
851
|
+
|-------|----------|
|
|
852
|
+
| `NoAction` (default) | No cascade. Deleted document's related references become orphaned. |
|
|
853
|
+
| `Cascade` | When a document is deleted, all related documents are also deleted. |
|
|
854
|
+
| `SetNull` | When a document is deleted, foreign key fields in related documents are set to `null` (only for nullable FK fields). |
|
|
855
|
+
|
|
856
|
+
**Important:** Cascade operations negatively impact write performance because each delete triggers additional queries. Use only when necessary.
|
|
857
|
+
|
|
858
|
+
Examples:
|
|
859
|
+
|
|
860
|
+
```graphql
|
|
861
|
+
type Author @model {
|
|
862
|
+
id: ID! @id
|
|
863
|
+
posts: [Post!]! @relation(field: "postIds", onDelete: "Cascade") # Deletes all posts when author is deleted
|
|
864
|
+
postIds: [ID!]!
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
type Profile @model {
|
|
868
|
+
id: ID! @id
|
|
869
|
+
user: User @relation(field: "userId", onDelete: "SetNull") # Sets userId to null when user is deleted
|
|
870
|
+
userId: ID
|
|
871
|
+
}
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
**Note:** `onDelete: "SetNull"` is only supported on nullable foreign key fields (optional `ID` fields, not `ID!`). Using it on required fields will cause a validation error.
|
|
875
|
+
|
|
765
876
|
### Automatic Indexing
|
|
766
877
|
|
|
767
878
|
Lenz automatically creates indexes for foreign key fields when `index: true` (default). You can disable this:
|
|
@@ -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,94 +1,78 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.generateCommand = void 0;
|
|
40
|
-
const commander_1 = require("commander");
|
|
41
|
-
const LenzEngine_1 = require("../../engine/LenzEngine");
|
|
42
|
-
const fs_1 = require("fs");
|
|
43
|
-
const path_1 = require("path");
|
|
44
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
-
exports.generateCommand = new commander_1.Command('generate')
|
|
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 generateCommand = new Command('generate')
|
|
46
9
|
.description('Generate Lenz client from GraphQL schema')
|
|
47
10
|
.option('-c, --config <path>', 'Path to lenz config file', 'lenz/lenz.config.ts')
|
|
48
11
|
.option('-s, --schema <path>', 'Path to GraphQL schema file')
|
|
49
12
|
.option('-o, --output <path>', 'Output directory for generated client')
|
|
50
13
|
.option('-n, --name <name>', 'Name of the generated client', 'LenzClient')
|
|
51
14
|
.action(async (options) => {
|
|
52
|
-
console.log(
|
|
15
|
+
console.log(chalk.blue('🚀 Generating Lenz client...'));
|
|
53
16
|
try {
|
|
54
17
|
let config = {};
|
|
55
18
|
// Автоматически определяем конфиг по типу проекта, если используется значение по умолчанию
|
|
56
19
|
let configFile = options.config;
|
|
57
20
|
if (configFile === 'lenz/lenz.config.ts') {
|
|
58
|
-
const tsConfigPath =
|
|
59
|
-
const jsConfigPath =
|
|
60
|
-
if (!
|
|
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)) {
|
|
61
24
|
configFile = 'lenz/lenz.config.js';
|
|
62
|
-
console.log(
|
|
25
|
+
console.log(chalk.gray(`📦 Using JavaScript config: ${configFile}`));
|
|
63
26
|
}
|
|
64
27
|
}
|
|
65
|
-
const configPath =
|
|
28
|
+
const configPath = resolve(process.cwd(), configFile);
|
|
66
29
|
// Загружаем конфигурацию
|
|
67
|
-
if (
|
|
30
|
+
if (existsSync(configPath)) {
|
|
68
31
|
if (configPath.endsWith('.ts')) {
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
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
|
+
}
|
|
72
58
|
}
|
|
73
59
|
else if (configPath.endsWith('.js') || configPath.endsWith('.mjs')) {
|
|
74
60
|
// Для JavaScript конфига (только ESM)
|
|
75
|
-
const configModule = await
|
|
61
|
+
const configModule = await import(configPath);
|
|
76
62
|
config = configModule.default || configModule;
|
|
77
63
|
}
|
|
78
64
|
}
|
|
79
65
|
else {
|
|
80
|
-
console.log(
|
|
66
|
+
console.log(chalk.yellow('⚠️ Config file not found, using defaults'));
|
|
81
67
|
}
|
|
82
68
|
// Определяем пути
|
|
83
|
-
const schemaPath =
|
|
84
|
-
if (!
|
|
85
|
-
|
|
86
|
-
console.log(chalk_1.default.yellow('💡 Try running: lenz init'));
|
|
87
|
-
process.exit(1);
|
|
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 });
|
|
88
72
|
}
|
|
89
|
-
const outputPath =
|
|
73
|
+
const outputPath = resolve(dirname(configPath), options.output || config.generate?.client?.output || '../generated/lenz/client');
|
|
90
74
|
// Создаем движок и генерируем
|
|
91
|
-
const engine = new
|
|
75
|
+
const engine = new LenzEngine({
|
|
92
76
|
schemaPath,
|
|
93
77
|
outputPath,
|
|
94
78
|
clientName: options.name
|
|
@@ -97,24 +81,27 @@ exports.generateCommand = new commander_1.Command('generate')
|
|
|
97
81
|
// Отображаем информацию
|
|
98
82
|
const schemaInfo = engine.getSchemaInfo();
|
|
99
83
|
if (schemaInfo) {
|
|
100
|
-
console.log(
|
|
101
|
-
console.log(
|
|
102
|
-
console.log(
|
|
103
|
-
console.log(
|
|
104
|
-
console.log(
|
|
105
|
-
console.log(
|
|
106
|
-
console.log(
|
|
107
|
-
console.log(
|
|
108
|
-
console.log(
|
|
109
|
-
console.log(
|
|
110
|
-
console.log(
|
|
111
|
-
console.log(
|
|
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`));
|
|
112
96
|
}
|
|
113
97
|
}
|
|
114
98
|
catch (error) {
|
|
115
|
-
console.log(
|
|
116
|
-
console.log(
|
|
117
|
-
|
|
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;
|
|
118
105
|
}
|
|
119
106
|
});
|
|
120
107
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiFpC,eAAO,MAAM,WAAW,SA4EpB,CAAC"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.initCommand = void 0;
|
|
7
|
-
const commander_1 = require("commander");
|
|
8
|
-
const fs_1 = require("fs");
|
|
9
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
11
5
|
const DEFAULT_SCHEMA = `# Welcome to Lenz!
|
|
12
6
|
# This is your GraphQL schema file.
|
|
13
7
|
# Define your models here using GraphQL SDL syntax.
|
|
@@ -55,7 +49,6 @@ export default defineConfig({
|
|
|
55
49
|
},
|
|
56
50
|
},
|
|
57
51
|
log: ['query', 'info', 'warn', 'error'] as const,
|
|
58
|
-
autoCreateCollections: true,
|
|
59
52
|
})`;
|
|
60
53
|
const DEFAULT_CONFIG_JS = `import 'dotenv/config'
|
|
61
54
|
import { defineConfig } from '@bairock/lenz'
|
|
@@ -71,7 +64,6 @@ export default defineConfig({
|
|
|
71
64
|
},
|
|
72
65
|
},
|
|
73
66
|
log: ['query', 'info', 'warn', 'error'],
|
|
74
|
-
autoCreateCollections: true,
|
|
75
67
|
});`;
|
|
76
68
|
const EXAMPLE_ENV = `# MongoDB connection string (include database name in URL)
|
|
77
69
|
MONGODB_URI=mongodb://localhost:27017/myapp
|
|
@@ -81,12 +73,12 @@ LOG_LEVEL=info
|
|
|
81
73
|
|
|
82
74
|
# Enable query logging
|
|
83
75
|
LOG_QUERIES=true`;
|
|
84
|
-
|
|
76
|
+
export const initCommand = new Command('init')
|
|
85
77
|
.description('Initialize a new Lenz project')
|
|
86
78
|
.option('--skip-prompts', 'Skip interactive prompts')
|
|
87
79
|
.action(async (options) => {
|
|
88
|
-
console.log(
|
|
89
|
-
const answers = options.skipPrompts ? {} : await
|
|
80
|
+
console.log(chalk.blue('🚀 Initializing Lenz project...\n'));
|
|
81
|
+
const answers = options.skipPrompts ? {} : await inquirer.prompt([
|
|
90
82
|
{
|
|
91
83
|
type: 'input',
|
|
92
84
|
name: 'url',
|
|
@@ -103,16 +95,16 @@ exports.initCommand = new commander_1.Command('init')
|
|
|
103
95
|
// Создаем директории
|
|
104
96
|
const dirs = ['lenz', 'generated'];
|
|
105
97
|
for (const dir of dirs) {
|
|
106
|
-
if (!
|
|
107
|
-
|
|
108
|
-
console.log(
|
|
98
|
+
if (!existsSync(dir)) {
|
|
99
|
+
mkdirSync(dir, { recursive: true });
|
|
100
|
+
console.log(chalk.green(`📁 Created directory: ./${dir}`));
|
|
109
101
|
}
|
|
110
102
|
}
|
|
111
103
|
// Определяем тип проекта (TypeScript или JavaScript)
|
|
112
|
-
const isTypeScriptProject =
|
|
104
|
+
const isTypeScriptProject = existsSync('tsconfig.json');
|
|
113
105
|
const configExtension = isTypeScriptProject ? 'ts' : 'js';
|
|
114
106
|
const configTemplate = isTypeScriptProject ? DEFAULT_CONFIG_TS : DEFAULT_CONFIG_JS;
|
|
115
|
-
console.log(
|
|
107
|
+
console.log(chalk.gray(`📦 Detected ${isTypeScriptProject ? 'TypeScript' : 'JavaScript (ESM)'} project`));
|
|
116
108
|
// Создаем файлы
|
|
117
109
|
const files = [
|
|
118
110
|
{
|
|
@@ -137,19 +129,19 @@ generated/
|
|
|
137
129
|
}
|
|
138
130
|
];
|
|
139
131
|
for (const file of files) {
|
|
140
|
-
if (!
|
|
141
|
-
|
|
142
|
-
console.log(
|
|
132
|
+
if (!existsSync(file.path)) {
|
|
133
|
+
writeFileSync(file.path, file.content, 'utf-8');
|
|
134
|
+
console.log(chalk.green(`📄 Created file: ${file.path}`));
|
|
143
135
|
}
|
|
144
136
|
else {
|
|
145
|
-
console.log(
|
|
137
|
+
console.log(chalk.yellow(`⚠️ File already exists: ${file.path}`));
|
|
146
138
|
}
|
|
147
139
|
}
|
|
148
|
-
console.log(
|
|
149
|
-
console.log(
|
|
150
|
-
console.log(
|
|
151
|
-
console.log(
|
|
152
|
-
console.log(
|
|
153
|
-
console.log(
|
|
140
|
+
console.log(chalk.green('\n✅ Lenz project initialized!'));
|
|
141
|
+
console.log(chalk.gray('\nNext steps:'));
|
|
142
|
+
console.log(chalk.white(' 1. Edit your schema: ') + chalk.cyan('lenz/schema.graphql'));
|
|
143
|
+
console.log(chalk.white(' 2. Configure database: ') + chalk.cyan(`lenz/lenz.config.${configExtension}`));
|
|
144
|
+
console.log(chalk.white(' 3. Generate client: ') + chalk.cyan('npx lenz generate'));
|
|
145
|
+
console.log(chalk.white(' 4. Start coding! 🚀\n'));
|
|
154
146
|
});
|
|
155
147
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAgCe,CAAC;AAEvC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;GAcvB,CAAC;AAEJ,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;IActB,CAAC;AAGL,MAAM,WAAW,GAAG;;;;;;;iBAOH,CAAC;AAElB,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC/D;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,sCAAsC;YAC/C,OAAO,EAAE,iCAAiC;SAC3C;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,mBAAmB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,MAAM,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAEnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,UAAU,CAAC,CAAC,CAAC;IAE1G,gBAAgB;IAChB,MAAM,KAAK,GAAG;QACZ;YACE,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,4BAA4B;SAC/E;QACD;YACE,IAAI,EAAE,oBAAoB,eAAe,EAAE;YAC3C,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,iCAAiC,EAAE,OAAO,CAAC,GAAG,IAAI,iCAAiC,CAAC;SACrH;QACD;YACE,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,WAAW;SACrB;QACD;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE;;;;MAIX;SACC;KACF,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,eAAe,EAAE,CAAC,CAAC,CAAC;IAC1G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
|
|
@@ -1,32 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
exports.studioCommand = void 0;
|
|
7
|
-
const commander_1 = require("commander");
|
|
8
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
-
const boxen_1 = __importDefault(require("boxen"));
|
|
10
|
-
const fs_1 = require("fs");
|
|
11
|
-
exports.studioCommand = new commander_1.Command('studio')
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import boxen from 'boxen';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
export const studioCommand = new Command('studio')
|
|
12
6
|
.description('Open Lenz Studio - visual database management')
|
|
13
7
|
.option('-p, --port <port>', 'Port for Lenz Studio', '5555')
|
|
14
8
|
.option('--host <host>', 'Host for Lenz Studio', 'localhost')
|
|
15
9
|
.action(async (options) => {
|
|
16
|
-
console.log(
|
|
10
|
+
console.log(chalk.blue(boxen('🚀 Lenz Studio', { padding: 1, borderStyle: 'round' })));
|
|
17
11
|
// Проверяем наличие схемы
|
|
18
12
|
const schemaPath = 'lenz/schema.graphql';
|
|
19
|
-
if (!
|
|
20
|
-
console.log(
|
|
21
|
-
console.log(
|
|
13
|
+
if (!existsSync(schemaPath)) {
|
|
14
|
+
console.log(chalk.red('❌ Schema file not found'));
|
|
15
|
+
console.log(chalk.yellow('💡 Run: lenz init'));
|
|
22
16
|
process.exit(1);
|
|
23
17
|
}
|
|
24
|
-
console.log(
|
|
25
|
-
console.log(
|
|
18
|
+
console.log(chalk.green('📡 Starting Lenz Studio...'));
|
|
19
|
+
console.log(chalk.gray(`🌐 Available at: http://${options.host}:${options.port}`));
|
|
26
20
|
// В реальности здесь будет запуск веб-сервера с интерфейсом
|
|
27
|
-
console.log(
|
|
28
|
-
console.log(
|
|
29
|
-
console.log(
|
|
30
|
-
console.log(
|
|
21
|
+
console.log(chalk.yellow('⚠️ Studio is under development'));
|
|
22
|
+
console.log(chalk.gray('\nIn the meantime, you can use:'));
|
|
23
|
+
console.log(chalk.white(' • MongoDB Compass'));
|
|
24
|
+
console.log(chalk.white(' • Generated TypeScript client\n'));
|
|
31
25
|
});
|
|
32
26
|
//# sourceMappingURL=studio.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"studio.js","sourceRoot":"","sources":["../../../src/cli/commands/studio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"studio.js","sourceRoot":"","sources":["../../../src/cli/commands/studio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,CAAC;KAC3D,MAAM,CAAC,eAAe,EAAE,sBAAsB,EAAE,WAAW,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvF,0BAA0B;IAC1B,MAAM,UAAU,GAAG,qBAAqB,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnF,4DAA4D;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,29 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const generate_1 = require("./commands/generate");
|
|
9
|
-
const init_1 = require("./commands/init");
|
|
10
|
-
const studio_1 = require("./commands/studio");
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
const figlet_1 = __importDefault(require("figlet"));
|
|
13
|
-
const program = new commander_1.Command();
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { generateCommand } from './commands/generate.js';
|
|
4
|
+
import { initCommand } from './commands/init.js';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import figlet from 'figlet';
|
|
7
|
+
const program = new Command();
|
|
14
8
|
program
|
|
15
9
|
.name('lenz')
|
|
16
10
|
.description('Lenz CLI - GraphQL-based ORM for MongoDB')
|
|
17
11
|
.version('1.0.0')
|
|
18
12
|
.configureOutput({
|
|
19
|
-
outputError: (str, write) => write(
|
|
13
|
+
outputError: (str, write) => write(chalk.red(str))
|
|
20
14
|
});
|
|
21
|
-
program.addCommand(
|
|
22
|
-
program.addCommand(
|
|
23
|
-
program.addCommand(studio_1.studioCommand);
|
|
15
|
+
program.addCommand(initCommand);
|
|
16
|
+
program.addCommand(generateCommand);
|
|
24
17
|
if (process.argv.length === 2) {
|
|
25
|
-
console.log(
|
|
26
|
-
console.log(
|
|
18
|
+
console.log(chalk.cyan(figlet.textSync('Lenz', { horizontalLayout: 'full' })));
|
|
19
|
+
console.log(chalk.gray('GraphQL-based ORM for MongoDB\n'));
|
|
27
20
|
program.outputHelp();
|
|
28
21
|
}
|
|
29
22
|
else {
|