@kollors/deep-json-server 1.0.0-beta.2 → 1.0.0-beta.4
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 +7 -3
- package/README.ru.md +7 -3
- package/dist/src/auth/password.js +1 -1
- package/dist/src/auth/password.js.map +1 -1
- package/dist/src/auth/service.d.ts +1 -1
- package/dist/src/auth/service.js +2 -2
- package/dist/src/auth/service.js.map +1 -1
- package/dist/src/cli/index.js +8 -2
- 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/database.d.ts +14 -10
- package/dist/src/core/database.js +41 -19
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/engine.d.ts +10 -8
- package/dist/src/core/engine.js +42 -30
- package/dist/src/core/engine.js.map +1 -1
- package/dist/src/core/lifecycle/mutation.d.ts +6 -6
- package/dist/src/core/lifecycle/mutation.js +36 -11
- package/dist/src/core/lifecycle/mutation.js.map +1 -1
- package/dist/src/core/lifecycle/options.d.ts +3 -3
- package/dist/src/core/lifecycle/options.js.map +1 -1
- package/dist/src/core/model/infer.d.ts +7 -0
- package/dist/src/core/model/infer.js +88 -0
- package/dist/src/core/model/infer.js.map +1 -0
- package/dist/src/core/model/load.d.ts +9 -0
- package/dist/src/core/model/load.js +224 -0
- package/dist/src/core/model/load.js.map +1 -0
- package/dist/src/core/model/policy.d.ts +15 -0
- package/dist/src/core/model/policy.js +29 -0
- package/dist/src/core/model/policy.js.map +1 -0
- package/dist/src/core/model/tree.d.ts +68 -0
- package/dist/src/core/model/tree.js +168 -0
- package/dist/src/core/model/tree.js.map +1 -0
- package/dist/src/core/model/types.d.ts +82 -0
- package/dist/src/core/model/types.js +2 -0
- package/dist/src/core/model/types.js.map +1 -0
- package/dist/src/core/model/validation.d.ts +24 -0
- package/dist/src/core/model/validation.js +99 -0
- package/dist/src/core/model/validation.js.map +1 -0
- package/dist/src/core/model.d.ts +6 -146
- package/dist/src/core/model.js +6 -534
- package/dist/src/core/model.js.map +1 -1
- package/dist/src/core/mutations/write.d.ts +34 -1
- package/dist/src/core/mutations/write.js +48 -13
- package/dist/src/core/mutations/write.js.map +1 -1
- package/dist/src/core/paths.d.ts +0 -8
- package/dist/src/core/paths.js +3 -19
- package/dist/src/core/paths.js.map +1 -1
- package/dist/src/core/query/contract.d.ts +1 -1
- package/dist/src/core/query/execute.d.ts +1 -1
- package/dist/src/core/query/execute.js +3 -3
- package/dist/src/core/query/execute.js.map +1 -1
- package/dist/src/core/query/filter.d.ts +1 -1
- package/dist/src/core/query/filter.js +6 -7
- package/dist/src/core/query/filter.js.map +1 -1
- package/dist/src/core/query/options.d.ts +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 +13 -13
- package/dist/src/core/records.js +5 -4
- package/dist/src/core/records.js.map +1 -1
- package/dist/src/core/relation-metadata.js +1 -1
- package/dist/src/core/relation-metadata.js.map +1 -1
- package/dist/src/core/schema.d.ts +33 -0
- package/dist/src/core/schema.js +2 -0
- package/dist/src/core/schema.js.map +1 -0
- package/dist/src/core/snapshot.d.ts +11 -0
- package/dist/src/core/snapshot.js +14 -0
- package/dist/src/core/snapshot.js.map +1 -0
- package/dist/src/core/types.d.ts +5 -0
- package/dist/src/core/utils.d.ts +4 -0
- package/dist/src/core/utils.js +8 -0
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/files/contract.js +3 -1
- package/dist/src/files/contract.js.map +1 -1
- package/dist/src/files/http.d.ts +46 -2
- package/dist/src/files/http.js.map +1 -1
- package/dist/src/graphql/entry.d.ts +2 -2
- package/dist/src/graphql/entry.js +2 -2
- package/dist/src/graphql/generate.js +1 -2
- package/dist/src/graphql/generate.js.map +1 -1
- package/dist/src/graphql/preflight.js +2 -1
- package/dist/src/graphql/preflight.js.map +1 -1
- package/dist/src/graphql/resolvers.js +6 -3
- package/dist/src/graphql/resolvers.js.map +1 -1
- package/dist/src/graphql/schema.d.ts +1 -1
- package/dist/src/graphql/schema.js +3 -3
- package/dist/src/graphql/schema.js.map +1 -1
- package/dist/src/openapi/auth.d.ts +2 -8
- package/dist/src/openapi/auth.js.map +1 -1
- package/dist/src/openapi/document.d.ts +2 -1
- package/dist/src/openapi/document.js +40 -22
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/entry.d.ts +2 -2
- package/dist/src/openapi/entry.js +2 -2
- package/dist/src/openapi/files.d.ts +2 -3
- package/dist/src/openapi/files.js.map +1 -1
- package/dist/src/openapi/helpers.d.ts +3 -16
- package/dist/src/openapi/helpers.js.map +1 -1
- package/dist/src/openapi/types.d.ts +50 -29
- package/dist/src/rest/options.d.ts +2 -2
- package/dist/src/rest/options.js +3 -3
- package/dist/src/rest/options.js.map +1 -1
- package/dist/src/rest/projection.d.ts +6 -3
- package/dist/src/rest/projection.js +17 -10
- package/dist/src/rest/projection.js.map +1 -1
- package/dist/src/rest/routes.js +6 -6
- package/dist/src/rest/routes.js.map +1 -1
- package/dist/src/server/bootstrap.js +1 -1
- package/dist/src/server/bootstrap.js.map +1 -1
- package/dist/src/server/config.d.ts +10 -6
- package/dist/src/server/config.js +39 -37
- package/dist/src/server/config.js.map +1 -1
- package/dist/src/server/http.d.ts +1 -1
- package/dist/src/server/http.js +4 -3
- package/dist/src/server/http.js.map +1 -1
- package/dist/src/server/input-paths.d.ts +8 -0
- package/dist/src/server/input-paths.js +19 -0
- package/dist/src/server/input-paths.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ A JSON mock server with REST, GraphQL, related records, file uploads and schema
|
|
|
12
12
|
npm install @kollors/deep-json-server@beta
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
To install a specific version, use `@1.0.0-beta.
|
|
15
|
+
To install a specific version, use `@1.0.0-beta.4`.
|
|
16
16
|
|
|
17
17
|
## Quick start
|
|
18
18
|
|
|
@@ -154,7 +154,7 @@ Model definitions belong in `models`. The schema root can define `api`, `timesta
|
|
|
154
154
|
|
|
155
155
|
Explicit schemas are strict: undeclared fields and collections are rejected, except storage keys inferred from relations. Existing data is validated on startup. Generation uses the model definitions.
|
|
156
156
|
|
|
157
|
-
Schemaless REST generates an `id` and preserves arbitrary JSON fields. Filters and individual field selections use identifier-style names. `scope=[{"*":true}]` returns top-level JSON scalars; arrays and objects must be selected by name. Fields with mixed value types can be read explicitly, but filtering, ordering and paging heterogeneous lists require an explicit schema.
|
|
157
|
+
Schemaless REST generates an `id` and preserves arbitrary JSON fields. Newly inferred relations are available to subsequent reads and writes without restarting the server. Filters and individual field selections use identifier-style names. `scope=[{"*":true}]` returns top-level JSON scalars; arrays and objects must be selected by name. Fields with mixed value types can be read explicitly, but filtering, ordering and paging heterogeneous lists require an explicit schema.
|
|
158
158
|
|
|
159
159
|
Each model requires `collection`, the database collection and REST path name, and `fields`, its field definitions. The model name (`User`) determines GraphQL type and operation names. `api` controls format availability; `timestamps` and `softDelete` override global settings for that model.
|
|
160
160
|
|
|
@@ -179,6 +179,8 @@ The `type` property accepts `string`, `number`, `boolean`, `object`, or a model
|
|
|
179
179
|
|
|
180
180
|
String and numeric constraints on `string[]`/`number[]` apply to every element. `required` and `nullable` apply to the entire array; `default` and `example` contain a complete array. Elements must match the array's type and be non-null. `required` requires the field to be present; an ordinary array may still be empty.
|
|
181
181
|
|
|
182
|
+
Each `enum` value must match the field type and its constraints. Use `nullable: true` to allow `null` for the field; do not include `null` in `enum`. Invalid values are rejected when the schema is loaded.
|
|
183
|
+
|
|
182
184
|
Each model requires exactly one primary key of type `string` or `number`, declared at the top level. The name is arbitrary: `id`, `username`, `code`. If `generated` is omitted, the client supplies the value on creation. Generated fields must be declared at the top level, are excluded from input types and cannot have `default`. Replacing a record preserves generated values and read-only fields, including nested objects. To protect fields inside an array, mark the entire array or its containing object as `readOnly`. Objects containing only server-managed fields are output-only.
|
|
183
185
|
|
|
184
186
|
For example, a `LocalUser` with primary key `username` and `password: {"type":"string","required":true,"writeOnly":true}` has `localUser(username: ...)` and `/localUsers/{username}`. A `writeOnly` field accepts input and is excluded from responses, `scope`, filters and ordering.
|
|
@@ -420,7 +422,7 @@ For example, select a movie's own fields, its actors' users and sorted genres:
|
|
|
420
422
|
|
|
421
423
|
Omitting `scope` returns scalar fields, as with `[{"*":true}]`. An empty selection `[{}]` returns an object without fields. Lists retain the `{ data, total }` response structure.
|
|
422
424
|
|
|
423
|
-
Arguments are available only on lists. A list can instead use `{ "union": [scope, ...] }`: each part is a normal list scope, parts run in array order, and the first record for each primary key is kept.
|
|
425
|
+
Arguments are available only on lists. A list can instead use `{ "union": [scope, ...] }`: each part is a normal list scope, parts run in array order, and the first record for each primary key is kept. For embedded object arrays without primary keys, each source element is kept once, even if several parts select it. Distinct elements with equal contents remain separate. Single-record queries and mutation responses can set arguments on their embedded lists. Parameters are validated even on empty data; an invalid response selection rolls back record changes. Invalid scopes return `400`. The JSON length limit is 10,000 characters; selection depth is limited to 32 levels.
|
|
424
426
|
|
|
425
427
|
### Nested writes
|
|
426
428
|
|
|
@@ -758,6 +760,8 @@ A new file returns status `201` and its computed metadata:
|
|
|
758
760
|
}
|
|
759
761
|
```
|
|
760
762
|
|
|
763
|
+
File names and every directory segment follow the same rules: no control characters, `<>:"/\\|?*`, trailing dots or spaces, or reserved Windows names such as `CON` and `NUL`. Use `/` between directory segments.
|
|
764
|
+
|
|
761
765
|
The combination of `directory` and `name` identifies a file. Uploading to an existing path returns `409`. Pass `Content-Override: true` to replace it; a successful replacement returns `200`. The server supports these file routes:
|
|
762
766
|
|
|
763
767
|
```text
|
package/README.ru.md
CHANGED
|
@@ -12,7 +12,7 @@ JSON-сервер для имитации API: REST, GraphQL, связанные
|
|
|
12
12
|
npm install @kollors/deep-json-server@beta
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
Для установки конкретной версии укажите `@1.0.0-beta.
|
|
15
|
+
Для установки конкретной версии укажите `@1.0.0-beta.4`.
|
|
16
16
|
|
|
17
17
|
## Быстрый старт
|
|
18
18
|
|
|
@@ -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
|
|
|
@@ -179,6 +179,8 @@ REST без схемы создаёт ключ `id` и сохраняет про
|
|
|
179
179
|
|
|
180
180
|
Ограничения строк и чисел применяются к каждому элементу `string[]`/`number[]`. `required` и `nullable` относятся ко всему массиву; `default` и `example` содержат массив целиком. Элементы массива должны соответствовать его типу и быть отличны от `null`. `required` требует наличия поля; обычный массив при этом может быть пустым.
|
|
181
181
|
|
|
182
|
+
Каждое значение `enum` должно соответствовать типу поля и его ограничениям. Чтобы разрешить `null` для поля, укажите `nullable: true`; добавлять `null` в `enum` не нужно. Некорректные значения отклоняются при загрузке схемы.
|
|
183
|
+
|
|
182
184
|
У модели ровно один первичный ключ типа `string` или `number`, объявленный на верхнем уровне. Имя произвольное: `id`, `username`, `code`. Если `generated` не задан, значение передаёт клиент при создании. Генерируемые поля объявляются на верхнем уровне, исключаются из входных типов и несовместимы с `default`. При замене записи сохраняются генерируемые значения и поля `readOnly`, включая вложенные объекты. Для защиты полей внутри массива задайте `readOnly` всему массиву или содержащему его объекту. Объекты, состоящие из серверных полей, доступны только в ответах.
|
|
183
185
|
|
|
184
186
|
Например, `LocalUser` с первичным ключом `username` и полем `password: {"type":"string","required":true,"writeOnly":true}` получает запрос `localUser(username: ...)` и маршрут `/localUsers/{username}`. Поле `writeOnly` доступно для записи и исключено из ответов, `scope`, фильтров и сортировки.
|
|
@@ -420,7 +422,7 @@ const response = await fetch(`/users?${params}`);
|
|
|
420
422
|
|
|
421
423
|
Без `scope` возвращаются скалярные поля, как при `[{"*":true}]`. Пустой выбор `[{}]` возвращает объект без полей. Списки сохраняют структуру `{ data, total }`.
|
|
422
424
|
|
|
423
|
-
Аргументы доступны только у списков. Вместо них список может использовать `{ "union": [scope, ...] }`: каждая часть — обычный scope списка, части выполняются в порядке массива, а для каждого первичного ключа остаётся первая запись.
|
|
425
|
+
Аргументы доступны только у списков. Вместо них список может использовать `{ "union": [scope, ...] }`: каждая часть — обычный scope списка, части выполняются в порядке массива, а для каждого первичного ключа остаётся первая запись. Во вложенных массивах объектов без первичных ключей каждый исходный элемент включается один раз, даже если его выбрали несколько частей. Разные элементы с одинаковым содержимым сохраняются отдельно. В запросе отдельной записи и в ответе мутации аргументы можно задать для вложенных списков. Параметры проверяются даже на пустых данных; ошибка в выборе ответа отменяет изменения записи. Некорректный `scope` возвращает `400`. Максимальная длина JSON — 10 000 символов, глубина выбора — 32 уровня.
|
|
424
426
|
|
|
425
427
|
### Вложенная запись
|
|
426
428
|
|
|
@@ -758,6 +760,8 @@ Content-Type: image/jpeg
|
|
|
758
760
|
}
|
|
759
761
|
```
|
|
760
762
|
|
|
763
|
+
Имена файлов и каждый сегмент каталога проверяются одинаково: запрещены управляющие символы, `<>:"/\\|?*`, точка или пробел в конце и зарезервированные имена Windows, например `CON` и `NUL`. Сегменты каталога разделяются `/`.
|
|
764
|
+
|
|
761
765
|
Сочетание `directory` и `name` идентифицирует файл. Повторная загрузка по существующему пути возвращает `409`. Чтобы заменить файл, передайте `Content-Override: true`; успешная перезапись возвращает `200`. Сервер поддерживает следующие файловые маршруты:
|
|
762
766
|
|
|
763
767
|
```text
|
|
@@ -32,7 +32,7 @@ export async function hashPassword(password) {
|
|
|
32
32
|
*/
|
|
33
33
|
export async function verifyPassword(password, encoded) {
|
|
34
34
|
const parts = HASH_PATTERN.exec(encoded);
|
|
35
|
-
if (!parts)
|
|
35
|
+
if (!parts?.[1] || !parts[2])
|
|
36
36
|
return false;
|
|
37
37
|
const actual = await derive(password, Buffer.from(parts[1], 'hex'));
|
|
38
38
|
return timingSafeEqual(actual, Buffer.from(parts[2], 'hex'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../../src/auth/password.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,0DAA0D;AAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAClC,MAAM,YAAY,GAAG,uDAAuD,CAAC;AAC7E;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5H;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAAC;AACvJ;;GAEG;AACH,MAAM,MAAM,GAAG,CAAC,QAAgB,EAAE,IAAY,EAAmB,EAAE,CACjE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/G,CAAC,CAAC,CAAC;AACL;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,mBAAmB,aAAa,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACrE,CAAC;AACD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../../src/auth/password.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,0DAA0D;AAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAClC,MAAM,YAAY,GAAG,uDAAuD,CAAC;AAC7E;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5H;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAAC;AACvJ;;GAEG;AACH,MAAM,MAAM,GAAG,CAAC,QAAgB,EAAE,IAAY,EAAmB,EAAE,CACjE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/G,CAAC,CAAC,CAAC;AACL;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,mBAAmB,aAAa,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACrE,CAAC;AACD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACpE,OAAO,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AACD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC"}
|
|
@@ -73,6 +73,6 @@ export declare class AuthService {
|
|
|
73
73
|
private prune;
|
|
74
74
|
}
|
|
75
75
|
/** Открывает источник учётных записей и создаёт хранилище сессий в памяти.
|
|
76
|
-
* @example createAuthService({
|
|
76
|
+
* @example createAuthService({ source: [] }) → Promise<AuthService>; повторяющиеся id → ошибка.
|
|
77
77
|
*/
|
|
78
78
|
export declare function createAuthService(config: AuthConfig): Promise<AuthService>;
|
package/dist/src/auth/service.js
CHANGED
|
@@ -148,7 +148,7 @@ export class AuthService {
|
|
|
148
148
|
if (typeof authorization !== 'string')
|
|
149
149
|
throw unauthorized();
|
|
150
150
|
const match = /^Bearer ([A-Za-z0-9_-]{43})$/i.exec(authorization);
|
|
151
|
-
if (!match)
|
|
151
|
+
if (!match?.[1])
|
|
152
152
|
throw unauthorized();
|
|
153
153
|
const key = tokenKey(match[1]);
|
|
154
154
|
const session = this.sessions.get(key);
|
|
@@ -210,7 +210,7 @@ export class AuthService {
|
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
/** Открывает источник учётных записей и создаёт хранилище сессий в памяти.
|
|
213
|
-
* @example createAuthService({
|
|
213
|
+
* @example createAuthService({ source: [] }) → Promise<AuthService>; повторяющиеся id → ошибка.
|
|
214
214
|
*/
|
|
215
215
|
export async function createAuthService(config) {
|
|
216
216
|
return new AuthService(await createAuthStore(config.source), config.expiresIn ?? DEFAULT_SESSION_SECONDS);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/auth/service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/auth/service.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import process from 'node:process';
|
|
2
2
|
import { DEFAULT_HOST, DEFAULT_PORT, VERSION } from '../core/constants.js';
|
|
3
|
-
import {
|
|
3
|
+
import { validateExportPaths } from '../core/paths.js';
|
|
4
4
|
import { isObject } from '../core/utils.js';
|
|
5
5
|
import { writeGraphql } from '../graphql/entry.js';
|
|
6
6
|
import { writeOpenapi } from '../openapi/entry.js';
|
|
7
7
|
import { configure, readConfigModule } from '../server/config.js';
|
|
8
8
|
import { createConfiguredServer } from '../server/create.js';
|
|
9
|
+
import { inputPaths } from '../server/input-paths.js';
|
|
9
10
|
import { configuredModel } from '../server/model.js';
|
|
10
11
|
import { openapiOptions } from '../server/openapi-options.js';
|
|
11
12
|
const HELP_TEXT = `Deep JSON Server
|
|
@@ -68,6 +69,8 @@ export async function runCli(args = process.argv.slice(2), services = { createSe
|
|
|
68
69
|
let port;
|
|
69
70
|
for (let index = 0; index < args.length; index++) {
|
|
70
71
|
const arg = args[index];
|
|
72
|
+
if (arg === undefined)
|
|
73
|
+
break;
|
|
71
74
|
if (!arg.startsWith('-')) {
|
|
72
75
|
positional.push(arg);
|
|
73
76
|
continue;
|
|
@@ -94,7 +97,10 @@ export async function runCli(args = process.argv.slice(2), services = { createSe
|
|
|
94
97
|
throw new Error('Укажите путь к файлу конфигурации');
|
|
95
98
|
if (positional.length !== 1)
|
|
96
99
|
throw new Error('Можно указать только один файл конфигурации');
|
|
97
|
-
const
|
|
100
|
+
const configPath = positional[0];
|
|
101
|
+
if (configPath === undefined)
|
|
102
|
+
throw new Error('Укажите путь к файлу конфигурации');
|
|
103
|
+
const source = await readConfigModule(configPath);
|
|
98
104
|
const server = source.config.server ?? {};
|
|
99
105
|
if (!isObject(server))
|
|
100
106
|
throw new Error('config.server must be an object');
|
|
@@ -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,
|
|
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-beta.
|
|
6
|
+
export declare const VERSION = "1.0.0-beta.4";
|
|
@@ -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
|
+
export const VERSION = '1.0.0-beta.4';
|
|
7
7
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ModelSchema } from './model.js';
|
|
1
|
+
import type { ModelSchema } from './model/types.js';
|
|
2
2
|
import type { Source, Storage } from './storage.js';
|
|
3
|
-
import type { DatabaseData, DatabaseRecord } from './types.js';
|
|
3
|
+
import type { DatabaseData, DatabaseRecord, DatabaseSnapshot } from './types.js';
|
|
4
4
|
export interface DatabaseConfig<S extends Storage = Storage> {
|
|
5
5
|
source: Source<S, DatabaseData>;
|
|
6
6
|
schema?: Source<S, ModelSchema>;
|
|
@@ -10,22 +10,26 @@ export interface DatabaseContainer {
|
|
|
10
10
|
counters?: Record<string, number>;
|
|
11
11
|
}
|
|
12
12
|
export interface DatabaseStore {
|
|
13
|
-
database:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
readonly database: {
|
|
14
|
+
readonly data: DatabaseSnapshot;
|
|
15
|
+
};
|
|
16
|
+
readonly path?: string;
|
|
17
|
+
read(): Promise<DatabaseSnapshot>;
|
|
18
|
+
/** Передаёт изменяемый черновик и исходные данные только для чтения; ожидает обработчик и сохраняет черновик после проверки.
|
|
19
|
+
* @example update((draft, before) => { draft.data.notes = []; return before.notes?.length ?? 0; }) → прежнее число записей.
|
|
18
20
|
*/
|
|
19
|
-
update<T>(operation: (database: DatabaseContainer, before:
|
|
21
|
+
update<T>(operation: (database: DatabaseContainer, before: DatabaseSnapshot) => T | Promise<T>): Promise<T>;
|
|
20
22
|
}
|
|
21
23
|
/** Проверяет сериализуемое JSON-значение; отвергает циклы, разреженные массивы, NaN и бесконечности.
|
|
24
|
+
* При freeze = true замораживает проверенные объекты на месте, в том числе до возможной ошибки в соседней ветке.
|
|
22
25
|
* @example validateJsonValue({ a: [1, null] }, 'data') → undefined; NaN → ошибка.
|
|
23
26
|
*/
|
|
24
|
-
export declare const validateJsonValue: (value: unknown, path: string, ancestors?: WeakSet<object
|
|
27
|
+
export declare const validateJsonValue: (value: unknown, path: string, ancestors?: WeakSet<object>, freeze?: boolean) => void;
|
|
25
28
|
/** Проверяет объект коллекций, записи и уникальность ключей; возвращает исходный объект.
|
|
29
|
+
* При freeze = true замораживает JSON-дерево перед проверкой коллекций; ошибка не отменяет заморозку.
|
|
26
30
|
* @example validateDatabase({ notes: [{ id: '1' }] }) → тот же объект; повторный id → ошибка.
|
|
27
31
|
*/
|
|
28
|
-
export declare const validateDatabase: (data: unknown, primaryKeys?: Map<string, string
|
|
32
|
+
export declare const validateDatabase: (data: unknown, primaryKeys?: Map<string, string>, freeze?: boolean) => DatabaseData;
|
|
29
33
|
/** Читает UTF-8 JSON-файл и проверяет, что верхний уровень является объектом.
|
|
30
34
|
* @example Файл с {"a":1} → Promise<{ a: 1 }>; файл с [] → ошибка.
|
|
31
35
|
*/
|
|
@@ -3,12 +3,14 @@ import { resolve } from 'node:path';
|
|
|
3
3
|
import { Low } from 'lowdb';
|
|
4
4
|
import { JSONFile } from 'lowdb/node';
|
|
5
5
|
import { domainError } from './errors.js';
|
|
6
|
+
import { cloneSnapshot, freezeSnapshot } from './snapshot.js';
|
|
6
7
|
import { createSerialQueue, createUniqueId, isObject, isSafeKey, isSystemError, resolveDatabasePath } from './utils.js';
|
|
7
8
|
const RESOURCE_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]*$/;
|
|
8
9
|
/** Проверяет сериализуемое JSON-значение; отвергает циклы, разреженные массивы, NaN и бесконечности.
|
|
10
|
+
* При freeze = true замораживает проверенные объекты на месте, в том числе до возможной ошибки в соседней ветке.
|
|
9
11
|
* @example validateJsonValue({ a: [1, null] }, 'data') → undefined; NaN → ошибка.
|
|
10
12
|
*/
|
|
11
|
-
export const validateJsonValue = (value, path, ancestors = new WeakSet()) => {
|
|
13
|
+
export const validateJsonValue = (value, path, ancestors = new WeakSet(), freeze = false) => {
|
|
12
14
|
if (value === null || typeof value === 'string' || typeof value === 'boolean') {
|
|
13
15
|
return;
|
|
14
16
|
}
|
|
@@ -34,24 +36,27 @@ export const validateJsonValue = (value, path, ancestors = new WeakSet()) => {
|
|
|
34
36
|
if (!Object.hasOwn(value, index)) {
|
|
35
37
|
throw new Error(`${path}[${index}] отсутствует; разреженные массивы несовместимы с JSON`);
|
|
36
38
|
}
|
|
37
|
-
validateJsonValue(value[index], `${path}[${index}]`, ancestors);
|
|
39
|
+
validateJsonValue(value[index], `${path}[${index}]`, ancestors, freeze);
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
42
|
else {
|
|
41
43
|
Object.entries(value).forEach(([key, item]) => {
|
|
42
|
-
validateJsonValue(item, `${path}.${key}`, ancestors);
|
|
44
|
+
validateJsonValue(item, `${path}.${key}`, ancestors, freeze);
|
|
43
45
|
});
|
|
44
46
|
}
|
|
45
47
|
ancestors.delete(value);
|
|
48
|
+
if (freeze)
|
|
49
|
+
Object.freeze(value);
|
|
46
50
|
};
|
|
47
51
|
/** Проверяет объект коллекций, записи и уникальность ключей; возвращает исходный объект.
|
|
52
|
+
* При freeze = true замораживает JSON-дерево перед проверкой коллекций; ошибка не отменяет заморозку.
|
|
48
53
|
* @example validateDatabase({ notes: [{ id: '1' }] }) → тот же объект; повторный id → ошибка.
|
|
49
54
|
*/
|
|
50
|
-
export const validateDatabase = (data, primaryKeys) => {
|
|
55
|
+
export const validateDatabase = (data, primaryKeys, freeze = false) => {
|
|
51
56
|
if (!isObject(data)) {
|
|
52
57
|
throw new Error('База данных должна содержать JSON-объект');
|
|
53
58
|
}
|
|
54
|
-
validateJsonValue(data, 'База данных');
|
|
59
|
+
validateJsonValue(data, 'База данных', new WeakSet(), freeze);
|
|
55
60
|
Object.entries(data).forEach(([resource, records]) => {
|
|
56
61
|
if (!RESOURCE_NAME_PATTERN.test(resource) || !isSafeKey(resource)) {
|
|
57
62
|
throw new Error(`Недопустимое имя ресурса «${resource}»`);
|
|
@@ -107,7 +112,7 @@ export const readJsonObjectFile = async (path, label) => {
|
|
|
107
112
|
export const readDatabaseFile = async (databasePath, keys) => validateDatabase(await readJsonObjectFile(databasePath, 'Файл базы данных'), keys);
|
|
108
113
|
const validateDraft = (data, keys) => {
|
|
109
114
|
try {
|
|
110
|
-
validateDatabase(data, keys);
|
|
115
|
+
validateDatabase(data, keys, true);
|
|
111
116
|
}
|
|
112
117
|
catch (error) {
|
|
113
118
|
throw domainError('INVALID_INPUT', error.message);
|
|
@@ -115,46 +120,63 @@ const validateDraft = (data, keys) => {
|
|
|
115
120
|
};
|
|
116
121
|
const createDiskDatabaseStore = async (databasePath, keys) => {
|
|
117
122
|
const resolvedDatabasePath = resolveDatabasePath(databasePath);
|
|
118
|
-
const initialData = await readDatabaseFile(resolvedDatabasePath, keys);
|
|
123
|
+
const initialData = freezeSnapshot(await readDatabaseFile(resolvedDatabasePath, keys));
|
|
119
124
|
const database = new Low(new JSONFile(resolvedDatabasePath), initialData);
|
|
120
125
|
const schedule = createSerialQueue();
|
|
121
126
|
const counterStore = new Low(new JSONFile(`${resolvedDatabasePath}.counters.json`), {});
|
|
122
127
|
await counterStore.read();
|
|
123
128
|
const read = async () => {
|
|
124
|
-
database.data = await readDatabaseFile(resolvedDatabasePath, keys);
|
|
129
|
+
database.data = freezeSnapshot(await readDatabaseFile(resolvedDatabasePath, keys));
|
|
125
130
|
return database.data;
|
|
126
131
|
};
|
|
127
132
|
const update = (operation) => schedule(async () => {
|
|
128
133
|
await read();
|
|
129
134
|
await counterStore.read();
|
|
130
|
-
const draft = { data:
|
|
131
|
-
const result = operation(draft, database.data);
|
|
135
|
+
const draft = { data: cloneSnapshot(database.data), counters: structuredClone(counterStore.data) };
|
|
136
|
+
const result = await operation(draft, database.data);
|
|
132
137
|
validateDraft(draft.data, keys);
|
|
133
|
-
//
|
|
138
|
+
// Сначала сохраняем счётчики: ошибка записи может оставить пропуск, но не повторный номер.
|
|
134
139
|
if (JSON.stringify(draft.counters) !== JSON.stringify(counterStore.data)) {
|
|
135
140
|
counterStore.data = draft.counters;
|
|
136
141
|
await counterStore.write();
|
|
137
142
|
}
|
|
138
143
|
await database.adapter.write(draft.data);
|
|
139
|
-
database.data = draft.data;
|
|
144
|
+
database.data = freezeSnapshot(draft.data);
|
|
140
145
|
return result;
|
|
141
146
|
});
|
|
142
|
-
return {
|
|
147
|
+
return Object.freeze({
|
|
148
|
+
database: Object.freeze({
|
|
149
|
+
get data() {
|
|
150
|
+
return database.data;
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
path: resolvedDatabasePath,
|
|
154
|
+
read,
|
|
155
|
+
update,
|
|
156
|
+
});
|
|
143
157
|
};
|
|
144
158
|
const createMemoryDatabaseStore = (sourceData, keys) => {
|
|
145
159
|
validateDatabase(sourceData, keys);
|
|
146
|
-
const database = { data: structuredClone(sourceData), counters: {} };
|
|
160
|
+
const database = { data: freezeSnapshot(structuredClone(sourceData)), counters: {} };
|
|
147
161
|
const schedule = createSerialQueue();
|
|
148
162
|
const read = async () => database.data;
|
|
149
|
-
const update = (operation) => schedule(() => {
|
|
150
|
-
const draft = structuredClone(database);
|
|
151
|
-
const result = operation(draft, database.data);
|
|
163
|
+
const update = (operation) => schedule(async () => {
|
|
164
|
+
const draft = { data: cloneSnapshot(database.data), counters: structuredClone(database.counters) };
|
|
165
|
+
const result = await operation(draft, database.data);
|
|
152
166
|
validateDraft(draft.data, keys);
|
|
153
|
-
database.data = draft.data;
|
|
167
|
+
database.data = freezeSnapshot(draft.data);
|
|
154
168
|
database.counters = draft.counters;
|
|
155
169
|
return result;
|
|
156
170
|
});
|
|
157
|
-
return {
|
|
171
|
+
return Object.freeze({
|
|
172
|
+
database: Object.freeze({
|
|
173
|
+
get data() {
|
|
174
|
+
return database.data;
|
|
175
|
+
},
|
|
176
|
+
}),
|
|
177
|
+
read,
|
|
178
|
+
update,
|
|
179
|
+
});
|
|
158
180
|
};
|
|
159
181
|
/** Создаёт дисковое хранилище или хранилище в памяти по настройкам.
|
|
160
182
|
* @example createDatabaseStore({ source: { notes: [] } }) → Promise<DatabaseStore>.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/core/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/core/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { DatabaseStore } from './database.js';
|
|
2
2
|
import type { ActorSource } from './lifecycle/options.js';
|
|
3
|
-
import {
|
|
3
|
+
import type { Entity, Model, Node } from './model/types.js';
|
|
4
4
|
import type { MutationMode } from './operations.js';
|
|
5
5
|
import { type Page, type PreparedList } from './query/execute.js';
|
|
6
6
|
import type { ListOptions } from './query/options.js';
|
|
7
7
|
import { type Context, type Ref } from './records.js';
|
|
8
|
-
import type {
|
|
8
|
+
import type { DatabaseSnapshot, RecordSnapshot } from './types.js';
|
|
9
9
|
export type { Page, PreparedList } from './query/execute.js';
|
|
10
10
|
export declare class Engine {
|
|
11
11
|
readonly store: DatabaseStore;
|
|
@@ -13,6 +13,7 @@ export declare class Engine {
|
|
|
13
13
|
readonly pageSize: number;
|
|
14
14
|
readonly maxPageSize: number;
|
|
15
15
|
private inferredModels;
|
|
16
|
+
private reservedCounters;
|
|
16
17
|
constructor(store: DatabaseStore, model: Model, pageSize?: number, maxPageSize?: number);
|
|
17
18
|
/** Возвращает явную модель или кешированное описание, выведенное из переданного снимка данных.
|
|
18
19
|
* @example Повторный вызов с тем же объектом data → тот же объект Model.
|
|
@@ -25,11 +26,11 @@ export declare class Engine {
|
|
|
25
26
|
/** Оборачивает все записи выбранной коллекции ссылками с контекстом.
|
|
26
27
|
* @example Пустая коллекция → []; две записи → две ссылки Ref.
|
|
27
28
|
*/
|
|
28
|
-
records(context: Context
|
|
29
|
+
records<R extends RecordSnapshot>(context: Context<R>, entity: Entity): Ref<R>[];
|
|
29
30
|
/** Ищет запись по строковому представлению первичного ключа, включая удалённые записи.
|
|
30
31
|
* @example Ключ '1' находит запись с числовым ключом 1; отсутствующий ключ → undefined.
|
|
31
32
|
*/
|
|
32
|
-
find(context: Context
|
|
33
|
+
find<R extends RecordSnapshot>(context: Context<R>, entity: Entity, key: unknown): Ref<R> | undefined;
|
|
33
34
|
/** Проверяет аргументы списка и подготавливает предикат, пути сортировки и размеры страницы.
|
|
34
35
|
* @example pager: { page: 2, pageSize: 5 } → план с page: 2 и pageSize: 5; page: 0 → ошибка.
|
|
35
36
|
*/
|
|
@@ -41,11 +42,12 @@ export declare class Engine {
|
|
|
41
42
|
/** Проверяет коллекции, значения полей и целостность активных связей.
|
|
42
43
|
* @example Согласованные записи → undefined; обязательная связь без цели → исключение.
|
|
43
44
|
*/
|
|
44
|
-
validateData(data:
|
|
45
|
-
/** Выполняет одну операцию записи в транзакции, включая связи, права и
|
|
46
|
-
* @example
|
|
45
|
+
validateData(data: DatabaseSnapshot): void;
|
|
46
|
+
/** Выполняет одну операцию записи в транзакции, включая связи, права и ожидание подготовки ответа.
|
|
47
|
+
* @example await mutate(entity, 'update', '1', { name: 'Анна' }, ref => ref.value.name) → 'Анна'; ошибка обработчика → прежние данные.
|
|
47
48
|
*/
|
|
48
|
-
mutate
|
|
49
|
+
mutate(entity: Entity, mode: MutationMode, key?: unknown, body?: unknown, prepare?: undefined, actor?: ActorSource): Promise<Ref>;
|
|
50
|
+
mutate<T>(entity: Entity, mode: MutationMode, key: unknown, body: unknown, prepare: (ref: Ref) => T | Promise<T>, actor?: ActorSource): Promise<T>;
|
|
49
51
|
/** Вычисляет каскад удаления, проверяет запрещающие связи и меняет только черновик данных.
|
|
50
52
|
* @example Удаление родителя при cascade → удалённые зависимые записи; restrict → исключение.
|
|
51
53
|
*/
|