@kollors/deep-json-server 1.0.0-alpha.1 → 1.0.0-alpha.10
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 +522 -179
- package/README.ru.md +525 -180
- package/dist/bin/deep-json-server.js +1 -1
- package/dist/bin/deep-json-server.js.map +1 -1
- package/dist/index.d.ts +13 -6
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/src/auth/contract.d.ts +31 -0
- package/dist/src/auth/contract.js +12 -0
- package/dist/src/auth/contract.js.map +1 -0
- 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 +17 -0
- package/dist/src/auth/password.js +41 -0
- package/dist/src/auth/password.js.map +1 -0
- package/dist/src/auth/public.d.ts +3 -0
- package/dist/src/auth/public.js +5 -0
- package/dist/src/auth/public.js.map +1 -0
- package/dist/src/auth/routes.d.ts +6 -0
- package/dist/src/auth/routes.js +18 -0
- package/dist/src/auth/routes.js.map +1 -0
- package/dist/src/auth/service.d.ts +78 -0
- package/dist/src/auth/service.js +218 -0
- package/dist/src/auth/service.js.map +1 -0
- 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/index.js +122 -0
- 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 -0
- package/dist/src/{constants.js → core/constants.js} +1 -0
- package/dist/src/core/constants.js.map +1 -0
- package/dist/src/core/database.d.ts +48 -0
- package/dist/src/{database.js → core/database.js} +36 -14
- package/dist/src/core/database.js.map +1 -0
- package/dist/src/core/engine.d.ts +65 -0
- package/dist/src/core/engine.js +312 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/errors.d.ts +9 -0
- 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 +145 -0
- package/dist/src/{model.js → core/model.js} +224 -33
- package/dist/src/core/model.js.map +1 -0
- package/dist/src/core/mutations/write.d.ts +26 -0
- package/dist/src/core/mutations/write.js +284 -0
- 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/core/paths.js +64 -0
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/query/contract.d.ts +6 -0
- package/dist/src/core/query/contract.js +22 -0
- package/dist/src/core/query/contract.js.map +1 -0
- package/dist/src/core/query/filter.d.ts +6 -0
- package/dist/src/core/query/filter.js +100 -0
- package/dist/src/core/query/filter.js.map +1 -0
- package/dist/src/core/query/options.d.ts +30 -0
- package/dist/src/core/query/options.js +44 -0
- package/dist/src/core/query/options.js.map +1 -0
- package/dist/src/core/records.d.ts +46 -0
- package/dist/src/core/records.js +69 -0
- 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 -2
- package/dist/src/core/relation-metadata.js.map +1 -0
- package/dist/src/core/storage.d.ts +2 -0
- package/dist/src/core/storage.js +2 -0
- package/dist/src/core/storage.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 +32 -30
- package/dist/src/files/contract.js +29 -48
- package/dist/src/files/contract.js.map +1 -1
- package/dist/src/files/disk-store.d.ts +5 -1
- package/dist/src/files/disk-store.js +49 -32
- package/dist/src/files/disk-store.js.map +1 -1
- package/dist/src/files/http.d.ts +36 -0
- package/dist/src/files/http.js +53 -0
- package/dist/src/files/http.js.map +1 -0
- package/dist/src/files/index.d.ts +5 -4
- package/dist/src/files/index.js +7 -2
- 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 +29 -22
- 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 +27 -2
- 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 -0
- package/dist/src/graphql/entry.js +13 -0
- package/dist/src/graphql/entry.js.map +1 -0
- package/dist/src/graphql/generate.d.ts +12 -0
- package/dist/src/graphql/generate.js +19 -0
- package/dist/src/graphql/generate.js.map +1 -0
- package/dist/src/graphql/preflight.d.ts +6 -0
- package/dist/src/graphql/preflight.js +42 -0
- package/dist/src/graphql/preflight.js.map +1 -0
- package/dist/src/graphql/resolvers.d.ts +17 -0
- package/dist/src/graphql/resolvers.js +44 -0
- package/dist/src/graphql/resolvers.js.map +1 -0
- package/dist/src/graphql/routes.d.ts +8 -0
- package/dist/src/graphql/routes.js +30 -0
- package/dist/src/graphql/routes.js.map +1 -0
- package/dist/src/graphql/schema.d.ts +6 -0
- package/dist/src/{graphql.js → graphql/schema.js} +57 -50
- package/dist/src/graphql/schema.js.map +1 -0
- package/dist/src/graphql/write.d.ts +4 -0
- package/dist/src/graphql/write.js +10 -0
- package/dist/src/graphql/write.js.map +1 -0
- 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 +7 -3
- package/dist/src/openapi/document.js +147 -92
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/entry.d.ts +14 -0
- package/dist/src/openapi/entry.js +13 -0
- package/dist/src/openapi/entry.js.map +1 -0
- package/dist/src/openapi/files.d.ts +6 -0
- package/dist/src/{files/openapi.js → openapi/files.js} +6 -5
- package/dist/src/openapi/files.js.map +1 -0
- package/dist/src/openapi/generate.d.ts +19 -0
- package/dist/src/openapi/generate.js +41 -0
- package/dist/src/openapi/generate.js.map +1 -0
- package/dist/src/openapi/helpers.d.ts +26 -0
- package/dist/src/openapi/helpers.js +13 -0
- package/dist/src/openapi/helpers.js.map +1 -0
- package/dist/src/openapi/options.d.ts +18 -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} +2 -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 +22 -0
- package/dist/src/rest/options.js +65 -0
- package/dist/src/rest/options.js.map +1 -0
- package/dist/src/rest/projection.d.ts +13 -0
- package/dist/src/rest/projection.js +61 -0
- package/dist/src/rest/projection.js.map +1 -0
- package/dist/src/rest/routes.d.ts +7 -0
- package/dist/src/rest/routes.js +49 -0
- package/dist/src/rest/routes.js.map +1 -0
- package/dist/src/server/config.d.ts +74 -0
- package/dist/src/server/config.js +142 -0
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/create.d.ts +16 -0
- package/dist/src/server/create.js +133 -0
- package/dist/src/server/create.js.map +1 -0
- package/dist/src/server/features.d.ts +4 -0
- package/dist/src/server/features.js +11 -0
- package/dist/src/server/features.js.map +1 -0
- package/dist/src/server/model.d.ts +6 -0
- package/dist/src/server/model.js +14 -0
- package/dist/src/server/model.js.map +1 -0
- package/dist/src/server/public.d.ts +2 -0
- package/dist/src/server/public.js +2 -0
- package/dist/src/server/public.js.map +1 -0
- package/package.json +17 -1
- package/dist/src/cli.d.ts +0 -4
- package/dist/src/cli.js +0 -67
- package/dist/src/cli.js.map +0 -1
- package/dist/src/config.d.ts +0 -68
- package/dist/src/config.js +0 -161
- package/dist/src/config.js.map +0 -1
- package/dist/src/constants.js.map +0 -1
- package/dist/src/database.d.ts +0 -21
- package/dist/src/database.js.map +0 -1
- package/dist/src/engine.d.ts +0 -47
- package/dist/src/engine.js +0 -438
- package/dist/src/engine.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.d.ts +0 -4
- package/dist/src/graphql.js.map +0 -1
- package/dist/src/model.d.ts +0 -67
- package/dist/src/model.js.map +0 -1
- package/dist/src/openapi/index.d.ts +0 -7
- package/dist/src/openapi/index.js +0 -26
- package/dist/src/openapi/index.js.map +0 -1
- package/dist/src/query/filter.d.ts +0 -1
- package/dist/src/query/filter.js +0 -84
- package/dist/src/query/filter.js.map +0 -1
- package/dist/src/query/options.d.ts +0 -31
- package/dist/src/query/options.js +0 -135
- package/dist/src/query/options.js.map +0 -1
- package/dist/src/relation-metadata.d.ts +0 -10
- package/dist/src/relation-metadata.js.map +0 -1
- package/dist/src/server.d.ts +0 -14
- package/dist/src/server.js +0 -166
- package/dist/src/server.js.map +0 -1
- package/dist/src/utils.d.ts +0 -19
- package/dist/src/utils.js +0 -62
- package/dist/src/utils.js.map +0 -1
- /package/dist/src/{types.js → core/types.js} +0 -0
|
@@ -1,5 +1,18 @@
|
|
|
1
|
+
import type { Storage } from '../core/storage.js';
|
|
2
|
+
export interface MemoryFile {
|
|
3
|
+
content: Uint8Array;
|
|
4
|
+
directory?: string;
|
|
5
|
+
mimeType: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
export type FilesConfig<S extends Storage = Storage> = S extends 'file' ? {
|
|
9
|
+
source: string;
|
|
10
|
+
metadata?: string;
|
|
11
|
+
} : {
|
|
12
|
+
source: MemoryFile[];
|
|
13
|
+
metadata?: never;
|
|
14
|
+
};
|
|
1
15
|
import type { Readable } from 'node:stream';
|
|
2
|
-
import type { OpenapiSchema } from '../types.js';
|
|
3
16
|
export interface StoredFileMetadata {
|
|
4
17
|
directory: string;
|
|
5
18
|
mimeType: string;
|
|
@@ -8,11 +21,6 @@ export interface StoredFileMetadata {
|
|
|
8
21
|
export interface FileRecord extends StoredFileMetadata {
|
|
9
22
|
size: number;
|
|
10
23
|
}
|
|
11
|
-
export interface FileMetadata extends FileRecord {
|
|
12
|
-
downloadUrl: string;
|
|
13
|
-
metadataUrl: string;
|
|
14
|
-
url: string;
|
|
15
|
-
}
|
|
16
24
|
export interface FileUpload extends StoredFileMetadata {
|
|
17
25
|
maxFileSize: number;
|
|
18
26
|
override: boolean;
|
|
@@ -35,33 +43,27 @@ export interface FileStore {
|
|
|
35
43
|
file: FileRecord;
|
|
36
44
|
}>;
|
|
37
45
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
readonly name: 'Content-Directory';
|
|
42
|
-
};
|
|
43
|
-
readonly name: {
|
|
44
|
-
readonly key: 'content-name';
|
|
45
|
-
readonly name: 'Content-Name';
|
|
46
|
-
};
|
|
47
|
-
readonly override: {
|
|
48
|
-
readonly key: 'content-override';
|
|
49
|
-
readonly name: 'Content-Override';
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
export declare const FILE_ROUTES: {
|
|
53
|
-
readonly download: '/_files/download';
|
|
54
|
-
readonly metadata: '/_files/metadata';
|
|
55
|
-
readonly storage: '/_files/storage';
|
|
56
|
-
};
|
|
57
|
-
export declare const PATCH_BODY_LIMIT: number;
|
|
58
|
-
export declare const FILE_METADATA_SCHEMA: OpenapiSchema;
|
|
59
|
-
export declare const FILE_UPDATE_SCHEMA: OpenapiSchema;
|
|
46
|
+
/** Соединяет непустой каталог и имя через косую черту, не проверяя безопасность пути.
|
|
47
|
+
* @example getFileKey({ directory: 'photos', name: 'a.jpg' }) → 'photos/a.jpg'.
|
|
48
|
+
*/
|
|
60
49
|
export declare const getFileKey: ({ directory, name }: Pick<StoredFileMetadata, 'directory' | 'name'>) => string;
|
|
50
|
+
/** Проверяет безопасное имя файла, включая зарезервированные имена Windows.
|
|
51
|
+
* @example validateName('a.txt', 'name') → 'a.txt'; validateName('../a', 'name') → ошибка.
|
|
52
|
+
*/
|
|
61
53
|
export declare const validateName: (value: unknown, source: string) => string;
|
|
54
|
+
/** Проверяет относительный путь с разделителем /; пустой путь обозначает корень.
|
|
55
|
+
* @example validateDirectory('photos/2026', 'path') → 'photos/2026'; '../photos' → ошибка.
|
|
56
|
+
*/
|
|
62
57
|
export declare const validateDirectory: (value: unknown, source: string) => string;
|
|
58
|
+
/** Удаляет параметры MIME-типа, приводит его к нижнему регистру и проверяет формат.
|
|
59
|
+
* @example normalizeMimeType('Text/Plain; charset=utf-8') → 'text/plain'.
|
|
60
|
+
*/
|
|
63
61
|
export declare const normalizeMimeType: (value: unknown, source?: string) => string;
|
|
62
|
+
/** Проверяет метаданные и возвращает объект из каталога, имени и MIME-типа.
|
|
63
|
+
* @example { name: 'a.txt', mimeType: 'TEXT/PLAIN' } → { directory: '', name: 'a.txt', mimeType: 'text/plain' }.
|
|
64
|
+
*/
|
|
64
65
|
export declare const normalizeStoredFileMetadata: (value: unknown, source: string) => StoredFileMetadata;
|
|
66
|
+
/** Разделяет проверенный относительный путь на каталог и имя файла.
|
|
67
|
+
* @example getPathLocation('photos/a.jpg') → { directory: 'photos', name: 'a.jpg' }.
|
|
68
|
+
*/
|
|
65
69
|
export declare const getPathLocation: (path: string) => Pick<StoredFileMetadata, 'directory' | 'name'>;
|
|
66
|
-
export declare const createFileMetadata: (file: FileRecord) => FileMetadata;
|
|
67
|
-
export declare const getDownloadName: (name: string) => string;
|
|
@@ -1,42 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
directory: { key: 'content-directory', name: 'Content-Directory' },
|
|
5
|
-
name: { key: 'content-name', name: 'Content-Name' },
|
|
6
|
-
override: { key: 'content-override', name: 'Content-Override' },
|
|
7
|
-
};
|
|
8
|
-
export const FILE_ROUTES = {
|
|
9
|
-
download: '/_files/download',
|
|
10
|
-
metadata: '/_files/metadata',
|
|
11
|
-
storage: '/_files/storage',
|
|
12
|
-
};
|
|
13
|
-
export const PATCH_BODY_LIMIT = 64 * 1024;
|
|
1
|
+
import { errorMessage } from '../core/utils.js';
|
|
2
|
+
import { domainError } from '../core/errors.js';
|
|
3
|
+
import { isObject } from '../core/utils.js';
|
|
14
4
|
const MIME_TYPE_PATTERN = /^[A-Za-z0-9!#$%&'*+.^_`|~-]+\/[A-Za-z0-9!#$%&'*+.^_`|~-]+$/;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
downloadUrl: { format: 'uri-reference', type: 'string' },
|
|
19
|
-
metadataUrl: { format: 'uri-reference', type: 'string' },
|
|
20
|
-
mimeType: { type: 'string' },
|
|
21
|
-
name: { type: 'string' },
|
|
22
|
-
size: { minimum: 0, type: 'integer' },
|
|
23
|
-
url: { format: 'uri-reference', type: 'string' },
|
|
24
|
-
},
|
|
25
|
-
required: ['directory', 'downloadUrl', 'metadataUrl', 'mimeType', 'name', 'size', 'url'],
|
|
26
|
-
type: 'object',
|
|
27
|
-
};
|
|
28
|
-
export const FILE_UPDATE_SCHEMA = {
|
|
29
|
-
additionalProperties: false,
|
|
30
|
-
anyOf: [{ required: ['directory'] }, { required: ['name'] }],
|
|
31
|
-
properties: { directory: { type: 'string' }, name: { type: 'string' } },
|
|
32
|
-
type: 'object',
|
|
33
|
-
};
|
|
5
|
+
/** Соединяет непустой каталог и имя через косую черту, не проверяя безопасность пути.
|
|
6
|
+
* @example getFileKey({ directory: 'photos', name: 'a.jpg' }) → 'photos/a.jpg'.
|
|
7
|
+
*/
|
|
34
8
|
export const getFileKey = ({ directory, name }) => [directory, name].filter(Boolean).join('/');
|
|
35
9
|
const WINDOWS_RESERVED_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i;
|
|
10
|
+
/** Ищет управляющие символы ASCII с кодами 0–31 или 127.
|
|
11
|
+
* @example hasControlCharacter('abc') → false; строка с переводом строки → true.
|
|
12
|
+
*/
|
|
36
13
|
const hasControlCharacter = (value) => [...value].some((character) => {
|
|
37
14
|
const code = character.charCodeAt(0);
|
|
38
15
|
return code <= 31 || code === 127;
|
|
39
16
|
});
|
|
17
|
+
/** Проверяет безопасное имя файла, включая зарезервированные имена Windows.
|
|
18
|
+
* @example validateName('a.txt', 'name') → 'a.txt'; validateName('../a', 'name') → ошибка.
|
|
19
|
+
*/
|
|
40
20
|
export const validateName = (value, source) => {
|
|
41
21
|
if (typeof value !== 'string' ||
|
|
42
22
|
value === '' ||
|
|
@@ -47,30 +27,39 @@ export const validateName = (value, source) => {
|
|
|
47
27
|
/[<>:"/\\|?*]/.test(value) ||
|
|
48
28
|
hasControlCharacter(value) ||
|
|
49
29
|
WINDOWS_RESERVED_NAME.test(value)) {
|
|
50
|
-
throw
|
|
30
|
+
throw domainError('INVALID_INPUT', `${source} должен содержать безопасное имя файла`);
|
|
51
31
|
}
|
|
52
32
|
return value;
|
|
53
33
|
};
|
|
34
|
+
/** Проверяет относительный путь с разделителем /; пустой путь обозначает корень.
|
|
35
|
+
* @example validateDirectory('photos/2026', 'path') → 'photos/2026'; '../photos' → ошибка.
|
|
36
|
+
*/
|
|
54
37
|
export const validateDirectory = (value, source) => {
|
|
55
38
|
if (typeof value !== 'string') {
|
|
56
|
-
throw
|
|
39
|
+
throw domainError('INVALID_INPUT', `${source} должен содержать безопасный относительный путь`);
|
|
57
40
|
}
|
|
58
41
|
if (value === '') {
|
|
59
42
|
return value;
|
|
60
43
|
}
|
|
61
44
|
const parts = value.split('/');
|
|
62
45
|
if (value.startsWith('/') || value.endsWith('/') || value.includes('\\') || value.includes('\0') || parts.some((part) => part === '' || part === '.' || part === '..')) {
|
|
63
|
-
throw
|
|
46
|
+
throw domainError('INVALID_INPUT', `${source} должен содержать безопасный относительный путь`);
|
|
64
47
|
}
|
|
65
48
|
return value;
|
|
66
49
|
};
|
|
50
|
+
/** Удаляет параметры MIME-типа, приводит его к нижнему регистру и проверяет формат.
|
|
51
|
+
* @example normalizeMimeType('Text/Plain; charset=utf-8') → 'text/plain'.
|
|
52
|
+
*/
|
|
67
53
|
export const normalizeMimeType = (value, source = 'Заголовок Content-Type') => {
|
|
68
54
|
const mimeType = typeof value === 'string' ? value.split(';', 1)[0].trim().toLowerCase() : '';
|
|
69
55
|
if (mimeType === '' || !MIME_TYPE_PATTERN.test(mimeType)) {
|
|
70
|
-
throw
|
|
56
|
+
throw domainError('INVALID_INPUT', `${source} должен содержать корректный MIME-тип`);
|
|
71
57
|
}
|
|
72
58
|
return mimeType;
|
|
73
59
|
};
|
|
60
|
+
/** Проверяет метаданные и возвращает объект из каталога, имени и MIME-типа.
|
|
61
|
+
* @example { name: 'a.txt', mimeType: 'TEXT/PLAIN' } → { directory: '', name: 'a.txt', mimeType: 'text/plain' }.
|
|
62
|
+
*/
|
|
74
63
|
export const normalizeStoredFileMetadata = (value, source) => {
|
|
75
64
|
if (!isObject(value)) {
|
|
76
65
|
throw new Error(`${source} должна содержать JSON-объект`);
|
|
@@ -83,24 +72,16 @@ export const normalizeStoredFileMetadata = (value, source) => {
|
|
|
83
72
|
};
|
|
84
73
|
}
|
|
85
74
|
catch (error) {
|
|
86
|
-
throw new Error(
|
|
75
|
+
throw new Error(errorMessage(error), { cause: error });
|
|
87
76
|
}
|
|
88
77
|
};
|
|
78
|
+
/** Разделяет проверенный относительный путь на каталог и имя файла.
|
|
79
|
+
* @example getPathLocation('photos/a.jpg') → { directory: 'photos', name: 'a.jpg' }.
|
|
80
|
+
*/
|
|
89
81
|
export const getPathLocation = (path) => {
|
|
90
82
|
const normalizedPath = validateDirectory(path, 'Путь файла');
|
|
91
83
|
const parts = normalizedPath.split('/');
|
|
92
84
|
const name = validateName(parts.pop(), 'Путь файла');
|
|
93
85
|
return { directory: parts.join('/'), name };
|
|
94
86
|
};
|
|
95
|
-
const encodeFilePath = (file) => getFileKey(file).split('/').map(encodeURIComponent).join('/');
|
|
96
|
-
export const createFileMetadata = (file) => {
|
|
97
|
-
const path = encodeFilePath(file);
|
|
98
|
-
return {
|
|
99
|
-
...file,
|
|
100
|
-
downloadUrl: `${FILE_ROUTES.download}/${path}`,
|
|
101
|
-
metadataUrl: `${FILE_ROUTES.metadata}/${path}`,
|
|
102
|
-
url: `${FILE_ROUTES.storage}/${path}`,
|
|
103
|
-
};
|
|
104
|
-
};
|
|
105
|
-
export const getDownloadName = (name) => encodeURIComponent(basename(name)).replaceAll("'", '%27');
|
|
106
87
|
//# sourceMappingURL=contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../src/files/contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../src/files/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { type FileStore } from './contract.js';
|
|
2
|
-
|
|
2
|
+
/** Открывает дисковое хранилище с проверками путей, защитой входных файлов и последовательными изменениями.
|
|
3
|
+
* @example Каталог и файл метаданных → Promise<FileStore>; операции сохраняют байты и метаданные на диске.
|
|
4
|
+
*/
|
|
5
|
+
export declare const createDiskFileStore: ({ directory: sourceDirectoryPath, metadata: sourceMetadataPath, protectedPaths, }: {
|
|
3
6
|
directory: string;
|
|
4
7
|
metadata: string;
|
|
8
|
+
protectedPaths?: string[];
|
|
5
9
|
}) => Promise<FileStore>;
|
|
@@ -2,24 +2,15 @@ import { randomBytes } from 'node:crypto';
|
|
|
2
2
|
import { createWriteStream } from 'node:fs';
|
|
3
3
|
import { access, lstat, mkdir, open, readFile, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
|
|
5
|
-
import { Transform } from 'node:stream';
|
|
6
5
|
import { pipeline } from 'node:stream/promises';
|
|
7
|
-
import {
|
|
6
|
+
import { domainError } from '../core/errors.js';
|
|
7
|
+
import { canonicalPath } from '../core/paths.js';
|
|
8
|
+
import { createSerialQueue, isSystemError } from '../core/utils.js';
|
|
8
9
|
import { getFileKey, normalizeStoredFileMetadata } from './contract.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
size += chunk.length;
|
|
14
|
-
if (size > maxFileSize) {
|
|
15
|
-
callback(createHttpError(413, `Размер файла не должен превышать ${maxFileSize} байт`));
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
onSize(size);
|
|
19
|
-
callback(null, chunk);
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
};
|
|
10
|
+
import { createSizeLimiter } from './streams.js';
|
|
11
|
+
/** Проверяет доступность пути через access; остальные ошибки файловой системы передаёт вызывающему коду.
|
|
12
|
+
* @example Отсутствующий путь → Promise<false>; существующий доступный файл → Promise<true>; оборванная ссылка → Promise<false>.
|
|
13
|
+
*/
|
|
23
14
|
const pathExists = async (path) => {
|
|
24
15
|
try {
|
|
25
16
|
await access(path);
|
|
@@ -32,10 +23,16 @@ const pathExists = async (path) => {
|
|
|
32
23
|
throw error;
|
|
33
24
|
}
|
|
34
25
|
};
|
|
26
|
+
/** Проверяет, что путь совпадает с корнем или лежит внутри него; символические ссылки не раскрывает.
|
|
27
|
+
* @example isPathInside('/tmp/a', '/tmp/a/b') → true; '/tmp/ab' → false.
|
|
28
|
+
*/
|
|
35
29
|
const isPathInside = (rootPath, targetPath) => {
|
|
36
30
|
const relativePath = relative(rootPath, targetPath);
|
|
37
31
|
return relativePath === '' || (relativePath !== '..' && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath));
|
|
38
32
|
};
|
|
33
|
+
/** Читает и проверяет массив метаданных, индексируя его по пути файла.
|
|
34
|
+
* @example Отсутствующий файл → пустая Map; две записи с одинаковым путём → ошибка.
|
|
35
|
+
*/
|
|
39
36
|
const readMetadata = async (metadataPath) => {
|
|
40
37
|
let source;
|
|
41
38
|
try {
|
|
@@ -61,6 +58,9 @@ const readMetadata = async (metadataPath) => {
|
|
|
61
58
|
});
|
|
62
59
|
return files;
|
|
63
60
|
};
|
|
61
|
+
/** Сохраняет метаданные через временный файл и переименование; при ошибке удаляет временный файл.
|
|
62
|
+
* @example Map с одной записью → JSON-массив из одной записи в файле; результат Promise<void>.
|
|
63
|
+
*/
|
|
64
64
|
const writeMetadata = async (metadataPath, files) => {
|
|
65
65
|
const temporaryPath = `${metadataPath}.${randomBytes(6).toString('hex')}.tmp`;
|
|
66
66
|
try {
|
|
@@ -72,11 +72,17 @@ const writeMetadata = async (metadataPath, files) => {
|
|
|
72
72
|
throw error;
|
|
73
73
|
}
|
|
74
74
|
};
|
|
75
|
+
/** Проверяет, что информация о пути описывает обычный файл.
|
|
76
|
+
* @example stats.isFile() === true → undefined; каталог → ошибка.
|
|
77
|
+
*/
|
|
75
78
|
const assertRegularFile = (stats) => {
|
|
76
79
|
if (!stats.isFile()) {
|
|
77
|
-
throw
|
|
80
|
+
throw domainError('INVALID_INPUT', 'Путь должен указывать на обычный файл');
|
|
78
81
|
}
|
|
79
82
|
};
|
|
83
|
+
/** Читает размер обычного файла; отсутствие или неподходящий тип пути превращает в ошибку.
|
|
84
|
+
* @example Файл из трёх байтов → Promise<3>.
|
|
85
|
+
*/
|
|
80
86
|
const getFileSize = async (path) => {
|
|
81
87
|
try {
|
|
82
88
|
const stats = await stat(path);
|
|
@@ -85,15 +91,23 @@ const getFileSize = async (path) => {
|
|
|
85
91
|
}
|
|
86
92
|
catch (error) {
|
|
87
93
|
if (isSystemError(error) && error.code === 'ENOENT') {
|
|
88
|
-
throw
|
|
94
|
+
throw domainError('NOT_FOUND', 'Файл не найден');
|
|
89
95
|
}
|
|
90
96
|
throw error;
|
|
91
97
|
}
|
|
92
98
|
};
|
|
93
|
-
|
|
99
|
+
/** Открывает дисковое хранилище с проверками путей, защитой входных файлов и последовательными изменениями.
|
|
100
|
+
* @example Каталог и файл метаданных → Promise<FileStore>; операции сохраняют байты и метаданные на диске.
|
|
101
|
+
*/
|
|
102
|
+
export const createDiskFileStore = async ({ directory: sourceDirectoryPath, metadata: sourceMetadataPath, protectedPaths = [], }) => {
|
|
94
103
|
const directoryPath = resolve(sourceDirectoryPath);
|
|
95
104
|
const metadataPath = resolve(sourceMetadataPath);
|
|
96
105
|
const stagingPath = resolve(directoryPath, '.deep-json-server');
|
|
106
|
+
const protectedFiles = new Set(await Promise.all(protectedPaths.map(canonicalPath)));
|
|
107
|
+
const canonicalMetadataPath = await canonicalPath(metadataPath);
|
|
108
|
+
if (protectedFiles.has(canonicalMetadataPath))
|
|
109
|
+
throw new Error('File metadata must not overwrite a protected input file');
|
|
110
|
+
protectedFiles.add(canonicalMetadataPath);
|
|
97
111
|
const schedule = createSerialQueue();
|
|
98
112
|
const pendingCleanup = new Set();
|
|
99
113
|
await Promise.all([mkdir(directoryPath, { recursive: true }), mkdir(dirname(metadataPath), { recursive: true }), mkdir(stagingPath, { recursive: true })]);
|
|
@@ -116,13 +130,16 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
116
130
|
};
|
|
117
131
|
const assertContained = (path) => {
|
|
118
132
|
if (!isPathInside(realDirectoryPath, path)) {
|
|
119
|
-
throw
|
|
133
|
+
throw domainError('INVALID_INPUT', 'Путь файла выходит за пределы директории хранения');
|
|
120
134
|
}
|
|
121
135
|
};
|
|
122
136
|
const resolveFilePath = (path) => {
|
|
123
137
|
const filePath = resolve(directoryPath, path);
|
|
138
|
+
const canonical = resolve(realDirectoryPath, relative(directoryPath, filePath));
|
|
139
|
+
if (protectedFiles.has(canonical))
|
|
140
|
+
throw domainError('INVALID_INPUT', 'Path is reserved for a server input file');
|
|
124
141
|
if (filePath === directoryPath || !isPathInside(directoryPath, filePath) || filePath === metadataPath || isPathInside(stagingPath, filePath)) {
|
|
125
|
-
throw
|
|
142
|
+
throw domainError('INVALID_INPUT', 'Путь файла выходит за пределы директории хранения');
|
|
126
143
|
}
|
|
127
144
|
return filePath;
|
|
128
145
|
};
|
|
@@ -134,7 +151,7 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
134
151
|
currentPath = resolve(currentPath, part);
|
|
135
152
|
try {
|
|
136
153
|
if ((await lstat(currentPath)).isSymbolicLink()) {
|
|
137
|
-
throw
|
|
154
|
+
throw domainError('INVALID_INPUT', 'Путь файла не должен содержать символические ссылки');
|
|
138
155
|
}
|
|
139
156
|
}
|
|
140
157
|
catch (error) {
|
|
@@ -161,7 +178,7 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
161
178
|
}
|
|
162
179
|
const currentStats = await lstat(currentPath);
|
|
163
180
|
if (currentStats.isSymbolicLink() || !currentStats.isDirectory()) {
|
|
164
|
-
throw
|
|
181
|
+
throw domainError('INVALID_INPUT', 'Путь файла должен содержать только обычные директории');
|
|
165
182
|
}
|
|
166
183
|
assertContained(await realpath(currentPath));
|
|
167
184
|
}
|
|
@@ -181,7 +198,7 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
181
198
|
}
|
|
182
199
|
catch (error) {
|
|
183
200
|
if (isSystemError(error) && error.code === 'ENOENT') {
|
|
184
|
-
throw
|
|
201
|
+
throw domainError('NOT_FOUND', 'Файл не найден');
|
|
185
202
|
}
|
|
186
203
|
throw error;
|
|
187
204
|
}
|
|
@@ -202,16 +219,16 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
202
219
|
const findFile = (path) => {
|
|
203
220
|
const file = files.get(path);
|
|
204
221
|
if (file == null) {
|
|
205
|
-
throw
|
|
222
|
+
throw domainError('NOT_FOUND', 'Файл не найден');
|
|
206
223
|
}
|
|
207
224
|
return file;
|
|
208
225
|
};
|
|
209
|
-
const metadata = async (
|
|
226
|
+
const metadata = (path) => schedule(async () => {
|
|
210
227
|
const file = findFile(path);
|
|
211
228
|
const filePath = await resolveExistingPath(path);
|
|
212
229
|
return { ...file, size: await getFileSize(filePath) };
|
|
213
|
-
};
|
|
214
|
-
const get = async (
|
|
230
|
+
});
|
|
231
|
+
const get = (path) => schedule(async () => {
|
|
215
232
|
const file = findFile(path);
|
|
216
233
|
const filePath = await resolveExistingPath(path);
|
|
217
234
|
const handle = await open(filePath, 'r');
|
|
@@ -225,12 +242,12 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
225
242
|
await handle.close();
|
|
226
243
|
throw error;
|
|
227
244
|
}
|
|
228
|
-
};
|
|
245
|
+
});
|
|
229
246
|
const upload = async ({ directory, maxFileSize, mimeType, name, override, stream }) => {
|
|
230
247
|
const storedFile = { directory, mimeType, name };
|
|
231
248
|
const key = getFileKey(storedFile);
|
|
232
249
|
if (files.has(key) && !override) {
|
|
233
|
-
throw
|
|
250
|
+
throw domainError('CONFLICT', 'Файл уже существует');
|
|
234
251
|
}
|
|
235
252
|
const stagedPath = resolve(stagingPath, `${randomBytes(12).toString('hex')}.upload`);
|
|
236
253
|
let size = 0;
|
|
@@ -244,7 +261,7 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
244
261
|
const existsOnDisk = await pathExists(path);
|
|
245
262
|
const exists = files.has(key) || existsOnDisk;
|
|
246
263
|
if (exists && !override) {
|
|
247
|
-
throw
|
|
264
|
+
throw domainError('CONFLICT', 'Файл уже существует');
|
|
248
265
|
}
|
|
249
266
|
const backupPath = `${path}.${randomBytes(6).toString('hex')}.backup`;
|
|
250
267
|
let backedUp = false;
|
|
@@ -299,7 +316,7 @@ export const createDiskFileStore = async ({ directory: sourceDirectoryPath, meta
|
|
|
299
316
|
}
|
|
300
317
|
const targetFilePath = await prepareTargetPath(targetPath);
|
|
301
318
|
if (files.has(targetPath) || (await pathExists(targetFilePath))) {
|
|
302
|
-
throw
|
|
319
|
+
throw domainError('CONFLICT', 'Файл с таким путём уже существует');
|
|
303
320
|
}
|
|
304
321
|
await rename(sourceFilePath, targetFilePath);
|
|
305
322
|
const nextFiles = new Map(files);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../../../src/files/disk-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../../../src/files/disk-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type FileRecord } from './contract.js';
|
|
2
|
+
export interface FileMetadata extends FileRecord {
|
|
3
|
+
downloadUrl: string;
|
|
4
|
+
metadataUrl: string;
|
|
5
|
+
url: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const FILE_HEADERS: {
|
|
8
|
+
readonly directory: {
|
|
9
|
+
readonly key: 'content-directory';
|
|
10
|
+
readonly name: 'Content-Directory';
|
|
11
|
+
};
|
|
12
|
+
readonly name: {
|
|
13
|
+
readonly key: 'content-name';
|
|
14
|
+
readonly name: 'Content-Name';
|
|
15
|
+
};
|
|
16
|
+
readonly override: {
|
|
17
|
+
readonly key: 'content-override';
|
|
18
|
+
readonly name: 'Content-Override';
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export declare const FILE_ROUTES: {
|
|
22
|
+
readonly download: '/_files/download';
|
|
23
|
+
readonly metadata: '/_files/metadata';
|
|
24
|
+
readonly storage: '/_files/storage';
|
|
25
|
+
};
|
|
26
|
+
export declare const PATCH_BODY_LIMIT: number;
|
|
27
|
+
export declare const FILE_METADATA_SCHEMA: Record<string, unknown>;
|
|
28
|
+
export declare const FILE_UPDATE_SCHEMA: Record<string, unknown>;
|
|
29
|
+
/** Добавляет к метаданным относительные URL просмотра, скачивания и описания файла.
|
|
30
|
+
* @example Для { directory: '', name: 'a.txt', … } поле url → '/_files/storage/a.txt'.
|
|
31
|
+
*/
|
|
32
|
+
export declare const createFileMetadata: (file: FileRecord) => FileMetadata;
|
|
33
|
+
/** Кодирует последнее имя пути для заголовка скачивания, включая апострофы.
|
|
34
|
+
* @example getDownloadName('a b.txt') → 'a%20b.txt'.
|
|
35
|
+
*/
|
|
36
|
+
export declare const getDownloadName: (name: string) => string;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { basename } from 'node:path';
|
|
2
|
+
import { getFileKey } from './contract.js';
|
|
3
|
+
export const FILE_HEADERS = {
|
|
4
|
+
directory: { key: 'content-directory', name: 'Content-Directory' },
|
|
5
|
+
name: { key: 'content-name', name: 'Content-Name' },
|
|
6
|
+
override: { key: 'content-override', name: 'Content-Override' },
|
|
7
|
+
};
|
|
8
|
+
export const FILE_ROUTES = {
|
|
9
|
+
download: '/_files/download',
|
|
10
|
+
metadata: '/_files/metadata',
|
|
11
|
+
storage: '/_files/storage',
|
|
12
|
+
};
|
|
13
|
+
export const PATCH_BODY_LIMIT = 64 * 1024;
|
|
14
|
+
export const FILE_METADATA_SCHEMA = {
|
|
15
|
+
properties: {
|
|
16
|
+
directory: { type: 'string' },
|
|
17
|
+
downloadUrl: { format: 'uri-reference', type: 'string' },
|
|
18
|
+
metadataUrl: { format: 'uri-reference', type: 'string' },
|
|
19
|
+
mimeType: { type: 'string' },
|
|
20
|
+
name: { type: 'string' },
|
|
21
|
+
size: { minimum: 0, type: 'integer' },
|
|
22
|
+
url: { format: 'uri-reference', type: 'string' },
|
|
23
|
+
},
|
|
24
|
+
required: ['directory', 'downloadUrl', 'metadataUrl', 'mimeType', 'name', 'size', 'url'],
|
|
25
|
+
type: 'object',
|
|
26
|
+
};
|
|
27
|
+
export const FILE_UPDATE_SCHEMA = {
|
|
28
|
+
additionalProperties: false,
|
|
29
|
+
anyOf: [{ required: ['directory'] }, { required: ['name'] }],
|
|
30
|
+
properties: { directory: { type: 'string' }, name: { type: 'string' } },
|
|
31
|
+
type: 'object',
|
|
32
|
+
};
|
|
33
|
+
/** Кодирует каждый сегмент пути для URL, сохраняя разделители каталогов.
|
|
34
|
+
* @example { directory: 'my photos', name: 'a.jpg' } → 'my%20photos/a.jpg'.
|
|
35
|
+
*/
|
|
36
|
+
const encodeFilePath = (file) => getFileKey(file).split('/').map(encodeURIComponent).join('/');
|
|
37
|
+
/** Добавляет к метаданным относительные URL просмотра, скачивания и описания файла.
|
|
38
|
+
* @example Для { directory: '', name: 'a.txt', … } поле url → '/_files/storage/a.txt'.
|
|
39
|
+
*/
|
|
40
|
+
export const createFileMetadata = (file) => {
|
|
41
|
+
const path = encodeFilePath(file);
|
|
42
|
+
return {
|
|
43
|
+
...file,
|
|
44
|
+
downloadUrl: `${FILE_ROUTES.download}/${path}`,
|
|
45
|
+
metadataUrl: `${FILE_ROUTES.metadata}/${path}`,
|
|
46
|
+
url: `${FILE_ROUTES.storage}/${path}`,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/** Кодирует последнее имя пути для заголовка скачивания, включая апострофы.
|
|
50
|
+
* @example getDownloadName('a b.txt') → 'a%20b.txt'.
|
|
51
|
+
*/
|
|
52
|
+
export const getDownloadName = (name) => encodeURIComponent(basename(name)).replaceAll("'", '%27');
|
|
53
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/files/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAmB,UAAU,EAA2B,MAAM,eAAe,CAAC;AAMrF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAClE,IAAI,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE;IACnD,QAAQ,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE;CACvD,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,kBAAkB;IAC5B,OAAO,EAAE,iBAAiB;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAA4B;IAC3D,UAAU,EAAE;QACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,WAAW,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxD,WAAW,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE;KACjD;IACD,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACxF,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAA4B;IACzD,oBAAoB,EAAE,KAAK;IAC3B,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5D,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IACvE,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,IAAwB,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE3H;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAgB,EAAgB,EAAE;IACnE,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO;QACL,GAAG,IAAI;QACP,WAAW,EAAE,GAAG,WAAW,CAAC,QAAQ,IAAI,IAAI,EAAE;QAC9C,WAAW,EAAE,GAAG,WAAW,CAAC,QAAQ,IAAI,IAAI,EAAE;QAC9C,GAAG,EAAE,GAAG,WAAW,CAAC,OAAO,IAAI,IAAI,EAAE;KACtC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { FilesConfig } from '
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { FileStore, FilesConfig } from './contract.js';
|
|
2
|
+
/** Выбирает дисковое хранилище или хранилище в памяти по настройкам.
|
|
3
|
+
* @example createFileStore({ source: [] }) → Promise<FileStore> без создания файлов на диске.
|
|
4
|
+
*/
|
|
5
|
+
export declare const createFileStore: (config: FilesConfig, protectedPaths?: string[]) => Promise<FileStore>;
|
|
5
6
|
export { registerFileRoutes } from './routes.js';
|