random-indian-names 1.0.1 → 1.1.0

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.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Random Indian Name Generator
3
+ * Syllable Graph Engine - Refined transitions with repetition guards.
4
+ */
5
+ declare function getRandomName(min?: number, max?: number): string;
6
+ export { getRandomName };
@@ -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) return "";
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
- if (!pool) break;
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
- if (usedSyllables.has(next.toLowerCase())) break; // Avoid infinite loops
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":"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"}
package/package.json CHANGED
@@ -1,14 +1,17 @@
1
1
  {
2
2
  "name": "random-indian-names",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
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
- "index.js",
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 };