@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.
Files changed (79) hide show
  1. package/README.md +159 -127
  2. package/README.ru.md +159 -127
  3. package/dist/src/cli/index.js +14 -23
  4. package/dist/src/cli/index.js.map +1 -1
  5. package/dist/src/core/constants.d.ts +1 -1
  6. package/dist/src/core/constants.js +1 -1
  7. package/dist/src/core/constants.js.map +1 -1
  8. package/dist/src/core/engine.d.ts +3 -15
  9. package/dist/src/core/engine.js +10 -69
  10. package/dist/src/core/engine.js.map +1 -1
  11. package/dist/src/core/lifecycle/mutation.js +4 -4
  12. package/dist/src/core/lifecycle/mutation.js.map +1 -1
  13. package/dist/src/core/lifecycle/options.d.ts +15 -0
  14. package/dist/src/core/lifecycle/options.js +13 -0
  15. package/dist/src/core/lifecycle/options.js.map +1 -1
  16. package/dist/src/core/model.d.ts +1 -0
  17. package/dist/src/core/model.js +11 -0
  18. package/dist/src/core/model.js.map +1 -1
  19. package/dist/src/core/mutations/write.js +4 -0
  20. package/dist/src/core/mutations/write.js.map +1 -1
  21. package/dist/src/core/paths.js +1 -7
  22. package/dist/src/core/paths.js.map +1 -1
  23. package/dist/src/core/query/execute.d.ts +25 -0
  24. package/dist/src/core/query/execute.js +82 -0
  25. package/dist/src/core/query/execute.js.map +1 -0
  26. package/dist/src/core/query/filter.js +1 -1
  27. package/dist/src/core/query/filter.js.map +1 -1
  28. package/dist/src/core/query/options.js +2 -2
  29. package/dist/src/core/query/options.js.map +1 -1
  30. package/dist/src/core/records.d.ts +2 -1
  31. package/dist/src/core/records.js +5 -2
  32. package/dist/src/core/records.js.map +1 -1
  33. package/dist/src/files/disk-metadata.d.ts +9 -0
  34. package/dist/src/files/disk-metadata.js +44 -0
  35. package/dist/src/files/disk-metadata.js.map +1 -0
  36. package/dist/src/files/disk-paths.d.ts +15 -0
  37. package/dist/src/files/disk-paths.js +100 -0
  38. package/dist/src/files/disk-paths.js.map +1 -0
  39. package/dist/src/files/disk-store.js +21 -165
  40. package/dist/src/files/disk-store.js.map +1 -1
  41. package/dist/src/files/index.js +1 -1
  42. package/dist/src/files/index.js.map +1 -1
  43. package/dist/src/graphql/preflight.js +2 -0
  44. package/dist/src/graphql/preflight.js.map +1 -1
  45. package/dist/src/graphql/resolvers.js +7 -3
  46. package/dist/src/graphql/resolvers.js.map +1 -1
  47. package/dist/src/graphql/routes.js +4 -1
  48. package/dist/src/graphql/routes.js.map +1 -1
  49. package/dist/src/graphql/schema.js +5 -2
  50. package/dist/src/graphql/schema.js.map +1 -1
  51. package/dist/src/openapi/document.js +30 -19
  52. package/dist/src/openapi/document.js.map +1 -1
  53. package/dist/src/openapi/registry.d.ts +11 -0
  54. package/dist/src/openapi/registry.js +20 -0
  55. package/dist/src/openapi/registry.js.map +1 -0
  56. package/dist/src/rest/options.d.ts +11 -3
  57. package/dist/src/rest/options.js +15 -0
  58. package/dist/src/rest/options.js.map +1 -1
  59. package/dist/src/rest/projection.d.ts +15 -3
  60. package/dist/src/rest/projection.js +49 -15
  61. package/dist/src/rest/projection.js.map +1 -1
  62. package/dist/src/rest/routes.js +18 -7
  63. package/dist/src/rest/routes.js.map +1 -1
  64. package/dist/src/server/bootstrap.d.ts +7 -0
  65. package/dist/src/server/bootstrap.js +48 -0
  66. package/dist/src/server/bootstrap.js.map +1 -0
  67. package/dist/src/server/config.d.ts +2 -2
  68. package/dist/src/server/config.js +5 -5
  69. package/dist/src/server/config.js.map +1 -1
  70. package/dist/src/server/create.d.ts +1 -1
  71. package/dist/src/server/create.js +11 -85
  72. package/dist/src/server/create.js.map +1 -1
  73. package/dist/src/server/http.d.ts +12 -0
  74. package/dist/src/server/http.js +40 -0
  75. package/dist/src/server/http.js.map +1 -0
  76. package/dist/src/server/openapi-options.d.ts +6 -0
  77. package/dist/src/server/openapi-options.js +15 -0
  78. package/dist/src/server/openapi-options.js.map +1 -0
  79. 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-alpha.9 предварительная версия.** При обновлении с предыдущей альфы добавьте общий `storage`, замените источники на `source`, перенесите модели под `models`, а настройки дат и удаления в корень схемы. Модули теперь включаются наличием секций; для экспорта используйте `--generate` или `--generate-only`. Второй аргумент `createServer` удалён.
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@alpha
12
+ npm install @kollors/deep-json-server@beta
13
13
  ```
14
14
 
15
- Для установки конкретной версии укажите `@1.0.0-alpha.9`.
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` включает соответствующие модули; для стандартных маршрутов достаточно `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: { path: './generated/schema.graphql' },
56
- openapi: { path: './generated/openapi.yaml' },
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 метаданных; по умолчанию `_database.json` внутри `files.source` |
69
+ | `files.metadata` | Только для `file`: путь JSON метаданных; по умолчанию `.files.json` внутри `files.source` |
70
70
  | `graphql.endpoint` | HTTP-маршрут; по умолчанию `/graphql` |
71
- | `graphql.path` | Файл для экспорта GraphQL SDL |
71
+ | `graphql.target` | Файл для экспорта GraphQL SDL |
72
72
  | `openapi.endpoint` | HTTP-маршрут; по умолчанию `/openapi.json` |
73
- | `openapi.path` | Файл для экспорта 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-поля. Для фильтров и выбора отдельных полей используются имена в формате идентификаторов; остальные поля возвращаются через `scope=[{"*":true}]`. Поля с разными типами значений можно читать, но фильтрация, сортировка и пагинация неоднородных списков требуют явной схемы.
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
- Обычные поля выбираются через `true`, объекты и связи — через свой массив `scope`. Если аргументы не нужны, в массиве остаётся только объект полей. `"*": true` включает собственные поля и хранимые ключи, кроме `writeOnly`; связи выбираются явно.
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` возвращаются собственные поля, как при `[{"*":true}]`. Пустой выбор `[{}]` возвращает объект без полей. Списки сохраняют структуру `{ data, total }`.
421
+ Без `scope` возвращаются скалярные поля, как при `[{"*":true}]`. Пустой выбор `[{}]` возвращает объект без полей. Списки сохраняют структуру `{ data, total }`.
318
422
 
319
- Аргументы доступны только у списков. В запросе отдельной записи и в ответе мутации их можно задать для вложенных списков. Параметры проверяются даже на пустых данных; ошибка в выборе ответа отменяет изменения записи. Некорректный `scope` возвращает `400`. Максимальная длина JSON — 10 000 символов, глубина выбора — 32 уровня.
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: { path: './generated/openapi.yaml' },
423
- graphql: { path: './generated/schema.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` после экспорта запускает сервер. Форматы определяются наличием секций. Для каждого выбранного формата обязателен свой `path`. Если секций нет, отсутствует путь или генерация завершилась ошибкой, команда возвращает ошибку и сервер не запускается.
536
+ `--generate-only` экспортирует и завершает работу, `--generate` после экспорта запускает сервер. Форматы определяются наличием секций. Для каждого выбранного формата обязателен свой `target`. Если секций нет, отсутствует `target` или генерация завершилась ошибкой, команда возвращает ошибку и сервер не запускается.
433
537
 
434
- Для экспорта читается только схема. База, пользователи auth и файловое хранилище не открываются; параметры конфигурации всё равно проверяются. Схема загружается один раз, в том числе при экспорте с последующим запуском. Перед записью проверяются пути и строятся все выбранные форматы. Нельзя перезаписать конфигурацию, базу, схему, пользователей, счётчики или метаданные файлов. Ошибка записи на диск может оставить уже сохранённый файл другого формата.
538
+ Экспорт не открывает базу, учётные записи и файлы. Перед записью проверяются все выбранные `target`; они не могут совпадать с конфигурацией, базой, схемой, пользователями, счётчиками или метаданными файлов.
435
539
 
436
540
  ## Аутентификация
437
541
 
@@ -487,7 +591,7 @@ export default {
487
591
  };
488
592
  ```
489
593
 
490
- Учётные записи auth хранятся отдельно от коллекций базы. При `storage: 'file'` регистрация, смена пароля и статуса сохраняются в файл `auth.source` через `lowdb`. При `'memory'` изменения остаются во внутренней копии и исчезают после перезапуска; исходный массив не меняется. Ошибка записи файла отменяет изменение и сохраняет действующие сессии. Файл читается при запуске; после ручного редактирования перезапустите сервер.
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
- OpenAPI описывает все маршруты auth и требования Bearer-токена. В Swagger UI токен из ответа на вход можно вставить в **Authorize**. Для экспорта схем включите auth в конфигурации и выполните `npx deep-json-server server.config.js --generate-only`; файл учётных записей при генерации не читается. Методы auth доступны через REST. В GraphQL тот же токен проверяется при изменении записей. Для GraphQL и OpenAPI нужна `database.schema`.
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', metadata: './files.json' },
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>`. Метаданные содержат `directory`, `mimeType` и `name`; размер сервер читает из файла, а URL формирует сам. Директории и файл метаданных создаются по мере необходимости.
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 }` добавляет поля владельца; OpenAPI также описывает маршруты auth и требования токена. `hashPassword()` доступна и через общий импорт пакета.
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
- Для публикации новой альфы обновите версию в `package.json`, `package-lock.json` и `src/core/constants.ts`, затем отправьте изменения в `main`. GitHub Actions создаст тег версии и опубликует пакет в канал npm `alpha` через trusted publishing. Уже опубликованная версия пропускается. Если тег создан, а публикация не завершилась, повторный запуск использует этот тег и проверяет соответствие ему файлов пакета. Отправка тега версии также запускает публикацию; стабильные версии публикуются в `latest`.
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.
@@ -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 paths.`;
24
+ Generate flags are mutually exclusive and require output targets.`;
24
25
  /** Проверяет все назначения, строит обе схемы и только затем сохраняет файлы.
25
- * @example Секции openapi и graphql с path → два файла; нет path → ошибка до записи.
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 path = config[format].path;
35
- if (!path)
36
- throw new Error(`Укажите config.${format}.path`);
37
- outputs.push(path);
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?.path) {
54
- await writeOpenapi(openapi, config.openapi.path);
55
- process.stdout.write(`OpenAPI: ${config.openapi.path}\n`);
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?.path) {
58
- await writeGraphql(graphql, config.graphql.path);
59
- process.stdout.write(`GraphQL: ${config.graphql.path}\n`);
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":"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"}
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-alpha.9";
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-alpha.9';
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,eAAe,CAAC"}
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 Predicate } from './query/filter.js';
6
- import { type ListOptions } from './query/options.js';
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 interface PreparedList {
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;