@kollors/deep-json-server 1.0.0-alpha.9 → 1.0.0-beta.2
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 +169 -128
- package/README.ru.md +169 -128
- 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 +29 -4
- 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 +51 -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.2.** `*` в 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.2`.
|
|
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` в него не входят. Ключ связи можно выбрать явно, например `{ "*": true, "countryId": true }`. Без схемы ключ исключается из `*`, только если сервер смог вывести для него связь по имени и существующей коллекции.
|
|
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
|
|
|
@@ -350,7 +454,16 @@ Content-Type: application/json
|
|
|
350
454
|
|
|
351
455
|
Переданный список заменяет состав связи. PATCH сохраняет пропущенные связи, PUT очищает пропущенные связи, ключи которых доступны для записи. `[]` очищает список, `null` — одиночную связь с разрешённым `nullable`. Разрыв связи не удаляет связанную запись. Обязательные связи должны оставаться заполненными.
|
|
352
456
|
|
|
353
|
-
В одном объекте указывайте либо связь, либо её хранимый ключ: например, `genres` или `genreIds`.
|
|
457
|
+
В одном объекте указывайте либо связь, либо её хранимый ключ: например, `genres` или `genreIds`. Одновременная передача обоих полей возвращает `400 INVALID_INPUT`, даже если наборы ключей совпадают:
|
|
458
|
+
|
|
459
|
+
```json
|
|
460
|
+
{
|
|
461
|
+
"genreIds": ["1", "2"],
|
|
462
|
+
"genres": ["1", "2"]
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
Сервер не выбирает приоритет и не объединяет значения; вся операция отменяется. Для обратной связи сервер меняет целевой ключ. Если путь проходит через массив и нельзя однозначно выбрать элемент для связи, передайте массив с нужными ключами явно. Защищённые ключи изменять нельзя.
|
|
354
467
|
|
|
355
468
|
Все вложенные изменения входят в транзакцию основной записи. Ошибка проверки, отсутствующая запись или неверный выбор полей ответа отменяет всю операцию. Изменения общей записи видны всем, кто с ней связан.
|
|
356
469
|
|
|
@@ -419,8 +532,8 @@ query {
|
|
|
419
532
|
export default {
|
|
420
533
|
storage: 'file',
|
|
421
534
|
database: { source: './database.json', schema: './schema.json' },
|
|
422
|
-
openapi: {
|
|
423
|
-
graphql: {
|
|
535
|
+
openapi: { target: './generated/openapi.yaml' },
|
|
536
|
+
graphql: { target: './generated/schema.graphql' },
|
|
424
537
|
};
|
|
425
538
|
```
|
|
426
539
|
|
|
@@ -429,9 +542,9 @@ npx deep-json-server server.config.js --generate-only
|
|
|
429
542
|
npx deep-json-server server.config.js --generate
|
|
430
543
|
```
|
|
431
544
|
|
|
432
|
-
`--generate-only` экспортирует и завершает работу, `--generate` после экспорта запускает сервер. Форматы определяются наличием секций. Для каждого выбранного формата обязателен свой `
|
|
545
|
+
`--generate-only` экспортирует и завершает работу, `--generate` после экспорта запускает сервер. Форматы определяются наличием секций. Для каждого выбранного формата обязателен свой `target`. Если секций нет, отсутствует `target` или генерация завершилась ошибкой, команда возвращает ошибку и сервер не запускается.
|
|
433
546
|
|
|
434
|
-
|
|
547
|
+
Экспорт не открывает базу, учётные записи и файлы. Перед записью проверяются все выбранные `target`; они не могут совпадать с конфигурацией, базой, схемой, пользователями, счётчиками или метаданными файлов.
|
|
435
548
|
|
|
436
549
|
## Аутентификация
|
|
437
550
|
|
|
@@ -487,7 +600,7 @@ export default {
|
|
|
487
600
|
};
|
|
488
601
|
```
|
|
489
602
|
|
|
490
|
-
Учётные записи auth хранятся отдельно от
|
|
603
|
+
Учётные записи auth хранятся отдельно от базы. В файловом режиме изменения сохраняются в `auth.source`; в режиме памяти они исчезают после перезапуска. Переданный массив пользователей не изменяется. После ручного изменения файла перезапустите сервер.
|
|
491
604
|
|
|
492
605
|
| REST-запрос | JSON тела | Ответ |
|
|
493
606
|
|---|---|---|
|
|
@@ -506,7 +619,39 @@ export default {
|
|
|
506
619
|
|
|
507
620
|
Недействительный или истёкший токен возвращает `401`, недостаток прав — `403`, отсутствующий пользователь при разрешённой операции — `404`. Ошибки тела запроса возвращают `400`. Вход, регистрация и смена пароля могут вернуть `429` при превышении числа одновременных вычислений паролей; вход также ограничивает число активных сессий. Сессии хранятся в памяти и исчезают после перезапуска. Выход завершает только сессию переданного токена.
|
|
508
621
|
|
|
509
|
-
|
|
622
|
+
При включённом auth у каждой записи модели доступен виртуальный объект `actions`. Он вычисляется для текущего пользователя и не сохраняется в базе. В REST его нужно явно запросить через `scope`:
|
|
623
|
+
|
|
624
|
+
```json
|
|
625
|
+
[
|
|
626
|
+
{
|
|
627
|
+
"id": true,
|
|
628
|
+
"actions": [{ "*": true }]
|
|
629
|
+
}
|
|
630
|
+
]
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
Объект содержит `update`, `replace` и `delete`. Владелец или администратор получает `true`, а анонимный или посторонний пользователь — `false`. Записи без `createdById` изменяет только администратор. Без токена чтение остаётся открытым, а флаги равны `false`. Переданный недействительный токен возвращает `401` в REST или `UNAUTHENTICATED` в GraphQL.
|
|
634
|
+
|
|
635
|
+
В GraphQL то же поле выбирается обычным способом:
|
|
636
|
+
|
|
637
|
+
```graphql
|
|
638
|
+
query {
|
|
639
|
+
itemList {
|
|
640
|
+
data {
|
|
641
|
+
id
|
|
642
|
+
actions {
|
|
643
|
+
update
|
|
644
|
+
replace
|
|
645
|
+
delete
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
`actions` доступен у корневых и связанных записей моделей, включая результаты мутаций. Его нельзя записывать, фильтровать или сортировать. Обычные вложенные объекты и ответы методов auth это поле не получают.
|
|
653
|
+
|
|
654
|
+
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
655
|
|
|
511
656
|
## Даты записей, удаление и владельцы
|
|
512
657
|
|
|
@@ -576,7 +721,7 @@ REST возвращает 401 при отсутствии действитель
|
|
|
576
721
|
export default {
|
|
577
722
|
storage: 'file',
|
|
578
723
|
database: { source: './database.json' },
|
|
579
|
-
files: { source: './uploads'
|
|
724
|
+
files: { source: './uploads' },
|
|
580
725
|
};
|
|
581
726
|
```
|
|
582
727
|
|
|
@@ -639,7 +784,7 @@ Content-Type: application/json
|
|
|
639
784
|
|
|
640
785
|
`PATCH` возвращает обновлённые метаданные со статусом `200`; если по новому пути уже существует файл, сервер возвращает `409`. `DELETE` отвечает статусом `204` без тела. Если файл не найден, любая операция по пути возвращает `404`. Пути в URL задаются относительно `files.source`, а все возвращаемые URL — относительно адреса сервера.
|
|
641
786
|
|
|
642
|
-
При хранении на диске бинарный файл находится по пути `<files.source>/<directory>/<name>`. Метаданные
|
|
787
|
+
При хранении на диске бинарный файл находится по пути `<files.source>/<directory>/<name>`. Метаданные по умолчанию хранятся в `<files.source>/.files.json`; другой путь можно задать через `files.metadata`. Директории и файл метаданных создаются по мере необходимости.
|
|
643
788
|
|
|
644
789
|
Используйте один процесс сервера для дисковой базы и файлового хранилища. Перед ручным изменением файлов или метаданных остановите его. Пути в хранилище не могут содержать символические ссылки. Загрузка и переименование не могут перезаписать базу, счётчики, схему, учётные записи auth, загруженную конфигурацию или файл метаданных.
|
|
645
790
|
|
|
@@ -673,114 +818,10 @@ await writeOpenapi(document, './generated/openapi.yaml');
|
|
|
673
818
|
await writeGraphql(sdl, './generated/schema.graphql');
|
|
674
819
|
```
|
|
675
820
|
|
|
676
|
-
Отдельные генераторы принимают путь или объект схемы и не требуют конфигурации сервера. Выбранная функция задаёт формат по умолчанию; `api` в схеме и моделях может его ограничить. `timestamps` и `softDelete` берутся из схемы. Опция `{ auth: true }` добавляет поля
|
|
821
|
+
Отдельные генераторы принимают путь или объект схемы и не требуют конфигурации сервера. Выбранная функция задаёт формат по умолчанию; `api` в схеме и моделях может его ограничить. `timestamps` и `softDelete` берутся из схемы. Опция `{ auth: true }` добавляет поля владельца и `actions`; OpenAPI также описывает маршруты auth и требования токена. `hashPassword()` доступна и через общий импорт пакета.
|
|
677
822
|
|
|
678
823
|
`generateOpenapi()` также принимает `host`, `port`, `pageSize`, `maxPageSize` и `info`. Вместо пути можно передать объект схемы. Сервер и генераторы работают с собственной копией модели. Размеры страниц должны быть положительными целыми числами; `pageSize` не может превышать `maxPageSize`.
|
|
679
824
|
|
|
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
825
|
## Хранение данных
|
|
785
826
|
|
|
786
827
|
Изменения выполняются последовательно внутри экземпляра сервера и проверяются на копии данных до сохранения. Для одного файла базы используйте один процесс сервера. Счётчики `increment` хранятся рядом с базой в `<путь базы>.counters.json`; сохраняйте этот файл вместе с базой. Номера резервируются до записи данных: сбой может оставить пропуск, но не приводит к повторной выдаче номера.
|
|
@@ -796,6 +837,6 @@ npm run verify
|
|
|
796
837
|
|
|
797
838
|
Команда проверяет типы, стиль кода, покрытие тестами и установку пакета из архива.
|
|
798
839
|
|
|
799
|
-
Для публикации
|
|
840
|
+
Для публикации предварительной версии обновите номер в `package.json`, `package-lock.json` и `src/core/constants.ts`, затем отправьте коммит в `main`. GitHub Actions создаст тег `v<версия>` и опубликует пакет через trusted publishing в канал `alpha`, `beta` или `rc`. Стабильные версии публикуются в `latest` из явно отправленного тега версии.
|
|
800
841
|
|
|
801
842
|
Лицензия: 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.2";
|
|
@@ -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.2';
|
|
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;
|