@wise-old-man/utils 1.0.4 → 1.0.9

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.
Files changed (64) hide show
  1. package/.prettierrc +1 -1
  2. package/dist/jest.config.d.ts +3 -0
  3. package/dist/jest.config.js +10 -0
  4. package/dist/jest.config.js.map +1 -0
  5. package/dist/{competitions.d.ts → src/competitions.d.ts} +0 -0
  6. package/dist/{competitions.js → src/competitions.js} +2 -2
  7. package/dist/src/competitions.js.map +1 -0
  8. package/dist/{countries.d.ts → src/countries.d.ts} +0 -0
  9. package/dist/{countries.js → src/countries.js} +0 -0
  10. package/dist/src/countries.js.map +1 -0
  11. package/dist/{experience.d.ts → src/experience.d.ts} +3 -2
  12. package/dist/{experience.js → src/experience.js} +4 -2
  13. package/dist/src/experience.js.map +1 -0
  14. package/dist/{groups.d.ts → src/groups.d.ts} +2 -1
  15. package/dist/{groups.js → src/groups.js} +4 -2
  16. package/dist/src/groups.js.map +1 -0
  17. package/dist/{index.d.ts → src/index.d.ts} +0 -0
  18. package/dist/{index.js → src/index.js} +0 -0
  19. package/dist/src/index.js.map +1 -0
  20. package/dist/{metrics.d.ts → src/metrics.d.ts} +16 -1
  21. package/dist/{metrics.js → src/metrics.js} +292 -2
  22. package/dist/src/metrics.js.map +1 -0
  23. package/dist/{numbers.d.ts → src/numbers.d.ts} +0 -0
  24. package/dist/{numbers.js → src/numbers.js} +0 -0
  25. package/dist/src/numbers.js.map +1 -0
  26. package/dist/{periods.d.ts → src/periods.d.ts} +0 -0
  27. package/dist/{periods.js → src/periods.js} +1 -1
  28. package/dist/src/periods.js.map +1 -0
  29. package/dist/{players.d.ts → src/players.d.ts} +4 -4
  30. package/dist/{players.js → src/players.js} +5 -4
  31. package/dist/src/players.js.map +1 -0
  32. package/dist/src/strings.d.ts +3 -0
  33. package/dist/{strings.js → src/strings.js} +1 -7
  34. package/dist/src/strings.js.map +1 -0
  35. package/jest.config.ts +10 -0
  36. package/package.json +7 -2
  37. package/src/competitions.ts +2 -2
  38. package/src/experience.ts +12 -3
  39. package/src/groups.ts +3 -2
  40. package/src/metrics.ts +364 -3
  41. package/src/periods.ts +1 -1
  42. package/src/players.ts +7 -6
  43. package/src/strings.ts +4 -7
  44. package/tests/competitions.test.ts +32 -0
  45. package/tests/countries.test.ts +22 -0
  46. package/tests/experience.test.ts +23 -0
  47. package/tests/groups.test.ts +14 -0
  48. package/tests/metrics.test.ts +113 -0
  49. package/tests/numbers.test.ts +9 -0
  50. package/tests/periods.test.ts +49 -0
  51. package/tests/players.test.ts +44 -0
  52. package/tests/strings.test.ts +27 -0
  53. package/tsconfig.json +1 -1
  54. package/dist/competitions.js.map +0 -1
  55. package/dist/countries.js.map +0 -1
  56. package/dist/experience.js.map +0 -1
  57. package/dist/groups.js.map +0 -1
  58. package/dist/index.js.map +0 -1
  59. package/dist/metrics.js.map +0 -1
  60. package/dist/numbers.js.map +0 -1
  61. package/dist/periods.js.map +0 -1
  62. package/dist/players.js.map +0 -1
  63. package/dist/strings.d.ts +0 -3
  64. package/dist/strings.js.map +0 -1
@@ -25,7 +25,7 @@ exports.PERIODS = PERIODS;
25
25
  function findPeriod(periodName) {
26
26
  for (var _i = 0, _a = Object.entries(PeriodProps); _i < _a.length; _i++) {
27
27
  var _b = _a[_i], key = _b[0], value = _b[1];
28
- if (value.name === periodName)
28
+ if (value.name.toUpperCase() === periodName.toUpperCase())
29
29
  return key;
30
30
  }
31
31
  return null;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"periods.js","sourceRoot":"","sources":["../../src/periods.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,8 @@ declare enum PlayerType {
2
2
  UNKNOWN = "unknown",
3
3
  REGULAR = "regular",
4
4
  IRONMAN = "ironman",
5
- ULTIMATE = "ultimate",
6
- HARDCORE = "hardcore"
5
+ HARDCORE = "hardcore",
6
+ ULTIMATE = "ultimate"
7
7
  }
8
8
  declare enum PlayerBuild {
9
9
  MAIN = "main",
@@ -23,10 +23,10 @@ declare const PlayerTypeProps: {
23
23
  ironman: {
24
24
  name: string;
25
25
  };
26
- ultimate: {
26
+ hardcore: {
27
27
  name: string;
28
28
  };
29
- hardcore: {
29
+ ultimate: {
30
30
  name: string;
31
31
  };
32
32
  };
@@ -7,8 +7,8 @@ var PlayerType;
7
7
  PlayerType["UNKNOWN"] = "unknown";
8
8
  PlayerType["REGULAR"] = "regular";
9
9
  PlayerType["IRONMAN"] = "ironman";
10
- PlayerType["ULTIMATE"] = "ultimate";
11
10
  PlayerType["HARDCORE"] = "hardcore";
11
+ PlayerType["ULTIMATE"] = "ultimate";
12
12
  })(PlayerType || (PlayerType = {}));
13
13
  exports.PlayerType = PlayerType;
14
14
  var PlayerBuild;
@@ -25,8 +25,8 @@ var PlayerTypeProps = (_a = {},
25
25
  _a[PlayerType.UNKNOWN] = { name: 'Unknown' },
26
26
  _a[PlayerType.REGULAR] = { name: 'Regular' },
27
27
  _a[PlayerType.IRONMAN] = { name: 'Ironman' },
28
- _a[PlayerType.ULTIMATE] = { name: 'Ultimate' },
29
28
  _a[PlayerType.HARDCORE] = { name: 'Hardcore' },
29
+ _a[PlayerType.ULTIMATE] = { name: 'Ultimate' },
30
30
  _a);
31
31
  exports.PlayerTypeProps = PlayerTypeProps;
32
32
  var PlayerBuildProps = (_b = {},
@@ -45,7 +45,7 @@ exports.PLAYER_BUILDS = PLAYER_BUILDS;
45
45
  function findPlayerType(typeName) {
46
46
  for (var _i = 0, _a = Object.entries(PlayerTypeProps); _i < _a.length; _i++) {
47
47
  var _b = _a[_i], key = _b[0], value = _b[1];
48
- if (value.name === typeName)
48
+ if (value.name.toUpperCase() === typeName.toUpperCase())
49
49
  return key;
50
50
  }
51
51
  return null;
@@ -54,7 +54,7 @@ exports.findPlayerType = findPlayerType;
54
54
  function findPlayerBuild(buildName) {
55
55
  for (var _i = 0, _a = Object.entries(PlayerBuildProps); _i < _a.length; _i++) {
56
56
  var _b = _a[_i], key = _b[0], value = _b[1];
57
- if (value.name === buildName)
57
+ if (value.name.toUpperCase() === buildName.toUpperCase())
58
58
  return key;
59
59
  }
60
60
  return null;
@@ -64,6 +64,7 @@ function standardizeUsername(username) {
64
64
  return sanitizeUsername(username).toLowerCase();
65
65
  }
66
66
  exports.standardizeUsername = standardizeUsername;
67
+ // TODO: should this also remove any non alphanumeric symbols?
67
68
  function sanitizeUsername(username) {
68
69
  return username.replace(/[-_\s]/g, ' ').trim();
69
70
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"players.js","sourceRoot":"","sources":["../../src/players.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare function formatNumber(num: number, withLetters?: boolean): string | -1;
2
+ declare function padNumber(value: number): string;
3
+ export { formatNumber, padNumber };
@@ -1,12 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.padNumber = exports.formatNumber = exports.capitalize = void 0;
4
- function capitalize(string) {
5
- if (!string)
6
- return null;
7
- return string.charAt(0).toUpperCase() + string.slice(1);
8
- }
9
- exports.capitalize = capitalize;
3
+ exports.padNumber = exports.formatNumber = void 0;
10
4
  function formatNumber(num, withLetters) {
11
5
  if (withLetters === void 0) { withLetters = false; }
12
6
  if (num === undefined || num === null)
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/strings.ts"],"names":[],"mappings":";;;AAAA,SAAS,YAAY,CAAC,GAAW,EAAE,WAAmB;IAAnB,4BAAA,EAAA,mBAAmB;IACpD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAEjD,qBAAqB;IACrB,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;KAC3F;IAED,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;QACjD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;KACjE;IAED,eAAe;IACf,IAAI,GAAG,GAAG,QAAU,IAAI,GAAG,GAAG,CAAC,QAAU,EAAE;QACzC,OAAO,UAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAG,CAAC;KACrC;IAED,cAAc;IACd,IAAI,GAAG,GAAG,UAAa,IAAI,GAAG,GAAG,CAAC,UAAa,EAAE;QAC/C,OAAO,UAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,MAAG,CAAC;KACvE;IAED,OAAO,UAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,MAAG,CAAC;AAC3E,CAAC;AAOQ,oCAAY;AALrB,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,WAAI,KAAK,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACrD,CAAC;AAEsB,8BAAS"}
package/jest.config.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { Config } from '@jest/types';
2
+
3
+ const config: Config.InitialOptions = {
4
+ verbose: true,
5
+ transform: {
6
+ '^.+\\.ts?$': 'ts-jest'
7
+ }
8
+ };
9
+
10
+ export default config;
package/package.json CHANGED
@@ -1,18 +1,23 @@
1
1
  {
2
2
  "name": "@wise-old-man/utils",
3
- "version": "1.0.4",
3
+ "version": "1.0.9",
4
4
  "description": "A few constants and helper functions to be re-used in all repositories under the WiseOldMan project.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "prepublish": "tsc",
9
- "build": "tsc"
9
+ "build": "tsc",
10
+ "test": "jest"
10
11
  },
11
12
  "keywords": [],
12
13
  "author": "",
13
14
  "license": "ISC",
14
15
  "devDependencies": {
16
+ "@types/jest": "^27.0.3",
15
17
  "@types/lodash": "^4.14.177",
18
+ "jest": "^27.4.5",
19
+ "ts-jest": "^27.1.2",
20
+ "ts-node": "^10.4.0",
16
21
  "typescript": "^4.4.3"
17
22
  },
18
23
  "dependencies": {
@@ -10,8 +10,8 @@ enum CompetitionStatus {
10
10
  }
11
11
 
12
12
  const CompetitionTypeProps = {
13
- [CompetitionType.CLASSIC]: { name: 'classic' },
14
- [CompetitionType.TEAM]: { name: 'team' }
13
+ [CompetitionType.CLASSIC]: { name: 'Classic' },
14
+ [CompetitionType.TEAM]: { name: 'Team' }
15
15
  };
16
16
 
17
17
  const CompetitionStatusProps = {
package/src/experience.ts CHANGED
@@ -8,10 +8,10 @@ const MAX_VIRTUAL_LEVEL = 126;
8
8
  const MAX_SKILL_EXP = 200_000_000;
9
9
 
10
10
  // The minimum skill exp for level 99
11
- const SKILL_EXP_AT_99 = 13034431;
11
+ const SKILL_EXP_AT_99 = 13_034_431;
12
12
 
13
13
  // The maximum skill at exactly 99 on all skills
14
- export const CAPPED_MAX_TOTAL_XP = 23 * SKILL_EXP_AT_99;
14
+ const CAPPED_MAX_TOTAL_XP = 23 * SKILL_EXP_AT_99;
15
15
 
16
16
  // Builds a lookup table for each level's required experience
17
17
  // exp = XP_FOR_LEVEL[level - 1] || 13m = XP_FOR_LEVEL[98]
@@ -74,4 +74,13 @@ function getCombatLevel(
74
74
  return Math.floor(baseCombat + Math.max(meleeCombat, rangeCombat, mageCombat));
75
75
  }
76
76
 
77
- export { MAX_LEVEL, MAX_VIRTUAL_LEVEL, MAX_SKILL_EXP, getExpForLevel, getLevel, getCombatLevel };
77
+ export {
78
+ MAX_LEVEL,
79
+ MAX_VIRTUAL_LEVEL,
80
+ MAX_SKILL_EXP,
81
+ CAPPED_MAX_TOTAL_XP,
82
+ SKILL_EXP_AT_99,
83
+ getExpForLevel,
84
+ getLevel,
85
+ getCombatLevel
86
+ };
package/src/groups.ts CHANGED
@@ -543,13 +543,14 @@ const GroupRoleProps = {
543
543
  };
544
544
 
545
545
  const GROUP_ROLES = Object.values(GroupRole);
546
+ const PRIVELEGED_GROUP_ROLES = GROUP_ROLES.filter(r => GroupRoleProps[r].isPriveleged);
546
547
 
547
548
  function findGroupRole(roleName: string): GroupRole | null {
548
549
  for (var [key, value] of Object.entries(GroupRoleProps)) {
549
- if (value.name === roleName) return key as GroupRole;
550
+ if (value.name.toUpperCase() === roleName.toUpperCase()) return key as GroupRole;
550
551
  }
551
552
 
552
553
  return null;
553
554
  }
554
555
 
555
- export { GroupRole, GroupRoleProps, GROUP_ROLES, findGroupRole };
556
+ export { GroupRole, GroupRoleProps, GROUP_ROLES, PRIVELEGED_GROUP_ROLES, findGroupRole };
package/src/metrics.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { mapValues } from 'lodash';
1
+ import { mapValues, capitalize } from 'lodash';
2
2
 
3
3
  enum Skill {
4
4
  OVERALL = 'overall',
@@ -241,14 +241,360 @@ const BOSSES = Object.values(Boss);
241
241
  const ACTIVITIES = Object.values(Activity);
242
242
  const VIRTUAL_METRICS = Object.values(VirtualMetric);
243
243
 
244
+ const METRICS = [...SKILLS, ...BOSSES, ...ACTIVITIES, ...VIRTUAL_METRICS];
245
+
246
+ const F2P_BOSSES = BOSSES.filter(b => !MetricProps[b].isMembers);
247
+ const MEMBER_SKILLS = SKILLS.filter(s => MetricProps[s].isMembers);
248
+ const COMBAT_SKILLS = SKILLS.filter(s => MetricProps[s].isCombat);
249
+
244
250
  function findMetric(metricName: string): Metric | null {
245
251
  for (var [key, value] of Object.entries(MetricProps)) {
246
- if (value.name === metricName) return key as Metric;
252
+ if (value.name.toUpperCase() === metricName.toUpperCase()) return key as Metric;
247
253
  }
248
254
 
249
255
  return null;
250
256
  }
251
257
 
258
+ function isSkill(metric: Metric) {
259
+ return metric in SkillProps;
260
+ }
261
+
262
+ function isBoss(metric: Metric) {
263
+ return metric in BossProps;
264
+ }
265
+
266
+ function isActivity(metric: Metric) {
267
+ return metric in ActivityProps;
268
+ }
269
+
270
+ function isVirtualMetric(metric: Metric) {
271
+ return metric in VirtualMetricProps;
272
+ }
273
+
274
+ function getMetricRankKey(metric: Metric) {
275
+ return `${metric}Rank`;
276
+ }
277
+
278
+ function getMetricValueKey(metric: Metric) {
279
+ return `${metric}${capitalize(MetricProps[metric].measure)}`;
280
+ }
281
+
282
+ function getMetricMeasure(metric: Metric) {
283
+ return MetricProps[metric].measure;
284
+ }
285
+
286
+ function getMetricName(metric: Metric) {
287
+ return MetricProps[metric].name;
288
+ }
289
+
290
+ function getMinimumBossKc(metric: Metric) {
291
+ return isBoss(metric) ? MetricProps[metric as Boss].minimumKc : 0;
292
+ }
293
+
294
+ function getParentVirtualMetric(metric: Metric) {
295
+ if (isBoss(metric)) return Metrics.EHB;
296
+ if (isSkill(metric)) return Metrics.EHP;
297
+ return null;
298
+ }
299
+
300
+ function parseMetricAbbreviation(abbreviation: string): string | null {
301
+ if (!abbreviation || abbreviation.length === 0) {
302
+ return null;
303
+ }
304
+
305
+ switch (abbreviation.toLowerCase()) {
306
+ // Bosses
307
+ case 'sire':
308
+ return Metrics.ABYSSAL_SIRE;
309
+
310
+ case 'hydra':
311
+ return Metrics.ALCHEMICAL_HYDRA;
312
+
313
+ case 'barrows':
314
+ return Metrics.BARROWS_CHESTS;
315
+
316
+ case 'bryo':
317
+ return Metrics.BRYOPHYTA;
318
+
319
+ case 'cerb':
320
+ return Metrics.CERBERUS;
321
+
322
+ case 'cox':
323
+ case 'xeric':
324
+ case 'chambers':
325
+ case 'olm':
326
+ case 'raids':
327
+ return Metrics.CHAMBERS_OF_XERIC;
328
+
329
+ case 'cox-cm':
330
+ case 'xeric-cm':
331
+ case 'chambers-cm':
332
+ case 'olm-cm':
333
+ case 'raids-cm':
334
+ return Metrics.CHAMBERS_OF_XERIC_CM;
335
+
336
+ case 'chaos-ele':
337
+ return Metrics.CHAOS_ELEMENTAL;
338
+
339
+ case 'fanatic':
340
+ return Metrics.CHAOS_FANATIC;
341
+
342
+ case 'sara':
343
+ case 'saradomin':
344
+ case 'zilyana':
345
+ case 'zily':
346
+ return Metrics.COMMANDER_ZILYANA;
347
+
348
+ case 'corp':
349
+ return Metrics.CORPOREAL_BEAST;
350
+
351
+ case 'crazy-arch':
352
+ return Metrics.CRAZY_ARCHAEOLOGIST;
353
+
354
+ case 'prime':
355
+ return Metrics.DAGANNOTH_PRIME;
356
+ case 'rex':
357
+ return Metrics.DAGANNOTH_REX;
358
+ case 'supreme':
359
+ return Metrics.DAGANNOTH_SUPREME;
360
+
361
+ case 'deranged-arch':
362
+ return Metrics.DERANGED_ARCHAEOLOGIST;
363
+
364
+ case 'bandos':
365
+ case 'graardor':
366
+ return Metrics.GENERAL_GRAARDOR;
367
+
368
+ case 'mole':
369
+ return Metrics.GIANT_MOLE;
370
+
371
+ case 'dusk':
372
+ case 'dawn':
373
+ case 'gargs':
374
+ case 'guardians':
375
+ case 'ggs':
376
+ return Metrics.GROTESQUE_GUARDIANS;
377
+
378
+ case 'kq':
379
+ return Metrics.KALPHITE_QUEEN;
380
+
381
+ case 'kbd':
382
+ return Metrics.KING_BLACK_DRAGON;
383
+
384
+ case 'kree':
385
+ case 'kreearra':
386
+ case 'armadyl':
387
+ case 'arma':
388
+ return Metrics.KREEARRA;
389
+
390
+ case 'zammy':
391
+ case 'zamorak':
392
+ case 'kril':
393
+ case 'kril-tsutsaroth':
394
+ return Metrics.KRIL_TSUTSAROTH;
395
+
396
+ case 'gaunt':
397
+ case 'gauntlet':
398
+ case 'the-gauntlet':
399
+ return Metrics.THE_GAUNTLET;
400
+
401
+ case 'cgaunt':
402
+ case 'cgauntlet':
403
+ case 'corrupted':
404
+ case 'corrupted-gauntlet':
405
+ case 'the-corrupted-gauntlet':
406
+ return Metrics.THE_CORRUPTED_GAUNTLET;
407
+
408
+ case 'tob':
409
+ case 'theatre':
410
+ case 'verzik':
411
+ case 'tob-normal':
412
+ return Metrics.THEATRE_OF_BLOOD;
413
+
414
+ case 'tob-hm':
415
+ case 'tob-cm':
416
+ case 'tob-hard-mode':
417
+ case 'tob-hard':
418
+ return Metrics.THEATRE_OF_BLOOD_HARD_MODE;
419
+
420
+ case 'nm':
421
+ case 'tnm':
422
+ case 'nmare':
423
+ case 'the-nightmare':
424
+ return Metrics.NIGHTMARE;
425
+
426
+ case 'pnm':
427
+ case 'phosani':
428
+ case 'phosanis':
429
+ case 'phosani-nm':
430
+ case 'phosani-nightmare':
431
+ case 'phosanis nightmare':
432
+ return Metrics.PHOSANIS_NIGHTMARE;
433
+
434
+ case 'thermy':
435
+ case 'smoke-devil':
436
+ return Metrics.THERMONUCLEAR_SMOKE_DEVIL;
437
+
438
+ case 'zuk':
439
+ case 'inferno':
440
+ return Metrics.TZKAL_ZUK;
441
+
442
+ case 'jad':
443
+ case 'fight-caves':
444
+ case 'fc':
445
+ return Metrics.TZTOK_JAD;
446
+
447
+ case 'vork':
448
+ case 'vorky':
449
+ return Metrics.VORKATH;
450
+
451
+ case 'wt':
452
+ return Metrics.WINTERTODT;
453
+
454
+ case 'snek':
455
+ case 'zul':
456
+ return Metrics.ZULRAH;
457
+
458
+ // Minigames and others
459
+
460
+ case 'all-clues':
461
+ case 'clues':
462
+ return Metrics.CLUE_SCROLLS_ALL;
463
+
464
+ case 'beginner':
465
+ case 'beginner-clues':
466
+ case 'beg-clues':
467
+ case 'beginners':
468
+ return Metrics.CLUE_SCROLLS_BEGINNER;
469
+
470
+ case 'easy':
471
+ case 'easy-clues':
472
+ case 'easies':
473
+ return Metrics.CLUE_SCROLLS_EASY;
474
+
475
+ case 'medium':
476
+ case 'med':
477
+ case 'meds':
478
+ case 'medium-clues':
479
+ case 'med-clues':
480
+ case 'mediums':
481
+ return Metrics.CLUE_SCROLLS_MEDIUM;
482
+
483
+ case 'hard':
484
+ case 'hard-clues':
485
+ case 'hards':
486
+ return Metrics.CLUE_SCROLLS_HARD;
487
+
488
+ case 'elite':
489
+ case 'elite-clues':
490
+ case 'elites':
491
+ return Metrics.CLUE_SCROLLS_ELITE;
492
+
493
+ case 'master':
494
+ case 'master-clues':
495
+ case 'masters':
496
+ return Metrics.CLUE_SCROLLS_MASTER;
497
+
498
+ case 'lms':
499
+ return Metrics.LAST_MAN_STANDING;
500
+
501
+ case 'league':
502
+ case 'lp':
503
+ case 'lps':
504
+ return Metrics.LEAGUE_POINTS;
505
+
506
+ case 'sw':
507
+ case 'zeal':
508
+ case 'soul-wars':
509
+ return Metrics.SOUL_WARS_ZEAL;
510
+
511
+ // Skills
512
+
513
+ case 'runecraft':
514
+ case 'rc':
515
+ return Metrics.RUNECRAFTING;
516
+
517
+ case 'att':
518
+ case 'atk':
519
+ case 'attk':
520
+ return Metrics.ATTACK;
521
+
522
+ case 'def':
523
+ case 'defense':
524
+ return Metrics.DEFENCE;
525
+
526
+ case 'str':
527
+ return Metrics.STRENGTH;
528
+
529
+ case 'hp':
530
+ return Metrics.HITPOINTS;
531
+
532
+ case 'range':
533
+ return Metrics.RANGED;
534
+
535
+ case 'pray':
536
+ return Metrics.PRAYER;
537
+
538
+ case 'mage':
539
+ return Metrics.MAGIC;
540
+
541
+ case 'cook':
542
+ return Metrics.COOKING;
543
+
544
+ case 'wc':
545
+ return Metrics.WOODCUTTING;
546
+
547
+ case 'fletch':
548
+ return Metrics.FLETCHING;
549
+
550
+ case 'fish':
551
+ return Metrics.FISHING;
552
+
553
+ case 'fm':
554
+ case 'burning':
555
+ return Metrics.FIREMAKING;
556
+
557
+ case 'craft':
558
+ return Metrics.CRAFTING;
559
+
560
+ case 'sm':
561
+ case 'smith':
562
+ return Metrics.SMITHING;
563
+
564
+ case 'mine':
565
+ case 'smash':
566
+ return Metrics.MINING;
567
+
568
+ case 'herb':
569
+ return Metrics.HERBLORE;
570
+
571
+ case 'agi':
572
+ case 'agil':
573
+ return Metrics.AGILITY;
574
+
575
+ case 'thief':
576
+ return Metrics.THIEVING;
577
+
578
+ case 'slay':
579
+ return Metrics.SLAYER;
580
+
581
+ case 'farm':
582
+ return Metrics.FARMING;
583
+
584
+ case 'hunt':
585
+ case 'hunting':
586
+ return Metrics.HUNTER;
587
+
588
+ case 'con':
589
+ case 'cons':
590
+ case 'const':
591
+ return Metrics.CONSTRUCTION;
592
+
593
+ default:
594
+ return abbreviation;
595
+ }
596
+ }
597
+
252
598
  export {
253
599
  // Types
254
600
  Metric,
@@ -262,6 +608,21 @@ export {
262
608
  BOSSES,
263
609
  ACTIVITIES,
264
610
  VIRTUAL_METRICS,
611
+ METRICS,
612
+ F2P_BOSSES,
613
+ MEMBER_SKILLS,
614
+ COMBAT_SKILLS,
265
615
  // Functions
266
- findMetric
616
+ findMetric,
617
+ parseMetricAbbreviation,
618
+ getMetricRankKey,
619
+ getMetricValueKey,
620
+ getMetricMeasure,
621
+ getMetricName,
622
+ getMinimumBossKc,
623
+ getParentVirtualMetric,
624
+ isSkill,
625
+ isBoss,
626
+ isActivity,
627
+ isVirtualMetric
267
628
  };
package/src/periods.ts CHANGED
@@ -20,7 +20,7 @@ const PERIODS = Object.values(Period);
20
20
 
21
21
  function findPeriod(periodName: string): Period | null {
22
22
  for (var [key, value] of Object.entries(PeriodProps)) {
23
- if (value.name === periodName) return key as Period;
23
+ if (value.name.toUpperCase() === periodName.toUpperCase()) return key as Period;
24
24
  }
25
25
 
26
26
  return null;
package/src/players.ts CHANGED
@@ -2,8 +2,8 @@ enum PlayerType {
2
2
  UNKNOWN = 'unknown',
3
3
  REGULAR = 'regular',
4
4
  IRONMAN = 'ironman',
5
- ULTIMATE = 'ultimate',
6
- HARDCORE = 'hardcore'
5
+ HARDCORE = 'hardcore',
6
+ ULTIMATE = 'ultimate'
7
7
  }
8
8
 
9
9
  enum PlayerBuild {
@@ -19,8 +19,8 @@ const PlayerTypeProps = {
19
19
  [PlayerType.UNKNOWN]: { name: 'Unknown' },
20
20
  [PlayerType.REGULAR]: { name: 'Regular' },
21
21
  [PlayerType.IRONMAN]: { name: 'Ironman' },
22
- [PlayerType.ULTIMATE]: { name: 'Ultimate' },
23
- [PlayerType.HARDCORE]: { name: 'Hardcore' }
22
+ [PlayerType.HARDCORE]: { name: 'Hardcore' },
23
+ [PlayerType.ULTIMATE]: { name: 'Ultimate' }
24
24
  };
25
25
 
26
26
  const PlayerBuildProps = {
@@ -37,7 +37,7 @@ const PLAYER_BUILDS = Object.values(PlayerBuild);
37
37
 
38
38
  function findPlayerType(typeName: string): PlayerType | null {
39
39
  for (var [key, value] of Object.entries(PlayerTypeProps)) {
40
- if (value.name === typeName) return key as PlayerType;
40
+ if (value.name.toUpperCase() === typeName.toUpperCase()) return key as PlayerType;
41
41
  }
42
42
 
43
43
  return null;
@@ -45,7 +45,7 @@ function findPlayerType(typeName: string): PlayerType | null {
45
45
 
46
46
  function findPlayerBuild(buildName: string): PlayerBuild | null {
47
47
  for (var [key, value] of Object.entries(PlayerBuildProps)) {
48
- if (value.name === buildName) return key as PlayerBuild;
48
+ if (value.name.toUpperCase() === buildName.toUpperCase()) return key as PlayerBuild;
49
49
  }
50
50
 
51
51
  return null;
@@ -55,6 +55,7 @@ function standardizeUsername(username) {
55
55
  return sanitizeUsername(username).toLowerCase();
56
56
  }
57
57
 
58
+ // TODO: should this also remove any non alphanumeric symbols?
58
59
  function sanitizeUsername(username) {
59
60
  return username.replace(/[-_\s]/g, ' ').trim();
60
61
  }
package/src/strings.ts CHANGED
@@ -1,9 +1,4 @@
1
- export function capitalize(string: string | null): string | null {
2
- if (!string) return null;
3
- return string.charAt(0).toUpperCase() + string.slice(1);
4
- }
5
-
6
- export function formatNumber(num: number, withLetters = false) {
1
+ function formatNumber(num: number, withLetters = false) {
7
2
  if (num === undefined || num === null) return -1;
8
3
 
9
4
  // If number is float
@@ -28,7 +23,9 @@ export function formatNumber(num: number, withLetters = false) {
28
23
  return `${Math.round((num / 1000000000 + Number.EPSILON) * 100) / 100}b`;
29
24
  }
30
25
 
31
- export function padNumber(value: number): string {
26
+ function padNumber(value: number): string {
32
27
  if (!value) return '00';
33
28
  return value < 10 ? `0${value}` : value.toString();
34
29
  }
30
+
31
+ export { formatNumber, padNumber };