warframe-worldstate-data 3.1.9 → 3.1.11

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 (112) hide show
  1. package/.nycrc.json +7 -0
  2. package/biome.json +1 -1
  3. package/data/cs/languages.json +136 -2
  4. package/data/cs/missionTypes.json +3 -0
  5. package/data/cs/solNodes.json +5 -0
  6. package/data/de/languages.json +136 -2
  7. package/data/de/missionTypes.json +3 -0
  8. package/data/de/solNodes.json +5 -0
  9. package/data/es/languages.json +136 -2
  10. package/data/es/missionTypes.json +3 -0
  11. package/data/es/solNodes.json +5 -0
  12. package/data/fr/languages.json +136 -2
  13. package/data/fr/missionTypes.json +3 -0
  14. package/data/fr/solNodes.json +5 -0
  15. package/data/it/languages.json +136 -2
  16. package/data/it/missionTypes.json +3 -0
  17. package/data/it/solNodes.json +5 -0
  18. package/data/ko/languages.json +136 -2
  19. package/data/ko/missionTypes.json +3 -0
  20. package/data/ko/solNodes.json +5 -0
  21. package/data/pl/languages.json +136 -2
  22. package/data/pl/missionTypes.json +3 -0
  23. package/data/pl/solNodes.json +5 -0
  24. package/data/pt/languages.json +136 -2
  25. package/data/pt/missionTypes.json +3 -0
  26. package/data/pt/solNodes.json +5 -0
  27. package/data/ru/languages.json +136 -2
  28. package/data/ru/missionTypes.json +3 -0
  29. package/data/ru/solNodes.json +5 -0
  30. package/data/sr/languages.json +136 -2
  31. package/data/sr/missionTypes.json +3 -0
  32. package/data/sr/solNodes.json +5 -0
  33. package/data/tr/languages.json +136 -2
  34. package/data/tr/missionTypes.json +3 -0
  35. package/data/tr/solNodes.json +5 -0
  36. package/data/uk/languages.json +136 -2
  37. package/data/uk/missionTypes.json +3 -0
  38. package/data/uk/solNodes.json +5 -0
  39. package/data/zh/languages.json +136 -2
  40. package/data/zh/missionTypes.json +3 -0
  41. package/data/zh/solNodes.json +5 -0
  42. package/dist/data/cs/languages.json +136 -2
  43. package/dist/data/cs/missionTypes.json +3 -0
  44. package/dist/data/cs/solNodes.json +5 -0
  45. package/dist/data/de/languages.json +136 -2
  46. package/dist/data/de/missionTypes.json +3 -0
  47. package/dist/data/de/solNodes.json +5 -0
  48. package/dist/data/es/languages.json +136 -2
  49. package/dist/data/es/missionTypes.json +3 -0
  50. package/dist/data/es/solNodes.json +5 -0
  51. package/dist/data/fr/languages.json +136 -2
  52. package/dist/data/fr/missionTypes.json +3 -0
  53. package/dist/data/fr/solNodes.json +5 -0
  54. package/dist/data/it/languages.json +136 -2
  55. package/dist/data/it/missionTypes.json +3 -0
  56. package/dist/data/it/solNodes.json +5 -0
  57. package/dist/data/ko/languages.json +136 -2
  58. package/dist/data/ko/missionTypes.json +3 -0
  59. package/dist/data/ko/solNodes.json +5 -0
  60. package/dist/data/pl/languages.json +136 -2
  61. package/dist/data/pl/missionTypes.json +3 -0
  62. package/dist/data/pl/solNodes.json +5 -0
  63. package/dist/data/pt/languages.json +136 -2
  64. package/dist/data/pt/missionTypes.json +3 -0
  65. package/dist/data/pt/solNodes.json +5 -0
  66. package/dist/data/ru/languages.json +136 -2
  67. package/dist/data/ru/missionTypes.json +3 -0
  68. package/dist/data/ru/solNodes.json +5 -0
  69. package/dist/data/sr/languages.json +136 -2
  70. package/dist/data/sr/missionTypes.json +3 -0
  71. package/dist/data/sr/solNodes.json +5 -0
  72. package/dist/data/tr/languages.json +136 -2
  73. package/dist/data/tr/missionTypes.json +3 -0
  74. package/dist/data/tr/solNodes.json +5 -0
  75. package/dist/data/uk/languages.json +136 -2
  76. package/dist/data/uk/missionTypes.json +3 -0
  77. package/dist/data/uk/solNodes.json +5 -0
  78. package/dist/data/zh/languages.json +136 -2
  79. package/dist/data/zh/missionTypes.json +3 -0
  80. package/dist/data/zh/solNodes.json +5 -0
  81. package/dist/{exports-CZKY8idU.d.mts → exports-BaguOygr.d.mts} +1 -1
  82. package/dist/exports-M2P8p7tW.mjs +78 -0
  83. package/dist/exports.d.mts +2 -2
  84. package/dist/exports.mjs +2 -2
  85. package/dist/{safeImport-D7h_Y_6K.mjs → safeImport-CE5wf6im.mjs} +3 -5
  86. package/dist/safeImport.d.mts +2 -2
  87. package/dist/safeImport.mjs +2 -2
  88. package/dist/{timeDate-Cpr1zckd.d.mts → timeDate-CWdYuKRw.d.mts} +9 -5
  89. package/dist/{timeDate-CgKkhsih.mjs → timeDate-Dr-FUBZ2.mjs} +5 -5
  90. package/dist/tools/timeDate.d.mts +2 -2
  91. package/dist/tools/timeDate.mjs +2 -2
  92. package/dist/tools/translation.d.mts +3 -3
  93. package/dist/tools/translation.mjs +3 -3
  94. package/dist/tools/utilities.d.mts +5 -6
  95. package/dist/tools/utilities.mjs +5 -6
  96. package/dist/{translation-aFS3KGXn.mjs → translation-B1nyVzj0.mjs} +1 -1
  97. package/dist/{translation-Dl9Sx9Td.d.mts → translation-DfnYeyoz.d.mts} +2 -2
  98. package/dist/types.d.mts +1 -1
  99. package/exports.ts +1 -1
  100. package/package.json +9 -8
  101. package/safeImport.ts +5 -6
  102. package/tools/timeDate.ts +5 -5
  103. package/tools/utilities.ts +2 -1
  104. package/tsdown.config.ts +2 -2
  105. package/.c8rc.json +0 -5
  106. package/dist/exports-DvjlJ_m2.mjs +0 -78
  107. package/dist/integrity-B8tf4op5.d.mts +0 -9
  108. package/dist/integrity-l9XvAM5B.mjs +0 -15
  109. package/dist/tools/integrity.d.mts +0 -2
  110. package/dist/tools/integrity.mjs +0 -3
  111. package/tools/integrity.ts +0 -16
  112. /package/dist/{types-3hUBzsIn.d.mts → types-BambsMUW.d.mts} +0 -0
@@ -1,7 +1,6 @@
1
- import "../safeImport-D7h_Y_6K.mjs";
2
- import "../exports-DvjlJ_m2.mjs";
3
- import { t as insist } from "../integrity-l9XvAM5B.mjs";
4
- import { a as timeDeltaToString, n as fromNow, o as toNow, r as parseDate, s as weeklyReset, t as dailyReset } from "../timeDate-CgKkhsih.mjs";
5
- import { A as translateFocus, C as sortieModifier, D as toTitleCase, E as syndicate, M as translateSeason, O as translateArchimedeaType, P as upgrade, S as sortieModDesc, T as steelPath, _ as operation, a as conclaveChallenge, b as sortieBoss, c as fissureModifier, d as languageString, f as lastResourceName, g as nodeMissionType, h as nodeEnemy, i as conclaveCategory, j as translatePolarity, k as translateCalendarEvent, l as fissureTier, m as node, n as archonShardColor, o as conclaveMode, p as missionType, r as archonShardUpgradeType, s as faction, t as archonShard, u as languageDesc, v as operationSymbol, w as splitResourceName, x as sortieFaction, y as region } from "../translation-aFS3KGXn.mjs";
1
+ import "../safeImport-CE5wf6im.mjs";
2
+ import "../exports-M2P8p7tW.mjs";
3
+ import { c as weeklyReset, i as pieceIsSmoller, n as fromNow, o as timeDeltaToString, r as parseDate, s as toNow, t as dailyReset } from "../timeDate-Dr-FUBZ2.mjs";
4
+ import { A as translateFocus, C as sortieModifier, D as toTitleCase, E as syndicate, M as translateSeason, O as translateArchimedeaType, P as upgrade, S as sortieModDesc, T as steelPath, _ as operation, a as conclaveChallenge, b as sortieBoss, c as fissureModifier, d as languageString, f as lastResourceName, g as nodeMissionType, h as nodeEnemy, i as conclaveCategory, j as translatePolarity, k as translateCalendarEvent, l as fissureTier, m as node, n as archonShardColor, o as conclaveMode, p as missionType, r as archonShardUpgradeType, s as faction, t as archonShard, u as languageDesc, v as operationSymbol, w as splitResourceName, x as sortieFaction, y as region } from "../translation-B1nyVzj0.mjs";
6
5
 
7
- export { archonShard, archonShardColor, archonShardUpgradeType, conclaveCategory, conclaveChallenge, conclaveMode, dailyReset, faction, fissureModifier, fissureTier, fromNow, insist, languageDesc, languageString, lastResourceName, missionType, node, nodeEnemy, nodeMissionType, operation, operationSymbol, parseDate, region, sortieBoss, sortieFaction, sortieModDesc, sortieModifier, splitResourceName, steelPath, syndicate, timeDeltaToString, toNow, toTitleCase, translateArchimedeaType, translateCalendarEvent, translateFocus, translatePolarity, translateSeason, upgrade, weeklyReset };
6
+ export { archonShard, archonShardColor, archonShardUpgradeType, conclaveCategory, conclaveChallenge, conclaveMode, dailyReset, faction, fissureModifier, fissureTier, fromNow, languageDesc, languageString, lastResourceName, missionType, node, nodeEnemy, nodeMissionType, operation, operationSymbol, parseDate, pieceIsSmoller, region, sortieBoss, sortieFaction, sortieModDesc, sortieModifier, splitResourceName, steelPath, syndicate, timeDeltaToString, toNow, toTitleCase, translateArchimedeaType, translateCalendarEvent, translateFocus, translatePolarity, translateSeason, upgrade, weeklyReset };
@@ -1,4 +1,4 @@
1
- import { t as exports_default } from "./exports-DvjlJ_m2.mjs";
1
+ import { t as exports_default } from "./exports-M2P8p7tW.mjs";
2
2
 
3
3
  //#region tools/translation.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { n as ArchonShard, s as SteelPath } from "./types-3hUBzsIn.mjs";
2
- import { t as Locale } from "./exports-CZKY8idU.mjs";
1
+ import { n as ArchonShard, s as SteelPath } from "./types-BambsMUW.mjs";
2
+ import { t as Locale } from "./exports-BaguOygr.mjs";
3
3
 
4
4
  //#region tools/translation.d.ts
5
5
 
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as SolNode, c as SteelPathOffering, i as Events, l as SynthesisTarget, n as ArchonShard, o as SortieData, r as Conclave, s as SteelPath, t as Arcane } from "./types-3hUBzsIn.mjs";
1
+ import { a as SolNode, c as SteelPathOffering, i as Events, l as SynthesisTarget, n as ArchonShard, o as SortieData, r as Conclave, s as SteelPath, t as Arcane } from "./types-BambsMUW.mjs";
2
2
  export { Arcane, ArchonShard, Conclave, Events, SolNode, SortieData, SteelPath, SteelPathOffering, SynthesisTarget };
package/exports.ts CHANGED
@@ -1,4 +1,4 @@
1
- import safeImport from './safeImport';
1
+ import { safeImport } from './safeImport';
2
2
  import { Arcane, ArchonShard, Conclave, Events, SolNode, SortieData, SteelPath, SynthesisTarget } from './types';
3
3
 
4
4
  export type Locale = 'de' | 'en' | 'es' | 'fr' | 'it' | 'ko' | 'pl' | 'pt' | 'ru' | 'zh' | 'cs' | 'sr' | 'uk';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "warframe-worldstate-data",
3
- "version": "3.1.9",
3
+ "version": "3.1.11",
4
4
  "description": "Warframe data for use with warframe-worldstate-parser",
5
5
  "keywords": [
6
6
  "warframe-worldstate",
@@ -36,11 +36,11 @@
36
36
  ],
37
37
  "type": "module",
38
38
  "exports": {
39
- ".": "./dist/exports.js",
40
- "./utilities": "./dist/tools/utilities.js",
41
- "./types": "./dist/types.js"
39
+ ".": "./dist/exports.mjs",
40
+ "./utilities": "./dist/tools/utilities.mjs",
41
+ "./types": "./dist/types.mjs"
42
42
  },
43
- "main": "./dist/exports.js",
43
+ "main": "./dist/exports.mjs",
44
44
  "directories": {
45
45
  "test": "test"
46
46
  },
@@ -51,8 +51,8 @@
51
51
  "prepare": "husky && npx install-peerdeps @wfcd/eslint-config@latest -S",
52
52
  "prepublishOnly": "npm run build",
53
53
  "sort": "tsx ./tools/sortLanguages.ts",
54
- "test": "c8 mocha",
55
- "test:cov": "npm test && c8 report --reporter=text-lcov | npx coveralls",
54
+ "test": "nyc mocha",
55
+ "test:cov": "npm test && nyc report --reporter=text-lcov | npx coveralls",
56
56
  "validate": "npm run lint:fix && npm run test && git add -u ."
57
57
  },
58
58
  "prettier": "@wfcd/eslint-config/prettier",
@@ -65,6 +65,7 @@
65
65
  "@biomejs/biome": "2.3.6",
66
66
  "@commitlint/cli": "^20.0.0",
67
67
  "@commitlint/config-conventional": "^20.0.0",
68
+ "@istanbuljs/nyc-config-typescript": "^1.0.2",
68
69
  "@types/chai": "^5.0.0",
69
70
  "@types/mocha": "^10.0.10",
70
71
  "@types/node": "^24.0.7",
@@ -73,13 +74,13 @@
73
74
  "@types/yargs": "^17.0.33",
74
75
  "ajv": "^8.17.1",
75
76
  "ajv-formats": "^3.0.1",
76
- "c8": "^10.1.3",
77
77
  "chai": "^6.0.1",
78
78
  "chai-json": "^1.0.0",
79
79
  "chai-json-schema-ajv": "^5.2.4",
80
80
  "husky": "^9.0.11",
81
81
  "lint-staged": "^16.0.0",
82
82
  "mocha": "^11.7.1",
83
+ "nyc": "^17.1.0",
83
84
  "prettier": "^3.6.2",
84
85
  "sinon": "^21.0.0",
85
86
  "sinon-chai": "^4.0.0",
package/safeImport.ts CHANGED
@@ -7,14 +7,14 @@
7
7
  * @param {Object} fallback fallback response if error or no module
8
8
  * @returns {Promise<any>} module or the default object
9
9
  */
10
- const safeImport = async <T>(path: string, fallback: T = {} as T): Promise<T> => {
10
+ export const safeImport = async <T extends object>(path: string, fallback: T = {} as T): Promise<T> => {
11
11
  try {
12
- const mod: any = await import(path, path.includes('.json') ? { with: { type: 'json' } } : {});
13
- if (mod?.default) return mod.default as T;
14
- return mod as T;
12
+ const mod: T | { default: T } = path.includes('.json')
13
+ ? await import(path, { with: { type: 'json' } })
14
+ : await import(path);
15
+ return 'default' in mod ? (mod as { default: T }).default : (mod as T);
15
16
  } catch (error) {
16
17
  if ((process.env.LOG_LEVEL || 'ERROR').toUpperCase() === 'DEBUG') {
17
- // eslint-disable-next-line no-console
18
18
  console.debug(`Failed to load module at ${path} ... returning fallback`);
19
19
  }
20
20
 
@@ -22,4 +22,3 @@ const safeImport = async <T>(path: string, fallback: T = {} as T): Promise<T> =>
22
22
  }
23
23
  };
24
24
 
25
- export default safeImport;
package/tools/timeDate.ts CHANGED
@@ -4,7 +4,7 @@ const epochZero: ContentTimestamp = {
4
4
  },
5
5
  };
6
6
 
7
- const pieceIsSmoller = (seconds: number, ceiling: number, label: string, timePieces: string[]) => {
7
+ export const pieceIsSmoller = (seconds: number, ceiling: number, label: string, timePieces: string[]) => {
8
8
  if (seconds >= ceiling) {
9
9
  timePieces.push(`${Math.floor(seconds / ceiling)}${label}`);
10
10
  seconds = Math.floor(seconds) % ceiling;
@@ -79,8 +79,8 @@ export const parseDate = (d?: ContentTimestamp): Date => {
79
79
  /**
80
80
  * Get a weekly reset timestamp
81
81
  */
82
- export const weeklyReset = (): { activation: Date; expiry: Date } => {
83
- const now = new Date();
82
+ export const weeklyReset = (nowFunc = () => new Date()): { activation: Date; expiry: Date } => {
83
+ const now = nowFunc();
84
84
  const currentDay = now.getUTCDay();
85
85
  const daysUntilNextMonday = currentDay === 0 ? 1 : 8 - currentDay;
86
86
 
@@ -97,8 +97,8 @@ export const weeklyReset = (): { activation: Date; expiry: Date } => {
97
97
  /**
98
98
  * Get a daily reset timestamp
99
99
  */
100
- export const dailyReset = (): { activation: Date; expiry: Date } => {
101
- const now = new Date();
100
+ export const dailyReset = (nowFunc = () => new Date()): { activation: Date; expiry: Date } => {
101
+ const now = nowFunc();
102
102
 
103
103
  const activation = new Date(now.getTime());
104
104
  activation.setUTCHours(0, 0, 0, 0);
@@ -1,3 +1,4 @@
1
- export * from './integrity';
1
+ /* istanbul ignore file */
2
+
2
3
  export * from './timeDate';
3
4
  export * from './translation';
package/tsdown.config.ts CHANGED
@@ -5,11 +5,11 @@ export default defineConfig({
5
5
  'exports.ts',
6
6
  'safeImport.ts',
7
7
  'types.ts',
8
- './tools/integrity.ts',
9
8
  './tools/timeDate.ts',
10
9
  './tools/translation.ts',
11
10
  './tools/utilities.ts',
12
11
  ],
13
12
  copy: ['./data'],
14
- dts: true
13
+ dts: true,
14
+ format: 'esm',
15
15
  });
package/.c8rc.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "exclude": ["test/**"],
3
- "reporter": ["lcov", "text"],
4
- "skip-full": true
5
- }
@@ -1,78 +0,0 @@
1
- import { t as safeImport_default } from "./safeImport-D7h_Y_6K.mjs";
2
-
3
- //#region exports.ts
4
- const locales = [
5
- "de",
6
- "es",
7
- "fr",
8
- "it",
9
- "ko",
10
- "pl",
11
- "pt",
12
- "ru",
13
- "zh",
14
- "cs",
15
- "sr",
16
- "uk"
17
- ];
18
- const makeBundle = async () => {
19
- /**
20
- * English United States translations bundle,
21
- * default translations
22
- * @type {WorldstateLangBundle}
23
- */
24
- const enUS = {
25
- arcanes: await safeImport_default("./data/arcanes.json"),
26
- archonShards: await safeImport_default("./data/archonShards.json"),
27
- conclave: await safeImport_default("./data/conclaveData.json"),
28
- events: await safeImport_default("./data/eventsData.json"),
29
- factions: await safeImport_default("./data/factionsData.json"),
30
- fissureModifiers: await safeImport_default("./data/fissureModifiers.json"),
31
- languages: await safeImport_default("./data/languages.json"),
32
- missionTypes: await safeImport_default("./data/missionTypes.json"),
33
- operationTypes: await safeImport_default("./data/operationTypes.json"),
34
- persistentEnemy: await safeImport_default("./data/persistentEnemyData.json"),
35
- solNodes: await safeImport_default("./data/solNodes.json"),
36
- sortie: await safeImport_default("./data/sortieData.json"),
37
- syndicates: await safeImport_default("./data/syndicatesData.json"),
38
- tutorials: await safeImport_default("./data/tutorials.json"),
39
- upgradeTypes: await safeImport_default("./data/upgradeTypes.json"),
40
- synthTargets: await safeImport_default("./data/synthTargets.json"),
41
- steelPath: await safeImport_default("./data/steelPath.json")
42
- };
43
- const bundle = {
44
- en: enUS,
45
- ...enUS,
46
- locales
47
- };
48
- for await (const locale of locales)
49
- /**
50
- * Translations bundle for $locale
51
- * @type {WorldstateLangBundle}
52
- */
53
- bundle[locale] = {
54
- arcanes: await safeImport_default(`./data/${locale}/arcanes.json`, enUS.arcanes),
55
- archonShards: await safeImport_default(`./data/${locale}/archonShards.json`, enUS.archonShards),
56
- conclave: await safeImport_default(`./data/${locale}/conclaveData.json`, enUS.conclave),
57
- events: await safeImport_default(`./data/${locale}/eventsData.json`, enUS.events),
58
- factions: await safeImport_default(`./data/${locale}/factionsData.json`, enUS.factions),
59
- fissureModifiers: await safeImport_default(`./data/${locale}/fissureModifiers.json`, enUS.fissureModifiers),
60
- languages: await safeImport_default(`./data/${locale}/languages.json`, enUS.languages),
61
- missionTypes: await safeImport_default(`./data/${locale}/missionTypes.json`, enUS.missionTypes),
62
- operationTypes: await safeImport_default(`./data/${locale}/operationTypes.json`, enUS.operationTypes),
63
- persistentEnemy: await safeImport_default(`./data/${locale}/persistentEnemyData.json`, enUS.persistentEnemy),
64
- solNodes: await safeImport_default(`./data/${locale}/solNodes.json`, enUS.solNodes),
65
- sortie: await safeImport_default(`./data/${locale}/sortieData.json`, enUS.sortie),
66
- syndicates: await safeImport_default(`./data/${locale}/syndicatesData.json`, enUS.syndicates),
67
- tutorials: await safeImport_default(`./data/${locale}/tutorials.json`, enUS.tutorials),
68
- upgradeTypes: await safeImport_default(`./data/${locale}/upgradeTypes.json`, enUS.upgradeTypes),
69
- synthTargets: await safeImport_default(`./data/${locale}/synthTargets.json`, enUS.synthTargets),
70
- steelPath: await safeImport_default(`./data/${locale}/steelPath.json`, enUS.steelPath)
71
- };
72
- locales.push("en");
73
- return bundle;
74
- };
75
- var exports_default = await makeBundle();
76
-
77
- //#endregion
78
- export { exports_default as t };
@@ -1,9 +0,0 @@
1
- //#region tools/integrity.d.ts
2
- /**
3
- * @description Insist that the provided data has the required properties.
4
- * @param thing to encourage to have data
5
- * @param args arguments to ensure
6
- */
7
- declare const insist: (thing: Record<string, unknown>, ...args: string[]) => void;
8
- //#endregion
9
- export { insist as t };
@@ -1,15 +0,0 @@
1
- //#region tools/integrity.ts
2
- /**
3
- * @description Insist that the provided data has the required properties.
4
- * @param thing to encourage to have data
5
- * @param args arguments to ensure
6
- */
7
- const insist = (thing, ...args) => {
8
- if (!thing || !Object.keys(thing).length) throw new TypeError("The provided data does not have the required properties.");
9
- args.forEach((arg) => {
10
- if (!thing[arg]) throw new TypeError("The provided data does not have the required properties.");
11
- });
12
- };
13
-
14
- //#endregion
15
- export { insist as t };
@@ -1,2 +0,0 @@
1
- import { t as insist } from "../integrity-B8tf4op5.mjs";
2
- export { insist };
@@ -1,3 +0,0 @@
1
- import { t as insist } from "../integrity-l9XvAM5B.mjs";
2
-
3
- export { insist };
@@ -1,16 +0,0 @@
1
- /**
2
- * @description Insist that the provided data has the required properties.
3
- * @param thing to encourage to have data
4
- * @param args arguments to ensure
5
- */
6
- export const insist = (thing: Record<string, unknown>, ...args: string[]) => {
7
- if (!thing || !Object.keys(thing).length) {
8
- throw new TypeError('The provided data does not have the required properties.');
9
- }
10
-
11
- args.forEach((arg) => {
12
- if (!thing[arg]) {
13
- throw new TypeError('The provided data does not have the required properties.');
14
- }
15
- });
16
- };