rest_api_faker 0.0.5 → 0.0.6

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 (50) hide show
  1. package/bin/rest_api_faker.js +1 -1
  2. package/dist/cli.d.ts +2 -2
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +346 -1992
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +20 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +133 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/database.d.ts +29 -0
  11. package/dist/database.d.ts.map +1 -0
  12. package/dist/database.js +216 -0
  13. package/dist/database.js.map +1 -0
  14. package/dist/index.d.ts +6 -7
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +9 -46
  17. package/dist/index.js.map +1 -1
  18. package/dist/loader.d.ts +4 -0
  19. package/dist/loader.d.ts.map +1 -0
  20. package/dist/loader.js +42 -0
  21. package/dist/loader.js.map +1 -0
  22. package/dist/logger.d.ts +14 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +61 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/query.d.ts +19 -0
  27. package/dist/query.d.ts.map +1 -0
  28. package/dist/query.js +289 -0
  29. package/dist/query.js.map +1 -0
  30. package/dist/relationships.d.ts +10 -0
  31. package/dist/relationships.d.ts.map +1 -0
  32. package/dist/relationships.js +95 -0
  33. package/dist/relationships.js.map +1 -0
  34. package/dist/rewriter.d.ts +5 -0
  35. package/dist/rewriter.d.ts.map +1 -0
  36. package/dist/rewriter.js +135 -0
  37. package/dist/rewriter.js.map +1 -0
  38. package/dist/router.d.ts +9 -0
  39. package/dist/router.d.ts.map +1 -0
  40. package/dist/router.js +275 -0
  41. package/dist/router.js.map +1 -0
  42. package/dist/server.d.ts +17 -0
  43. package/dist/server.d.ts.map +1 -0
  44. package/dist/server.js +90 -0
  45. package/dist/server.js.map +1 -0
  46. package/dist/static.d.ts +8 -0
  47. package/dist/static.d.ts.map +1 -0
  48. package/dist/static.js +148 -0
  49. package/dist/static.js.map +1 -0
  50. package/package.json +13 -14
package/dist/query.js ADDED
@@ -0,0 +1,289 @@
1
+ import { logger } from './logger.js';
2
+ export function parseQuery(req) {
3
+ const query = req.query;
4
+ const filters = {};
5
+ const operators = {};
6
+ const sort = [];
7
+ const order = [];
8
+ let page;
9
+ let limit;
10
+ let start;
11
+ let end;
12
+ let q;
13
+ for (const [key, value] of Object.entries(query)) {
14
+ const stringValue = typeof value === 'string'
15
+ ? value
16
+ : Array.isArray(value) && value.length > 0 && typeof value[0] === 'string'
17
+ ? value[0]
18
+ : null;
19
+ if (stringValue === null && !Array.isArray(value)) {
20
+ continue;
21
+ }
22
+ if (key === '_sort') {
23
+ if (typeof value === 'string') {
24
+ sort.push(...value.split(','));
25
+ }
26
+ else if (Array.isArray(value)) {
27
+ for (const v of value) {
28
+ if (typeof v === 'string') {
29
+ sort.push(v);
30
+ }
31
+ }
32
+ }
33
+ continue;
34
+ }
35
+ if (key === '_order') {
36
+ if (typeof value === 'string') {
37
+ order.push(...value.split(','));
38
+ }
39
+ else if (Array.isArray(value)) {
40
+ for (const v of value) {
41
+ if (typeof v === 'string') {
42
+ order.push(v);
43
+ }
44
+ }
45
+ }
46
+ continue;
47
+ }
48
+ if (key === '_page' && stringValue) {
49
+ const parsed = parseInt(stringValue, 10);
50
+ if (!isNaN(parsed) && parsed > 0) {
51
+ page = parsed;
52
+ }
53
+ continue;
54
+ }
55
+ if (key === '_limit' && stringValue) {
56
+ const parsed = parseInt(stringValue, 10);
57
+ if (!isNaN(parsed) && parsed > 0) {
58
+ limit = parsed;
59
+ }
60
+ continue;
61
+ }
62
+ if (key === '_start' && stringValue) {
63
+ const parsed = parseInt(stringValue, 10);
64
+ if (!isNaN(parsed) && parsed >= 0) {
65
+ start = parsed;
66
+ }
67
+ continue;
68
+ }
69
+ if (key === '_end' && stringValue) {
70
+ const parsed = parseInt(stringValue, 10);
71
+ if (!isNaN(parsed) && parsed >= 0) {
72
+ end = parsed;
73
+ }
74
+ continue;
75
+ }
76
+ if (key === 'q' && stringValue && stringValue.trim() !== '') {
77
+ q = stringValue;
78
+ continue;
79
+ }
80
+ const operatorMatch = key.match(/^(.+)_(gte|lte|ne|like)$/);
81
+ if (operatorMatch && stringValue) {
82
+ const field = operatorMatch[1];
83
+ const operator = operatorMatch[2];
84
+ if (field && operator) {
85
+ if (!operators[field]) {
86
+ operators[field] = {};
87
+ }
88
+ operators[field][operator] = stringValue;
89
+ }
90
+ continue;
91
+ }
92
+ if (typeof value === 'string') {
93
+ filters[key] = value;
94
+ }
95
+ else if (Array.isArray(value)) {
96
+ const stringValues = value.filter((v) => typeof v === 'string');
97
+ if (stringValues.length > 0) {
98
+ filters[key] = stringValues;
99
+ }
100
+ }
101
+ }
102
+ const result = {
103
+ filters,
104
+ operators,
105
+ sort,
106
+ order,
107
+ };
108
+ if (page !== undefined)
109
+ result.page = page;
110
+ if (limit !== undefined)
111
+ result.limit = limit;
112
+ if (start !== undefined)
113
+ result.start = start;
114
+ if (end !== undefined)
115
+ result.end = end;
116
+ if (q !== undefined)
117
+ result.q = q;
118
+ logger.debug(`Parsed query options: ${JSON.stringify(result)}`);
119
+ return result;
120
+ }
121
+ function getNestedValue(obj, path) {
122
+ if (typeof obj !== 'object' || obj === null) {
123
+ return undefined;
124
+ }
125
+ const keys = path.split('.');
126
+ let current = obj;
127
+ for (const key of keys) {
128
+ if (typeof current !== 'object' || current === null || !(key in current)) {
129
+ return undefined;
130
+ }
131
+ current = current[key];
132
+ }
133
+ return current;
134
+ }
135
+ function matchesFilters(item, filters) {
136
+ if (typeof item !== 'object' || item === null) {
137
+ return false;
138
+ }
139
+ for (const [key, filterValue] of Object.entries(filters)) {
140
+ if (key === 'q')
141
+ continue;
142
+ const itemValue = getNestedValue(item, key);
143
+ if (Array.isArray(filterValue)) {
144
+ const matched = filterValue.some((val) => String(itemValue) === val);
145
+ if (!matched) {
146
+ return false;
147
+ }
148
+ }
149
+ else {
150
+ if (String(itemValue) !== filterValue) {
151
+ return false;
152
+ }
153
+ }
154
+ }
155
+ return true;
156
+ }
157
+ function matchesOperators(item, operators) {
158
+ if (typeof item !== 'object' || item === null) {
159
+ return false;
160
+ }
161
+ for (const [key, ops] of Object.entries(operators)) {
162
+ const itemValue = getNestedValue(item, key);
163
+ for (const [operator, filterValue] of Object.entries(ops)) {
164
+ if (operator === 'gte') {
165
+ if (Number(itemValue) < Number(filterValue)) {
166
+ return false;
167
+ }
168
+ }
169
+ else if (operator === 'lte') {
170
+ if (Number(itemValue) > Number(filterValue)) {
171
+ return false;
172
+ }
173
+ }
174
+ else if (operator === 'ne') {
175
+ if (String(itemValue) === filterValue) {
176
+ return false;
177
+ }
178
+ }
179
+ else if (operator === 'like') {
180
+ const itemStr = String(itemValue).toLowerCase();
181
+ const filterStr = filterValue.toLowerCase();
182
+ if (!itemStr.includes(filterStr)) {
183
+ return false;
184
+ }
185
+ }
186
+ }
187
+ }
188
+ return true;
189
+ }
190
+ function matchesSearch(item, searchText) {
191
+ if (typeof item !== 'object' || item === null) {
192
+ return false;
193
+ }
194
+ const lowerSearch = searchText.toLowerCase();
195
+ function searchObject(obj) {
196
+ if (typeof obj === 'string') {
197
+ return obj.toLowerCase().includes(lowerSearch);
198
+ }
199
+ if (typeof obj === 'object' && obj !== null) {
200
+ return Object.values(obj).some(searchObject);
201
+ }
202
+ return false;
203
+ }
204
+ return searchObject(item);
205
+ }
206
+ export function applyQuery(data, options) {
207
+ let result = [...data];
208
+ logger.trace(`Applying query: ${JSON.stringify(options)} on ${data.length.toString()} items`);
209
+ if (options.q) {
210
+ logger.trace(`Applying full-text search for: '${options.q}'`);
211
+ const searchText = options.q;
212
+ result = result.filter((item) => matchesSearch(item, searchText));
213
+ }
214
+ logger.trace(`After full-text search, ${result.length.toString()} items remain`);
215
+ if (Object.keys(options.filters).length > 0) {
216
+ result = result.filter((item) => matchesFilters(item, options.filters));
217
+ }
218
+ logger.trace(`After filtering, ${result.length.toString()} items remain`);
219
+ if (Object.keys(options.operators).length > 0) {
220
+ result = result.filter((item) => matchesOperators(item, options.operators));
221
+ }
222
+ logger.trace(`After applying operators, ${result.length.toString()} items remain`);
223
+ const total = result.length;
224
+ if (options.sort.length > 0) {
225
+ const sortFields = options.sort;
226
+ const sortOrders = options.order;
227
+ result.sort((a, b) => {
228
+ for (let i = 0; i < sortFields.length; i++) {
229
+ const field = sortFields[i];
230
+ if (!field)
231
+ continue;
232
+ const order = sortOrders[i] === 'desc' ? -1 : 1;
233
+ const aVal = getNestedValue(a, field);
234
+ const bVal = getNestedValue(b, field);
235
+ if (aVal === bVal)
236
+ continue;
237
+ if (aVal === undefined || aVal === null)
238
+ return 1 * order;
239
+ if (bVal === undefined || bVal === null)
240
+ return -1 * order;
241
+ if (aVal < bVal)
242
+ return -1 * order;
243
+ if (aVal > bVal)
244
+ return 1 * order;
245
+ }
246
+ return 0;
247
+ });
248
+ }
249
+ logger.trace(`After sorting, ${result.length.toString()} items remain`);
250
+ if (options.start !== undefined || options.end !== undefined) {
251
+ logger.trace(`Applying slicing from ${options.start?.toString() ?? ''} to ${options.end?.toString() ?? 'end'}`);
252
+ const start = options.start ?? 0;
253
+ const end = options.end ?? result.length;
254
+ result = result.slice(start, end);
255
+ }
256
+ else if (options.page !== undefined && options.limit !== undefined) {
257
+ logger.trace(`Applying pagination: page ${options.page.toString()}, limit ${options.limit.toString()}`);
258
+ const start = (options.page - 1) * options.limit;
259
+ result = result.slice(start, start + options.limit);
260
+ }
261
+ else if (options.limit !== undefined) {
262
+ logger.trace(`Applying limit: ${options.limit.toString()}`);
263
+ result = result.slice(0, options.limit);
264
+ }
265
+ logger.trace(`After pagination/slicing, ${result.length.toString()} items remain`);
266
+ return { data: result, total };
267
+ }
268
+ export function generateLinkHeader(req, page, limit, total) {
269
+ const host = req.get('host') ?? 'localhost';
270
+ const baseUrl = `${req.protocol}://${host}${req.path}`;
271
+ const query = new URLSearchParams(req.query);
272
+ const lastPage = Math.ceil(total / limit);
273
+ const links = [];
274
+ query.set('_page', '1');
275
+ query.set('_limit', String(limit));
276
+ links.push(`<${baseUrl}?${query.toString()}>; rel="first"`);
277
+ if (page > 1) {
278
+ query.set('_page', String(page - 1));
279
+ links.push(`<${baseUrl}?${query.toString()}>; rel="prev"`);
280
+ }
281
+ if (page < lastPage) {
282
+ query.set('_page', String(page + 1));
283
+ links.push(`<${baseUrl}?${query.toString()}>; rel="next"`);
284
+ }
285
+ query.set('_page', String(lastPage));
286
+ links.push(`<${baseUrl}?${query.toString()}>; rel="last"`);
287
+ return links.join(', ');
288
+ }
289
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Database } from './database.js';
2
+ export declare function getForeignKey(collectionName: string, foreignKeySuffix: string): string;
3
+ export declare function embedChildren<T extends Record<string, unknown>>(items: T[], parentCollection: string, childCollection: string, db: Database, idField: string, foreignKeySuffix: string): T[];
4
+ export declare function expandParent<T extends Record<string, unknown>>(items: T[], _childCollection: string, parentCollection: string, db: Database, idField: string, foreignKeySuffix: string): T[];
5
+ export declare function applyRelationships<T extends Record<string, unknown>>(data: T[], resource: string, embed: string[], expand: string[], db: Database, idField: string, foreignKeySuffix: string): T[];
6
+ export declare function parseRelationships(query: Record<string, unknown>): {
7
+ embed: string[];
8
+ expand: string[];
9
+ };
10
+ //# sourceMappingURL=relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAa9C,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAKtF;AAiBD,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,KAAK,EAAE,CAAC,EAAE,EACV,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GACvB,CAAC,EAAE,CAwBL;AAiBD,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,KAAK,EAAE,CAAC,EAAE,EACV,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,MAAM,EACxB,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GACvB,CAAC,EAAE,CA2CL;AAiBD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,IAAI,EAAE,CAAC,EAAE,EACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GACvB,CAAC,EAAE,CAcL;AAYD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAClE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA6BA"}
@@ -0,0 +1,95 @@
1
+ export function getForeignKey(collectionName, foreignKeySuffix) {
2
+ const singular = collectionName.endsWith('s') ? collectionName.slice(0, -1) : collectionName;
3
+ return `${singular}${foreignKeySuffix}`;
4
+ }
5
+ export function embedChildren(items, parentCollection, childCollection, db, idField, foreignKeySuffix) {
6
+ const children = db.getCollection(childCollection);
7
+ if (!Array.isArray(children)) {
8
+ return items;
9
+ }
10
+ const foreignKey = getForeignKey(parentCollection, foreignKeySuffix);
11
+ return items.map((item) => {
12
+ const matchingChildren = children.filter((child) => {
13
+ if (typeof child !== 'object' || child === null)
14
+ return false;
15
+ const childFk = child[foreignKey];
16
+ const parentId = item[idField];
17
+ return childFk === parentId || String(childFk) === String(parentId);
18
+ });
19
+ return {
20
+ ...item,
21
+ [childCollection]: matchingChildren,
22
+ };
23
+ });
24
+ }
25
+ export function expandParent(items, _childCollection, parentCollection, db, idField, foreignKeySuffix) {
26
+ const parents = db.getCollection(parentCollection);
27
+ if (!Array.isArray(parents)) {
28
+ return items;
29
+ }
30
+ const foreignKey = getForeignKey(parentCollection, foreignKeySuffix);
31
+ return items.map((item) => {
32
+ const foreignKeyValue = item[foreignKey];
33
+ if (foreignKeyValue === undefined) {
34
+ return item;
35
+ }
36
+ const parent = parents.find((p) => {
37
+ if (typeof p !== 'object' || p === null)
38
+ return false;
39
+ const parentRecord = p;
40
+ const parentId = parentRecord[idField];
41
+ if (typeof foreignKeyValue === 'number' || typeof foreignKeyValue === 'string') {
42
+ return parentId === foreignKeyValue || String(parentId) === String(foreignKeyValue);
43
+ }
44
+ return false;
45
+ });
46
+ if (!parent || typeof parent !== 'object') {
47
+ return item;
48
+ }
49
+ const parentPropName = parentCollection.endsWith('s')
50
+ ? parentCollection.slice(0, -1)
51
+ : parentCollection;
52
+ return {
53
+ ...item,
54
+ [parentPropName]: parent,
55
+ };
56
+ });
57
+ }
58
+ export function applyRelationships(data, resource, embed, expand, db, idField, foreignKeySuffix) {
59
+ let result = data;
60
+ for (const childCollection of embed) {
61
+ result = embedChildren(result, resource, childCollection, db, idField, foreignKeySuffix);
62
+ }
63
+ for (const parentCollection of expand) {
64
+ result = expandParent(result, resource, parentCollection, db, idField, foreignKeySuffix);
65
+ }
66
+ return result;
67
+ }
68
+ export function parseRelationships(query) {
69
+ const embed = [];
70
+ const expand = [];
71
+ const embedParam = query._embed;
72
+ if (typeof embedParam === 'string') {
73
+ embed.push(...embedParam.split(','));
74
+ }
75
+ else if (Array.isArray(embedParam)) {
76
+ for (const e of embedParam) {
77
+ if (typeof e === 'string') {
78
+ embed.push(e);
79
+ }
80
+ }
81
+ }
82
+ const expandParam = query._expand;
83
+ if (typeof expandParam === 'string') {
84
+ expand.push(...expandParam.split(','));
85
+ }
86
+ else if (Array.isArray(expandParam)) {
87
+ for (const e of expandParam) {
88
+ if (typeof e === 'string') {
89
+ expand.push(e);
90
+ }
91
+ }
92
+ }
93
+ return { embed, expand };
94
+ }
95
+ //# sourceMappingURL=relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { RequestHandler } from 'express';
2
+ export type RewriteRules = Record<string, string>;
3
+ export declare function loadRewriteRules(filePath: string): Promise<RewriteRules>;
4
+ export declare function createRewriterMiddleware(rules: RewriteRules): RequestHandler;
5
+ //# sourceMappingURL=rewriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriter.d.ts","sourceRoot":"","sources":["../src/rewriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAiBzC,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAgBlD,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiC9E;AAoMD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CAqB5E"}
@@ -0,0 +1,135 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { logger } from './logger.js';
3
+ export async function loadRewriteRules(filePath) {
4
+ try {
5
+ const content = await readFile(filePath, 'utf-8');
6
+ const rules = JSON.parse(content);
7
+ if (typeof rules !== 'object' || rules === null || Array.isArray(rules)) {
8
+ throw new Error('Routes file must contain a JSON object with route mappings');
9
+ }
10
+ for (const [key, value] of Object.entries(rules)) {
11
+ if (typeof value !== 'string') {
12
+ throw new Error(`Route mapping for '${key}' must be a string, got ${typeof value}`);
13
+ }
14
+ }
15
+ return rules;
16
+ }
17
+ catch (error) {
18
+ if (error instanceof Error && error.message.includes('Routes file must contain')) {
19
+ throw error;
20
+ }
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ throw new Error(`Failed to load routes from '${filePath}': ${message}\n` +
23
+ `\nExpected format:\n` +
24
+ `{\n` +
25
+ ` "/api/*": "/$1",\n` +
26
+ ` "/users/:id": "/api/users/:id"\n` +
27
+ `}\n` +
28
+ `\nSee examples/routes.json for more examples.`, { cause: error });
29
+ }
30
+ }
31
+ function patternToRegex(pattern) {
32
+ const params = [];
33
+ let wildcardCount = 0;
34
+ let regexPattern = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
35
+ regexPattern = regexPattern.replace(/:([^/]+)/g, (_match, param) => {
36
+ params.push(param);
37
+ return '([^/]+)';
38
+ });
39
+ regexPattern = regexPattern.replace(/\*/g, () => {
40
+ wildcardCount++;
41
+ params.push(`$${String(wildcardCount)}`);
42
+ return '(.*?)';
43
+ });
44
+ return {
45
+ regex: new RegExp(`^${regexPattern}$`),
46
+ params,
47
+ };
48
+ }
49
+ function rewriteUrl(url, fromPattern, toPattern) {
50
+ const splitResult = url.split('?', 2);
51
+ const urlPath = splitResult[0] ?? '';
52
+ const urlQuery = splitResult[1];
53
+ const patternSplit = fromPattern.split('?', 2);
54
+ const patternPath = patternSplit[0] ?? '';
55
+ const patternQuery = patternSplit[1];
56
+ const { regex, params } = patternToRegex(patternPath);
57
+ const match = urlPath.match(regex);
58
+ if (!match) {
59
+ return null;
60
+ }
61
+ const captures = match.slice(1);
62
+ if (patternQuery) {
63
+ const patternParams = new URLSearchParams(patternQuery);
64
+ const urlParams = new URLSearchParams(urlQuery || '');
65
+ for (const [key, patternValue] of patternParams.entries()) {
66
+ if (!urlParams.has(key)) {
67
+ return null;
68
+ }
69
+ if (patternValue === '*') {
70
+ captures.push(urlParams.get(key) || '');
71
+ }
72
+ else if (urlParams.get(key) !== patternValue) {
73
+ return null;
74
+ }
75
+ }
76
+ }
77
+ let result = toPattern;
78
+ for (let i = 0; i < captures.length; i++) {
79
+ const value = captures[i];
80
+ if (value !== undefined) {
81
+ result = result.replace(`$${String(i + 1)}`, value);
82
+ }
83
+ }
84
+ for (let i = 0; i < params.length; i++) {
85
+ const param = params[i];
86
+ const value = captures[i];
87
+ if (param && !param.startsWith('$') && value !== undefined) {
88
+ result = result.replace(`:${param}`, value);
89
+ }
90
+ }
91
+ if (!patternQuery && urlQuery) {
92
+ result += '?' + urlQuery;
93
+ }
94
+ logger.info(`Rewriting URL: '${url}' → '${result}' using pattern '${fromPattern}'`);
95
+ return result;
96
+ }
97
+ function getPatternSpecificity(pattern) {
98
+ let score = 0;
99
+ const [path, query] = pattern.split('?', 2);
100
+ const segments = path?.split('/').filter(s => s.length > 0) ?? [];
101
+ for (const segment of segments) {
102
+ if (segment === '*') {
103
+ score += 1;
104
+ }
105
+ else if (segment.startsWith(':')) {
106
+ score += 10;
107
+ }
108
+ else {
109
+ score += 100;
110
+ }
111
+ }
112
+ if (query) {
113
+ score += 1000;
114
+ }
115
+ score += segments.length;
116
+ return score;
117
+ }
118
+ export function createRewriterMiddleware(rules) {
119
+ const sortedRules = Object.entries(rules).sort((a, b) => {
120
+ const scoreA = getPatternSpecificity(a[0]);
121
+ const scoreB = getPatternSpecificity(b[0]);
122
+ return scoreB - scoreA;
123
+ });
124
+ return (req, _res, next) => {
125
+ for (const [from, to] of sortedRules) {
126
+ const rewritten = rewriteUrl(req.url, from, to);
127
+ if (rewritten !== null) {
128
+ req.url = rewritten;
129
+ break;
130
+ }
131
+ }
132
+ next();
133
+ };
134
+ }
135
+ //# sourceMappingURL=rewriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../src/rewriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Router } from 'express';
2
+ import { Database } from './database.js';
3
+ export interface RouterOptions {
4
+ idField?: string;
5
+ foreignKeySuffix?: string;
6
+ readOnly?: boolean;
7
+ }
8
+ export declare function createRouter(db: Database, options?: Partial<RouterOptions>): Router;
9
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAmBzC,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiBD,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,MAAM,CAgZvF"}