random-indian-names 1.0.1 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/dist/index.d.ts +6 -0
- package/{index.js → dist/index.js} +10 -21
- package/dist/index.js.map +1 -0
- package/package.json +13 -5
- package/src/index.ts +159 -0
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@ A high-quality, lightweight Node.js module that uses a **Syllable Graph Engine**
|
|
|
5
5
|
Instead of random letters, this module uses real cultural "roots" and "transitions" to ensure names are phonetically natural, unique, and accurate.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
|
+
- **TypeScript Ready**: Fully typed with type definitions.
|
|
8
9
|
- **Generative Algorithm**: Infinite variety, no stale datasets.
|
|
9
10
|
- **Length Control**: Specify `min` and `max` character counts.
|
|
10
11
|
- **Lightweight**: Zero dependencies.
|
|
@@ -25,13 +26,20 @@ const { getRandomName } = require('random-indian-names');
|
|
|
25
26
|
console.log(getRandomName()); // e.g., "Arjun"
|
|
26
27
|
```
|
|
27
28
|
|
|
29
|
+
### TypeScript / ES Modules
|
|
30
|
+
```typescript
|
|
31
|
+
import { getRandomName } from 'random-indian-names';
|
|
32
|
+
|
|
33
|
+
// Generate a random name
|
|
34
|
+
console.log(getRandomName(5, 10)); // e.g., "Vihaan"
|
|
35
|
+
```
|
|
36
|
+
|
|
28
37
|
### With Length Constraints
|
|
29
|
-
Get a name between 3 and 5 characters.
|
|
30
38
|
```javascript
|
|
39
|
+
// Get a name between 3 and 5 characters
|
|
31
40
|
console.log(getRandomName(3, 5)); // e.g., "Aditi"
|
|
32
41
|
|
|
33
|
-
//
|
|
34
|
-
console.log(getRandomName(5)); // e.g., "Vihaan"
|
|
42
|
+
// Call with one parameter (min=5, max defaults to 10)console.log(getRandomName(8)); // e.g., "Ishaninath"
|
|
35
43
|
```
|
|
36
44
|
|
|
37
45
|
## API
|
package/dist/index.d.ts
ADDED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Random Indian Name Generator
|
|
3
4
|
* Syllable Graph Engine - Refined transitions with repetition guards.
|
|
4
5
|
*/
|
|
5
|
-
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getRandomName = getRandomName;
|
|
6
8
|
const syllableGraph = {
|
|
7
9
|
"starts": [
|
|
8
10
|
"A", "Ad", "Ak", "Am", "An", "Ar", "As", "Av", "Bha", "Cha", "De",
|
|
@@ -54,12 +56,11 @@ const syllableGraph = {
|
|
|
54
56
|
// Special high-quality suffixes for longer names
|
|
55
57
|
"suffixes": ["kumar", "endra", "deep", "jeet", "prasad", "nath", "veer", "wati", "it", "esh", "an"]
|
|
56
58
|
};
|
|
57
|
-
|
|
58
59
|
function getRandom(arr) {
|
|
59
|
-
if (!arr || arr.length === 0)
|
|
60
|
+
if (!arr || arr.length === 0)
|
|
61
|
+
return "";
|
|
60
62
|
return arr[Math.floor(Math.random() * arr.length)];
|
|
61
63
|
}
|
|
62
|
-
|
|
63
64
|
function getRandomName(min = 3, max = 10) {
|
|
64
65
|
if (typeof min !== 'number' || typeof max !== 'number') {
|
|
65
66
|
throw new Error("getRandomName requires numbers for min and max");
|
|
@@ -77,20 +78,17 @@ function getRandomName(min = 3, max = 10) {
|
|
|
77
78
|
while (attempts < 500) {
|
|
78
79
|
let name = getRandom(syllableGraph.starts);
|
|
79
80
|
let usedSyllables = new Set([name.toLowerCase()]);
|
|
80
|
-
|
|
81
81
|
// Decide target length (favoring longer if min > 5)
|
|
82
82
|
const targetLength = max > 6 ?
|
|
83
83
|
Math.floor(Math.random() * (max - min + 1) + min) :
|
|
84
84
|
(Math.random() > 0.3 ? max : Math.max(min, 4));
|
|
85
|
-
|
|
86
85
|
let lastSyllable = name;
|
|
87
86
|
while (name.length < targetLength) {
|
|
88
87
|
const pool = syllableGraph.transitions[lastSyllable] ||
|
|
89
88
|
syllableGraph.transitions[name.slice(-2)] ||
|
|
90
89
|
syllableGraph.transitions[name.slice(-1)];
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
if (!pool)
|
|
91
|
+
break;
|
|
94
92
|
// Pick a non-repetitive syllable
|
|
95
93
|
let next = getRandom(pool);
|
|
96
94
|
let subAttempts = 0;
|
|
@@ -98,13 +96,11 @@ function getRandomName(min = 3, max = 10) {
|
|
|
98
96
|
next = getRandom(pool);
|
|
99
97
|
subAttempts++;
|
|
100
98
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
if (usedSyllables.has(next.toLowerCase()))
|
|
100
|
+
break; // Avoid infinite loops
|
|
104
101
|
name += next;
|
|
105
102
|
usedSyllables.add(next.toLowerCase());
|
|
106
103
|
lastSyllable = next;
|
|
107
|
-
|
|
108
104
|
// Chance to attach a high-quality suffix if we are near target length
|
|
109
105
|
if (name.length >= targetLength - 4 && Math.random() > 0.6) {
|
|
110
106
|
const suffix = getRandom(syllableGraph.suffixes);
|
|
@@ -114,22 +110,17 @@ function getRandomName(min = 3, max = 10) {
|
|
|
114
110
|
}
|
|
115
111
|
}
|
|
116
112
|
}
|
|
117
|
-
|
|
118
113
|
// Clean up and normalization
|
|
119
114
|
name = name.toLowerCase();
|
|
120
|
-
|
|
121
115
|
// Clean double vowels but PRESERVE 'ee' and 'oo' as they are common in Indian names (e.g., Deep, Jeet)
|
|
122
116
|
name = name.replace(/([aeiou])\1/gi, (match) => {
|
|
123
117
|
const low = match.toLowerCase();
|
|
124
118
|
return (low === 'ee' || low === 'oo') ? match : match[0];
|
|
125
119
|
});
|
|
126
|
-
|
|
127
120
|
// Remove impossible triple consonants
|
|
128
121
|
name = name.replace(/([^aeiou])\1\1/gi, '$1$1');
|
|
129
|
-
|
|
130
122
|
// Fix "Utktk" and similar issues by preventing identical vowel-less clusters
|
|
131
123
|
name = name.replace(/(tk|rt|rk)\1/gi, '$1');
|
|
132
|
-
|
|
133
124
|
if (name.length >= min && name.length <= max) {
|
|
134
125
|
// Capitalize
|
|
135
126
|
const result = name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
|
|
@@ -140,11 +131,9 @@ function getRandomName(min = 3, max = 10) {
|
|
|
140
131
|
}
|
|
141
132
|
attempts++;
|
|
142
133
|
}
|
|
143
|
-
|
|
144
134
|
// High Quality Fallback (100% Correct)
|
|
145
135
|
const fallback = ["Amit", "Akash", "Aditi", "Arjun", "Kiran", "Nayan", "Vihaan", "Sania"];
|
|
146
136
|
const valid = fallback.filter(n => n.length >= min && n.length <= max);
|
|
147
137
|
return getRandom(valid.length > 0 ? valid : ["Amit"]);
|
|
148
138
|
}
|
|
149
|
-
|
|
150
|
-
module.exports = { getRandomName };
|
|
139
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA2JM,sCAAa;AAhJtB,MAAM,aAAa,GAAkB;IACjC,QAAQ,EAAE;QACN,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI;QACjE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QACjE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAChE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM;KAC5C;IACD,aAAa,EAAE;QACX,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC9E,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;QAClC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACrC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;QACpD,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QAC/C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;QACnC,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;QAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;QAClC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;QAC1B,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;QAC9B,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;QAChC,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;QACpC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QACnC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;QAC1B,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAClC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;QAChC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC5C,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;QACtB,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QAC3B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC5B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;QACjD,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;QAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;QAC5C,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;QAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAChD,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;QACnD,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC;QAChC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;QAC5B,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;QAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC1C,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC7B,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC1C,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;QAC3B,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;QAC7B,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC1C,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;QACzB,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;KAClC;IACD,iDAAiD;IACjD,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;CACtG,CAAC;AAEF,SAAS,SAAS,CAAC,GAAa;IAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,CAAC,EAAE,MAAc,EAAE;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,QAAQ,GAAG,GAAG,EAAE,CAAC;QACpB,IAAI,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAElD,oDAAoD;QACpD,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACnD,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnD,IAAI,YAAY,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YAChC,MAAM,IAAI,GAAa,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC;gBAC1D,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9C,IAAI,CAAC,IAAI;gBAAE,MAAM;YAEjB,iCAAiC;YACjC,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC9D,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBACvB,WAAW,EAAE,CAAC;YAClB,CAAC;YAED,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAAE,MAAM,CAAC,uBAAuB;YAEzE,IAAI,IAAI,IAAI,CAAC;YACb,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACtC,YAAY,GAAG,IAAI,CAAC;YAEpB,sEAAsE;YACtE,IAAI,IAAI,CAAC,MAAM,IAAI,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;gBACzD,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACjD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC3C,IAAI,IAAI,MAAM,CAAC;oBACf,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1B,uGAAuG;QACvG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,sCAAsC;QACtC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAEhD,6EAA6E;QAC7E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC3C,aAAa;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1E,yDAAyD;YACzD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC;QACD,QAAQ,EAAE,CAAC;IACf,CAAC;IAED,uCAAuC;IACvC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;IACvE,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "random-indian-names",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "High-quality, syllable-based random Indian name generator for Node.js.",
|
|
5
|
-
"main": "index.js",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
6
7
|
"files": [
|
|
7
|
-
"
|
|
8
|
+
"src",
|
|
9
|
+
"dist",
|
|
8
10
|
"README.md",
|
|
9
11
|
"LICENSE"
|
|
10
12
|
],
|
|
11
13
|
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
12
15
|
"test": "node test.js"
|
|
13
16
|
},
|
|
14
17
|
"keywords": [
|
|
@@ -18,9 +21,14 @@
|
|
|
18
21
|
"syllable-graph",
|
|
19
22
|
"random-names",
|
|
20
23
|
"faker",
|
|
21
|
-
"mock-data"
|
|
24
|
+
"mock-data",
|
|
25
|
+
"typescript"
|
|
22
26
|
],
|
|
23
27
|
"author": "Ashik A Jain",
|
|
24
28
|
"license": "MIT",
|
|
25
|
-
"type": "commonjs"
|
|
29
|
+
"type": "commonjs",
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^20.17.0",
|
|
32
|
+
"typescript": "^5.6.2"
|
|
33
|
+
}
|
|
26
34
|
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Random Indian Name Generator
|
|
3
|
+
* Syllable Graph Engine - Refined transitions with repetition guards.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
interface SyllableGraph {
|
|
8
|
+
starts: string[];
|
|
9
|
+
transitions: {
|
|
10
|
+
[key: string]: string[];
|
|
11
|
+
};
|
|
12
|
+
suffixes: string[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const syllableGraph: SyllableGraph = {
|
|
16
|
+
"starts": [
|
|
17
|
+
"A", "Ad", "Ak", "Am", "An", "Ar", "As", "Av", "Bha", "Cha", "De",
|
|
18
|
+
"Dha", "Ga", "Ha", "In", "Is", "Ja", "Ka", "Ki", "Ku", "La", "Ma",
|
|
19
|
+
"Mo", "Na", "Ni", "Pa", "Pr", "Ra", "Ri", "Ro", "Sa", "Sh", "Si",
|
|
20
|
+
"Su", "Ta", "Va", "Vi", "Ya", "U", "Yash"
|
|
21
|
+
],
|
|
22
|
+
"transitions": {
|
|
23
|
+
"A": ["mit", "kash", "nand", "jay", "dit", "vin", "run", "rav", "mrut", "man"],
|
|
24
|
+
"Ad": ["it", "iti", "ity", "vait"],
|
|
25
|
+
"Ak": ["ash", "shay", "rit"],
|
|
26
|
+
"Am": ["it", "rit", "ar", "an", "al"],
|
|
27
|
+
"An": ["it", "il", "and", "ish", "any", "uj", "ush"],
|
|
28
|
+
"Ar": ["un", "pit", "nav", "jun", "adh", "ind"],
|
|
29
|
+
"As": ["ha", "hish", "hok", "mita"],
|
|
30
|
+
"Av": ["i", "in", "inash"],
|
|
31
|
+
"Bha": ["rat", "nu", "vya", "kar"],
|
|
32
|
+
"Cha": ["it", "nd", "dan"],
|
|
33
|
+
"De": ["ep", "v", "van", "va"],
|
|
34
|
+
"Dha": ["ru", "nu", "nush", "v"],
|
|
35
|
+
"Ga": ["nesh", "ur", "tam", "yatri"],
|
|
36
|
+
"Ha": ["ri", "man", "rdik", "rish"],
|
|
37
|
+
"In": ["der", "di", "dra"],
|
|
38
|
+
"Is": ["ha", "han", "hani", "hit"],
|
|
39
|
+
"Ja": ["i", "tin", "ya", "tesh"],
|
|
40
|
+
"Ka": ["ran", "mal", "mita", "vita", "rtik"],
|
|
41
|
+
"Ki": ["ran", "shore"],
|
|
42
|
+
"Ku": ["nal", "mar", "ush"],
|
|
43
|
+
"La": ["lit", "kesh", "man"],
|
|
44
|
+
"Ma": ["dhav", "hesh", "nas", "nov", "noj", "ni"],
|
|
45
|
+
"Mo": ["han", "hit", "ni"],
|
|
46
|
+
"Na": ["man", "veen", "vya", "yan", "ndini"],
|
|
47
|
+
"Ni": ["khil", "ti", "dhi", "lesh", "raj"],
|
|
48
|
+
"Pa": ["kash", "raj", "nkaj", "rth", "yal"],
|
|
49
|
+
"Pr": ["ad", "ak", "am", "an", "at", "av", "it"],
|
|
50
|
+
"Ra": ["j", "jan", "jat", "hul", "m", "vi", "kesh"],
|
|
51
|
+
"Ri": ["shi", "tesh", "ya", "v"],
|
|
52
|
+
"Ro": ["han", "hit", "shni"],
|
|
53
|
+
"Sa": ["chin", "gar", "hil", "mir", "njay"],
|
|
54
|
+
"Sh": ["iv", "ivam", "ubh", "reya", "rut"],
|
|
55
|
+
"Si": ["d", "mran", "dharth"],
|
|
56
|
+
"Su": ["nil", "mit", "raj", "resh", "man"],
|
|
57
|
+
"Ta": ["run", "nmay", "nu"],
|
|
58
|
+
"Va": ["run", "ibhav", "ish"],
|
|
59
|
+
"Vi": ["jay", "nay", "nod", "shal", "vek"],
|
|
60
|
+
"Ya": ["sh", "ti", "min"],
|
|
61
|
+
"U": ["day", "ma", "rvi", "tk"]
|
|
62
|
+
},
|
|
63
|
+
// Special high-quality suffixes for longer names
|
|
64
|
+
"suffixes": ["kumar", "endra", "deep", "jeet", "prasad", "nath", "veer", "wati", "it", "esh", "an"]
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
function getRandom(arr: string[]) {
|
|
68
|
+
if (!arr || arr.length === 0) return "";
|
|
69
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function getRandomName(min: number = 3, max: number = 10): string {
|
|
73
|
+
if (typeof min !== 'number' || typeof max !== 'number') {
|
|
74
|
+
throw new Error("getRandomName requires numbers for min and max");
|
|
75
|
+
}
|
|
76
|
+
if (min < 2) {
|
|
77
|
+
throw new Error("minimum letters must be at least 2 for authentic Indian names");
|
|
78
|
+
}
|
|
79
|
+
if (min > 15 || max > 15) {
|
|
80
|
+
throw new Error("minimum and maximum letters cannot exceed 15 characters");
|
|
81
|
+
}
|
|
82
|
+
if (min > max) {
|
|
83
|
+
throw new Error("minimum letters cannot be greater than maximum letters");
|
|
84
|
+
}
|
|
85
|
+
let attempts = 0;
|
|
86
|
+
while (attempts < 500) {
|
|
87
|
+
let name = getRandom(syllableGraph.starts);
|
|
88
|
+
let usedSyllables = new Set([name.toLowerCase()]);
|
|
89
|
+
|
|
90
|
+
// Decide target length (favoring longer if min > 5)
|
|
91
|
+
const targetLength = max > 6 ?
|
|
92
|
+
Math.floor(Math.random() * (max - min + 1) + min) :
|
|
93
|
+
(Math.random() > 0.3 ? max : Math.max(min, 4));
|
|
94
|
+
|
|
95
|
+
let lastSyllable = name;
|
|
96
|
+
while (name.length < targetLength) {
|
|
97
|
+
const pool: string[] = syllableGraph.transitions[lastSyllable] ||
|
|
98
|
+
syllableGraph.transitions[name.slice(-2)] ||
|
|
99
|
+
syllableGraph.transitions[name.slice(-1)];
|
|
100
|
+
|
|
101
|
+
if (!pool) break;
|
|
102
|
+
|
|
103
|
+
// Pick a non-repetitive syllable
|
|
104
|
+
let next = getRandom(pool);
|
|
105
|
+
let subAttempts = 0;
|
|
106
|
+
while (usedSyllables.has(next.toLowerCase()) && subAttempts < 5) {
|
|
107
|
+
next = getRandom(pool);
|
|
108
|
+
subAttempts++;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (usedSyllables.has(next.toLowerCase())) break; // Avoid infinite loops
|
|
112
|
+
|
|
113
|
+
name += next;
|
|
114
|
+
usedSyllables.add(next.toLowerCase());
|
|
115
|
+
lastSyllable = next;
|
|
116
|
+
|
|
117
|
+
// Chance to attach a high-quality suffix if we are near target length
|
|
118
|
+
if (name.length >= targetLength - 4 && Math.random() > 0.6) {
|
|
119
|
+
const suffix = getRandom(syllableGraph.suffixes);
|
|
120
|
+
if (!usedSyllables.has(suffix.toLowerCase())) {
|
|
121
|
+
name += suffix;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Clean up and normalization
|
|
128
|
+
name = name.toLowerCase();
|
|
129
|
+
|
|
130
|
+
// Clean double vowels but PRESERVE 'ee' and 'oo' as they are common in Indian names (e.g., Deep, Jeet)
|
|
131
|
+
name = name.replace(/([aeiou])\1/gi, (match) => {
|
|
132
|
+
const low = match.toLowerCase();
|
|
133
|
+
return (low === 'ee' || low === 'oo') ? match : match[0];
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Remove impossible triple consonants
|
|
137
|
+
name = name.replace(/([^aeiou])\1\1/gi, '$1$1');
|
|
138
|
+
|
|
139
|
+
// Fix "Utktk" and similar issues by preventing identical vowel-less clusters
|
|
140
|
+
name = name.replace(/(tk|rt|rk)\1/gi, '$1');
|
|
141
|
+
|
|
142
|
+
if (name.length >= min && name.length <= max) {
|
|
143
|
+
// Capitalize
|
|
144
|
+
const result = name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
|
|
145
|
+
// Final authenticity check: Must not look like gibberish
|
|
146
|
+
if (!/([^aeiou]){4,}/i.test(result)) {
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
attempts++;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// High Quality Fallback (100% Correct)
|
|
154
|
+
const fallback = ["Amit", "Akash", "Aditi", "Arjun", "Kiran", "Nayan", "Vihaan", "Sania"];
|
|
155
|
+
const valid = fallback.filter(n => n.length >= min && n.length <= max);
|
|
156
|
+
return getRandom(valid.length > 0 ? valid : ["Amit"]);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export { getRandomName };
|