@kollors/deep-json-server 0.7.0 → 0.8.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.
Files changed (107) hide show
  1. package/README.md +19 -16
  2. package/README.ru.md +20 -17
  3. package/dist/bin/deep-json-server.d.ts +2 -0
  4. package/dist/bin/deep-json-server.js +11 -0
  5. package/dist/bin/deep-json-server.js.map +1 -0
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/src/cli.d.ts +4 -0
  10. package/dist/src/cli.js +80 -0
  11. package/dist/src/cli.js.map +1 -0
  12. package/dist/src/config.d.ts +54 -0
  13. package/dist/src/config.js +145 -0
  14. package/dist/src/config.js.map +1 -0
  15. package/{src → dist/src}/constants.js +1 -0
  16. package/dist/src/constants.js.map +1 -0
  17. package/dist/src/database.d.ts +20 -0
  18. package/dist/src/database.js +136 -0
  19. package/dist/src/database.js.map +1 -0
  20. package/dist/src/files/contract.d.ts +67 -0
  21. package/dist/src/files/contract.js +106 -0
  22. package/dist/src/files/contract.js.map +1 -0
  23. package/dist/src/files/disk-store.d.ts +5 -0
  24. package/dist/src/files/disk-store.js +313 -0
  25. package/dist/src/files/disk-store.js.map +1 -0
  26. package/dist/src/files/index.d.ts +5 -0
  27. package/dist/src/files/index.js +6 -0
  28. package/dist/src/files/index.js.map +1 -0
  29. package/dist/src/files/memory-store.d.ts +3 -0
  30. package/dist/src/files/memory-store.js +80 -0
  31. package/dist/src/files/memory-store.js.map +1 -0
  32. package/dist/src/files/routes.d.ts +6 -0
  33. package/dist/src/files/routes.js +77 -0
  34. package/dist/src/files/routes.js.map +1 -0
  35. package/dist/src/openapi/config.d.ts +11 -0
  36. package/dist/src/openapi/config.js +204 -0
  37. package/dist/src/openapi/config.js.map +1 -0
  38. package/dist/src/openapi/document.d.ts +9 -0
  39. package/dist/src/openapi/document.js +338 -0
  40. package/dist/src/openapi/document.js.map +1 -0
  41. package/dist/src/openapi/index.d.ts +10 -0
  42. package/dist/src/openapi/index.js +27 -0
  43. package/dist/src/openapi/index.js.map +1 -0
  44. package/dist/src/openapi/inference.d.ts +14 -0
  45. package/dist/src/openapi/inference.js +145 -0
  46. package/dist/src/openapi/inference.js.map +1 -0
  47. package/dist/src/query/filter.d.ts +6 -0
  48. package/dist/src/query/filter.js +248 -0
  49. package/dist/src/query/filter.js.map +1 -0
  50. package/{src → dist/src}/query/index.js +1 -0
  51. package/dist/src/query/index.js.map +1 -0
  52. package/dist/src/query/pagination.d.ts +11 -0
  53. package/dist/src/query/pagination.js +28 -0
  54. package/dist/src/query/pagination.js.map +1 -0
  55. package/dist/src/query/sort.d.ts +1 -0
  56. package/dist/src/query/sort.js +54 -0
  57. package/dist/src/query/sort.js.map +1 -0
  58. package/dist/src/relation-metadata.d.ts +10 -0
  59. package/dist/src/relation-metadata.js +32 -0
  60. package/dist/src/relation-metadata.js.map +1 -0
  61. package/dist/src/relations.d.ts +12 -0
  62. package/dist/src/relations.js +155 -0
  63. package/dist/src/relations.js.map +1 -0
  64. package/dist/src/server.d.ts +13 -0
  65. package/dist/src/server.js +188 -0
  66. package/dist/src/server.js.map +1 -0
  67. package/dist/src/types.d.ts +52 -0
  68. package/dist/src/types.js +2 -0
  69. package/dist/src/types.js.map +1 -0
  70. package/dist/src/utils.d.ts +20 -0
  71. package/dist/src/utils.js +63 -0
  72. package/dist/src/utils.js.map +1 -0
  73. package/package.json +17 -16
  74. package/bin/deep-json-server.js +0 -11
  75. package/index.js +0 -12
  76. package/src/cli.js +0 -91
  77. package/src/config.js +0 -203
  78. package/src/database.js +0 -148
  79. package/src/files.js +0 -633
  80. package/src/openapi/config.js +0 -124
  81. package/src/openapi/document.js +0 -394
  82. package/src/openapi/index.js +0 -36
  83. package/src/openapi/inference.js +0 -187
  84. package/src/query/filter.js +0 -283
  85. package/src/query/pagination.js +0 -44
  86. package/src/query/sort.js +0 -63
  87. package/src/relation-metadata.js +0 -41
  88. package/src/relations.js +0 -173
  89. package/src/server.js +0 -250
  90. package/src/utils.js +0 -84
  91. package/types/index.d.ts +0 -21
  92. package/types/src/config.d.ts +0 -73
  93. package/types/src/database.d.ts +0 -33
  94. package/types/src/files.d.ts +0 -64
  95. package/types/src/openapi/config.d.ts +0 -3
  96. package/types/src/openapi/document.d.ts +0 -11
  97. package/types/src/openapi/index.d.ts +0 -9
  98. package/types/src/openapi/inference.d.ts +0 -9
  99. package/types/src/query/filter.d.ts +0 -3
  100. package/types/src/query/pagination.d.ts +0 -8
  101. package/types/src/query/sort.d.ts +0 -1
  102. package/types/src/relation-metadata.d.ts +0 -9
  103. package/types/src/relations.d.ts +0 -3
  104. package/types/src/server.d.ts +0 -14
  105. package/types/src/utils.d.ts +0 -18
  106. /package/{types → dist}/src/constants.d.ts +0 -0
  107. /package/{types → dist}/src/query/index.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-metadata.js","sourceRoot":"","sources":["../../src/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,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,KAAe,EAAY,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpI,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,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,aAAuB,EAAE,cAAsB,EAAgC,EAAE;IAChI,yEAAyE;IACzE,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,12 @@
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 {};
@@ -0,0 +1,155 @@
1
+ import { getRelationKeys, resolveRelationResource } from './relation-metadata.js';
2
+ import { createHttpError, getResourceNames, isObject, isSafeKey, singularize, toArray } from './utils.js';
3
+ export const createRelationContext = (database) => ({
4
+ forwardIndexes: new Map(),
5
+ resourceNames: getResourceNames(database.data),
6
+ reverseIndexes: new Map(),
7
+ });
8
+ const findLocalRelation = (item, relation, targetResource) => {
9
+ const relationKey = getRelationKeys(relation, singularize(relation), targetResource, singularize(targetResource)).find((key) => Object.hasOwn(item, key));
10
+ if (relationKey == null) {
11
+ return undefined;
12
+ }
13
+ return { ids: toArray(item[relationKey]).filter((id) => id != null), isMany: relationKey.endsWith('Ids') || Array.isArray(item[relationKey]) };
14
+ };
15
+ const collectReferences = (value, relationKeys, references) => {
16
+ if (Array.isArray(value)) {
17
+ value.forEach((item) => {
18
+ collectReferences(item, relationKeys, references);
19
+ });
20
+ return;
21
+ }
22
+ if (!isObject(value)) {
23
+ return;
24
+ }
25
+ Object.entries(value).forEach(([key, nestedValue]) => {
26
+ if (!isSafeKey(key)) {
27
+ return;
28
+ }
29
+ if (relationKeys.includes(key)) {
30
+ toArray(nestedValue).forEach((id) => {
31
+ if (id != null) {
32
+ references.add(String(id));
33
+ }
34
+ });
35
+ return;
36
+ }
37
+ collectReferences(nestedValue, relationKeys, references);
38
+ });
39
+ };
40
+ const getResourceIndex = (database, resource, context) => {
41
+ if (!context.forwardIndexes.has(resource)) {
42
+ context.forwardIndexes.set(resource, new Map(database.data[resource].map((item) => [String(item.id), item])));
43
+ }
44
+ return context.forwardIndexes.get(resource);
45
+ };
46
+ const getReverseIndex = (database, targetResource, relationKeys, context) => {
47
+ const cacheKey = `${targetResource}:${[...relationKeys].sort().join(',')}`;
48
+ const cachedIndex = context.reverseIndexes.get(cacheKey);
49
+ if (cachedIndex != null) {
50
+ return cachedIndex;
51
+ }
52
+ const index = new Map();
53
+ database.data[targetResource].forEach((item) => {
54
+ const references = new Set();
55
+ collectReferences(item, relationKeys, references);
56
+ references.forEach((id) => {
57
+ index.set(id, [...(index.get(id) ?? []), item]);
58
+ });
59
+ });
60
+ context.reverseIndexes.set(cacheKey, index);
61
+ return index;
62
+ };
63
+ const findRelatedValue = (database, item, sourceResource, relation, targetResource, context) => {
64
+ const localRelation = findLocalRelation(item, relation, targetResource);
65
+ if (localRelation != null) {
66
+ const targetIndex = getResourceIndex(database, targetResource, context);
67
+ const relatedItems = localRelation.ids.map((id) => targetIndex.get(String(id))).filter((targetItem) => targetItem != null);
68
+ return localRelation.isMany ? relatedItems : (relatedItems[0] ?? null);
69
+ }
70
+ if (item.id == null) {
71
+ return undefined;
72
+ }
73
+ const reverseRelationKeys = getRelationKeys(singularize(sourceResource));
74
+ if (relation === 'child' || relation === 'children') {
75
+ reverseRelationKeys.push('parentId', 'parentIds');
76
+ }
77
+ return getReverseIndex(database, targetResource, reverseRelationKeys, context).get(String(item.id)) ?? [];
78
+ };
79
+ const embedPath = (database, item, sourceResource, relations, context) => {
80
+ const [relation, ...nestedRelations] = relations;
81
+ if (relation == null || !isSafeKey(relation)) {
82
+ return item;
83
+ }
84
+ const currentValue = item[relation];
85
+ const targetResource = resolveRelationResource(context.resourceNames, relation, sourceResource);
86
+ const nestedSourceResource = targetResource ?? relation;
87
+ const localRelation = targetResource == null ? undefined : findLocalRelation(item, relation, targetResource);
88
+ if (localRelation == null) {
89
+ if (Array.isArray(currentValue)) {
90
+ return nestedRelations.length === 0
91
+ ? item
92
+ : { ...item, [relation]: currentValue.map((value) => (isObject(value) ? embedPath(database, value, nestedSourceResource, nestedRelations, context) : value)) };
93
+ }
94
+ if (isObject(currentValue)) {
95
+ return nestedRelations.length === 0 ? item : { ...item, [relation]: embedPath(database, currentValue, nestedSourceResource, nestedRelations, context) };
96
+ }
97
+ }
98
+ if (targetResource == null) {
99
+ return item;
100
+ }
101
+ const relatedValue = findRelatedValue(database, item, sourceResource, relation, targetResource, context);
102
+ if (relatedValue == null || nestedRelations.length === 0) {
103
+ return relatedValue === undefined ? item : { ...item, [relation]: relatedValue };
104
+ }
105
+ return {
106
+ ...item,
107
+ [relation]: Array.isArray(relatedValue)
108
+ ? relatedValue.map((value) => embedPath(database, value, targetResource, nestedRelations, context))
109
+ : embedPath(database, relatedValue, targetResource, nestedRelations, context),
110
+ };
111
+ };
112
+ export const parseEmbedPaths = (embed) => {
113
+ if (embed == null) {
114
+ return [];
115
+ }
116
+ const values = toArray(embed);
117
+ if (values.some((value) => typeof value !== 'string')) {
118
+ throw createHttpError(400, 'Параметр _embed должен содержать строковые пути связей');
119
+ }
120
+ return values
121
+ .flatMap((value) => value.split(','))
122
+ .map((path) => {
123
+ const keys = path.split('.');
124
+ if (keys.some((key) => key === '' || !isSafeKey(key))) {
125
+ throw createHttpError(400, `Недопустимый путь связи «${path}»`);
126
+ }
127
+ return keys;
128
+ });
129
+ };
130
+ const getNestedSamples = (samples, relation) => samples.flatMap((sample) => {
131
+ if (!isObject(sample) || !Object.hasOwn(sample, relation)) {
132
+ return [];
133
+ }
134
+ return toArray(sample[relation]).filter(isObject);
135
+ });
136
+ const validateEmbedPath = (database, sourceResource, samples, relations, path = '', resourceNames = getResourceNames(database.data)) => {
137
+ const [relation, ...nestedRelations] = relations;
138
+ const relationPath = path === '' ? relation : `${path}.${relation}`;
139
+ const targetResource = resolveRelationResource(resourceNames, relation, sourceResource);
140
+ const nestedSamples = targetResource == null ? getNestedSamples(samples, relation) : database.data[targetResource];
141
+ if (targetResource == null && nestedSamples.length === 0) {
142
+ throw createHttpError(400, `Неизвестный путь связи «${relationPath}»`);
143
+ }
144
+ if (nestedRelations.length > 0) {
145
+ validateEmbedPath(database, targetResource ?? relation, nestedSamples, nestedRelations, relationPath, resourceNames);
146
+ }
147
+ };
148
+ export const validateEmbedPaths = (database, resource, items, embedPaths) => {
149
+ const resourceNames = getResourceNames(database.data);
150
+ embedPaths.forEach((path) => {
151
+ validateEmbedPath(database, resource, items, path, '', resourceNames);
152
+ });
153
+ };
154
+ export const embedItem = (database, item, resource, embedPaths, context = createRelationContext(database)) => embedPaths.reduce((embeddedItem, path) => embedPath(database, embeddedItem, resource, path, context), item);
155
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../../src/relations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type FastifyInstance } from 'fastify';
2
+ import { type DeepJsonServerConfig } from './config.js';
3
+ import type { OpenapiDocument } from './types.js';
4
+ export interface ServerFacade {
5
+ fastify(): FastifyInstance;
6
+ openapi(): Promise<OpenapiDocument>;
7
+ }
8
+ interface ServerFeatures {
9
+ files?: boolean;
10
+ }
11
+ /** Creates lazy Fastify and OpenAPI accessors from one configuration. */
12
+ export declare function createServer(config: DeepJsonServerConfig, features?: ServerFeatures): Promise<ServerFacade>;
13
+ export {};
@@ -0,0 +1,188 @@
1
+ import Fastify from 'fastify';
2
+ import { normalizeServerConfig } from './config.js';
3
+ import { DEFAULT_HOST, DEFAULT_MAX_FILE_SIZE, DEFAULT_MAX_PAGE_SIZE, DEFAULT_PORT } from './constants.js';
4
+ import { createDatabaseStore, createId, findItemIndex, getCollection } from './database.js';
5
+ import { FILE_HEADERS } from './files/contract.js';
6
+ import { createFileStore, registerFileRoutes } from './files/index.js';
7
+ import { resolveSchemaConfig } from './openapi/config.js';
8
+ import { buildOpenapiDocument } from './openapi/document.js';
9
+ import { createOpenapi, writeOpenapi } from './openapi/index.js';
10
+ import { matchesWhere, paginateItems, parsePagination, parseWhere, sortItems, validateWhere } from './query/index.js';
11
+ import { createRelationContext, embedItem, parseEmbedPaths, validateEmbedPaths } from './relations.js';
12
+ import { createHttpError, getResourceNames, isObject } from './utils.js';
13
+ const CORS_HEADERS = {
14
+ 'Access-Control-Allow-Headers': [...Object.values(FILE_HEADERS).map(({ name }) => name), 'Content-Type'].join(', '),
15
+ 'Access-Control-Allow-Methods': 'DELETE, GET, OPTIONS, PATCH, POST, PUT',
16
+ 'Access-Control-Allow-Origin': '*',
17
+ };
18
+ const getSchemaName = (reference) => reference.split('/').at(-1);
19
+ const addRequestSchemas = (fastify, document, resources) => {
20
+ const requestSchemaNames = new Set(resources.flatMap((resource) => {
21
+ const resourcePath = document.paths[`/${resource}`];
22
+ const itemPath = document.paths[`/${resource}/{id}`];
23
+ return [getSchemaName(resourcePath.post.requestBody.content['application/json'].schema.$ref), getSchemaName(itemPath.patch.requestBody.content['application/json'].schema.$ref)];
24
+ }));
25
+ requestSchemaNames.forEach((schemaName) => {
26
+ fastify.addSchema({ $id: schemaName, ...document.components.schemas[schemaName] });
27
+ });
28
+ };
29
+ const getCollectionItem = (database, resource, id) => {
30
+ const collection = getCollection(database, resource);
31
+ const index = findItemIndex(collection, id);
32
+ if (index === -1) {
33
+ throw createHttpError(404, 'Запись не найдена');
34
+ }
35
+ return { collection, index, item: collection[index] };
36
+ };
37
+ const registerResourceRoutes = (fastify, store, resource, document, maxPageSize) => {
38
+ const resourcePath = `/${resource}`;
39
+ const itemPath = `/${resource}/:id`;
40
+ const createOperation = document.paths[resourcePath].post;
41
+ const updateOperation = document.paths[`/${resource}/{id}`].patch;
42
+ const createSchemaName = getSchemaName(createOperation.requestBody.content['application/json'].schema.$ref);
43
+ const updateSchemaName = getSchemaName(updateOperation.requestBody.content['application/json'].schema.$ref);
44
+ fastify.get(resourcePath, async (request) => {
45
+ await store.read();
46
+ const collection = getCollection(store.database, resource);
47
+ const query = request.query;
48
+ const where = parseWhere(query);
49
+ const embedPaths = parseEmbedPaths(query._embed);
50
+ const pagination = parsePagination(query, maxPageSize);
51
+ validateEmbedPaths(store.database, resource, collection, embedPaths);
52
+ const relationContext = createRelationContext(store.database);
53
+ const embeddedItems = collection.map((item) => embedItem(store.database, item, resource, embedPaths, relationContext));
54
+ validateWhere(where, embeddedItems);
55
+ const filteredItems = embeddedItems.filter((item) => matchesWhere(item, where));
56
+ const sortedItems = sortItems(filteredItems, query._sort, embeddedItems);
57
+ return paginateItems(sortedItems, pagination.page, pagination.pageSize);
58
+ });
59
+ fastify.get(itemPath, async (request) => {
60
+ await store.read();
61
+ const params = request.params;
62
+ const query = request.query;
63
+ const { collection, item } = getCollectionItem(store.database, resource, params.id);
64
+ const embedPaths = parseEmbedPaths(query._embed);
65
+ validateEmbedPaths(store.database, resource, collection, embedPaths);
66
+ return embedItem(store.database, item, resource, embedPaths);
67
+ });
68
+ fastify.post(resourcePath, { schema: { body: { $ref: `${createSchemaName}#` } } }, async (request, reply) => {
69
+ const item = await store.update((database) => {
70
+ const collection = getCollection(database, resource);
71
+ const createdItem = { ...request.body, id: createId(collection) };
72
+ collection.push(createdItem);
73
+ return createdItem;
74
+ });
75
+ return reply.code(201).send(item);
76
+ });
77
+ fastify.put(itemPath, { schema: { body: { $ref: `${createSchemaName}#` } } }, async (request) => store.update((database) => {
78
+ const { collection, index, item: currentItem } = getCollectionItem(database, resource, request.params.id);
79
+ const item = { ...request.body, id: currentItem.id };
80
+ collection.splice(index, 1, item);
81
+ return item;
82
+ }));
83
+ fastify.patch(itemPath, { schema: { body: { $ref: `${updateSchemaName}#` } } }, async (request) => store.update((database) => {
84
+ const { collection, index, item: currentItem } = getCollectionItem(database, resource, request.params.id);
85
+ const item = { ...currentItem, ...request.body, id: currentItem.id };
86
+ collection.splice(index, 1, item);
87
+ return item;
88
+ }));
89
+ fastify.delete(itemPath, async (request) => store.update((database) => {
90
+ const { collection, index, item } = getCollectionItem(database, resource, request.params.id);
91
+ collection.splice(index, 1);
92
+ return item;
93
+ }));
94
+ };
95
+ /** Creates lazy Fastify and OpenAPI accessors from one configuration. */
96
+ export async function createServer(config, features = {}) {
97
+ if (!isObject(features) || Object.keys(features).some((key) => key !== 'files') || (features.files != null && typeof features.files !== 'boolean')) {
98
+ throw new Error('Параметр features должен содержать только необязательный boolean-ключ files');
99
+ }
100
+ const normalizedConfig = normalizeServerConfig(config);
101
+ const filesEnabled = features.files ?? normalizedConfig.files != null;
102
+ const { cors = true, logger = true, maxFileSize = DEFAULT_MAX_FILE_SIZE, maxPageSize = DEFAULT_MAX_PAGE_SIZE } = normalizedConfig.server;
103
+ const store = await createDatabaseStore(normalizedConfig.database);
104
+ const schema = await resolveSchemaConfig(normalizedConfig.database.schema);
105
+ let fileStorePromise;
106
+ let fastifyInstance;
107
+ if (filesEnabled && normalizedConfig.files == null) {
108
+ throw new Error('Для файловых маршрутов укажите секцию config.files');
109
+ }
110
+ const getFileStore = () => (fileStorePromise ??= createFileStore(normalizedConfig.files));
111
+ if (filesEnabled && normalizedConfig.files?.data != null) {
112
+ await getFileStore();
113
+ }
114
+ const buildDocument = () => buildOpenapiDocument({
115
+ database: store.database.data,
116
+ files: filesEnabled,
117
+ maxPageSize,
118
+ schema,
119
+ });
120
+ const getFastify = () => {
121
+ if (fastifyInstance != null) {
122
+ return fastifyInstance;
123
+ }
124
+ const document = buildDocument();
125
+ const resources = getResourceNames(store.database.data);
126
+ const fastify = Fastify({ logger });
127
+ const originalListen = fastify.listen.bind(fastify);
128
+ // Calling fastify().listen() without arguments uses config defaults.
129
+ const defaultListenOptions = { host: normalizedConfig.server.host ?? DEFAULT_HOST, port: normalizedConfig.server.port ?? DEFAULT_PORT };
130
+ const listenWithDefaults = (optionsOrCallback, callback) => {
131
+ if (typeof optionsOrCallback === 'function') {
132
+ originalListen(defaultListenOptions, optionsOrCallback);
133
+ return undefined;
134
+ }
135
+ const options = optionsOrCallback ?? defaultListenOptions;
136
+ if (callback != null) {
137
+ originalListen(options, callback);
138
+ return undefined;
139
+ }
140
+ return originalListen(options);
141
+ };
142
+ fastify.listen = listenWithDefaults;
143
+ addRequestSchemas(fastify, document, resources);
144
+ if (cors) {
145
+ fastify.addHook('onRequest', async (_request, reply) => {
146
+ Object.entries(CORS_HEADERS).forEach(([header, value]) => {
147
+ reply.header(header, value);
148
+ });
149
+ });
150
+ fastify.options('/', async (_request, reply) => reply.code(204).send());
151
+ fastify.options('/*', async (_request, reply) => reply.code(204).send());
152
+ }
153
+ fastify.get('/', async () => ({ resources }));
154
+ resources.forEach((resource) => {
155
+ registerResourceRoutes(fastify, store, resource, document, maxPageSize);
156
+ });
157
+ if (filesEnabled) {
158
+ registerFileRoutes(fastify, { getStore: getFileStore, maxFileSize });
159
+ }
160
+ fastify.setErrorHandler((error, request, reply) => {
161
+ const candidateStatusCode = typeof error === 'object' && error != null && 'statusCode' in error ? error.statusCode : undefined;
162
+ const statusCode = typeof candidateStatusCode === 'number' && Number.isInteger(candidateStatusCode) && candidateStatusCode >= 400 && candidateStatusCode <= 599 ? candidateStatusCode : 500;
163
+ if (statusCode === 500) {
164
+ request.log.error(error);
165
+ }
166
+ return reply.code(statusCode).send({ error: statusCode === 500 ? 'Внутренняя ошибка сервера' : error instanceof Error ? error.message : String(error) });
167
+ });
168
+ fastifyInstance = fastify;
169
+ return fastifyInstance;
170
+ };
171
+ const openapi = async () => {
172
+ await store.read();
173
+ const document = createOpenapi({
174
+ database: store.database.data,
175
+ files: filesEnabled,
176
+ host: normalizedConfig.server.host,
177
+ maxPageSize,
178
+ port: normalizedConfig.server.port,
179
+ schema,
180
+ });
181
+ if (normalizedConfig.openapi.path != null) {
182
+ await writeOpenapi(document, normalizedConfig.openapi.path);
183
+ }
184
+ return document;
185
+ };
186
+ return { fastify: getFastify, openapi };
187
+ }
188
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
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
+ id: DatabaseId;
9
+ };
10
+ export type DatabaseData = Record<string, DatabaseRecord[]>;
11
+ export type OpenapiType = 'array' | 'boolean' | 'integer' | 'number' | 'object' | 'string';
12
+ export interface OpenapiSchema {
13
+ [key: string]: unknown;
14
+ additionalProperties?: boolean | OpenapiSchema;
15
+ allOf?: OpenapiSchema[];
16
+ anyOf?: OpenapiSchema[];
17
+ default?: JsonValue;
18
+ description?: string;
19
+ enum?: JsonValue[];
20
+ format?: string;
21
+ items?: OpenapiSchema;
22
+ maximum?: number;
23
+ maxItems?: number;
24
+ maxLength?: number;
25
+ minimum?: number;
26
+ minItems?: number;
27
+ minLength?: number;
28
+ not?: OpenapiSchema;
29
+ nullable?: boolean;
30
+ oneOf?: OpenapiSchema[];
31
+ pattern?: string;
32
+ properties?: Record<string, OpenapiSchema>;
33
+ required?: string[];
34
+ title?: string;
35
+ type?: OpenapiType;
36
+ uniqueItems?: boolean;
37
+ }
38
+ export interface OpenapiDocument {
39
+ [key: string]: unknown;
40
+ components: {
41
+ parameters: Record<string, unknown>;
42
+ schemas: Record<string, OpenapiSchema>;
43
+ };
44
+ info: Record<string, unknown>;
45
+ openapi: string;
46
+ paths: Record<string, Record<string, unknown>>;
47
+ servers?: Array<{
48
+ url: string;
49
+ }>;
50
+ }
51
+ export type QueryValue = string | string[] | undefined;
52
+ export type Query = Record<string, QueryValue>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ export interface HttpError extends Error {
2
+ statusCode: number;
3
+ }
4
+ export declare const assertKnownKeys: (value: object, keys: Set<string>, path: string) => void;
5
+ export declare const createHttpError: (statusCode: number, message: string) => HttpError;
6
+ /** Creates a scheduler that runs mutations sequentially. */
7
+ export declare const createSerialQueue: () => <T>(operation: () => Promise<T> | T) => Promise<T>;
8
+ /** Creates a random ID that is not currently in use. */
9
+ export declare const createUniqueId: (isUsed: (id: string) => boolean) => string;
10
+ export declare const getResourceNames: (data: object) => string[];
11
+ export declare const isObject: (value: unknown) => value is Record<string, unknown>;
12
+ export declare const isSafeKey: (key: string) => boolean;
13
+ export declare const isSystemError: (error: unknown) => error is NodeJS.ErrnoException;
14
+ /** Converts a single value or an array to an array. */
15
+ export declare const toArray: <T>(value: T | T[]) => T[];
16
+ export declare const isEqual: (left: unknown, right: unknown) => boolean;
17
+ export declare const resolveDatabasePath: (databasePath: string) => string;
18
+ export declare const isIdEqual: (left: unknown, right: unknown) => boolean;
19
+ export declare const singularize: (value: string) => string;
20
+ export declare const toPascalCase: (value: string) => string;
@@ -0,0 +1,63 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { resolve } from 'node:path';
3
+ import pluralize from 'pluralize';
4
+ const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
5
+ export const assertKnownKeys = (value, keys, path) => {
6
+ const unknownKey = Object.keys(value).find((key) => !keys.has(key));
7
+ if (unknownKey != null) {
8
+ throw new Error(`Неизвестный ключ ${path}.${unknownKey}`);
9
+ }
10
+ };
11
+ export const createHttpError = (statusCode, message) => Object.assign(new Error(message), { statusCode });
12
+ /** Creates a scheduler that runs mutations sequentially. */
13
+ export const createSerialQueue = () => {
14
+ let queue = Promise.resolve();
15
+ return (operation) => {
16
+ const pendingOperation = queue.then(operation);
17
+ // Keep the queue usable after a failed operation.
18
+ queue = pendingOperation.catch(() => undefined);
19
+ return pendingOperation;
20
+ };
21
+ };
22
+ /** Creates a random ID that is not currently in use. */
23
+ export const createUniqueId = (isUsed) => {
24
+ let id;
25
+ do {
26
+ id = randomBytes(8).toString('base64url');
27
+ } while (isUsed(id));
28
+ return id;
29
+ };
30
+ export const getResourceNames = (data) => Object.keys(data);
31
+ export const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
32
+ export const isSafeKey = (key) => !UNSAFE_KEYS.has(key);
33
+ export const isSystemError = (error) => error instanceof Error && 'code' in error;
34
+ /** Converts a single value or an array to an array. */
35
+ export const toArray = (value) => (Array.isArray(value) ? value : [value]);
36
+ export const isEqual = (left, right) => {
37
+ if (Object.is(left, right)) {
38
+ return true;
39
+ }
40
+ if (Array.isArray(left) && Array.isArray(right)) {
41
+ return left.length === right.length && left.every((value, index) => isEqual(value, right[index]));
42
+ }
43
+ if (isObject(left) && isObject(right)) {
44
+ const leftKeys = Object.keys(left);
45
+ const rightKeys = Object.keys(right);
46
+ return leftKeys.length === rightKeys.length && leftKeys.every((key) => isSafeKey(key) && Object.hasOwn(right, key) && isEqual(left[key], right[key]));
47
+ }
48
+ return false;
49
+ };
50
+ export const resolveDatabasePath = (databasePath) => {
51
+ if (typeof databasePath !== 'string' || databasePath === '') {
52
+ throw new Error('Укажите путь к JSON-базе данных');
53
+ }
54
+ return resolve(databasePath);
55
+ };
56
+ export const isIdEqual = (left, right) => left != null && right != null && String(left) === String(right);
57
+ export const singularize = (value) => pluralize.singular(value);
58
+ export const toPascalCase = (value) => value
59
+ .split(/[^a-zA-Z0-9]+/)
60
+ .filter(Boolean)
61
+ .map((part) => `${part[0].toUpperCase()}${part.slice(1)}`)
62
+ .join('');
63
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,37 +1,36 @@
1
1
  {
2
2
  "name": "@kollors/deep-json-server",
3
- "version": "0.7.0",
4
- "description": "JSON mock server with deep filters and recursive relationship embedding",
3
+ "version": "0.8.1",
4
+ "description": "JSON mock server with nested data filtering and relation embedding",
5
5
  "type": "module",
6
- "types": "./types/index.d.ts",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
7
8
  "bin": {
8
- "deep-json-server": "bin/deep-json-server.js"
9
+ "deep-json-server": "dist/bin/deep-json-server.js"
9
10
  },
10
11
  "exports": {
11
12
  ".": {
12
- "types": "./types/index.d.ts",
13
- "import": "./index.js"
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
14
15
  }
15
16
  },
16
17
  "files": [
17
- "bin",
18
- "index.js",
19
- "src",
20
- "types",
18
+ "dist",
21
19
  "LICENSE",
22
20
  "README.md",
23
21
  "README.ru.md"
24
22
  ],
25
23
  "scripts": {
26
- "check": "node --check index.js && node --check bin/deep-json-server.js && node --check src/*.js && node --check src/openapi/*.js && node --check src/query/*.js",
24
+ "build": "node scripts/clean-dist.js && tsc && node scripts/prepare-dist.js",
27
25
  "lint": "biome check .",
28
26
  "lint:fix": "biome check --write .",
29
- "prepack": "npm run types",
27
+ "pack:check": "node scripts/check-package.js",
28
+ "prepack": "npm run build",
30
29
  "prepublishOnly": "npm run verify",
31
- "test": "node --test",
32
- "test:coverage": "node --test --experimental-test-coverage --test-coverage-lines=90 --test-coverage-branches=80 --test-coverage-functions=90",
33
- "types": "tsc -p tsconfig.types.json",
34
- "verify": "npm run check && npm run lint && npm run test:coverage && npm run types"
30
+ "test": "npm run build && node --test",
31
+ "test:coverage": "npm run build && node scripts/run-coverage.js",
32
+ "typecheck": "tsc --noEmit",
33
+ "verify": "npm run typecheck && npm run lint && npm run test:coverage && npm run pack:check"
35
34
  },
36
35
  "engines": {
37
36
  "node": ">=20"
@@ -72,6 +71,8 @@
72
71
  },
73
72
  "devDependencies": {
74
73
  "@biomejs/biome": "^2.5.11",
74
+ "@types/node": "^24.10.0",
75
+ "@types/pluralize": "^0.0.33",
75
76
  "typescript": "^7.0.2"
76
77
  }
77
78
  }