@lyxa.ai/core 1.1.42 → 1.1.43

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.
@@ -22,7 +22,7 @@ Perfect for sharing types between frontend and backend applications.
22
22
 
23
23
  ## Version
24
24
 
25
- Version: 1.1.42
25
+ Version: 1.1.43
26
26
 
27
27
  ## Dependencies
28
28
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/types",
3
- "version": "1.1.42",
3
+ "version": "1.1.43",
4
4
  "description": "Lyxa type definitions and validation schemas for both frontend and backend",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",
@@ -3,23 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateId = generateId;
4
4
  const enum_1 = require("./enum");
5
5
  function getNextCore(core) {
6
- const match = core.match(/^([A-Z]+)(\d+)$/);
6
+ const match = core.match(/^([A-Z]+)(\d*)$/);
7
7
  if (!match)
8
8
  throw new Error(`Invalid core format: ${core}`);
9
- let [_, letters, numbers] = match;
9
+ let letters = match[1];
10
+ let numbers = match[2] || '1';
10
11
  let numberLength = numbers.length;
11
12
  let number = parseInt(numbers, 10);
12
- number++;
13
13
  const maxNumber = parseInt('9'.repeat(numberLength), 10);
14
+ const isMaxCore = letters.split('').every(c => c === 'Z') && number === maxNumber;
15
+ if (isMaxCore) {
16
+ numberLength += 1;
17
+ number = 1;
18
+ letters = 'A'.repeat(letters.length);
19
+ return `${letters}${number.toString().padStart(numberLength, '0')}`;
20
+ }
21
+ number++;
14
22
  if (number > maxNumber) {
15
23
  number = 1;
16
24
  letters = incrementLettersLevel(letters);
17
- if (letters.length > match[1].length) {
18
- numberLength = Math.max(numberLength - 1, 1);
19
- }
20
25
  }
21
- const nextCore = `${letters}${number.toString().padStart(numberLength, '0')}`;
22
- return nextCore;
26
+ return `${letters}${number.toString().padStart(numberLength, '0')}`;
23
27
  }
24
28
  function incrementLettersLevel(letters) {
25
29
  const chars = letters.split('');
@@ -34,9 +38,8 @@ function incrementLettersLevel(letters) {
34
38
  carry = false;
35
39
  }
36
40
  }
37
- if (carry) {
41
+ if (carry)
38
42
  return 'A' + chars.join('');
39
- }
40
43
  return chars.join('');
41
44
  }
42
45
  function getPrefixForType(counterType) {
@@ -61,8 +64,9 @@ async function generateId(CounterModel, counterType) {
61
64
  const currentCore = counterDoc.core;
62
65
  const nextCore = getNextCore(currentCore);
63
66
  const updatedDoc = await CounterModel.findOneAndUpdate({ counterType, core: currentCore }, { $set: { core: nextCore } }, { new: false }).lean();
64
- if (!updatedDoc)
67
+ if (!updatedDoc) {
65
68
  return generateId(CounterModel, counterType);
69
+ }
66
70
  return `${prefix}${currentCore}`;
67
71
  }
68
72
  //# sourceMappingURL=id-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"id-generator.js","sourceRoot":"/","sources":["utilities/id-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { CounterType } from './enum';\n\nfunction getNextCore(core: string): string {\n\tconst match = core.match(/^([A-Z]+)(\\d+)$/);\n\tif (!match) throw new Error(`Invalid core format: ${core}`);\n\n\tlet [_, letters, numbers] = match;\n\n\tlet numberLength = numbers.length;\n\tlet number = parseInt(numbers, 10);\n\n\t// Increment the number\n\tnumber++;\n\n\t// Maximum number for current number length\n\tconst maxNumber = parseInt('9'.repeat(numberLength), 10);\n\n\tif (number > maxNumber) {\n\t\t// Number overflow, reset to 1\n\t\tnumber = 1;\n\n\t\t// Increment letters\n\t\tletters = incrementLettersLevel(letters);\n\n\t\t// If letters length increased, reduce number digits\n\t\tif (letters.length > match[1].length) {\n\t\t\tnumberLength = Math.max(numberLength - 1, 1);\n\t\t}\n\t}\n\n\t// Pad number with zeros\n\tconst nextCore = `${letters}${number.toString().padStart(numberLength, '0')}`;\n\treturn nextCore;\n}\n\n// Increment letters with \"leveling up\" (odometer style)\nfunction incrementLettersLevel(letters: string): string {\n\tconst chars = letters.split('');\n\tlet carry = true;\n\n\tfor (let i = chars.length - 1; i >= 0 && carry; i--) {\n\t\tif (chars[i] === 'Z') {\n\t\t\tchars[i] = 'A';\n\t\t\tcarry = true;\n\t\t} else {\n\t\t\tchars[i] = String.fromCharCode(chars[i].charCodeAt(0) + 1);\n\t\t\tcarry = false;\n\t\t}\n\t}\n\n\t// All letters overflow, add a new letter at the start\n\tif (carry) {\n\t\treturn 'A' + chars.join('');\n\t}\n\n\treturn chars.join('');\n}\n\nfunction getPrefixForType(counterType: CounterType): string {\n\tconst prefixMap: any = {\n\t\t[CounterType.USER]: 'U',\n\t\t[CounterType.RIDER]: 'R',\n\t\t[CounterType.PARENT]: 'P',\n\t\t[CounterType.SHOP]: 'S',\n\t\t[CounterType.ITEM]: 'I',\n\t\t[CounterType.TRANSACTION]: 'T',\n\t};\n\treturn prefixMap[counterType];\n}\n\nexport async function generateId(CounterModel: any, counterType: CounterType): Promise<string> {\n\tconst prefix = getPrefixForType(counterType);\n\tconst initialCore = 'A0001';\n\n\tlet counterDoc = await CounterModel.findOne({ counterType }).lean();\n\n\tif (!counterDoc) {\n\t\tawait CounterModel.create({ counterType, core: initialCore });\n\t\tcounterDoc = { core: initialCore };\n\t}\n\n\tconst currentCore = counterDoc.core;\n\tconst nextCore = getNextCore(currentCore);\n\n\tconst updatedDoc = await CounterModel.findOneAndUpdate(\n\t\t{ counterType, core: currentCore },\n\t\t{ $set: { core: nextCore } },\n\t\t{ new: false }\n\t).lean();\n\n\tif (!updatedDoc) return generateId(CounterModel, counterType); // Retry if conflict\n\n\treturn `${prefix}${currentCore}`;\n}\n"]}
1
+ {"version":3,"file":"id-generator.js","sourceRoot":"/","sources":["utilities/id-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { CounterType } from './enum';\n\n/**\n * Get the next core value following your leveling rules.\n * Example: A0001 → A0002 → ... → A9999 → B0001 → ... → ZZZZZ → A00001\n */\nfunction getNextCore(core: string): string {\n const match = core.match(/^([A-Z]+)(\\d*)$/); // allow optional numbers\n if (!match) throw new Error(`Invalid core format: ${core}`);\n\n let letters = match[1];\n let numbers = match[2] || '1'; // default to 1 if missing\n\n let numberLength = numbers.length;\n let number = parseInt(numbers, 10);\n\n const maxNumber = parseInt('9'.repeat(numberLength), 10);\n\n // Check if we are at the final state: all letters are Z and number is max\n const isMaxCore = letters.split('').every(c => c === 'Z') && number === maxNumber;\n\n if (isMaxCore) {\n // Increase numeric length and reset letters to A\n numberLength += 1;\n number = 1;\n letters = 'A'.repeat(letters.length); // or just 'A' if you want single letter prefix\n return `${letters}${number.toString().padStart(numberLength, '0')}`;\n }\n\n // Normal increment\n number++;\n if (number > maxNumber) {\n number = 1;\n letters = incrementLettersLevel(letters);\n }\n\n return `${letters}${number.toString().padStart(numberLength, '0')}`;\n}\n\nfunction incrementLettersLevel(letters: string): string {\n const chars = letters.split('');\n let carry = true;\n\n for (let i = chars.length - 1; i >= 0 && carry; i--) {\n if (chars[i] === 'Z') {\n chars[i] = 'A';\n carry = true;\n } else {\n chars[i] = String.fromCharCode(chars[i].charCodeAt(0) + 1);\n carry = false;\n }\n }\n\n if (carry) return 'A' + chars.join('');\n return chars.join('');\n}\n\n/**\n * Get prefix for a counter type\n */\nfunction getPrefixForType(counterType: CounterType): string {\n const prefixMap: any = {\n [CounterType.USER]: 'U',\n [CounterType.RIDER]: 'R',\n [CounterType.PARENT]: 'P',\n [CounterType.SHOP]: 'S',\n [CounterType.ITEM]: 'I',\n [CounterType.TRANSACTION]: 'T',\n };\n return prefixMap[counterType];\n}\n\n/**\n * Generate a new unique ID for a given counter type\n */\nexport async function generateId(\n CounterModel: any,\n counterType: CounterType\n): Promise<string> {\n const prefix = getPrefixForType(counterType);\n const initialCore = 'A0001';\n\n let counterDoc = await CounterModel.findOne({ counterType }).lean();\n\n if (!counterDoc) {\n await CounterModel.create({ counterType, core: initialCore });\n counterDoc = { core: initialCore };\n }\n\n const currentCore = counterDoc.core;\n const nextCore = getNextCore(currentCore);\n\n const updatedDoc = await CounterModel.findOneAndUpdate(\n { counterType, core: currentCore },\n { $set: { core: nextCore } },\n { new: false }\n ).lean();\n\n if (!updatedDoc) {\n // Retry if another process updated the counter\n return generateId(CounterModel, counterType);\n }\n\n return `${prefix}${currentCore}`;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/core",
3
- "version": "1.1.42",
3
+ "version": "1.1.43",
4
4
  "description": "The Core system of the Lyxa services.",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",