@kollors/deep-json-server 1.0.0-beta.2 → 1.0.0-beta.3
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 +5 -3
- package/README.ru.md +5 -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 +4 -4
- package/dist/src/core/database.js +15 -12
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/engine.d.ts +3 -1
- package/dist/src/core/engine.js +33 -24
- package/dist/src/core/engine.js.map +1 -1
- package/dist/src/core/lifecycle/mutation.d.ts +4 -4
- 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 +2 -2
- 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 +215 -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 +83 -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 +96 -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 +33 -0
- package/dist/src/core/mutations/write.js +46 -12
- 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/execute.js +2 -2
- package/dist/src/core/query/execute.js.map +1 -1
- package/dist/src/core/query/filter.js +1 -1
- package/dist/src/core/query/filter.js.map +1 -1
- package/dist/src/core/query/options.js +1 -1
- package/dist/src/core/query/options.js.map +1 -1
- 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/snapshot.d.ts +10 -0
- package/dist/src/core/snapshot.js +15 -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/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.js +3 -3
- package/dist/src/graphql/schema.js.map +1 -1
- package/dist/src/openapi/document.js +7 -7
- package/dist/src/openapi/document.js.map +1 -1
- 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 +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.3`.
|
|
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
|
|
|
@@ -420,7 +420,7 @@ For example, select a movie's own fields, its actors' users and sorted genres:
|
|
|
420
420
|
|
|
421
421
|
Omitting `scope` returns scalar fields, as with `[{"*":true}]`. An empty selection `[{}]` returns an object without fields. Lists retain the `{ data, total }` response structure.
|
|
422
422
|
|
|
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.
|
|
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. 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
424
|
|
|
425
425
|
### Nested writes
|
|
426
426
|
|
|
@@ -758,6 +758,8 @@ A new file returns status `201` and its computed metadata:
|
|
|
758
758
|
}
|
|
759
759
|
```
|
|
760
760
|
|
|
761
|
+
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.
|
|
762
|
+
|
|
761
763
|
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
764
|
|
|
763
765
|
```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.3`.
|
|
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
|
|
|
@@ -420,7 +420,7 @@ const response = await fetch(`/users?${params}`);
|
|
|
420
420
|
|
|
421
421
|
Без `scope` возвращаются скалярные поля, как при `[{"*":true}]`. Пустой выбор `[{}]` возвращает объект без полей. Списки сохраняют структуру `{ data, total }`.
|
|
422
422
|
|
|
423
|
-
Аргументы доступны только у списков. Вместо них список может использовать `{ "union": [scope, ...] }`: каждая часть — обычный scope списка, части выполняются в порядке массива, а для каждого первичного ключа остаётся первая запись.
|
|
423
|
+
Аргументы доступны только у списков. Вместо них список может использовать `{ "union": [scope, ...] }`: каждая часть — обычный scope списка, части выполняются в порядке массива, а для каждого первичного ключа остаётся первая запись. Во вложенных массивах объектов без первичных ключей каждый исходный элемент включается один раз, даже если его выбрали несколько частей. Разные элементы с одинаковым содержимым сохраняются отдельно. В запросе отдельной записи и в ответе мутации аргументы можно задать для вложенных списков. Параметры проверяются даже на пустых данных; ошибка в выборе ответа отменяет изменения записи. Некорректный `scope` возвращает `400`. Максимальная длина JSON — 10 000 символов, глубина выбора — 32 уровня.
|
|
424
424
|
|
|
425
425
|
### Вложенная запись
|
|
426
426
|
|
|
@@ -758,6 +758,8 @@ Content-Type: image/jpeg
|
|
|
758
758
|
}
|
|
759
759
|
```
|
|
760
760
|
|
|
761
|
+
Имена файлов и каждый сегмент каталога проверяются одинаково: запрещены управляющие символы, `<>:"/\\|?*`, точка или пробел в конце и зарезервированные имена Windows, например `CON` и `NUL`. Сегменты каталога разделяются `/`.
|
|
762
|
+
|
|
761
763
|
Сочетание `directory` и `name` идентифицирует файл. Повторная загрузка по существующему пути возвращает `409`. Чтобы заменить файл, передайте `Content-Override: true`; успешная перезапись возвращает `200`. Сервер поддерживает следующие файловые маршруты:
|
|
762
764
|
|
|
763
765
|
```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":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAoD,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAkB,eAAe,EAAmC,MAAM,YAAY,CAAC;AAE9F;;GAEG;AACH,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAC;AACpG;;GAEG;AACH,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrF;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,IAAgB,EAAY,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAKrH,MAAM,OAAO,WAAW;IAKZ,KAAK;IACL,SAAS;IALX,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IACtC,gBAAgB,GAAG,CAAC,CAAC;IACrB,MAAM,GAAG,KAAK,CAAC;IACvB,YACU,KAAgB,EAChB,SAAiB;qBADjB,KAAK;yBACL,SAAS;IAChB,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,IAAa;QACvB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,IAAI,UAAU,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,mFAAmF;QACnF,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY;YAAE,MAAM,YAAY,EAAE,CAAC;QACpG,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK;YAAE,MAAM,WAAW,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;QACjG,MAAM,WAAW,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,CAAC,CAAC;QAChH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAa;QAC1B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpG,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,aAAsB,EAAE,EAAU,EAAE,IAAa;QACpE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;QACpF,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;QACnC,IAAI,GAAG,IAAI,eAAe,KAAK,SAAS;YAAE,MAAM,WAAW,CAAC,eAAe,EAAE,oDAAoD,CAAC,CAAC;QACnI,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACtD,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,eAAyB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBAAE,MAAM,YAAY,EAAE,CAAC;YACzG,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CACrB,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;YAC1E,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY;gBAAE,MAAM,WAAW,CAAC,UAAU,EAAE,qCAAqC,CAAC,CAAC;YACvH,OAAO,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,CAAC;QACtC,CAAC,EACD,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CACtB,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,aAAsB,EAAE,EAAU,EAAE,IAAa;QACjE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM;gBAAE,MAAM,WAAW,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;gBAChH,MAAM,WAAW,CAAC,UAAU,EAAE,6DAA6D,CAAC,CAAC;YAC/F,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,EAAE,CAAC,aAAsB;QACvB,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAClD,CAAC;IACD;;OAEG;IACH,MAAM,CAAC,aAAsB;QAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAI,SAA2B;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC;YAAE,MAAM,WAAW,CAAC,mBAAmB,EAAE,2CAA2C,CAAC,CAAC;QACpH,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IACD;;OAEG;IACK,UAAU;QAChB,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,YAAY,EAAE,CAAC;IACxC,CAAC;IACD;;OAEG;IACK,OAAO,CAAC,aAAsB;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,OAAO,aAAa,KAAK,QAAQ;YAAE,MAAM,YAAY,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK;YAAE,MAAM,YAAY,EAAE,CAAC;
|
|
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.3";
|
|
@@ -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.3';
|
|
7
7
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ModelSchema } from './model.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>;
|
|
@@ -16,16 +16,16 @@ export interface DatabaseStore {
|
|
|
16
16
|
/** Передаёт изменяемый черновик и исходные данные только для чтения; сохраняет черновик после проверки.
|
|
17
17
|
* @example update((draft, before) => { draft.data.notes = []; return before.notes.length; }) → прежнее число записей.
|
|
18
18
|
*/
|
|
19
|
-
update<T>(operation: (database: DatabaseContainer, before:
|
|
19
|
+
update<T>(operation: (database: DatabaseContainer, before: DatabaseSnapshot) => T): Promise<T>;
|
|
20
20
|
}
|
|
21
21
|
/** Проверяет сериализуемое JSON-значение; отвергает циклы, разреженные массивы, NaN и бесконечности.
|
|
22
22
|
* @example validateJsonValue({ a: [1, null] }, 'data') → undefined; NaN → ошибка.
|
|
23
23
|
*/
|
|
24
|
-
export declare const validateJsonValue: (value: unknown, path: string, ancestors?: WeakSet<object
|
|
24
|
+
export declare const validateJsonValue: (value: unknown, path: string, ancestors?: WeakSet<object>, freeze?: boolean) => void;
|
|
25
25
|
/** Проверяет объект коллекций, записи и уникальность ключей; возвращает исходный объект.
|
|
26
26
|
* @example validateDatabase({ notes: [{ id: '1' }] }) → тот же объект; повторный id → ошибка.
|
|
27
27
|
*/
|
|
28
|
-
export declare const validateDatabase: (data: unknown, primaryKeys?: Map<string, string
|
|
28
|
+
export declare const validateDatabase: (data: unknown, primaryKeys?: Map<string, string>, freeze?: boolean) => DatabaseData;
|
|
29
29
|
/** Читает UTF-8 JSON-файл и проверяет, что верхний уровень является объектом.
|
|
30
30
|
* @example Файл с {"a":1} → Promise<{ a: 1 }>; файл с [] → ошибка.
|
|
31
31
|
*/
|
|
@@ -3,12 +3,13 @@ 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 { 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 и бесконечности.
|
|
9
10
|
* @example validateJsonValue({ a: [1, null] }, 'data') → undefined; NaN → ошибка.
|
|
10
11
|
*/
|
|
11
|
-
export const validateJsonValue = (value, path, ancestors = new WeakSet()) => {
|
|
12
|
+
export const validateJsonValue = (value, path, ancestors = new WeakSet(), freeze = false) => {
|
|
12
13
|
if (value === null || typeof value === 'string' || typeof value === 'boolean') {
|
|
13
14
|
return;
|
|
14
15
|
}
|
|
@@ -34,24 +35,26 @@ export const validateJsonValue = (value, path, ancestors = new WeakSet()) => {
|
|
|
34
35
|
if (!Object.hasOwn(value, index)) {
|
|
35
36
|
throw new Error(`${path}[${index}] отсутствует; разреженные массивы несовместимы с JSON`);
|
|
36
37
|
}
|
|
37
|
-
validateJsonValue(value[index], `${path}[${index}]`, ancestors);
|
|
38
|
+
validateJsonValue(value[index], `${path}[${index}]`, ancestors, freeze);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
41
|
else {
|
|
41
42
|
Object.entries(value).forEach(([key, item]) => {
|
|
42
|
-
validateJsonValue(item, `${path}.${key}`, ancestors);
|
|
43
|
+
validateJsonValue(item, `${path}.${key}`, ancestors, freeze);
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
46
|
ancestors.delete(value);
|
|
47
|
+
if (freeze)
|
|
48
|
+
Object.freeze(value);
|
|
46
49
|
};
|
|
47
50
|
/** Проверяет объект коллекций, записи и уникальность ключей; возвращает исходный объект.
|
|
48
51
|
* @example validateDatabase({ notes: [{ id: '1' }] }) → тот же объект; повторный id → ошибка.
|
|
49
52
|
*/
|
|
50
|
-
export const validateDatabase = (data, primaryKeys) => {
|
|
53
|
+
export const validateDatabase = (data, primaryKeys, freeze = false) => {
|
|
51
54
|
if (!isObject(data)) {
|
|
52
55
|
throw new Error('База данных должна содержать JSON-объект');
|
|
53
56
|
}
|
|
54
|
-
validateJsonValue(data, 'База данных');
|
|
57
|
+
validateJsonValue(data, 'База данных', new WeakSet(), freeze);
|
|
55
58
|
Object.entries(data).forEach(([resource, records]) => {
|
|
56
59
|
if (!RESOURCE_NAME_PATTERN.test(resource) || !isSafeKey(resource)) {
|
|
57
60
|
throw new Error(`Недопустимое имя ресурса «${resource}»`);
|
|
@@ -107,7 +110,7 @@ export const readJsonObjectFile = async (path, label) => {
|
|
|
107
110
|
export const readDatabaseFile = async (databasePath, keys) => validateDatabase(await readJsonObjectFile(databasePath, 'Файл базы данных'), keys);
|
|
108
111
|
const validateDraft = (data, keys) => {
|
|
109
112
|
try {
|
|
110
|
-
validateDatabase(data, keys);
|
|
113
|
+
validateDatabase(data, keys, true);
|
|
111
114
|
}
|
|
112
115
|
catch (error) {
|
|
113
116
|
throw domainError('INVALID_INPUT', error.message);
|
|
@@ -115,13 +118,13 @@ const validateDraft = (data, keys) => {
|
|
|
115
118
|
};
|
|
116
119
|
const createDiskDatabaseStore = async (databasePath, keys) => {
|
|
117
120
|
const resolvedDatabasePath = resolveDatabasePath(databasePath);
|
|
118
|
-
const initialData = await readDatabaseFile(resolvedDatabasePath, keys);
|
|
121
|
+
const initialData = freezeSnapshot(await readDatabaseFile(resolvedDatabasePath, keys));
|
|
119
122
|
const database = new Low(new JSONFile(resolvedDatabasePath), initialData);
|
|
120
123
|
const schedule = createSerialQueue();
|
|
121
124
|
const counterStore = new Low(new JSONFile(`${resolvedDatabasePath}.counters.json`), {});
|
|
122
125
|
await counterStore.read();
|
|
123
126
|
const read = async () => {
|
|
124
|
-
database.data = await readDatabaseFile(resolvedDatabasePath, keys);
|
|
127
|
+
database.data = freezeSnapshot(await readDatabaseFile(resolvedDatabasePath, keys));
|
|
125
128
|
return database.data;
|
|
126
129
|
};
|
|
127
130
|
const update = (operation) => schedule(async () => {
|
|
@@ -130,27 +133,27 @@ const createDiskDatabaseStore = async (databasePath, keys) => {
|
|
|
130
133
|
const draft = { data: structuredClone(database.data), counters: structuredClone(counterStore.data) };
|
|
131
134
|
const result = operation(draft, database.data);
|
|
132
135
|
validateDraft(draft.data, keys);
|
|
133
|
-
//
|
|
136
|
+
// Сначала сохраняем счётчики: ошибка записи может оставить пропуск, но не повторный номер.
|
|
134
137
|
if (JSON.stringify(draft.counters) !== JSON.stringify(counterStore.data)) {
|
|
135
138
|
counterStore.data = draft.counters;
|
|
136
139
|
await counterStore.write();
|
|
137
140
|
}
|
|
138
141
|
await database.adapter.write(draft.data);
|
|
139
|
-
database.data = draft.data;
|
|
142
|
+
database.data = freezeSnapshot(draft.data);
|
|
140
143
|
return result;
|
|
141
144
|
});
|
|
142
145
|
return { database, path: resolvedDatabasePath, read, update };
|
|
143
146
|
};
|
|
144
147
|
const createMemoryDatabaseStore = (sourceData, keys) => {
|
|
145
148
|
validateDatabase(sourceData, keys);
|
|
146
|
-
const database = { data: structuredClone(sourceData), counters: {} };
|
|
149
|
+
const database = { data: freezeSnapshot(structuredClone(sourceData)), counters: {} };
|
|
147
150
|
const schedule = createSerialQueue();
|
|
148
151
|
const read = async () => database.data;
|
|
149
152
|
const update = (operation) => schedule(() => {
|
|
150
153
|
const draft = structuredClone(database);
|
|
151
154
|
const result = operation(draft, database.data);
|
|
152
155
|
validateDraft(draft.data, keys);
|
|
153
|
-
database.data = draft.data;
|
|
156
|
+
database.data = freezeSnapshot(draft.data);
|
|
154
157
|
database.counters = draft.counters;
|
|
155
158
|
return result;
|
|
156
159
|
});
|
|
@@ -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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"}
|
|
@@ -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.
|
|
@@ -45,7 +46,8 @@ export declare class Engine {
|
|
|
45
46
|
/** Выполняет одну операцию записи в транзакции, включая связи, права и подготовку ответа.
|
|
46
47
|
* @example Режим update с { 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, actor?: ActorSource): Promise<T>;
|
|
49
51
|
/** Вычисляет каскад удаления, проверяет запрещающие связи и меняет только черновик данных.
|
|
50
52
|
* @example Удаление родителя при cascade → удалённые зависимые записи; restrict → исключение.
|
|
51
53
|
*/
|
package/dist/src/core/engine.js
CHANGED
|
@@ -5,13 +5,14 @@ import { inferModel, isReverseRelation, readPath, validateRecord } from './model
|
|
|
5
5
|
import { MutationWriter } from './mutations/write.js';
|
|
6
6
|
import { executeList, prepareList } from './query/execute.js';
|
|
7
7
|
import { isRef, keyOf, makeContext, related, resolveField, rootRef, sourceValues } from './records.js';
|
|
8
|
-
import { isObject } from './utils.js';
|
|
8
|
+
import { defined, isObject } from './utils.js';
|
|
9
9
|
export class Engine {
|
|
10
10
|
store;
|
|
11
11
|
model;
|
|
12
12
|
pageSize;
|
|
13
13
|
maxPageSize;
|
|
14
14
|
inferredModels = new WeakMap();
|
|
15
|
+
reservedCounters = new WeakSet();
|
|
15
16
|
constructor(store, model, pageSize = DEFAULT_PAGE_SIZE, maxPageSize = DEFAULT_MAX_PAGE_SIZE) {
|
|
16
17
|
this.store = store;
|
|
17
18
|
this.model = model;
|
|
@@ -94,7 +95,8 @@ export class Engine {
|
|
|
94
95
|
const child = resolveField(ref, node);
|
|
95
96
|
if (Array.isArray(child))
|
|
96
97
|
child.forEach((v) => {
|
|
97
|
-
|
|
98
|
+
if (isRef(v))
|
|
99
|
+
visit(v);
|
|
98
100
|
});
|
|
99
101
|
else if (isRef(child))
|
|
100
102
|
visit(child);
|
|
@@ -108,9 +110,6 @@ export class Engine {
|
|
|
108
110
|
visit(rootRef(context, entity, record));
|
|
109
111
|
}
|
|
110
112
|
}
|
|
111
|
-
/** Выполняет одну операцию записи в транзакции, включая связи, права и подготовку ответа.
|
|
112
|
-
* @example Режим update с { name: 'Анна' } → обновлённая запись; ошибка проверки → прежние данные.
|
|
113
|
-
*/
|
|
114
113
|
async mutate(entity, mode, key, body, prepare, actor) {
|
|
115
114
|
const currentActor = () => (typeof actor === 'function' ? actor() : actor);
|
|
116
115
|
if (this.model.options.auth && !currentActor())
|
|
@@ -122,27 +121,34 @@ export class Engine {
|
|
|
122
121
|
throw domainError('INVALID_INPUT', 'id is generated and immutable');
|
|
123
122
|
}
|
|
124
123
|
const outcome = await this.store.update((database, before) => {
|
|
124
|
+
// Используем описание того же снимка, который хранилище прочитало внутри очереди.
|
|
125
|
+
this.model = this.modelFor(before);
|
|
126
|
+
const currentEntity = this.model.byCollection.get(entity.collection);
|
|
127
|
+
if (!currentEntity)
|
|
128
|
+
throw domainError('NOT_FOUND', 'Resource not found');
|
|
129
|
+
entity = currentEntity;
|
|
125
130
|
// Пока запрос ждал очередь, токен мог быть отозван, а права пользователя — изменены.
|
|
126
131
|
const lifecycle = new RecordMutation(database.data, this.model, currentActor(), before);
|
|
127
132
|
const finish = (data, record) => {
|
|
128
133
|
const model = this.modelFor(data);
|
|
129
|
-
const currentEntity = model.byCollection.get(entity.collection);
|
|
134
|
+
const currentEntity = defined(model.byCollection.get(entity.collection), entity.collection);
|
|
130
135
|
const ref = rootRef(makeContext(data, model), currentEntity, record);
|
|
131
136
|
const output = prepare ? prepare(ref) : ref;
|
|
132
137
|
return { model: data === database.data || this.model.explicit ? model : this.modelFor(database.data), output };
|
|
133
138
|
};
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
for (const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
139
|
+
// Свой подтверждённый снимок уже содержит зарезервированные номера. Новый снимок с диска проверяем снова.
|
|
140
|
+
if (!this.reservedCounters.has(before))
|
|
141
|
+
for (const owner of this.model.entities)
|
|
142
|
+
for (const [field, definition] of Object.entries(owner.root.children))
|
|
143
|
+
if (definition.generated === 'increment') {
|
|
144
|
+
database.counters ??= {};
|
|
145
|
+
const counters = database.counters;
|
|
146
|
+
const name = `${owner.collection}.${field}`;
|
|
147
|
+
const maximum = (database.data[owner.collection] ?? []).reduce((max, row) => (typeof row[field] === 'number' ? Math.max(max, row[field]) : max), counters[name] ?? 0);
|
|
148
|
+
if (!Number.isSafeInteger(maximum) || maximum < 0)
|
|
149
|
+
throw domainError('CONFLICT', 'Invalid increment counter');
|
|
150
|
+
counters[name] = maximum;
|
|
151
|
+
}
|
|
146
152
|
if (mode === 'delete') {
|
|
147
153
|
const context = makeContext(database.data, this.model);
|
|
148
154
|
const current = this.find(context, entity, key);
|
|
@@ -154,7 +160,7 @@ export class Engine {
|
|
|
154
160
|
this.cascade(context, current, lifecycle);
|
|
155
161
|
lifecycle.finish();
|
|
156
162
|
this.validateData(database.data);
|
|
157
|
-
return finish(entity.softDelete ? database.data :
|
|
163
|
+
return finish(entity.softDelete ? database.data : this.store.database.data, current.value);
|
|
158
164
|
}
|
|
159
165
|
const writer = new MutationWriter(database, this.model, mode === 'replace' ? 'replace' : 'update', (owner, record) => lifecycle.write(owner, record));
|
|
160
166
|
const record = writer.write(entity, mode, key, body);
|
|
@@ -163,6 +169,7 @@ export class Engine {
|
|
|
163
169
|
this.validateData(database.data);
|
|
164
170
|
return finish(database.data, record);
|
|
165
171
|
});
|
|
172
|
+
this.reservedCounters.add(this.store.database.data);
|
|
166
173
|
this.model = outcome.model;
|
|
167
174
|
return outcome.output;
|
|
168
175
|
}
|
|
@@ -173,7 +180,7 @@ export class Engine {
|
|
|
173
180
|
if (!this.model.explicit) {
|
|
174
181
|
lifecycle.deleteGroup(initial, new Set([initial.value]));
|
|
175
182
|
if (!initial.entity.softDelete) {
|
|
176
|
-
const rows = context.data[initial.entity.collection];
|
|
183
|
+
const rows = defined(context.data[initial.entity.collection], initial.entity.collection);
|
|
177
184
|
rows.splice(rows.indexOf(initial.value), 1);
|
|
178
185
|
}
|
|
179
186
|
lifecycle.capturePruned(initial);
|
|
@@ -202,7 +209,8 @@ export class Engine {
|
|
|
202
209
|
collect(v);
|
|
203
210
|
else if (Array.isArray(v))
|
|
204
211
|
v.forEach((x) => {
|
|
205
|
-
|
|
212
|
+
if (isRef(x))
|
|
213
|
+
collect(x);
|
|
206
214
|
});
|
|
207
215
|
}
|
|
208
216
|
}
|
|
@@ -213,7 +221,7 @@ export class Engine {
|
|
|
213
221
|
.forEach(collect);
|
|
214
222
|
const pending = [initial.value];
|
|
215
223
|
for (let index = 0; index < pending.length; index++) {
|
|
216
|
-
for (const { ref, node } of dependents.get(pending[index]) ?? []) {
|
|
224
|
+
for (const { ref, node } of dependents.get(defined(pending[index], 'cascade record')) ?? []) {
|
|
217
225
|
if (node.onDelete !== 'cascade' || !survives(ref))
|
|
218
226
|
continue;
|
|
219
227
|
deleted.add(ref.value);
|
|
@@ -241,8 +249,9 @@ export class Engine {
|
|
|
241
249
|
}
|
|
242
250
|
};
|
|
243
251
|
for (const entity of this.model.entities) {
|
|
244
|
-
|
|
245
|
-
context.data[entity.collection]
|
|
252
|
+
const remaining = (context.data[entity.collection] ?? []).filter((record) => entity.softDelete || !deleted.has(record));
|
|
253
|
+
context.data[entity.collection] = remaining;
|
|
254
|
+
remaining.forEach((record) => {
|
|
246
255
|
if (!deleted.has(record))
|
|
247
256
|
prune(entity.root, record);
|
|
248
257
|
});
|