@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.
package/dist/types/README.md
CHANGED
package/dist/types/package.json
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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":";;
|
|
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"]}
|