@lacspace/nepali-utils 1.0.3 → 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.
- package/README.md +30 -0
- package/dist/index.cjs +363 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +66 -1
- package/dist/index.d.ts +66 -1
- package/dist/index.js +345 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -94,6 +94,36 @@ PROVINCES[2];
|
|
|
94
94
|
| [`@lacspace/sdk`](https://www.npmjs.com/package/@lacspace/sdk) | Full Lacspace platform SDK |
|
|
95
95
|
| [`@lacspace/react`](https://www.npmjs.com/package/@lacspace/react) | React hooks |
|
|
96
96
|
|
|
97
|
+
## New in 1.1 — land units, carriers, districts & Nepali words
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
import {
|
|
101
|
+
landToSqMeters, sqMetersToRopani, convertLand, formatRopani,
|
|
102
|
+
normalizeMobile, getCarrier, ungroupNepali, formatCompactNPR,
|
|
103
|
+
DISTRICTS, districtsByProvince, findDistrict,
|
|
104
|
+
numberToWordsNepali, amountInWordsNepali,
|
|
105
|
+
} from "@lacspace/nepali-utils";
|
|
106
|
+
|
|
107
|
+
// Land area — the thing nobody else packages (hilly ↔ terai ↔ metric)
|
|
108
|
+
const m2 = landToSqMeters({ ropani: 2, aana: 3 }); // → 1078.9 m²
|
|
109
|
+
sqMetersToRopani(m2); // { ropani: 2, aana: 3, paisa: 0, daam: 0 }
|
|
110
|
+
convertLand(1, "bigha", "kattha"); // 20
|
|
111
|
+
formatRopani(m2); // "2-3-0-0"
|
|
112
|
+
|
|
113
|
+
// Phones
|
|
114
|
+
normalizeMobile("984-123 4567"); // "+9779841234567"
|
|
115
|
+
getCarrier("9801234567"); // "Ncell"
|
|
116
|
+
|
|
117
|
+
// Money & geography
|
|
118
|
+
ungroupNepali("Rs. 12,34,567.50"); // 1234567.5
|
|
119
|
+
formatCompactNPR(1234567, { nepali: true }); // "Rs. 12.35 लाख"
|
|
120
|
+
districtsByProvince(3); // 13 Bagmati districts
|
|
121
|
+
findDistrict("काठमाडौं")?.province; // 3
|
|
122
|
+
|
|
123
|
+
// Invoices in Nepali
|
|
124
|
+
amountInWordsNepali(1500.5); // "रुपैयाँ एक हजार पाँच सय पचास पैसा मात्र"
|
|
125
|
+
```
|
|
126
|
+
|
|
97
127
|
## Licensing
|
|
98
128
|
|
|
99
129
|
This package is **free** under the **[Lacspace Free Licence](https://lacspace.com/licenses/lacspace-free-1.0)** — MIT-equivalent freedoms. Use it in personal and commercial projects at no cost; just keep the notice.
|
package/dist/index.cjs
CHANGED
|
@@ -82,13 +82,263 @@ function amountInWords(amount) {
|
|
|
82
82
|
if (paisa > 0) out += " and " + numberToWords(paisa) + " Paisa";
|
|
83
83
|
return (amount < 0 ? "Minus " : "") + out + " Only";
|
|
84
84
|
}
|
|
85
|
+
function ungroupNepali(input) {
|
|
86
|
+
let s = fromDevanagari(String(input)).trim();
|
|
87
|
+
const negative = s.startsWith("-");
|
|
88
|
+
s = s.replace(/₹|rs\.?|npr|रू\.?|रु\.?/gi, "");
|
|
89
|
+
s = s.replace(/[^\d.]/g, "");
|
|
90
|
+
if (s === "") return NaN;
|
|
91
|
+
const num = Number(s);
|
|
92
|
+
return negative && !Number.isNaN(num) ? -num : num;
|
|
93
|
+
}
|
|
94
|
+
var parseNPR = ungroupNepali;
|
|
95
|
+
function trimNum(n) {
|
|
96
|
+
return Number(n.toFixed(2)).toString();
|
|
97
|
+
}
|
|
98
|
+
function formatCompactNPR(amount, options = {}) {
|
|
99
|
+
const { symbol = "Rs. ", nepali = false, devanagari = false } = options;
|
|
100
|
+
const negative = amount < 0;
|
|
101
|
+
const a = Math.abs(amount);
|
|
102
|
+
const units = [
|
|
103
|
+
[1e9, "Arab", "\u0905\u0930\u092C"],
|
|
104
|
+
[1e7, "Cr", "\u0915\u0930\u094B\u0921"],
|
|
105
|
+
[1e5, "Lakh", "\u0932\u093E\u0916"],
|
|
106
|
+
[1e3, "K", "\u0939\u091C\u093E\u0930"]
|
|
107
|
+
];
|
|
108
|
+
let out;
|
|
109
|
+
const u = units.find(([size]) => a >= size);
|
|
110
|
+
if (u) out = `${trimNum(a / u[0])} ${nepali ? u[2] : u[1]}`;
|
|
111
|
+
else out = trimNum(a);
|
|
112
|
+
if (devanagari) out = toDevanagari(out);
|
|
113
|
+
return (negative ? "-" : "") + symbol + out;
|
|
114
|
+
}
|
|
115
|
+
var LAND_UNIT_SQM = {
|
|
116
|
+
ropani: 508.7369,
|
|
117
|
+
// 5476 sq ft
|
|
118
|
+
aana: 31.79606,
|
|
119
|
+
// ropani / 16
|
|
120
|
+
paisa: 7.949014,
|
|
121
|
+
// ropani / 64
|
|
122
|
+
daam: 1.987254,
|
|
123
|
+
// ropani / 256
|
|
124
|
+
bigha: 6772.631,
|
|
125
|
+
// 72900 sq ft
|
|
126
|
+
kattha: 338.6315,
|
|
127
|
+
// bigha / 20
|
|
128
|
+
dhur: 16.93158,
|
|
129
|
+
// bigha / 400
|
|
130
|
+
sqm: 1,
|
|
131
|
+
sqft: 0.09290304
|
|
132
|
+
};
|
|
133
|
+
function landToSqMeters(measure) {
|
|
134
|
+
let m2 = 0;
|
|
135
|
+
for (const [unit, value] of Object.entries(measure)) m2 += (value ?? 0) * LAND_UNIT_SQM[unit];
|
|
136
|
+
return m2;
|
|
137
|
+
}
|
|
138
|
+
function convertLand(value, from, to) {
|
|
139
|
+
return value * LAND_UNIT_SQM[from] / LAND_UNIT_SQM[to];
|
|
140
|
+
}
|
|
141
|
+
function sqMetersToRopani(m2) {
|
|
142
|
+
let rem = m2;
|
|
143
|
+
const ropani = Math.floor(rem / LAND_UNIT_SQM.ropani);
|
|
144
|
+
rem -= ropani * LAND_UNIT_SQM.ropani;
|
|
145
|
+
const aana = Math.floor(rem / LAND_UNIT_SQM.aana);
|
|
146
|
+
rem -= aana * LAND_UNIT_SQM.aana;
|
|
147
|
+
const paisa = Math.floor(rem / LAND_UNIT_SQM.paisa);
|
|
148
|
+
rem -= paisa * LAND_UNIT_SQM.paisa;
|
|
149
|
+
const daam = Math.round(rem / LAND_UNIT_SQM.daam);
|
|
150
|
+
return carryRopani({ ropani, aana, paisa, daam });
|
|
151
|
+
}
|
|
152
|
+
function carryRopani(r) {
|
|
153
|
+
if (r.daam >= 4) {
|
|
154
|
+
r.paisa += Math.floor(r.daam / 4);
|
|
155
|
+
r.daam %= 4;
|
|
156
|
+
}
|
|
157
|
+
if (r.paisa >= 4) {
|
|
158
|
+
r.aana += Math.floor(r.paisa / 4);
|
|
159
|
+
r.paisa %= 4;
|
|
160
|
+
}
|
|
161
|
+
if (r.aana >= 16) {
|
|
162
|
+
r.ropani += Math.floor(r.aana / 16);
|
|
163
|
+
r.aana %= 16;
|
|
164
|
+
}
|
|
165
|
+
return r;
|
|
166
|
+
}
|
|
167
|
+
function sqMetersToBigha(m2) {
|
|
168
|
+
let rem = m2;
|
|
169
|
+
const bigha = Math.floor(rem / LAND_UNIT_SQM.bigha);
|
|
170
|
+
rem -= bigha * LAND_UNIT_SQM.bigha;
|
|
171
|
+
const kattha = Math.floor(rem / LAND_UNIT_SQM.kattha);
|
|
172
|
+
rem -= kattha * LAND_UNIT_SQM.kattha;
|
|
173
|
+
const dhur = Math.round(rem / LAND_UNIT_SQM.dhur);
|
|
174
|
+
if (dhur >= 20) return { bigha: bigha + Math.floor(dhur / 20), kattha, dhur: dhur % 20 };
|
|
175
|
+
if (kattha >= 20) return { bigha: bigha + Math.floor(kattha / 20), kattha: kattha % 20, dhur };
|
|
176
|
+
return { bigha, kattha, dhur };
|
|
177
|
+
}
|
|
178
|
+
function formatRopani(m2) {
|
|
179
|
+
const r = sqMetersToRopani(m2);
|
|
180
|
+
return `${r.ropani}-${r.aana}-${r.paisa}-${r.daam}`;
|
|
181
|
+
}
|
|
182
|
+
function formatBigha(m2) {
|
|
183
|
+
const b = sqMetersToBigha(m2);
|
|
184
|
+
return `${b.bigha}-${b.kattha}-${b.dhur}`;
|
|
185
|
+
}
|
|
186
|
+
function normalizeMobile(input) {
|
|
187
|
+
const s = fromDevanagari(input).replace(/[\s-]/g, "").replace(/^\+?977/, "");
|
|
188
|
+
return /^9[678]\d{8}$/.test(s) ? `+977${s}` : null;
|
|
189
|
+
}
|
|
190
|
+
function getCarrier(input) {
|
|
191
|
+
const n = normalizeMobile(input);
|
|
192
|
+
if (!n) return "unknown";
|
|
193
|
+
const p = n.slice(4, 7);
|
|
194
|
+
if (["984", "985", "986", "974", "975"].includes(p)) return "Ntc";
|
|
195
|
+
if (["980", "981", "982"].includes(p)) return "Ncell";
|
|
196
|
+
if (["961", "962", "988"].includes(p)) return "Smart Cell";
|
|
197
|
+
if (p === "972") return "UTL";
|
|
198
|
+
return "unknown";
|
|
199
|
+
}
|
|
85
200
|
function isValidNepaliMobile(input) {
|
|
86
|
-
const s = input.replace(/[\s-]/g, "");
|
|
201
|
+
const s = fromDevanagari(input).replace(/[\s-]/g, "");
|
|
87
202
|
return /^(\+?977)?9[678]\d{8}$/.test(s);
|
|
88
203
|
}
|
|
204
|
+
function isValidLandline(input) {
|
|
205
|
+
const s = input.replace(/[\s-]/g, "");
|
|
206
|
+
return /^0\d{7,9}$/.test(s);
|
|
207
|
+
}
|
|
89
208
|
function isValidPAN(input) {
|
|
90
209
|
return /^\d{9}$/.test(input.trim());
|
|
91
210
|
}
|
|
211
|
+
var isValidVAT = isValidPAN;
|
|
212
|
+
var NEPALI_0_99 = [
|
|
213
|
+
"\u0936\u0942\u0928\u094D\u092F",
|
|
214
|
+
"\u090F\u0915",
|
|
215
|
+
"\u0926\u0941\u0908",
|
|
216
|
+
"\u0924\u0940\u0928",
|
|
217
|
+
"\u091A\u093E\u0930",
|
|
218
|
+
"\u092A\u093E\u0901\u091A",
|
|
219
|
+
"\u091B",
|
|
220
|
+
"\u0938\u093E\u0924",
|
|
221
|
+
"\u0906\u0920",
|
|
222
|
+
"\u0928\u094C",
|
|
223
|
+
"\u0926\u0938",
|
|
224
|
+
"\u090F\u0918\u093E\u0930",
|
|
225
|
+
"\u092C\u093E\u0939\u094D\u0930",
|
|
226
|
+
"\u0924\u0947\u0939\u094D\u0930",
|
|
227
|
+
"\u091A\u094C\u0927",
|
|
228
|
+
"\u092A\u0928\u094D\u0927\u094D\u0930",
|
|
229
|
+
"\u0938\u094B\u0939\u094D\u0930",
|
|
230
|
+
"\u0938\u0924\u094D\u0930",
|
|
231
|
+
"\u0905\u0920\u093E\u0930",
|
|
232
|
+
"\u0909\u0928\u094D\u0928\u093E\u0907\u0938",
|
|
233
|
+
"\u092C\u0940\u0938",
|
|
234
|
+
"\u090F\u0915\u094D\u0915\u093E\u0907\u0938",
|
|
235
|
+
"\u092C\u093E\u0907\u0938",
|
|
236
|
+
"\u0924\u0947\u0907\u0938",
|
|
237
|
+
"\u091A\u094C\u092C\u093F\u0938",
|
|
238
|
+
"\u092A\u091A\u094D\u091A\u093F\u0938",
|
|
239
|
+
"\u091B\u092C\u094D\u092C\u093F\u0938",
|
|
240
|
+
"\u0938\u0924\u094D\u0924\u093E\u0907\u0938",
|
|
241
|
+
"\u0905\u0920\u094D\u0920\u093E\u0907\u0938",
|
|
242
|
+
"\u0909\u0928\u0928\u094D\u0924\u093F\u0938",
|
|
243
|
+
"\u0924\u093F\u0938",
|
|
244
|
+
"\u090F\u0915\u0924\u093F\u0938",
|
|
245
|
+
"\u092C\u0924\u094D\u0924\u093F\u0938",
|
|
246
|
+
"\u0924\u0947\u0924\u094D\u0924\u093F\u0938",
|
|
247
|
+
"\u091A\u094C\u0901\u0924\u093F\u0938",
|
|
248
|
+
"\u092A\u0948\u0901\u0924\u093F\u0938",
|
|
249
|
+
"\u091B\u0924\u094D\u0924\u093F\u0938",
|
|
250
|
+
"\u0938\u0948\u0901\u0924\u093F\u0938",
|
|
251
|
+
"\u0905\u0920\u0924\u093F\u0938",
|
|
252
|
+
"\u0909\u0928\u0928\u094D\u091A\u093E\u0932\u093F\u0938",
|
|
253
|
+
"\u091A\u093E\u0932\u093F\u0938",
|
|
254
|
+
"\u090F\u0915\u091A\u093E\u0932\u093F\u0938",
|
|
255
|
+
"\u092C\u092F\u093E\u0932\u093F\u0938",
|
|
256
|
+
"\u0924\u094D\u0930\u093F\u091A\u093E\u0932\u093F\u0938",
|
|
257
|
+
"\u091A\u0935\u093E\u0932\u093F\u0938",
|
|
258
|
+
"\u092A\u0948\u0901\u0924\u093E\u0932\u093F\u0938",
|
|
259
|
+
"\u091B\u092F\u093E\u0932\u093F\u0938",
|
|
260
|
+
"\u0938\u0924\u091A\u093E\u0932\u093F\u0938",
|
|
261
|
+
"\u0905\u0920\u091A\u093E\u0932\u093F\u0938",
|
|
262
|
+
"\u0909\u0928\u0928\u094D\u091A\u093E\u0938",
|
|
263
|
+
"\u092A\u091A\u093E\u0938",
|
|
264
|
+
"\u090F\u0915\u093E\u0909\u0928\u094D\u0928",
|
|
265
|
+
"\u092C\u093E\u0909\u0928\u094D\u0928",
|
|
266
|
+
"\u0924\u094D\u0930\u093F\u092A\u0928\u094D\u0928",
|
|
267
|
+
"\u091A\u0935\u0928\u094D\u0928",
|
|
268
|
+
"\u092A\u091A\u092A\u0928\u094D\u0928",
|
|
269
|
+
"\u091B\u092A\u0928\u094D\u0928",
|
|
270
|
+
"\u0938\u0928\u094D\u0924\u093E\u0909\u0928\u094D\u0928",
|
|
271
|
+
"\u0905\u0928\u094D\u0920\u093E\u0909\u0928\u094D\u0928",
|
|
272
|
+
"\u0909\u0928\u0928\u094D\u0938\u093E\u0920\u0940",
|
|
273
|
+
"\u0938\u093E\u0920\u0940",
|
|
274
|
+
"\u090F\u0915\u0938\u091F\u094D\u0920\u0940",
|
|
275
|
+
"\u092C\u092F\u0938\u091F\u094D\u0920\u0940",
|
|
276
|
+
"\u0924\u094D\u0930\u093F\u0938\u091F\u094D\u0920\u0940",
|
|
277
|
+
"\u091A\u094C\u0902\u0938\u091F\u094D\u0920\u0940",
|
|
278
|
+
"\u092A\u0948\u0902\u0938\u091F\u094D\u0920\u0940",
|
|
279
|
+
"\u091B\u092F\u0938\u091F\u094D\u0920\u0940",
|
|
280
|
+
"\u0938\u0924\u0938\u091F\u094D\u0920\u0940",
|
|
281
|
+
"\u0905\u0920\u0938\u091F\u094D\u0920\u0940",
|
|
282
|
+
"\u0909\u0928\u0928\u094D\u0938\u0924\u094D\u0924\u0930\u0940",
|
|
283
|
+
"\u0938\u0924\u094D\u0924\u0930\u0940",
|
|
284
|
+
"\u090F\u0915\u0939\u0924\u094D\u0924\u0930",
|
|
285
|
+
"\u092C\u0939\u0924\u094D\u0924\u0930",
|
|
286
|
+
"\u0924\u094D\u0930\u093F\u0939\u0924\u094D\u0924\u0930",
|
|
287
|
+
"\u091A\u094C\u0939\u0924\u094D\u0924\u0930",
|
|
288
|
+
"\u092A\u091A\u0939\u0924\u094D\u0924\u0930",
|
|
289
|
+
"\u091B\u092F\u0939\u0924\u094D\u0924\u0930",
|
|
290
|
+
"\u0938\u0924\u0939\u0924\u094D\u0924\u0930",
|
|
291
|
+
"\u0905\u0920\u0939\u0924\u094D\u0924\u0930",
|
|
292
|
+
"\u0909\u0928\u093E\u0938\u0940",
|
|
293
|
+
"\u0905\u0938\u0940",
|
|
294
|
+
"\u090F\u0915\u093E\u0938\u0940",
|
|
295
|
+
"\u092C\u092F\u093E\u0938\u0940",
|
|
296
|
+
"\u0924\u094D\u0930\u093F\u092F\u093E\u0938\u0940",
|
|
297
|
+
"\u091A\u094C\u0930\u093E\u0938\u0940",
|
|
298
|
+
"\u092A\u091A\u093E\u0938\u0940",
|
|
299
|
+
"\u091B\u092F\u093E\u0938\u0940",
|
|
300
|
+
"\u0938\u0924\u093E\u0938\u0940",
|
|
301
|
+
"\u0905\u0920\u093E\u0938\u0940",
|
|
302
|
+
"\u0909\u0928\u093E\u0928\u094D\u0928\u092C\u094D\u092C\u0947",
|
|
303
|
+
"\u0928\u092C\u094D\u092C\u0947",
|
|
304
|
+
"\u090F\u0915\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
305
|
+
"\u092C\u092F\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
306
|
+
"\u0924\u094D\u0930\u093F\u092F\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
307
|
+
"\u091A\u094C\u0930\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
308
|
+
"\u092A\u0928\u094D\u091A\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
309
|
+
"\u091B\u092F\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
310
|
+
"\u0938\u0928\u094D\u0924\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
311
|
+
"\u0905\u0928\u094D\u0920\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
312
|
+
"\u0909\u0928\u093E\u0928\u094D\u0938\u092F"
|
|
313
|
+
];
|
|
314
|
+
function numberToWordsNepali(value) {
|
|
315
|
+
let n = Math.floor(Math.abs(value));
|
|
316
|
+
if (n === 0) return NEPALI_0_99[0];
|
|
317
|
+
const parts = [];
|
|
318
|
+
const units = [
|
|
319
|
+
[1e9, "\u0905\u0930\u092C"],
|
|
320
|
+
[1e7, "\u0915\u0930\u094B\u0921"],
|
|
321
|
+
[1e5, "\u0932\u093E\u0916"],
|
|
322
|
+
[1e3, "\u0939\u091C\u093E\u0930"],
|
|
323
|
+
[100, "\u0938\u092F"]
|
|
324
|
+
];
|
|
325
|
+
for (const [size, name] of units) {
|
|
326
|
+
if (n >= size) {
|
|
327
|
+
const count = Math.floor(n / size);
|
|
328
|
+
parts.push(`${NEPALI_0_99[count]} ${name}`);
|
|
329
|
+
n %= size;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (n > 0) parts.push(NEPALI_0_99[n]);
|
|
333
|
+
return (value < 0 ? "\u092E\u093E\u0907\u0928\u0938 " : "") + parts.join(" ");
|
|
334
|
+
}
|
|
335
|
+
function amountInWordsNepali(amount) {
|
|
336
|
+
const rupees = Math.floor(Math.abs(amount));
|
|
337
|
+
const paisa = Math.round((Math.abs(amount) - rupees) * 100);
|
|
338
|
+
let out = "\u0930\u0941\u092A\u0948\u092F\u093E\u0901 " + numberToWordsNepali(rupees);
|
|
339
|
+
if (paisa > 0) out += " " + numberToWordsNepali(paisa) + " \u092A\u0948\u0938\u093E";
|
|
340
|
+
return (amount < 0 ? "\u092E\u093E\u0907\u0928\u0938 " : "") + out + " \u092E\u093E\u0924\u094D\u0930";
|
|
341
|
+
}
|
|
92
342
|
var PROVINCES = [
|
|
93
343
|
{ number: 1, name: "Koshi", nameNp: "\u0915\u094B\u0936\u0940", capital: "Biratnagar" },
|
|
94
344
|
{ number: 2, name: "Madhesh", nameNp: "\u092E\u0927\u0947\u0936", capital: "Janakpur" },
|
|
@@ -98,15 +348,127 @@ var PROVINCES = [
|
|
|
98
348
|
{ number: 6, name: "Karnali", nameNp: "\u0915\u0930\u094D\u0923\u093E\u0932\u0940", capital: "Birendranagar" },
|
|
99
349
|
{ number: 7, name: "Sudurpashchim", nameNp: "\u0938\u0941\u0926\u0942\u0930\u092A\u0936\u094D\u091A\u093F\u092E", capital: "Godawari" }
|
|
100
350
|
];
|
|
351
|
+
var DISTRICTS = [
|
|
352
|
+
// Koshi (1)
|
|
353
|
+
{ name: "Bhojpur", nameNp: "\u092D\u094B\u091C\u092A\u0941\u0930", province: 1 },
|
|
354
|
+
{ name: "Dhankuta", nameNp: "\u0927\u0928\u0915\u0941\u091F\u093E", province: 1 },
|
|
355
|
+
{ name: "Ilam", nameNp: "\u0907\u0932\u093E\u092E", province: 1 },
|
|
356
|
+
{ name: "Jhapa", nameNp: "\u091D\u093E\u092A\u093E", province: 1 },
|
|
357
|
+
{ name: "Khotang", nameNp: "\u0916\u094B\u091F\u093E\u0919", province: 1 },
|
|
358
|
+
{ name: "Morang", nameNp: "\u092E\u094B\u0930\u0919", province: 1 },
|
|
359
|
+
{ name: "Okhaldhunga", nameNp: "\u0913\u0916\u0932\u0922\u0941\u0902\u0917\u093E", province: 1 },
|
|
360
|
+
{ name: "Panchthar", nameNp: "\u092A\u093E\u0901\u091A\u0925\u0930", province: 1 },
|
|
361
|
+
{ name: "Sankhuwasabha", nameNp: "\u0938\u0902\u0916\u0941\u0935\u093E\u0938\u092D\u093E", province: 1 },
|
|
362
|
+
{ name: "Solukhumbu", nameNp: "\u0938\u094B\u0932\u0941\u0916\u0941\u092E\u094D\u092C\u0941", province: 1 },
|
|
363
|
+
{ name: "Sunsari", nameNp: "\u0938\u0941\u0928\u0938\u0930\u0940", province: 1 },
|
|
364
|
+
{ name: "Taplejung", nameNp: "\u0924\u093E\u092A\u094D\u0932\u0947\u091C\u0941\u0919", province: 1 },
|
|
365
|
+
{ name: "Terhathum", nameNp: "\u0924\u0947\u0939\u094D\u0930\u0925\u0941\u092E", province: 1 },
|
|
366
|
+
{ name: "Udayapur", nameNp: "\u0909\u0926\u092F\u092A\u0941\u0930", province: 1 },
|
|
367
|
+
// Madhesh (2)
|
|
368
|
+
{ name: "Bara", nameNp: "\u092C\u093E\u0930\u093E", province: 2 },
|
|
369
|
+
{ name: "Dhanusha", nameNp: "\u0927\u0928\u0941\u0937\u093E", province: 2 },
|
|
370
|
+
{ name: "Mahottari", nameNp: "\u092E\u0939\u094B\u0924\u094D\u0924\u0930\u0940", province: 2 },
|
|
371
|
+
{ name: "Parsa", nameNp: "\u092A\u0930\u094D\u0938\u093E", province: 2 },
|
|
372
|
+
{ name: "Rautahat", nameNp: "\u0930\u094C\u0924\u0939\u091F", province: 2 },
|
|
373
|
+
{ name: "Saptari", nameNp: "\u0938\u092A\u094D\u0924\u0930\u0940", province: 2 },
|
|
374
|
+
{ name: "Sarlahi", nameNp: "\u0938\u0930\u094D\u0932\u093E\u0939\u0940", province: 2 },
|
|
375
|
+
{ name: "Siraha", nameNp: "\u0938\u093F\u0930\u0939\u093E", province: 2 },
|
|
376
|
+
// Bagmati (3)
|
|
377
|
+
{ name: "Bhaktapur", nameNp: "\u092D\u0915\u094D\u0924\u092A\u0941\u0930", province: 3 },
|
|
378
|
+
{ name: "Chitwan", nameNp: "\u091A\u093F\u0924\u0935\u0928", province: 3 },
|
|
379
|
+
{ name: "Dhading", nameNp: "\u0927\u093E\u0926\u093F\u0919", province: 3 },
|
|
380
|
+
{ name: "Dolakha", nameNp: "\u0926\u094B\u0932\u0916\u093E", province: 3 },
|
|
381
|
+
{ name: "Kathmandu", nameNp: "\u0915\u093E\u0920\u092E\u093E\u0921\u094C\u0902", province: 3 },
|
|
382
|
+
{ name: "Kavrepalanchok", nameNp: "\u0915\u093E\u092D\u094D\u0930\u0947\u092A\u0932\u093E\u091E\u094D\u091A\u094B\u0915", province: 3 },
|
|
383
|
+
{ name: "Lalitpur", nameNp: "\u0932\u0932\u093F\u0924\u092A\u0941\u0930", province: 3 },
|
|
384
|
+
{ name: "Makwanpur", nameNp: "\u092E\u0915\u0935\u093E\u0928\u092A\u0941\u0930", province: 3 },
|
|
385
|
+
{ name: "Nuwakot", nameNp: "\u0928\u0941\u0935\u093E\u0915\u094B\u091F", province: 3 },
|
|
386
|
+
{ name: "Ramechhap", nameNp: "\u0930\u093E\u092E\u0947\u091B\u093E\u092A", province: 3 },
|
|
387
|
+
{ name: "Rasuwa", nameNp: "\u0930\u0938\u0941\u0935\u093E", province: 3 },
|
|
388
|
+
{ name: "Sindhuli", nameNp: "\u0938\u093F\u0928\u094D\u0927\u0941\u0932\u0940", province: 3 },
|
|
389
|
+
{ name: "Sindhupalchok", nameNp: "\u0938\u093F\u0928\u094D\u0927\u0941\u092A\u093E\u0932\u094D\u091A\u094B\u0915", province: 3 },
|
|
390
|
+
// Gandaki (4)
|
|
391
|
+
{ name: "Baglung", nameNp: "\u092C\u093E\u0917\u0932\u0941\u0919", province: 4 },
|
|
392
|
+
{ name: "Gorkha", nameNp: "\u0917\u094B\u0930\u0916\u093E", province: 4 },
|
|
393
|
+
{ name: "Kaski", nameNp: "\u0915\u093E\u0938\u094D\u0915\u0940", province: 4 },
|
|
394
|
+
{ name: "Lamjung", nameNp: "\u0932\u092E\u091C\u0941\u0919", province: 4 },
|
|
395
|
+
{ name: "Manang", nameNp: "\u092E\u0928\u093E\u0919", province: 4 },
|
|
396
|
+
{ name: "Mustang", nameNp: "\u092E\u0941\u0938\u094D\u0924\u093E\u0919", province: 4 },
|
|
397
|
+
{ name: "Myagdi", nameNp: "\u092E\u094D\u092F\u093E\u0917\u094D\u0926\u0940", province: 4 },
|
|
398
|
+
{ name: "Nawalpur", nameNp: "\u0928\u0935\u0932\u092A\u0941\u0930", province: 4 },
|
|
399
|
+
{ name: "Parbat", nameNp: "\u092A\u0930\u094D\u0935\u0924", province: 4 },
|
|
400
|
+
{ name: "Syangja", nameNp: "\u0938\u094D\u092F\u093E\u0919\u094D\u091C\u093E", province: 4 },
|
|
401
|
+
{ name: "Tanahun", nameNp: "\u0924\u0928\u0939\u0941\u0901", province: 4 },
|
|
402
|
+
// Lumbini (5)
|
|
403
|
+
{ name: "Arghakhanchi", nameNp: "\u0905\u0930\u094D\u0918\u093E\u0916\u093E\u0901\u091A\u0940", province: 5 },
|
|
404
|
+
{ name: "Banke", nameNp: "\u092C\u093E\u0901\u0915\u0947", province: 5 },
|
|
405
|
+
{ name: "Bardiya", nameNp: "\u092C\u0930\u094D\u0926\u093F\u092F\u093E", province: 5 },
|
|
406
|
+
{ name: "Dang", nameNp: "\u0926\u093E\u0919", province: 5 },
|
|
407
|
+
{ name: "Eastern Rukum", nameNp: "\u092A\u0942\u0930\u094D\u0935\u0940 \u0930\u0941\u0915\u0941\u092E", province: 5 },
|
|
408
|
+
{ name: "Gulmi", nameNp: "\u0917\u0941\u0932\u094D\u092E\u0940", province: 5 },
|
|
409
|
+
{ name: "Kapilvastu", nameNp: "\u0915\u092A\u093F\u0932\u0935\u0938\u094D\u0924\u0941", province: 5 },
|
|
410
|
+
{ name: "Parasi", nameNp: "\u0928\u0935\u0932\u092A\u0930\u093E\u0938\u0940 (\u092A\u0936\u094D\u091A\u093F\u092E)", province: 5 },
|
|
411
|
+
{ name: "Palpa", nameNp: "\u092A\u093E\u0932\u094D\u092A\u093E", province: 5 },
|
|
412
|
+
{ name: "Pyuthan", nameNp: "\u092A\u094D\u092F\u0941\u0920\u093E\u0928", province: 5 },
|
|
413
|
+
{ name: "Rolpa", nameNp: "\u0930\u094B\u0932\u094D\u092A\u093E", province: 5 },
|
|
414
|
+
{ name: "Rupandehi", nameNp: "\u0930\u0942\u092A\u0928\u094D\u0926\u0947\u0939\u0940", province: 5 },
|
|
415
|
+
// Karnali (6)
|
|
416
|
+
{ name: "Dailekh", nameNp: "\u0926\u0948\u0932\u0947\u0916", province: 6 },
|
|
417
|
+
{ name: "Dolpa", nameNp: "\u0921\u094B\u0932\u094D\u092A\u093E", province: 6 },
|
|
418
|
+
{ name: "Humla", nameNp: "\u0939\u0941\u092E\u094D\u0932\u093E", province: 6 },
|
|
419
|
+
{ name: "Jajarkot", nameNp: "\u091C\u093E\u091C\u0930\u0915\u094B\u091F", province: 6 },
|
|
420
|
+
{ name: "Jumla", nameNp: "\u091C\u0941\u092E\u094D\u0932\u093E", province: 6 },
|
|
421
|
+
{ name: "Kalikot", nameNp: "\u0915\u093E\u0932\u093F\u0915\u094B\u091F", province: 6 },
|
|
422
|
+
{ name: "Mugu", nameNp: "\u092E\u0941\u0917\u0941", province: 6 },
|
|
423
|
+
{ name: "Salyan", nameNp: "\u0938\u0932\u094D\u092F\u093E\u0928", province: 6 },
|
|
424
|
+
{ name: "Surkhet", nameNp: "\u0938\u0941\u0930\u094D\u0916\u0947\u0924", province: 6 },
|
|
425
|
+
{ name: "Western Rukum", nameNp: "\u092A\u0936\u094D\u091A\u093F\u092E\u0940 \u0930\u0941\u0915\u0941\u092E", province: 6 },
|
|
426
|
+
// Sudurpashchim (7)
|
|
427
|
+
{ name: "Achham", nameNp: "\u0905\u091B\u093E\u092E", province: 7 },
|
|
428
|
+
{ name: "Baitadi", nameNp: "\u092C\u0948\u0924\u0921\u0940", province: 7 },
|
|
429
|
+
{ name: "Bajhang", nameNp: "\u092C\u091D\u093E\u0919", province: 7 },
|
|
430
|
+
{ name: "Bajura", nameNp: "\u092C\u093E\u091C\u0941\u0930\u093E", province: 7 },
|
|
431
|
+
{ name: "Dadeldhura", nameNp: "\u0921\u0921\u0947\u0932\u094D\u0927\u0941\u0930\u093E", province: 7 },
|
|
432
|
+
{ name: "Darchula", nameNp: "\u0926\u093E\u0930\u094D\u091A\u0941\u0932\u093E", province: 7 },
|
|
433
|
+
{ name: "Doti", nameNp: "\u0921\u094B\u091F\u0940", province: 7 },
|
|
434
|
+
{ name: "Kailali", nameNp: "\u0915\u0948\u0932\u093E\u0932\u0940", province: 7 },
|
|
435
|
+
{ name: "Kanchanpur", nameNp: "\u0915\u091E\u094D\u091A\u0928\u092A\u0941\u0930", province: 7 }
|
|
436
|
+
];
|
|
437
|
+
function districtsByProvince(province) {
|
|
438
|
+
return DISTRICTS.filter((d) => d.province === province);
|
|
439
|
+
}
|
|
440
|
+
function findDistrict(name) {
|
|
441
|
+
const q = name.trim().toLowerCase();
|
|
442
|
+
return DISTRICTS.find((d) => d.name.toLowerCase() === q || d.nameNp === name.trim());
|
|
443
|
+
}
|
|
101
444
|
|
|
445
|
+
exports.DISTRICTS = DISTRICTS;
|
|
446
|
+
exports.LAND_UNIT_SQM = LAND_UNIT_SQM;
|
|
102
447
|
exports.PROVINCES = PROVINCES;
|
|
103
448
|
exports.amountInWords = amountInWords;
|
|
449
|
+
exports.amountInWordsNepali = amountInWordsNepali;
|
|
450
|
+
exports.convertLand = convertLand;
|
|
451
|
+
exports.districtsByProvince = districtsByProvince;
|
|
452
|
+
exports.findDistrict = findDistrict;
|
|
453
|
+
exports.formatBigha = formatBigha;
|
|
454
|
+
exports.formatCompactNPR = formatCompactNPR;
|
|
104
455
|
exports.formatNPR = formatNPR;
|
|
456
|
+
exports.formatRopani = formatRopani;
|
|
105
457
|
exports.fromDevanagari = fromDevanagari;
|
|
458
|
+
exports.getCarrier = getCarrier;
|
|
106
459
|
exports.groupNepali = groupNepali;
|
|
460
|
+
exports.isValidLandline = isValidLandline;
|
|
107
461
|
exports.isValidNepaliMobile = isValidNepaliMobile;
|
|
108
462
|
exports.isValidPAN = isValidPAN;
|
|
463
|
+
exports.isValidVAT = isValidVAT;
|
|
464
|
+
exports.landToSqMeters = landToSqMeters;
|
|
465
|
+
exports.normalizeMobile = normalizeMobile;
|
|
109
466
|
exports.numberToWords = numberToWords;
|
|
467
|
+
exports.numberToWordsNepali = numberToWordsNepali;
|
|
468
|
+
exports.parseNPR = parseNPR;
|
|
469
|
+
exports.sqMetersToBigha = sqMetersToBigha;
|
|
470
|
+
exports.sqMetersToRopani = sqMetersToRopani;
|
|
110
471
|
exports.toDevanagari = toDevanagari;
|
|
472
|
+
exports.ungroupNepali = ungroupNepali;
|
|
111
473
|
//# sourceMappingURL=index.cjs.map
|
|
112
474
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @lacspace/nepali-utils — everyday Nepal helpers: NPR currency formatting,\n * Nepali (South-Asian) digit grouping, Devanagari numerals, amount-in-words,\n * common validators, and province data. Zero-dependency, isomorphic.\n */\n\nconst DEVANAGARI = [\"०\", \"१\", \"२\", \"३\", \"४\", \"५\", \"६\", \"७\", \"८\", \"९\"] as const;\n\n/** Convert Arabic numerals to Devanagari: `\"2081\"` → `\"२०८१\"`. */\nexport function toDevanagari(input: string | number): string {\n return String(input).replace(/[0-9]/g, (d) => DEVANAGARI[Number(d)]!);\n}\n\n/** Convert Devanagari numerals to Arabic: `\"२०८१\"` → `\"2081\"`. */\nexport function fromDevanagari(input: string): string {\n return input.replace(/[०-९]/g, (d) => String(DEVANAGARI.indexOf(d as (typeof DEVANAGARI)[number])));\n}\n\n/**\n * Group an integer with the South-Asian (Nepali) system: the last three digits,\n * then groups of two. `1234567` → `\"12,34,567\"`.\n */\nexport function groupNepali(value: number | string): string {\n const s = String(value).replace(/[^\\d]/g, \"\");\n if (s.length <= 3) return s;\n const last3 = s.slice(-3);\n const rest = s.slice(0, -3);\n return rest.replace(/\\B(?=(\\d{2})+(?!\\d))/g, \",\") + \",\" + last3;\n}\n\nexport interface FormatNprOptions {\n /** Show a symbol/prefix. Default `\"Rs. \"`. Use `\"\"` for none. */\n symbol?: string;\n /** Number of decimal places. Default `2`. */\n decimals?: number;\n /** Render digits in Devanagari. Default `false`. */\n devanagari?: boolean;\n}\n\n/**\n * Format an amount as Nepalese Rupees with South-Asian grouping.\n * `formatNPR(1234567.5)` → `\"Rs. 12,34,567.50\"`.\n */\nexport function formatNPR(amount: number, options: FormatNprOptions = {}): string {\n const { symbol = \"Rs. \", decimals = 2, devanagari = false } = options;\n const negative = amount < 0;\n const fixed = Math.abs(amount).toFixed(decimals);\n const [intPart, decPart] = fixed.split(\".\");\n let out = groupNepali(intPart!);\n if (decPart) out += \".\" + decPart;\n if (devanagari) out = toDevanagari(out);\n return (negative ? \"-\" : \"\") + symbol + out;\n}\n\nconst ONES = [\n \"\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\",\n \"Ten\", \"Eleven\", \"Twelve\", \"Thirteen\", \"Fourteen\", \"Fifteen\", \"Sixteen\",\n \"Seventeen\", \"Eighteen\", \"Nineteen\",\n];\nconst TENS = [\"\", \"\", \"Twenty\", \"Thirty\", \"Forty\", \"Fifty\", \"Sixty\", \"Seventy\", \"Eighty\", \"Ninety\"];\n\nfunction twoDigitWords(n: number): string {\n if (n < 20) return ONES[n]!;\n const t = Math.floor(n / 10);\n const o = n % 10;\n return TENS[t]! + (o ? \" \" + ONES[o] : \"\");\n}\n\n/**\n * Amount in words using the South-Asian system (Thousand, Lakh, Crore, Arab) —\n * perfect for invoices. `numberToWords(1234567)` →\n * `\"Twelve Lakh Thirty Four Thousand Five Hundred Sixty Seven\"`.\n */\nexport function numberToWords(value: number): string {\n let n = Math.floor(Math.abs(value));\n if (n === 0) return \"Zero\";\n const parts: string[] = [];\n const units: [number, string][] = [\n [1e9, \"Arab\"],\n [1e7, \"Crore\"],\n [1e5, \"Lakh\"],\n [1e3, \"Thousand\"],\n [1e2, \"Hundred\"],\n ];\n for (const [size, name] of units) {\n if (n >= size) {\n const count = Math.floor(n / size);\n // Hundreds are 1–9; the higher units take up to two digits.\n parts.push((size === 100 ? ONES[count] : twoDigitWords(count)) + \" \" + name);\n n %= size;\n }\n }\n if (n > 0) parts.push(twoDigitWords(n));\n return (value < 0 ? \"Minus \" : \"\") + parts.join(\" \");\n}\n\n/** `numberToWords` plus a \"Rupees … only\" wrapper for invoices. */\nexport function amountInWords(amount: number): string {\n const rupees = Math.floor(Math.abs(amount));\n const paisa = Math.round((Math.abs(amount) - rupees) * 100);\n let out = \"Rupees \" + numberToWords(rupees);\n if (paisa > 0) out += \" and \" + numberToWords(paisa) + \" Paisa\";\n return (amount < 0 ? \"Minus \" : \"\") + out + \" Only\";\n}\n\n/** True for a valid Nepali mobile number (10 digits starting 96–98, optional +977). */\nexport function isValidNepaliMobile(input: string): boolean {\n const s = input.replace(/[\\s-]/g, \"\");\n return /^(\\+?977)?9[678]\\d{8}$/.test(s);\n}\n\n/** True for a valid Nepal PAN / VAT number (9 digits). */\nexport function isValidPAN(input: string): boolean {\n return /^\\d{9}$/.test(input.trim());\n}\n\nexport interface Province {\n number: number;\n name: string;\n nameNp: string;\n capital: string;\n}\n\n/** Nepal's seven federal provinces. */\nexport const PROVINCES: readonly Province[] = [\n { number: 1, name: \"Koshi\", nameNp: \"कोशी\", capital: \"Biratnagar\" },\n { number: 2, name: \"Madhesh\", nameNp: \"मधेश\", capital: \"Janakpur\" },\n { number: 3, name: \"Bagmati\", nameNp: \"बागमती\", capital: \"Hetauda\" },\n { number: 4, name: \"Gandaki\", nameNp: \"गण्डकी\", capital: \"Pokhara\" },\n { number: 5, name: \"Lumbini\", nameNp: \"लुम्बिनी\", capital: \"Deukhuri\" },\n { number: 6, name: \"Karnali\", nameNp: \"कर्णाली\", capital: \"Birendranagar\" },\n { number: 7, name: \"Sudurpashchim\", nameNp: \"सुदूरपश्चिम\", capital: \"Godawari\" },\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @lacspace/nepali-utils — everyday Nepal helpers: NPR currency formatting,\n * Nepali (South-Asian) digit grouping, Devanagari numerals, amount-in-words,\n * common validators, and province data. Zero-dependency, isomorphic.\n */\n\nconst DEVANAGARI = [\"०\", \"१\", \"२\", \"३\", \"४\", \"५\", \"६\", \"७\", \"८\", \"९\"] as const;\n\n/** Convert Arabic numerals to Devanagari: `\"2081\"` → `\"२०८१\"`. */\nexport function toDevanagari(input: string | number): string {\n return String(input).replace(/[0-9]/g, (d) => DEVANAGARI[Number(d)]!);\n}\n\n/** Convert Devanagari numerals to Arabic: `\"२०८१\"` → `\"2081\"`. */\nexport function fromDevanagari(input: string): string {\n return input.replace(/[०-९]/g, (d) => String(DEVANAGARI.indexOf(d as (typeof DEVANAGARI)[number])));\n}\n\n/**\n * Group an integer with the South-Asian (Nepali) system: the last three digits,\n * then groups of two. `1234567` → `\"12,34,567\"`.\n */\nexport function groupNepali(value: number | string): string {\n const s = String(value).replace(/[^\\d]/g, \"\");\n if (s.length <= 3) return s;\n const last3 = s.slice(-3);\n const rest = s.slice(0, -3);\n return rest.replace(/\\B(?=(\\d{2})+(?!\\d))/g, \",\") + \",\" + last3;\n}\n\nexport interface FormatNprOptions {\n /** Show a symbol/prefix. Default `\"Rs. \"`. Use `\"\"` for none. */\n symbol?: string;\n /** Number of decimal places. Default `2`. */\n decimals?: number;\n /** Render digits in Devanagari. Default `false`. */\n devanagari?: boolean;\n}\n\n/**\n * Format an amount as Nepalese Rupees with South-Asian grouping.\n * `formatNPR(1234567.5)` → `\"Rs. 12,34,567.50\"`.\n */\nexport function formatNPR(amount: number, options: FormatNprOptions = {}): string {\n const { symbol = \"Rs. \", decimals = 2, devanagari = false } = options;\n const negative = amount < 0;\n const fixed = Math.abs(amount).toFixed(decimals);\n const [intPart, decPart] = fixed.split(\".\");\n let out = groupNepali(intPart!);\n if (decPart) out += \".\" + decPart;\n if (devanagari) out = toDevanagari(out);\n return (negative ? \"-\" : \"\") + symbol + out;\n}\n\nconst ONES = [\n \"\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\",\n \"Ten\", \"Eleven\", \"Twelve\", \"Thirteen\", \"Fourteen\", \"Fifteen\", \"Sixteen\",\n \"Seventeen\", \"Eighteen\", \"Nineteen\",\n];\nconst TENS = [\"\", \"\", \"Twenty\", \"Thirty\", \"Forty\", \"Fifty\", \"Sixty\", \"Seventy\", \"Eighty\", \"Ninety\"];\n\nfunction twoDigitWords(n: number): string {\n if (n < 20) return ONES[n]!;\n const t = Math.floor(n / 10);\n const o = n % 10;\n return TENS[t]! + (o ? \" \" + ONES[o] : \"\");\n}\n\n/**\n * Amount in words using the South-Asian system (Thousand, Lakh, Crore, Arab) —\n * perfect for invoices. `numberToWords(1234567)` →\n * `\"Twelve Lakh Thirty Four Thousand Five Hundred Sixty Seven\"`.\n */\nexport function numberToWords(value: number): string {\n let n = Math.floor(Math.abs(value));\n if (n === 0) return \"Zero\";\n const parts: string[] = [];\n const units: [number, string][] = [\n [1e9, \"Arab\"],\n [1e7, \"Crore\"],\n [1e5, \"Lakh\"],\n [1e3, \"Thousand\"],\n [1e2, \"Hundred\"],\n ];\n for (const [size, name] of units) {\n if (n >= size) {\n const count = Math.floor(n / size);\n // Hundreds are 1–9; the higher units take up to two digits.\n parts.push((size === 100 ? ONES[count] : twoDigitWords(count)) + \" \" + name);\n n %= size;\n }\n }\n if (n > 0) parts.push(twoDigitWords(n));\n return (value < 0 ? \"Minus \" : \"\") + parts.join(\" \");\n}\n\n/** `numberToWords` plus a \"Rupees … only\" wrapper for invoices. */\nexport function amountInWords(amount: number): string {\n const rupees = Math.floor(Math.abs(amount));\n const paisa = Math.round((Math.abs(amount) - rupees) * 100);\n let out = \"Rupees \" + numberToWords(rupees);\n if (paisa > 0) out += \" and \" + numberToWords(paisa) + \" Paisa\";\n return (amount < 0 ? \"Minus \" : \"\") + out + \" Only\";\n}\n\n/** Parse a formatted NPR/Nepali-grouped string back to a number (inverse of {@link formatNPR}). */\nexport function ungroupNepali(input: string | number): number {\n let s = fromDevanagari(String(input)).trim();\n const negative = s.startsWith(\"-\");\n s = s.replace(/₹|rs\\.?|npr|रू\\.?|रु\\.?/gi, \"\"); // strip currency symbols (incl. the dot in \"Rs.\")\n s = s.replace(/[^\\d.]/g, \"\"); // drop grouping commas, spaces, everything else\n if (s === \"\") return NaN;\n const num = Number(s);\n return negative && !Number.isNaN(num) ? -num : num;\n}\n\n/** Alias of {@link ungroupNepali} — parse an NPR string to a number. */\nexport const parseNPR = ungroupNepali;\n\nfunction trimNum(n: number): string {\n return Number(n.toFixed(2)).toString();\n}\n\nexport interface CompactNprOptions {\n symbol?: string;\n /** Use Nepali scale words (हजार/लाख/करोड/अरब). Default false (K/Lakh/Cr/Arab). */\n nepali?: boolean;\n /** Render digits in Devanagari. Default false. */\n devanagari?: boolean;\n}\n\n/** Compact NPR: `formatCompactNPR(1234567)` → `\"Rs. 12.35 Lakh\"`. */\nexport function formatCompactNPR(amount: number, options: CompactNprOptions = {}): string {\n const { symbol = \"Rs. \", nepali = false, devanagari = false } = options;\n const negative = amount < 0;\n const a = Math.abs(amount);\n const units: [number, string, string][] = [\n [1e9, \"Arab\", \"अरब\"],\n [1e7, \"Cr\", \"करोड\"],\n [1e5, \"Lakh\", \"लाख\"],\n [1e3, \"K\", \"हजार\"],\n ];\n let out: string;\n const u = units.find(([size]) => a >= size);\n if (u) out = `${trimNum(a / u[0])} ${nepali ? u[2] : u[1]}`;\n else out = trimNum(a);\n if (devanagari) out = toDevanagari(out);\n return (negative ? \"-\" : \"\") + symbol + out;\n}\n\n/* ------------------------------ land-area units ------------------------------ */\n\nexport type LandUnit = \"ropani\" | \"aana\" | \"paisa\" | \"daam\" | \"bigha\" | \"kattha\" | \"dhur\" | \"sqm\" | \"sqft\";\n\n/** Area of one unit in square metres (hilly = ropani system, terai = bigha system). */\nexport const LAND_UNIT_SQM: Record<LandUnit, number> = {\n ropani: 508.7369, // 5476 sq ft\n aana: 31.79606, // ropani / 16\n paisa: 7.949014, // ropani / 64\n daam: 1.987254, // ropani / 256\n bigha: 6772.631, // 72900 sq ft\n kattha: 338.6315, // bigha / 20\n dhur: 16.93158, // bigha / 400\n sqm: 1,\n sqft: 0.09290304,\n};\n\n/** Total square metres from a mixed measure, e.g. `{ ropani: 2, aana: 3 }` or `{ bigha: 1, kattha: 5 }`. */\nexport function landToSqMeters(measure: Partial<Record<LandUnit, number>>): number {\n let m2 = 0;\n for (const [unit, value] of Object.entries(measure)) m2 += (value ?? 0) * LAND_UNIT_SQM[unit as LandUnit];\n return m2;\n}\n\n/** Convert an area between any two land units. */\nexport function convertLand(value: number, from: LandUnit, to: LandUnit): number {\n return (value * LAND_UNIT_SQM[from]) / LAND_UNIT_SQM[to];\n}\n\n/** Break square metres into the hilly system: `{ ropani, aana, paisa, daam }`. */\nexport function sqMetersToRopani(m2: number): { ropani: number; aana: number; paisa: number; daam: number } {\n let rem = m2;\n const ropani = Math.floor(rem / LAND_UNIT_SQM.ropani);\n rem -= ropani * LAND_UNIT_SQM.ropani;\n const aana = Math.floor(rem / LAND_UNIT_SQM.aana);\n rem -= aana * LAND_UNIT_SQM.aana;\n const paisa = Math.floor(rem / LAND_UNIT_SQM.paisa);\n rem -= paisa * LAND_UNIT_SQM.paisa;\n const daam = Math.round(rem / LAND_UNIT_SQM.daam);\n return carryRopani({ ropani, aana, paisa, daam });\n}\n\nfunction carryRopani(r: { ropani: number; aana: number; paisa: number; daam: number }) {\n if (r.daam >= 4) { r.paisa += Math.floor(r.daam / 4); r.daam %= 4; }\n if (r.paisa >= 4) { r.aana += Math.floor(r.paisa / 4); r.paisa %= 4; }\n if (r.aana >= 16) { r.ropani += Math.floor(r.aana / 16); r.aana %= 16; }\n return r;\n}\n\n/** Break square metres into the terai system: `{ bigha, kattha, dhur }`. */\nexport function sqMetersToBigha(m2: number): { bigha: number; kattha: number; dhur: number } {\n let rem = m2;\n const bigha = Math.floor(rem / LAND_UNIT_SQM.bigha);\n rem -= bigha * LAND_UNIT_SQM.bigha;\n const kattha = Math.floor(rem / LAND_UNIT_SQM.kattha);\n rem -= kattha * LAND_UNIT_SQM.kattha;\n const dhur = Math.round(rem / LAND_UNIT_SQM.dhur);\n if (dhur >= 20) return { bigha: bigha + Math.floor(dhur / 20), kattha, dhur: dhur % 20 };\n if (kattha >= 20) return { bigha: bigha + Math.floor(kattha / 20), kattha: kattha % 20, dhur };\n return { bigha, kattha, dhur };\n}\n\n/** `\"2-3-1-0\"` ropani-aana-paisa-daam from square metres. */\nexport function formatRopani(m2: number): string {\n const r = sqMetersToRopani(m2);\n return `${r.ropani}-${r.aana}-${r.paisa}-${r.daam}`;\n}\n\n/** `\"1-5-0\"` bigha-kattha-dhur from square metres. */\nexport function formatBigha(m2: number): string {\n const b = sqMetersToBigha(m2);\n return `${b.bigha}-${b.kattha}-${b.dhur}`;\n}\n\n/* ------------------------------ phone & validators ------------------------------ */\n\n/** Normalize a Nepali mobile to canonical `+9779XXXXXXXXX`, or null if invalid. */\nexport function normalizeMobile(input: string): string | null {\n const s = fromDevanagari(input).replace(/[\\s-]/g, \"\").replace(/^\\+?977/, \"\");\n return /^9[678]\\d{8}$/.test(s) ? `+977${s}` : null;\n}\n\nexport type Carrier = \"Ntc\" | \"Ncell\" | \"Smart Cell\" | \"UTL\" | \"unknown\";\n\n/** Detect the carrier of a Nepali mobile number. */\nexport function getCarrier(input: string): Carrier {\n const n = normalizeMobile(input);\n if (!n) return \"unknown\";\n const p = n.slice(4, 7); // three digits after +977\n if ([\"984\", \"985\", \"986\", \"974\", \"975\"].includes(p)) return \"Ntc\";\n if ([\"980\", \"981\", \"982\"].includes(p)) return \"Ncell\";\n if ([\"961\", \"962\", \"988\"].includes(p)) return \"Smart Cell\";\n if (p === \"972\") return \"UTL\";\n return \"unknown\";\n}\n\n/** True for a valid Nepali mobile number (10 digits starting 96–98, optional +977). */\nexport function isValidNepaliMobile(input: string): boolean {\n const s = fromDevanagari(input).replace(/[\\s-]/g, \"\");\n return /^(\\+?977)?9[678]\\d{8}$/.test(s);\n}\n\n/** True for a plausible Nepal landline (area code + number, e.g. 01-4XXXXXX). */\nexport function isValidLandline(input: string): boolean {\n const s = input.replace(/[\\s-]/g, \"\");\n return /^0\\d{7,9}$/.test(s);\n}\n\n/** True for a valid Nepal PAN / VAT number (9 digits). */\nexport function isValidPAN(input: string): boolean {\n return /^\\d{9}$/.test(input.trim());\n}\n\n/** True for a valid Nepal VAT number (9 digits — same format as PAN). */\nexport const isValidVAT = isValidPAN;\n\n/* ------------------------------ Nepali amount in words ------------------------------ */\n\nconst NEPALI_0_99 = [\n \"शून्य\", \"एक\", \"दुई\", \"तीन\", \"चार\", \"पाँच\", \"छ\", \"सात\", \"आठ\", \"नौ\",\n \"दस\", \"एघार\", \"बाह्र\", \"तेह्र\", \"चौध\", \"पन्ध्र\", \"सोह्र\", \"सत्र\", \"अठार\", \"उन्नाइस\",\n \"बीस\", \"एक्काइस\", \"बाइस\", \"तेइस\", \"चौबिस\", \"पच्चिस\", \"छब्बिस\", \"सत्ताइस\", \"अठ्ठाइस\", \"उनन्तिस\",\n \"तिस\", \"एकतिस\", \"बत्तिस\", \"तेत्तिस\", \"चौँतिस\", \"पैँतिस\", \"छत्तिस\", \"सैँतिस\", \"अठतिस\", \"उनन्चालिस\",\n \"चालिस\", \"एकचालिस\", \"बयालिस\", \"त्रिचालिस\", \"चवालिस\", \"पैँतालिस\", \"छयालिस\", \"सतचालिस\", \"अठचालिस\", \"उनन्चास\",\n \"पचास\", \"एकाउन्न\", \"बाउन्न\", \"त्रिपन्न\", \"चवन्न\", \"पचपन्न\", \"छपन्न\", \"सन्ताउन्न\", \"अन्ठाउन्न\", \"उनन्साठी\",\n \"साठी\", \"एकसट्ठी\", \"बयसट्ठी\", \"त्रिसट्ठी\", \"चौंसट्ठी\", \"पैंसट्ठी\", \"छयसट्ठी\", \"सतसट्ठी\", \"अठसट्ठी\", \"उनन्सत्तरी\",\n \"सत्तरी\", \"एकहत्तर\", \"बहत्तर\", \"त्रिहत्तर\", \"चौहत्तर\", \"पचहत्तर\", \"छयहत्तर\", \"सतहत्तर\", \"अठहत्तर\", \"उनासी\",\n \"असी\", \"एकासी\", \"बयासी\", \"त्रियासी\", \"चौरासी\", \"पचासी\", \"छयासी\", \"सतासी\", \"अठासी\", \"उनान्नब्बे\",\n \"नब्बे\", \"एकानब्बे\", \"बयानब्बे\", \"त्रियानब्बे\", \"चौरानब्बे\", \"पन्चानब्बे\", \"छयानब्बे\", \"सन्तानब्बे\", \"अन्ठानब्बे\", \"उनान्सय\",\n];\n\n/**\n * Amount in words in Nepali (Devanagari), South-Asian scale.\n * `numberToWordsNepali(1234567)` → `\"बाह्र लाख चौँतिस हजार पाँच सय सतसट्ठी\"`.\n */\nexport function numberToWordsNepali(value: number): string {\n let n = Math.floor(Math.abs(value));\n if (n === 0) return NEPALI_0_99[0]!;\n const parts: string[] = [];\n const units: [number, string][] = [\n [1e9, \"अरब\"],\n [1e7, \"करोड\"],\n [1e5, \"लाख\"],\n [1e3, \"हजार\"],\n [1e2, \"सय\"],\n ];\n for (const [size, name] of units) {\n if (n >= size) {\n const count = Math.floor(n / size);\n parts.push(`${NEPALI_0_99[count]} ${name}`);\n n %= size;\n }\n }\n if (n > 0) parts.push(NEPALI_0_99[n]!);\n return (value < 0 ? \"माइनस \" : \"\") + parts.join(\" \");\n}\n\n/** `numberToWordsNepali` plus a \"रुपैयाँ … मात्र\" wrapper for Nepali invoices. */\nexport function amountInWordsNepali(amount: number): string {\n const rupees = Math.floor(Math.abs(amount));\n const paisa = Math.round((Math.abs(amount) - rupees) * 100);\n let out = \"रुपैयाँ \" + numberToWordsNepali(rupees);\n if (paisa > 0) out += \" \" + numberToWordsNepali(paisa) + \" पैसा\";\n return (amount < 0 ? \"माइनस \" : \"\") + out + \" मात्र\";\n}\n\nexport interface Province {\n number: number;\n name: string;\n nameNp: string;\n capital: string;\n}\n\n/** Nepal's seven federal provinces. */\nexport const PROVINCES: readonly Province[] = [\n { number: 1, name: \"Koshi\", nameNp: \"कोशी\", capital: \"Biratnagar\" },\n { number: 2, name: \"Madhesh\", nameNp: \"मधेश\", capital: \"Janakpur\" },\n { number: 3, name: \"Bagmati\", nameNp: \"बागमती\", capital: \"Hetauda\" },\n { number: 4, name: \"Gandaki\", nameNp: \"गण्डकी\", capital: \"Pokhara\" },\n { number: 5, name: \"Lumbini\", nameNp: \"लुम्बिनी\", capital: \"Deukhuri\" },\n { number: 6, name: \"Karnali\", nameNp: \"कर्णाली\", capital: \"Birendranagar\" },\n { number: 7, name: \"Sudurpashchim\", nameNp: \"सुदूरपश्चिम\", capital: \"Godawari\" },\n];\n\nexport interface District {\n name: string;\n nameNp: string;\n /** Province number 1–7. */\n province: number;\n}\n\n/** Nepal's 77 districts, with their province number. */\nexport const DISTRICTS: readonly District[] = [\n // Koshi (1)\n { name: \"Bhojpur\", nameNp: \"भोजपुर\", province: 1 },\n { name: \"Dhankuta\", nameNp: \"धनकुटा\", province: 1 },\n { name: \"Ilam\", nameNp: \"इलाम\", province: 1 },\n { name: \"Jhapa\", nameNp: \"झापा\", province: 1 },\n { name: \"Khotang\", nameNp: \"खोटाङ\", province: 1 },\n { name: \"Morang\", nameNp: \"मोरङ\", province: 1 },\n { name: \"Okhaldhunga\", nameNp: \"ओखलढुंगा\", province: 1 },\n { name: \"Panchthar\", nameNp: \"पाँचथर\", province: 1 },\n { name: \"Sankhuwasabha\", nameNp: \"संखुवासभा\", province: 1 },\n { name: \"Solukhumbu\", nameNp: \"सोलुखुम्बु\", province: 1 },\n { name: \"Sunsari\", nameNp: \"सुनसरी\", province: 1 },\n { name: \"Taplejung\", nameNp: \"ताप्लेजुङ\", province: 1 },\n { name: \"Terhathum\", nameNp: \"तेह्रथुम\", province: 1 },\n { name: \"Udayapur\", nameNp: \"उदयपुर\", province: 1 },\n // Madhesh (2)\n { name: \"Bara\", nameNp: \"बारा\", province: 2 },\n { name: \"Dhanusha\", nameNp: \"धनुषा\", province: 2 },\n { name: \"Mahottari\", nameNp: \"महोत्तरी\", province: 2 },\n { name: \"Parsa\", nameNp: \"पर्सा\", province: 2 },\n { name: \"Rautahat\", nameNp: \"रौतहट\", province: 2 },\n { name: \"Saptari\", nameNp: \"सप्तरी\", province: 2 },\n { name: \"Sarlahi\", nameNp: \"सर्लाही\", province: 2 },\n { name: \"Siraha\", nameNp: \"सिरहा\", province: 2 },\n // Bagmati (3)\n { name: \"Bhaktapur\", nameNp: \"भक्तपुर\", province: 3 },\n { name: \"Chitwan\", nameNp: \"चितवन\", province: 3 },\n { name: \"Dhading\", nameNp: \"धादिङ\", province: 3 },\n { name: \"Dolakha\", nameNp: \"दोलखा\", province: 3 },\n { name: \"Kathmandu\", nameNp: \"काठमाडौं\", province: 3 },\n { name: \"Kavrepalanchok\", nameNp: \"काभ्रेपलाञ्चोक\", province: 3 },\n { name: \"Lalitpur\", nameNp: \"ललितपुर\", province: 3 },\n { name: \"Makwanpur\", nameNp: \"मकवानपुर\", province: 3 },\n { name: \"Nuwakot\", nameNp: \"नुवाकोट\", province: 3 },\n { name: \"Ramechhap\", nameNp: \"रामेछाप\", province: 3 },\n { name: \"Rasuwa\", nameNp: \"रसुवा\", province: 3 },\n { name: \"Sindhuli\", nameNp: \"सिन्धुली\", province: 3 },\n { name: \"Sindhupalchok\", nameNp: \"सिन्धुपाल्चोक\", province: 3 },\n // Gandaki (4)\n { name: \"Baglung\", nameNp: \"बागलुङ\", province: 4 },\n { name: \"Gorkha\", nameNp: \"गोरखा\", province: 4 },\n { name: \"Kaski\", nameNp: \"कास्की\", province: 4 },\n { name: \"Lamjung\", nameNp: \"लमजुङ\", province: 4 },\n { name: \"Manang\", nameNp: \"मनाङ\", province: 4 },\n { name: \"Mustang\", nameNp: \"मुस्ताङ\", province: 4 },\n { name: \"Myagdi\", nameNp: \"म्याग्दी\", province: 4 },\n { name: \"Nawalpur\", nameNp: \"नवलपुर\", province: 4 },\n { name: \"Parbat\", nameNp: \"पर्वत\", province: 4 },\n { name: \"Syangja\", nameNp: \"स्याङ्जा\", province: 4 },\n { name: \"Tanahun\", nameNp: \"तनहुँ\", province: 4 },\n // Lumbini (5)\n { name: \"Arghakhanchi\", nameNp: \"अर्घाखाँची\", province: 5 },\n { name: \"Banke\", nameNp: \"बाँके\", province: 5 },\n { name: \"Bardiya\", nameNp: \"बर्दिया\", province: 5 },\n { name: \"Dang\", nameNp: \"दाङ\", province: 5 },\n { name: \"Eastern Rukum\", nameNp: \"पूर्वी रुकुम\", province: 5 },\n { name: \"Gulmi\", nameNp: \"गुल्मी\", province: 5 },\n { name: \"Kapilvastu\", nameNp: \"कपिलवस्तु\", province: 5 },\n { name: \"Parasi\", nameNp: \"नवलपरासी (पश्चिम)\", province: 5 },\n { name: \"Palpa\", nameNp: \"पाल्पा\", province: 5 },\n { name: \"Pyuthan\", nameNp: \"प्युठान\", province: 5 },\n { name: \"Rolpa\", nameNp: \"रोल्पा\", province: 5 },\n { name: \"Rupandehi\", nameNp: \"रूपन्देही\", province: 5 },\n // Karnali (6)\n { name: \"Dailekh\", nameNp: \"दैलेख\", province: 6 },\n { name: \"Dolpa\", nameNp: \"डोल्पा\", province: 6 },\n { name: \"Humla\", nameNp: \"हुम्ला\", province: 6 },\n { name: \"Jajarkot\", nameNp: \"जाजरकोट\", province: 6 },\n { name: \"Jumla\", nameNp: \"जुम्ला\", province: 6 },\n { name: \"Kalikot\", nameNp: \"कालिकोट\", province: 6 },\n { name: \"Mugu\", nameNp: \"मुगु\", province: 6 },\n { name: \"Salyan\", nameNp: \"सल्यान\", province: 6 },\n { name: \"Surkhet\", nameNp: \"सुर्खेत\", province: 6 },\n { name: \"Western Rukum\", nameNp: \"पश्चिमी रुकुम\", province: 6 },\n // Sudurpashchim (7)\n { name: \"Achham\", nameNp: \"अछाम\", province: 7 },\n { name: \"Baitadi\", nameNp: \"बैतडी\", province: 7 },\n { name: \"Bajhang\", nameNp: \"बझाङ\", province: 7 },\n { name: \"Bajura\", nameNp: \"बाजुरा\", province: 7 },\n { name: \"Dadeldhura\", nameNp: \"डडेल्धुरा\", province: 7 },\n { name: \"Darchula\", nameNp: \"दार्चुला\", province: 7 },\n { name: \"Doti\", nameNp: \"डोटी\", province: 7 },\n { name: \"Kailali\", nameNp: \"कैलाली\", province: 7 },\n { name: \"Kanchanpur\", nameNp: \"कञ्चनपुर\", province: 7 },\n];\n\n/** Districts in a given province (1–7). */\nexport function districtsByProvince(province: number): District[] {\n return DISTRICTS.filter((d) => d.province === province);\n}\n\n/** Find a district by English or Nepali name (case-insensitive). */\nexport function findDistrict(name: string): District | undefined {\n const q = name.trim().toLowerCase();\n return DISTRICTS.find((d) => d.name.toLowerCase() === q || d.nameNp === name.trim());\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -33,10 +33,63 @@ declare function formatNPR(amount: number, options?: FormatNprOptions): string;
|
|
|
33
33
|
declare function numberToWords(value: number): string;
|
|
34
34
|
/** `numberToWords` plus a "Rupees … only" wrapper for invoices. */
|
|
35
35
|
declare function amountInWords(amount: number): string;
|
|
36
|
+
/** Parse a formatted NPR/Nepali-grouped string back to a number (inverse of {@link formatNPR}). */
|
|
37
|
+
declare function ungroupNepali(input: string | number): number;
|
|
38
|
+
/** Alias of {@link ungroupNepali} — parse an NPR string to a number. */
|
|
39
|
+
declare const parseNPR: typeof ungroupNepali;
|
|
40
|
+
interface CompactNprOptions {
|
|
41
|
+
symbol?: string;
|
|
42
|
+
/** Use Nepali scale words (हजार/लाख/करोड/अरब). Default false (K/Lakh/Cr/Arab). */
|
|
43
|
+
nepali?: boolean;
|
|
44
|
+
/** Render digits in Devanagari. Default false. */
|
|
45
|
+
devanagari?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Compact NPR: `formatCompactNPR(1234567)` → `"Rs. 12.35 Lakh"`. */
|
|
48
|
+
declare function formatCompactNPR(amount: number, options?: CompactNprOptions): string;
|
|
49
|
+
type LandUnit = "ropani" | "aana" | "paisa" | "daam" | "bigha" | "kattha" | "dhur" | "sqm" | "sqft";
|
|
50
|
+
/** Area of one unit in square metres (hilly = ropani system, terai = bigha system). */
|
|
51
|
+
declare const LAND_UNIT_SQM: Record<LandUnit, number>;
|
|
52
|
+
/** Total square metres from a mixed measure, e.g. `{ ropani: 2, aana: 3 }` or `{ bigha: 1, kattha: 5 }`. */
|
|
53
|
+
declare function landToSqMeters(measure: Partial<Record<LandUnit, number>>): number;
|
|
54
|
+
/** Convert an area between any two land units. */
|
|
55
|
+
declare function convertLand(value: number, from: LandUnit, to: LandUnit): number;
|
|
56
|
+
/** Break square metres into the hilly system: `{ ropani, aana, paisa, daam }`. */
|
|
57
|
+
declare function sqMetersToRopani(m2: number): {
|
|
58
|
+
ropani: number;
|
|
59
|
+
aana: number;
|
|
60
|
+
paisa: number;
|
|
61
|
+
daam: number;
|
|
62
|
+
};
|
|
63
|
+
/** Break square metres into the terai system: `{ bigha, kattha, dhur }`. */
|
|
64
|
+
declare function sqMetersToBigha(m2: number): {
|
|
65
|
+
bigha: number;
|
|
66
|
+
kattha: number;
|
|
67
|
+
dhur: number;
|
|
68
|
+
};
|
|
69
|
+
/** `"2-3-1-0"` ropani-aana-paisa-daam from square metres. */
|
|
70
|
+
declare function formatRopani(m2: number): string;
|
|
71
|
+
/** `"1-5-0"` bigha-kattha-dhur from square metres. */
|
|
72
|
+
declare function formatBigha(m2: number): string;
|
|
73
|
+
/** Normalize a Nepali mobile to canonical `+9779XXXXXXXXX`, or null if invalid. */
|
|
74
|
+
declare function normalizeMobile(input: string): string | null;
|
|
75
|
+
type Carrier = "Ntc" | "Ncell" | "Smart Cell" | "UTL" | "unknown";
|
|
76
|
+
/** Detect the carrier of a Nepali mobile number. */
|
|
77
|
+
declare function getCarrier(input: string): Carrier;
|
|
36
78
|
/** True for a valid Nepali mobile number (10 digits starting 96–98, optional +977). */
|
|
37
79
|
declare function isValidNepaliMobile(input: string): boolean;
|
|
80
|
+
/** True for a plausible Nepal landline (area code + number, e.g. 01-4XXXXXX). */
|
|
81
|
+
declare function isValidLandline(input: string): boolean;
|
|
38
82
|
/** True for a valid Nepal PAN / VAT number (9 digits). */
|
|
39
83
|
declare function isValidPAN(input: string): boolean;
|
|
84
|
+
/** True for a valid Nepal VAT number (9 digits — same format as PAN). */
|
|
85
|
+
declare const isValidVAT: typeof isValidPAN;
|
|
86
|
+
/**
|
|
87
|
+
* Amount in words in Nepali (Devanagari), South-Asian scale.
|
|
88
|
+
* `numberToWordsNepali(1234567)` → `"बाह्र लाख चौँतिस हजार पाँच सय सतसट्ठी"`.
|
|
89
|
+
*/
|
|
90
|
+
declare function numberToWordsNepali(value: number): string;
|
|
91
|
+
/** `numberToWordsNepali` plus a "रुपैयाँ … मात्र" wrapper for Nepali invoices. */
|
|
92
|
+
declare function amountInWordsNepali(amount: number): string;
|
|
40
93
|
interface Province {
|
|
41
94
|
number: number;
|
|
42
95
|
name: string;
|
|
@@ -45,5 +98,17 @@ interface Province {
|
|
|
45
98
|
}
|
|
46
99
|
/** Nepal's seven federal provinces. */
|
|
47
100
|
declare const PROVINCES: readonly Province[];
|
|
101
|
+
interface District {
|
|
102
|
+
name: string;
|
|
103
|
+
nameNp: string;
|
|
104
|
+
/** Province number 1–7. */
|
|
105
|
+
province: number;
|
|
106
|
+
}
|
|
107
|
+
/** Nepal's 77 districts, with their province number. */
|
|
108
|
+
declare const DISTRICTS: readonly District[];
|
|
109
|
+
/** Districts in a given province (1–7). */
|
|
110
|
+
declare function districtsByProvince(province: number): District[];
|
|
111
|
+
/** Find a district by English or Nepali name (case-insensitive). */
|
|
112
|
+
declare function findDistrict(name: string): District | undefined;
|
|
48
113
|
|
|
49
|
-
export { type FormatNprOptions, PROVINCES, type Province, amountInWords, formatNPR, fromDevanagari, groupNepali, isValidNepaliMobile, isValidPAN, numberToWords, toDevanagari };
|
|
114
|
+
export { type Carrier, type CompactNprOptions, DISTRICTS, type District, type FormatNprOptions, LAND_UNIT_SQM, type LandUnit, PROVINCES, type Province, amountInWords, amountInWordsNepali, convertLand, districtsByProvince, findDistrict, formatBigha, formatCompactNPR, formatNPR, formatRopani, fromDevanagari, getCarrier, groupNepali, isValidLandline, isValidNepaliMobile, isValidPAN, isValidVAT, landToSqMeters, normalizeMobile, numberToWords, numberToWordsNepali, parseNPR, sqMetersToBigha, sqMetersToRopani, toDevanagari, ungroupNepali };
|
package/dist/index.d.ts
CHANGED
|
@@ -33,10 +33,63 @@ declare function formatNPR(amount: number, options?: FormatNprOptions): string;
|
|
|
33
33
|
declare function numberToWords(value: number): string;
|
|
34
34
|
/** `numberToWords` plus a "Rupees … only" wrapper for invoices. */
|
|
35
35
|
declare function amountInWords(amount: number): string;
|
|
36
|
+
/** Parse a formatted NPR/Nepali-grouped string back to a number (inverse of {@link formatNPR}). */
|
|
37
|
+
declare function ungroupNepali(input: string | number): number;
|
|
38
|
+
/** Alias of {@link ungroupNepali} — parse an NPR string to a number. */
|
|
39
|
+
declare const parseNPR: typeof ungroupNepali;
|
|
40
|
+
interface CompactNprOptions {
|
|
41
|
+
symbol?: string;
|
|
42
|
+
/** Use Nepali scale words (हजार/लाख/करोड/अरब). Default false (K/Lakh/Cr/Arab). */
|
|
43
|
+
nepali?: boolean;
|
|
44
|
+
/** Render digits in Devanagari. Default false. */
|
|
45
|
+
devanagari?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Compact NPR: `formatCompactNPR(1234567)` → `"Rs. 12.35 Lakh"`. */
|
|
48
|
+
declare function formatCompactNPR(amount: number, options?: CompactNprOptions): string;
|
|
49
|
+
type LandUnit = "ropani" | "aana" | "paisa" | "daam" | "bigha" | "kattha" | "dhur" | "sqm" | "sqft";
|
|
50
|
+
/** Area of one unit in square metres (hilly = ropani system, terai = bigha system). */
|
|
51
|
+
declare const LAND_UNIT_SQM: Record<LandUnit, number>;
|
|
52
|
+
/** Total square metres from a mixed measure, e.g. `{ ropani: 2, aana: 3 }` or `{ bigha: 1, kattha: 5 }`. */
|
|
53
|
+
declare function landToSqMeters(measure: Partial<Record<LandUnit, number>>): number;
|
|
54
|
+
/** Convert an area between any two land units. */
|
|
55
|
+
declare function convertLand(value: number, from: LandUnit, to: LandUnit): number;
|
|
56
|
+
/** Break square metres into the hilly system: `{ ropani, aana, paisa, daam }`. */
|
|
57
|
+
declare function sqMetersToRopani(m2: number): {
|
|
58
|
+
ropani: number;
|
|
59
|
+
aana: number;
|
|
60
|
+
paisa: number;
|
|
61
|
+
daam: number;
|
|
62
|
+
};
|
|
63
|
+
/** Break square metres into the terai system: `{ bigha, kattha, dhur }`. */
|
|
64
|
+
declare function sqMetersToBigha(m2: number): {
|
|
65
|
+
bigha: number;
|
|
66
|
+
kattha: number;
|
|
67
|
+
dhur: number;
|
|
68
|
+
};
|
|
69
|
+
/** `"2-3-1-0"` ropani-aana-paisa-daam from square metres. */
|
|
70
|
+
declare function formatRopani(m2: number): string;
|
|
71
|
+
/** `"1-5-0"` bigha-kattha-dhur from square metres. */
|
|
72
|
+
declare function formatBigha(m2: number): string;
|
|
73
|
+
/** Normalize a Nepali mobile to canonical `+9779XXXXXXXXX`, or null if invalid. */
|
|
74
|
+
declare function normalizeMobile(input: string): string | null;
|
|
75
|
+
type Carrier = "Ntc" | "Ncell" | "Smart Cell" | "UTL" | "unknown";
|
|
76
|
+
/** Detect the carrier of a Nepali mobile number. */
|
|
77
|
+
declare function getCarrier(input: string): Carrier;
|
|
36
78
|
/** True for a valid Nepali mobile number (10 digits starting 96–98, optional +977). */
|
|
37
79
|
declare function isValidNepaliMobile(input: string): boolean;
|
|
80
|
+
/** True for a plausible Nepal landline (area code + number, e.g. 01-4XXXXXX). */
|
|
81
|
+
declare function isValidLandline(input: string): boolean;
|
|
38
82
|
/** True for a valid Nepal PAN / VAT number (9 digits). */
|
|
39
83
|
declare function isValidPAN(input: string): boolean;
|
|
84
|
+
/** True for a valid Nepal VAT number (9 digits — same format as PAN). */
|
|
85
|
+
declare const isValidVAT: typeof isValidPAN;
|
|
86
|
+
/**
|
|
87
|
+
* Amount in words in Nepali (Devanagari), South-Asian scale.
|
|
88
|
+
* `numberToWordsNepali(1234567)` → `"बाह्र लाख चौँतिस हजार पाँच सय सतसट्ठी"`.
|
|
89
|
+
*/
|
|
90
|
+
declare function numberToWordsNepali(value: number): string;
|
|
91
|
+
/** `numberToWordsNepali` plus a "रुपैयाँ … मात्र" wrapper for Nepali invoices. */
|
|
92
|
+
declare function amountInWordsNepali(amount: number): string;
|
|
40
93
|
interface Province {
|
|
41
94
|
number: number;
|
|
42
95
|
name: string;
|
|
@@ -45,5 +98,17 @@ interface Province {
|
|
|
45
98
|
}
|
|
46
99
|
/** Nepal's seven federal provinces. */
|
|
47
100
|
declare const PROVINCES: readonly Province[];
|
|
101
|
+
interface District {
|
|
102
|
+
name: string;
|
|
103
|
+
nameNp: string;
|
|
104
|
+
/** Province number 1–7. */
|
|
105
|
+
province: number;
|
|
106
|
+
}
|
|
107
|
+
/** Nepal's 77 districts, with their province number. */
|
|
108
|
+
declare const DISTRICTS: readonly District[];
|
|
109
|
+
/** Districts in a given province (1–7). */
|
|
110
|
+
declare function districtsByProvince(province: number): District[];
|
|
111
|
+
/** Find a district by English or Nepali name (case-insensitive). */
|
|
112
|
+
declare function findDistrict(name: string): District | undefined;
|
|
48
113
|
|
|
49
|
-
export { type FormatNprOptions, PROVINCES, type Province, amountInWords, formatNPR, fromDevanagari, groupNepali, isValidNepaliMobile, isValidPAN, numberToWords, toDevanagari };
|
|
114
|
+
export { type Carrier, type CompactNprOptions, DISTRICTS, type District, type FormatNprOptions, LAND_UNIT_SQM, type LandUnit, PROVINCES, type Province, amountInWords, amountInWordsNepali, convertLand, districtsByProvince, findDistrict, formatBigha, formatCompactNPR, formatNPR, formatRopani, fromDevanagari, getCarrier, groupNepali, isValidLandline, isValidNepaliMobile, isValidPAN, isValidVAT, landToSqMeters, normalizeMobile, numberToWords, numberToWordsNepali, parseNPR, sqMetersToBigha, sqMetersToRopani, toDevanagari, ungroupNepali };
|
package/dist/index.js
CHANGED
|
@@ -80,13 +80,263 @@ function amountInWords(amount) {
|
|
|
80
80
|
if (paisa > 0) out += " and " + numberToWords(paisa) + " Paisa";
|
|
81
81
|
return (amount < 0 ? "Minus " : "") + out + " Only";
|
|
82
82
|
}
|
|
83
|
+
function ungroupNepali(input) {
|
|
84
|
+
let s = fromDevanagari(String(input)).trim();
|
|
85
|
+
const negative = s.startsWith("-");
|
|
86
|
+
s = s.replace(/₹|rs\.?|npr|रू\.?|रु\.?/gi, "");
|
|
87
|
+
s = s.replace(/[^\d.]/g, "");
|
|
88
|
+
if (s === "") return NaN;
|
|
89
|
+
const num = Number(s);
|
|
90
|
+
return negative && !Number.isNaN(num) ? -num : num;
|
|
91
|
+
}
|
|
92
|
+
var parseNPR = ungroupNepali;
|
|
93
|
+
function trimNum(n) {
|
|
94
|
+
return Number(n.toFixed(2)).toString();
|
|
95
|
+
}
|
|
96
|
+
function formatCompactNPR(amount, options = {}) {
|
|
97
|
+
const { symbol = "Rs. ", nepali = false, devanagari = false } = options;
|
|
98
|
+
const negative = amount < 0;
|
|
99
|
+
const a = Math.abs(amount);
|
|
100
|
+
const units = [
|
|
101
|
+
[1e9, "Arab", "\u0905\u0930\u092C"],
|
|
102
|
+
[1e7, "Cr", "\u0915\u0930\u094B\u0921"],
|
|
103
|
+
[1e5, "Lakh", "\u0932\u093E\u0916"],
|
|
104
|
+
[1e3, "K", "\u0939\u091C\u093E\u0930"]
|
|
105
|
+
];
|
|
106
|
+
let out;
|
|
107
|
+
const u = units.find(([size]) => a >= size);
|
|
108
|
+
if (u) out = `${trimNum(a / u[0])} ${nepali ? u[2] : u[1]}`;
|
|
109
|
+
else out = trimNum(a);
|
|
110
|
+
if (devanagari) out = toDevanagari(out);
|
|
111
|
+
return (negative ? "-" : "") + symbol + out;
|
|
112
|
+
}
|
|
113
|
+
var LAND_UNIT_SQM = {
|
|
114
|
+
ropani: 508.7369,
|
|
115
|
+
// 5476 sq ft
|
|
116
|
+
aana: 31.79606,
|
|
117
|
+
// ropani / 16
|
|
118
|
+
paisa: 7.949014,
|
|
119
|
+
// ropani / 64
|
|
120
|
+
daam: 1.987254,
|
|
121
|
+
// ropani / 256
|
|
122
|
+
bigha: 6772.631,
|
|
123
|
+
// 72900 sq ft
|
|
124
|
+
kattha: 338.6315,
|
|
125
|
+
// bigha / 20
|
|
126
|
+
dhur: 16.93158,
|
|
127
|
+
// bigha / 400
|
|
128
|
+
sqm: 1,
|
|
129
|
+
sqft: 0.09290304
|
|
130
|
+
};
|
|
131
|
+
function landToSqMeters(measure) {
|
|
132
|
+
let m2 = 0;
|
|
133
|
+
for (const [unit, value] of Object.entries(measure)) m2 += (value ?? 0) * LAND_UNIT_SQM[unit];
|
|
134
|
+
return m2;
|
|
135
|
+
}
|
|
136
|
+
function convertLand(value, from, to) {
|
|
137
|
+
return value * LAND_UNIT_SQM[from] / LAND_UNIT_SQM[to];
|
|
138
|
+
}
|
|
139
|
+
function sqMetersToRopani(m2) {
|
|
140
|
+
let rem = m2;
|
|
141
|
+
const ropani = Math.floor(rem / LAND_UNIT_SQM.ropani);
|
|
142
|
+
rem -= ropani * LAND_UNIT_SQM.ropani;
|
|
143
|
+
const aana = Math.floor(rem / LAND_UNIT_SQM.aana);
|
|
144
|
+
rem -= aana * LAND_UNIT_SQM.aana;
|
|
145
|
+
const paisa = Math.floor(rem / LAND_UNIT_SQM.paisa);
|
|
146
|
+
rem -= paisa * LAND_UNIT_SQM.paisa;
|
|
147
|
+
const daam = Math.round(rem / LAND_UNIT_SQM.daam);
|
|
148
|
+
return carryRopani({ ropani, aana, paisa, daam });
|
|
149
|
+
}
|
|
150
|
+
function carryRopani(r) {
|
|
151
|
+
if (r.daam >= 4) {
|
|
152
|
+
r.paisa += Math.floor(r.daam / 4);
|
|
153
|
+
r.daam %= 4;
|
|
154
|
+
}
|
|
155
|
+
if (r.paisa >= 4) {
|
|
156
|
+
r.aana += Math.floor(r.paisa / 4);
|
|
157
|
+
r.paisa %= 4;
|
|
158
|
+
}
|
|
159
|
+
if (r.aana >= 16) {
|
|
160
|
+
r.ropani += Math.floor(r.aana / 16);
|
|
161
|
+
r.aana %= 16;
|
|
162
|
+
}
|
|
163
|
+
return r;
|
|
164
|
+
}
|
|
165
|
+
function sqMetersToBigha(m2) {
|
|
166
|
+
let rem = m2;
|
|
167
|
+
const bigha = Math.floor(rem / LAND_UNIT_SQM.bigha);
|
|
168
|
+
rem -= bigha * LAND_UNIT_SQM.bigha;
|
|
169
|
+
const kattha = Math.floor(rem / LAND_UNIT_SQM.kattha);
|
|
170
|
+
rem -= kattha * LAND_UNIT_SQM.kattha;
|
|
171
|
+
const dhur = Math.round(rem / LAND_UNIT_SQM.dhur);
|
|
172
|
+
if (dhur >= 20) return { bigha: bigha + Math.floor(dhur / 20), kattha, dhur: dhur % 20 };
|
|
173
|
+
if (kattha >= 20) return { bigha: bigha + Math.floor(kattha / 20), kattha: kattha % 20, dhur };
|
|
174
|
+
return { bigha, kattha, dhur };
|
|
175
|
+
}
|
|
176
|
+
function formatRopani(m2) {
|
|
177
|
+
const r = sqMetersToRopani(m2);
|
|
178
|
+
return `${r.ropani}-${r.aana}-${r.paisa}-${r.daam}`;
|
|
179
|
+
}
|
|
180
|
+
function formatBigha(m2) {
|
|
181
|
+
const b = sqMetersToBigha(m2);
|
|
182
|
+
return `${b.bigha}-${b.kattha}-${b.dhur}`;
|
|
183
|
+
}
|
|
184
|
+
function normalizeMobile(input) {
|
|
185
|
+
const s = fromDevanagari(input).replace(/[\s-]/g, "").replace(/^\+?977/, "");
|
|
186
|
+
return /^9[678]\d{8}$/.test(s) ? `+977${s}` : null;
|
|
187
|
+
}
|
|
188
|
+
function getCarrier(input) {
|
|
189
|
+
const n = normalizeMobile(input);
|
|
190
|
+
if (!n) return "unknown";
|
|
191
|
+
const p = n.slice(4, 7);
|
|
192
|
+
if (["984", "985", "986", "974", "975"].includes(p)) return "Ntc";
|
|
193
|
+
if (["980", "981", "982"].includes(p)) return "Ncell";
|
|
194
|
+
if (["961", "962", "988"].includes(p)) return "Smart Cell";
|
|
195
|
+
if (p === "972") return "UTL";
|
|
196
|
+
return "unknown";
|
|
197
|
+
}
|
|
83
198
|
function isValidNepaliMobile(input) {
|
|
84
|
-
const s = input.replace(/[\s-]/g, "");
|
|
199
|
+
const s = fromDevanagari(input).replace(/[\s-]/g, "");
|
|
85
200
|
return /^(\+?977)?9[678]\d{8}$/.test(s);
|
|
86
201
|
}
|
|
202
|
+
function isValidLandline(input) {
|
|
203
|
+
const s = input.replace(/[\s-]/g, "");
|
|
204
|
+
return /^0\d{7,9}$/.test(s);
|
|
205
|
+
}
|
|
87
206
|
function isValidPAN(input) {
|
|
88
207
|
return /^\d{9}$/.test(input.trim());
|
|
89
208
|
}
|
|
209
|
+
var isValidVAT = isValidPAN;
|
|
210
|
+
var NEPALI_0_99 = [
|
|
211
|
+
"\u0936\u0942\u0928\u094D\u092F",
|
|
212
|
+
"\u090F\u0915",
|
|
213
|
+
"\u0926\u0941\u0908",
|
|
214
|
+
"\u0924\u0940\u0928",
|
|
215
|
+
"\u091A\u093E\u0930",
|
|
216
|
+
"\u092A\u093E\u0901\u091A",
|
|
217
|
+
"\u091B",
|
|
218
|
+
"\u0938\u093E\u0924",
|
|
219
|
+
"\u0906\u0920",
|
|
220
|
+
"\u0928\u094C",
|
|
221
|
+
"\u0926\u0938",
|
|
222
|
+
"\u090F\u0918\u093E\u0930",
|
|
223
|
+
"\u092C\u093E\u0939\u094D\u0930",
|
|
224
|
+
"\u0924\u0947\u0939\u094D\u0930",
|
|
225
|
+
"\u091A\u094C\u0927",
|
|
226
|
+
"\u092A\u0928\u094D\u0927\u094D\u0930",
|
|
227
|
+
"\u0938\u094B\u0939\u094D\u0930",
|
|
228
|
+
"\u0938\u0924\u094D\u0930",
|
|
229
|
+
"\u0905\u0920\u093E\u0930",
|
|
230
|
+
"\u0909\u0928\u094D\u0928\u093E\u0907\u0938",
|
|
231
|
+
"\u092C\u0940\u0938",
|
|
232
|
+
"\u090F\u0915\u094D\u0915\u093E\u0907\u0938",
|
|
233
|
+
"\u092C\u093E\u0907\u0938",
|
|
234
|
+
"\u0924\u0947\u0907\u0938",
|
|
235
|
+
"\u091A\u094C\u092C\u093F\u0938",
|
|
236
|
+
"\u092A\u091A\u094D\u091A\u093F\u0938",
|
|
237
|
+
"\u091B\u092C\u094D\u092C\u093F\u0938",
|
|
238
|
+
"\u0938\u0924\u094D\u0924\u093E\u0907\u0938",
|
|
239
|
+
"\u0905\u0920\u094D\u0920\u093E\u0907\u0938",
|
|
240
|
+
"\u0909\u0928\u0928\u094D\u0924\u093F\u0938",
|
|
241
|
+
"\u0924\u093F\u0938",
|
|
242
|
+
"\u090F\u0915\u0924\u093F\u0938",
|
|
243
|
+
"\u092C\u0924\u094D\u0924\u093F\u0938",
|
|
244
|
+
"\u0924\u0947\u0924\u094D\u0924\u093F\u0938",
|
|
245
|
+
"\u091A\u094C\u0901\u0924\u093F\u0938",
|
|
246
|
+
"\u092A\u0948\u0901\u0924\u093F\u0938",
|
|
247
|
+
"\u091B\u0924\u094D\u0924\u093F\u0938",
|
|
248
|
+
"\u0938\u0948\u0901\u0924\u093F\u0938",
|
|
249
|
+
"\u0905\u0920\u0924\u093F\u0938",
|
|
250
|
+
"\u0909\u0928\u0928\u094D\u091A\u093E\u0932\u093F\u0938",
|
|
251
|
+
"\u091A\u093E\u0932\u093F\u0938",
|
|
252
|
+
"\u090F\u0915\u091A\u093E\u0932\u093F\u0938",
|
|
253
|
+
"\u092C\u092F\u093E\u0932\u093F\u0938",
|
|
254
|
+
"\u0924\u094D\u0930\u093F\u091A\u093E\u0932\u093F\u0938",
|
|
255
|
+
"\u091A\u0935\u093E\u0932\u093F\u0938",
|
|
256
|
+
"\u092A\u0948\u0901\u0924\u093E\u0932\u093F\u0938",
|
|
257
|
+
"\u091B\u092F\u093E\u0932\u093F\u0938",
|
|
258
|
+
"\u0938\u0924\u091A\u093E\u0932\u093F\u0938",
|
|
259
|
+
"\u0905\u0920\u091A\u093E\u0932\u093F\u0938",
|
|
260
|
+
"\u0909\u0928\u0928\u094D\u091A\u093E\u0938",
|
|
261
|
+
"\u092A\u091A\u093E\u0938",
|
|
262
|
+
"\u090F\u0915\u093E\u0909\u0928\u094D\u0928",
|
|
263
|
+
"\u092C\u093E\u0909\u0928\u094D\u0928",
|
|
264
|
+
"\u0924\u094D\u0930\u093F\u092A\u0928\u094D\u0928",
|
|
265
|
+
"\u091A\u0935\u0928\u094D\u0928",
|
|
266
|
+
"\u092A\u091A\u092A\u0928\u094D\u0928",
|
|
267
|
+
"\u091B\u092A\u0928\u094D\u0928",
|
|
268
|
+
"\u0938\u0928\u094D\u0924\u093E\u0909\u0928\u094D\u0928",
|
|
269
|
+
"\u0905\u0928\u094D\u0920\u093E\u0909\u0928\u094D\u0928",
|
|
270
|
+
"\u0909\u0928\u0928\u094D\u0938\u093E\u0920\u0940",
|
|
271
|
+
"\u0938\u093E\u0920\u0940",
|
|
272
|
+
"\u090F\u0915\u0938\u091F\u094D\u0920\u0940",
|
|
273
|
+
"\u092C\u092F\u0938\u091F\u094D\u0920\u0940",
|
|
274
|
+
"\u0924\u094D\u0930\u093F\u0938\u091F\u094D\u0920\u0940",
|
|
275
|
+
"\u091A\u094C\u0902\u0938\u091F\u094D\u0920\u0940",
|
|
276
|
+
"\u092A\u0948\u0902\u0938\u091F\u094D\u0920\u0940",
|
|
277
|
+
"\u091B\u092F\u0938\u091F\u094D\u0920\u0940",
|
|
278
|
+
"\u0938\u0924\u0938\u091F\u094D\u0920\u0940",
|
|
279
|
+
"\u0905\u0920\u0938\u091F\u094D\u0920\u0940",
|
|
280
|
+
"\u0909\u0928\u0928\u094D\u0938\u0924\u094D\u0924\u0930\u0940",
|
|
281
|
+
"\u0938\u0924\u094D\u0924\u0930\u0940",
|
|
282
|
+
"\u090F\u0915\u0939\u0924\u094D\u0924\u0930",
|
|
283
|
+
"\u092C\u0939\u0924\u094D\u0924\u0930",
|
|
284
|
+
"\u0924\u094D\u0930\u093F\u0939\u0924\u094D\u0924\u0930",
|
|
285
|
+
"\u091A\u094C\u0939\u0924\u094D\u0924\u0930",
|
|
286
|
+
"\u092A\u091A\u0939\u0924\u094D\u0924\u0930",
|
|
287
|
+
"\u091B\u092F\u0939\u0924\u094D\u0924\u0930",
|
|
288
|
+
"\u0938\u0924\u0939\u0924\u094D\u0924\u0930",
|
|
289
|
+
"\u0905\u0920\u0939\u0924\u094D\u0924\u0930",
|
|
290
|
+
"\u0909\u0928\u093E\u0938\u0940",
|
|
291
|
+
"\u0905\u0938\u0940",
|
|
292
|
+
"\u090F\u0915\u093E\u0938\u0940",
|
|
293
|
+
"\u092C\u092F\u093E\u0938\u0940",
|
|
294
|
+
"\u0924\u094D\u0930\u093F\u092F\u093E\u0938\u0940",
|
|
295
|
+
"\u091A\u094C\u0930\u093E\u0938\u0940",
|
|
296
|
+
"\u092A\u091A\u093E\u0938\u0940",
|
|
297
|
+
"\u091B\u092F\u093E\u0938\u0940",
|
|
298
|
+
"\u0938\u0924\u093E\u0938\u0940",
|
|
299
|
+
"\u0905\u0920\u093E\u0938\u0940",
|
|
300
|
+
"\u0909\u0928\u093E\u0928\u094D\u0928\u092C\u094D\u092C\u0947",
|
|
301
|
+
"\u0928\u092C\u094D\u092C\u0947",
|
|
302
|
+
"\u090F\u0915\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
303
|
+
"\u092C\u092F\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
304
|
+
"\u0924\u094D\u0930\u093F\u092F\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
305
|
+
"\u091A\u094C\u0930\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
306
|
+
"\u092A\u0928\u094D\u091A\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
307
|
+
"\u091B\u092F\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
308
|
+
"\u0938\u0928\u094D\u0924\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
309
|
+
"\u0905\u0928\u094D\u0920\u093E\u0928\u092C\u094D\u092C\u0947",
|
|
310
|
+
"\u0909\u0928\u093E\u0928\u094D\u0938\u092F"
|
|
311
|
+
];
|
|
312
|
+
function numberToWordsNepali(value) {
|
|
313
|
+
let n = Math.floor(Math.abs(value));
|
|
314
|
+
if (n === 0) return NEPALI_0_99[0];
|
|
315
|
+
const parts = [];
|
|
316
|
+
const units = [
|
|
317
|
+
[1e9, "\u0905\u0930\u092C"],
|
|
318
|
+
[1e7, "\u0915\u0930\u094B\u0921"],
|
|
319
|
+
[1e5, "\u0932\u093E\u0916"],
|
|
320
|
+
[1e3, "\u0939\u091C\u093E\u0930"],
|
|
321
|
+
[100, "\u0938\u092F"]
|
|
322
|
+
];
|
|
323
|
+
for (const [size, name] of units) {
|
|
324
|
+
if (n >= size) {
|
|
325
|
+
const count = Math.floor(n / size);
|
|
326
|
+
parts.push(`${NEPALI_0_99[count]} ${name}`);
|
|
327
|
+
n %= size;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (n > 0) parts.push(NEPALI_0_99[n]);
|
|
331
|
+
return (value < 0 ? "\u092E\u093E\u0907\u0928\u0938 " : "") + parts.join(" ");
|
|
332
|
+
}
|
|
333
|
+
function amountInWordsNepali(amount) {
|
|
334
|
+
const rupees = Math.floor(Math.abs(amount));
|
|
335
|
+
const paisa = Math.round((Math.abs(amount) - rupees) * 100);
|
|
336
|
+
let out = "\u0930\u0941\u092A\u0948\u092F\u093E\u0901 " + numberToWordsNepali(rupees);
|
|
337
|
+
if (paisa > 0) out += " " + numberToWordsNepali(paisa) + " \u092A\u0948\u0938\u093E";
|
|
338
|
+
return (amount < 0 ? "\u092E\u093E\u0907\u0928\u0938 " : "") + out + " \u092E\u093E\u0924\u094D\u0930";
|
|
339
|
+
}
|
|
90
340
|
var PROVINCES = [
|
|
91
341
|
{ number: 1, name: "Koshi", nameNp: "\u0915\u094B\u0936\u0940", capital: "Biratnagar" },
|
|
92
342
|
{ number: 2, name: "Madhesh", nameNp: "\u092E\u0927\u0947\u0936", capital: "Janakpur" },
|
|
@@ -96,7 +346,100 @@ var PROVINCES = [
|
|
|
96
346
|
{ number: 6, name: "Karnali", nameNp: "\u0915\u0930\u094D\u0923\u093E\u0932\u0940", capital: "Birendranagar" },
|
|
97
347
|
{ number: 7, name: "Sudurpashchim", nameNp: "\u0938\u0941\u0926\u0942\u0930\u092A\u0936\u094D\u091A\u093F\u092E", capital: "Godawari" }
|
|
98
348
|
];
|
|
349
|
+
var DISTRICTS = [
|
|
350
|
+
// Koshi (1)
|
|
351
|
+
{ name: "Bhojpur", nameNp: "\u092D\u094B\u091C\u092A\u0941\u0930", province: 1 },
|
|
352
|
+
{ name: "Dhankuta", nameNp: "\u0927\u0928\u0915\u0941\u091F\u093E", province: 1 },
|
|
353
|
+
{ name: "Ilam", nameNp: "\u0907\u0932\u093E\u092E", province: 1 },
|
|
354
|
+
{ name: "Jhapa", nameNp: "\u091D\u093E\u092A\u093E", province: 1 },
|
|
355
|
+
{ name: "Khotang", nameNp: "\u0916\u094B\u091F\u093E\u0919", province: 1 },
|
|
356
|
+
{ name: "Morang", nameNp: "\u092E\u094B\u0930\u0919", province: 1 },
|
|
357
|
+
{ name: "Okhaldhunga", nameNp: "\u0913\u0916\u0932\u0922\u0941\u0902\u0917\u093E", province: 1 },
|
|
358
|
+
{ name: "Panchthar", nameNp: "\u092A\u093E\u0901\u091A\u0925\u0930", province: 1 },
|
|
359
|
+
{ name: "Sankhuwasabha", nameNp: "\u0938\u0902\u0916\u0941\u0935\u093E\u0938\u092D\u093E", province: 1 },
|
|
360
|
+
{ name: "Solukhumbu", nameNp: "\u0938\u094B\u0932\u0941\u0916\u0941\u092E\u094D\u092C\u0941", province: 1 },
|
|
361
|
+
{ name: "Sunsari", nameNp: "\u0938\u0941\u0928\u0938\u0930\u0940", province: 1 },
|
|
362
|
+
{ name: "Taplejung", nameNp: "\u0924\u093E\u092A\u094D\u0932\u0947\u091C\u0941\u0919", province: 1 },
|
|
363
|
+
{ name: "Terhathum", nameNp: "\u0924\u0947\u0939\u094D\u0930\u0925\u0941\u092E", province: 1 },
|
|
364
|
+
{ name: "Udayapur", nameNp: "\u0909\u0926\u092F\u092A\u0941\u0930", province: 1 },
|
|
365
|
+
// Madhesh (2)
|
|
366
|
+
{ name: "Bara", nameNp: "\u092C\u093E\u0930\u093E", province: 2 },
|
|
367
|
+
{ name: "Dhanusha", nameNp: "\u0927\u0928\u0941\u0937\u093E", province: 2 },
|
|
368
|
+
{ name: "Mahottari", nameNp: "\u092E\u0939\u094B\u0924\u094D\u0924\u0930\u0940", province: 2 },
|
|
369
|
+
{ name: "Parsa", nameNp: "\u092A\u0930\u094D\u0938\u093E", province: 2 },
|
|
370
|
+
{ name: "Rautahat", nameNp: "\u0930\u094C\u0924\u0939\u091F", province: 2 },
|
|
371
|
+
{ name: "Saptari", nameNp: "\u0938\u092A\u094D\u0924\u0930\u0940", province: 2 },
|
|
372
|
+
{ name: "Sarlahi", nameNp: "\u0938\u0930\u094D\u0932\u093E\u0939\u0940", province: 2 },
|
|
373
|
+
{ name: "Siraha", nameNp: "\u0938\u093F\u0930\u0939\u093E", province: 2 },
|
|
374
|
+
// Bagmati (3)
|
|
375
|
+
{ name: "Bhaktapur", nameNp: "\u092D\u0915\u094D\u0924\u092A\u0941\u0930", province: 3 },
|
|
376
|
+
{ name: "Chitwan", nameNp: "\u091A\u093F\u0924\u0935\u0928", province: 3 },
|
|
377
|
+
{ name: "Dhading", nameNp: "\u0927\u093E\u0926\u093F\u0919", province: 3 },
|
|
378
|
+
{ name: "Dolakha", nameNp: "\u0926\u094B\u0932\u0916\u093E", province: 3 },
|
|
379
|
+
{ name: "Kathmandu", nameNp: "\u0915\u093E\u0920\u092E\u093E\u0921\u094C\u0902", province: 3 },
|
|
380
|
+
{ name: "Kavrepalanchok", nameNp: "\u0915\u093E\u092D\u094D\u0930\u0947\u092A\u0932\u093E\u091E\u094D\u091A\u094B\u0915", province: 3 },
|
|
381
|
+
{ name: "Lalitpur", nameNp: "\u0932\u0932\u093F\u0924\u092A\u0941\u0930", province: 3 },
|
|
382
|
+
{ name: "Makwanpur", nameNp: "\u092E\u0915\u0935\u093E\u0928\u092A\u0941\u0930", province: 3 },
|
|
383
|
+
{ name: "Nuwakot", nameNp: "\u0928\u0941\u0935\u093E\u0915\u094B\u091F", province: 3 },
|
|
384
|
+
{ name: "Ramechhap", nameNp: "\u0930\u093E\u092E\u0947\u091B\u093E\u092A", province: 3 },
|
|
385
|
+
{ name: "Rasuwa", nameNp: "\u0930\u0938\u0941\u0935\u093E", province: 3 },
|
|
386
|
+
{ name: "Sindhuli", nameNp: "\u0938\u093F\u0928\u094D\u0927\u0941\u0932\u0940", province: 3 },
|
|
387
|
+
{ name: "Sindhupalchok", nameNp: "\u0938\u093F\u0928\u094D\u0927\u0941\u092A\u093E\u0932\u094D\u091A\u094B\u0915", province: 3 },
|
|
388
|
+
// Gandaki (4)
|
|
389
|
+
{ name: "Baglung", nameNp: "\u092C\u093E\u0917\u0932\u0941\u0919", province: 4 },
|
|
390
|
+
{ name: "Gorkha", nameNp: "\u0917\u094B\u0930\u0916\u093E", province: 4 },
|
|
391
|
+
{ name: "Kaski", nameNp: "\u0915\u093E\u0938\u094D\u0915\u0940", province: 4 },
|
|
392
|
+
{ name: "Lamjung", nameNp: "\u0932\u092E\u091C\u0941\u0919", province: 4 },
|
|
393
|
+
{ name: "Manang", nameNp: "\u092E\u0928\u093E\u0919", province: 4 },
|
|
394
|
+
{ name: "Mustang", nameNp: "\u092E\u0941\u0938\u094D\u0924\u093E\u0919", province: 4 },
|
|
395
|
+
{ name: "Myagdi", nameNp: "\u092E\u094D\u092F\u093E\u0917\u094D\u0926\u0940", province: 4 },
|
|
396
|
+
{ name: "Nawalpur", nameNp: "\u0928\u0935\u0932\u092A\u0941\u0930", province: 4 },
|
|
397
|
+
{ name: "Parbat", nameNp: "\u092A\u0930\u094D\u0935\u0924", province: 4 },
|
|
398
|
+
{ name: "Syangja", nameNp: "\u0938\u094D\u092F\u093E\u0919\u094D\u091C\u093E", province: 4 },
|
|
399
|
+
{ name: "Tanahun", nameNp: "\u0924\u0928\u0939\u0941\u0901", province: 4 },
|
|
400
|
+
// Lumbini (5)
|
|
401
|
+
{ name: "Arghakhanchi", nameNp: "\u0905\u0930\u094D\u0918\u093E\u0916\u093E\u0901\u091A\u0940", province: 5 },
|
|
402
|
+
{ name: "Banke", nameNp: "\u092C\u093E\u0901\u0915\u0947", province: 5 },
|
|
403
|
+
{ name: "Bardiya", nameNp: "\u092C\u0930\u094D\u0926\u093F\u092F\u093E", province: 5 },
|
|
404
|
+
{ name: "Dang", nameNp: "\u0926\u093E\u0919", province: 5 },
|
|
405
|
+
{ name: "Eastern Rukum", nameNp: "\u092A\u0942\u0930\u094D\u0935\u0940 \u0930\u0941\u0915\u0941\u092E", province: 5 },
|
|
406
|
+
{ name: "Gulmi", nameNp: "\u0917\u0941\u0932\u094D\u092E\u0940", province: 5 },
|
|
407
|
+
{ name: "Kapilvastu", nameNp: "\u0915\u092A\u093F\u0932\u0935\u0938\u094D\u0924\u0941", province: 5 },
|
|
408
|
+
{ name: "Parasi", nameNp: "\u0928\u0935\u0932\u092A\u0930\u093E\u0938\u0940 (\u092A\u0936\u094D\u091A\u093F\u092E)", province: 5 },
|
|
409
|
+
{ name: "Palpa", nameNp: "\u092A\u093E\u0932\u094D\u092A\u093E", province: 5 },
|
|
410
|
+
{ name: "Pyuthan", nameNp: "\u092A\u094D\u092F\u0941\u0920\u093E\u0928", province: 5 },
|
|
411
|
+
{ name: "Rolpa", nameNp: "\u0930\u094B\u0932\u094D\u092A\u093E", province: 5 },
|
|
412
|
+
{ name: "Rupandehi", nameNp: "\u0930\u0942\u092A\u0928\u094D\u0926\u0947\u0939\u0940", province: 5 },
|
|
413
|
+
// Karnali (6)
|
|
414
|
+
{ name: "Dailekh", nameNp: "\u0926\u0948\u0932\u0947\u0916", province: 6 },
|
|
415
|
+
{ name: "Dolpa", nameNp: "\u0921\u094B\u0932\u094D\u092A\u093E", province: 6 },
|
|
416
|
+
{ name: "Humla", nameNp: "\u0939\u0941\u092E\u094D\u0932\u093E", province: 6 },
|
|
417
|
+
{ name: "Jajarkot", nameNp: "\u091C\u093E\u091C\u0930\u0915\u094B\u091F", province: 6 },
|
|
418
|
+
{ name: "Jumla", nameNp: "\u091C\u0941\u092E\u094D\u0932\u093E", province: 6 },
|
|
419
|
+
{ name: "Kalikot", nameNp: "\u0915\u093E\u0932\u093F\u0915\u094B\u091F", province: 6 },
|
|
420
|
+
{ name: "Mugu", nameNp: "\u092E\u0941\u0917\u0941", province: 6 },
|
|
421
|
+
{ name: "Salyan", nameNp: "\u0938\u0932\u094D\u092F\u093E\u0928", province: 6 },
|
|
422
|
+
{ name: "Surkhet", nameNp: "\u0938\u0941\u0930\u094D\u0916\u0947\u0924", province: 6 },
|
|
423
|
+
{ name: "Western Rukum", nameNp: "\u092A\u0936\u094D\u091A\u093F\u092E\u0940 \u0930\u0941\u0915\u0941\u092E", province: 6 },
|
|
424
|
+
// Sudurpashchim (7)
|
|
425
|
+
{ name: "Achham", nameNp: "\u0905\u091B\u093E\u092E", province: 7 },
|
|
426
|
+
{ name: "Baitadi", nameNp: "\u092C\u0948\u0924\u0921\u0940", province: 7 },
|
|
427
|
+
{ name: "Bajhang", nameNp: "\u092C\u091D\u093E\u0919", province: 7 },
|
|
428
|
+
{ name: "Bajura", nameNp: "\u092C\u093E\u091C\u0941\u0930\u093E", province: 7 },
|
|
429
|
+
{ name: "Dadeldhura", nameNp: "\u0921\u0921\u0947\u0932\u094D\u0927\u0941\u0930\u093E", province: 7 },
|
|
430
|
+
{ name: "Darchula", nameNp: "\u0926\u093E\u0930\u094D\u091A\u0941\u0932\u093E", province: 7 },
|
|
431
|
+
{ name: "Doti", nameNp: "\u0921\u094B\u091F\u0940", province: 7 },
|
|
432
|
+
{ name: "Kailali", nameNp: "\u0915\u0948\u0932\u093E\u0932\u0940", province: 7 },
|
|
433
|
+
{ name: "Kanchanpur", nameNp: "\u0915\u091E\u094D\u091A\u0928\u092A\u0941\u0930", province: 7 }
|
|
434
|
+
];
|
|
435
|
+
function districtsByProvince(province) {
|
|
436
|
+
return DISTRICTS.filter((d) => d.province === province);
|
|
437
|
+
}
|
|
438
|
+
function findDistrict(name) {
|
|
439
|
+
const q = name.trim().toLowerCase();
|
|
440
|
+
return DISTRICTS.find((d) => d.name.toLowerCase() === q || d.nameNp === name.trim());
|
|
441
|
+
}
|
|
99
442
|
|
|
100
|
-
export { PROVINCES, amountInWords, formatNPR, fromDevanagari, groupNepali, isValidNepaliMobile, isValidPAN, numberToWords, toDevanagari };
|
|
443
|
+
export { DISTRICTS, LAND_UNIT_SQM, PROVINCES, amountInWords, amountInWordsNepali, convertLand, districtsByProvince, findDistrict, formatBigha, formatCompactNPR, formatNPR, formatRopani, fromDevanagari, getCarrier, groupNepali, isValidLandline, isValidNepaliMobile, isValidPAN, isValidVAT, landToSqMeters, normalizeMobile, numberToWords, numberToWordsNepali, parseNPR, sqMetersToBigha, sqMetersToRopani, toDevanagari, ungroupNepali };
|
|
101
444
|
//# sourceMappingURL=index.js.map
|
|
102
445
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @lacspace/nepali-utils — everyday Nepal helpers: NPR currency formatting,\n * Nepali (South-Asian) digit grouping, Devanagari numerals, amount-in-words,\n * common validators, and province data. Zero-dependency, isomorphic.\n */\n\nconst DEVANAGARI = [\"०\", \"१\", \"२\", \"३\", \"४\", \"५\", \"६\", \"७\", \"८\", \"९\"] as const;\n\n/** Convert Arabic numerals to Devanagari: `\"2081\"` → `\"२०८१\"`. */\nexport function toDevanagari(input: string | number): string {\n return String(input).replace(/[0-9]/g, (d) => DEVANAGARI[Number(d)]!);\n}\n\n/** Convert Devanagari numerals to Arabic: `\"२०८१\"` → `\"2081\"`. */\nexport function fromDevanagari(input: string): string {\n return input.replace(/[०-९]/g, (d) => String(DEVANAGARI.indexOf(d as (typeof DEVANAGARI)[number])));\n}\n\n/**\n * Group an integer with the South-Asian (Nepali) system: the last three digits,\n * then groups of two. `1234567` → `\"12,34,567\"`.\n */\nexport function groupNepali(value: number | string): string {\n const s = String(value).replace(/[^\\d]/g, \"\");\n if (s.length <= 3) return s;\n const last3 = s.slice(-3);\n const rest = s.slice(0, -3);\n return rest.replace(/\\B(?=(\\d{2})+(?!\\d))/g, \",\") + \",\" + last3;\n}\n\nexport interface FormatNprOptions {\n /** Show a symbol/prefix. Default `\"Rs. \"`. Use `\"\"` for none. */\n symbol?: string;\n /** Number of decimal places. Default `2`. */\n decimals?: number;\n /** Render digits in Devanagari. Default `false`. */\n devanagari?: boolean;\n}\n\n/**\n * Format an amount as Nepalese Rupees with South-Asian grouping.\n * `formatNPR(1234567.5)` → `\"Rs. 12,34,567.50\"`.\n */\nexport function formatNPR(amount: number, options: FormatNprOptions = {}): string {\n const { symbol = \"Rs. \", decimals = 2, devanagari = false } = options;\n const negative = amount < 0;\n const fixed = Math.abs(amount).toFixed(decimals);\n const [intPart, decPart] = fixed.split(\".\");\n let out = groupNepali(intPart!);\n if (decPart) out += \".\" + decPart;\n if (devanagari) out = toDevanagari(out);\n return (negative ? \"-\" : \"\") + symbol + out;\n}\n\nconst ONES = [\n \"\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\",\n \"Ten\", \"Eleven\", \"Twelve\", \"Thirteen\", \"Fourteen\", \"Fifteen\", \"Sixteen\",\n \"Seventeen\", \"Eighteen\", \"Nineteen\",\n];\nconst TENS = [\"\", \"\", \"Twenty\", \"Thirty\", \"Forty\", \"Fifty\", \"Sixty\", \"Seventy\", \"Eighty\", \"Ninety\"];\n\nfunction twoDigitWords(n: number): string {\n if (n < 20) return ONES[n]!;\n const t = Math.floor(n / 10);\n const o = n % 10;\n return TENS[t]! + (o ? \" \" + ONES[o] : \"\");\n}\n\n/**\n * Amount in words using the South-Asian system (Thousand, Lakh, Crore, Arab) —\n * perfect for invoices. `numberToWords(1234567)` →\n * `\"Twelve Lakh Thirty Four Thousand Five Hundred Sixty Seven\"`.\n */\nexport function numberToWords(value: number): string {\n let n = Math.floor(Math.abs(value));\n if (n === 0) return \"Zero\";\n const parts: string[] = [];\n const units: [number, string][] = [\n [1e9, \"Arab\"],\n [1e7, \"Crore\"],\n [1e5, \"Lakh\"],\n [1e3, \"Thousand\"],\n [1e2, \"Hundred\"],\n ];\n for (const [size, name] of units) {\n if (n >= size) {\n const count = Math.floor(n / size);\n // Hundreds are 1–9; the higher units take up to two digits.\n parts.push((size === 100 ? ONES[count] : twoDigitWords(count)) + \" \" + name);\n n %= size;\n }\n }\n if (n > 0) parts.push(twoDigitWords(n));\n return (value < 0 ? \"Minus \" : \"\") + parts.join(\" \");\n}\n\n/** `numberToWords` plus a \"Rupees … only\" wrapper for invoices. */\nexport function amountInWords(amount: number): string {\n const rupees = Math.floor(Math.abs(amount));\n const paisa = Math.round((Math.abs(amount) - rupees) * 100);\n let out = \"Rupees \" + numberToWords(rupees);\n if (paisa > 0) out += \" and \" + numberToWords(paisa) + \" Paisa\";\n return (amount < 0 ? \"Minus \" : \"\") + out + \" Only\";\n}\n\n/** True for a valid Nepali mobile number (10 digits starting 96–98, optional +977). */\nexport function isValidNepaliMobile(input: string): boolean {\n const s = input.replace(/[\\s-]/g, \"\");\n return /^(\\+?977)?9[678]\\d{8}$/.test(s);\n}\n\n/** True for a valid Nepal PAN / VAT number (9 digits). */\nexport function isValidPAN(input: string): boolean {\n return /^\\d{9}$/.test(input.trim());\n}\n\nexport interface Province {\n number: number;\n name: string;\n nameNp: string;\n capital: string;\n}\n\n/** Nepal's seven federal provinces. */\nexport const PROVINCES: readonly Province[] = [\n { number: 1, name: \"Koshi\", nameNp: \"कोशी\", capital: \"Biratnagar\" },\n { number: 2, name: \"Madhesh\", nameNp: \"मधेश\", capital: \"Janakpur\" },\n { number: 3, name: \"Bagmati\", nameNp: \"बागमती\", capital: \"Hetauda\" },\n { number: 4, name: \"Gandaki\", nameNp: \"गण्डकी\", capital: \"Pokhara\" },\n { number: 5, name: \"Lumbini\", nameNp: \"लुम्बिनी\", capital: \"Deukhuri\" },\n { number: 6, name: \"Karnali\", nameNp: \"कर्णाली\", capital: \"Birendranagar\" },\n { number: 7, name: \"Sudurpashchim\", nameNp: \"सुदूरपश्चिम\", capital: \"Godawari\" },\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @lacspace/nepali-utils — everyday Nepal helpers: NPR currency formatting,\n * Nepali (South-Asian) digit grouping, Devanagari numerals, amount-in-words,\n * common validators, and province data. Zero-dependency, isomorphic.\n */\n\nconst DEVANAGARI = [\"०\", \"१\", \"२\", \"३\", \"४\", \"५\", \"६\", \"७\", \"८\", \"९\"] as const;\n\n/** Convert Arabic numerals to Devanagari: `\"2081\"` → `\"२०८१\"`. */\nexport function toDevanagari(input: string | number): string {\n return String(input).replace(/[0-9]/g, (d) => DEVANAGARI[Number(d)]!);\n}\n\n/** Convert Devanagari numerals to Arabic: `\"२०८१\"` → `\"2081\"`. */\nexport function fromDevanagari(input: string): string {\n return input.replace(/[०-९]/g, (d) => String(DEVANAGARI.indexOf(d as (typeof DEVANAGARI)[number])));\n}\n\n/**\n * Group an integer with the South-Asian (Nepali) system: the last three digits,\n * then groups of two. `1234567` → `\"12,34,567\"`.\n */\nexport function groupNepali(value: number | string): string {\n const s = String(value).replace(/[^\\d]/g, \"\");\n if (s.length <= 3) return s;\n const last3 = s.slice(-3);\n const rest = s.slice(0, -3);\n return rest.replace(/\\B(?=(\\d{2})+(?!\\d))/g, \",\") + \",\" + last3;\n}\n\nexport interface FormatNprOptions {\n /** Show a symbol/prefix. Default `\"Rs. \"`. Use `\"\"` for none. */\n symbol?: string;\n /** Number of decimal places. Default `2`. */\n decimals?: number;\n /** Render digits in Devanagari. Default `false`. */\n devanagari?: boolean;\n}\n\n/**\n * Format an amount as Nepalese Rupees with South-Asian grouping.\n * `formatNPR(1234567.5)` → `\"Rs. 12,34,567.50\"`.\n */\nexport function formatNPR(amount: number, options: FormatNprOptions = {}): string {\n const { symbol = \"Rs. \", decimals = 2, devanagari = false } = options;\n const negative = amount < 0;\n const fixed = Math.abs(amount).toFixed(decimals);\n const [intPart, decPart] = fixed.split(\".\");\n let out = groupNepali(intPart!);\n if (decPart) out += \".\" + decPart;\n if (devanagari) out = toDevanagari(out);\n return (negative ? \"-\" : \"\") + symbol + out;\n}\n\nconst ONES = [\n \"\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\",\n \"Ten\", \"Eleven\", \"Twelve\", \"Thirteen\", \"Fourteen\", \"Fifteen\", \"Sixteen\",\n \"Seventeen\", \"Eighteen\", \"Nineteen\",\n];\nconst TENS = [\"\", \"\", \"Twenty\", \"Thirty\", \"Forty\", \"Fifty\", \"Sixty\", \"Seventy\", \"Eighty\", \"Ninety\"];\n\nfunction twoDigitWords(n: number): string {\n if (n < 20) return ONES[n]!;\n const t = Math.floor(n / 10);\n const o = n % 10;\n return TENS[t]! + (o ? \" \" + ONES[o] : \"\");\n}\n\n/**\n * Amount in words using the South-Asian system (Thousand, Lakh, Crore, Arab) —\n * perfect for invoices. `numberToWords(1234567)` →\n * `\"Twelve Lakh Thirty Four Thousand Five Hundred Sixty Seven\"`.\n */\nexport function numberToWords(value: number): string {\n let n = Math.floor(Math.abs(value));\n if (n === 0) return \"Zero\";\n const parts: string[] = [];\n const units: [number, string][] = [\n [1e9, \"Arab\"],\n [1e7, \"Crore\"],\n [1e5, \"Lakh\"],\n [1e3, \"Thousand\"],\n [1e2, \"Hundred\"],\n ];\n for (const [size, name] of units) {\n if (n >= size) {\n const count = Math.floor(n / size);\n // Hundreds are 1–9; the higher units take up to two digits.\n parts.push((size === 100 ? ONES[count] : twoDigitWords(count)) + \" \" + name);\n n %= size;\n }\n }\n if (n > 0) parts.push(twoDigitWords(n));\n return (value < 0 ? \"Minus \" : \"\") + parts.join(\" \");\n}\n\n/** `numberToWords` plus a \"Rupees … only\" wrapper for invoices. */\nexport function amountInWords(amount: number): string {\n const rupees = Math.floor(Math.abs(amount));\n const paisa = Math.round((Math.abs(amount) - rupees) * 100);\n let out = \"Rupees \" + numberToWords(rupees);\n if (paisa > 0) out += \" and \" + numberToWords(paisa) + \" Paisa\";\n return (amount < 0 ? \"Minus \" : \"\") + out + \" Only\";\n}\n\n/** Parse a formatted NPR/Nepali-grouped string back to a number (inverse of {@link formatNPR}). */\nexport function ungroupNepali(input: string | number): number {\n let s = fromDevanagari(String(input)).trim();\n const negative = s.startsWith(\"-\");\n s = s.replace(/₹|rs\\.?|npr|रू\\.?|रु\\.?/gi, \"\"); // strip currency symbols (incl. the dot in \"Rs.\")\n s = s.replace(/[^\\d.]/g, \"\"); // drop grouping commas, spaces, everything else\n if (s === \"\") return NaN;\n const num = Number(s);\n return negative && !Number.isNaN(num) ? -num : num;\n}\n\n/** Alias of {@link ungroupNepali} — parse an NPR string to a number. */\nexport const parseNPR = ungroupNepali;\n\nfunction trimNum(n: number): string {\n return Number(n.toFixed(2)).toString();\n}\n\nexport interface CompactNprOptions {\n symbol?: string;\n /** Use Nepali scale words (हजार/लाख/करोड/अरब). Default false (K/Lakh/Cr/Arab). */\n nepali?: boolean;\n /** Render digits in Devanagari. Default false. */\n devanagari?: boolean;\n}\n\n/** Compact NPR: `formatCompactNPR(1234567)` → `\"Rs. 12.35 Lakh\"`. */\nexport function formatCompactNPR(amount: number, options: CompactNprOptions = {}): string {\n const { symbol = \"Rs. \", nepali = false, devanagari = false } = options;\n const negative = amount < 0;\n const a = Math.abs(amount);\n const units: [number, string, string][] = [\n [1e9, \"Arab\", \"अरब\"],\n [1e7, \"Cr\", \"करोड\"],\n [1e5, \"Lakh\", \"लाख\"],\n [1e3, \"K\", \"हजार\"],\n ];\n let out: string;\n const u = units.find(([size]) => a >= size);\n if (u) out = `${trimNum(a / u[0])} ${nepali ? u[2] : u[1]}`;\n else out = trimNum(a);\n if (devanagari) out = toDevanagari(out);\n return (negative ? \"-\" : \"\") + symbol + out;\n}\n\n/* ------------------------------ land-area units ------------------------------ */\n\nexport type LandUnit = \"ropani\" | \"aana\" | \"paisa\" | \"daam\" | \"bigha\" | \"kattha\" | \"dhur\" | \"sqm\" | \"sqft\";\n\n/** Area of one unit in square metres (hilly = ropani system, terai = bigha system). */\nexport const LAND_UNIT_SQM: Record<LandUnit, number> = {\n ropani: 508.7369, // 5476 sq ft\n aana: 31.79606, // ropani / 16\n paisa: 7.949014, // ropani / 64\n daam: 1.987254, // ropani / 256\n bigha: 6772.631, // 72900 sq ft\n kattha: 338.6315, // bigha / 20\n dhur: 16.93158, // bigha / 400\n sqm: 1,\n sqft: 0.09290304,\n};\n\n/** Total square metres from a mixed measure, e.g. `{ ropani: 2, aana: 3 }` or `{ bigha: 1, kattha: 5 }`. */\nexport function landToSqMeters(measure: Partial<Record<LandUnit, number>>): number {\n let m2 = 0;\n for (const [unit, value] of Object.entries(measure)) m2 += (value ?? 0) * LAND_UNIT_SQM[unit as LandUnit];\n return m2;\n}\n\n/** Convert an area between any two land units. */\nexport function convertLand(value: number, from: LandUnit, to: LandUnit): number {\n return (value * LAND_UNIT_SQM[from]) / LAND_UNIT_SQM[to];\n}\n\n/** Break square metres into the hilly system: `{ ropani, aana, paisa, daam }`. */\nexport function sqMetersToRopani(m2: number): { ropani: number; aana: number; paisa: number; daam: number } {\n let rem = m2;\n const ropani = Math.floor(rem / LAND_UNIT_SQM.ropani);\n rem -= ropani * LAND_UNIT_SQM.ropani;\n const aana = Math.floor(rem / LAND_UNIT_SQM.aana);\n rem -= aana * LAND_UNIT_SQM.aana;\n const paisa = Math.floor(rem / LAND_UNIT_SQM.paisa);\n rem -= paisa * LAND_UNIT_SQM.paisa;\n const daam = Math.round(rem / LAND_UNIT_SQM.daam);\n return carryRopani({ ropani, aana, paisa, daam });\n}\n\nfunction carryRopani(r: { ropani: number; aana: number; paisa: number; daam: number }) {\n if (r.daam >= 4) { r.paisa += Math.floor(r.daam / 4); r.daam %= 4; }\n if (r.paisa >= 4) { r.aana += Math.floor(r.paisa / 4); r.paisa %= 4; }\n if (r.aana >= 16) { r.ropani += Math.floor(r.aana / 16); r.aana %= 16; }\n return r;\n}\n\n/** Break square metres into the terai system: `{ bigha, kattha, dhur }`. */\nexport function sqMetersToBigha(m2: number): { bigha: number; kattha: number; dhur: number } {\n let rem = m2;\n const bigha = Math.floor(rem / LAND_UNIT_SQM.bigha);\n rem -= bigha * LAND_UNIT_SQM.bigha;\n const kattha = Math.floor(rem / LAND_UNIT_SQM.kattha);\n rem -= kattha * LAND_UNIT_SQM.kattha;\n const dhur = Math.round(rem / LAND_UNIT_SQM.dhur);\n if (dhur >= 20) return { bigha: bigha + Math.floor(dhur / 20), kattha, dhur: dhur % 20 };\n if (kattha >= 20) return { bigha: bigha + Math.floor(kattha / 20), kattha: kattha % 20, dhur };\n return { bigha, kattha, dhur };\n}\n\n/** `\"2-3-1-0\"` ropani-aana-paisa-daam from square metres. */\nexport function formatRopani(m2: number): string {\n const r = sqMetersToRopani(m2);\n return `${r.ropani}-${r.aana}-${r.paisa}-${r.daam}`;\n}\n\n/** `\"1-5-0\"` bigha-kattha-dhur from square metres. */\nexport function formatBigha(m2: number): string {\n const b = sqMetersToBigha(m2);\n return `${b.bigha}-${b.kattha}-${b.dhur}`;\n}\n\n/* ------------------------------ phone & validators ------------------------------ */\n\n/** Normalize a Nepali mobile to canonical `+9779XXXXXXXXX`, or null if invalid. */\nexport function normalizeMobile(input: string): string | null {\n const s = fromDevanagari(input).replace(/[\\s-]/g, \"\").replace(/^\\+?977/, \"\");\n return /^9[678]\\d{8}$/.test(s) ? `+977${s}` : null;\n}\n\nexport type Carrier = \"Ntc\" | \"Ncell\" | \"Smart Cell\" | \"UTL\" | \"unknown\";\n\n/** Detect the carrier of a Nepali mobile number. */\nexport function getCarrier(input: string): Carrier {\n const n = normalizeMobile(input);\n if (!n) return \"unknown\";\n const p = n.slice(4, 7); // three digits after +977\n if ([\"984\", \"985\", \"986\", \"974\", \"975\"].includes(p)) return \"Ntc\";\n if ([\"980\", \"981\", \"982\"].includes(p)) return \"Ncell\";\n if ([\"961\", \"962\", \"988\"].includes(p)) return \"Smart Cell\";\n if (p === \"972\") return \"UTL\";\n return \"unknown\";\n}\n\n/** True for a valid Nepali mobile number (10 digits starting 96–98, optional +977). */\nexport function isValidNepaliMobile(input: string): boolean {\n const s = fromDevanagari(input).replace(/[\\s-]/g, \"\");\n return /^(\\+?977)?9[678]\\d{8}$/.test(s);\n}\n\n/** True for a plausible Nepal landline (area code + number, e.g. 01-4XXXXXX). */\nexport function isValidLandline(input: string): boolean {\n const s = input.replace(/[\\s-]/g, \"\");\n return /^0\\d{7,9}$/.test(s);\n}\n\n/** True for a valid Nepal PAN / VAT number (9 digits). */\nexport function isValidPAN(input: string): boolean {\n return /^\\d{9}$/.test(input.trim());\n}\n\n/** True for a valid Nepal VAT number (9 digits — same format as PAN). */\nexport const isValidVAT = isValidPAN;\n\n/* ------------------------------ Nepali amount in words ------------------------------ */\n\nconst NEPALI_0_99 = [\n \"शून्य\", \"एक\", \"दुई\", \"तीन\", \"चार\", \"पाँच\", \"छ\", \"सात\", \"आठ\", \"नौ\",\n \"दस\", \"एघार\", \"बाह्र\", \"तेह्र\", \"चौध\", \"पन्ध्र\", \"सोह्र\", \"सत्र\", \"अठार\", \"उन्नाइस\",\n \"बीस\", \"एक्काइस\", \"बाइस\", \"तेइस\", \"चौबिस\", \"पच्चिस\", \"छब्बिस\", \"सत्ताइस\", \"अठ्ठाइस\", \"उनन्तिस\",\n \"तिस\", \"एकतिस\", \"बत्तिस\", \"तेत्तिस\", \"चौँतिस\", \"पैँतिस\", \"छत्तिस\", \"सैँतिस\", \"अठतिस\", \"उनन्चालिस\",\n \"चालिस\", \"एकचालिस\", \"बयालिस\", \"त्रिचालिस\", \"चवालिस\", \"पैँतालिस\", \"छयालिस\", \"सतचालिस\", \"अठचालिस\", \"उनन्चास\",\n \"पचास\", \"एकाउन्न\", \"बाउन्न\", \"त्रिपन्न\", \"चवन्न\", \"पचपन्न\", \"छपन्न\", \"सन्ताउन्न\", \"अन्ठाउन्न\", \"उनन्साठी\",\n \"साठी\", \"एकसट्ठी\", \"बयसट्ठी\", \"त्रिसट्ठी\", \"चौंसट्ठी\", \"पैंसट्ठी\", \"छयसट्ठी\", \"सतसट्ठी\", \"अठसट्ठी\", \"उनन्सत्तरी\",\n \"सत्तरी\", \"एकहत्तर\", \"बहत्तर\", \"त्रिहत्तर\", \"चौहत्तर\", \"पचहत्तर\", \"छयहत्तर\", \"सतहत्तर\", \"अठहत्तर\", \"उनासी\",\n \"असी\", \"एकासी\", \"बयासी\", \"त्रियासी\", \"चौरासी\", \"पचासी\", \"छयासी\", \"सतासी\", \"अठासी\", \"उनान्नब्बे\",\n \"नब्बे\", \"एकानब्बे\", \"बयानब्बे\", \"त्रियानब्बे\", \"चौरानब्बे\", \"पन्चानब्बे\", \"छयानब्बे\", \"सन्तानब्बे\", \"अन्ठानब्बे\", \"उनान्सय\",\n];\n\n/**\n * Amount in words in Nepali (Devanagari), South-Asian scale.\n * `numberToWordsNepali(1234567)` → `\"बाह्र लाख चौँतिस हजार पाँच सय सतसट्ठी\"`.\n */\nexport function numberToWordsNepali(value: number): string {\n let n = Math.floor(Math.abs(value));\n if (n === 0) return NEPALI_0_99[0]!;\n const parts: string[] = [];\n const units: [number, string][] = [\n [1e9, \"अरब\"],\n [1e7, \"करोड\"],\n [1e5, \"लाख\"],\n [1e3, \"हजार\"],\n [1e2, \"सय\"],\n ];\n for (const [size, name] of units) {\n if (n >= size) {\n const count = Math.floor(n / size);\n parts.push(`${NEPALI_0_99[count]} ${name}`);\n n %= size;\n }\n }\n if (n > 0) parts.push(NEPALI_0_99[n]!);\n return (value < 0 ? \"माइनस \" : \"\") + parts.join(\" \");\n}\n\n/** `numberToWordsNepali` plus a \"रुपैयाँ … मात्र\" wrapper for Nepali invoices. */\nexport function amountInWordsNepali(amount: number): string {\n const rupees = Math.floor(Math.abs(amount));\n const paisa = Math.round((Math.abs(amount) - rupees) * 100);\n let out = \"रुपैयाँ \" + numberToWordsNepali(rupees);\n if (paisa > 0) out += \" \" + numberToWordsNepali(paisa) + \" पैसा\";\n return (amount < 0 ? \"माइनस \" : \"\") + out + \" मात्र\";\n}\n\nexport interface Province {\n number: number;\n name: string;\n nameNp: string;\n capital: string;\n}\n\n/** Nepal's seven federal provinces. */\nexport const PROVINCES: readonly Province[] = [\n { number: 1, name: \"Koshi\", nameNp: \"कोशी\", capital: \"Biratnagar\" },\n { number: 2, name: \"Madhesh\", nameNp: \"मधेश\", capital: \"Janakpur\" },\n { number: 3, name: \"Bagmati\", nameNp: \"बागमती\", capital: \"Hetauda\" },\n { number: 4, name: \"Gandaki\", nameNp: \"गण्डकी\", capital: \"Pokhara\" },\n { number: 5, name: \"Lumbini\", nameNp: \"लुम्बिनी\", capital: \"Deukhuri\" },\n { number: 6, name: \"Karnali\", nameNp: \"कर्णाली\", capital: \"Birendranagar\" },\n { number: 7, name: \"Sudurpashchim\", nameNp: \"सुदूरपश्चिम\", capital: \"Godawari\" },\n];\n\nexport interface District {\n name: string;\n nameNp: string;\n /** Province number 1–7. */\n province: number;\n}\n\n/** Nepal's 77 districts, with their province number. */\nexport const DISTRICTS: readonly District[] = [\n // Koshi (1)\n { name: \"Bhojpur\", nameNp: \"भोजपुर\", province: 1 },\n { name: \"Dhankuta\", nameNp: \"धनकुटा\", province: 1 },\n { name: \"Ilam\", nameNp: \"इलाम\", province: 1 },\n { name: \"Jhapa\", nameNp: \"झापा\", province: 1 },\n { name: \"Khotang\", nameNp: \"खोटाङ\", province: 1 },\n { name: \"Morang\", nameNp: \"मोरङ\", province: 1 },\n { name: \"Okhaldhunga\", nameNp: \"ओखलढुंगा\", province: 1 },\n { name: \"Panchthar\", nameNp: \"पाँचथर\", province: 1 },\n { name: \"Sankhuwasabha\", nameNp: \"संखुवासभा\", province: 1 },\n { name: \"Solukhumbu\", nameNp: \"सोलुखुम्बु\", province: 1 },\n { name: \"Sunsari\", nameNp: \"सुनसरी\", province: 1 },\n { name: \"Taplejung\", nameNp: \"ताप्लेजुङ\", province: 1 },\n { name: \"Terhathum\", nameNp: \"तेह्रथुम\", province: 1 },\n { name: \"Udayapur\", nameNp: \"उदयपुर\", province: 1 },\n // Madhesh (2)\n { name: \"Bara\", nameNp: \"बारा\", province: 2 },\n { name: \"Dhanusha\", nameNp: \"धनुषा\", province: 2 },\n { name: \"Mahottari\", nameNp: \"महोत्तरी\", province: 2 },\n { name: \"Parsa\", nameNp: \"पर्सा\", province: 2 },\n { name: \"Rautahat\", nameNp: \"रौतहट\", province: 2 },\n { name: \"Saptari\", nameNp: \"सप्तरी\", province: 2 },\n { name: \"Sarlahi\", nameNp: \"सर्लाही\", province: 2 },\n { name: \"Siraha\", nameNp: \"सिरहा\", province: 2 },\n // Bagmati (3)\n { name: \"Bhaktapur\", nameNp: \"भक्तपुर\", province: 3 },\n { name: \"Chitwan\", nameNp: \"चितवन\", province: 3 },\n { name: \"Dhading\", nameNp: \"धादिङ\", province: 3 },\n { name: \"Dolakha\", nameNp: \"दोलखा\", province: 3 },\n { name: \"Kathmandu\", nameNp: \"काठमाडौं\", province: 3 },\n { name: \"Kavrepalanchok\", nameNp: \"काभ्रेपलाञ्चोक\", province: 3 },\n { name: \"Lalitpur\", nameNp: \"ललितपुर\", province: 3 },\n { name: \"Makwanpur\", nameNp: \"मकवानपुर\", province: 3 },\n { name: \"Nuwakot\", nameNp: \"नुवाकोट\", province: 3 },\n { name: \"Ramechhap\", nameNp: \"रामेछाप\", province: 3 },\n { name: \"Rasuwa\", nameNp: \"रसुवा\", province: 3 },\n { name: \"Sindhuli\", nameNp: \"सिन्धुली\", province: 3 },\n { name: \"Sindhupalchok\", nameNp: \"सिन्धुपाल्चोक\", province: 3 },\n // Gandaki (4)\n { name: \"Baglung\", nameNp: \"बागलुङ\", province: 4 },\n { name: \"Gorkha\", nameNp: \"गोरखा\", province: 4 },\n { name: \"Kaski\", nameNp: \"कास्की\", province: 4 },\n { name: \"Lamjung\", nameNp: \"लमजुङ\", province: 4 },\n { name: \"Manang\", nameNp: \"मनाङ\", province: 4 },\n { name: \"Mustang\", nameNp: \"मुस्ताङ\", province: 4 },\n { name: \"Myagdi\", nameNp: \"म्याग्दी\", province: 4 },\n { name: \"Nawalpur\", nameNp: \"नवलपुर\", province: 4 },\n { name: \"Parbat\", nameNp: \"पर्वत\", province: 4 },\n { name: \"Syangja\", nameNp: \"स्याङ्जा\", province: 4 },\n { name: \"Tanahun\", nameNp: \"तनहुँ\", province: 4 },\n // Lumbini (5)\n { name: \"Arghakhanchi\", nameNp: \"अर्घाखाँची\", province: 5 },\n { name: \"Banke\", nameNp: \"बाँके\", province: 5 },\n { name: \"Bardiya\", nameNp: \"बर्दिया\", province: 5 },\n { name: \"Dang\", nameNp: \"दाङ\", province: 5 },\n { name: \"Eastern Rukum\", nameNp: \"पूर्वी रुकुम\", province: 5 },\n { name: \"Gulmi\", nameNp: \"गुल्मी\", province: 5 },\n { name: \"Kapilvastu\", nameNp: \"कपिलवस्तु\", province: 5 },\n { name: \"Parasi\", nameNp: \"नवलपरासी (पश्चिम)\", province: 5 },\n { name: \"Palpa\", nameNp: \"पाल्पा\", province: 5 },\n { name: \"Pyuthan\", nameNp: \"प्युठान\", province: 5 },\n { name: \"Rolpa\", nameNp: \"रोल्पा\", province: 5 },\n { name: \"Rupandehi\", nameNp: \"रूपन्देही\", province: 5 },\n // Karnali (6)\n { name: \"Dailekh\", nameNp: \"दैलेख\", province: 6 },\n { name: \"Dolpa\", nameNp: \"डोल्पा\", province: 6 },\n { name: \"Humla\", nameNp: \"हुम्ला\", province: 6 },\n { name: \"Jajarkot\", nameNp: \"जाजरकोट\", province: 6 },\n { name: \"Jumla\", nameNp: \"जुम्ला\", province: 6 },\n { name: \"Kalikot\", nameNp: \"कालिकोट\", province: 6 },\n { name: \"Mugu\", nameNp: \"मुगु\", province: 6 },\n { name: \"Salyan\", nameNp: \"सल्यान\", province: 6 },\n { name: \"Surkhet\", nameNp: \"सुर्खेत\", province: 6 },\n { name: \"Western Rukum\", nameNp: \"पश्चिमी रुकुम\", province: 6 },\n // Sudurpashchim (7)\n { name: \"Achham\", nameNp: \"अछाम\", province: 7 },\n { name: \"Baitadi\", nameNp: \"बैतडी\", province: 7 },\n { name: \"Bajhang\", nameNp: \"बझाङ\", province: 7 },\n { name: \"Bajura\", nameNp: \"बाजुरा\", province: 7 },\n { name: \"Dadeldhura\", nameNp: \"डडेल्धुरा\", province: 7 },\n { name: \"Darchula\", nameNp: \"दार्चुला\", province: 7 },\n { name: \"Doti\", nameNp: \"डोटी\", province: 7 },\n { name: \"Kailali\", nameNp: \"कैलाली\", province: 7 },\n { name: \"Kanchanpur\", nameNp: \"कञ्चनपुर\", province: 7 },\n];\n\n/** Districts in a given province (1–7). */\nexport function districtsByProvince(province: number): District[] {\n return DISTRICTS.filter((d) => d.province === province);\n}\n\n/** Find a district by English or Nepali name (case-insensitive). */\nexport function findDistrict(name: string): District | undefined {\n const q = name.trim().toLowerCase();\n return DISTRICTS.find((d) => d.name.toLowerCase() === q || d.nameNp === name.trim());\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lacspace/nepali-utils",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Everyday Nepal helpers — NPR currency formatting, Devanagari numerals, amount-in-words, validators, provinces. Zero-dependency.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|