@kollors/deep-json-server 1.0.0-alpha.9 → 1.0.0-beta.1
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 +159 -127
- package/README.ru.md +159 -127
- package/dist/src/cli/index.js +14 -23
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/constants.d.ts +1 -1
- package/dist/src/core/constants.js +1 -1
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/engine.d.ts +3 -15
- package/dist/src/core/engine.js +10 -69
- package/dist/src/core/engine.js.map +1 -1
- package/dist/src/core/lifecycle/mutation.js +4 -4
- package/dist/src/core/lifecycle/mutation.js.map +1 -1
- package/dist/src/core/lifecycle/options.d.ts +15 -0
- package/dist/src/core/lifecycle/options.js +13 -0
- package/dist/src/core/lifecycle/options.js.map +1 -1
- package/dist/src/core/model.d.ts +1 -0
- package/dist/src/core/model.js +11 -0
- package/dist/src/core/model.js.map +1 -1
- package/dist/src/core/mutations/write.js +4 -0
- package/dist/src/core/mutations/write.js.map +1 -1
- package/dist/src/core/paths.js +1 -7
- package/dist/src/core/paths.js.map +1 -1
- package/dist/src/core/query/execute.d.ts +25 -0
- package/dist/src/core/query/execute.js +82 -0
- package/dist/src/core/query/execute.js.map +1 -0
- package/dist/src/core/query/filter.js +1 -1
- package/dist/src/core/query/filter.js.map +1 -1
- package/dist/src/core/query/options.js +2 -2
- package/dist/src/core/query/options.js.map +1 -1
- package/dist/src/core/records.d.ts +2 -1
- package/dist/src/core/records.js +5 -2
- package/dist/src/core/records.js.map +1 -1
- package/dist/src/files/disk-metadata.d.ts +9 -0
- package/dist/src/files/disk-metadata.js +44 -0
- package/dist/src/files/disk-metadata.js.map +1 -0
- package/dist/src/files/disk-paths.d.ts +15 -0
- package/dist/src/files/disk-paths.js +100 -0
- package/dist/src/files/disk-paths.js.map +1 -0
- package/dist/src/files/disk-store.js +21 -165
- package/dist/src/files/disk-store.js.map +1 -1
- package/dist/src/files/index.js +1 -1
- package/dist/src/files/index.js.map +1 -1
- package/dist/src/graphql/preflight.js +2 -0
- package/dist/src/graphql/preflight.js.map +1 -1
- package/dist/src/graphql/resolvers.js +7 -3
- package/dist/src/graphql/resolvers.js.map +1 -1
- package/dist/src/graphql/routes.js +4 -1
- package/dist/src/graphql/routes.js.map +1 -1
- package/dist/src/graphql/schema.js +5 -2
- package/dist/src/graphql/schema.js.map +1 -1
- package/dist/src/openapi/document.js +30 -19
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/registry.d.ts +11 -0
- package/dist/src/openapi/registry.js +20 -0
- package/dist/src/openapi/registry.js.map +1 -0
- package/dist/src/rest/options.d.ts +11 -3
- package/dist/src/rest/options.js +15 -0
- package/dist/src/rest/options.js.map +1 -1
- package/dist/src/rest/projection.d.ts +15 -3
- package/dist/src/rest/projection.js +49 -15
- package/dist/src/rest/projection.js.map +1 -1
- package/dist/src/rest/routes.js +18 -7
- package/dist/src/rest/routes.js.map +1 -1
- package/dist/src/server/bootstrap.d.ts +7 -0
- package/dist/src/server/bootstrap.js +48 -0
- package/dist/src/server/bootstrap.js.map +1 -0
- package/dist/src/server/config.d.ts +2 -2
- package/dist/src/server/config.js +5 -5
- package/dist/src/server/config.js.map +1 -1
- package/dist/src/server/create.d.ts +1 -1
- package/dist/src/server/create.js +11 -85
- package/dist/src/server/create.js.map +1 -1
- package/dist/src/server/http.d.ts +12 -0
- package/dist/src/server/http.js +40 -0
- package/dist/src/server/http.js.map +1 -0
- package/dist/src/server/openapi-options.d.ts +6 -0
- package/dist/src/server/openapi-options.js +15 -0
- package/dist/src/server/openapi-options.js.map +1 -0
- package/package.json +3 -3
package/README.ru.md
CHANGED
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
JSON-сервер для имитации API: REST, GraphQL, связанные записи, загрузка файлов и экспорт схем. Поддерживает вход пользователей, права владельца и администратора, даты записей и мягкое удаление. Требуется Node.js 22 или новее.
|
|
6
6
|
|
|
7
|
-
**1.0.0-
|
|
7
|
+
**Breaking changes: 1.0.0-beta.1.** `*` в REST `scope` теперь выбирает только скалярные поля. Массивы, объекты и связи указываются явно. При включённом auth права на запись доступны через виртуальное поле `actions`.
|
|
8
8
|
|
|
9
9
|
## Установка
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
npm install @kollors/deep-json-server@
|
|
12
|
+
npm install @kollors/deep-json-server@beta
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
Для установки конкретной версии укажите `@1.0.0-
|
|
15
|
+
Для установки конкретной версии укажите `@1.0.0-beta.1`.
|
|
16
16
|
|
|
17
17
|
## Быстрый старт
|
|
18
18
|
|
|
@@ -44,7 +44,7 @@ npx deep-json-server server.config.js
|
|
|
44
44
|
|
|
45
45
|
## Конфигурация
|
|
46
46
|
|
|
47
|
-
При `storage: 'file'` все источники и схема задаются путями, при `'memory'` — данными в памяти. Режимы нельзя смешивать. Наличие секций `auth`, `files`, `graphql` и `openapi` включает соответствующие
|
|
47
|
+
При `storage: 'file'` все источники и схема задаются путями, при `'memory'` — данными в памяти. Режимы нельзя смешивать. Наличие секций `auth`, `files`, `graphql` и `openapi` включает соответствующие модули. `graphql: {}` и `openapi: {}` включают только HTTP-маршруты со стандартными адресами; для экспорта добавьте `target`.
|
|
48
48
|
|
|
49
49
|
```js
|
|
50
50
|
export default {
|
|
@@ -52,8 +52,8 @@ export default {
|
|
|
52
52
|
database: { source: './database.json', schema: './schema.json' },
|
|
53
53
|
auth: { source: './users.json', expiresIn: 3600 },
|
|
54
54
|
files: { source: './uploads' },
|
|
55
|
-
graphql: {
|
|
56
|
-
openapi: {
|
|
55
|
+
graphql: { target: './generated/schema.graphql' },
|
|
56
|
+
openapi: { target: './generated/openapi.yaml' },
|
|
57
57
|
server: { host: '127.0.0.1', port: 4001 },
|
|
58
58
|
};
|
|
59
59
|
```
|
|
@@ -66,11 +66,11 @@ export default {
|
|
|
66
66
|
| `auth.source` | Путь к JSON пользователей или массив пользователей |
|
|
67
67
|
| `auth.expiresIn` | Срок сессии в секундах; по умолчанию 3600 |
|
|
68
68
|
| `files.source` | Каталог файлов или массив начальных файлов |
|
|
69
|
-
| `files.metadata` | Только для `file`: путь JSON метаданных; по умолчанию
|
|
69
|
+
| `files.metadata` | Только для `file`: путь JSON метаданных; по умолчанию `.files.json` внутри `files.source` |
|
|
70
70
|
| `graphql.endpoint` | HTTP-маршрут; по умолчанию `/graphql` |
|
|
71
|
-
| `graphql.
|
|
71
|
+
| `graphql.target` | Файл для экспорта GraphQL SDL |
|
|
72
72
|
| `openapi.endpoint` | HTTP-маршрут; по умолчанию `/openapi.json` |
|
|
73
|
-
| `openapi.
|
|
73
|
+
| `openapi.target` | Файл для экспорта OpenAPI |
|
|
74
74
|
| `openapi.info` | Метаданные: обязательные `title`, `version`, необязательный `description` |
|
|
75
75
|
| `server.host`, `server.port` | По умолчанию `127.0.0.1`, `4001`; CLI также читает `HOST`/`PORT` |
|
|
76
76
|
| `server.pageSize`, `server.maxPageSize` | По умолчанию 10 и 100; размер по умолчанию ограничен максимумом |
|
|
@@ -154,7 +154,7 @@ export default {
|
|
|
154
154
|
|
|
155
155
|
При явной схеме неизвестные поля и коллекции запрещены. Исключение — хранимые ключи, выведенные из связей. Исходная база проверяется при загрузке. Генерация использует описание моделей.
|
|
156
156
|
|
|
157
|
-
REST без схемы создаёт ключ `id` и сохраняет произвольные JSON-поля. Для фильтров и выбора отдельных полей используются имена в формате
|
|
157
|
+
REST без схемы создаёт ключ `id` и сохраняет произвольные JSON-поля. Для фильтров и выбора отдельных полей используются имена в формате идентификаторов. `scope=[{"*":true}]` возвращает скаляры верхнего уровня; массивы и объекты выбираются по имени. Поля с разными типами значений можно запросить явно, но фильтрация, сортировка и пагинация неоднородных списков требуют явной схемы.
|
|
158
158
|
|
|
159
159
|
У модели обязательны `collection` — имя коллекции в базе и REST-пути — и `fields` — описание полей. Имя модели (`User`) задаёт имена типов и операций GraphQL. `api` управляет доступностью форматов, а `timestamps` и `softDelete` переопределяют глобальные настройки для этой модели.
|
|
160
160
|
|
|
@@ -212,6 +212,110 @@ REST без схемы создаёт ключ `id` и сохраняет про
|
|
|
212
212
|
|
|
213
213
|
Каскадное удаление выполняется целиком, включая циклические связи. Ошибка проверки отменяет всю операцию. Правила `onDelete` действуют и на явно объявленные обратные связи; при описании обоих направлений учитывайте оба правила.
|
|
214
214
|
|
|
215
|
+
## Пример базы данных
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"countries": [
|
|
220
|
+
{
|
|
221
|
+
"id": "1",
|
|
222
|
+
"isArchived": false,
|
|
223
|
+
"name": "Ардения"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "2",
|
|
227
|
+
"isArchived": false,
|
|
228
|
+
"name": "Велория"
|
|
229
|
+
}
|
|
230
|
+
],
|
|
231
|
+
"genres": [
|
|
232
|
+
{
|
|
233
|
+
"id": "1",
|
|
234
|
+
"isArchived": false,
|
|
235
|
+
"name": "Криминал",
|
|
236
|
+
"parentIds": []
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"id": "2",
|
|
240
|
+
"isArchived": false,
|
|
241
|
+
"name": "Гангстер",
|
|
242
|
+
"parentIds": ["1"]
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"id": "3",
|
|
246
|
+
"isArchived": false,
|
|
247
|
+
"name": "Драма",
|
|
248
|
+
"parentIds": []
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"id": "4",
|
|
252
|
+
"isArchived": false,
|
|
253
|
+
"name": "Комедия",
|
|
254
|
+
"parentIds": []
|
|
255
|
+
}
|
|
256
|
+
],
|
|
257
|
+
"movies": [
|
|
258
|
+
{
|
|
259
|
+
"actors": [
|
|
260
|
+
{
|
|
261
|
+
"genreIds": ["2", "3"],
|
|
262
|
+
"id": "movie-1-actor-1",
|
|
263
|
+
"userId": "1"
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"genreIds": ["3"],
|
|
267
|
+
"id": "movie-1-actor-2",
|
|
268
|
+
"userId": "2"
|
|
269
|
+
}
|
|
270
|
+
],
|
|
271
|
+
"coverSrc": "https://example.com/covers/shadows-of-ardenia.jpg",
|
|
272
|
+
"description": "Наследница портового города раскрывает заговор двух соперничающих семей.",
|
|
273
|
+
"id": "1",
|
|
274
|
+
"isArchived": false,
|
|
275
|
+
"publisherIds": ["2"],
|
|
276
|
+
"title": "Тени Ардении"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"actors": [],
|
|
280
|
+
"coverSrc": "https://example.com/covers/northern-star.jpg",
|
|
281
|
+
"description": "Ночной администратор старого отеля случайно становится участником поисков пропавшей картины.",
|
|
282
|
+
"id": "2",
|
|
283
|
+
"isArchived": false,
|
|
284
|
+
"publisherIds": ["1"],
|
|
285
|
+
"title": "Полночь в «Северной звезде»"
|
|
286
|
+
}
|
|
287
|
+
],
|
|
288
|
+
"publishers": [
|
|
289
|
+
{
|
|
290
|
+
"id": "1",
|
|
291
|
+
"isArchived": false,
|
|
292
|
+
"name": "Northlight Studio"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"id": "2",
|
|
296
|
+
"isArchived": false,
|
|
297
|
+
"name": "Aurora Pictures"
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
"users": [
|
|
301
|
+
{
|
|
302
|
+
"bornAt": "1988-03-14",
|
|
303
|
+
"countryId": "1",
|
|
304
|
+
"fullName": "Мира Волкова",
|
|
305
|
+
"id": "1",
|
|
306
|
+
"isArchived": false
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"bornAt": "1991-11-02",
|
|
310
|
+
"countryId": "2",
|
|
311
|
+
"fullName": "Леон Ветров",
|
|
312
|
+
"id": "2",
|
|
313
|
+
"isArchived": false
|
|
314
|
+
}
|
|
315
|
+
]
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
215
319
|
## Запросы и ответы
|
|
216
320
|
|
|
217
321
|
Примеры с фильмами, актёрами и жанрами используют полную [схему из examples](examples/schema.json). Для их запуска используйте [конфигурацию примера](examples/server.config.js):
|
|
@@ -293,7 +397,7 @@ const params = new URLSearchParams({ scope: JSON.stringify(scope) });
|
|
|
293
397
|
const response = await fetch(`/users?${params}`);
|
|
294
398
|
```
|
|
295
399
|
|
|
296
|
-
|
|
400
|
+
Скаляры и массивы примитивов выбираются через `true`, объекты и связи — через свой массив `scope`. Если аргументы не нужны, в массиве остаётся только объект полей. `"*": true` включает только скалярные поля. Массивы, объекты, связи и поля `writeOnly` в него не входят.
|
|
297
401
|
|
|
298
402
|
Например, собственные поля фильма, пользователи актёров и отсортированные жанры:
|
|
299
403
|
|
|
@@ -314,9 +418,9 @@ const response = await fetch(`/users?${params}`);
|
|
|
314
418
|
]
|
|
315
419
|
```
|
|
316
420
|
|
|
317
|
-
Без `scope` возвращаются
|
|
421
|
+
Без `scope` возвращаются скалярные поля, как при `[{"*":true}]`. Пустой выбор `[{}]` возвращает объект без полей. Списки сохраняют структуру `{ data, total }`.
|
|
318
422
|
|
|
319
|
-
Аргументы доступны только у списков. В запросе отдельной записи и в ответе мутации
|
|
423
|
+
Аргументы доступны только у списков. Вместо них список может использовать `{ "union": [scope, ...] }`: каждая часть — обычный scope списка, части выполняются в порядке массива, а для каждого первичного ключа остаётся первая запись. Это работает и у вложенных списков. В запросе отдельной записи и в ответе мутации аргументы можно задать для вложенных списков. Параметры проверяются даже на пустых данных; ошибка в выборе ответа отменяет изменения записи. Некорректный `scope` возвращает `400`. Максимальная длина JSON — 10 000 символов, глубина выбора — 32 уровня.
|
|
320
424
|
|
|
321
425
|
### Вложенная запись
|
|
322
426
|
|
|
@@ -419,8 +523,8 @@ query {
|
|
|
419
523
|
export default {
|
|
420
524
|
storage: 'file',
|
|
421
525
|
database: { source: './database.json', schema: './schema.json' },
|
|
422
|
-
openapi: {
|
|
423
|
-
graphql: {
|
|
526
|
+
openapi: { target: './generated/openapi.yaml' },
|
|
527
|
+
graphql: { target: './generated/schema.graphql' },
|
|
424
528
|
};
|
|
425
529
|
```
|
|
426
530
|
|
|
@@ -429,9 +533,9 @@ npx deep-json-server server.config.js --generate-only
|
|
|
429
533
|
npx deep-json-server server.config.js --generate
|
|
430
534
|
```
|
|
431
535
|
|
|
432
|
-
`--generate-only` экспортирует и завершает работу, `--generate` после экспорта запускает сервер. Форматы определяются наличием секций. Для каждого выбранного формата обязателен свой `
|
|
536
|
+
`--generate-only` экспортирует и завершает работу, `--generate` после экспорта запускает сервер. Форматы определяются наличием секций. Для каждого выбранного формата обязателен свой `target`. Если секций нет, отсутствует `target` или генерация завершилась ошибкой, команда возвращает ошибку и сервер не запускается.
|
|
433
537
|
|
|
434
|
-
|
|
538
|
+
Экспорт не открывает базу, учётные записи и файлы. Перед записью проверяются все выбранные `target`; они не могут совпадать с конфигурацией, базой, схемой, пользователями, счётчиками или метаданными файлов.
|
|
435
539
|
|
|
436
540
|
## Аутентификация
|
|
437
541
|
|
|
@@ -487,7 +591,7 @@ export default {
|
|
|
487
591
|
};
|
|
488
592
|
```
|
|
489
593
|
|
|
490
|
-
Учётные записи auth хранятся отдельно от
|
|
594
|
+
Учётные записи auth хранятся отдельно от базы. В файловом режиме изменения сохраняются в `auth.source`; в режиме памяти они исчезают после перезапуска. Переданный массив пользователей не изменяется. После ручного изменения файла перезапустите сервер.
|
|
491
595
|
|
|
492
596
|
| REST-запрос | JSON тела | Ответ |
|
|
493
597
|
|---|---|---|
|
|
@@ -506,7 +610,39 @@ export default {
|
|
|
506
610
|
|
|
507
611
|
Недействительный или истёкший токен возвращает `401`, недостаток прав — `403`, отсутствующий пользователь при разрешённой операции — `404`. Ошибки тела запроса возвращают `400`. Вход, регистрация и смена пароля могут вернуть `429` при превышении числа одновременных вычислений паролей; вход также ограничивает число активных сессий. Сессии хранятся в памяти и исчезают после перезапуска. Выход завершает только сессию переданного токена.
|
|
508
612
|
|
|
509
|
-
|
|
613
|
+
При включённом auth у каждой записи модели доступен виртуальный объект `actions`. Он вычисляется для текущего пользователя и не сохраняется в базе. В REST его нужно явно запросить через `scope`:
|
|
614
|
+
|
|
615
|
+
```json
|
|
616
|
+
[
|
|
617
|
+
{
|
|
618
|
+
"id": true,
|
|
619
|
+
"actions": [{ "*": true }]
|
|
620
|
+
}
|
|
621
|
+
]
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
Объект содержит `update`, `replace` и `delete`. Владелец или администратор получает `true`, а анонимный или посторонний пользователь — `false`. Записи без `createdById` изменяет только администратор. Без токена чтение остаётся открытым, а флаги равны `false`. Переданный недействительный токен возвращает `401` в REST или `UNAUTHENTICATED` в GraphQL.
|
|
625
|
+
|
|
626
|
+
В GraphQL то же поле выбирается обычным способом:
|
|
627
|
+
|
|
628
|
+
```graphql
|
|
629
|
+
query {
|
|
630
|
+
itemList {
|
|
631
|
+
data {
|
|
632
|
+
id
|
|
633
|
+
actions {
|
|
634
|
+
update
|
|
635
|
+
replace
|
|
636
|
+
delete
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
`actions` доступен у корневых и связанных записей моделей, включая результаты мутаций. Его нельзя записывать, фильтровать или сортировать. Обычные вложенные объекты и ответы методов auth это поле не получают.
|
|
644
|
+
|
|
645
|
+
OpenAPI описывает маршруты auth, необязательную Bearer-аутентификацию при чтении записей, обязательную при изменениях и поле ответа `actions`. В Swagger UI токен из ответа на вход можно вставить в **Authorize**. Для экспорта схем включите auth в конфигурации и выполните `npx deep-json-server server.config.js --generate-only`; файл учётных записей при генерации не читается. Методы auth доступны через REST. В GraphQL тот же токен проверяется при чтении прав и изменении записей. Для GraphQL и OpenAPI нужна `database.schema`.
|
|
510
646
|
|
|
511
647
|
## Даты записей, удаление и владельцы
|
|
512
648
|
|
|
@@ -576,7 +712,7 @@ REST возвращает 401 при отсутствии действитель
|
|
|
576
712
|
export default {
|
|
577
713
|
storage: 'file',
|
|
578
714
|
database: { source: './database.json' },
|
|
579
|
-
files: { source: './uploads'
|
|
715
|
+
files: { source: './uploads' },
|
|
580
716
|
};
|
|
581
717
|
```
|
|
582
718
|
|
|
@@ -639,7 +775,7 @@ Content-Type: application/json
|
|
|
639
775
|
|
|
640
776
|
`PATCH` возвращает обновлённые метаданные со статусом `200`; если по новому пути уже существует файл, сервер возвращает `409`. `DELETE` отвечает статусом `204` без тела. Если файл не найден, любая операция по пути возвращает `404`. Пути в URL задаются относительно `files.source`, а все возвращаемые URL — относительно адреса сервера.
|
|
641
777
|
|
|
642
|
-
При хранении на диске бинарный файл находится по пути `<files.source>/<directory>/<name>`. Метаданные
|
|
778
|
+
При хранении на диске бинарный файл находится по пути `<files.source>/<directory>/<name>`. Метаданные по умолчанию хранятся в `<files.source>/.files.json`; другой путь можно задать через `files.metadata`. Директории и файл метаданных создаются по мере необходимости.
|
|
643
779
|
|
|
644
780
|
Используйте один процесс сервера для дисковой базы и файлового хранилища. Перед ручным изменением файлов или метаданных остановите его. Пути в хранилище не могут содержать символические ссылки. Загрузка и переименование не могут перезаписать базу, счётчики, схему, учётные записи auth, загруженную конфигурацию или файл метаданных.
|
|
645
781
|
|
|
@@ -673,114 +809,10 @@ await writeOpenapi(document, './generated/openapi.yaml');
|
|
|
673
809
|
await writeGraphql(sdl, './generated/schema.graphql');
|
|
674
810
|
```
|
|
675
811
|
|
|
676
|
-
Отдельные генераторы принимают путь или объект схемы и не требуют конфигурации сервера. Выбранная функция задаёт формат по умолчанию; `api` в схеме и моделях может его ограничить. `timestamps` и `softDelete` берутся из схемы. Опция `{ auth: true }` добавляет поля
|
|
812
|
+
Отдельные генераторы принимают путь или объект схемы и не требуют конфигурации сервера. Выбранная функция задаёт формат по умолчанию; `api` в схеме и моделях может его ограничить. `timestamps` и `softDelete` берутся из схемы. Опция `{ auth: true }` добавляет поля владельца и `actions`; OpenAPI также описывает маршруты auth и требования токена. `hashPassword()` доступна и через общий импорт пакета.
|
|
677
813
|
|
|
678
814
|
`generateOpenapi()` также принимает `host`, `port`, `pageSize`, `maxPageSize` и `info`. Вместо пути можно передать объект схемы. Сервер и генераторы работают с собственной копией модели. Размеры страниц должны быть положительными целыми числами; `pageSize` не может превышать `maxPageSize`.
|
|
679
815
|
|
|
680
|
-
## Пример базы данных
|
|
681
|
-
|
|
682
|
-
```json
|
|
683
|
-
{
|
|
684
|
-
"countries": [
|
|
685
|
-
{
|
|
686
|
-
"id": "1",
|
|
687
|
-
"isArchived": false,
|
|
688
|
-
"name": "Ардения"
|
|
689
|
-
},
|
|
690
|
-
{
|
|
691
|
-
"id": "2",
|
|
692
|
-
"isArchived": false,
|
|
693
|
-
"name": "Велория"
|
|
694
|
-
}
|
|
695
|
-
],
|
|
696
|
-
"genres": [
|
|
697
|
-
{
|
|
698
|
-
"id": "1",
|
|
699
|
-
"isArchived": false,
|
|
700
|
-
"name": "Криминал",
|
|
701
|
-
"parentIds": []
|
|
702
|
-
},
|
|
703
|
-
{
|
|
704
|
-
"id": "2",
|
|
705
|
-
"isArchived": false,
|
|
706
|
-
"name": "Гангстер",
|
|
707
|
-
"parentIds": ["1"]
|
|
708
|
-
},
|
|
709
|
-
{
|
|
710
|
-
"id": "3",
|
|
711
|
-
"isArchived": false,
|
|
712
|
-
"name": "Драма",
|
|
713
|
-
"parentIds": []
|
|
714
|
-
},
|
|
715
|
-
{
|
|
716
|
-
"id": "4",
|
|
717
|
-
"isArchived": false,
|
|
718
|
-
"name": "Комедия",
|
|
719
|
-
"parentIds": []
|
|
720
|
-
}
|
|
721
|
-
],
|
|
722
|
-
"movies": [
|
|
723
|
-
{
|
|
724
|
-
"actors": [
|
|
725
|
-
{
|
|
726
|
-
"genreIds": ["2", "3"],
|
|
727
|
-
"id": "movie-1-actor-1",
|
|
728
|
-
"userId": "1"
|
|
729
|
-
},
|
|
730
|
-
{
|
|
731
|
-
"genreIds": ["3"],
|
|
732
|
-
"id": "movie-1-actor-2",
|
|
733
|
-
"userId": "2"
|
|
734
|
-
}
|
|
735
|
-
],
|
|
736
|
-
"coverSrc": "https://example.com/covers/shadows-of-ardenia.jpg",
|
|
737
|
-
"description": "Наследница портового города раскрывает заговор двух соперничающих семей.",
|
|
738
|
-
"id": "1",
|
|
739
|
-
"isArchived": false,
|
|
740
|
-
"publisherIds": ["2"],
|
|
741
|
-
"title": "Тени Ардении"
|
|
742
|
-
},
|
|
743
|
-
{
|
|
744
|
-
"actors": [],
|
|
745
|
-
"coverSrc": "https://example.com/covers/northern-star.jpg",
|
|
746
|
-
"description": "Ночной администратор старого отеля случайно становится участником поисков пропавшей картины.",
|
|
747
|
-
"id": "2",
|
|
748
|
-
"isArchived": false,
|
|
749
|
-
"publisherIds": ["1"],
|
|
750
|
-
"title": "Полночь в «Северной звезде»"
|
|
751
|
-
}
|
|
752
|
-
],
|
|
753
|
-
"publishers": [
|
|
754
|
-
{
|
|
755
|
-
"id": "1",
|
|
756
|
-
"isArchived": false,
|
|
757
|
-
"name": "Northlight Studio"
|
|
758
|
-
},
|
|
759
|
-
{
|
|
760
|
-
"id": "2",
|
|
761
|
-
"isArchived": false,
|
|
762
|
-
"name": "Aurora Pictures"
|
|
763
|
-
}
|
|
764
|
-
],
|
|
765
|
-
"users": [
|
|
766
|
-
{
|
|
767
|
-
"bornAt": "1988-03-14",
|
|
768
|
-
"countryId": "1",
|
|
769
|
-
"fullName": "Мира Волкова",
|
|
770
|
-
"id": "1",
|
|
771
|
-
"isArchived": false
|
|
772
|
-
},
|
|
773
|
-
{
|
|
774
|
-
"bornAt": "1991-11-02",
|
|
775
|
-
"countryId": "2",
|
|
776
|
-
"fullName": "Леон Ветров",
|
|
777
|
-
"id": "2",
|
|
778
|
-
"isArchived": false
|
|
779
|
-
}
|
|
780
|
-
]
|
|
781
|
-
}
|
|
782
|
-
```
|
|
783
|
-
|
|
784
816
|
## Хранение данных
|
|
785
817
|
|
|
786
818
|
Изменения выполняются последовательно внутри экземпляра сервера и проверяются на копии данных до сохранения. Для одного файла базы используйте один процесс сервера. Счётчики `increment` хранятся рядом с базой в `<путь базы>.counters.json`; сохраняйте этот файл вместе с базой. Номера резервируются до записи данных: сбой может оставить пропуск, но не приводит к повторной выдаче номера.
|
|
@@ -796,6 +828,6 @@ npm run verify
|
|
|
796
828
|
|
|
797
829
|
Команда проверяет типы, стиль кода, покрытие тестами и установку пакета из архива.
|
|
798
830
|
|
|
799
|
-
Для публикации
|
|
831
|
+
Для публикации предварительной версии обновите номер в `package.json`, `package-lock.json` и `src/core/constants.ts`, затем отправьте коммит в `main`. GitHub Actions создаст тег `v<версия>` и опубликует пакет через trusted publishing в канал `alpha`, `beta` или `rc`. Стабильные версии публикуются в `latest` из явно отправленного тега версии.
|
|
800
832
|
|
|
801
833
|
Лицензия: MIT.
|
package/dist/src/cli/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { writeOpenapi } from '../openapi/entry.js';
|
|
|
7
7
|
import { configure, readConfigModule } from '../server/config.js';
|
|
8
8
|
import { createConfiguredServer } from '../server/create.js';
|
|
9
9
|
import { configuredModel } from '../server/model.js';
|
|
10
|
+
import { openapiOptions } from '../server/openapi-options.js';
|
|
10
11
|
const HELP_TEXT = `Deep JSON Server
|
|
11
12
|
|
|
12
13
|
Usage:
|
|
@@ -20,9 +21,9 @@ Usage:
|
|
|
20
21
|
--version, -v Show version
|
|
21
22
|
|
|
22
23
|
Modules and export formats are selected by configuration sections.
|
|
23
|
-
Generate flags are mutually exclusive and require output
|
|
24
|
+
Generate flags are mutually exclusive and require output targets.`;
|
|
24
25
|
/** Проверяет все назначения, строит обе схемы и только затем сохраняет файлы.
|
|
25
|
-
* @example Секции openapi и graphql с
|
|
26
|
+
* @example Секции openapi и graphql с target → два файла; нет target → ошибка до записи.
|
|
26
27
|
*/
|
|
27
28
|
async function generate(config, source, directory, sourcePath) {
|
|
28
29
|
if (!config.openapi && !config.graphql)
|
|
@@ -31,32 +32,22 @@ async function generate(config, source, directory, sourcePath) {
|
|
|
31
32
|
for (const format of ['openapi', 'graphql']) {
|
|
32
33
|
if (!config[format])
|
|
33
34
|
continue;
|
|
34
|
-
const
|
|
35
|
-
if (!
|
|
36
|
-
throw new Error(`Укажите config.${format}.
|
|
37
|
-
outputs.push(
|
|
35
|
+
const target = config[format].target;
|
|
36
|
+
if (!target)
|
|
37
|
+
throw new Error(`Укажите config.${format}.target`);
|
|
38
|
+
outputs.push(target);
|
|
38
39
|
}
|
|
39
40
|
await validateExportPaths(outputs, inputPaths(source, directory, sourcePath));
|
|
40
41
|
const model = await configuredModel(config);
|
|
41
|
-
const openapi = config.openapi
|
|
42
|
-
? (await import('../openapi/generate.js')).openapiFromModel(model, {
|
|
43
|
-
files: config.files !== undefined,
|
|
44
|
-
auth: config.auth !== undefined,
|
|
45
|
-
host: config.server.host,
|
|
46
|
-
port: config.server.port,
|
|
47
|
-
pageSize: config.server.pageSize,
|
|
48
|
-
maxPageSize: config.server.maxPageSize,
|
|
49
|
-
info: config.openapi.info,
|
|
50
|
-
})
|
|
51
|
-
: undefined;
|
|
42
|
+
const openapi = config.openapi ? (await import('../openapi/generate.js')).openapiFromModel(model, openapiOptions(config)) : undefined;
|
|
52
43
|
const graphql = config.graphql ? (await import('../graphql/generate.js')).graphqlFromModel(model) : undefined;
|
|
53
|
-
if (openapi && config.openapi?.
|
|
54
|
-
await writeOpenapi(openapi, config.openapi.
|
|
55
|
-
process.stdout.write(`OpenAPI: ${config.openapi.
|
|
44
|
+
if (openapi && config.openapi?.target) {
|
|
45
|
+
await writeOpenapi(openapi, config.openapi.target);
|
|
46
|
+
process.stdout.write(`OpenAPI: ${config.openapi.target}\n`);
|
|
56
47
|
}
|
|
57
|
-
if (graphql && config.graphql?.
|
|
58
|
-
await writeGraphql(graphql, config.graphql.
|
|
59
|
-
process.stdout.write(`GraphQL: ${config.graphql.
|
|
48
|
+
if (graphql && config.graphql?.target) {
|
|
49
|
+
await writeGraphql(graphql, config.graphql.target);
|
|
50
|
+
process.stdout.write(`GraphQL: ${config.graphql.target}\n`);
|
|
60
51
|
}
|
|
61
52
|
}
|
|
62
53
|
/** Разбирает флаги, выполняет экспорт по секциям конфигурации и при необходимости запускает сервер.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAA+B,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,4 +3,4 @@ export declare const DEFAULT_MAX_FILE_SIZE: number;
|
|
|
3
3
|
export declare const DEFAULT_MAX_PAGE_SIZE = 100;
|
|
4
4
|
export declare const DEFAULT_PAGE_SIZE = 10;
|
|
5
5
|
export declare const DEFAULT_PORT = 4001;
|
|
6
|
-
export declare const VERSION = "1.0.0-
|
|
6
|
+
export declare const VERSION = "1.0.0-beta.1";
|
|
@@ -3,5 +3,5 @@ export const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;
|
|
|
3
3
|
export const DEFAULT_MAX_PAGE_SIZE = 100;
|
|
4
4
|
export const DEFAULT_PAGE_SIZE = 10;
|
|
5
5
|
export const DEFAULT_PORT = 4001;
|
|
6
|
-
export const VERSION = '1.0.0-
|
|
6
|
+
export const VERSION = '1.0.0-beta.1';
|
|
7
7
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC"}
|
|
@@ -2,23 +2,11 @@ import type { DatabaseStore } from './database.js';
|
|
|
2
2
|
import type { ActorSource } from './lifecycle/options.js';
|
|
3
3
|
import { type Entity, type Model, type Node } from './model.js';
|
|
4
4
|
import type { MutationMode } from './operations.js';
|
|
5
|
-
import { type
|
|
6
|
-
import {
|
|
5
|
+
import { type Page, type PreparedList } from './query/execute.js';
|
|
6
|
+
import type { ListOptions } from './query/options.js';
|
|
7
7
|
import { type Context, type Ref } from './records.js';
|
|
8
8
|
import type { DatabaseData } from './types.js';
|
|
9
|
-
export
|
|
10
|
-
page: number;
|
|
11
|
-
pageSize: number;
|
|
12
|
-
predicate?: Predicate;
|
|
13
|
-
rules: Array<{
|
|
14
|
-
direction: 'ASC' | 'DESC';
|
|
15
|
-
keys: string[];
|
|
16
|
-
}>;
|
|
17
|
-
}
|
|
18
|
-
export interface Page {
|
|
19
|
-
data: Ref[];
|
|
20
|
-
total: number;
|
|
21
|
-
}
|
|
9
|
+
export type { Page, PreparedList } from './query/execute.js';
|
|
22
10
|
export declare class Engine {
|
|
23
11
|
readonly store: DatabaseStore;
|
|
24
12
|
model: Model;
|