@kollors/deep-json-server 1.0.0-alpha.6 → 1.0.0-alpha.8
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 +373 -230
- package/README.ru.md +370 -227
- package/dist/bin/deep-json-server.js +1 -1
- package/dist/bin/deep-json-server.js.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/src/auth/contract.d.ts +6 -2
- package/dist/src/auth/contract.js +8 -1
- package/dist/src/auth/contract.js.map +1 -1
- package/dist/src/auth/input.d.ts +18 -0
- package/dist/src/auth/input.js +34 -0
- package/dist/src/auth/input.js.map +1 -0
- package/dist/src/auth/password.d.ts +13 -0
- package/dist/src/auth/password.js +17 -1
- package/dist/src/auth/password.js.map +1 -1
- package/dist/src/auth/routes.d.ts +3 -0
- package/dist/src/auth/routes.js +6 -0
- package/dist/src/auth/routes.js.map +1 -1
- package/dist/src/auth/service.d.ts +64 -4
- package/dist/src/auth/service.js +167 -61
- package/dist/src/auth/service.js.map +1 -1
- package/dist/src/auth/store.d.ts +26 -0
- package/dist/src/auth/store.js +82 -0
- package/dist/src/auth/store.js.map +1 -0
- package/dist/src/cli/index.d.ts +7 -0
- package/dist/src/{cli.js → cli/index.js} +31 -15
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/core/config-values.d.ts +28 -0
- package/dist/src/core/config-values.js +53 -0
- package/dist/src/core/config-values.js.map +1 -0
- package/dist/src/{constants.d.ts → core/constants.d.ts} +1 -1
- package/dist/src/{constants.js → core/constants.js} +1 -1
- package/dist/src/core/constants.js.map +1 -0
- package/dist/src/core/database.d.ts +53 -0
- package/dist/src/{database.js → core/database.js} +23 -3
- package/dist/src/core/database.js.map +1 -0
- package/dist/src/core/engine.d.ts +65 -0
- package/dist/src/{engine.js → core/engine.js} +114 -59
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/{errors.d.ts → core/errors.d.ts} +4 -1
- package/dist/src/core/errors.js +12 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/http-errors.d.ts +9 -0
- package/dist/src/core/http-errors.js +15 -0
- package/dist/src/core/http-errors.js.map +1 -0
- package/dist/src/core/lifecycle/mutation.d.ts +49 -0
- package/dist/src/core/lifecycle/mutation.js +170 -0
- package/dist/src/core/lifecycle/mutation.js.map +1 -0
- package/dist/src/core/lifecycle/options.d.ts +21 -0
- package/dist/src/core/lifecycle/options.js +19 -0
- package/dist/src/core/lifecycle/options.js.map +1 -0
- package/dist/src/core/model.d.ts +131 -0
- package/dist/src/{model.js → core/model.js} +106 -10
- package/dist/src/core/model.js.map +1 -0
- package/dist/src/{mutations → core/mutations}/write.d.ts +4 -4
- package/dist/src/{mutations → core/mutations}/write.js +14 -4
- package/dist/src/core/mutations/write.js.map +1 -0
- package/dist/src/core/operations.d.ts +33 -0
- package/dist/src/core/operations.js +10 -0
- package/dist/src/core/operations.js.map +1 -0
- package/dist/src/core/pagination.d.ts +10 -0
- package/dist/src/core/pagination.js +13 -0
- package/dist/src/core/pagination.js.map +1 -0
- package/dist/src/core/paths.d.ts +16 -0
- package/dist/src/{paths.js → core/paths.js} +16 -0
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/query/contract.d.ts +6 -0
- package/dist/src/{query → core/query}/contract.js +3 -0
- package/dist/src/core/query/contract.js.map +1 -0
- package/dist/src/core/query/filter.d.ts +6 -0
- package/dist/src/{query → core/query}/filter.js +18 -4
- package/dist/src/core/query/filter.js.map +1 -0
- package/dist/src/core/query/options.d.ts +30 -0
- package/dist/src/{query → core/query}/options.js +12 -0
- package/dist/src/core/query/options.js.map +1 -0
- package/dist/src/core/records.d.ts +46 -0
- package/dist/src/{records.js → core/records.js} +24 -3
- package/dist/src/core/records.js.map +1 -0
- package/dist/src/core/relation-metadata.d.ts +15 -0
- package/dist/src/{relation-metadata.js → core/relation-metadata.js} +7 -1
- package/dist/src/core/relation-metadata.js.map +1 -0
- package/dist/src/core/types.d.ts +10 -0
- package/dist/src/{types.js.map → core/types.js.map} +1 -1
- package/dist/src/core/utils.d.ts +56 -0
- package/dist/src/core/utils.js +102 -0
- package/dist/src/core/utils.js.map +1 -0
- package/dist/src/files/contract.d.ts +33 -0
- package/dist/src/files/contract.js +25 -3
- package/dist/src/files/contract.js.map +1 -1
- package/dist/src/files/disk-store.d.ts +3 -0
- package/dist/src/files/disk-store.js +25 -18
- package/dist/src/files/disk-store.js.map +1 -1
- package/dist/src/files/http.d.ts +8 -3
- package/dist/src/files/http.js +9 -0
- package/dist/src/files/http.js.map +1 -1
- package/dist/src/files/index.d.ts +4 -3
- package/dist/src/files/index.js +3 -1
- package/dist/src/files/index.js.map +1 -1
- package/dist/src/files/memory-store.d.ts +4 -1
- package/dist/src/files/memory-store.js +21 -15
- package/dist/src/files/memory-store.js.map +1 -1
- package/dist/src/files/routes.d.ts +3 -0
- package/dist/src/files/routes.js +25 -1
- package/dist/src/files/routes.js.map +1 -1
- package/dist/src/files/streams.d.ts +5 -0
- package/dist/src/files/streams.js +20 -0
- package/dist/src/files/streams.js.map +1 -0
- package/dist/src/graphql/entry.d.ts +12 -3
- package/dist/src/graphql/entry.js +12 -2
- package/dist/src/graphql/entry.js.map +1 -1
- package/dist/src/graphql/generate.d.ts +11 -0
- package/dist/src/graphql/generate.js +17 -0
- package/dist/src/graphql/generate.js.map +1 -0
- package/dist/src/graphql/preflight.d.ts +4 -1
- package/dist/src/graphql/preflight.js +3 -0
- package/dist/src/graphql/preflight.js.map +1 -1
- package/dist/src/graphql/resolvers.d.ts +10 -2
- package/dist/src/graphql/resolvers.js +8 -2
- package/dist/src/graphql/resolvers.js.map +1 -1
- package/dist/src/graphql/routes.d.ts +6 -2
- package/dist/src/graphql/routes.js +6 -3
- package/dist/src/graphql/routes.js.map +1 -1
- package/dist/src/graphql/schema.d.ts +6 -0
- package/dist/src/{graphql.js → graphql/schema.js} +20 -14
- package/dist/src/graphql/schema.js.map +1 -0
- package/dist/src/graphql/write.d.ts +3 -0
- package/dist/src/graphql/write.js +3 -0
- package/dist/src/graphql/write.js.map +1 -1
- package/dist/src/openapi/auth.d.ts +13 -0
- package/dist/src/openapi/auth.js +139 -0
- package/dist/src/openapi/auth.js.map +1 -0
- package/dist/src/openapi/document.d.ts +5 -2
- package/dist/src/openapi/document.js +41 -42
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/entry.d.ts +14 -3
- package/dist/src/openapi/entry.js +12 -1
- package/dist/src/openapi/entry.js.map +1 -1
- package/dist/src/openapi/files.d.ts +6 -0
- package/dist/src/{files/openapi.js → openapi/files.js} +6 -3
- package/dist/src/openapi/files.js.map +1 -0
- package/dist/src/openapi/generate.d.ts +19 -0
- package/dist/src/openapi/generate.js +39 -0
- package/dist/src/openapi/generate.js.map +1 -0
- package/dist/src/openapi/helpers.d.ts +10 -1
- package/dist/src/openapi/helpers.js +9 -0
- package/dist/src/openapi/helpers.js.map +1 -1
- package/dist/src/openapi/options.d.ts +20 -0
- package/dist/src/openapi/options.js +13 -0
- package/dist/src/openapi/options.js.map +1 -0
- package/dist/src/{types.d.ts → openapi/types.d.ts} +1 -10
- package/dist/src/openapi/types.js +2 -0
- package/dist/src/openapi/types.js.map +1 -0
- package/dist/src/openapi/write.d.ts +5 -0
- package/dist/src/openapi/write.js +12 -0
- package/dist/src/openapi/write.js.map +1 -0
- package/dist/src/rest/options.d.ts +11 -2
- package/dist/src/rest/options.js +12 -3
- package/dist/src/rest/options.js.map +1 -1
- package/dist/src/rest/projection.d.ts +10 -4
- package/dist/src/rest/projection.js +10 -4
- package/dist/src/rest/projection.js.map +1 -1
- package/dist/src/rest/routes.d.ts +6 -2
- package/dist/src/rest/routes.js +12 -11
- package/dist/src/rest/routes.js.map +1 -1
- package/dist/src/server/config.d.ts +76 -0
- package/dist/src/{config.js → server/config.js} +71 -74
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/create.d.ts +18 -0
- package/dist/src/{server.js → server/create.js} +33 -28
- package/dist/src/server/create.js.map +1 -0
- package/dist/src/server/features.d.ts +15 -0
- package/dist/src/{features.js → server/features.js} +8 -2
- package/dist/src/server/features.js.map +1 -0
- package/dist/src/server/public.d.ts +3 -3
- package/dist/src/server/public.js +1 -1
- package/dist/src/server/public.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/auth/openapi.d.ts +0 -10
- package/dist/src/auth/openapi.js +0 -62
- package/dist/src/auth/openapi.js.map +0 -1
- package/dist/src/cli.d.ts +0 -4
- package/dist/src/cli.js.map +0 -1
- package/dist/src/config.d.ts +0 -86
- package/dist/src/config.js.map +0 -1
- package/dist/src/constants.js.map +0 -1
- package/dist/src/database.d.ts +0 -20
- package/dist/src/database.js.map +0 -1
- package/dist/src/engine.d.ts +0 -36
- package/dist/src/engine.js.map +0 -1
- package/dist/src/errors.js +0 -9
- package/dist/src/errors.js.map +0 -1
- package/dist/src/features.d.ts +0 -9
- package/dist/src/features.js.map +0 -1
- package/dist/src/files/openapi.d.ts +0 -3
- package/dist/src/files/openapi.js.map +0 -1
- package/dist/src/graphql/public.d.ts +0 -3
- package/dist/src/graphql/public.js +0 -11
- package/dist/src/graphql/public.js.map +0 -1
- package/dist/src/graphql.d.ts +0 -3
- package/dist/src/graphql.js.map +0 -1
- package/dist/src/http/errors.d.ts +0 -6
- package/dist/src/http/errors.js +0 -3
- package/dist/src/http/errors.js.map +0 -1
- package/dist/src/model.d.ts +0 -72
- package/dist/src/model.js.map +0 -1
- package/dist/src/mutations/write.js.map +0 -1
- package/dist/src/openapi/index.d.ts +0 -7
- package/dist/src/openapi/index.js +0 -28
- package/dist/src/openapi/index.js.map +0 -1
- package/dist/src/openapi/public.d.ts +0 -18
- package/dist/src/openapi/public.js +0 -20
- package/dist/src/openapi/public.js.map +0 -1
- package/dist/src/pagination.d.ts +0 -7
- package/dist/src/pagination.js +0 -12
- package/dist/src/pagination.js.map +0 -1
- package/dist/src/paths.d.ts +0 -7
- package/dist/src/paths.js.map +0 -1
- package/dist/src/query/contract.d.ts +0 -3
- package/dist/src/query/contract.js.map +0 -1
- package/dist/src/query/filter.d.ts +0 -3
- package/dist/src/query/filter.js.map +0 -1
- package/dist/src/query/options.d.ts +0 -18
- package/dist/src/query/options.js.map +0 -1
- package/dist/src/records.d.ts +0 -25
- package/dist/src/records.js.map +0 -1
- package/dist/src/relation-metadata.d.ts +0 -9
- package/dist/src/relation-metadata.js.map +0 -1
- package/dist/src/schema.d.ts +0 -8
- package/dist/src/schema.js +0 -13
- package/dist/src/schema.js.map +0 -1
- package/dist/src/server.d.ts +0 -12
- package/dist/src/server.js.map +0 -1
- package/dist/src/utils.d.ts +0 -12
- package/dist/src/utils.js +0 -58
- package/dist/src/utils.js.map +0 -1
- /package/dist/src/{types.js → core/types.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../../src/core/mutations/write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Описывает изменения записей: метод, наличие ключа и тела, код успешного ответа.
|
|
2
|
+
* @example MUTATIONS[0] → { mode: 'create', method: 'POST', hasKey: false, hasBody: true, status: 201 }.
|
|
3
|
+
*/
|
|
4
|
+
export declare const MUTATIONS: readonly [{
|
|
5
|
+
readonly mode: 'create';
|
|
6
|
+
readonly method: 'POST';
|
|
7
|
+
readonly hasKey: false;
|
|
8
|
+
readonly hasBody: true;
|
|
9
|
+
readonly status: 201;
|
|
10
|
+
}, {
|
|
11
|
+
readonly mode: 'replace';
|
|
12
|
+
readonly method: 'PUT';
|
|
13
|
+
readonly hasKey: true;
|
|
14
|
+
readonly hasBody: true;
|
|
15
|
+
readonly status: 200;
|
|
16
|
+
}, {
|
|
17
|
+
readonly mode: 'update';
|
|
18
|
+
readonly method: 'PATCH';
|
|
19
|
+
readonly hasKey: true;
|
|
20
|
+
readonly hasBody: true;
|
|
21
|
+
readonly status: 200;
|
|
22
|
+
}, {
|
|
23
|
+
readonly mode: 'delete';
|
|
24
|
+
readonly method: 'DELETE';
|
|
25
|
+
readonly hasKey: true;
|
|
26
|
+
readonly hasBody: false;
|
|
27
|
+
readonly status: 200;
|
|
28
|
+
}];
|
|
29
|
+
export type Mutation = (typeof MUTATIONS)[number];
|
|
30
|
+
export type MutationMode = Mutation['mode'];
|
|
31
|
+
export type WriteMode = Extract<Mutation, {
|
|
32
|
+
hasBody: true;
|
|
33
|
+
}>['mode'];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Описывает изменения записей: метод, наличие ключа и тела, код успешного ответа.
|
|
2
|
+
* @example MUTATIONS[0] → { mode: 'create', method: 'POST', hasKey: false, hasBody: true, status: 201 }.
|
|
3
|
+
*/
|
|
4
|
+
export const MUTATIONS = [
|
|
5
|
+
{ mode: 'create', method: 'POST', hasKey: false, hasBody: true, status: 201 },
|
|
6
|
+
{ mode: 'replace', method: 'PUT', hasKey: true, hasBody: true, status: 200 },
|
|
7
|
+
{ mode: 'update', method: 'PATCH', hasKey: true, hasBody: true, status: 200 },
|
|
8
|
+
{ mode: 'delete', method: 'DELETE', hasKey: true, hasBody: false, status: 200 },
|
|
9
|
+
];
|
|
10
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../../src/core/operations.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC7E,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5E,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC7E,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE;CACvE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Подставляет размеры страниц по умолчанию и проверяет положительные безопасные целые числа.
|
|
2
|
+
* @example normalizePagination({ maxPageSize: 5 }) → { pageSize: 5, maxPageSize: 5 }; { pageSize: 0 } → ошибка.
|
|
3
|
+
*/
|
|
4
|
+
export declare function normalizePagination(options: {
|
|
5
|
+
pageSize?: unknown;
|
|
6
|
+
maxPageSize?: unknown;
|
|
7
|
+
}): {
|
|
8
|
+
pageSize: number;
|
|
9
|
+
maxPageSize: number;
|
|
10
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getPositiveInteger } from './config-values.js';
|
|
2
|
+
import { DEFAULT_MAX_PAGE_SIZE, DEFAULT_PAGE_SIZE } from './constants.js';
|
|
3
|
+
/** Подставляет размеры страниц по умолчанию и проверяет положительные безопасные целые числа.
|
|
4
|
+
* @example normalizePagination({ maxPageSize: 5 }) → { pageSize: 5, maxPageSize: 5 }; { pageSize: 0 } → ошибка.
|
|
5
|
+
*/
|
|
6
|
+
export function normalizePagination(options) {
|
|
7
|
+
const maxPageSize = getPositiveInteger(options.maxPageSize, 'config.server.maxPageSize') ?? DEFAULT_MAX_PAGE_SIZE;
|
|
8
|
+
const pageSize = getPositiveInteger(options.pageSize, 'config.server.pageSize') ?? Math.min(DEFAULT_PAGE_SIZE, maxPageSize);
|
|
9
|
+
if (pageSize > maxPageSize)
|
|
10
|
+
throw new Error('pageSize exceeds maxPageSize');
|
|
11
|
+
return { pageSize, maxPageSize };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/core/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC1E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsD;IACxF,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,2BAA2B,CAAC,IAAI,qBAAqB,CAAC;IAClH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5H,IAAI,QAAQ,GAAG,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Раскрывает символические ссылки в существующей части пути и сохраняет ещё не созданный остаток.
|
|
2
|
+
* @example Если /tmp/link указывает на /data: /tmp/link/new.json → /data/new.json.
|
|
3
|
+
*/
|
|
4
|
+
export declare function canonicalPath(path: string): Promise<string>;
|
|
5
|
+
/** Собирает пути входных файлов, счётчиков и временных файлов записи без чтения диска.
|
|
6
|
+
* @example auth.users = '/tmp/users.json' → среди защищённых путей '/tmp/users.json' и '/tmp/.users.json.tmp'.
|
|
7
|
+
*/
|
|
8
|
+
export declare function inputPaths(config: {
|
|
9
|
+
database?: unknown;
|
|
10
|
+
files?: unknown;
|
|
11
|
+
auth?: unknown;
|
|
12
|
+
}, directory?: string, sourcePath?: string): string[];
|
|
13
|
+
/** Проверяет по реальным путям и inode, что выходные файлы различны и не совпадают с входными.
|
|
14
|
+
* @example outputs = ['/tmp/a'], inputs = ['/tmp/a'] → ошибка; разные свободные пути → Promise<void>.
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateExportPaths(outputs: string[], inputs: string[]): Promise<void>;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { realpath, stat } from 'node:fs/promises';
|
|
2
2
|
import { basename, dirname, resolve } from 'node:path';
|
|
3
3
|
import { isObject, isSystemError } from './utils.js';
|
|
4
|
+
/** Раскрывает символические ссылки в существующей части пути и сохраняет ещё не созданный остаток.
|
|
5
|
+
* @example Если /tmp/link указывает на /data: /tmp/link/new.json → /data/new.json.
|
|
6
|
+
*/
|
|
4
7
|
export async function canonicalPath(path) {
|
|
5
8
|
const absolute = resolve(path);
|
|
6
9
|
try {
|
|
@@ -15,6 +18,9 @@ export async function canonicalPath(path) {
|
|
|
15
18
|
return resolve(await canonicalPath(parent), basename(absolute));
|
|
16
19
|
}
|
|
17
20
|
}
|
|
21
|
+
/** Собирает пути входных файлов, счётчиков и временных файлов записи без чтения диска.
|
|
22
|
+
* @example auth.users = '/tmp/users.json' → среди защищённых путей '/tmp/users.json' и '/tmp/.users.json.tmp'.
|
|
23
|
+
*/
|
|
18
24
|
export function inputPaths(config, directory = '.', sourcePath) {
|
|
19
25
|
const database = isObject(config.database) ? config.database : {};
|
|
20
26
|
const files = isObject(config.files) ? config.files : {};
|
|
@@ -22,8 +28,15 @@ export function inputPaths(config, directory = '.', sourcePath) {
|
|
|
22
28
|
const paths = [sourcePath, database.path, database.schema, files.metadata, auth.users].filter((path) => typeof path === 'string');
|
|
23
29
|
if (typeof database.path === 'string')
|
|
24
30
|
paths.push(`${database.path}.counters.json`);
|
|
31
|
+
// JSONFile использует эти соседние файлы при записи; они тоже содержат защищённые данные.
|
|
32
|
+
for (const path of [database.path, typeof database.path === 'string' ? `${database.path}.counters.json` : undefined, auth.users])
|
|
33
|
+
if (typeof path === 'string')
|
|
34
|
+
paths.push(resolve(directory, dirname(path), `.${basename(path)}.tmp`));
|
|
25
35
|
return paths.map((path) => resolve(directory, path));
|
|
26
36
|
}
|
|
37
|
+
/** Читает идентификатор файла из устройства и inode; для отсутствующего файла возвращает исходный путь.
|
|
38
|
+
* @example Существующий файл → строка dev:ino; отсутствующий /tmp/new → /tmp/new.
|
|
39
|
+
*/
|
|
27
40
|
async function identity(path) {
|
|
28
41
|
try {
|
|
29
42
|
const info = await stat(path);
|
|
@@ -35,6 +48,9 @@ async function identity(path) {
|
|
|
35
48
|
return path;
|
|
36
49
|
}
|
|
37
50
|
}
|
|
51
|
+
/** Проверяет по реальным путям и inode, что выходные файлы различны и не совпадают с входными.
|
|
52
|
+
* @example outputs = ['/tmp/a'], inputs = ['/tmp/a'] → ошибка; разные свободные пути → Promise<void>.
|
|
53
|
+
*/
|
|
38
54
|
export async function validateExportPaths(outputs, inputs) {
|
|
39
55
|
const canonicalOutputs = await Promise.all(outputs.map(canonicalPath));
|
|
40
56
|
const canonicalInputs = await Promise.all(inputs.map(canonicalPath));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Node } from '../model.js';
|
|
2
|
+
export type Operand = 'value' | 'values' | 'comparison' | 'text' | 'element' | 'condition';
|
|
3
|
+
/** Возвращает допустимые операторы и виды их аргументов для типа значения.
|
|
4
|
+
* @example Для boolean без массива → { not: 'condition', eq: 'value', ne: 'value', in: 'values' }.
|
|
5
|
+
*/
|
|
6
|
+
export declare const operatorsFor: (node: Node) => Record<string, Operand>;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/** Возвращает допустимые операторы и виды их аргументов для типа значения.
|
|
2
|
+
* @example Для boolean без массива → { not: 'condition', eq: 'value', ne: 'value', in: 'values' }.
|
|
3
|
+
*/
|
|
1
4
|
export const operatorsFor = (node) => {
|
|
2
5
|
const result = { not: 'condition' };
|
|
3
6
|
if (node.many) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../../src/core/query/contract.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAU,EAA2B,EAAE;IAClE,MAAM,MAAM,GAA4B,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3G,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;QACxG,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAC/G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Node } from '../model.js';
|
|
2
|
+
export type Predicate = (value: unknown) => boolean;
|
|
3
|
+
/** Компилирует условия объекта в предикат; учитывает логические операторы и фильтрацию удалённых записей.
|
|
4
|
+
* @example Для числового age: compileWhere(node, { age: { gte: 18 } })({ age: 20 }) → true.
|
|
5
|
+
*/
|
|
6
|
+
export declare function compileWhere(node: Node, input: unknown, depth?: number, defaults?: boolean): Predicate;
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { mentionsDeletedAt } from '../lifecycle/options.js';
|
|
1
2
|
import { isEqual, isObject } from '../utils.js';
|
|
2
3
|
import { operatorsFor } from './contract.js';
|
|
3
4
|
import { badQuery, childrenOf } from './options.js';
|
|
4
5
|
const comparable = (value) => typeof value === 'string' || typeof value === 'number';
|
|
5
6
|
const equal = (left, right) => isEqual(left, right);
|
|
7
|
+
/** Компилирует условие поля в предикат, проверяя операторы и их аргументы.
|
|
8
|
+
* @example Для строкового узла condition(node, { contains: 'ан' }, 0)('Анна') → true.
|
|
9
|
+
*/
|
|
6
10
|
function condition(node, input, depth) {
|
|
7
11
|
if (!isObject(input) || depth > 32)
|
|
8
12
|
badQuery('Field filter must contain operators with depth at most 32');
|
|
@@ -19,7 +23,12 @@ function condition(node, input, depth) {
|
|
|
19
23
|
}
|
|
20
24
|
if (operand === 'element') {
|
|
21
25
|
const nested = condition({ ...node, many: false }, value, depth + 1);
|
|
22
|
-
return (field) =>
|
|
26
|
+
return (field) => {
|
|
27
|
+
if (!Array.isArray(field))
|
|
28
|
+
return false;
|
|
29
|
+
const values = node.relation?.softDelete && !mentionsDeletedAt(value) ? field.filter((item) => isObject(item) && item.deletedAt == null) : field;
|
|
30
|
+
return operator === 'every' ? values.every(nested) : operator === 'none' ? !values.some(nested) : values.some(nested);
|
|
31
|
+
};
|
|
23
32
|
}
|
|
24
33
|
const values = operand === 'values' ? value : [value];
|
|
25
34
|
if (!Array.isArray(values))
|
|
@@ -59,18 +68,21 @@ function condition(node, input, depth) {
|
|
|
59
68
|
});
|
|
60
69
|
return (value) => predicates.every((predicate) => predicate(value));
|
|
61
70
|
}
|
|
62
|
-
|
|
71
|
+
/** Компилирует условия объекта в предикат; учитывает логические операторы и фильтрацию удалённых записей.
|
|
72
|
+
* @example Для числового age: compileWhere(node, { age: { gte: 18 } })({ age: 20 }) → true.
|
|
73
|
+
*/
|
|
74
|
+
export function compileWhere(node, input, depth = 0, defaults = true) {
|
|
63
75
|
if (!isObject(input) || depth > 32)
|
|
64
76
|
badQuery('where must be an object with depth at most 32');
|
|
65
77
|
const predicates = Object.entries(input).map(([key, value]) => {
|
|
66
78
|
if (key === 'and' || key === 'or') {
|
|
67
79
|
if (!Array.isArray(value) || (key === 'or' && !value.length))
|
|
68
80
|
badQuery(`Invalid ${key}`);
|
|
69
|
-
const nested = value.map((item) => compileWhere(node, item, depth + 1));
|
|
81
|
+
const nested = value.map((item) => compileWhere(node, item, depth + 1, false));
|
|
70
82
|
return (field) => (key === 'and' ? nested.every((p) => p(field)) : nested.some((p) => p(field)));
|
|
71
83
|
}
|
|
72
84
|
if (key === 'not') {
|
|
73
|
-
const nested = compileWhere(node, value, depth + 1);
|
|
85
|
+
const nested = compileWhere(node, value, depth + 1, false);
|
|
74
86
|
return (field) => !nested(field);
|
|
75
87
|
}
|
|
76
88
|
const child = childrenOf(node)[key];
|
|
@@ -81,6 +93,8 @@ export function compileWhere(node, input, depth = 0) {
|
|
|
81
93
|
const nested = condition(child, value, depth + 1);
|
|
82
94
|
return (field) => isObject(field) && nested(Object.hasOwn(field, key) ? field[key] : undefined);
|
|
83
95
|
});
|
|
96
|
+
if (defaults && (node.relation?.softDelete || node.softDelete) && !mentionsDeletedAt(input))
|
|
97
|
+
predicates.push((value) => isObject(value) && value.deletedAt == null);
|
|
84
98
|
return (value) => isObject(value) && predicates.every((predicate) => predicate(value));
|
|
85
99
|
}
|
|
86
100
|
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../src/core/query/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Node } from '../model.js';
|
|
2
|
+
export interface Order {
|
|
3
|
+
field: string;
|
|
4
|
+
direction: 'ASC' | 'DESC';
|
|
5
|
+
}
|
|
6
|
+
export interface Pager {
|
|
7
|
+
page?: number;
|
|
8
|
+
pageSize?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ListOptions {
|
|
11
|
+
where?: Record<string, unknown>;
|
|
12
|
+
order?: Order[];
|
|
13
|
+
pager?: Pager;
|
|
14
|
+
}
|
|
15
|
+
/** Выбрасывает исключение с кодом неверного запроса.
|
|
16
|
+
* @example badQuery('Unknown field') → исключение с code = 'INVALID_QUERY'.
|
|
17
|
+
*/
|
|
18
|
+
export declare function badQuery(message: string): never;
|
|
19
|
+
/** Возвращает поля целевой сущности для связи или собственные дочерние поля узла.
|
|
20
|
+
* @example childrenOf({ children: { name: field }, … }) → { name: field }.
|
|
21
|
+
*/
|
|
22
|
+
export declare function childrenOf(node: Node): Record<string, Node>;
|
|
23
|
+
/** Находит узел по пути и проверяет доступность; режим scalarOnly запрещает связи и массивы.
|
|
24
|
+
* @example nodeAt(root, 'profile.name') → узел name; неизвестный путь → ошибка.
|
|
25
|
+
*/
|
|
26
|
+
export declare function nodeAt(node: Node, path: string, scalarOnly?: boolean): Node;
|
|
27
|
+
/** Собирает пути доступных скалярных полей, пропуская массивы, связи и скрытые поля.
|
|
28
|
+
* @example Для объекта profile с полем name → ['profile.name'].
|
|
29
|
+
*/
|
|
30
|
+
export declare function sortableFields(node: Node, prefix?: string): string[];
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { domainError } from '../errors.js';
|
|
2
2
|
import { pathParts } from '../model.js';
|
|
3
|
+
/** Выбрасывает исключение с кодом неверного запроса.
|
|
4
|
+
* @example badQuery('Unknown field') → исключение с code = 'INVALID_QUERY'.
|
|
5
|
+
*/
|
|
3
6
|
export function badQuery(message) {
|
|
4
7
|
throw domainError('INVALID_QUERY', message);
|
|
5
8
|
}
|
|
9
|
+
/** Возвращает поля целевой сущности для связи или собственные дочерние поля узла.
|
|
10
|
+
* @example childrenOf({ children: { name: field }, … }) → { name: field }.
|
|
11
|
+
*/
|
|
6
12
|
export function childrenOf(node) {
|
|
7
13
|
return node.relation?.root.children ?? node.children;
|
|
8
14
|
}
|
|
15
|
+
/** Находит узел по пути и проверяет доступность; режим scalarOnly запрещает связи и массивы.
|
|
16
|
+
* @example nodeAt(root, 'profile.name') → узел name; неизвестный путь → ошибка.
|
|
17
|
+
*/
|
|
9
18
|
export function nodeAt(node, path, scalarOnly = false) {
|
|
10
19
|
let current = node;
|
|
11
20
|
const parts = pathParts(path);
|
|
@@ -21,6 +30,9 @@ export function nodeAt(node, path, scalarOnly = false) {
|
|
|
21
30
|
});
|
|
22
31
|
return current;
|
|
23
32
|
}
|
|
33
|
+
/** Собирает пути доступных скалярных полей, пропуская массивы, связи и скрытые поля.
|
|
34
|
+
* @example Для объекта profile с полем name → ['profile.name'].
|
|
35
|
+
*/
|
|
24
36
|
export function sortableFields(node, prefix = '') {
|
|
25
37
|
return Object.entries(childrenOf(node)).flatMap(([key, child]) => {
|
|
26
38
|
if (child.writeOnly || child.mixed || child.many || child.relation)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../src/core/query/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAcxC;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;AACvD,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,IAAU,EAAE,IAAY,EAAE,UAAU,GAAG,KAAK;IACjE,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS;YAAE,QAAQ,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QACpH,IAAI,KAAK,CAAC,KAAK;YAAE,QAAQ,CAAC,SAAS,IAAI,qDAAqD,CAAC,CAAC;QAC9F,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAAE,QAAQ,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAChJ,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,MAAM,GAAG,EAAE;IACpD,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC/D,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC9E,MAAM,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC;QAC1B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type Entity, type Model, type Node } from './model.js';
|
|
2
|
+
import type { DatabaseData, JsonObject } from './types.js';
|
|
3
|
+
declare const REF: unique symbol;
|
|
4
|
+
export interface Ref {
|
|
5
|
+
[REF]: true;
|
|
6
|
+
entity: Entity;
|
|
7
|
+
node: Node;
|
|
8
|
+
value: JsonObject;
|
|
9
|
+
root: JsonObject;
|
|
10
|
+
bindings: Record<string, JsonObject>;
|
|
11
|
+
context: Context;
|
|
12
|
+
}
|
|
13
|
+
export interface Context {
|
|
14
|
+
data: DatabaseData;
|
|
15
|
+
model: Model;
|
|
16
|
+
indexes: Map<string, Map<string, JsonObject[]>>;
|
|
17
|
+
}
|
|
18
|
+
/** Создаёт контекст чтения с пустым кешем индексов; данные и модель передаются по ссылке.
|
|
19
|
+
* @example makeContext(data, model) → { data, model, indexes: Map(0) }.
|
|
20
|
+
*/
|
|
21
|
+
export declare const makeContext: (data: DatabaseData, model: Model) => Context;
|
|
22
|
+
/** Оборачивает запись ссылкой с контекстом и корневым узлом без копирования записи.
|
|
23
|
+
* @example rootRef(context, entity, row).value → row; .bindings → {}.
|
|
24
|
+
*/
|
|
25
|
+
export declare const rootRef: (context: Context, entity: Entity, value: JsonObject) => Ref;
|
|
26
|
+
/** Строит ключ скалярного значения с префиксом типа, различая числа и строки.
|
|
27
|
+
* @example keyOf(1) → 'number:1'; keyOf('1') → 'string:1'.
|
|
28
|
+
*/
|
|
29
|
+
export declare const keyOf: (value: unknown) => string;
|
|
30
|
+
/** Читает ключи связи из ближайшего вложенного объекта или из корневой записи.
|
|
31
|
+
* @example При source = 'authorId' и записи { authorId: 7 } → [7].
|
|
32
|
+
*/
|
|
33
|
+
export declare function sourceValues(ref: Ref, node: Node): unknown[];
|
|
34
|
+
/** Находит связанные записи по сопоставленным ключам и кеширует индекс в контексте; убирает повторы.
|
|
35
|
+
* @example Ключи [1, 1, 2] при двух совпавших записях → две ссылки на записи.
|
|
36
|
+
*/
|
|
37
|
+
export declare function related(ref: Ref, node: Node): Ref[];
|
|
38
|
+
/** Возвращает значение поля или ссылки на связанные объекты, учитывая отсутствующие и удалённые записи.
|
|
39
|
+
* @example Для обычного name в записи { name: 'Анна' } → 'Анна'; отсутствующая одиночная связь → null.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveField(ref: Ref, node: Node, includeDeleted?: boolean): unknown;
|
|
42
|
+
/** Проверяет наличие внутренней метки ссылки на запись.
|
|
43
|
+
* @example isRef({ id: '1' }) → false; isRef(rootRef(context, entity, row)) → true.
|
|
44
|
+
*/
|
|
45
|
+
export declare const isRef: (value: unknown) => value is Ref;
|
|
46
|
+
export {};
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import { bindingFor, childName, readPath } from './model.js';
|
|
2
2
|
import { isObject } from './utils.js';
|
|
3
3
|
const REF = Symbol('record reference');
|
|
4
|
+
/** Создаёт контекст чтения с пустым кешем индексов; данные и модель передаются по ссылке.
|
|
5
|
+
* @example makeContext(data, model) → { data, model, indexes: Map(0) }.
|
|
6
|
+
*/
|
|
4
7
|
export const makeContext = (data, model) => ({ data, model, indexes: new Map() });
|
|
8
|
+
/** Оборачивает запись ссылкой с контекстом и корневым узлом без копирования записи.
|
|
9
|
+
* @example rootRef(context, entity, row).value → row; .bindings → {}.
|
|
10
|
+
*/
|
|
5
11
|
export const rootRef = (context, entity, value) => ({ [REF]: true, context, entity, node: entity.root, value, root: value, bindings: {} });
|
|
12
|
+
/** Строит ключ скалярного значения с префиксом типа, различая числа и строки.
|
|
13
|
+
* @example keyOf(1) → 'number:1'; keyOf('1') → 'string:1'.
|
|
14
|
+
*/
|
|
6
15
|
export const keyOf = (value) => `${typeof value}:${String(value)}`;
|
|
16
|
+
/** Читает ключи связи из ближайшего вложенного объекта или из корневой записи.
|
|
17
|
+
* @example При source = 'authorId' и записи { authorId: 7 } → [7].
|
|
18
|
+
*/
|
|
7
19
|
export function sourceValues(ref, node) {
|
|
8
20
|
const path = node.source;
|
|
9
21
|
const binding = bindingFor(ref.bindings, path);
|
|
10
22
|
return binding ? readPath(ref.bindings[binding], path === binding ? [] : path.slice(binding.length + 1)) : readPath(ref.root, path);
|
|
11
23
|
}
|
|
24
|
+
/** Находит связанные записи по сопоставленным ключам и кеширует индекс в контексте; убирает повторы.
|
|
25
|
+
* @example Ключи [1, 1, 2] при двух совпавших записях → две ссылки на записи.
|
|
26
|
+
*/
|
|
12
27
|
export function related(ref, node) {
|
|
13
28
|
const entity = node.relation;
|
|
14
29
|
const indexKey = `${entity.collection}:${node.target}`;
|
|
@@ -30,13 +45,16 @@ export function related(ref, node) {
|
|
|
30
45
|
found.add(record);
|
|
31
46
|
return [...found].map((record) => rootRef(ref.context, entity, record));
|
|
32
47
|
}
|
|
33
|
-
|
|
48
|
+
/** Возвращает значение поля или ссылки на связанные объекты, учитывая отсутствующие и удалённые записи.
|
|
49
|
+
* @example Для обычного name в записи { name: 'Анна' } → 'Анна'; отсутствующая одиночная связь → null.
|
|
50
|
+
*/
|
|
51
|
+
export function resolveField(ref, node, includeDeleted = false) {
|
|
34
52
|
if (node.relation) {
|
|
35
|
-
const records = related(ref, node);
|
|
53
|
+
const records = related(ref, node).filter((record) => node.many || includeDeleted || !record.entity.softDelete || record.value.deletedAt == null);
|
|
36
54
|
return node.many ? records : (records[0] ?? null);
|
|
37
55
|
}
|
|
38
56
|
const key = childName(node);
|
|
39
|
-
const value = Object.hasOwn(ref.value, key) ? ref.value[key] : undefined;
|
|
57
|
+
const value = Object.hasOwn(ref.value, key) ? ref.value[key] : node.system && !node.internal ? null : undefined;
|
|
40
58
|
if ((ref.context.model.explicit && node.base !== 'object') || value == null)
|
|
41
59
|
return value;
|
|
42
60
|
const wrap = (object) => ({ ...ref, node, value: object, bindings: { ...ref.bindings, [node.path]: object } });
|
|
@@ -44,5 +62,8 @@ export function resolveField(ref, node) {
|
|
|
44
62
|
return value.map((item) => (isObject(item) ? wrap(item) : item));
|
|
45
63
|
return isObject(value) ? wrap(value) : value;
|
|
46
64
|
}
|
|
65
|
+
/** Проверяет наличие внутренней метки ссылки на запись.
|
|
66
|
+
* @example isRef({ id: '1' }) → false; isRef(rootRef(context, entity, row)) → true.
|
|
67
|
+
*/
|
|
47
68
|
export const isRef = (value) => isObject(value) && value[REF] === true;
|
|
48
69
|
//# sourceMappingURL=records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/core/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface RelationMetadata {
|
|
2
|
+
isMany: boolean;
|
|
3
|
+
relationName: string;
|
|
4
|
+
reverseRelationName: string;
|
|
5
|
+
sourceResource: string;
|
|
6
|
+
targetResource: string;
|
|
7
|
+
}
|
|
8
|
+
/** Находит коллекцию по точному имени, единственному числу или обозначению родительской связи.
|
|
9
|
+
* @example resolveRelationResource(['users'], 'user', 'posts') → 'users'.
|
|
10
|
+
*/
|
|
11
|
+
export declare const resolveRelationResource: (resourceNames: string[], relation: string, sourceResource: string) => string | undefined;
|
|
12
|
+
/** Выводит описание связи из суффикса Id или Ids и доступных имён коллекций.
|
|
13
|
+
* @example getRelationMetadata('userId', ['users', 'posts'], 'posts') → { isMany: false, relationName: 'user', reverseRelationName: 'posts', sourceResource: 'posts', targetResource: 'users' }.
|
|
14
|
+
*/
|
|
15
|
+
export declare const getRelationMetadata: (key: string, resourceNames: string[], sourceResource: string) => RelationMetadata | undefined;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { singularize } from './utils.js';
|
|
2
2
|
const SELF_RELATIONS = new Set(['child', 'children', 'parent', 'parents']);
|
|
3
|
+
/** Находит коллекцию по точному имени, единственному числу или обозначению родительской связи.
|
|
4
|
+
* @example resolveRelationResource(['users'], 'user', 'posts') → 'users'.
|
|
5
|
+
*/
|
|
3
6
|
export const resolveRelationResource = (resourceNames, relation, sourceResource) => {
|
|
4
7
|
const resource = resourceNames.find((resourceName) => resourceName === relation) ?? resourceNames.find((resourceName) => singularize(resourceName) === relation);
|
|
5
8
|
if (resource != null) {
|
|
@@ -7,8 +10,11 @@ export const resolveRelationResource = (resourceNames, relation, sourceResource)
|
|
|
7
10
|
}
|
|
8
11
|
return SELF_RELATIONS.has(relation) && resourceNames.includes(sourceResource) ? sourceResource : undefined;
|
|
9
12
|
};
|
|
13
|
+
/** Выводит описание связи из суффикса Id или Ids и доступных имён коллекций.
|
|
14
|
+
* @example getRelationMetadata('userId', ['users', 'posts'], 'posts') → { isMany: false, relationName: 'user', reverseRelationName: 'posts', sourceResource: 'posts', targetResource: 'users' }.
|
|
15
|
+
*/
|
|
10
16
|
export const getRelationMetadata = (key, resourceNames, sourceResource) => {
|
|
11
|
-
//
|
|
17
|
+
// Суффиксы Id и Ids обозначают одиночный ключ и массив ключей.
|
|
12
18
|
const match = key.match(/^(.+)(Id|Ids)$/);
|
|
13
19
|
if (match == null) {
|
|
14
20
|
return undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-metadata.js","sourceRoot":"","sources":["../../../src/core/relation-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAU3E;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,aAAuB,EAAE,QAAgB,EAAE,cAAsB,EAAsB,EAAE;IAC/H,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC;IAEjK,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7G,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,aAAuB,EAAE,cAAsB,EAAgC,EAAE;IAChI,+DAA+D;IAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAE1C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,KAAK,KAAK,CAAC;IAChC,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClI,MAAM,cAAc,GAAG,uBAAuB,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IAE5F,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,MAAM;QACN,YAAY;QACZ,mBAAmB,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc;QAC/F,cAAc;QACd,cAAc;KACf,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type JsonPrimitive = boolean | number | string | null;
|
|
2
|
+
export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
3
|
+
export type JsonObject = {
|
|
4
|
+
[key: string]: JsonValue;
|
|
5
|
+
};
|
|
6
|
+
export type DatabaseId = number | string;
|
|
7
|
+
export type DatabaseRecord = JsonObject;
|
|
8
|
+
export type DatabaseData = Record<string, DatabaseRecord[]>;
|
|
9
|
+
export type QueryValue = string | string[] | undefined;
|
|
10
|
+
export type Query = Record<string, QueryValue>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Проверяет собственные ключи объекта; при неизвестном ключе выбрасывает исключение.
|
|
2
|
+
* @example assertKnownKeys({ x: 1 }, new Set(['x']), 'data') → undefined; { y: 1 } → ошибка.
|
|
3
|
+
*/
|
|
4
|
+
export declare const assertKnownKeys: (value: object, keys: Set<string>, path: string) => void;
|
|
5
|
+
/** Создаёт очередь асинхронных действий. Следующее действие запускается после завершения предыдущего, даже если оно завершилось ошибкой.
|
|
6
|
+
* @example const run = createSerialQueue(); await run(() => 2) → 2.
|
|
7
|
+
*/
|
|
8
|
+
export declare const createSerialQueue: () => <T>(operation: () => Promise<T> | T) => Promise<T>;
|
|
9
|
+
/** Генерирует случайную строку и повторяет генерацию, пока проверка считает её занятой.
|
|
10
|
+
* @example createUniqueId(() => false) → строка из 11 символов; значение меняется при каждом вызове.
|
|
11
|
+
*/
|
|
12
|
+
export declare const createUniqueId: (isUsed: (id: string) => boolean) => string;
|
|
13
|
+
/** Проверяет, что значение является ненулевым объектом, кроме массива. Экземпляры классов тоже подходят.
|
|
14
|
+
* @example isObject({ x: 1 }) → true; isObject(null) → false; isObject([]) → false.
|
|
15
|
+
*/
|
|
16
|
+
export declare const isObject: (value: unknown) => value is Record<string, unknown>;
|
|
17
|
+
/** Исключает имена свойств, через которые можно изменить прототип объекта.
|
|
18
|
+
* @example isSafeKey('name') → true; isSafeKey('__proto__') → false.
|
|
19
|
+
*/
|
|
20
|
+
export declare const isSafeKey: (key: string) => boolean;
|
|
21
|
+
/** Распознаёт экземпляр Error с полем code; наличие поля не гарантирует конкретный код.
|
|
22
|
+
* @example isSystemError(Object.assign(new Error(), { code: 'ENOENT' })) → true.
|
|
23
|
+
*/
|
|
24
|
+
export declare const isSystemError: (error: unknown) => error is NodeJS.ErrnoException;
|
|
25
|
+
/** Рекурсивно сравнивает JSON-значения; порядок ключей объекта не важен, порядок элементов массива важен.
|
|
26
|
+
* @example isEqual({ a: [1] }, { a: [1] }) → true; isEqual([1, 2], [2, 1]) → false.
|
|
27
|
+
*/
|
|
28
|
+
export declare const isEqual: (left: unknown, right: unknown) => boolean;
|
|
29
|
+
/** Проверяет непустой путь и делает его абсолютным относительно рабочего каталога.
|
|
30
|
+
* @example При рабочем каталоге /tmp: resolveDatabasePath('data.json') → '/tmp/data.json'.
|
|
31
|
+
*/
|
|
32
|
+
export declare const resolveDatabasePath: (databasePath: string) => string;
|
|
33
|
+
/** Возвращает единственное число английского существительного.
|
|
34
|
+
* @example singularize('people') → 'person'; singularize('movies') → 'movie'.
|
|
35
|
+
*/
|
|
36
|
+
export declare const singularize: (value: string) => string;
|
|
37
|
+
/** Разбивает строку по символам вне латинских букв и цифр и объединяет части с заглавной буквы.
|
|
38
|
+
* @example toPascalCase('user-profile') → 'UserProfile'; toPascalCase('') → ''.
|
|
39
|
+
*/
|
|
40
|
+
export declare const toPascalCase: (value: string) => string;
|
|
41
|
+
/** Проверяет, что все собственные перечислимые ключи входят в разрешённый список.
|
|
42
|
+
* @example hasOnlyKeys({ name: 'Анна' }, ['name']) → true; hasOnlyKeys({ age: 2 }, ['name']) → false.
|
|
43
|
+
*/
|
|
44
|
+
export declare const hasOnlyKeys: (value: object, allowed: readonly string[]) => boolean;
|
|
45
|
+
/** Возвращает сообщение исключения или строковое представление другого значения.
|
|
46
|
+
* @example errorMessage(new Error('Нет файла')) → 'Нет файла'; errorMessage(404) → '404'.
|
|
47
|
+
*/
|
|
48
|
+
export declare const errorMessage: (value: unknown) => string;
|
|
49
|
+
/** Переводит первый символ в верхний регистр, сохраняя остальные символы.
|
|
50
|
+
* @example capitalize('helloWorld') → 'HelloWorld'; capitalize('') → ''.
|
|
51
|
+
*/
|
|
52
|
+
export declare const capitalize: (value: string) => string;
|
|
53
|
+
/** Проверяет целый номер порта; ноль допустим для автоматического выбора.
|
|
54
|
+
* @example isPortNumber(4001) → true; isPortNumber(65536) → false; isPortNumber('80') → false.
|
|
55
|
+
*/
|
|
56
|
+
export declare const isPortNumber: (value: unknown) => value is number;
|