@orion-js/helpers 4.0.0-next.2 → 4.0.0-next.3

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Orionjs Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.cjs CHANGED
@@ -4,7 +4,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
7
  var __export = (target, all) => {
9
8
  for (var name in all)
10
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -58,21 +57,20 @@ __export(index_exports, {
58
57
  module.exports = __toCommonJS(index_exports);
59
58
 
60
59
  // src/sleep.ts
61
- var sleep_default = /* @__PURE__ */ __name((time) => {
60
+ var sleep_default = (time) => {
62
61
  return new Promise((resolve) => setTimeout(resolve, time));
63
- }, "default");
62
+ };
64
63
 
65
64
  // src/hashObject.ts
66
65
  var import_object_hash = __toESM(require("object-hash"), 1);
67
66
  function hashObject_default(object) {
68
67
  return (0, import_object_hash.default)(object);
69
68
  }
70
- __name(hashObject_default, "default");
71
69
 
72
70
  // src/generateId.ts
73
71
  var import_crypto = __toESM(require("crypto"), 1);
74
72
  var UNMISTAKABLE_CHARS = "23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghjkmnopqrstuvwxyz";
75
- var hexString = /* @__PURE__ */ __name(function(digits) {
73
+ var hexString = function(digits) {
76
74
  var numBytes = Math.ceil(digits / 2);
77
75
  var bytes;
78
76
  try {
@@ -82,30 +80,29 @@ var hexString = /* @__PURE__ */ __name(function(digits) {
82
80
  }
83
81
  var result = bytes.toString("hex");
84
82
  return result.substring(0, digits);
85
- }, "hexString");
86
- var fraction = /* @__PURE__ */ __name(function() {
83
+ };
84
+ var fraction = function() {
87
85
  var numerator = parseInt(hexString(8), 16);
88
86
  return numerator * 23283064365386963e-26;
89
- }, "fraction");
90
- var choice = /* @__PURE__ */ __name(function(arrayOrString) {
87
+ };
88
+ var choice = function(arrayOrString) {
91
89
  var index = Math.floor(fraction() * arrayOrString.length);
92
90
  if (typeof arrayOrString === "string") return arrayOrString.substr(index, 1);
93
91
  else return arrayOrString[index];
94
- }, "choice");
95
- var randomString = /* @__PURE__ */ __name(function(charsCount, alphabet) {
92
+ };
93
+ var randomString = function(charsCount, alphabet) {
96
94
  var digits = [];
97
95
  for (var i = 0; i < charsCount; i++) {
98
96
  digits[i] = choice(alphabet);
99
97
  }
100
98
  return digits.join("");
101
- }, "randomString");
99
+ };
102
100
  function generateId(charsCount, chars = UNMISTAKABLE_CHARS) {
103
101
  if (!charsCount) {
104
102
  charsCount = 17;
105
103
  }
106
104
  return randomString(charsCount, chars);
107
105
  }
108
- __name(generateId, "generateId");
109
106
 
110
107
  // src/createMap.ts
111
108
  function createMap(array, key = "_id") {
@@ -115,7 +112,6 @@ function createMap(array, key = "_id") {
115
112
  }
116
113
  return map;
117
114
  }
118
- __name(createMap, "createMap");
119
115
 
120
116
  // src/createMapArray.ts
121
117
  function createMapArray(array, key = "_id") {
@@ -126,49 +122,46 @@ function createMapArray(array, key = "_id") {
126
122
  }
127
123
  return map;
128
124
  }
129
- __name(createMapArray, "createMapArray");
130
125
 
131
126
  // src/Errors/OrionError.ts
132
- var _OrionError = class _OrionError extends Error {
127
+ var OrionError = class extends Error {
133
128
  isOrionError = true;
134
129
  isUserError;
135
130
  isPermissionsError;
136
131
  code;
137
132
  extra;
138
133
  /**
139
- * Returns a standardized representation of the error information.
140
- * @returns An object containing error details in a consistent format
141
- */
134
+ * Returns a standardized representation of the error information.
135
+ * @returns An object containing error details in a consistent format
136
+ */
142
137
  getInfo;
143
138
  };
144
- __name(_OrionError, "OrionError");
145
- var OrionError = _OrionError;
146
139
 
147
140
  // src/Errors/PermissionsError.ts
148
- var _PermissionsError = class _PermissionsError extends OrionError {
141
+ var PermissionsError = class extends OrionError {
149
142
  /**
150
- * Creates a new PermissionsError instance.
151
- *
152
- * @param permissionErrorType - Identifies the specific permission that was violated
153
- * (e.g., 'read', 'write', 'admin')
154
- * @param extra - Additional error context or metadata. Can include a custom message
155
- * via the message property.
156
- *
157
- * @example
158
- * // Basic usage
159
- * throw new PermissionsError('delete_document')
160
- *
161
- * @example
162
- * // With custom message
163
- * throw new PermissionsError('access_admin', { message: 'Admin access required' })
164
- *
165
- * @example
166
- * // With additional context
167
- * throw new PermissionsError('edit_user', {
168
- * userId: 'user123',
169
- * requiredRole: 'admin'
170
- * })
171
- */
143
+ * Creates a new PermissionsError instance.
144
+ *
145
+ * @param permissionErrorType - Identifies the specific permission that was violated
146
+ * (e.g., 'read', 'write', 'admin')
147
+ * @param extra - Additional error context or metadata. Can include a custom message
148
+ * via the message property.
149
+ *
150
+ * @example
151
+ * // Basic usage
152
+ * throw new PermissionsError('delete_document')
153
+ *
154
+ * @example
155
+ * // With custom message
156
+ * throw new PermissionsError('access_admin', { message: 'Admin access required' })
157
+ *
158
+ * @example
159
+ * // With additional context
160
+ * throw new PermissionsError('edit_user', {
161
+ * userId: 'user123',
162
+ * requiredRole: 'admin'
163
+ * })
164
+ */
172
165
  constructor(permissionErrorType, extra = {}) {
173
166
  const message = extra.message || `Client is not allowed to perform this action [${permissionErrorType}]`;
174
167
  super(message);
@@ -187,31 +180,29 @@ var _PermissionsError = class _PermissionsError extends OrionError {
187
180
  };
188
181
  }
189
182
  };
190
- __name(_PermissionsError, "PermissionsError");
191
- var PermissionsError = _PermissionsError;
192
183
 
193
184
  // src/Errors/UserError.ts
194
- var _UserError = class _UserError extends OrionError {
185
+ var UserError = class extends OrionError {
195
186
  /**
196
- * Creates a new UserError instance.
197
- *
198
- * @param code - Error code identifier. If only one parameter is provided,
199
- * this will be used as the message and code will default to 'error'.
200
- * @param message - Human-readable error message. Optional if code is provided.
201
- * @param extra - Additional error context or metadata.
202
- *
203
- * @example
204
- * // Basic usage
205
- * throw new UserError('invalid_input', 'The provided email is invalid')
206
- *
207
- * @example
208
- * // Using only a message (code will be 'error')
209
- * throw new UserError('Input validation failed')
210
- *
211
- * @example
212
- * // With extra metadata
213
- * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })
214
- */
187
+ * Creates a new UserError instance.
188
+ *
189
+ * @param code - Error code identifier. If only one parameter is provided,
190
+ * this will be used as the message and code will default to 'error'.
191
+ * @param message - Human-readable error message. Optional if code is provided.
192
+ * @param extra - Additional error context or metadata.
193
+ *
194
+ * @example
195
+ * // Basic usage
196
+ * throw new UserError('invalid_input', 'The provided email is invalid')
197
+ *
198
+ * @example
199
+ * // Using only a message (code will be 'error')
200
+ * throw new UserError('Input validation failed')
201
+ *
202
+ * @example
203
+ * // With extra metadata
204
+ * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })
205
+ */
215
206
  constructor(code, message, extra) {
216
207
  if (!message && code) {
217
208
  message = code;
@@ -232,22 +223,21 @@ var _UserError = class _UserError extends OrionError {
232
223
  };
233
224
  }
234
225
  };
235
- __name(_UserError, "UserError");
236
- var UserError = _UserError;
237
226
 
238
227
  // src/Errors/index.ts
239
228
  function isOrionError(error) {
240
229
  return Boolean(error && typeof error === "object" && error.isOrionError === true);
241
230
  }
242
- __name(isOrionError, "isOrionError");
243
231
  function isUserError(error) {
244
- return Boolean(error && typeof error === "object" && error.isOrionError === true && error.isUserError === true);
232
+ return Boolean(
233
+ error && typeof error === "object" && error.isOrionError === true && error.isUserError === true
234
+ );
245
235
  }
246
- __name(isUserError, "isUserError");
247
236
  function isPermissionsError(error) {
248
- return Boolean(error && typeof error === "object" && error.isOrionError === true && error.isPermissionsError === true);
237
+ return Boolean(
238
+ error && typeof error === "object" && error.isOrionError === true && error.isPermissionsError === true
239
+ );
249
240
  }
250
- __name(isPermissionsError, "isPermissionsError");
251
241
 
252
242
  // src/composeMiddlewares.ts
253
243
  function composeMiddlewares(middleware) {
@@ -270,15 +260,13 @@ function composeMiddlewares(middleware) {
270
260
  return Promise.reject(err);
271
261
  }
272
262
  }
273
- __name(dispatch, "dispatch");
274
263
  };
275
264
  }
276
- __name(composeMiddlewares, "composeMiddlewares");
277
265
 
278
266
  // src/retries.ts
279
267
  function executeWithRetries(fn, retries, timeout) {
280
268
  return new Promise((resolve, reject) => {
281
- const retry = /* @__PURE__ */ __name(async (retries2) => {
269
+ const retry = async (retries2) => {
282
270
  try {
283
271
  const result = await fn();
284
272
  resolve(result);
@@ -289,11 +277,10 @@ function executeWithRetries(fn, retries, timeout) {
289
277
  reject(error);
290
278
  }
291
279
  }
292
- }, "retry");
280
+ };
293
281
  retry(retries);
294
282
  });
295
283
  }
296
- __name(executeWithRetries, "executeWithRetries");
297
284
 
298
285
  // ../../node_modules/uuid/dist/esm-node/rng.js
299
286
  var import_crypto2 = __toESM(require("crypto"));
@@ -306,7 +293,6 @@ function rng() {
306
293
  }
307
294
  return rnds8Pool.slice(poolPtr, poolPtr += 16);
308
295
  }
309
- __name(rng, "rng");
310
296
 
311
297
  // ../../node_modules/uuid/dist/esm-node/regex.js
312
298
  var regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
@@ -315,7 +301,6 @@ var regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]
315
301
  function validate(uuid) {
316
302
  return typeof uuid === "string" && regex_default.test(uuid);
317
303
  }
318
- __name(validate, "validate");
319
304
  var validate_default = validate;
320
305
 
321
306
  // ../../node_modules/uuid/dist/esm-node/stringify.js
@@ -330,7 +315,6 @@ function stringify(arr, offset = 0) {
330
315
  }
331
316
  return uuid;
332
317
  }
333
- __name(stringify, "stringify");
334
318
  var stringify_default = stringify;
335
319
 
336
320
  // ../../node_modules/uuid/dist/esm-node/v4.js
@@ -348,56 +332,45 @@ function v4(options, buf, offset) {
348
332
  }
349
333
  return stringify_default(rnds);
350
334
  }
351
- __name(v4, "v4");
352
335
  var v4_default = v4;
353
336
 
354
337
  // src/generateUUID.ts
355
338
  function generateUUID() {
356
339
  return v4_default();
357
340
  }
358
- __name(generateUUID, "generateUUID");
359
341
  function generateUUIDWithPrefix(prefix) {
360
342
  return `${prefix}-${generateUUID()}`;
361
343
  }
362
- __name(generateUUIDWithPrefix, "generateUUIDWithPrefix");
363
344
 
364
345
  // src/normalize.ts
365
346
  function removeAccentsOnly(text) {
366
347
  if (!text) return "";
367
348
  return text.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
368
349
  }
369
- __name(removeAccentsOnly, "removeAccentsOnly");
370
350
  function removeAccentsAndTrim(text) {
371
351
  if (!text) return "";
372
352
  return removeAccentsOnly(text).trim();
373
353
  }
374
- __name(removeAccentsAndTrim, "removeAccentsAndTrim");
375
354
  function normalizeForSearch(text) {
376
355
  if (!text) return "";
377
356
  return removeAccentsAndTrim(text).toLowerCase();
378
357
  }
379
- __name(normalizeForSearch, "normalizeForSearch");
380
358
  function normalizeForCompactSearch(text) {
381
359
  if (!text) return "";
382
360
  return normalizeForSearch(text).replace(/\s/g, "");
383
361
  }
384
- __name(normalizeForCompactSearch, "normalizeForCompactSearch");
385
362
  function normalizeForSearchToken(text) {
386
363
  if (!text) return "";
387
364
  return normalizeForSearch(text).replace(/[^0-9a-z]/gi, " ");
388
365
  }
389
- __name(normalizeForSearchToken, "normalizeForSearchToken");
390
366
  function normalizeForFileKey(text) {
391
367
  if (!text) return "";
392
368
  return removeAccentsOnly(text).replace(/[^a-zA-Z0-9-._]/g, "-").replace(/-+/g, "-").trim().replace(/^-+|-+$/g, "");
393
369
  }
394
- __name(normalizeForFileKey, "normalizeForFileKey");
395
370
 
396
371
  // src/searchTokens.ts
397
372
  function getSearchTokens(text, meta) {
398
- const stringArray = Array.isArray(text) ? text : [
399
- text
400
- ];
373
+ const stringArray = Array.isArray(text) ? text : [text];
401
374
  const tokens = stringArray.filter(Boolean).map((text2) => String(text2)).flatMap((word) => {
402
375
  return normalizeForSearchToken(word).split(" ").filter(Boolean);
403
376
  });
@@ -408,7 +381,6 @@ function getSearchTokens(text, meta) {
408
381
  }
409
382
  return tokens;
410
383
  }
411
- __name(getSearchTokens, "getSearchTokens");
412
384
  function getSearchQueryForTokens(params = {}, _options = {}) {
413
385
  const searchTokens = [];
414
386
  if (params.filter) {
@@ -420,21 +392,16 @@ function getSearchQueryForTokens(params = {}, _options = {}) {
420
392
  if (!params[key]) continue;
421
393
  searchTokens.push(`_${key}:${params[key]}`);
422
394
  }
423
- return {
424
- $all: searchTokens
425
- };
395
+ return { $all: searchTokens };
426
396
  }
427
- __name(getSearchQueryForTokens, "getSearchQueryForTokens");
428
397
 
429
398
  // src/shortenMongoId.ts
430
399
  function lastOfString(string, last) {
431
400
  return string.substring(string.length - last, string.length);
432
401
  }
433
- __name(lastOfString, "lastOfString");
434
402
  function shortenMongoId(string) {
435
403
  return lastOfString(string, 5).toUpperCase();
436
404
  }
437
- __name(shortenMongoId, "shortenMongoId");
438
405
  // Annotate the CommonJS export names for ESM import in node:
439
406
  0 && (module.exports = {
440
407
  OrionError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/sleep.ts","../src/hashObject.ts","../src/generateId.ts","../src/createMap.ts","../src/createMapArray.ts","../src/Errors/OrionError.ts","../src/Errors/PermissionsError.ts","../src/Errors/UserError.ts","../src/Errors/index.ts","../src/composeMiddlewares.ts","../src/retries.ts","../../../node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/uuid/dist/esm-node/regex.js","../../../node_modules/uuid/dist/esm-node/validate.js","../../../node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/uuid/dist/esm-node/v4.js","../src/generateUUID.ts","../src/normalize.ts","../src/searchTokens.ts","../src/shortenMongoId.ts"],"sourcesContent":["import sleep from './sleep'\nimport hashObject from './hashObject'\nimport generateId from './generateId'\nimport createMap from './createMap'\nimport createMapArray from './createMapArray'\n\n// Import all error-related exports from the Errors module\nimport {\n OrionError,\n PermissionsError,\n UserError,\n isOrionError,\n isUserError,\n isPermissionsError\n} from './Errors'\nimport type {OrionErrorInformation} from './Errors'\n\nexport * from './composeMiddlewares'\nexport * from './retries'\nexport * from './generateUUID'\nexport * from './normalize'\nexport * from './searchTokens'\nexport * from './shortenMongoId'\nexport {\n // Utility functions\n createMap,\n createMapArray,\n generateId,\n hashObject,\n sleep,\n\n // Error classes\n OrionError,\n PermissionsError,\n UserError,\n\n // Error type guards\n isOrionError,\n isUserError,\n isPermissionsError\n}\n\nexport type {OrionErrorInformation}\n","/**\n * Creates a timeout with a promise\n */\nexport default (time: number): Promise<void> => {\n return new Promise(resolve => setTimeout(resolve, time))\n}\n","import hash from 'object-hash'\n\nexport default function (object: any): string {\n return hash(object)\n}\n","import crypto from 'crypto'\n\nconst UNMISTAKABLE_CHARS = '23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghjkmnopqrstuvwxyz'\n\nconst hexString = function (digits) {\n var numBytes = Math.ceil(digits / 2)\n var bytes\n // Try to get cryptographically strong randomness. Fall back to\n // non-cryptographically strong if not available.\n try {\n bytes = crypto.randomBytes(numBytes)\n } catch (e) {\n // XXX should re-throw any error except insufficient entropy\n bytes = crypto.pseudoRandomBytes(numBytes)\n }\n var result = bytes.toString('hex')\n // If the number of digits is odd, we'll have generated an extra 4 bits\n // of randomness, so we need to trim the last digit.\n return result.substring(0, digits)\n}\n\nconst fraction = function () {\n var numerator = parseInt(hexString(8), 16)\n return numerator * 2.3283064365386963e-10 // 2^-32\n}\n\nconst choice = function (arrayOrString) {\n var index = Math.floor(fraction() * arrayOrString.length)\n if (typeof arrayOrString === 'string') return arrayOrString.substr(index, 1)\n else return arrayOrString[index]\n}\n\nconst randomString = function (charsCount, alphabet) {\n var digits = []\n for (var i = 0; i < charsCount; i++) {\n digits[i] = choice(alphabet)\n }\n return digits.join('')\n}\n\n/**\n * Returns a random ID\n * @param charsCount length of the ID\n * @param chars characters used to generate the ID\n */\nexport default function generateId(\n charsCount?: number,\n chars: string = UNMISTAKABLE_CHARS\n): string {\n if (!charsCount) {\n charsCount = 17\n }\n\n return randomString(charsCount, chars)\n}\n","/**\n * Creates a map (object) from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each item in the array becomes a value in the map, indexed by the specified property.\n * If multiple items have the same key value, only the last one will be preserved.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are the original items\n * \n * @example\n * // Returns { '1': { id: 1, name: 'Item 1' }, '2': { id: 2, name: 'Item 2' } }\n * createMap([{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }], 'id')\n */\nexport default function createMap<T>(array: Array<T>, key: string = '_id'): Record<string, T> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = item\n }\n\n return map\n}\n","/**\n * Creates a grouped map from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each value is an array of items sharing the same key value. Unlike createMap,\n * this function preserves all items with the same key by grouping them in arrays.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a grouped map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are arrays of items\n * \n * @example\n * // Returns { 'category1': [{ id: 1, category: 'category1' }, { id: 3, category: 'category1' }], \n * // 'category2': [{ id: 2, category: 'category2' }] }\n * createMapArray([\n * { id: 1, category: 'category1' }, \n * { id: 2, category: 'category2' }, \n * { id: 3, category: 'category1' }\n * ], 'category')\n */\nexport default function createMapArray<T>(\n array: Array<T>,\n key: string = '_id'\n): Record<string, Array<T>> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = map[item[key]] || []\n map[item[key]].push(item)\n }\n\n return map\n}\n","/**\n * Interface representing the standardized error information structure for Orion errors.\n * This is used by the getInfo method to provide consistent error reporting.\n */\nexport interface OrionErrorInformation {\n /** The error code or identifier */\n error: string\n /** Human-readable error message */\n message: string\n /** Additional error metadata or context */\n extra: any\n /** The sub-type of error. For example for permissions errors it could be 'read', 'write', 'admin' */\n type?: string\n}\n\n/**\n * Base error class for all Orion-specific errors.\n * \n * This abstract class provides common properties and methods for all error types\n * used in the Orion framework. It's extended by more specific error classes\n * like UserError and PermissionsError.\n * \n * @property isOrionError - Flag indicating this is an Orion error (always true)\n * @property isUserError - Flag indicating if this is a user-facing error\n * @property isPermissionsError - Flag indicating if this is a permissions-related error\n * @property code - Error code for identifying the error type\n * @property extra - Additional error context or metadata\n */\nexport class OrionError extends Error {\n isOrionError = true\n\n isUserError: boolean\n isPermissionsError: boolean\n code: string\n extra: any\n\n /**\n * Returns a standardized representation of the error information.\n * @returns An object containing error details in a consistent format\n */\n getInfo: () => OrionErrorInformation\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for permission-related errors in the Orion framework.\n * \n * PermissionsError represents authorization failures where a user or client \n * attempts to perform an action they don't have permission to execute.\n * This is used to distinguish security/permissions errors from other types\n * of errors for proper error handling and user feedback.\n * \n * @extends OrionError\n */\nexport default class PermissionsError extends OrionError {\n /**\n * Creates a new PermissionsError instance.\n * \n * @param permissionErrorType - Identifies the specific permission that was violated\n * (e.g., 'read', 'write', 'admin')\n * @param extra - Additional error context or metadata. Can include a custom message\n * via the message property.\n * \n * @example\n * // Basic usage\n * throw new PermissionsError('delete_document')\n * \n * @example\n * // With custom message\n * throw new PermissionsError('access_admin', { message: 'Admin access required' })\n * \n * @example\n * // With additional context\n * throw new PermissionsError('edit_user', { \n * userId: 'user123',\n * requiredRole: 'admin'\n * })\n */\n constructor(permissionErrorType, extra: any = {}) {\n // Calling parent constructor of base Error class.\n const message =\n extra.message || `Client is not allowed to perform this action [${permissionErrorType}]`\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isPermissionsError = true\n this.code = 'PermissionsError'\n this.extra = extra\n\n this.getInfo = () => {\n return {\n ...extra,\n error: 'PermissionsError',\n message,\n type: permissionErrorType\n }\n }\n }\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for user-facing errors in the Orion framework.\n * \n * UserError is designed to represent errors that should be displayed to end users,\n * as opposed to system errors or unexpected failures. These errors typically represent\n * validation issues, business rule violations, or other expected error conditions.\n * \n * @extends OrionError\n */\nexport default class UserError extends OrionError {\n /**\n * Creates a new UserError instance.\n * \n * @param code - Error code identifier. If only one parameter is provided,\n * this will be used as the message and code will default to 'error'.\n * @param message - Human-readable error message. Optional if code is provided.\n * @param extra - Additional error context or metadata.\n * \n * @example\n * // Basic usage\n * throw new UserError('invalid_input', 'The provided email is invalid')\n * \n * @example\n * // Using only a message (code will be 'error')\n * throw new UserError('Input validation failed')\n * \n * @example\n * // With extra metadata\n * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })\n */\n constructor(code: string, message?: string, extra?: any) {\n if (!message && code) {\n message = code\n code = 'error'\n }\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isUserError = true\n this.code = code\n this.extra = extra\n\n this.getInfo = () => {\n return {\n error: code,\n message,\n extra\n }\n }\n }\n}\n","/**\n * @file Exports all error classes used in the Orion framework\n */\n\nimport {OrionError} from './OrionError'\nimport type {OrionErrorInformation} from './OrionError'\nimport PermissionsError from './PermissionsError'\nimport UserError from './UserError'\n\n/**\n * Re-export all error types for convenient importing\n */\nexport {OrionError, PermissionsError, UserError}\nexport type {OrionErrorInformation}\n\n/**\n * Type guard to check if an error is an OrionError\n *\n * @param error - Any error object to test\n * @returns True if the error is an OrionError instance\n *\n * @example\n * try {\n * // some code that might throw\n * } catch (error) {\n * if (isOrionError(error)) {\n * // Handle Orion-specific error\n * console.log(error.code, error.getInfo())\n * } else {\n * // Handle general error\n * }\n * }\n */\nexport function isOrionError(error: any): error is OrionError {\n return Boolean(error && typeof error === 'object' && error.isOrionError === true)\n}\n\n/**\n * Type guard to check if an error is a UserError\n *\n * @param error - Any error object to test\n * @returns True if the error is a UserError instance\n */\nexport function isUserError(error: any): error is UserError {\n return Boolean(\n error && typeof error === 'object' && error.isOrionError === true && error.isUserError === true,\n )\n}\n\n/**\n * Type guard to check if an error is a PermissionsError\n *\n * @param error - Any error object to test\n * @returns True if the error is a PermissionsError instance\n */\nexport function isPermissionsError(error: any): error is PermissionsError {\n return Boolean(\n error &&\n typeof error === 'object' &&\n error.isOrionError === true &&\n error.isPermissionsError === true,\n )\n}\n","// from https://github.com/koajs/compose/blob/master/index.js\n\n/**\n * Compose `middleware` returning\n * a fully valid middleware comprised\n * of all those which are passed.\n */\nexport function composeMiddlewares(middleware) {\n if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')\n for (const fn of middleware) {\n if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')\n }\n\n /**\n * @param {Object} context\n * @return {Promise}\n * @api public\n */\n\n return function (context, next?) {\n // last called middleware #\n let index = -1\n return dispatch(0)\n function dispatch(i) {\n if (i <= index) return Promise.reject(new Error('next() called multiple times'))\n index = i\n let fn = middleware[i]\n if (i === middleware.length) fn = next\n if (!fn) return Promise.resolve()\n try {\n return Promise.resolve(fn(context, dispatch.bind(null, i + 1)))\n } catch (err) {\n return Promise.reject(err)\n }\n }\n }\n}\n","/**\n * Executes an asynchronous function with automatic retries on failure.\n * \n * This utility attempts to execute the provided function and automatically\n * retries if it fails, with a specified delay between attempts. It will\n * continue retrying until either the function succeeds or the maximum\n * number of retries is reached.\n * \n * @template TFunc Type of the function to execute (must return a Promise)\n * @param fn - The asynchronous function to execute\n * @param retries - The maximum number of retry attempts after the initial attempt\n * @param timeout - The delay in milliseconds between retry attempts\n * @returns A promise that resolves with the result of the function or rejects with the last error\n * \n * @example\n * // Retry an API call up to 3 times with 1 second between attempts\n * const result = await executeWithRetries(\n * () => fetchDataFromApi(),\n * 3,\n * 1000\n * );\n */\nexport function executeWithRetries<TFunc extends () => Promise<any>>(\n fn: TFunc,\n retries: number,\n timeout: number\n): Promise<ReturnType<TFunc>> {\n return new Promise((resolve, reject) => {\n const retry = async (retries: number) => {\n try {\n const result = await fn()\n resolve(result)\n } catch (error) {\n if (retries > 0) {\n setTimeout(() => retry(retries - 1), timeout)\n } else {\n reject(error)\n }\n }\n }\n retry(retries)\n })\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\n\nexport function generateUUID() {\n return uuidv4()\n}\n\nexport function generateUUIDWithPrefix(prefix: string) {\n return `${prefix}-${generateUUID()}`\n}\n","/**\n * Removes diacritical marks (accents) from text without any other modifications.\n * This is the most basic normalization function that others build upon.\n * \n * @param text - The input string to process\n * @returns String with accents removed but otherwise unchanged\n */\nexport function removeAccentsOnly(text: string) {\n if (!text) return ''\n // biome-ignore lint/suspicious/noMisleadingCharacterClass: Removes diacritical marks (accents)\n return text.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n}\n\n/**\n * Normalizes text by removing diacritical marks (accents) and trimming whitespace.\n * Builds on removeAccentsOnly and adds whitespace trimming.\n * \n * @param text - The input string to normalize\n * @returns Normalized string with accents removed and whitespace trimmed\n */\nexport function removeAccentsAndTrim(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text).trim()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * \n * Builds on removeAccentsAndTrim and adds lowercase conversion.\n * Useful for case-insensitive and accent-insensitive text searching.\n * \n * @param text - The input string to normalize for search\n * @returns Search-optimized string in lowercase with accents removed\n */\nexport function normalizeForSearch(text: string) {\n if (!text) return ''\n return removeAccentsAndTrim(text).toLowerCase()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Removing all spaces\n * \n * Builds on normalizeForSearch and removes all whitespace.\n * Useful for compact search indexes or when spaces should be ignored in searches.\n * \n * @param text - The input string to normalize for compact search\n * @returns Compact search-optimized string with no spaces\n */\nexport function normalizeForCompactSearch(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/\\s/g, '')\n}\n\n/**\n * Normalizes text for search token processing by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Replacing all non-alphanumeric characters with spaces\n * \n * Builds on normalizeForSearch and replaces non-alphanumeric characters with spaces.\n * Useful for tokenizing search terms where special characters should be treated as word separators.\n * \n * @param text - The input string to normalize for tokenized search\n * @returns Search token string with only alphanumeric characters and spaces\n */\nexport function normalizeForSearchToken(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/[^0-9a-z]/gi, ' ')\n}\n\n/**\n * Normalizes a string specifically for use as a file key (e.g., in S3 or other storage systems).\n * Performs the following transformations:\n * - Removes accents/diacritical marks\n * - Replaces special characters with hyphens\n * - Ensures only alphanumeric characters, hyphens, periods, and underscores remain\n * - Replaces multiple consecutive hyphens with a single hyphen\n * - Removes leading/trailing hyphens\n * \n * @param text - The input string to normalize for file key usage\n * @returns A storage-safe string suitable for use as a file key\n */\nexport function normalizeForFileKey(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text)\n // Replace spaces and unwanted characters with hyphens\n .replace(/[^a-zA-Z0-9-._]/g, '-')\n // Replace multiple consecutive hyphens with single hyphen\n .replace(/-+/g, '-')\n // Remove leading/trailing hyphens\n .trim()\n .replace(/^-+|-+$/g, '')\n}\n","import { normalizeForSearchToken } from './normalize'\n\n/**\n * Generates an array of search tokens from input text and optional metadata.\n * \n * This function processes text by:\n * 1. Converting it to an array of strings (if not already)\n * 2. Filtering out falsy values\n * 3. Normalizing each string (removing accents, special characters)\n * 4. Splitting by spaces to create individual tokens\n * 5. Optionally adding metadata tokens in the format \"_key:value\"\n * \n * @param text - String or array of strings to tokenize\n * @param meta - Optional metadata object where each key-value pair becomes a token\n * @returns Array of normalized search tokens\n * \n * @example\n * // Returns ['hello', 'world']\n * getSearchTokens('Hello, World!') \n * \n * @example\n * // Returns ['hello', 'world', '_id:123']\n * getSearchTokens('Hello, World!', { id: '123' })\n */\nexport function getSearchTokens(text: string[] | string, meta?: Record<string, string>) {\n const stringArray = Array.isArray(text) ? text : [text]\n const tokens = stringArray\n .filter(Boolean)\n .map(text => String(text))\n .flatMap(word => {\n return normalizeForSearchToken(word).split(' ').filter(Boolean)\n })\n\n if (meta) {\n for (const key in meta) {\n tokens.push(`_${key}:${meta[key]}`)\n }\n }\n\n return tokens\n}\n\n/**\n * Interface for parameters used in generating search queries from tokens.\n * \n * @property filter - Optional string to filter search results\n * @property [key: string] - Additional key-value pairs for metadata filtering\n */\nexport interface SearchQueryForTokensParams {\n filter?: string\n [key: string]: string\n}\n\n/**\n * Options for customizing the search query generation behavior.\n * Currently empty but provided for future extensibility.\n */\nexport type SearchQueryForTokensOptions = {}\n\n/**\n * Generates a MongoDB-compatible query object based on the provided parameters.\n * \n * This function:\n * 1. Processes any filter text into RegExp tokens for prefix matching\n * 2. Adds metadata filters based on additional properties in the params object\n * 3. Returns a query object with the $all operator for MongoDB queries\n * \n * @param params - Parameters for generating the search query\n * @param _options - Options for customizing search behavior (reserved for future use)\n * @returns A MongoDB-compatible query object with format { $all: [...tokens] }\n * \n * @example\n * // Returns { $all: [/^hello/, /^world/] }\n * getSearchQueryForTokens({ filter: 'Hello World' })\n * \n * @example\n * // Returns { $all: [/^search/, '_category:books'] }\n * getSearchQueryForTokens({ filter: 'search', category: 'books' })\n */\nexport function getSearchQueryForTokens(\n params: SearchQueryForTokensParams = {},\n _options: SearchQueryForTokensOptions = {},\n) {\n const searchTokens: (string | RegExp)[] = []\n\n if (params.filter) {\n const filterTokens = getSearchTokens(params.filter).map(token => new RegExp(`^${token}`))\n searchTokens.push(...filterTokens)\n }\n\n for (const key in params) {\n if (key === 'filter') continue\n if (!params[key]) continue\n searchTokens.push(`_${key}:${params[key]}`)\n }\n\n return { $all: searchTokens }\n}\n","function lastOfString(string: string, last: number) {\n return string.substring(string.length - last, string.length)\n}\n\nexport function shortenMongoId(string: string) {\n return lastOfString(string, 5).toUpperCase()\n}\n"],"mappings":"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","names":["time","Promise","resolve","setTimeout","object","hash","UNMISTAKABLE_CHARS","hexString","digits","numBytes","Math","ceil","bytes","crypto","randomBytes","e","pseudoRandomBytes","result","toString","substring","fraction","numerator","parseInt","choice","arrayOrString","index","floor","length","substr","randomString","charsCount","alphabet","i","join","chars","generateId","array","key","map","item","createMap","array","key","map","item","push","createMapArray","OrionError","Error","isOrionError","isUserError","isPermissionsError","code","extra","getInfo","PermissionsError","OrionError","constructor","permissionErrorType","extra","message","Error","captureStackTrace","isOrionError","isPermissionsError","code","getInfo","error","type","UserError","OrionError","constructor","code","message","extra","Error","captureStackTrace","isOrionError","isUserError","getInfo","error","isOrionError","error","Boolean","isUserError","isPermissionsError","composeMiddlewares","middleware","Array","isArray","TypeError","fn","context","next","index","dispatch","i","Promise","reject","Error","length","resolve","bind","err","executeWithRetries","fn","retries","timeout","Promise","resolve","reject","retry","result","error","setTimeout","import_crypto","rnds8Pool","Uint8Array","poolPtr","length","rng","crypto","randomFillSync","slice","validate","uuid","REGEX","test","byteToHex","i","push","toString","substr","stringify","arr","offset","uuid","toLowerCase","validate","TypeError","v4","options","buf","offset","rnds","random","rng","i","stringify","generateUUID","uuidv4","generateUUIDWithPrefix","prefix","removeAccentsOnly","text","normalize","replace","removeAccentsAndTrim","trim","normalizeForSearch","toLowerCase","normalizeForCompactSearch","normalizeForSearchToken","normalizeForFileKey","getSearchTokens","text","meta","stringArray","Array","isArray","tokens","filter","Boolean","map","String","flatMap","word","normalizeForSearchToken","split","key","push","getSearchQueryForTokens","params","_options","searchTokens","filterTokens","token","RegExp","$all","lastOfString","string","last","substring","length","shortenMongoId","toUpperCase"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/sleep.ts","../src/hashObject.ts","../src/generateId.ts","../src/createMap.ts","../src/createMapArray.ts","../src/Errors/OrionError.ts","../src/Errors/PermissionsError.ts","../src/Errors/UserError.ts","../src/Errors/index.ts","../src/composeMiddlewares.ts","../src/retries.ts","../../../node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/uuid/dist/esm-node/regex.js","../../../node_modules/uuid/dist/esm-node/validate.js","../../../node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/uuid/dist/esm-node/v4.js","../src/generateUUID.ts","../src/normalize.ts","../src/searchTokens.ts","../src/shortenMongoId.ts"],"sourcesContent":["import sleep from './sleep'\nimport hashObject from './hashObject'\nimport generateId from './generateId'\nimport createMap from './createMap'\nimport createMapArray from './createMapArray'\n\n// Import all error-related exports from the Errors module\nimport {\n OrionError,\n PermissionsError,\n UserError,\n isOrionError,\n isUserError,\n isPermissionsError\n} from './Errors'\nimport type {OrionErrorInformation} from './Errors'\n\nexport * from './composeMiddlewares'\nexport * from './retries'\nexport * from './generateUUID'\nexport * from './normalize'\nexport * from './searchTokens'\nexport * from './shortenMongoId'\nexport {\n // Utility functions\n createMap,\n createMapArray,\n generateId,\n hashObject,\n sleep,\n\n // Error classes\n OrionError,\n PermissionsError,\n UserError,\n\n // Error type guards\n isOrionError,\n isUserError,\n isPermissionsError\n}\n\nexport type {OrionErrorInformation}\n","/**\n * Creates a timeout with a promise\n */\nexport default (time: number): Promise<void> => {\n return new Promise(resolve => setTimeout(resolve, time))\n}\n","import hash from 'object-hash'\n\nexport default function (object: any): string {\n return hash(object)\n}\n","import crypto from 'crypto'\n\nconst UNMISTAKABLE_CHARS = '23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghjkmnopqrstuvwxyz'\n\nconst hexString = function (digits) {\n var numBytes = Math.ceil(digits / 2)\n var bytes\n // Try to get cryptographically strong randomness. Fall back to\n // non-cryptographically strong if not available.\n try {\n bytes = crypto.randomBytes(numBytes)\n } catch (e) {\n // XXX should re-throw any error except insufficient entropy\n bytes = crypto.pseudoRandomBytes(numBytes)\n }\n var result = bytes.toString('hex')\n // If the number of digits is odd, we'll have generated an extra 4 bits\n // of randomness, so we need to trim the last digit.\n return result.substring(0, digits)\n}\n\nconst fraction = function () {\n var numerator = parseInt(hexString(8), 16)\n return numerator * 2.3283064365386963e-10 // 2^-32\n}\n\nconst choice = function (arrayOrString) {\n var index = Math.floor(fraction() * arrayOrString.length)\n if (typeof arrayOrString === 'string') return arrayOrString.substr(index, 1)\n else return arrayOrString[index]\n}\n\nconst randomString = function (charsCount, alphabet) {\n var digits = []\n for (var i = 0; i < charsCount; i++) {\n digits[i] = choice(alphabet)\n }\n return digits.join('')\n}\n\n/**\n * Returns a random ID\n * @param charsCount length of the ID\n * @param chars characters used to generate the ID\n */\nexport default function generateId(\n charsCount?: number,\n chars: string = UNMISTAKABLE_CHARS\n): string {\n if (!charsCount) {\n charsCount = 17\n }\n\n return randomString(charsCount, chars)\n}\n","/**\n * Creates a map (object) from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each item in the array becomes a value in the map, indexed by the specified property.\n * If multiple items have the same key value, only the last one will be preserved.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are the original items\n * \n * @example\n * // Returns { '1': { id: 1, name: 'Item 1' }, '2': { id: 2, name: 'Item 2' } }\n * createMap([{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }], 'id')\n */\nexport default function createMap<T>(array: Array<T>, key: string = '_id'): Record<string, T> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = item\n }\n\n return map\n}\n","/**\n * Creates a grouped map from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each value is an array of items sharing the same key value. Unlike createMap,\n * this function preserves all items with the same key by grouping them in arrays.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a grouped map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are arrays of items\n * \n * @example\n * // Returns { 'category1': [{ id: 1, category: 'category1' }, { id: 3, category: 'category1' }], \n * // 'category2': [{ id: 2, category: 'category2' }] }\n * createMapArray([\n * { id: 1, category: 'category1' }, \n * { id: 2, category: 'category2' }, \n * { id: 3, category: 'category1' }\n * ], 'category')\n */\nexport default function createMapArray<T>(\n array: Array<T>,\n key: string = '_id'\n): Record<string, Array<T>> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = map[item[key]] || []\n map[item[key]].push(item)\n }\n\n return map\n}\n","/**\n * Interface representing the standardized error information structure for Orion errors.\n * This is used by the getInfo method to provide consistent error reporting.\n */\nexport interface OrionErrorInformation {\n /** The error code or identifier */\n error: string\n /** Human-readable error message */\n message: string\n /** Additional error metadata or context */\n extra: any\n /** The sub-type of error. For example for permissions errors it could be 'read', 'write', 'admin' */\n type?: string\n}\n\n/**\n * Base error class for all Orion-specific errors.\n * \n * This abstract class provides common properties and methods for all error types\n * used in the Orion framework. It's extended by more specific error classes\n * like UserError and PermissionsError.\n * \n * @property isOrionError - Flag indicating this is an Orion error (always true)\n * @property isUserError - Flag indicating if this is a user-facing error\n * @property isPermissionsError - Flag indicating if this is a permissions-related error\n * @property code - Error code for identifying the error type\n * @property extra - Additional error context or metadata\n */\nexport class OrionError extends Error {\n isOrionError = true\n\n isUserError: boolean\n isPermissionsError: boolean\n code: string\n extra: any\n\n /**\n * Returns a standardized representation of the error information.\n * @returns An object containing error details in a consistent format\n */\n getInfo: () => OrionErrorInformation\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for permission-related errors in the Orion framework.\n * \n * PermissionsError represents authorization failures where a user or client \n * attempts to perform an action they don't have permission to execute.\n * This is used to distinguish security/permissions errors from other types\n * of errors for proper error handling and user feedback.\n * \n * @extends OrionError\n */\nexport default class PermissionsError extends OrionError {\n /**\n * Creates a new PermissionsError instance.\n * \n * @param permissionErrorType - Identifies the specific permission that was violated\n * (e.g., 'read', 'write', 'admin')\n * @param extra - Additional error context or metadata. Can include a custom message\n * via the message property.\n * \n * @example\n * // Basic usage\n * throw new PermissionsError('delete_document')\n * \n * @example\n * // With custom message\n * throw new PermissionsError('access_admin', { message: 'Admin access required' })\n * \n * @example\n * // With additional context\n * throw new PermissionsError('edit_user', { \n * userId: 'user123',\n * requiredRole: 'admin'\n * })\n */\n constructor(permissionErrorType, extra: any = {}) {\n // Calling parent constructor of base Error class.\n const message =\n extra.message || `Client is not allowed to perform this action [${permissionErrorType}]`\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isPermissionsError = true\n this.code = 'PermissionsError'\n this.extra = extra\n\n this.getInfo = () => {\n return {\n ...extra,\n error: 'PermissionsError',\n message,\n type: permissionErrorType\n }\n }\n }\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for user-facing errors in the Orion framework.\n * \n * UserError is designed to represent errors that should be displayed to end users,\n * as opposed to system errors or unexpected failures. These errors typically represent\n * validation issues, business rule violations, or other expected error conditions.\n * \n * @extends OrionError\n */\nexport default class UserError extends OrionError {\n /**\n * Creates a new UserError instance.\n * \n * @param code - Error code identifier. If only one parameter is provided,\n * this will be used as the message and code will default to 'error'.\n * @param message - Human-readable error message. Optional if code is provided.\n * @param extra - Additional error context or metadata.\n * \n * @example\n * // Basic usage\n * throw new UserError('invalid_input', 'The provided email is invalid')\n * \n * @example\n * // Using only a message (code will be 'error')\n * throw new UserError('Input validation failed')\n * \n * @example\n * // With extra metadata\n * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })\n */\n constructor(code: string, message?: string, extra?: any) {\n if (!message && code) {\n message = code\n code = 'error'\n }\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isUserError = true\n this.code = code\n this.extra = extra\n\n this.getInfo = () => {\n return {\n error: code,\n message,\n extra\n }\n }\n }\n}\n","/**\n * @file Exports all error classes used in the Orion framework\n */\n\nimport {OrionError} from './OrionError'\nimport type {OrionErrorInformation} from './OrionError'\nimport PermissionsError from './PermissionsError'\nimport UserError from './UserError'\n\n/**\n * Re-export all error types for convenient importing\n */\nexport {OrionError, PermissionsError, UserError}\nexport type {OrionErrorInformation}\n\n/**\n * Type guard to check if an error is an OrionError\n *\n * @param error - Any error object to test\n * @returns True if the error is an OrionError instance\n *\n * @example\n * try {\n * // some code that might throw\n * } catch (error) {\n * if (isOrionError(error)) {\n * // Handle Orion-specific error\n * console.log(error.code, error.getInfo())\n * } else {\n * // Handle general error\n * }\n * }\n */\nexport function isOrionError(error: any): error is OrionError {\n return Boolean(error && typeof error === 'object' && error.isOrionError === true)\n}\n\n/**\n * Type guard to check if an error is a UserError\n *\n * @param error - Any error object to test\n * @returns True if the error is a UserError instance\n */\nexport function isUserError(error: any): error is UserError {\n return Boolean(\n error && typeof error === 'object' && error.isOrionError === true && error.isUserError === true,\n )\n}\n\n/**\n * Type guard to check if an error is a PermissionsError\n *\n * @param error - Any error object to test\n * @returns True if the error is a PermissionsError instance\n */\nexport function isPermissionsError(error: any): error is PermissionsError {\n return Boolean(\n error &&\n typeof error === 'object' &&\n error.isOrionError === true &&\n error.isPermissionsError === true,\n )\n}\n","// from https://github.com/koajs/compose/blob/master/index.js\n\n/**\n * Compose `middleware` returning\n * a fully valid middleware comprised\n * of all those which are passed.\n */\nexport function composeMiddlewares(middleware) {\n if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')\n for (const fn of middleware) {\n if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')\n }\n\n /**\n * @param {Object} context\n * @return {Promise}\n * @api public\n */\n\n return function (context, next?) {\n // last called middleware #\n let index = -1\n return dispatch(0)\n function dispatch(i) {\n if (i <= index) return Promise.reject(new Error('next() called multiple times'))\n index = i\n let fn = middleware[i]\n if (i === middleware.length) fn = next\n if (!fn) return Promise.resolve()\n try {\n return Promise.resolve(fn(context, dispatch.bind(null, i + 1)))\n } catch (err) {\n return Promise.reject(err)\n }\n }\n }\n}\n","/**\n * Executes an asynchronous function with automatic retries on failure.\n * \n * This utility attempts to execute the provided function and automatically\n * retries if it fails, with a specified delay between attempts. It will\n * continue retrying until either the function succeeds or the maximum\n * number of retries is reached.\n * \n * @template TFunc Type of the function to execute (must return a Promise)\n * @param fn - The asynchronous function to execute\n * @param retries - The maximum number of retry attempts after the initial attempt\n * @param timeout - The delay in milliseconds between retry attempts\n * @returns A promise that resolves with the result of the function or rejects with the last error\n * \n * @example\n * // Retry an API call up to 3 times with 1 second between attempts\n * const result = await executeWithRetries(\n * () => fetchDataFromApi(),\n * 3,\n * 1000\n * );\n */\nexport function executeWithRetries<TFunc extends () => Promise<any>>(\n fn: TFunc,\n retries: number,\n timeout: number\n): Promise<ReturnType<TFunc>> {\n return new Promise((resolve, reject) => {\n const retry = async (retries: number) => {\n try {\n const result = await fn()\n resolve(result)\n } catch (error) {\n if (retries > 0) {\n setTimeout(() => retry(retries - 1), timeout)\n } else {\n reject(error)\n }\n }\n }\n retry(retries)\n })\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\n\nexport function generateUUID() {\n return uuidv4()\n}\n\nexport function generateUUIDWithPrefix(prefix: string) {\n return `${prefix}-${generateUUID()}`\n}\n","/**\n * Removes diacritical marks (accents) from text without any other modifications.\n * This is the most basic normalization function that others build upon.\n * \n * @param text - The input string to process\n * @returns String with accents removed but otherwise unchanged\n */\nexport function removeAccentsOnly(text: string) {\n if (!text) return ''\n // biome-ignore lint/suspicious/noMisleadingCharacterClass: Removes diacritical marks (accents)\n return text.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n}\n\n/**\n * Normalizes text by removing diacritical marks (accents) and trimming whitespace.\n * Builds on removeAccentsOnly and adds whitespace trimming.\n * \n * @param text - The input string to normalize\n * @returns Normalized string with accents removed and whitespace trimmed\n */\nexport function removeAccentsAndTrim(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text).trim()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * \n * Builds on removeAccentsAndTrim and adds lowercase conversion.\n * Useful for case-insensitive and accent-insensitive text searching.\n * \n * @param text - The input string to normalize for search\n * @returns Search-optimized string in lowercase with accents removed\n */\nexport function normalizeForSearch(text: string) {\n if (!text) return ''\n return removeAccentsAndTrim(text).toLowerCase()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Removing all spaces\n * \n * Builds on normalizeForSearch and removes all whitespace.\n * Useful for compact search indexes or when spaces should be ignored in searches.\n * \n * @param text - The input string to normalize for compact search\n * @returns Compact search-optimized string with no spaces\n */\nexport function normalizeForCompactSearch(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/\\s/g, '')\n}\n\n/**\n * Normalizes text for search token processing by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Replacing all non-alphanumeric characters with spaces\n * \n * Builds on normalizeForSearch and replaces non-alphanumeric characters with spaces.\n * Useful for tokenizing search terms where special characters should be treated as word separators.\n * \n * @param text - The input string to normalize for tokenized search\n * @returns Search token string with only alphanumeric characters and spaces\n */\nexport function normalizeForSearchToken(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/[^0-9a-z]/gi, ' ')\n}\n\n/**\n * Normalizes a string specifically for use as a file key (e.g., in S3 or other storage systems).\n * Performs the following transformations:\n * - Removes accents/diacritical marks\n * - Replaces special characters with hyphens\n * - Ensures only alphanumeric characters, hyphens, periods, and underscores remain\n * - Replaces multiple consecutive hyphens with a single hyphen\n * - Removes leading/trailing hyphens\n * \n * @param text - The input string to normalize for file key usage\n * @returns A storage-safe string suitable for use as a file key\n */\nexport function normalizeForFileKey(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text)\n // Replace spaces and unwanted characters with hyphens\n .replace(/[^a-zA-Z0-9-._]/g, '-')\n // Replace multiple consecutive hyphens with single hyphen\n .replace(/-+/g, '-')\n // Remove leading/trailing hyphens\n .trim()\n .replace(/^-+|-+$/g, '')\n}\n","import { normalizeForSearchToken } from './normalize'\n\n/**\n * Generates an array of search tokens from input text and optional metadata.\n * \n * This function processes text by:\n * 1. Converting it to an array of strings (if not already)\n * 2. Filtering out falsy values\n * 3. Normalizing each string (removing accents, special characters)\n * 4. Splitting by spaces to create individual tokens\n * 5. Optionally adding metadata tokens in the format \"_key:value\"\n * \n * @param text - String or array of strings to tokenize\n * @param meta - Optional metadata object where each key-value pair becomes a token\n * @returns Array of normalized search tokens\n * \n * @example\n * // Returns ['hello', 'world']\n * getSearchTokens('Hello, World!') \n * \n * @example\n * // Returns ['hello', 'world', '_id:123']\n * getSearchTokens('Hello, World!', { id: '123' })\n */\nexport function getSearchTokens(text: string[] | string, meta?: Record<string, string>) {\n const stringArray = Array.isArray(text) ? text : [text]\n const tokens = stringArray\n .filter(Boolean)\n .map(text => String(text))\n .flatMap(word => {\n return normalizeForSearchToken(word).split(' ').filter(Boolean)\n })\n\n if (meta) {\n for (const key in meta) {\n tokens.push(`_${key}:${meta[key]}`)\n }\n }\n\n return tokens\n}\n\n/**\n * Interface for parameters used in generating search queries from tokens.\n * \n * @property filter - Optional string to filter search results\n * @property [key: string] - Additional key-value pairs for metadata filtering\n */\nexport interface SearchQueryForTokensParams {\n filter?: string\n [key: string]: string\n}\n\n/**\n * Options for customizing the search query generation behavior.\n * Currently empty but provided for future extensibility.\n */\nexport type SearchQueryForTokensOptions = {}\n\n/**\n * Generates a MongoDB-compatible query object based on the provided parameters.\n * \n * This function:\n * 1. Processes any filter text into RegExp tokens for prefix matching\n * 2. Adds metadata filters based on additional properties in the params object\n * 3. Returns a query object with the $all operator for MongoDB queries\n * \n * @param params - Parameters for generating the search query\n * @param _options - Options for customizing search behavior (reserved for future use)\n * @returns A MongoDB-compatible query object with format { $all: [...tokens] }\n * \n * @example\n * // Returns { $all: [/^hello/, /^world/] }\n * getSearchQueryForTokens({ filter: 'Hello World' })\n * \n * @example\n * // Returns { $all: [/^search/, '_category:books'] }\n * getSearchQueryForTokens({ filter: 'search', category: 'books' })\n */\nexport function getSearchQueryForTokens(\n params: SearchQueryForTokensParams = {},\n _options: SearchQueryForTokensOptions = {},\n) {\n const searchTokens: (string | RegExp)[] = []\n\n if (params.filter) {\n const filterTokens = getSearchTokens(params.filter).map(token => new RegExp(`^${token}`))\n searchTokens.push(...filterTokens)\n }\n\n for (const key in params) {\n if (key === 'filter') continue\n if (!params[key]) continue\n searchTokens.push(`_${key}:${params[key]}`)\n }\n\n return { $all: searchTokens }\n}\n","function lastOfString(string: string, last: number) {\n return string.substring(string.length - last, string.length)\n}\n\nexport function shortenMongoId(string: string) {\n return lastOfString(string, 5).toUpperCase()\n}\n"],"mappings":"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","names":["hash","crypto","retries","import_crypto","crypto","text"]}
package/dist/index.js CHANGED
@@ -1,22 +1,18 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/sleep.ts
5
- var sleep_default = /* @__PURE__ */ __name((time) => {
2
+ var sleep_default = (time) => {
6
3
  return new Promise((resolve) => setTimeout(resolve, time));
7
- }, "default");
4
+ };
8
5
 
9
6
  // src/hashObject.ts
10
7
  import hash from "object-hash";
11
8
  function hashObject_default(object) {
12
9
  return hash(object);
13
10
  }
14
- __name(hashObject_default, "default");
15
11
 
16
12
  // src/generateId.ts
17
13
  import crypto from "crypto";
18
14
  var UNMISTAKABLE_CHARS = "23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghjkmnopqrstuvwxyz";
19
- var hexString = /* @__PURE__ */ __name(function(digits) {
15
+ var hexString = function(digits) {
20
16
  var numBytes = Math.ceil(digits / 2);
21
17
  var bytes;
22
18
  try {
@@ -26,30 +22,29 @@ var hexString = /* @__PURE__ */ __name(function(digits) {
26
22
  }
27
23
  var result = bytes.toString("hex");
28
24
  return result.substring(0, digits);
29
- }, "hexString");
30
- var fraction = /* @__PURE__ */ __name(function() {
25
+ };
26
+ var fraction = function() {
31
27
  var numerator = parseInt(hexString(8), 16);
32
28
  return numerator * 23283064365386963e-26;
33
- }, "fraction");
34
- var choice = /* @__PURE__ */ __name(function(arrayOrString) {
29
+ };
30
+ var choice = function(arrayOrString) {
35
31
  var index = Math.floor(fraction() * arrayOrString.length);
36
32
  if (typeof arrayOrString === "string") return arrayOrString.substr(index, 1);
37
33
  else return arrayOrString[index];
38
- }, "choice");
39
- var randomString = /* @__PURE__ */ __name(function(charsCount, alphabet) {
34
+ };
35
+ var randomString = function(charsCount, alphabet) {
40
36
  var digits = [];
41
37
  for (var i = 0; i < charsCount; i++) {
42
38
  digits[i] = choice(alphabet);
43
39
  }
44
40
  return digits.join("");
45
- }, "randomString");
41
+ };
46
42
  function generateId(charsCount, chars = UNMISTAKABLE_CHARS) {
47
43
  if (!charsCount) {
48
44
  charsCount = 17;
49
45
  }
50
46
  return randomString(charsCount, chars);
51
47
  }
52
- __name(generateId, "generateId");
53
48
 
54
49
  // src/createMap.ts
55
50
  function createMap(array, key = "_id") {
@@ -59,7 +54,6 @@ function createMap(array, key = "_id") {
59
54
  }
60
55
  return map;
61
56
  }
62
- __name(createMap, "createMap");
63
57
 
64
58
  // src/createMapArray.ts
65
59
  function createMapArray(array, key = "_id") {
@@ -70,49 +64,46 @@ function createMapArray(array, key = "_id") {
70
64
  }
71
65
  return map;
72
66
  }
73
- __name(createMapArray, "createMapArray");
74
67
 
75
68
  // src/Errors/OrionError.ts
76
- var _OrionError = class _OrionError extends Error {
69
+ var OrionError = class extends Error {
77
70
  isOrionError = true;
78
71
  isUserError;
79
72
  isPermissionsError;
80
73
  code;
81
74
  extra;
82
75
  /**
83
- * Returns a standardized representation of the error information.
84
- * @returns An object containing error details in a consistent format
85
- */
76
+ * Returns a standardized representation of the error information.
77
+ * @returns An object containing error details in a consistent format
78
+ */
86
79
  getInfo;
87
80
  };
88
- __name(_OrionError, "OrionError");
89
- var OrionError = _OrionError;
90
81
 
91
82
  // src/Errors/PermissionsError.ts
92
- var _PermissionsError = class _PermissionsError extends OrionError {
83
+ var PermissionsError = class extends OrionError {
93
84
  /**
94
- * Creates a new PermissionsError instance.
95
- *
96
- * @param permissionErrorType - Identifies the specific permission that was violated
97
- * (e.g., 'read', 'write', 'admin')
98
- * @param extra - Additional error context or metadata. Can include a custom message
99
- * via the message property.
100
- *
101
- * @example
102
- * // Basic usage
103
- * throw new PermissionsError('delete_document')
104
- *
105
- * @example
106
- * // With custom message
107
- * throw new PermissionsError('access_admin', { message: 'Admin access required' })
108
- *
109
- * @example
110
- * // With additional context
111
- * throw new PermissionsError('edit_user', {
112
- * userId: 'user123',
113
- * requiredRole: 'admin'
114
- * })
115
- */
85
+ * Creates a new PermissionsError instance.
86
+ *
87
+ * @param permissionErrorType - Identifies the specific permission that was violated
88
+ * (e.g., 'read', 'write', 'admin')
89
+ * @param extra - Additional error context or metadata. Can include a custom message
90
+ * via the message property.
91
+ *
92
+ * @example
93
+ * // Basic usage
94
+ * throw new PermissionsError('delete_document')
95
+ *
96
+ * @example
97
+ * // With custom message
98
+ * throw new PermissionsError('access_admin', { message: 'Admin access required' })
99
+ *
100
+ * @example
101
+ * // With additional context
102
+ * throw new PermissionsError('edit_user', {
103
+ * userId: 'user123',
104
+ * requiredRole: 'admin'
105
+ * })
106
+ */
116
107
  constructor(permissionErrorType, extra = {}) {
117
108
  const message = extra.message || `Client is not allowed to perform this action [${permissionErrorType}]`;
118
109
  super(message);
@@ -131,31 +122,29 @@ var _PermissionsError = class _PermissionsError extends OrionError {
131
122
  };
132
123
  }
133
124
  };
134
- __name(_PermissionsError, "PermissionsError");
135
- var PermissionsError = _PermissionsError;
136
125
 
137
126
  // src/Errors/UserError.ts
138
- var _UserError = class _UserError extends OrionError {
127
+ var UserError = class extends OrionError {
139
128
  /**
140
- * Creates a new UserError instance.
141
- *
142
- * @param code - Error code identifier. If only one parameter is provided,
143
- * this will be used as the message and code will default to 'error'.
144
- * @param message - Human-readable error message. Optional if code is provided.
145
- * @param extra - Additional error context or metadata.
146
- *
147
- * @example
148
- * // Basic usage
149
- * throw new UserError('invalid_input', 'The provided email is invalid')
150
- *
151
- * @example
152
- * // Using only a message (code will be 'error')
153
- * throw new UserError('Input validation failed')
154
- *
155
- * @example
156
- * // With extra metadata
157
- * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })
158
- */
129
+ * Creates a new UserError instance.
130
+ *
131
+ * @param code - Error code identifier. If only one parameter is provided,
132
+ * this will be used as the message and code will default to 'error'.
133
+ * @param message - Human-readable error message. Optional if code is provided.
134
+ * @param extra - Additional error context or metadata.
135
+ *
136
+ * @example
137
+ * // Basic usage
138
+ * throw new UserError('invalid_input', 'The provided email is invalid')
139
+ *
140
+ * @example
141
+ * // Using only a message (code will be 'error')
142
+ * throw new UserError('Input validation failed')
143
+ *
144
+ * @example
145
+ * // With extra metadata
146
+ * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })
147
+ */
159
148
  constructor(code, message, extra) {
160
149
  if (!message && code) {
161
150
  message = code;
@@ -176,22 +165,21 @@ var _UserError = class _UserError extends OrionError {
176
165
  };
177
166
  }
178
167
  };
179
- __name(_UserError, "UserError");
180
- var UserError = _UserError;
181
168
 
182
169
  // src/Errors/index.ts
183
170
  function isOrionError(error) {
184
171
  return Boolean(error && typeof error === "object" && error.isOrionError === true);
185
172
  }
186
- __name(isOrionError, "isOrionError");
187
173
  function isUserError(error) {
188
- return Boolean(error && typeof error === "object" && error.isOrionError === true && error.isUserError === true);
174
+ return Boolean(
175
+ error && typeof error === "object" && error.isOrionError === true && error.isUserError === true
176
+ );
189
177
  }
190
- __name(isUserError, "isUserError");
191
178
  function isPermissionsError(error) {
192
- return Boolean(error && typeof error === "object" && error.isOrionError === true && error.isPermissionsError === true);
179
+ return Boolean(
180
+ error && typeof error === "object" && error.isOrionError === true && error.isPermissionsError === true
181
+ );
193
182
  }
194
- __name(isPermissionsError, "isPermissionsError");
195
183
 
196
184
  // src/composeMiddlewares.ts
197
185
  function composeMiddlewares(middleware) {
@@ -214,15 +202,13 @@ function composeMiddlewares(middleware) {
214
202
  return Promise.reject(err);
215
203
  }
216
204
  }
217
- __name(dispatch, "dispatch");
218
205
  };
219
206
  }
220
- __name(composeMiddlewares, "composeMiddlewares");
221
207
 
222
208
  // src/retries.ts
223
209
  function executeWithRetries(fn, retries, timeout) {
224
210
  return new Promise((resolve, reject) => {
225
- const retry = /* @__PURE__ */ __name(async (retries2) => {
211
+ const retry = async (retries2) => {
226
212
  try {
227
213
  const result = await fn();
228
214
  resolve(result);
@@ -233,11 +219,10 @@ function executeWithRetries(fn, retries, timeout) {
233
219
  reject(error);
234
220
  }
235
221
  }
236
- }, "retry");
222
+ };
237
223
  retry(retries);
238
224
  });
239
225
  }
240
- __name(executeWithRetries, "executeWithRetries");
241
226
 
242
227
  // ../../node_modules/uuid/dist/esm-node/rng.js
243
228
  import crypto2 from "crypto";
@@ -250,7 +235,6 @@ function rng() {
250
235
  }
251
236
  return rnds8Pool.slice(poolPtr, poolPtr += 16);
252
237
  }
253
- __name(rng, "rng");
254
238
 
255
239
  // ../../node_modules/uuid/dist/esm-node/regex.js
256
240
  var regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
@@ -259,7 +243,6 @@ var regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]
259
243
  function validate(uuid) {
260
244
  return typeof uuid === "string" && regex_default.test(uuid);
261
245
  }
262
- __name(validate, "validate");
263
246
  var validate_default = validate;
264
247
 
265
248
  // ../../node_modules/uuid/dist/esm-node/stringify.js
@@ -274,7 +257,6 @@ function stringify(arr, offset = 0) {
274
257
  }
275
258
  return uuid;
276
259
  }
277
- __name(stringify, "stringify");
278
260
  var stringify_default = stringify;
279
261
 
280
262
  // ../../node_modules/uuid/dist/esm-node/v4.js
@@ -292,56 +274,45 @@ function v4(options, buf, offset) {
292
274
  }
293
275
  return stringify_default(rnds);
294
276
  }
295
- __name(v4, "v4");
296
277
  var v4_default = v4;
297
278
 
298
279
  // src/generateUUID.ts
299
280
  function generateUUID() {
300
281
  return v4_default();
301
282
  }
302
- __name(generateUUID, "generateUUID");
303
283
  function generateUUIDWithPrefix(prefix) {
304
284
  return `${prefix}-${generateUUID()}`;
305
285
  }
306
- __name(generateUUIDWithPrefix, "generateUUIDWithPrefix");
307
286
 
308
287
  // src/normalize.ts
309
288
  function removeAccentsOnly(text) {
310
289
  if (!text) return "";
311
290
  return text.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
312
291
  }
313
- __name(removeAccentsOnly, "removeAccentsOnly");
314
292
  function removeAccentsAndTrim(text) {
315
293
  if (!text) return "";
316
294
  return removeAccentsOnly(text).trim();
317
295
  }
318
- __name(removeAccentsAndTrim, "removeAccentsAndTrim");
319
296
  function normalizeForSearch(text) {
320
297
  if (!text) return "";
321
298
  return removeAccentsAndTrim(text).toLowerCase();
322
299
  }
323
- __name(normalizeForSearch, "normalizeForSearch");
324
300
  function normalizeForCompactSearch(text) {
325
301
  if (!text) return "";
326
302
  return normalizeForSearch(text).replace(/\s/g, "");
327
303
  }
328
- __name(normalizeForCompactSearch, "normalizeForCompactSearch");
329
304
  function normalizeForSearchToken(text) {
330
305
  if (!text) return "";
331
306
  return normalizeForSearch(text).replace(/[^0-9a-z]/gi, " ");
332
307
  }
333
- __name(normalizeForSearchToken, "normalizeForSearchToken");
334
308
  function normalizeForFileKey(text) {
335
309
  if (!text) return "";
336
310
  return removeAccentsOnly(text).replace(/[^a-zA-Z0-9-._]/g, "-").replace(/-+/g, "-").trim().replace(/^-+|-+$/g, "");
337
311
  }
338
- __name(normalizeForFileKey, "normalizeForFileKey");
339
312
 
340
313
  // src/searchTokens.ts
341
314
  function getSearchTokens(text, meta) {
342
- const stringArray = Array.isArray(text) ? text : [
343
- text
344
- ];
315
+ const stringArray = Array.isArray(text) ? text : [text];
345
316
  const tokens = stringArray.filter(Boolean).map((text2) => String(text2)).flatMap((word) => {
346
317
  return normalizeForSearchToken(word).split(" ").filter(Boolean);
347
318
  });
@@ -352,7 +323,6 @@ function getSearchTokens(text, meta) {
352
323
  }
353
324
  return tokens;
354
325
  }
355
- __name(getSearchTokens, "getSearchTokens");
356
326
  function getSearchQueryForTokens(params = {}, _options = {}) {
357
327
  const searchTokens = [];
358
328
  if (params.filter) {
@@ -364,21 +334,16 @@ function getSearchQueryForTokens(params = {}, _options = {}) {
364
334
  if (!params[key]) continue;
365
335
  searchTokens.push(`_${key}:${params[key]}`);
366
336
  }
367
- return {
368
- $all: searchTokens
369
- };
337
+ return { $all: searchTokens };
370
338
  }
371
- __name(getSearchQueryForTokens, "getSearchQueryForTokens");
372
339
 
373
340
  // src/shortenMongoId.ts
374
341
  function lastOfString(string, last) {
375
342
  return string.substring(string.length - last, string.length);
376
343
  }
377
- __name(lastOfString, "lastOfString");
378
344
  function shortenMongoId(string) {
379
345
  return lastOfString(string, 5).toUpperCase();
380
346
  }
381
- __name(shortenMongoId, "shortenMongoId");
382
347
  export {
383
348
  OrionError,
384
349
  PermissionsError,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sleep.ts","../src/hashObject.ts","../src/generateId.ts","../src/createMap.ts","../src/createMapArray.ts","../src/Errors/OrionError.ts","../src/Errors/PermissionsError.ts","../src/Errors/UserError.ts","../src/Errors/index.ts","../src/composeMiddlewares.ts","../src/retries.ts","../../../node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/uuid/dist/esm-node/regex.js","../../../node_modules/uuid/dist/esm-node/validate.js","../../../node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/uuid/dist/esm-node/v4.js","../src/generateUUID.ts","../src/normalize.ts","../src/searchTokens.ts","../src/shortenMongoId.ts"],"sourcesContent":["/**\n * Creates a timeout with a promise\n */\nexport default (time: number): Promise<void> => {\n return new Promise(resolve => setTimeout(resolve, time))\n}\n","import hash from 'object-hash'\n\nexport default function (object: any): string {\n return hash(object)\n}\n","import crypto from 'crypto'\n\nconst UNMISTAKABLE_CHARS = '23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghjkmnopqrstuvwxyz'\n\nconst hexString = function (digits) {\n var numBytes = Math.ceil(digits / 2)\n var bytes\n // Try to get cryptographically strong randomness. Fall back to\n // non-cryptographically strong if not available.\n try {\n bytes = crypto.randomBytes(numBytes)\n } catch (e) {\n // XXX should re-throw any error except insufficient entropy\n bytes = crypto.pseudoRandomBytes(numBytes)\n }\n var result = bytes.toString('hex')\n // If the number of digits is odd, we'll have generated an extra 4 bits\n // of randomness, so we need to trim the last digit.\n return result.substring(0, digits)\n}\n\nconst fraction = function () {\n var numerator = parseInt(hexString(8), 16)\n return numerator * 2.3283064365386963e-10 // 2^-32\n}\n\nconst choice = function (arrayOrString) {\n var index = Math.floor(fraction() * arrayOrString.length)\n if (typeof arrayOrString === 'string') return arrayOrString.substr(index, 1)\n else return arrayOrString[index]\n}\n\nconst randomString = function (charsCount, alphabet) {\n var digits = []\n for (var i = 0; i < charsCount; i++) {\n digits[i] = choice(alphabet)\n }\n return digits.join('')\n}\n\n/**\n * Returns a random ID\n * @param charsCount length of the ID\n * @param chars characters used to generate the ID\n */\nexport default function generateId(\n charsCount?: number,\n chars: string = UNMISTAKABLE_CHARS\n): string {\n if (!charsCount) {\n charsCount = 17\n }\n\n return randomString(charsCount, chars)\n}\n","/**\n * Creates a map (object) from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each item in the array becomes a value in the map, indexed by the specified property.\n * If multiple items have the same key value, only the last one will be preserved.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are the original items\n * \n * @example\n * // Returns { '1': { id: 1, name: 'Item 1' }, '2': { id: 2, name: 'Item 2' } }\n * createMap([{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }], 'id')\n */\nexport default function createMap<T>(array: Array<T>, key: string = '_id'): Record<string, T> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = item\n }\n\n return map\n}\n","/**\n * Creates a grouped map from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each value is an array of items sharing the same key value. Unlike createMap,\n * this function preserves all items with the same key by grouping them in arrays.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a grouped map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are arrays of items\n * \n * @example\n * // Returns { 'category1': [{ id: 1, category: 'category1' }, { id: 3, category: 'category1' }], \n * // 'category2': [{ id: 2, category: 'category2' }] }\n * createMapArray([\n * { id: 1, category: 'category1' }, \n * { id: 2, category: 'category2' }, \n * { id: 3, category: 'category1' }\n * ], 'category')\n */\nexport default function createMapArray<T>(\n array: Array<T>,\n key: string = '_id'\n): Record<string, Array<T>> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = map[item[key]] || []\n map[item[key]].push(item)\n }\n\n return map\n}\n","/**\n * Interface representing the standardized error information structure for Orion errors.\n * This is used by the getInfo method to provide consistent error reporting.\n */\nexport interface OrionErrorInformation {\n /** The error code or identifier */\n error: string\n /** Human-readable error message */\n message: string\n /** Additional error metadata or context */\n extra: any\n /** The sub-type of error. For example for permissions errors it could be 'read', 'write', 'admin' */\n type?: string\n}\n\n/**\n * Base error class for all Orion-specific errors.\n * \n * This abstract class provides common properties and methods for all error types\n * used in the Orion framework. It's extended by more specific error classes\n * like UserError and PermissionsError.\n * \n * @property isOrionError - Flag indicating this is an Orion error (always true)\n * @property isUserError - Flag indicating if this is a user-facing error\n * @property isPermissionsError - Flag indicating if this is a permissions-related error\n * @property code - Error code for identifying the error type\n * @property extra - Additional error context or metadata\n */\nexport class OrionError extends Error {\n isOrionError = true\n\n isUserError: boolean\n isPermissionsError: boolean\n code: string\n extra: any\n\n /**\n * Returns a standardized representation of the error information.\n * @returns An object containing error details in a consistent format\n */\n getInfo: () => OrionErrorInformation\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for permission-related errors in the Orion framework.\n * \n * PermissionsError represents authorization failures where a user or client \n * attempts to perform an action they don't have permission to execute.\n * This is used to distinguish security/permissions errors from other types\n * of errors for proper error handling and user feedback.\n * \n * @extends OrionError\n */\nexport default class PermissionsError extends OrionError {\n /**\n * Creates a new PermissionsError instance.\n * \n * @param permissionErrorType - Identifies the specific permission that was violated\n * (e.g., 'read', 'write', 'admin')\n * @param extra - Additional error context or metadata. Can include a custom message\n * via the message property.\n * \n * @example\n * // Basic usage\n * throw new PermissionsError('delete_document')\n * \n * @example\n * // With custom message\n * throw new PermissionsError('access_admin', { message: 'Admin access required' })\n * \n * @example\n * // With additional context\n * throw new PermissionsError('edit_user', { \n * userId: 'user123',\n * requiredRole: 'admin'\n * })\n */\n constructor(permissionErrorType, extra: any = {}) {\n // Calling parent constructor of base Error class.\n const message =\n extra.message || `Client is not allowed to perform this action [${permissionErrorType}]`\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isPermissionsError = true\n this.code = 'PermissionsError'\n this.extra = extra\n\n this.getInfo = () => {\n return {\n ...extra,\n error: 'PermissionsError',\n message,\n type: permissionErrorType\n }\n }\n }\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for user-facing errors in the Orion framework.\n * \n * UserError is designed to represent errors that should be displayed to end users,\n * as opposed to system errors or unexpected failures. These errors typically represent\n * validation issues, business rule violations, or other expected error conditions.\n * \n * @extends OrionError\n */\nexport default class UserError extends OrionError {\n /**\n * Creates a new UserError instance.\n * \n * @param code - Error code identifier. If only one parameter is provided,\n * this will be used as the message and code will default to 'error'.\n * @param message - Human-readable error message. Optional if code is provided.\n * @param extra - Additional error context or metadata.\n * \n * @example\n * // Basic usage\n * throw new UserError('invalid_input', 'The provided email is invalid')\n * \n * @example\n * // Using only a message (code will be 'error')\n * throw new UserError('Input validation failed')\n * \n * @example\n * // With extra metadata\n * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })\n */\n constructor(code: string, message?: string, extra?: any) {\n if (!message && code) {\n message = code\n code = 'error'\n }\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isUserError = true\n this.code = code\n this.extra = extra\n\n this.getInfo = () => {\n return {\n error: code,\n message,\n extra\n }\n }\n }\n}\n","/**\n * @file Exports all error classes used in the Orion framework\n */\n\nimport {OrionError} from './OrionError'\nimport type {OrionErrorInformation} from './OrionError'\nimport PermissionsError from './PermissionsError'\nimport UserError from './UserError'\n\n/**\n * Re-export all error types for convenient importing\n */\nexport {OrionError, PermissionsError, UserError}\nexport type {OrionErrorInformation}\n\n/**\n * Type guard to check if an error is an OrionError\n *\n * @param error - Any error object to test\n * @returns True if the error is an OrionError instance\n *\n * @example\n * try {\n * // some code that might throw\n * } catch (error) {\n * if (isOrionError(error)) {\n * // Handle Orion-specific error\n * console.log(error.code, error.getInfo())\n * } else {\n * // Handle general error\n * }\n * }\n */\nexport function isOrionError(error: any): error is OrionError {\n return Boolean(error && typeof error === 'object' && error.isOrionError === true)\n}\n\n/**\n * Type guard to check if an error is a UserError\n *\n * @param error - Any error object to test\n * @returns True if the error is a UserError instance\n */\nexport function isUserError(error: any): error is UserError {\n return Boolean(\n error && typeof error === 'object' && error.isOrionError === true && error.isUserError === true,\n )\n}\n\n/**\n * Type guard to check if an error is a PermissionsError\n *\n * @param error - Any error object to test\n * @returns True if the error is a PermissionsError instance\n */\nexport function isPermissionsError(error: any): error is PermissionsError {\n return Boolean(\n error &&\n typeof error === 'object' &&\n error.isOrionError === true &&\n error.isPermissionsError === true,\n )\n}\n","// from https://github.com/koajs/compose/blob/master/index.js\n\n/**\n * Compose `middleware` returning\n * a fully valid middleware comprised\n * of all those which are passed.\n */\nexport function composeMiddlewares(middleware) {\n if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')\n for (const fn of middleware) {\n if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')\n }\n\n /**\n * @param {Object} context\n * @return {Promise}\n * @api public\n */\n\n return function (context, next?) {\n // last called middleware #\n let index = -1\n return dispatch(0)\n function dispatch(i) {\n if (i <= index) return Promise.reject(new Error('next() called multiple times'))\n index = i\n let fn = middleware[i]\n if (i === middleware.length) fn = next\n if (!fn) return Promise.resolve()\n try {\n return Promise.resolve(fn(context, dispatch.bind(null, i + 1)))\n } catch (err) {\n return Promise.reject(err)\n }\n }\n }\n}\n","/**\n * Executes an asynchronous function with automatic retries on failure.\n * \n * This utility attempts to execute the provided function and automatically\n * retries if it fails, with a specified delay between attempts. It will\n * continue retrying until either the function succeeds or the maximum\n * number of retries is reached.\n * \n * @template TFunc Type of the function to execute (must return a Promise)\n * @param fn - The asynchronous function to execute\n * @param retries - The maximum number of retry attempts after the initial attempt\n * @param timeout - The delay in milliseconds between retry attempts\n * @returns A promise that resolves with the result of the function or rejects with the last error\n * \n * @example\n * // Retry an API call up to 3 times with 1 second between attempts\n * const result = await executeWithRetries(\n * () => fetchDataFromApi(),\n * 3,\n * 1000\n * );\n */\nexport function executeWithRetries<TFunc extends () => Promise<any>>(\n fn: TFunc,\n retries: number,\n timeout: number\n): Promise<ReturnType<TFunc>> {\n return new Promise((resolve, reject) => {\n const retry = async (retries: number) => {\n try {\n const result = await fn()\n resolve(result)\n } catch (error) {\n if (retries > 0) {\n setTimeout(() => retry(retries - 1), timeout)\n } else {\n reject(error)\n }\n }\n }\n retry(retries)\n })\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\n\nexport function generateUUID() {\n return uuidv4()\n}\n\nexport function generateUUIDWithPrefix(prefix: string) {\n return `${prefix}-${generateUUID()}`\n}\n","/**\n * Removes diacritical marks (accents) from text without any other modifications.\n * This is the most basic normalization function that others build upon.\n * \n * @param text - The input string to process\n * @returns String with accents removed but otherwise unchanged\n */\nexport function removeAccentsOnly(text: string) {\n if (!text) return ''\n // biome-ignore lint/suspicious/noMisleadingCharacterClass: Removes diacritical marks (accents)\n return text.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n}\n\n/**\n * Normalizes text by removing diacritical marks (accents) and trimming whitespace.\n * Builds on removeAccentsOnly and adds whitespace trimming.\n * \n * @param text - The input string to normalize\n * @returns Normalized string with accents removed and whitespace trimmed\n */\nexport function removeAccentsAndTrim(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text).trim()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * \n * Builds on removeAccentsAndTrim and adds lowercase conversion.\n * Useful for case-insensitive and accent-insensitive text searching.\n * \n * @param text - The input string to normalize for search\n * @returns Search-optimized string in lowercase with accents removed\n */\nexport function normalizeForSearch(text: string) {\n if (!text) return ''\n return removeAccentsAndTrim(text).toLowerCase()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Removing all spaces\n * \n * Builds on normalizeForSearch and removes all whitespace.\n * Useful for compact search indexes or when spaces should be ignored in searches.\n * \n * @param text - The input string to normalize for compact search\n * @returns Compact search-optimized string with no spaces\n */\nexport function normalizeForCompactSearch(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/\\s/g, '')\n}\n\n/**\n * Normalizes text for search token processing by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Replacing all non-alphanumeric characters with spaces\n * \n * Builds on normalizeForSearch and replaces non-alphanumeric characters with spaces.\n * Useful for tokenizing search terms where special characters should be treated as word separators.\n * \n * @param text - The input string to normalize for tokenized search\n * @returns Search token string with only alphanumeric characters and spaces\n */\nexport function normalizeForSearchToken(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/[^0-9a-z]/gi, ' ')\n}\n\n/**\n * Normalizes a string specifically for use as a file key (e.g., in S3 or other storage systems).\n * Performs the following transformations:\n * - Removes accents/diacritical marks\n * - Replaces special characters with hyphens\n * - Ensures only alphanumeric characters, hyphens, periods, and underscores remain\n * - Replaces multiple consecutive hyphens with a single hyphen\n * - Removes leading/trailing hyphens\n * \n * @param text - The input string to normalize for file key usage\n * @returns A storage-safe string suitable for use as a file key\n */\nexport function normalizeForFileKey(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text)\n // Replace spaces and unwanted characters with hyphens\n .replace(/[^a-zA-Z0-9-._]/g, '-')\n // Replace multiple consecutive hyphens with single hyphen\n .replace(/-+/g, '-')\n // Remove leading/trailing hyphens\n .trim()\n .replace(/^-+|-+$/g, '')\n}\n","import { normalizeForSearchToken } from './normalize'\n\n/**\n * Generates an array of search tokens from input text and optional metadata.\n * \n * This function processes text by:\n * 1. Converting it to an array of strings (if not already)\n * 2. Filtering out falsy values\n * 3. Normalizing each string (removing accents, special characters)\n * 4. Splitting by spaces to create individual tokens\n * 5. Optionally adding metadata tokens in the format \"_key:value\"\n * \n * @param text - String or array of strings to tokenize\n * @param meta - Optional metadata object where each key-value pair becomes a token\n * @returns Array of normalized search tokens\n * \n * @example\n * // Returns ['hello', 'world']\n * getSearchTokens('Hello, World!') \n * \n * @example\n * // Returns ['hello', 'world', '_id:123']\n * getSearchTokens('Hello, World!', { id: '123' })\n */\nexport function getSearchTokens(text: string[] | string, meta?: Record<string, string>) {\n const stringArray = Array.isArray(text) ? text : [text]\n const tokens = stringArray\n .filter(Boolean)\n .map(text => String(text))\n .flatMap(word => {\n return normalizeForSearchToken(word).split(' ').filter(Boolean)\n })\n\n if (meta) {\n for (const key in meta) {\n tokens.push(`_${key}:${meta[key]}`)\n }\n }\n\n return tokens\n}\n\n/**\n * Interface for parameters used in generating search queries from tokens.\n * \n * @property filter - Optional string to filter search results\n * @property [key: string] - Additional key-value pairs for metadata filtering\n */\nexport interface SearchQueryForTokensParams {\n filter?: string\n [key: string]: string\n}\n\n/**\n * Options for customizing the search query generation behavior.\n * Currently empty but provided for future extensibility.\n */\nexport type SearchQueryForTokensOptions = {}\n\n/**\n * Generates a MongoDB-compatible query object based on the provided parameters.\n * \n * This function:\n * 1. Processes any filter text into RegExp tokens for prefix matching\n * 2. Adds metadata filters based on additional properties in the params object\n * 3. Returns a query object with the $all operator for MongoDB queries\n * \n * @param params - Parameters for generating the search query\n * @param _options - Options for customizing search behavior (reserved for future use)\n * @returns A MongoDB-compatible query object with format { $all: [...tokens] }\n * \n * @example\n * // Returns { $all: [/^hello/, /^world/] }\n * getSearchQueryForTokens({ filter: 'Hello World' })\n * \n * @example\n * // Returns { $all: [/^search/, '_category:books'] }\n * getSearchQueryForTokens({ filter: 'search', category: 'books' })\n */\nexport function getSearchQueryForTokens(\n params: SearchQueryForTokensParams = {},\n _options: SearchQueryForTokensOptions = {},\n) {\n const searchTokens: (string | RegExp)[] = []\n\n if (params.filter) {\n const filterTokens = getSearchTokens(params.filter).map(token => new RegExp(`^${token}`))\n searchTokens.push(...filterTokens)\n }\n\n for (const key in params) {\n if (key === 'filter') continue\n if (!params[key]) continue\n searchTokens.push(`_${key}:${params[key]}`)\n }\n\n return { $all: searchTokens }\n}\n","function lastOfString(string: string, last: number) {\n return string.substring(string.length - last, string.length)\n}\n\nexport function shortenMongoId(string: string) {\n return lastOfString(string, 5).toUpperCase()\n}\n"],"mappings":"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","names":["time","Promise","resolve","setTimeout","hash","object","hash","crypto","UNMISTAKABLE_CHARS","hexString","digits","numBytes","Math","ceil","bytes","crypto","randomBytes","e","pseudoRandomBytes","result","toString","substring","fraction","numerator","parseInt","choice","arrayOrString","index","floor","length","substr","randomString","charsCount","alphabet","i","join","chars","generateId","array","key","map","item","createMap","array","key","map","item","push","createMapArray","OrionError","Error","isOrionError","isUserError","isPermissionsError","code","extra","getInfo","PermissionsError","OrionError","constructor","permissionErrorType","extra","message","Error","captureStackTrace","isOrionError","isPermissionsError","code","getInfo","error","type","UserError","OrionError","constructor","code","message","extra","Error","captureStackTrace","isOrionError","isUserError","getInfo","error","isOrionError","error","Boolean","isUserError","isPermissionsError","composeMiddlewares","middleware","Array","isArray","TypeError","fn","context","next","index","dispatch","i","Promise","reject","Error","length","resolve","bind","err","executeWithRetries","fn","retries","timeout","Promise","resolve","reject","retry","result","error","setTimeout","crypto","rnds8Pool","Uint8Array","poolPtr","length","rng","crypto","randomFillSync","slice","validate","uuid","REGEX","test","byteToHex","i","push","toString","substr","stringify","arr","offset","uuid","toLowerCase","validate","TypeError","v4","options","buf","offset","rnds","random","rng","i","stringify","generateUUID","uuidv4","generateUUIDWithPrefix","prefix","removeAccentsOnly","text","normalize","replace","removeAccentsAndTrim","trim","normalizeForSearch","toLowerCase","normalizeForCompactSearch","normalizeForSearchToken","normalizeForFileKey","getSearchTokens","text","meta","stringArray","Array","isArray","tokens","filter","Boolean","map","String","flatMap","word","normalizeForSearchToken","split","key","push","getSearchQueryForTokens","params","_options","searchTokens","filterTokens","token","RegExp","$all","lastOfString","string","last","substring","length","shortenMongoId","toUpperCase"]}
1
+ {"version":3,"sources":["../src/sleep.ts","../src/hashObject.ts","../src/generateId.ts","../src/createMap.ts","../src/createMapArray.ts","../src/Errors/OrionError.ts","../src/Errors/PermissionsError.ts","../src/Errors/UserError.ts","../src/Errors/index.ts","../src/composeMiddlewares.ts","../src/retries.ts","../../../node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/uuid/dist/esm-node/regex.js","../../../node_modules/uuid/dist/esm-node/validate.js","../../../node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/uuid/dist/esm-node/v4.js","../src/generateUUID.ts","../src/normalize.ts","../src/searchTokens.ts","../src/shortenMongoId.ts"],"sourcesContent":["/**\n * Creates a timeout with a promise\n */\nexport default (time: number): Promise<void> => {\n return new Promise(resolve => setTimeout(resolve, time))\n}\n","import hash from 'object-hash'\n\nexport default function (object: any): string {\n return hash(object)\n}\n","import crypto from 'crypto'\n\nconst UNMISTAKABLE_CHARS = '23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghjkmnopqrstuvwxyz'\n\nconst hexString = function (digits) {\n var numBytes = Math.ceil(digits / 2)\n var bytes\n // Try to get cryptographically strong randomness. Fall back to\n // non-cryptographically strong if not available.\n try {\n bytes = crypto.randomBytes(numBytes)\n } catch (e) {\n // XXX should re-throw any error except insufficient entropy\n bytes = crypto.pseudoRandomBytes(numBytes)\n }\n var result = bytes.toString('hex')\n // If the number of digits is odd, we'll have generated an extra 4 bits\n // of randomness, so we need to trim the last digit.\n return result.substring(0, digits)\n}\n\nconst fraction = function () {\n var numerator = parseInt(hexString(8), 16)\n return numerator * 2.3283064365386963e-10 // 2^-32\n}\n\nconst choice = function (arrayOrString) {\n var index = Math.floor(fraction() * arrayOrString.length)\n if (typeof arrayOrString === 'string') return arrayOrString.substr(index, 1)\n else return arrayOrString[index]\n}\n\nconst randomString = function (charsCount, alphabet) {\n var digits = []\n for (var i = 0; i < charsCount; i++) {\n digits[i] = choice(alphabet)\n }\n return digits.join('')\n}\n\n/**\n * Returns a random ID\n * @param charsCount length of the ID\n * @param chars characters used to generate the ID\n */\nexport default function generateId(\n charsCount?: number,\n chars: string = UNMISTAKABLE_CHARS\n): string {\n if (!charsCount) {\n charsCount = 17\n }\n\n return randomString(charsCount, chars)\n}\n","/**\n * Creates a map (object) from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each item in the array becomes a value in the map, indexed by the specified property.\n * If multiple items have the same key value, only the last one will be preserved.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are the original items\n * \n * @example\n * // Returns { '1': { id: 1, name: 'Item 1' }, '2': { id: 2, name: 'Item 2' } }\n * createMap([{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }], 'id')\n */\nexport default function createMap<T>(array: Array<T>, key: string = '_id'): Record<string, T> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = item\n }\n\n return map\n}\n","/**\n * Creates a grouped map from an array of items, using a specified property as the key.\n * \n * This utility transforms an array of objects into a lookup object/dictionary where\n * each value is an array of items sharing the same key value. Unlike createMap,\n * this function preserves all items with the same key by grouping them in arrays.\n * \n * @template T The type of items in the input array\n * @param array - The input array of items to transform into a grouped map\n * @param key - The property name to use as keys in the resulting map (defaults to '_id')\n * @returns A record object where keys are values of the specified property and values are arrays of items\n * \n * @example\n * // Returns { 'category1': [{ id: 1, category: 'category1' }, { id: 3, category: 'category1' }], \n * // 'category2': [{ id: 2, category: 'category2' }] }\n * createMapArray([\n * { id: 1, category: 'category1' }, \n * { id: 2, category: 'category2' }, \n * { id: 3, category: 'category1' }\n * ], 'category')\n */\nexport default function createMapArray<T>(\n array: Array<T>,\n key: string = '_id'\n): Record<string, Array<T>> {\n const map = {}\n\n for (const item of array) {\n map[item[key]] = map[item[key]] || []\n map[item[key]].push(item)\n }\n\n return map\n}\n","/**\n * Interface representing the standardized error information structure for Orion errors.\n * This is used by the getInfo method to provide consistent error reporting.\n */\nexport interface OrionErrorInformation {\n /** The error code or identifier */\n error: string\n /** Human-readable error message */\n message: string\n /** Additional error metadata or context */\n extra: any\n /** The sub-type of error. For example for permissions errors it could be 'read', 'write', 'admin' */\n type?: string\n}\n\n/**\n * Base error class for all Orion-specific errors.\n * \n * This abstract class provides common properties and methods for all error types\n * used in the Orion framework. It's extended by more specific error classes\n * like UserError and PermissionsError.\n * \n * @property isOrionError - Flag indicating this is an Orion error (always true)\n * @property isUserError - Flag indicating if this is a user-facing error\n * @property isPermissionsError - Flag indicating if this is a permissions-related error\n * @property code - Error code for identifying the error type\n * @property extra - Additional error context or metadata\n */\nexport class OrionError extends Error {\n isOrionError = true\n\n isUserError: boolean\n isPermissionsError: boolean\n code: string\n extra: any\n\n /**\n * Returns a standardized representation of the error information.\n * @returns An object containing error details in a consistent format\n */\n getInfo: () => OrionErrorInformation\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for permission-related errors in the Orion framework.\n * \n * PermissionsError represents authorization failures where a user or client \n * attempts to perform an action they don't have permission to execute.\n * This is used to distinguish security/permissions errors from other types\n * of errors for proper error handling and user feedback.\n * \n * @extends OrionError\n */\nexport default class PermissionsError extends OrionError {\n /**\n * Creates a new PermissionsError instance.\n * \n * @param permissionErrorType - Identifies the specific permission that was violated\n * (e.g., 'read', 'write', 'admin')\n * @param extra - Additional error context or metadata. Can include a custom message\n * via the message property.\n * \n * @example\n * // Basic usage\n * throw new PermissionsError('delete_document')\n * \n * @example\n * // With custom message\n * throw new PermissionsError('access_admin', { message: 'Admin access required' })\n * \n * @example\n * // With additional context\n * throw new PermissionsError('edit_user', { \n * userId: 'user123',\n * requiredRole: 'admin'\n * })\n */\n constructor(permissionErrorType, extra: any = {}) {\n // Calling parent constructor of base Error class.\n const message =\n extra.message || `Client is not allowed to perform this action [${permissionErrorType}]`\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isPermissionsError = true\n this.code = 'PermissionsError'\n this.extra = extra\n\n this.getInfo = () => {\n return {\n ...extra,\n error: 'PermissionsError',\n message,\n type: permissionErrorType\n }\n }\n }\n}\n","import { OrionError } from './OrionError'\n\n/**\n * Error class for user-facing errors in the Orion framework.\n * \n * UserError is designed to represent errors that should be displayed to end users,\n * as opposed to system errors or unexpected failures. These errors typically represent\n * validation issues, business rule violations, or other expected error conditions.\n * \n * @extends OrionError\n */\nexport default class UserError extends OrionError {\n /**\n * Creates a new UserError instance.\n * \n * @param code - Error code identifier. If only one parameter is provided,\n * this will be used as the message and code will default to 'error'.\n * @param message - Human-readable error message. Optional if code is provided.\n * @param extra - Additional error context or metadata.\n * \n * @example\n * // Basic usage\n * throw new UserError('invalid_input', 'The provided email is invalid')\n * \n * @example\n * // Using only a message (code will be 'error')\n * throw new UserError('Input validation failed')\n * \n * @example\n * // With extra metadata\n * throw new UserError('rate_limit', 'Too many requests', { maxRequests: 100 })\n */\n constructor(code: string, message?: string, extra?: any) {\n if (!message && code) {\n message = code\n code = 'error'\n }\n\n super(message)\n Error.captureStackTrace(this, this.constructor)\n\n this.isOrionError = true\n this.isUserError = true\n this.code = code\n this.extra = extra\n\n this.getInfo = () => {\n return {\n error: code,\n message,\n extra\n }\n }\n }\n}\n","/**\n * @file Exports all error classes used in the Orion framework\n */\n\nimport {OrionError} from './OrionError'\nimport type {OrionErrorInformation} from './OrionError'\nimport PermissionsError from './PermissionsError'\nimport UserError from './UserError'\n\n/**\n * Re-export all error types for convenient importing\n */\nexport {OrionError, PermissionsError, UserError}\nexport type {OrionErrorInformation}\n\n/**\n * Type guard to check if an error is an OrionError\n *\n * @param error - Any error object to test\n * @returns True if the error is an OrionError instance\n *\n * @example\n * try {\n * // some code that might throw\n * } catch (error) {\n * if (isOrionError(error)) {\n * // Handle Orion-specific error\n * console.log(error.code, error.getInfo())\n * } else {\n * // Handle general error\n * }\n * }\n */\nexport function isOrionError(error: any): error is OrionError {\n return Boolean(error && typeof error === 'object' && error.isOrionError === true)\n}\n\n/**\n * Type guard to check if an error is a UserError\n *\n * @param error - Any error object to test\n * @returns True if the error is a UserError instance\n */\nexport function isUserError(error: any): error is UserError {\n return Boolean(\n error && typeof error === 'object' && error.isOrionError === true && error.isUserError === true,\n )\n}\n\n/**\n * Type guard to check if an error is a PermissionsError\n *\n * @param error - Any error object to test\n * @returns True if the error is a PermissionsError instance\n */\nexport function isPermissionsError(error: any): error is PermissionsError {\n return Boolean(\n error &&\n typeof error === 'object' &&\n error.isOrionError === true &&\n error.isPermissionsError === true,\n )\n}\n","// from https://github.com/koajs/compose/blob/master/index.js\n\n/**\n * Compose `middleware` returning\n * a fully valid middleware comprised\n * of all those which are passed.\n */\nexport function composeMiddlewares(middleware) {\n if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')\n for (const fn of middleware) {\n if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')\n }\n\n /**\n * @param {Object} context\n * @return {Promise}\n * @api public\n */\n\n return function (context, next?) {\n // last called middleware #\n let index = -1\n return dispatch(0)\n function dispatch(i) {\n if (i <= index) return Promise.reject(new Error('next() called multiple times'))\n index = i\n let fn = middleware[i]\n if (i === middleware.length) fn = next\n if (!fn) return Promise.resolve()\n try {\n return Promise.resolve(fn(context, dispatch.bind(null, i + 1)))\n } catch (err) {\n return Promise.reject(err)\n }\n }\n }\n}\n","/**\n * Executes an asynchronous function with automatic retries on failure.\n * \n * This utility attempts to execute the provided function and automatically\n * retries if it fails, with a specified delay between attempts. It will\n * continue retrying until either the function succeeds or the maximum\n * number of retries is reached.\n * \n * @template TFunc Type of the function to execute (must return a Promise)\n * @param fn - The asynchronous function to execute\n * @param retries - The maximum number of retry attempts after the initial attempt\n * @param timeout - The delay in milliseconds between retry attempts\n * @returns A promise that resolves with the result of the function or rejects with the last error\n * \n * @example\n * // Retry an API call up to 3 times with 1 second between attempts\n * const result = await executeWithRetries(\n * () => fetchDataFromApi(),\n * 3,\n * 1000\n * );\n */\nexport function executeWithRetries<TFunc extends () => Promise<any>>(\n fn: TFunc,\n retries: number,\n timeout: number\n): Promise<ReturnType<TFunc>> {\n return new Promise((resolve, reject) => {\n const retry = async (retries: number) => {\n try {\n const result = await fn()\n resolve(result)\n } catch (error) {\n if (retries > 0) {\n setTimeout(() => retry(retries - 1), timeout)\n } else {\n reject(error)\n }\n }\n }\n retry(retries)\n })\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\n\nexport function generateUUID() {\n return uuidv4()\n}\n\nexport function generateUUIDWithPrefix(prefix: string) {\n return `${prefix}-${generateUUID()}`\n}\n","/**\n * Removes diacritical marks (accents) from text without any other modifications.\n * This is the most basic normalization function that others build upon.\n * \n * @param text - The input string to process\n * @returns String with accents removed but otherwise unchanged\n */\nexport function removeAccentsOnly(text: string) {\n if (!text) return ''\n // biome-ignore lint/suspicious/noMisleadingCharacterClass: Removes diacritical marks (accents)\n return text.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n}\n\n/**\n * Normalizes text by removing diacritical marks (accents) and trimming whitespace.\n * Builds on removeAccentsOnly and adds whitespace trimming.\n * \n * @param text - The input string to normalize\n * @returns Normalized string with accents removed and whitespace trimmed\n */\nexport function removeAccentsAndTrim(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text).trim()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * \n * Builds on removeAccentsAndTrim and adds lowercase conversion.\n * Useful for case-insensitive and accent-insensitive text searching.\n * \n * @param text - The input string to normalize for search\n * @returns Search-optimized string in lowercase with accents removed\n */\nexport function normalizeForSearch(text: string) {\n if (!text) return ''\n return removeAccentsAndTrim(text).toLowerCase()\n}\n\n/**\n * Normalizes text for search purposes by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Removing all spaces\n * \n * Builds on normalizeForSearch and removes all whitespace.\n * Useful for compact search indexes or when spaces should be ignored in searches.\n * \n * @param text - The input string to normalize for compact search\n * @returns Compact search-optimized string with no spaces\n */\nexport function normalizeForCompactSearch(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/\\s/g, '')\n}\n\n/**\n * Normalizes text for search token processing by:\n * - Removing diacritical marks (accents)\n * - Converting to lowercase\n * - Trimming whitespace\n * - Replacing all non-alphanumeric characters with spaces\n * \n * Builds on normalizeForSearch and replaces non-alphanumeric characters with spaces.\n * Useful for tokenizing search terms where special characters should be treated as word separators.\n * \n * @param text - The input string to normalize for tokenized search\n * @returns Search token string with only alphanumeric characters and spaces\n */\nexport function normalizeForSearchToken(text: string) {\n if (!text) return ''\n return normalizeForSearch(text).replace(/[^0-9a-z]/gi, ' ')\n}\n\n/**\n * Normalizes a string specifically for use as a file key (e.g., in S3 or other storage systems).\n * Performs the following transformations:\n * - Removes accents/diacritical marks\n * - Replaces special characters with hyphens\n * - Ensures only alphanumeric characters, hyphens, periods, and underscores remain\n * - Replaces multiple consecutive hyphens with a single hyphen\n * - Removes leading/trailing hyphens\n * \n * @param text - The input string to normalize for file key usage\n * @returns A storage-safe string suitable for use as a file key\n */\nexport function normalizeForFileKey(text: string) {\n if (!text) return ''\n return removeAccentsOnly(text)\n // Replace spaces and unwanted characters with hyphens\n .replace(/[^a-zA-Z0-9-._]/g, '-')\n // Replace multiple consecutive hyphens with single hyphen\n .replace(/-+/g, '-')\n // Remove leading/trailing hyphens\n .trim()\n .replace(/^-+|-+$/g, '')\n}\n","import { normalizeForSearchToken } from './normalize'\n\n/**\n * Generates an array of search tokens from input text and optional metadata.\n * \n * This function processes text by:\n * 1. Converting it to an array of strings (if not already)\n * 2. Filtering out falsy values\n * 3. Normalizing each string (removing accents, special characters)\n * 4. Splitting by spaces to create individual tokens\n * 5. Optionally adding metadata tokens in the format \"_key:value\"\n * \n * @param text - String or array of strings to tokenize\n * @param meta - Optional metadata object where each key-value pair becomes a token\n * @returns Array of normalized search tokens\n * \n * @example\n * // Returns ['hello', 'world']\n * getSearchTokens('Hello, World!') \n * \n * @example\n * // Returns ['hello', 'world', '_id:123']\n * getSearchTokens('Hello, World!', { id: '123' })\n */\nexport function getSearchTokens(text: string[] | string, meta?: Record<string, string>) {\n const stringArray = Array.isArray(text) ? text : [text]\n const tokens = stringArray\n .filter(Boolean)\n .map(text => String(text))\n .flatMap(word => {\n return normalizeForSearchToken(word).split(' ').filter(Boolean)\n })\n\n if (meta) {\n for (const key in meta) {\n tokens.push(`_${key}:${meta[key]}`)\n }\n }\n\n return tokens\n}\n\n/**\n * Interface for parameters used in generating search queries from tokens.\n * \n * @property filter - Optional string to filter search results\n * @property [key: string] - Additional key-value pairs for metadata filtering\n */\nexport interface SearchQueryForTokensParams {\n filter?: string\n [key: string]: string\n}\n\n/**\n * Options for customizing the search query generation behavior.\n * Currently empty but provided for future extensibility.\n */\nexport type SearchQueryForTokensOptions = {}\n\n/**\n * Generates a MongoDB-compatible query object based on the provided parameters.\n * \n * This function:\n * 1. Processes any filter text into RegExp tokens for prefix matching\n * 2. Adds metadata filters based on additional properties in the params object\n * 3. Returns a query object with the $all operator for MongoDB queries\n * \n * @param params - Parameters for generating the search query\n * @param _options - Options for customizing search behavior (reserved for future use)\n * @returns A MongoDB-compatible query object with format { $all: [...tokens] }\n * \n * @example\n * // Returns { $all: [/^hello/, /^world/] }\n * getSearchQueryForTokens({ filter: 'Hello World' })\n * \n * @example\n * // Returns { $all: [/^search/, '_category:books'] }\n * getSearchQueryForTokens({ filter: 'search', category: 'books' })\n */\nexport function getSearchQueryForTokens(\n params: SearchQueryForTokensParams = {},\n _options: SearchQueryForTokensOptions = {},\n) {\n const searchTokens: (string | RegExp)[] = []\n\n if (params.filter) {\n const filterTokens = getSearchTokens(params.filter).map(token => new RegExp(`^${token}`))\n searchTokens.push(...filterTokens)\n }\n\n for (const key in params) {\n if (key === 'filter') continue\n if (!params[key]) continue\n searchTokens.push(`_${key}:${params[key]}`)\n }\n\n return { $all: searchTokens }\n}\n","function lastOfString(string: string, last: number) {\n return string.substring(string.length - last, string.length)\n}\n\nexport function shortenMongoId(string: string) {\n return lastOfString(string, 5).toUpperCase()\n}\n"],"mappings":"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","names":["retries","crypto","text"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orion-js/helpers",
3
- "version": "4.0.0-next.2",
3
+ "version": "4.0.0-next.3",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -14,14 +14,6 @@
14
14
  ],
15
15
  "author": "nicolaslopezj",
16
16
  "license": "MIT",
17
- "scripts": {
18
- "test": "vitest run",
19
- "prepare": "pnpm build",
20
- "clean": "rm -rf ./dist",
21
- "build": "tsup",
22
- "upgrade-interactive": "pnpm upgrade --interactive",
23
- "dev": "tsup --watch"
24
- },
25
17
  "dependencies": {
26
18
  "object-hash": "^2.2.0"
27
19
  },
@@ -35,5 +27,12 @@
35
27
  "access": "public"
36
28
  },
37
29
  "gitHead": "a485b1fe6a1840ee6cb58fd69d6de62585f1ed10",
38
- "type": "module"
30
+ "type": "module",
31
+ "scripts": {
32
+ "test": "vitest run",
33
+ "clean": "rm -rf ./dist",
34
+ "build": "tsup",
35
+ "upgrade-interactive": "pnpm upgrade --interactive",
36
+ "dev": "tsup --watch"
37
+ }
39
38
  }