@kollors/deep-json-server 1.0.0-beta.6 → 1.0.0-rc.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 (37) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/MIGRATION.md +41 -0
  3. package/README.md +25 -23
  4. package/README.ru.md +39 -37
  5. package/dist/src/cli/index.js +6 -6
  6. package/dist/src/cli/index.js.map +1 -1
  7. package/dist/src/core/config-values.js +4 -4
  8. package/dist/src/core/config-values.js.map +1 -1
  9. package/dist/src/core/constants.d.ts +1 -1
  10. package/dist/src/core/constants.js +1 -1
  11. package/dist/src/core/constants.js.map +1 -1
  12. package/dist/src/core/database.js +16 -16
  13. package/dist/src/core/database.js.map +1 -1
  14. package/dist/src/core/utils.js +2 -2
  15. package/dist/src/core/utils.js.map +1 -1
  16. package/dist/src/files/contract.js +8 -8
  17. package/dist/src/files/contract.js.map +1 -1
  18. package/dist/src/files/disk-metadata.js +3 -3
  19. package/dist/src/files/disk-metadata.js.map +1 -1
  20. package/dist/src/files/disk-paths.js +6 -6
  21. package/dist/src/files/disk-paths.js.map +1 -1
  22. package/dist/src/files/disk-store.js +10 -10
  23. package/dist/src/files/disk-store.js.map +1 -1
  24. package/dist/src/files/memory-store.js +8 -8
  25. package/dist/src/files/memory-store.js.map +1 -1
  26. package/dist/src/files/routes.js +9 -9
  27. package/dist/src/files/routes.js.map +1 -1
  28. package/dist/src/files/streams.js +1 -1
  29. package/dist/src/files/streams.js.map +1 -1
  30. package/dist/src/server/config.js +2 -2
  31. package/dist/src/server/config.js.map +1 -1
  32. package/dist/src/server/http.js +1 -1
  33. package/dist/src/server/http.js.map +1 -1
  34. package/examples/database.json +99 -0
  35. package/examples/schema.json +153 -0
  36. package/examples/server.config.js +8 -0
  37. package/package.json +5 -2
package/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+
3
+ ## 1.0.0-rc.1
4
+
5
+ First release candidate for the 1.0 API. This release includes schema-driven REST, GraphQL, OpenAPI export, authentication, record ownership, timestamps, soft deletion, and file storage. It also makes CLI and API error messages consistently English and checks TypeScript declarations from an installed package archive.
6
+
7
+ The 1.0 configuration, CLI flags, and REST query format differ from 0.9.0. Follow the [migration guide](MIGRATION.md) before upgrading an existing project. In particular, the REST `scope` wildcard includes scalar fields only; select arrays, objects, relations, and relation keys explicitly.
8
+
9
+ ### Verification
10
+
11
+ - TypeScript source and contract checks, lint, and coverage-gated tests.
12
+ - Package installation smoke test for the CLI, REST, GraphQL, OpenAPI, and auth.
13
+ - TypeScript consumer test against the installed package declarations.
14
+ - CI matrix for Node.js 22, 24, and 26 on Linux.
package/MIGRATION.md ADDED
@@ -0,0 +1,41 @@
1
+ # Migrating from 0.9.0 to 1.0.0-rc.1
2
+
3
+ Version 1.0 changes configuration and request syntax. Update the server configuration and client requests together. Back up any file database, auth records, and file metadata before changing the running server.
4
+
5
+ ## Configuration
6
+
7
+ Declare a storage mode and use `source` for each enabled component:
8
+
9
+ | 0.9.0 | 1.0.0-rc.1 |
10
+ |---|---|
11
+ | `database.path` | `storage: 'file'`, `database.source` |
12
+ | `database.data` | `storage: 'memory'`, `database.source` |
13
+ | `files.directory` | `files.source` in file mode |
14
+ | `files.data` | `files.source` in memory mode |
15
+ | `openapi.path` | `openapi.target` |
16
+
17
+ The `storage` mode applies to the database, schema, auth records, files, and package metadata. GraphQL and OpenAPI require a model schema and `package.source`. The schema format has changed: define models under `models`, with a `collection`, fields, and one primary key per model. Start with the [current schema example](examples/schema.json), then validate your existing records against it. The [configuration example](examples/server.config.js) shows all required paths.
18
+
19
+ ## CLI
20
+
21
+ Adding a `files`, `graphql`, or `openapi` section enables that feature. The old `--files`, `--openapi`, and `--openapi-only` flags are gone. Use `--generate` to export configured schemas and start the server, or `--generate-only` to export and exit. Each exported format needs a `target` path.
22
+
23
+ ## REST queries
24
+
25
+ REST now accepts a JSON `scope` query parameter. Replace `_where`, `_sort`, `_page`, `_perPage`, `_embed`, and simple field filters with `scope`. For example:
26
+
27
+ ```js
28
+ const scope = [
29
+ { id: true, title: true, publishers: [{ id: true, name: true }] },
30
+ { where: { title: { contains: 'Ardenia' } }, order: [{ field: 'title', direction: 'ASC' }], pager: { page: 1, pageSize: 10 } },
31
+ ];
32
+ const url = `/movies?${new URLSearchParams({ scope: JSON.stringify(scope) })}`;
33
+ ```
34
+
35
+ Without an explicit `scope`, the response contains scalar fields only. `"*": true` also selects only scalar fields that do not store relation keys. Select arrays, objects, relations, and relation keys explicitly. Related lists can have their own filters, order, and pagination. Review clients that expect embedded relations or relation keys in default responses.
36
+
37
+ ## Records and auth
38
+
39
+ Explicit models validate fields and relations more strictly than the 0.9 schemaless server. Existing records with undeclared fields or dangling direct relation keys may fail validation at startup or on write. Test the migrated database before replacing the production file.
40
+
41
+ Authentication is optional and enabled by an `auth` section. When enabled, creating records requires login; changing existing records requires ownership or administrator access. Record timestamps and soft deletion are configured in the model schema. The [README](README.md) describes the current behavior and API endpoints.
package/README.md CHANGED
@@ -2,17 +2,19 @@
2
2
 
3
3
  [Русский](README.ru.md)
4
4
 
5
+ [Release notes](CHANGELOG.md) · [Migration from 0.9.0](MIGRATION.md)
6
+
5
7
  A JSON mock server with REST, GraphQL, related records, file uploads and schema exports. Supports user login, owner and administrator permissions, record timestamps and soft deletion. Requires Node.js 22 or newer.
6
8
 
7
- **Breaking changes: 1.0.0-beta.2.** The REST `scope` wildcard selects only scalar fields that do not store relation keys. Arrays, objects, relations and their keys must be selected explicitly. With auth enabled, record permissions are available through the virtual `actions` field.
9
+ **Breaking changes in 1.0.0.** See the [migration guide](MIGRATION.md) when upgrading from 0.9.0. The REST `scope` wildcard selects only scalar fields that do not store relation keys. Arrays, objects, relations and their keys must be selected explicitly. With auth enabled, record permissions are available through the virtual `actions` field.
8
10
 
9
11
  ## Installation
10
12
 
11
13
  ```sh
12
- npm install @kollors/deep-json-server@beta
14
+ npm install @kollors/deep-json-server@rc
13
15
  ```
14
16
 
15
- To install a specific version, use `@1.0.0-beta.6`.
17
+ To install this release candidate, use `@1.0.0-rc.1`.
16
18
 
17
19
  ## Quick start
18
20
 
@@ -23,7 +25,7 @@ Create two files in the same directory.
23
25
  ```json
24
26
  {
25
27
  "users": [
26
- { "id": "1", "fullName": "Мира Волкова" }
28
+ { "id": "1", "fullName": "Mira Volkova" }
27
29
  ]
28
30
  }
29
31
  ```
@@ -44,7 +46,7 @@ Add a [model schema](#model-schema) to define relations and validation. See [que
44
46
 
45
47
  ## Configuration
46
48
 
47
- With `storage: 'file'`, all sources and the schema are paths. With `'memory'`, they are in-memory data. Modes cannot be mixed. The presence of `auth`, `files`, `graphql` and `openapi` enables those modules. `graphql: {}` and `openapi: {}` enable only the HTTP endpoints at their defaults; add `target` to export a schema.
49
+ With `storage: 'file'`, provide paths for every source and the schema. With `'memory'`, provide data directly. Use the same mode throughout the configuration. Add `auth`, `files`, `graphql` or `openapi` to enable those features. `graphql: {}` and `openapi: {}` expose HTTP endpoints at their default paths; add `target` to export a schema.
48
50
 
49
51
  ```js
50
52
  export default {
@@ -225,37 +227,37 @@ Cascading deletion runs as one operation, including cyclic relations. A validati
225
227
  {
226
228
  "id": "1",
227
229
  "isArchived": false,
228
- "name": "Ардения"
230
+ "name": "Ardenia"
229
231
  },
230
232
  {
231
233
  "id": "2",
232
234
  "isArchived": false,
233
- "name": "Велория"
235
+ "name": "Veloria"
234
236
  }
235
237
  ],
236
238
  "genres": [
237
239
  {
238
240
  "id": "1",
239
241
  "isArchived": false,
240
- "name": "Криминал",
242
+ "name": "Crime",
241
243
  "parentIds": []
242
244
  },
243
245
  {
244
246
  "id": "2",
245
247
  "isArchived": false,
246
- "name": "Гангстер",
248
+ "name": "Gangster",
247
249
  "parentIds": ["1"]
248
250
  },
249
251
  {
250
252
  "id": "3",
251
253
  "isArchived": false,
252
- "name": "Драма",
254
+ "name": "Drama",
253
255
  "parentIds": []
254
256
  },
255
257
  {
256
258
  "id": "4",
257
259
  "isArchived": false,
258
- "name": "Комедия",
260
+ "name": "Comedy",
259
261
  "parentIds": []
260
262
  }
261
263
  ],
@@ -274,20 +276,20 @@ Cascading deletion runs as one operation, including cyclic relations. A validati
274
276
  }
275
277
  ],
276
278
  "coverSrc": "https://example.com/covers/shadows-of-ardenia.jpg",
277
- "description": "Наследница портового города раскрывает заговор двух соперничающих семей.",
279
+ "description": "An heiress in a port city uncovers a plot involving two rival families.",
278
280
  "id": "1",
279
281
  "isArchived": false,
280
282
  "publisherIds": ["2"],
281
- "title": "Тени Ардении"
283
+ "title": "Shadows of Ardenia"
282
284
  },
283
285
  {
284
286
  "actors": [],
285
287
  "coverSrc": "https://example.com/covers/northern-star.jpg",
286
- "description": "Ночной администратор старого отеля случайно становится участником поисков пропавшей картины.",
288
+ "description": "A night clerk at an old hotel gets drawn into the search for a missing painting.",
287
289
  "id": "2",
288
290
  "isArchived": false,
289
291
  "publisherIds": ["1"],
290
- "title": "Полночь в «Северной звезде»"
292
+ "title": "Midnight at the Northern Star"
291
293
  }
292
294
  ],
293
295
  "publishers": [
@@ -306,14 +308,14 @@ Cascading deletion runs as one operation, including cyclic relations. A validati
306
308
  {
307
309
  "bornAt": "1988-03-14",
308
310
  "countryId": "1",
309
- "fullName": "Мира Волкова",
311
+ "fullName": "Mira Volkova",
310
312
  "id": "1",
311
313
  "isArchived": false
312
314
  },
313
315
  {
314
316
  "bornAt": "1991-11-02",
315
317
  "countryId": "2",
316
- "fullName": "Леон Ветров",
318
+ "fullName": "Leon Vetrov",
317
319
  "id": "2",
318
320
  "isArchived": false
319
321
  }
@@ -393,7 +395,7 @@ const scope = [
393
395
  ],
394
396
  },
395
397
  {
396
- where: { fullName: { contains: 'Мира' } },
398
+ where: { fullName: { contains: 'Mira' } },
397
399
  order: [{ field: 'fullName', direction: 'ASC' }],
398
400
  pager: { page: 1, pageSize: 20 },
399
401
  },
@@ -468,7 +470,7 @@ Use either the relation field or its storage key in an object, for example `genr
468
470
  }
469
471
  ```
470
472
 
471
- The server neither gives one field priority nor merges the values; the entire operation is rolled back. Relation fields accept objects only; use `genreIds` to change links without creating or updating related records. Reverse relations update the target key. If a target path crosses an array and the server cannot identify one element to attach, provide the array with the intended keys explicitly. Protected keys cannot be changed.
473
+ The server rejects both fields together and rolls back the operation. Relation fields accept objects only; use `genreIds` to change links without creating or updating related records. Reverse relations update the target key. If a target path crosses an array and the server cannot identify one element to attach, provide the array with the intended keys explicitly. Protected keys cannot be changed.
472
474
 
473
475
  All nested changes belong to the main record's transaction. A validation error, missing record or invalid response selection rolls back the entire operation. Updating a shared record affects every record linked to it.
474
476
 
@@ -500,7 +502,7 @@ Send requests to `/graphql` using POST with `Content-Type: application/json` and
500
502
  ```graphql
501
503
  query {
502
504
  userList(
503
- where: { fullName: { contains: "Мира" } }
505
+ where: { fullName: { contains: "Mira" } }
504
506
  order: [{ field: fullName, direction: ASC }]
505
507
  pager: { page: 1, pageSize: 20 }
506
508
  ) {
@@ -509,7 +511,7 @@ query {
509
511
  id
510
512
  fullName
511
513
  movies(
512
- where: { title: { contains: "Тени" } }
514
+ where: { title: { contains: "Shadows" } }
513
515
  order: [{ field: title, direction: ASC }]
514
516
  pager: { pageSize: 5 }
515
517
  ) {
@@ -836,14 +838,14 @@ Updates run sequentially within one server instance and are validated on a copy
836
838
 
837
839
  ## Development
838
840
 
839
- Source modules: `rest`, `graphql`, `openapi`, `auth`, `files`, `cli` and `server`. Shared models, storage, queries and mutation rules live in `core`. `server` connects the modules; API generators load independently of the HTTP runtime.
841
+ The source code is organized into `rest`, `graphql`, `openapi`, `auth`, `files`, `cli` and `server`. Shared models, storage, queries and mutation rules live in `core`. The `server` module connects them; API generators load independently of the HTTP runtime.
840
842
 
841
843
  ```sh
842
844
  npm ci
843
845
  npm run verify
844
846
  ```
845
847
 
846
- The command checks types, code style, test coverage and installation from the package archive.
848
+ `npm run verify` checks types, code style, test coverage and installation from the package archive.
847
849
 
848
850
  To publish a prerelease, update the version in `package.json`, `package-lock.json` and `src/core/constants.ts`, then push the commit to `main`. GitHub Actions creates its `v<version>` tag and publishes through trusted publishing to the `alpha`, `beta` or `rc` channel. Stable versions publish to `latest` from an explicitly pushed version tag.
849
851
 
package/README.ru.md CHANGED
@@ -2,17 +2,19 @@
2
2
 
3
3
  [English](README.md)
4
4
 
5
- JSON-сервер для имитации API: REST, GraphQL, связанные записи, загрузка файлов и экспорт схем. Поддерживает вход пользователей, права владельца и администратора, даты записей и мягкое удаление. Требуется Node.js 22 или новее.
5
+ [История выпусков](CHANGELOG.md) · [Переход с 0.9.0](MIGRATION.md)
6
6
 
7
- **Breaking changes: 1.0.0-beta.2.** `*` в REST `scope` выбирает только скалярные поля, которые не хранят ключи связей. Массивы, объекты, связи и их ключи указываются явно. При включённом auth права на запись доступны через виртуальное поле `actions`.
7
+ JSON-сервер для создания тестового API с REST, GraphQL, связями между записями, загрузкой файлов и экспортом схем. Поддерживает вход пользователей, права владельца и администратора, даты записей и мягкое удаление. Требуется Node.js 22 или новее.
8
+
9
+ **Изменения в 1.0.0, нарушающие совместимость.** При переходе с 0.9.0 воспользуйтесь [инструкцией по миграции](MIGRATION.md). `*` в REST `scope` выбирает только скалярные поля, которые не хранят ключи связей. Массивы, объекты, связи и их ключи нужно указывать явно. При включённой аутентификации права на запись доступны через виртуальное поле `actions`.
8
10
 
9
11
  ## Установка
10
12
 
11
13
  ```sh
12
- npm install @kollors/deep-json-server@beta
14
+ npm install @kollors/deep-json-server@rc
13
15
  ```
14
16
 
15
- Для установки конкретной версии укажите `@1.0.0-beta.6`.
17
+ Для установки этого релиз-кандидата укажите `@1.0.0-rc.1`.
16
18
 
17
19
  ## Быстрый старт
18
20
 
@@ -23,7 +25,7 @@ npm install @kollors/deep-json-server@beta
23
25
  ```json
24
26
  {
25
27
  "users": [
26
- { "id": "1", "fullName": "Мира Волкова" }
28
+ { "id": "1", "fullName": "Mira Volkova" }
27
29
  ]
28
30
  }
29
31
  ```
@@ -44,7 +46,7 @@ npx deep-json-server server.config.js
44
46
 
45
47
  ## Конфигурация
46
48
 
47
- При `storage: 'file'` все источники и схема задаются путями, при `'memory'` — данными в памяти. Режимы нельзя смешивать. Наличие секций `auth`, `files`, `graphql` и `openapi` включает соответствующие модули. `graphql: {}` и `openapi: {}` включают только HTTP-маршруты со стандартными адресами; для экспорта добавьте `target`.
49
+ При `storage: 'file'` задайте пути для всех источников и схемы, при `'memory'` — передайте данные напрямую. Используйте один режим во всей конфигурации. Секции `auth`, `files`, `graphql` и `openapi` включают соответствующие возможности. `graphql: {}` и `openapi: {}` открывают HTTP-маршруты по стандартным адресам; для экспорта схемы добавьте `target`.
48
50
 
49
51
  ```js
50
52
  export default {
@@ -78,7 +80,7 @@ export default {
78
80
  | `server.cors`, `server.logger` | По умолчанию `true`; logger принимает также настройки Fastify |
79
81
  | `server.maxFileSize` | По умолчанию 100 МиБ |
80
82
 
81
- `package.source` подчиняется режиму хранения. При `storage: 'file'` укажите путь к `package.json`. При `storage: 'memory'` передайте метаданные напрямую: `{ name: 'example-api', version: '1.0.0', description: 'Example API' }`; `name` и `version` обязательны, `description` необязателен.
83
+ Формат `package.source` зависит от режима хранения. При `storage: 'file'` укажите путь к `package.json`. При `storage: 'memory'` передайте метаданные напрямую: `{ name: 'example-api', version: '1.0.0', description: 'Example API' }`; `name` и `version` обязательны, `description` необязателен.
82
84
 
83
85
  Относительные пути разрешаются от каталога файла конфигурации; при вызове `createServer(config)` — от рабочего каталога. Данные в памяти, включая схему и метаданные пакета, копируются. Порт `0` позволяет системе выбрать свободный порт.
84
86
 
@@ -225,37 +227,37 @@ REST без схемы создаёт ключ `id` и сохраняет про
225
227
  {
226
228
  "id": "1",
227
229
  "isArchived": false,
228
- "name": "Ардения"
230
+ "name": "Ardenia"
229
231
  },
230
232
  {
231
233
  "id": "2",
232
234
  "isArchived": false,
233
- "name": "Велория"
235
+ "name": "Veloria"
234
236
  }
235
237
  ],
236
238
  "genres": [
237
239
  {
238
240
  "id": "1",
239
241
  "isArchived": false,
240
- "name": "Криминал",
242
+ "name": "Crime",
241
243
  "parentIds": []
242
244
  },
243
245
  {
244
246
  "id": "2",
245
247
  "isArchived": false,
246
- "name": "Гангстер",
248
+ "name": "Gangster",
247
249
  "parentIds": ["1"]
248
250
  },
249
251
  {
250
252
  "id": "3",
251
253
  "isArchived": false,
252
- "name": "Драма",
254
+ "name": "Drama",
253
255
  "parentIds": []
254
256
  },
255
257
  {
256
258
  "id": "4",
257
259
  "isArchived": false,
258
- "name": "Комедия",
260
+ "name": "Comedy",
259
261
  "parentIds": []
260
262
  }
261
263
  ],
@@ -274,20 +276,20 @@ REST без схемы создаёт ключ `id` и сохраняет про
274
276
  }
275
277
  ],
276
278
  "coverSrc": "https://example.com/covers/shadows-of-ardenia.jpg",
277
- "description": "Наследница портового города раскрывает заговор двух соперничающих семей.",
279
+ "description": "An heiress in a port city uncovers a plot involving two rival families.",
278
280
  "id": "1",
279
281
  "isArchived": false,
280
282
  "publisherIds": ["2"],
281
- "title": "Тени Ардении"
283
+ "title": "Shadows of Ardenia"
282
284
  },
283
285
  {
284
286
  "actors": [],
285
287
  "coverSrc": "https://example.com/covers/northern-star.jpg",
286
- "description": "Ночной администратор старого отеля случайно становится участником поисков пропавшей картины.",
288
+ "description": "A night clerk at an old hotel gets drawn into the search for a missing painting.",
287
289
  "id": "2",
288
290
  "isArchived": false,
289
291
  "publisherIds": ["1"],
290
- "title": "Полночь в «Северной звезде»"
292
+ "title": "Midnight at the Northern Star"
291
293
  }
292
294
  ],
293
295
  "publishers": [
@@ -306,14 +308,14 @@ REST без схемы создаёт ключ `id` и сохраняет про
306
308
  {
307
309
  "bornAt": "1988-03-14",
308
310
  "countryId": "1",
309
- "fullName": "Мира Волкова",
311
+ "fullName": "Mira Volkova",
310
312
  "id": "1",
311
313
  "isArchived": false
312
314
  },
313
315
  {
314
316
  "bornAt": "1991-11-02",
315
317
  "countryId": "2",
316
- "fullName": "Леон Ветров",
318
+ "fullName": "Leon Vetrov",
317
319
  "id": "2",
318
320
  "isArchived": false
319
321
  }
@@ -374,11 +376,11 @@ npx deep-json-server examples/server.config.js
374
376
 
375
377
  Имя параметра пути соответствует первичному ключу. POST, PUT и PATCH принимают JSON-объект записи. PUT заменяет запись с сохранением ключа и серверных полей. PATCH объединяет поля на верхнем уровне; переданные вложенные объекты заменяются с сохранением их полей `readOnly`. Создание и замена требуют всех обязательных полей. При обновлении проверяются переданные значения и итоговая запись. Отсутствующая запись — `404`, конфликт — `409`.
376
378
 
377
- POST возвращает созданную запись со статусом `201`; PUT, PATCH и DELETE — результат со статусом `200`. Ошибки REST имеют вид `{ "error": "Описание ошибки" }`.
379
+ POST возвращает созданную запись со статусом `201`; PUT, PATCH и DELETE — результат со статусом `200`. Ошибки REST имеют вид `{ "error": "Error description" }`.
378
380
 
379
381
  ### Параметры REST-запросов
380
382
 
381
- Для запросов к записям REST принимает один параметр URL `scope` с JSON-массивом `[поля, аргументы?]`. Первый объект выбирает поля, второй задаёт `where`, `order` и `pager` для списка. Этот формат одинаков для корневого запроса, вложенных объектов и связей.
383
+ Для запросов к записям REST принимает один параметр URL `scope` с JSON-массивом `[fields, arguments?]`. Первый объект выбирает поля, второй задаёт `where`, `order` и `pager` для списка. Этот формат одинаков для корневого запроса, вложенных объектов и связей.
382
384
 
383
385
  Пример выбора пользователей и их фильмов с отдельной сортировкой и пагинацией:
384
386
 
@@ -393,7 +395,7 @@ const scope = [
393
395
  ],
394
396
  },
395
397
  {
396
- where: { fullName: { contains: 'Мира' } },
398
+ where: { fullName: { contains: 'Mira' } },
397
399
  order: [{ field: 'fullName', direction: 'ASC' }],
398
400
  pager: { page: 1, pageSize: 20 },
399
401
  },
@@ -441,8 +443,8 @@ Content-Type: application/json
441
443
  "userId": "1",
442
444
  "genres": [
443
445
  { "id": "1" },
444
- { "id": "2", "name": "Обновлённый жанр" },
445
- { "name": "Новый жанр" }
446
+ { "id": "2", "name": "Updated genre" },
447
+ { "name": "New genre" }
446
448
  ]
447
449
  }
448
450
  ]
@@ -479,7 +481,7 @@ mutation {
479
481
  movieUpdate(id: "1", data: {
480
482
  actors: [{
481
483
  userId: "1"
482
- genres: [{ id: "2", name: "Обновлённый жанр" }, { name: "Новый жанр" }]
484
+ genres: [{ id: "2", name: "Updated genre" }, { name: "New genre" }]
483
485
  }]
484
486
  }) {
485
487
  actors { data { genres { data { id name } } } }
@@ -500,7 +502,7 @@ npx deep-json-server server.config.js
500
502
  ```graphql
501
503
  query {
502
504
  userList(
503
- where: { fullName: { contains: "Мира" } }
505
+ where: { fullName: { contains: "Mira" } }
504
506
  order: [{ field: fullName, direction: ASC }]
505
507
  pager: { page: 1, pageSize: 20 }
506
508
  ) {
@@ -509,7 +511,7 @@ query {
509
511
  id
510
512
  fullName
511
513
  movies(
512
- where: { title: { contains: "Тени" } }
514
+ where: { title: { contains: "Shadows" } }
513
515
  order: [{ field: title, direction: ASC }]
514
516
  pager: { pageSize: 5 }
515
517
  ) {
@@ -717,7 +719,7 @@ OpenAPI описывает маршруты auth, необязательную B
717
719
 
718
720
  При включённом auth создавать записи может любой вошедший пользователь. Изменять, удалять и восстанавливать — владелец по `createdById` или пользователь с `isAdmin: true`. Записи без владельца изменяет только администратор. Его правки не меняют владельца. Правила действуют на вложенные записи, изменение ключей связей, каскады и восстановление. Ссылка на существующую запись без её изменения не требует владения ею. Каждая мутация атомарна: отказ сохраняет прежнее состояние всех затронутых записей.
719
721
 
720
- REST возвращает 401 при отсутствии действительного токена и 403 при недостатке прав. GraphQL проверяет мутации по тем же правилам и возвращает коды `UNAUTHENTICATED` или `FORBIDDEN`; токен получают через REST-вход и передают в `Authorization: Bearer <токен>`. GraphQL-запросы чтения, OPTIONS и все операции с файлами остаются открытыми.
722
+ REST возвращает 401 при отсутствии действительного токена и 403 при недостатке прав. GraphQL проверяет мутации по тем же правилам и возвращает коды `UNAUTHENTICATED` или `FORBIDDEN`; токен получают через REST-вход и передают в `Authorization: Bearer <token>`. GraphQL-запросы чтения, OPTIONS и все операции с файлами остаются открытыми.
721
723
 
722
724
  ## Файлы
723
725
 
@@ -769,13 +771,13 @@ Content-Type: image/jpeg
769
771
  Сочетание `directory` и `name` идентифицирует файл. Повторная загрузка по существующему пути возвращает `409`. Чтобы заменить файл, передайте `Content-Override: true`; успешная перезапись возвращает `200`. Сервер поддерживает следующие файловые маршруты:
770
772
 
771
773
  ```text
772
- POST /_files/storage Загрузка или перезапись файла
773
- GET /_files/storage/* Просмотр содержимого файла
774
- PATCH /_files/storage/* Переименование или перемещение файла
775
- DELETE /_files/storage/* Удаление файла
774
+ POST /_files/storage Upload or replace a file
775
+ GET /_files/storage/* Return file contents inline
776
+ PATCH /_files/storage/* Rename or move a file
777
+ DELETE /_files/storage/* Delete a file
776
778
 
777
- GET /_files/metadata/* Получение метаданных в JSON
778
- GET /_files/download/* Скачивание файла
779
+ GET /_files/metadata/* Return file metadata as JSON
780
+ GET /_files/download/* Download a file as an attachment
779
781
  ```
780
782
 
781
783
  Для переименования, перемещения либо обеих операций отправьте JSON-объект. Нужно указать хотя бы одно поле:
@@ -832,7 +834,7 @@ await writeGraphql(sdl, './generated/schema.graphql');
832
834
 
833
835
  ## Хранение данных
834
836
 
835
- Изменения выполняются последовательно внутри экземпляра сервера и проверяются на копии данных до сохранения. Для одного файла базы используйте один процесс сервера. Счётчики `increment` хранятся рядом с базой в `<путь базы>.counters.json`; сохраняйте этот файл вместе с базой. Номера резервируются до записи данных: сбой может оставить пропуск, но не приводит к повторной выдаче номера.
837
+ Изменения выполняются последовательно внутри экземпляра сервера и проверяются на копии данных до сохранения. Для одного файла базы используйте один процесс сервера. Счётчики `increment` хранятся рядом с базой в `<database path>.counters.json`; сохраняйте этот файл вместе с базой. Номера резервируются до записи данных: сбой может оставить пропуск, но не приводит к повторной выдаче номера.
836
838
 
837
839
  ## Разработка
838
840
 
@@ -843,8 +845,8 @@ npm ci
843
845
  npm run verify
844
846
  ```
845
847
 
846
- Команда проверяет типы, стиль кода, покрытие тестами и установку пакета из архива.
848
+ `npm run verify` проверяет типы, стиль кода, покрытие тестами и установку пакета из архива.
847
849
 
848
- Для публикации предварительной версии обновите номер в `package.json`, `package-lock.json` и `src/core/constants.ts`, затем отправьте коммит в `main`. GitHub Actions создаст тег `v<версия>` и опубликует пакет через trusted publishing в канал `alpha`, `beta` или `rc`. Стабильные версии публикуются в `latest` из явно отправленного тега версии.
850
+ Для публикации предварительной версии обновите номер в `package.json`, `package-lock.json` и `src/core/constants.ts`, затем отправьте коммит в `main`. GitHub Actions создаст тег `v<version>` и опубликует пакет через trusted publishing в канал `alpha`, `beta` или `rc`. Стабильные версии публикуются в `latest` из явно отправленного тега версии.
849
851
 
850
852
  Лицензия: MIT.
@@ -37,7 +37,7 @@ async function generate(config, source, directory, sourcePath, openapiInfo) {
37
37
  continue;
38
38
  const target = config[format].target;
39
39
  if (!target)
40
- throw new Error(`Укажите config.${format}.target`);
40
+ throw new Error(`Provide config.${format}.target`);
41
41
  outputs.push(target);
42
42
  }
43
43
  await validateExportPaths(outputs, inputPaths(source, directory, sourcePath));
@@ -80,12 +80,12 @@ export async function runCli(args = process.argv.slice(2), services = { createSe
80
80
  continue;
81
81
  }
82
82
  if (!['--generate', '--generate-only', '--host', '--port'].includes(arg) || seen.has(arg))
83
- throw new Error(`Неизвестный параметр или повтор: ${arg}`);
83
+ throw new Error(`Unknown or duplicate option: ${arg}`);
84
84
  seen.add(arg);
85
85
  if (arg === '--host' || arg === '--port') {
86
86
  const value = args[++index];
87
87
  if (!value || value.startsWith('-'))
88
- throw new Error(`Укажите значение ${arg}`);
88
+ throw new Error(`Provide a value for ${arg}`);
89
89
  if (arg === '--host')
90
90
  host = value;
91
91
  else {
@@ -98,12 +98,12 @@ export async function runCli(args = process.argv.slice(2), services = { createSe
98
98
  if (seen.has('--generate') && seen.has('--generate-only'))
99
99
  throw new Error('--generate and --generate-only are mutually exclusive');
100
100
  if (!positional.length)
101
- throw new Error('Укажите путь к файлу конфигурации');
101
+ throw new Error('Provide a configuration file path');
102
102
  if (positional.length !== 1)
103
- throw new Error('Можно указать только один файл конфигурации');
103
+ throw new Error('Provide exactly one configuration file');
104
104
  const configPath = positional[0];
105
105
  if (configPath === undefined)
106
- throw new Error('Укажите путь к файлу конфигурации');
106
+ throw new Error('Provide a configuration file path');
107
107
  const source = await readConfigModule(configPath);
108
108
  const server = source.config.server ?? {};
109
109
  if (!isObject(server))
@@ -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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"}
@@ -5,7 +5,7 @@ export function getObject(value, path, required = false) {
5
5
  return undefined;
6
6
  }
7
7
  if (!isObject(value)) {
8
- throw new Error(`Ключ ${path} должен быть JSON-объектом`);
8
+ throw new Error(`${path} must be a JSON object`);
9
9
  }
10
10
  return value;
11
11
  }
@@ -14,7 +14,7 @@ export function getString(value, path, required = false) {
14
14
  return undefined;
15
15
  }
16
16
  if (typeof value !== 'string' || value.trim() === '') {
17
- throw new Error(`Ключ ${path} должен содержать непустую строку`);
17
+ throw new Error(`${path} must be a nonempty string`);
18
18
  }
19
19
  return value;
20
20
  }
@@ -26,7 +26,7 @@ export const getPositiveInteger = (value, path) => {
26
26
  return undefined;
27
27
  }
28
28
  if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1) {
29
- throw new Error(`Ключ ${path} должен быть положительным целым числом`);
29
+ throw new Error(`${path} must be a positive integer`);
30
30
  }
31
31
  return value;
32
32
  };
@@ -47,7 +47,7 @@ export function normalizeAddress(options) {
47
47
  const host = getString(options.host, 'config.server.host') ?? DEFAULT_HOST;
48
48
  const port = options.port ?? DEFAULT_PORT;
49
49
  if (!isPortNumber(port))
50
- throw new Error('Ключ config.server.port должен быть целым числом от 0 до 65535');
50
+ throw new Error('config.server.port must be an integer from 0 to 65535');
51
51
  return { host, port };
52
52
  }
53
53
  //# sourceMappingURL=config-values.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-values.js","sourceRoot":"","sources":["../../../src/core/config-values.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAOpD,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,IAAY,EAAE,QAAQ,GAAG,KAAK;IACtE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,IAAY,EAAE,QAAQ,GAAG,KAAK;IACtE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,mCAAmC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAE,IAAY,EAAsB,EAAE;IACrF,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,yCAAyC,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,IAAY;IACrD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2C;IAC1E,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,YAAY,CAAC;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC3G,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"config-values.js","sourceRoot":"","sources":["../../../src/core/config-values.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAOpD,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,IAAY,EAAE,QAAQ,GAAG,KAAK;IACtE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,IAAY,EAAE,QAAQ,GAAG,KAAK;IACtE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAE,IAAY,EAAsB,EAAE;IACrF,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,6BAA6B,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,IAAY;IACrD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2C;IAC1E,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,YAAY,CAAC;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAClG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -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-beta.6";
6
+ export declare const VERSION = "1.0.0-rc.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-beta.6';
6
+ export const VERSION = '1.0.0-rc.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,cAAc,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,YAAY,CAAC"}