@kollors/deep-json-server 0.8.1 → 1.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +286 -410
- package/README.ru.md +278 -404
- package/dist/index.d.ts +2 -1
- package/dist/index.js.map +1 -1
- package/dist/src/cli.js +50 -63
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +16 -2
- package/dist/src/config.js +24 -8
- package/dist/src/config.js.map +1 -1
- package/dist/src/constants.d.ts +1 -1
- package/dist/src/constants.js +1 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/database.d.ts +4 -3
- package/dist/src/database.js +32 -19
- package/dist/src/database.js.map +1 -1
- package/dist/src/engine.d.ts +47 -0
- package/dist/src/engine.js +438 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/files/disk-store.js +13 -2
- package/dist/src/files/disk-store.js.map +1 -1
- package/dist/src/files/openapi.d.ts +3 -0
- package/dist/src/files/openapi.js +86 -0
- package/dist/src/files/openapi.js.map +1 -0
- package/dist/src/graphql.d.ts +4 -0
- package/dist/src/graphql.js +223 -0
- package/dist/src/graphql.js.map +1 -0
- package/dist/src/model.d.ts +67 -0
- package/dist/src/model.js +319 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/openapi/document.d.ts +7 -7
- package/dist/src/openapi/document.js +234 -320
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/index.d.ts +3 -6
- package/dist/src/openapi/index.js +2 -3
- package/dist/src/openapi/index.js.map +1 -1
- package/dist/src/query/filter.d.ts +0 -5
- package/dist/src/query/filter.js +6 -170
- package/dist/src/query/filter.js.map +1 -1
- package/dist/src/query/options.d.ts +31 -0
- package/dist/src/query/options.js +135 -0
- package/dist/src/query/options.js.map +1 -0
- package/dist/src/server.d.ts +4 -3
- package/dist/src/server.js +113 -135
- package/dist/src/server.js.map +1 -1
- package/dist/src/types.d.ts +1 -3
- package/dist/src/utils.d.ts +0 -1
- package/dist/src/utils.js +0 -1
- package/dist/src/utils.js.map +1 -1
- package/package.json +13 -8
- package/dist/src/openapi/config.d.ts +0 -11
- package/dist/src/openapi/config.js +0 -204
- package/dist/src/openapi/config.js.map +0 -1
- package/dist/src/openapi/inference.d.ts +0 -14
- package/dist/src/openapi/inference.js +0 -145
- package/dist/src/openapi/inference.js.map +0 -1
- package/dist/src/query/index.d.ts +0 -3
- package/dist/src/query/index.js +0 -4
- package/dist/src/query/index.js.map +0 -1
- package/dist/src/query/pagination.d.ts +0 -11
- package/dist/src/query/pagination.js +0 -28
- package/dist/src/query/pagination.js.map +0 -1
- package/dist/src/query/sort.d.ts +0 -1
- package/dist/src/query/sort.js +0 -54
- package/dist/src/query/sort.js.map +0 -1
- package/dist/src/relations.d.ts +0 -12
- package/dist/src/relations.js +0 -155
- package/dist/src/relations.js.map +0 -1
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { readJsonObjectFile, validateJsonValue } from '../database.js';
|
|
2
|
-
import { assertKnownKeys, isObject } from '../utils.js';
|
|
3
|
-
import { applyRequiredFields, getSchemasAtPath, updateSchemasAtPath } from './inference.js';
|
|
4
|
-
const SCHEMA_CONFIG_KEYS = new Set(['$info', '$schema']);
|
|
5
|
-
const RESOURCE_CONFIG_KEYS = new Set(['formats', 'name', 'properties', 'required']);
|
|
6
|
-
const OPENAPI_TYPES = new Set(['array', 'boolean', 'integer', 'number', 'object', 'string']);
|
|
7
|
-
const COMPONENT_NAME_PATTERN = /^[A-Za-z0-9._-]+$/;
|
|
8
|
-
const SCHEMA_OVERRIDE_KEYS = new Set([
|
|
9
|
-
'$ref',
|
|
10
|
-
'additionalProperties',
|
|
11
|
-
'allOf',
|
|
12
|
-
'anyOf',
|
|
13
|
-
'default',
|
|
14
|
-
'deprecated',
|
|
15
|
-
'description',
|
|
16
|
-
'enum',
|
|
17
|
-
'example',
|
|
18
|
-
'format',
|
|
19
|
-
'items',
|
|
20
|
-
'maximum',
|
|
21
|
-
'maxItems',
|
|
22
|
-
'maxLength',
|
|
23
|
-
'minimum',
|
|
24
|
-
'minItems',
|
|
25
|
-
'minLength',
|
|
26
|
-
'not',
|
|
27
|
-
'nullable',
|
|
28
|
-
'oneOf',
|
|
29
|
-
'pattern',
|
|
30
|
-
'properties',
|
|
31
|
-
'readOnly',
|
|
32
|
-
'required',
|
|
33
|
-
'title',
|
|
34
|
-
'type',
|
|
35
|
-
'uniqueItems',
|
|
36
|
-
'writeOnly',
|
|
37
|
-
]);
|
|
38
|
-
const STRING_SCHEMA_KEYS = ['description', 'format', 'pattern', 'title'];
|
|
39
|
-
const NUMBER_SCHEMA_KEYS = ['maximum', 'minimum'];
|
|
40
|
-
const INTEGER_SCHEMA_KEYS = ['maxItems', 'maxLength', 'minItems', 'minLength'];
|
|
41
|
-
const BOOLEAN_SCHEMA_KEYS = ['deprecated', 'nullable', 'readOnly', 'uniqueItems', 'writeOnly'];
|
|
42
|
-
function validateSchemaOverride(schema, path) {
|
|
43
|
-
if (!isObject(schema)) {
|
|
44
|
-
throw new Error(`OpenAPI-схема свойства «${path}» должна содержать JSON-объект`);
|
|
45
|
-
}
|
|
46
|
-
assertKnownKeys(schema, SCHEMA_OVERRIDE_KEYS, `properties.${path}`);
|
|
47
|
-
if (schema.type != null && (typeof schema.type !== 'string' || !OPENAPI_TYPES.has(schema.type))) {
|
|
48
|
-
throw new Error(`type свойства «${path}» должен содержать поддерживаемый тип OpenAPI`);
|
|
49
|
-
}
|
|
50
|
-
if (schema.required != null && (!Array.isArray(schema.required) || schema.required.some((key) => typeof key !== 'string' || key === ''))) {
|
|
51
|
-
throw new Error(`required свойства «${path}» должен содержать массив непустых строк`);
|
|
52
|
-
}
|
|
53
|
-
if (schema.$ref != null && (typeof schema.$ref !== 'string' || schema.$ref === '')) {
|
|
54
|
-
throw new Error(`$ref свойства «${path}» должен содержать непустую строку`);
|
|
55
|
-
}
|
|
56
|
-
STRING_SCHEMA_KEYS.forEach((key) => {
|
|
57
|
-
if (schema[key] != null && typeof schema[key] !== 'string') {
|
|
58
|
-
throw new Error(`${key} свойства «${path}» должен содержать строку`);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
NUMBER_SCHEMA_KEYS.forEach((key) => {
|
|
62
|
-
if (schema[key] != null && (typeof schema[key] !== 'number' || !Number.isFinite(schema[key]))) {
|
|
63
|
-
throw new Error(`${key} свойства «${path}» должен содержать конечное число`);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
INTEGER_SCHEMA_KEYS.forEach((key) => {
|
|
67
|
-
if (schema[key] != null && (typeof schema[key] !== 'number' || !Number.isInteger(schema[key]) || schema[key] < 0)) {
|
|
68
|
-
throw new Error(`${key} свойства «${path}» должен содержать неотрицательное целое число`);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
BOOLEAN_SCHEMA_KEYS.forEach((key) => {
|
|
72
|
-
if (schema[key] != null && typeof schema[key] !== 'boolean') {
|
|
73
|
-
throw new Error(`${key} свойства «${path}» должен содержать boolean`);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
if (schema.enum != null && (!Array.isArray(schema.enum) || schema.enum.length === 0)) {
|
|
77
|
-
throw new Error(`enum свойства «${path}» должен содержать непустой массив`);
|
|
78
|
-
}
|
|
79
|
-
if (schema.properties != null) {
|
|
80
|
-
if (!isObject(schema.properties)) {
|
|
81
|
-
throw new Error(`properties свойства «${path}» должен содержать JSON-объект`);
|
|
82
|
-
}
|
|
83
|
-
Object.entries(schema.properties).forEach(([key, value]) => {
|
|
84
|
-
validateSchemaOverride(value, `${path}.${key}`);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
if (schema.items != null) {
|
|
88
|
-
validateSchemaOverride(schema.items, `${path}[]`);
|
|
89
|
-
}
|
|
90
|
-
for (const keyword of ['allOf', 'anyOf', 'oneOf']) {
|
|
91
|
-
if (schema[keyword] != null) {
|
|
92
|
-
if (!Array.isArray(schema[keyword]) || schema[keyword].length === 0) {
|
|
93
|
-
throw new Error(`${keyword} свойства «${path}» должен содержать непустой массив`);
|
|
94
|
-
}
|
|
95
|
-
schema[keyword].forEach((value, index) => {
|
|
96
|
-
validateSchemaOverride(value, `${path}.${keyword}[${index}]`);
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (schema.not != null) {
|
|
101
|
-
validateSchemaOverride(schema.not, `${path}.not`);
|
|
102
|
-
}
|
|
103
|
-
if (schema.additionalProperties != null && typeof schema.additionalProperties !== 'boolean') {
|
|
104
|
-
validateSchemaOverride(schema.additionalProperties, `${path}.additionalProperties`);
|
|
105
|
-
}
|
|
106
|
-
if (schema.type != null) {
|
|
107
|
-
const objectKeywords = ['additionalProperties', 'properties', 'required'];
|
|
108
|
-
const arrayKeywords = ['items', 'maxItems', 'minItems', 'uniqueItems'];
|
|
109
|
-
const stringKeywords = ['maxLength', 'minLength', 'pattern'];
|
|
110
|
-
const numberKeywords = ['maximum', 'minimum'];
|
|
111
|
-
const incompatibleKeyword = [
|
|
112
|
-
...(schema.type === 'object' ? [] : objectKeywords),
|
|
113
|
-
...(schema.type === 'array' ? [] : arrayKeywords),
|
|
114
|
-
...(schema.type === 'string' ? [] : stringKeywords),
|
|
115
|
-
...(['integer', 'number'].includes(schema.type) ? [] : numberKeywords),
|
|
116
|
-
].find((key) => schema[key] != null);
|
|
117
|
-
if (incompatibleKeyword != null) {
|
|
118
|
-
throw new Error(`${incompatibleKeyword} свойства «${path}» несовместим с type «${schema.type}»`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
export const normalizeSchemaConfig = (schemaConfig, resources) => {
|
|
123
|
-
validateJsonValue(schemaConfig, 'Схема базы данных');
|
|
124
|
-
assertKnownKeys(schemaConfig, SCHEMA_CONFIG_KEYS, 'schema');
|
|
125
|
-
const info = schemaConfig.$info;
|
|
126
|
-
const normalizedInfo = isObject(info) ? info : undefined;
|
|
127
|
-
if (Object.hasOwn(schemaConfig, '$info') && (normalizedInfo == null || !['title', 'version'].every((key) => typeof normalizedInfo[key] === 'string' && normalizedInfo[key].trim() !== ''))) {
|
|
128
|
-
throw new Error('$info должен содержать непустые строковые поля title и version');
|
|
129
|
-
}
|
|
130
|
-
if (Object.hasOwn(schemaConfig, '$schema') && !isObject(schemaConfig.$schema)) {
|
|
131
|
-
throw new Error('$schema должен содержать JSON-объект');
|
|
132
|
-
}
|
|
133
|
-
const resourceConfigs = (schemaConfig.$schema ?? {});
|
|
134
|
-
Object.entries(resourceConfigs).forEach(([resource, resourceConfig]) => {
|
|
135
|
-
if (!resources.includes(resource)) {
|
|
136
|
-
throw new Error(`В $schema указан неизвестный ресурс «${resource}»`);
|
|
137
|
-
}
|
|
138
|
-
if (!isObject(resourceConfig)) {
|
|
139
|
-
throw new Error(`Настройки ресурса «${resource}» должны содержать JSON-объект`);
|
|
140
|
-
}
|
|
141
|
-
assertKnownKeys(resourceConfig, RESOURCE_CONFIG_KEYS, `$schema.${resource}`);
|
|
142
|
-
if (resourceConfig.name != null && (typeof resourceConfig.name !== 'string' || !COMPONENT_NAME_PATTERN.test(resourceConfig.name))) {
|
|
143
|
-
throw new Error(`$schema.${resource}.name должен соответствовать шаблону ${COMPONENT_NAME_PATTERN}`);
|
|
144
|
-
}
|
|
145
|
-
if (resourceConfig.required != null && (!Array.isArray(resourceConfig.required) || resourceConfig.required.some((path) => typeof path !== 'string' || path === ''))) {
|
|
146
|
-
throw new Error(`$schema.${resource}.required должен содержать массив непустых строк`);
|
|
147
|
-
}
|
|
148
|
-
if (resourceConfig.formats != null &&
|
|
149
|
-
(!isObject(resourceConfig.formats) || Object.entries(resourceConfig.formats).some(([path, format]) => path === '' || typeof format !== 'string' || format === ''))) {
|
|
150
|
-
throw new Error(`$schema.${resource}.formats должен содержать JSON-объект с непустыми строковыми путями и форматами`);
|
|
151
|
-
}
|
|
152
|
-
if (resourceConfig.properties != null) {
|
|
153
|
-
if (!isObject(resourceConfig.properties)) {
|
|
154
|
-
throw new Error(`$schema.${resource}.properties должен содержать JSON-объект`);
|
|
155
|
-
}
|
|
156
|
-
Object.entries(resourceConfig.properties).forEach(([key, value]) => {
|
|
157
|
-
validateSchemaOverride(value, `${resource}.${key}`);
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
return Object.fromEntries(resources.map((resource) => {
|
|
162
|
-
const resourceConfig = (resourceConfigs[resource] ?? {});
|
|
163
|
-
return [
|
|
164
|
-
resource,
|
|
165
|
-
{
|
|
166
|
-
formats: (resourceConfig.formats ?? {}),
|
|
167
|
-
name: typeof resourceConfig.name === 'string' ? resourceConfig.name : undefined,
|
|
168
|
-
properties: (resourceConfig.properties ?? {}),
|
|
169
|
-
required: (resourceConfig.required ?? []),
|
|
170
|
-
},
|
|
171
|
-
];
|
|
172
|
-
}));
|
|
173
|
-
};
|
|
174
|
-
export const applyConfiguredFields = (schema, resource, resourceConfig) => {
|
|
175
|
-
const { formats, required: requiredFields } = resourceConfig;
|
|
176
|
-
[...requiredFields, ...Object.keys(formats)].forEach((path) => {
|
|
177
|
-
if (getSchemasAtPath(schema, path.split('.')).length === 0) {
|
|
178
|
-
throw new Error(`Путь «${path}» из настроек ресурса «${resource}» отсутствует в итоговой схеме`);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
const schemaWithFormats = Object.entries(formats).reduce((result, [path, format]) => {
|
|
182
|
-
const schemas = getSchemasAtPath(result, path.split('.'));
|
|
183
|
-
if (!schemas.some((nestedSchema) => nestedSchema.type === 'string')) {
|
|
184
|
-
throw new Error(`Формат «${format}» для пути «${resource}.${path}» можно применить только к строковому полю`);
|
|
185
|
-
}
|
|
186
|
-
return updateSchemasAtPath(result, path.split('.'), (nestedSchema) => (nestedSchema.type === 'string' ? { ...nestedSchema, format } : nestedSchema));
|
|
187
|
-
}, schema);
|
|
188
|
-
return applyRequiredFields(schemaWithFormats, '', new Set(requiredFields));
|
|
189
|
-
};
|
|
190
|
-
export const resolveSchemaConfig = async (schema) => {
|
|
191
|
-
if (schema == null) {
|
|
192
|
-
return {};
|
|
193
|
-
}
|
|
194
|
-
if (typeof schema === 'string') {
|
|
195
|
-
return (await readJsonObjectFile(schema, 'Файл схемы базы данных'));
|
|
196
|
-
}
|
|
197
|
-
if (!isObject(schema)) {
|
|
198
|
-
throw new Error('Схема базы данных должна содержать JSON-объект');
|
|
199
|
-
}
|
|
200
|
-
const clonedSchema = structuredClone(schema);
|
|
201
|
-
validateJsonValue(clonedSchema, 'Схема базы данных');
|
|
202
|
-
return clonedSchema;
|
|
203
|
-
};
|
|
204
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/openapi/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { JsonObject, JsonValue, OpenapiSchema } from '../types.js';
|
|
2
|
-
type InferredSchema = Omit<OpenapiSchema, 'type'> & {
|
|
3
|
-
type?: OpenapiSchema['type'] | 'null';
|
|
4
|
-
};
|
|
5
|
-
export declare const mergeSchemas: (schemas: InferredSchema[]) => OpenapiSchema;
|
|
6
|
-
export declare const mergeSchemaOverrides: (schema: OpenapiSchema, overrides: unknown) => OpenapiSchema;
|
|
7
|
-
export declare const applyRequiredFields: (schema: OpenapiSchema, path: string, requiredFields: Set<string>) => OpenapiSchema;
|
|
8
|
-
export declare const inferSchema: (values: JsonValue[]) => OpenapiSchema;
|
|
9
|
-
export declare function inferObjectSchema(values: JsonObject[]): OpenapiSchema;
|
|
10
|
-
export declare const ensureGeneratedIdSchema: (schema: OpenapiSchema) => OpenapiSchema;
|
|
11
|
-
export declare const getSchemasAtPath: (schema: OpenapiSchema, keys: string[]) => OpenapiSchema[];
|
|
12
|
-
export declare const updateSchemasAtPath: (schema: OpenapiSchema, keys: string[], update: (schema: OpenapiSchema) => OpenapiSchema) => OpenapiSchema;
|
|
13
|
-
export declare const omitId: (schema: OpenapiSchema, keepRequired: boolean) => OpenapiSchema;
|
|
14
|
-
export {};
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import { isObject } from '../utils.js';
|
|
2
|
-
export const mergeSchemas = (schemas) => {
|
|
3
|
-
const uniqueSchemas = [...new Map(schemas.map((schema) => [JSON.stringify(schema), schema])).values()];
|
|
4
|
-
const nullable = uniqueSchemas.some((schema) => schema.type === 'null');
|
|
5
|
-
let nonNullSchemas = uniqueSchemas.filter((schema) => schema.type !== 'null');
|
|
6
|
-
if (nonNullSchemas.some((schema) => schema.type === 'number')) {
|
|
7
|
-
nonNullSchemas = nonNullSchemas.filter((schema) => schema.type !== 'integer');
|
|
8
|
-
}
|
|
9
|
-
if (nonNullSchemas.length === 0) {
|
|
10
|
-
return { enum: [null], nullable: true };
|
|
11
|
-
}
|
|
12
|
-
if (nonNullSchemas.length === 1) {
|
|
13
|
-
return nullable ? { ...nonNullSchemas[0], nullable: true } : nonNullSchemas[0];
|
|
14
|
-
}
|
|
15
|
-
return { oneOf: nonNullSchemas, ...(nullable && { nullable: true }) };
|
|
16
|
-
};
|
|
17
|
-
export const mergeSchemaOverrides = (schema, overrides) => {
|
|
18
|
-
if (!isObject(overrides)) {
|
|
19
|
-
return schema;
|
|
20
|
-
}
|
|
21
|
-
const result = { ...schema, ...overrides };
|
|
22
|
-
if (Object.hasOwn(overrides, 'type') && !Object.hasOwn(overrides, 'oneOf')) {
|
|
23
|
-
delete result.oneOf;
|
|
24
|
-
}
|
|
25
|
-
if (isObject(schema.properties) || isObject(overrides.properties)) {
|
|
26
|
-
const properties = isObject(schema.properties) ? { ...schema.properties } : {};
|
|
27
|
-
Object.entries(isObject(overrides.properties) ? overrides.properties : {}).forEach(([key, value]) => {
|
|
28
|
-
properties[key] = mergeSchemaOverrides(properties[key] ?? {}, value);
|
|
29
|
-
});
|
|
30
|
-
result.properties = properties;
|
|
31
|
-
}
|
|
32
|
-
if (isObject(schema.items) && isObject(overrides.items)) {
|
|
33
|
-
result.items = mergeSchemaOverrides(schema.items, overrides.items);
|
|
34
|
-
}
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
export const applyRequiredFields = (schema, path, requiredFields) => {
|
|
38
|
-
if (Array.isArray(schema.oneOf)) {
|
|
39
|
-
return { ...schema, oneOf: schema.oneOf.map((nestedSchema) => applyRequiredFields(nestedSchema, path, requiredFields)) };
|
|
40
|
-
}
|
|
41
|
-
if (schema.type === 'array') {
|
|
42
|
-
return { ...schema, items: applyRequiredFields(schema.items ?? {}, path, requiredFields) };
|
|
43
|
-
}
|
|
44
|
-
if (schema.type !== 'object' || !isObject(schema.properties)) {
|
|
45
|
-
return schema;
|
|
46
|
-
}
|
|
47
|
-
const properties = Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => {
|
|
48
|
-
const fieldPath = path === '' ? key : `${path}.${key}`;
|
|
49
|
-
return [key, applyRequiredFields(value, fieldPath, requiredFields)];
|
|
50
|
-
}));
|
|
51
|
-
const required = Object.keys(properties).filter((key) => {
|
|
52
|
-
const fieldPath = path === '' ? key : `${path}.${key}`;
|
|
53
|
-
return (path === '' && key === 'id') || requiredFields.has(fieldPath);
|
|
54
|
-
});
|
|
55
|
-
const result = { ...schema, properties };
|
|
56
|
-
delete result.required;
|
|
57
|
-
return required.length === 0 ? result : { ...result, required };
|
|
58
|
-
};
|
|
59
|
-
export const inferSchema = (values) => {
|
|
60
|
-
const schemas = [];
|
|
61
|
-
const arrays = values.filter((value) => Array.isArray(value));
|
|
62
|
-
const objects = values.filter((value) => isObject(value));
|
|
63
|
-
if (arrays.length > 0) {
|
|
64
|
-
const items = arrays.flat();
|
|
65
|
-
schemas.push({ items: items.length === 0 ? {} : inferSchema(items), type: 'array' });
|
|
66
|
-
}
|
|
67
|
-
if (objects.length > 0) {
|
|
68
|
-
schemas.push(inferObjectSchema(objects));
|
|
69
|
-
}
|
|
70
|
-
values
|
|
71
|
-
.filter((value) => !Array.isArray(value) && !isObject(value))
|
|
72
|
-
.forEach((value) => {
|
|
73
|
-
if (value === null) {
|
|
74
|
-
schemas.push({ type: 'null' });
|
|
75
|
-
}
|
|
76
|
-
else if (typeof value === 'number') {
|
|
77
|
-
schemas.push({ type: Number.isInteger(value) ? 'integer' : 'number' });
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
schemas.push({ type: typeof value });
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
return mergeSchemas(schemas);
|
|
84
|
-
};
|
|
85
|
-
export function inferObjectSchema(values) {
|
|
86
|
-
const keys = [...new Set(values.flatMap((value) => Object.keys(value)))].sort((left, right) => (left === 'id' ? -1 : right === 'id' ? 1 : left.localeCompare(right)));
|
|
87
|
-
const properties = Object.fromEntries(keys.map((key) => {
|
|
88
|
-
const fieldValues = values.filter((value) => Object.hasOwn(value, key)).map((value) => value[key]);
|
|
89
|
-
return [key, inferSchema(fieldValues)];
|
|
90
|
-
}));
|
|
91
|
-
return { properties, type: 'object' };
|
|
92
|
-
}
|
|
93
|
-
export const ensureGeneratedIdSchema = (schema) => {
|
|
94
|
-
const idSchema = schema.properties?.id ?? {};
|
|
95
|
-
const idSchemas = Array.isArray(idSchema.oneOf) ? idSchema.oneOf : [idSchema];
|
|
96
|
-
const properties = {
|
|
97
|
-
...schema.properties,
|
|
98
|
-
id: idSchemas.some(({ type }) => type === 'string') ? idSchema : { oneOf: [...idSchemas, { type: 'string' }] },
|
|
99
|
-
};
|
|
100
|
-
return { ...schema, properties };
|
|
101
|
-
};
|
|
102
|
-
export const getSchemasAtPath = (schema, keys) => {
|
|
103
|
-
if (Array.isArray(schema.oneOf)) {
|
|
104
|
-
return schema.oneOf.flatMap((nestedSchema) => getSchemasAtPath(nestedSchema, keys));
|
|
105
|
-
}
|
|
106
|
-
if (schema.type === 'array') {
|
|
107
|
-
return getSchemasAtPath(schema.items ?? {}, keys);
|
|
108
|
-
}
|
|
109
|
-
if (keys.length === 0) {
|
|
110
|
-
return [schema];
|
|
111
|
-
}
|
|
112
|
-
if (schema.type !== 'object' || !isObject(schema.properties) || !Object.hasOwn(schema.properties, keys[0])) {
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
115
|
-
return getSchemasAtPath(schema.properties[keys[0]], keys.slice(1));
|
|
116
|
-
};
|
|
117
|
-
export const updateSchemasAtPath = (schema, keys, update) => {
|
|
118
|
-
if (Array.isArray(schema.oneOf)) {
|
|
119
|
-
return { ...schema, oneOf: schema.oneOf.map((nestedSchema) => updateSchemasAtPath(nestedSchema, keys, update)) };
|
|
120
|
-
}
|
|
121
|
-
if (schema.type === 'array') {
|
|
122
|
-
return { ...schema, items: updateSchemasAtPath(schema.items ?? {}, keys, update) };
|
|
123
|
-
}
|
|
124
|
-
if (keys.length === 0) {
|
|
125
|
-
return update(schema);
|
|
126
|
-
}
|
|
127
|
-
if (schema.type !== 'object' || !isObject(schema.properties) || !Object.hasOwn(schema.properties, keys[0])) {
|
|
128
|
-
return schema;
|
|
129
|
-
}
|
|
130
|
-
return {
|
|
131
|
-
...schema,
|
|
132
|
-
properties: {
|
|
133
|
-
...schema.properties,
|
|
134
|
-
[keys[0]]: updateSchemasAtPath(schema.properties[keys[0]], keys.slice(1), update),
|
|
135
|
-
},
|
|
136
|
-
};
|
|
137
|
-
};
|
|
138
|
-
export const omitId = (schema, keepRequired) => {
|
|
139
|
-
const properties = Object.fromEntries(Object.entries(schema.properties ?? {}).filter(([key]) => key !== 'id'));
|
|
140
|
-
const required = keepRequired ? schema.required?.filter((key) => key !== 'id') : undefined;
|
|
141
|
-
const result = { ...schema, properties };
|
|
142
|
-
delete result.required;
|
|
143
|
-
return required != null && required.length > 0 ? { ...result, required } : result;
|
|
144
|
-
};
|
|
145
|
-
//# sourceMappingURL=inference.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../../src/openapi/inference.ts"],"names":[],"mappings":"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"}
|
package/dist/src/query/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Query } from '../types.js';
|
|
2
|
-
export interface Pagination {
|
|
3
|
-
page: number;
|
|
4
|
-
pageSize: number;
|
|
5
|
-
}
|
|
6
|
-
export interface Page<T> {
|
|
7
|
-
data: T[];
|
|
8
|
-
total: number;
|
|
9
|
-
}
|
|
10
|
-
export declare const parsePagination: (query: Query, maxPageSize?: number) => Pagination;
|
|
11
|
-
export declare const paginateItems: <T>(items: T[], page: number, pageSize: number) => Page<T>;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_MAX_PAGE_SIZE, DEFAULT_PAGE_SIZE } from '../constants.js';
|
|
2
|
-
import { createHttpError } from '../utils.js';
|
|
3
|
-
const parsePositiveInteger = (value, name, defaultValue) => {
|
|
4
|
-
if (value == null) {
|
|
5
|
-
return defaultValue;
|
|
6
|
-
}
|
|
7
|
-
const number = Number(value);
|
|
8
|
-
if (Array.isArray(value) || !/^[1-9]\d*$/.test(String(value)) || !Number.isSafeInteger(number)) {
|
|
9
|
-
throw createHttpError(400, `Параметр ${name} должен быть положительным целым числом`);
|
|
10
|
-
}
|
|
11
|
-
return number;
|
|
12
|
-
};
|
|
13
|
-
export const parsePagination = (query, maxPageSize = DEFAULT_MAX_PAGE_SIZE) => {
|
|
14
|
-
const page = parsePositiveInteger(query._page, '_page', 1);
|
|
15
|
-
const pageSize = parsePositiveInteger(query._perPage, '_perPage', DEFAULT_PAGE_SIZE);
|
|
16
|
-
if (pageSize > maxPageSize) {
|
|
17
|
-
throw createHttpError(400, `Параметр _perPage не должен превышать ${maxPageSize}`);
|
|
18
|
-
}
|
|
19
|
-
return { page, pageSize };
|
|
20
|
-
};
|
|
21
|
-
export const paginateItems = (items, page, pageSize) => {
|
|
22
|
-
const offset = (page - 1) * pageSize;
|
|
23
|
-
return {
|
|
24
|
-
data: items.slice(offset, offset + pageSize),
|
|
25
|
-
total: items.length,
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=pagination.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/query/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY9C,MAAM,oBAAoB,GAAG,CAAC,KAAoB,EAAE,IAAY,EAAE,YAAoB,EAAU,EAAE;IAChG,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/F,MAAM,eAAe,CAAC,GAAG,EAAE,YAAY,IAAI,yCAAyC,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAY,EAAE,WAAW,GAAG,qBAAqB,EAAc,EAAE;IAC/F,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAErF,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,eAAe,CAAC,GAAG,EAAE,yCAAyC,WAAW,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,KAAU,EAAE,IAAY,EAAE,QAAgB,EAAW,EAAE;IACtF,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;QAC5C,KAAK,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/src/query/sort.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const sortItems: <T>(items: T[], sort: unknown, validationItems?: unknown[]) => T[];
|
package/dist/src/query/sort.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { createHttpError, isObject, isSafeKey } from '../utils.js';
|
|
2
|
-
const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' });
|
|
3
|
-
const compareValues = (left, right) => {
|
|
4
|
-
if (Object.is(left, right)) {
|
|
5
|
-
return 0;
|
|
6
|
-
}
|
|
7
|
-
if (left == null) {
|
|
8
|
-
return 1;
|
|
9
|
-
}
|
|
10
|
-
if (right == null) {
|
|
11
|
-
return -1;
|
|
12
|
-
}
|
|
13
|
-
return typeof left === 'number' && typeof right === 'number' ? left - right : collator.compare(String(left), String(right));
|
|
14
|
-
};
|
|
15
|
-
const getValueByPath = (value, path) => path.split('.').reduce((currentValue, key) => (isObject(currentValue) && isSafeKey(key) ? currentValue[key] : undefined), value);
|
|
16
|
-
const parseSortRules = (sort, items) => {
|
|
17
|
-
if (sort == null || sort === '') {
|
|
18
|
-
return [];
|
|
19
|
-
}
|
|
20
|
-
if (typeof sort !== 'string') {
|
|
21
|
-
throw createHttpError(400, 'Параметр _sort должен содержать строку');
|
|
22
|
-
}
|
|
23
|
-
return sort.split(',').map((sortRule) => {
|
|
24
|
-
const isDescending = sortRule.startsWith('-');
|
|
25
|
-
const path = isDescending ? sortRule.slice(1) : sortRule;
|
|
26
|
-
const keys = path.split('.');
|
|
27
|
-
if (keys.some((key) => key === '' || !isSafeKey(key))) {
|
|
28
|
-
throw createHttpError(400, `Недопустимое поле сортировки «${path}»`);
|
|
29
|
-
}
|
|
30
|
-
const samples = items.map((item) => getValueByPath(item, path)).filter((value) => value !== undefined);
|
|
31
|
-
if (items.length > 0 && samples.length === 0) {
|
|
32
|
-
throw createHttpError(400, `Неизвестное поле сортировки «${path}»`);
|
|
33
|
-
}
|
|
34
|
-
if (samples.some((value) => isObject(value) || Array.isArray(value))) {
|
|
35
|
-
throw createHttpError(400, `Поле сортировки «${path}» должно содержать примитивные значения`);
|
|
36
|
-
}
|
|
37
|
-
return { isDescending, path };
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
export const sortItems = (items, sort, validationItems = items) => {
|
|
41
|
-
const sortRules = parseSortRules(sort, validationItems);
|
|
42
|
-
return sortRules.length === 0
|
|
43
|
-
? [...items]
|
|
44
|
-
: [...items].sort((left, right) => {
|
|
45
|
-
for (const { isDescending, path } of sortRules) {
|
|
46
|
-
const comparison = compareValues(getValueByPath(left, path), getValueByPath(right, path));
|
|
47
|
-
if (comparison !== 0) {
|
|
48
|
-
return isDescending ? -comparison : comparison;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return 0;
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=sort.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sort.js","sourceRoot":"","sources":["../../../src/query/sort.ts"],"names":[],"mappings":"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"}
|
package/dist/src/relations.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { DatabaseContainer } from './database.js';
|
|
2
|
-
import type { DatabaseRecord } from './types.js';
|
|
3
|
-
interface RelationContext {
|
|
4
|
-
forwardIndexes: Map<string, Map<string, DatabaseRecord>>;
|
|
5
|
-
resourceNames: string[];
|
|
6
|
-
reverseIndexes: Map<string, Map<string, DatabaseRecord[]>>;
|
|
7
|
-
}
|
|
8
|
-
export declare const createRelationContext: (database: DatabaseContainer) => RelationContext;
|
|
9
|
-
export declare const parseEmbedPaths: (embed: unknown) => string[][];
|
|
10
|
-
export declare const validateEmbedPaths: (database: DatabaseContainer, resource: string, items: DatabaseRecord[], embedPaths: string[][]) => void;
|
|
11
|
-
export declare const embedItem: (database: DatabaseContainer, item: DatabaseRecord, resource: string, embedPaths: string[][], context?: RelationContext) => DatabaseRecord;
|
|
12
|
-
export {};
|