@wfcd/relics 1.0.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/License +21 -0
- package/Readme.md +72 -0
- package/dist/Build.d.ts +1 -0
- package/dist/Build.js +30 -0
- package/dist/Build.js.map +1 -0
- package/dist/Config.d.ts +8 -0
- package/dist/Config.js +11 -0
- package/dist/Config.js.map +1 -0
- package/dist/Generator.d.ts +41 -0
- package/dist/Generator.js +151 -0
- package/dist/Generator.js.map +1 -0
- package/dist/Logger.d.ts +9 -0
- package/dist/Logger.js +72 -0
- package/dist/Logger.js.map +1 -0
- package/dist/Types.d.ts +176 -0
- package/dist/Types.js +3 -0
- package/dist/Types.js.map +1 -0
- package/dist/VersionManager.d.ts +21 -0
- package/dist/VersionManager.js +79 -0
- package/dist/VersionManager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/package.json +130 -0
package/License
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 Soundofdarkness
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/Readme.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# warframe-relic-data (@wfcd/relics)
|
|
2
|
+
|
|
3
|
+
[](https://github.com/WFCD/warframe-relic-data/blob/master/License)
|
|
4
|
+
[](https://github.com/WFCD/warframe-relic-data/blob/development/data/version.json)
|
|
5
|
+
|
|
6
|
+
## Information
|
|
7
|
+
|
|
8
|
+
This repository is part of the build process for [warframe-items](https://github.com/WFCD/warframe-items),
|
|
9
|
+
but it does work standalone too.
|
|
10
|
+
So far this repository is probably not complete and is not stable.
|
|
11
|
+
No build is automatically ran either, so the data is probably quite outdated.
|
|
12
|
+
|
|
13
|
+
## Data Types
|
|
14
|
+
|
|
15
|
+
Currently the data is found in [Relics.json](/data/Relics.json) and [Relics.min.json](/data/Relics.min.json).
|
|
16
|
+
|
|
17
|
+
Types are available as Typescript types.
|
|
18
|
+
[Relics.json](/data/Relics.json) is an array of [TitaniaRelic](/src/Types.ts)
|
|
19
|
+
|
|
20
|
+
## Manually building
|
|
21
|
+
```bash
|
|
22
|
+
npm install
|
|
23
|
+
npm start
|
|
24
|
+
```
|
|
25
|
+
Afterwards the data should be available in [/data/Relics.json](/data/Relics.json)
|
|
26
|
+
|
|
27
|
+
## Integrating into a different build process
|
|
28
|
+
|
|
29
|
+
For integration it is recommended to use the [Generator](/src/Generator.ts) directly.
|
|
30
|
+
A very simple example:
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { Generator } from "warframe-relic-data";
|
|
34
|
+
|
|
35
|
+
const generator = new Generator();
|
|
36
|
+
|
|
37
|
+
await generator.generate();
|
|
38
|
+
await generator.writeData("./", "Relic", true);
|
|
39
|
+
```
|
|
40
|
+
The generated data would now be in `./Relic.json` and `./Relic.min.json`.
|
|
41
|
+
|
|
42
|
+
As alternative, `Generator.generate()` returns the full relic data array directly for use in other modules.
|
|
43
|
+
|
|
44
|
+
For conviniece this module provides a version checker, which can determine if any of api data is updated.
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { VersionManager } from "warframe-relic-data";
|
|
50
|
+
|
|
51
|
+
const manager = new VersionManager("./");
|
|
52
|
+
|
|
53
|
+
const needsUpdate = await manager.updateNeeded(); // true if needed
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
A more complete example (using the default [./data/](./data/) directory) can be found here: [Example](./src/Build.ts)
|
|
58
|
+
|
|
59
|
+
## Credits
|
|
60
|
+
|
|
61
|
+
- [warframe-items](https://github.com/WFCD/warframe-items) License: [MIT](https://github.com/WFCD/warframe-items/blob/master/LICENSE)
|
|
62
|
+
- [warframe-drop-data](https://github.com/WFCD/warframe-drop-data) License: [MIT](https://github.com/WFCD/warframe-drop-data/blob/main/LICENSE)
|
|
63
|
+
- [warframe-patchlogs](https://github.com/WFCD/warframe-patchlogs) License: [MIT](https://github.com/WFCD/warframe-patchlogs/blob/master/LICENSE)
|
|
64
|
+
- [warframe.market](https://warframe.market)
|
|
65
|
+
- [Warframe Drop Tables](https://n8k6e2y6.ssl.hwcdn.net/repos/hnfvc0o3jnfvc873njb03enrf56.html)
|
|
66
|
+
- [node-fetch](https://github.com/node-fetch/node-fetch/tree/2.x) License: [MIT](https://github.com/node-fetch/node-fetch/blob/2.x/LICENSE.md)
|
|
67
|
+
|
|
68
|
+
Thanks !
|
|
69
|
+
|
|
70
|
+
## License
|
|
71
|
+
|
|
72
|
+
[MIT](/License)
|
package/dist/Build.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/Build.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const Generator_1 = require("./Generator");
|
|
7
|
+
const VersionManager_1 = require("./VersionManager");
|
|
8
|
+
const Logger_1 = __importDefault(require("./Logger"));
|
|
9
|
+
/**
|
|
10
|
+
* Entrypoint for the build process.
|
|
11
|
+
*/
|
|
12
|
+
async function run() {
|
|
13
|
+
const generator = new Generator_1.Generator();
|
|
14
|
+
const versionManager = new VersionManager_1.VersionManager();
|
|
15
|
+
const date = Date.now();
|
|
16
|
+
Logger_1.default.log(`Starting build ${date}`);
|
|
17
|
+
const needsUpdate = await versionManager.updateNeeded();
|
|
18
|
+
if (needsUpdate) {
|
|
19
|
+
Logger_1.default.log('Found update, starting generation');
|
|
20
|
+
await generator.generate();
|
|
21
|
+
await generator.writeData();
|
|
22
|
+
await versionManager.writeVersion(date);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
Logger_1.default.log('No updates found !');
|
|
26
|
+
}
|
|
27
|
+
Logger_1.default.log('Build finished.');
|
|
28
|
+
}
|
|
29
|
+
run().catch(Logger_1.default.error.bind(Logger_1.default));
|
|
30
|
+
//# sourceMappingURL=Build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Build.js","sourceRoot":"","sources":["../src/Build.ts"],"names":[],"mappings":";;;;;AAAA,2CAAwC;AACxC,qDAAkD;AAClD,sDAA8B;AAE9B;;GAEG;AACH,KAAK,UAAU,GAAG;IAChB,MAAM,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;IAClC,MAAM,cAAc,GAAG,IAAI,+BAAc,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,gBAAM,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;IACxD,IAAI,WAAW,EAAE;QACf,gBAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;KACzC;SAAM;QACL,gBAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;KAClC;IACD,gBAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAChC,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAM,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAM,CAAC,CAAC,CAAC"}
|
package/dist/Config.d.ts
ADDED
package/dist/Config.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Config = {
|
|
4
|
+
warframeRelicDropUrl: 'https://drops.warframestat.us/data/relics.json',
|
|
5
|
+
warframeMarketItemUrl: 'https://api.warframe.market/v1/items',
|
|
6
|
+
warframeItemsUrl: 'https://api.warframestat.us/items/search/Relics?by=category',
|
|
7
|
+
warframeRelicDropInfoUrl: 'https://drops.warframestat.us/data/info.json',
|
|
8
|
+
warframePatchlogsUrl: 'https://raw.githubusercontent.com/WFCD/warframe-patchlogs/master/data/patchlogs.json',
|
|
9
|
+
};
|
|
10
|
+
exports.default = Config;
|
|
11
|
+
//# sourceMappingURL=Config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":";;AAAA,MAAM,MAAM,GAAG;IACb,oBAAoB,EAAE,gDAAgD;IACtE,qBAAqB,EAAE,sCAAsC;IAC7D,gBAAgB,EAAE,6DAA6D;IAC/E,wBAAwB,EAAE,8CAA8C;IACxE,oBAAoB,EAAE,sFAAsF;CAC7G,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { TitaniaRelic, WarframeMarketRoot, WFCDItem, WFCDRelic } from './Types';
|
|
2
|
+
export declare class Generator {
|
|
3
|
+
relicsRaw: Array<WFCDRelic> | undefined;
|
|
4
|
+
wfcdItems: Array<WFCDItem> | undefined;
|
|
5
|
+
wfmItems: WarframeMarketRoot | undefined;
|
|
6
|
+
relics: Array<TitaniaRelic>;
|
|
7
|
+
constructor();
|
|
8
|
+
/**
|
|
9
|
+
* Main function to fetch and generate the relic data
|
|
10
|
+
* @returns {Promise<Array<TitaniaRelic>>} The Relics data array
|
|
11
|
+
*/
|
|
12
|
+
generate(): Promise<Array<TitaniaRelic>>;
|
|
13
|
+
/**
|
|
14
|
+
* Fetches all required data from WFCD and WFM.
|
|
15
|
+
*/
|
|
16
|
+
fetchRawData(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Generates the relic data
|
|
19
|
+
* uses WFCD/warframe-drop-data to check what relics exist,
|
|
20
|
+
* and adds information from WFCD/warframe-items and WFM
|
|
21
|
+
*/
|
|
22
|
+
generateTitaniaRelics(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Writes the fully generated data to disk.
|
|
25
|
+
* @param {string} dataDir Directory to store the relic data in. Default: ../data/
|
|
26
|
+
* @param {string} fileName Filename base ex: "Relics" becomes "Relics.json" and "Relics.min.json". Default: "Relics"
|
|
27
|
+
* @param {boolean} generateMin True if a minified json should be generated too. Default: true
|
|
28
|
+
*/
|
|
29
|
+
writeData(dataDir?: string, fileName?: string, generateMin?: boolean): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Generates a single relic from all available data
|
|
32
|
+
* @param {WFCDRelic} rawRelic relic to pull Titania data from
|
|
33
|
+
* @returns {TitaniaRelicReward}
|
|
34
|
+
*/
|
|
35
|
+
private generateTitaniaRelic;
|
|
36
|
+
/**
|
|
37
|
+
* Filters WFCD's relic data to only include Intact variants, since we just need the base.
|
|
38
|
+
*/
|
|
39
|
+
private filterWFCDRelics;
|
|
40
|
+
}
|
|
41
|
+
export default Generator;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Generator = void 0;
|
|
7
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
8
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const Config_1 = __importDefault(require("./Config"));
|
|
11
|
+
const Logger_1 = __importDefault(require("./Logger"));
|
|
12
|
+
class Generator {
|
|
13
|
+
relicsRaw;
|
|
14
|
+
wfcdItems;
|
|
15
|
+
wfmItems;
|
|
16
|
+
relics;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.relics = [];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Main function to fetch and generate the relic data
|
|
22
|
+
* @returns {Promise<Array<TitaniaRelic>>} The Relics data array
|
|
23
|
+
*/
|
|
24
|
+
async generate() {
|
|
25
|
+
Logger_1.default.log('Starting Generation');
|
|
26
|
+
await this.fetchRawData();
|
|
27
|
+
this.filterWFCDRelics();
|
|
28
|
+
this.generateTitaniaRelics();
|
|
29
|
+
return this.relics;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fetches all required data from WFCD and WFM.
|
|
33
|
+
*/
|
|
34
|
+
async fetchRawData() {
|
|
35
|
+
const relicRequest = await (0, node_fetch_1.default)(Config_1.default.warframeRelicDropUrl);
|
|
36
|
+
if (!relicRequest.ok) {
|
|
37
|
+
Logger_1.default.error('Failed to fetch Warframe relics from WFCD!');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.relicsRaw = (await relicRequest.json())?.relics;
|
|
41
|
+
const wfmRequest = await (0, node_fetch_1.default)(Config_1.default.warframeMarketItemUrl);
|
|
42
|
+
if (!wfmRequest.ok) {
|
|
43
|
+
Logger_1.default.error('Failed to fetch items from WFM!');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.wfmItems = (await wfmRequest.json());
|
|
47
|
+
const wfcdItemRequest = await (0, node_fetch_1.default)(Config_1.default.warframeItemsUrl);
|
|
48
|
+
if (!wfcdItemRequest.ok) {
|
|
49
|
+
Logger_1.default.error('Failed to fetch items from WFCD! ');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.wfcdItems = (await wfcdItemRequest.json());
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generates the relic data
|
|
56
|
+
* uses WFCD/warframe-drop-data to check what relics exist,
|
|
57
|
+
* and adds information from WFCD/warframe-items and WFM
|
|
58
|
+
*/
|
|
59
|
+
generateTitaniaRelics() {
|
|
60
|
+
if (typeof this.relicsRaw === 'undefined' || typeof this.wfmItems === 'undefined') {
|
|
61
|
+
Logger_1.default.log('Failed to load relics/item data');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const { length } = this.relicsRaw;
|
|
65
|
+
for (let i = 0; i < length; i += 1) {
|
|
66
|
+
const rawRelic = this.relicsRaw[i];
|
|
67
|
+
Logger_1.default.debug(`[${i + 1}/${length}] ${rawRelic.tier} ${rawRelic.relicName}`);
|
|
68
|
+
const relic = this.generateTitaniaRelic(rawRelic);
|
|
69
|
+
this.relics.push(relic);
|
|
70
|
+
}
|
|
71
|
+
Logger_1.default.debug(`Finished parsing ${this.relics.length} relics`);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Writes the fully generated data to disk.
|
|
75
|
+
* @param {string} dataDir Directory to store the relic data in. Default: ../data/
|
|
76
|
+
* @param {string} fileName Filename base ex: "Relics" becomes "Relics.json" and "Relics.min.json". Default: "Relics"
|
|
77
|
+
* @param {boolean} generateMin True if a minified json should be generated too. Default: true
|
|
78
|
+
*/
|
|
79
|
+
async writeData(dataDir, fileName, generateMin) {
|
|
80
|
+
const DataDir = dataDir ?? node_path_1.default.join(__dirname, '..', 'data');
|
|
81
|
+
const RelicPath = fileName ? node_path_1.default.join(DataDir, `${fileName}.json`) : node_path_1.default.join(DataDir, 'Relics.json');
|
|
82
|
+
await promises_1.default.writeFile(RelicPath, JSON.stringify(this.relics, undefined, 4));
|
|
83
|
+
if (generateMin) {
|
|
84
|
+
const RelicMinPath = fileName
|
|
85
|
+
? node_path_1.default.join(DataDir, `${fileName}.min.json`)
|
|
86
|
+
: node_path_1.default.join(DataDir, 'Relics.min.json');
|
|
87
|
+
await promises_1.default.writeFile(RelicMinPath, JSON.stringify(this.relics));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generates a single relic from all available data
|
|
92
|
+
* @param {WFCDRelic} rawRelic relic to pull Titania data from
|
|
93
|
+
* @returns {TitaniaRelicReward}
|
|
94
|
+
*/
|
|
95
|
+
generateTitaniaRelic(rawRelic) {
|
|
96
|
+
const name = `${rawRelic.tier} ${rawRelic.relicName}`;
|
|
97
|
+
const rewards = rawRelic.rewards.map((rawReward) => {
|
|
98
|
+
const { chance } = rawReward;
|
|
99
|
+
const { rarity } = rawReward;
|
|
100
|
+
const wfmInfo = this.wfmItems?.payload.items.find((x) => x.item_name === rawReward.itemName);
|
|
101
|
+
const isSpecial = ['Forma', 'Kuva', 'Exilus', 'Riven'].find((x) =>
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/comma-dangle
|
|
103
|
+
rawReward.itemName.toLowerCase().includes(x.toLowerCase()));
|
|
104
|
+
if (!(wfmInfo || isSpecial)) {
|
|
105
|
+
Logger_1.default.debug(`Failed to find wfm item for ${rawReward.itemName}`);
|
|
106
|
+
}
|
|
107
|
+
const item = {
|
|
108
|
+
name: rawReward.itemName,
|
|
109
|
+
uniqueName: this.wfcdItems?.find((x) => x.name.toLowerCase() === `${name.trim()} Intact`.toLowerCase())?.uniqueName || '',
|
|
110
|
+
warframeMarket: undefined,
|
|
111
|
+
};
|
|
112
|
+
if (wfmInfo) {
|
|
113
|
+
item.warframeMarket = { id: wfmInfo.id, urlName: wfmInfo.url_name };
|
|
114
|
+
}
|
|
115
|
+
return { rarity, chance, item };
|
|
116
|
+
});
|
|
117
|
+
let drops = [];
|
|
118
|
+
const wfcdItem = this.wfcdItems?.find((x) => x.name.toLowerCase() === `${name.trim()} Intact`.toLowerCase());
|
|
119
|
+
if (!wfcdItem) {
|
|
120
|
+
Logger_1.default.error(`Failed to get WFCD item for relic: ${name}`);
|
|
121
|
+
}
|
|
122
|
+
if (wfcdItem && wfcdItem.drops) {
|
|
123
|
+
drops = wfcdItem.drops.map((rawDrop) => {
|
|
124
|
+
return { rarity: rawDrop.rarity, chance: rawDrop.chance, location: rawDrop.location };
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const wfm = this.wfmItems?.payload.items.find((x) => x.item_name === `${name.trim()} Relic`);
|
|
128
|
+
if (!wfm) {
|
|
129
|
+
Logger_1.default.error(`Failed to get relic item from wfm: ${name}`);
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
name,
|
|
133
|
+
rewards,
|
|
134
|
+
locations: drops,
|
|
135
|
+
uniqueName: wfcdItem?.uniqueName || '',
|
|
136
|
+
vaultInfo: { vaulted: drops.length === 0, vaultDate: '' },
|
|
137
|
+
...(wfm?.id && wfm?.url_name && { warframeMarket: { id: wfm?.id, urlName: wfm?.url_name } }),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Filters WFCD's relic data to only include Intact variants, since we just need the base.
|
|
142
|
+
*/
|
|
143
|
+
filterWFCDRelics() {
|
|
144
|
+
const before = this.relicsRaw?.length || 0;
|
|
145
|
+
this.relicsRaw = this.relicsRaw?.filter((x) => x.state === 'Intact');
|
|
146
|
+
Logger_1.default.log(`Filtered relics to intact variants. Before: ${before} After: ${this.relicsRaw?.length || 0}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.Generator = Generator;
|
|
150
|
+
exports.default = Generator;
|
|
151
|
+
//# sourceMappingURL=Generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Generator.js","sourceRoot":"","sources":["../src/Generator.ts"],"names":[],"mappings":"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"}
|
package/dist/Logger.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare class Logger {
|
|
2
|
+
private readonly logLevel;
|
|
3
|
+
log(message: string | unknown): void;
|
|
4
|
+
error(message: string | unknown): void;
|
|
5
|
+
debug(message: string | unknown): void;
|
|
6
|
+
fatal(message: string): void;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: Logger;
|
|
9
|
+
export default _default;
|
package/dist/Logger.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const console = __importStar(require("node:console"));
|
|
27
|
+
var LogLevel;
|
|
28
|
+
(function (LogLevel) {
|
|
29
|
+
LogLevel[LogLevel["FATAL"] = -1] = "FATAL";
|
|
30
|
+
LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
|
|
31
|
+
LogLevel[LogLevel["LOG"] = 1] = "LOG";
|
|
32
|
+
LogLevel[LogLevel["DEBUG"] = 2] = "DEBUG";
|
|
33
|
+
})(LogLevel || (LogLevel = {}));
|
|
34
|
+
const fromString = (logLevelIsh) => {
|
|
35
|
+
switch (logLevelIsh?.toLowerCase()) {
|
|
36
|
+
case 'fatal':
|
|
37
|
+
return LogLevel.FATAL;
|
|
38
|
+
case 'error':
|
|
39
|
+
case 'bad':
|
|
40
|
+
return LogLevel.ERROR;
|
|
41
|
+
case 'info':
|
|
42
|
+
case 'log':
|
|
43
|
+
return LogLevel.LOG;
|
|
44
|
+
case 'debug':
|
|
45
|
+
return LogLevel.DEBUG;
|
|
46
|
+
default:
|
|
47
|
+
return LogLevel.FATAL;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
class Logger {
|
|
51
|
+
logLevel = fromString(process.env.LOG_LEVEL || 'fatal');
|
|
52
|
+
log(message) {
|
|
53
|
+
if (this.logLevel >= LogLevel.LOG)
|
|
54
|
+
console.log(message);
|
|
55
|
+
}
|
|
56
|
+
error(message) {
|
|
57
|
+
if (this.logLevel >= LogLevel.ERROR)
|
|
58
|
+
console.error(message);
|
|
59
|
+
}
|
|
60
|
+
debug(message) {
|
|
61
|
+
if (this.logLevel === LogLevel.DEBUG)
|
|
62
|
+
console.debug(message);
|
|
63
|
+
}
|
|
64
|
+
fatal(message) {
|
|
65
|
+
if (this.logLevel >= LogLevel.FATAL) {
|
|
66
|
+
console.error(`FATAL: ${message}`);
|
|
67
|
+
throw new Error(message);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.default = new Logger();
|
|
72
|
+
//# sourceMappingURL=Logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAwC;AAExC,IAAK,QAKJ;AALD,WAAK,QAAQ;IACX,0CAAU,CAAA;IACV,yCAAK,CAAA;IACL,qCAAG,CAAA;IACH,yCAAK,CAAA;AACP,CAAC,EALI,QAAQ,KAAR,QAAQ,QAKZ;AAED,MAAM,UAAU,GAAG,CAAC,WAAmB,EAAY,EAAE;IACnD,QAAQ,WAAW,EAAE,WAAW,EAAE,EAAE;QAClC,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,KAAK,OAAO,CAAC;QACb,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,GAAG,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB;YACE,OAAO,QAAQ,CAAC,KAAK,CAAC;KACzB;AACH,CAAC,CAAC;AAEF,MAAM,MAAM;IACO,QAAQ,GAAa,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;IAEnF,GAAG,CAAC,OAAyB;QAC3B,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,OAAyB;QAC7B,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,OAAyB;QAC7B,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE;YACnC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;SAC1B;IACH,CAAC;CACF;AAED,kBAAe,IAAI,MAAM,EAAE,CAAC"}
|
package/dist/Types.d.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
export interface WarframeMarketRoot {
|
|
2
|
+
payload: {
|
|
3
|
+
items: Array<WarframeMarketItem>;
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
export interface WarframeMarketItem {
|
|
7
|
+
/**
|
|
8
|
+
* WFM Item ID
|
|
9
|
+
*/
|
|
10
|
+
id: string;
|
|
11
|
+
/**
|
|
12
|
+
* Url name for querying WFM
|
|
13
|
+
*/
|
|
14
|
+
url_name: string;
|
|
15
|
+
/**
|
|
16
|
+
* Thumbnail URL relative to wfm api base
|
|
17
|
+
*/
|
|
18
|
+
thumb: string;
|
|
19
|
+
/**
|
|
20
|
+
* Item Name
|
|
21
|
+
*/
|
|
22
|
+
item_name: string;
|
|
23
|
+
}
|
|
24
|
+
export interface WFCDRelic {
|
|
25
|
+
/**
|
|
26
|
+
* Relic Tier (Axi, Neo, etc.)
|
|
27
|
+
*/
|
|
28
|
+
tier: string;
|
|
29
|
+
/**
|
|
30
|
+
* Relic Name (A1, A10, etc.)
|
|
31
|
+
*/
|
|
32
|
+
relicName: string;
|
|
33
|
+
/**
|
|
34
|
+
* Relic Refinement state
|
|
35
|
+
*/
|
|
36
|
+
state: 'Intact' | 'Exceptional' | 'Flawless' | 'Radiant';
|
|
37
|
+
/**
|
|
38
|
+
* Relic Rewards
|
|
39
|
+
*/
|
|
40
|
+
rewards: Array<WFCDRelicReward>;
|
|
41
|
+
/**
|
|
42
|
+
* Internal WFCD id
|
|
43
|
+
*/
|
|
44
|
+
_id: string;
|
|
45
|
+
}
|
|
46
|
+
export interface WFCDRelicReward {
|
|
47
|
+
/**
|
|
48
|
+
* Dropped Item name
|
|
49
|
+
*/
|
|
50
|
+
itemName: string;
|
|
51
|
+
/**
|
|
52
|
+
* Dropchance Rarity (Uncommon/Rare ?)
|
|
53
|
+
*/
|
|
54
|
+
rarity: 'Uncommon' | 'Rare';
|
|
55
|
+
/**
|
|
56
|
+
* Actual Dropchance in %
|
|
57
|
+
*/
|
|
58
|
+
chance: number;
|
|
59
|
+
/**
|
|
60
|
+
* Internal ID
|
|
61
|
+
*/
|
|
62
|
+
_id: string;
|
|
63
|
+
}
|
|
64
|
+
export interface WFCDItem {
|
|
65
|
+
/**
|
|
66
|
+
* Item Name
|
|
67
|
+
*/
|
|
68
|
+
name: string;
|
|
69
|
+
/** Unique identifying name */
|
|
70
|
+
uniqueName: string;
|
|
71
|
+
/**
|
|
72
|
+
* Item Drop Location
|
|
73
|
+
*/
|
|
74
|
+
drops?: Array<WFCDItemDropLocation>;
|
|
75
|
+
}
|
|
76
|
+
export interface WFCDItemDropLocation {
|
|
77
|
+
/**
|
|
78
|
+
* Dropchance in %
|
|
79
|
+
*/
|
|
80
|
+
chance: number;
|
|
81
|
+
/**
|
|
82
|
+
* Mission location
|
|
83
|
+
*/
|
|
84
|
+
location: string;
|
|
85
|
+
/**
|
|
86
|
+
* Drop rarity
|
|
87
|
+
*/
|
|
88
|
+
rarity: string;
|
|
89
|
+
/**
|
|
90
|
+
* Relic Type
|
|
91
|
+
*/
|
|
92
|
+
type: string;
|
|
93
|
+
}
|
|
94
|
+
export interface TitaniaRelic {
|
|
95
|
+
/**
|
|
96
|
+
* Relic Combined Name (Ex: Axi A1)
|
|
97
|
+
*/
|
|
98
|
+
name: string;
|
|
99
|
+
/**
|
|
100
|
+
* Relic Rewards when opened
|
|
101
|
+
*/
|
|
102
|
+
rewards: Array<TitaniaRelicReward>;
|
|
103
|
+
/**
|
|
104
|
+
* Drop Locations for the relics
|
|
105
|
+
*/
|
|
106
|
+
locations: Array<TitaniaRelicLocation>;
|
|
107
|
+
/**
|
|
108
|
+
* Warframe Market Information
|
|
109
|
+
* undefined for untradable
|
|
110
|
+
*/
|
|
111
|
+
warframeMarket?: TitaniaWFMInfo;
|
|
112
|
+
/**
|
|
113
|
+
* Relic Vault Information
|
|
114
|
+
*/
|
|
115
|
+
vaultInfo: TitaniaRelicVaultedInfo;
|
|
116
|
+
/** unique name for corresponding warframe-items Item */
|
|
117
|
+
uniqueName: string;
|
|
118
|
+
}
|
|
119
|
+
export interface TitaniaRelicReward {
|
|
120
|
+
/**
|
|
121
|
+
* Relic Rarity (Uncommon,Rare ?)
|
|
122
|
+
*/
|
|
123
|
+
rarity: 'Uncommon' | 'Rare';
|
|
124
|
+
/**
|
|
125
|
+
* Reward Drop Chance in %
|
|
126
|
+
*/
|
|
127
|
+
chance: number;
|
|
128
|
+
/**
|
|
129
|
+
* Item Information
|
|
130
|
+
*/
|
|
131
|
+
item: TitaniaRelicRewardItem;
|
|
132
|
+
}
|
|
133
|
+
export interface TitaniaRelicRewardItem {
|
|
134
|
+
/**
|
|
135
|
+
* Item Name
|
|
136
|
+
*/
|
|
137
|
+
name: string;
|
|
138
|
+
/** unique name for corresponding warframe-items Item */
|
|
139
|
+
uniqueName: string;
|
|
140
|
+
/**
|
|
141
|
+
* WarframeMarket Info
|
|
142
|
+
*/
|
|
143
|
+
warframeMarket?: TitaniaWFMInfo;
|
|
144
|
+
}
|
|
145
|
+
export interface TitaniaRelicLocation {
|
|
146
|
+
/** Location Info $planet-$node (Ex: Eris - Phalan) */
|
|
147
|
+
location: string;
|
|
148
|
+
/**
|
|
149
|
+
* Rarity (Uncommon, Rare ?)
|
|
150
|
+
*/
|
|
151
|
+
rarity: 'Uncommon' | 'Rare' | 'Legendary' | 'Common' | string;
|
|
152
|
+
/**
|
|
153
|
+
* Dropchance in %
|
|
154
|
+
*/
|
|
155
|
+
chance: number;
|
|
156
|
+
}
|
|
157
|
+
export interface TitaniaWFMInfo {
|
|
158
|
+
/**
|
|
159
|
+
* Warframe Market ID
|
|
160
|
+
*/
|
|
161
|
+
id: string;
|
|
162
|
+
/**
|
|
163
|
+
* Warframe market URL parameter
|
|
164
|
+
*/
|
|
165
|
+
urlName: string;
|
|
166
|
+
}
|
|
167
|
+
export interface TitaniaRelicVaultedInfo {
|
|
168
|
+
/**
|
|
169
|
+
* If the relic is vaulted
|
|
170
|
+
*/
|
|
171
|
+
vaulted: boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Vaulted Date
|
|
174
|
+
*/
|
|
175
|
+
vaultDate: string;
|
|
176
|
+
}
|
package/dist/Types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.js","sourceRoot":"","sources":["../src/Types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class VersionManager {
|
|
2
|
+
versionPath: string;
|
|
3
|
+
versionRawPath: string;
|
|
4
|
+
hashPath: string;
|
|
5
|
+
/**
|
|
6
|
+
* Creates a new VersionManager instance.
|
|
7
|
+
* @param {string} dataDir Folder to write version information to.
|
|
8
|
+
* @constructor
|
|
9
|
+
*/
|
|
10
|
+
constructor(dataDir?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Checks if the current data needs an update
|
|
13
|
+
*/
|
|
14
|
+
updateNeeded(): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Writes both game and drop version metadata
|
|
17
|
+
* @param {number} timestamp Timestamp the build was started at
|
|
18
|
+
*/
|
|
19
|
+
writeVersion(timestamp: number): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export default VersionManager;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VersionManager = void 0;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
9
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
10
|
+
const Config_1 = __importDefault(require("./Config"));
|
|
11
|
+
const Logger_1 = __importDefault(require("./Logger"));
|
|
12
|
+
class VersionManager {
|
|
13
|
+
versionPath;
|
|
14
|
+
versionRawPath;
|
|
15
|
+
hashPath;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new VersionManager instance.
|
|
18
|
+
* @param {string} dataDir Folder to write version information to.
|
|
19
|
+
* @constructor
|
|
20
|
+
*/
|
|
21
|
+
constructor(dataDir) {
|
|
22
|
+
const DataDir = dataDir ?? node_path_1.default.join(__dirname, '..', 'data');
|
|
23
|
+
this.versionPath = node_path_1.default.join(DataDir, 'version.json');
|
|
24
|
+
this.versionRawPath = node_path_1.default.join(DataDir, 'version.txt');
|
|
25
|
+
this.hashPath = node_path_1.default.join(DataDir, 'hash.json');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks if the current data needs an update
|
|
29
|
+
*/
|
|
30
|
+
async updateNeeded() {
|
|
31
|
+
const infoReq = await (0, node_fetch_1.default)(Config_1.default.warframeRelicDropInfoUrl);
|
|
32
|
+
if (!infoReq.ok) {
|
|
33
|
+
Logger_1.default.fatal('Failed to fetch version info!');
|
|
34
|
+
}
|
|
35
|
+
const info = (await infoReq.json());
|
|
36
|
+
try {
|
|
37
|
+
await promises_1.default.access(this.hashPath);
|
|
38
|
+
const infoFile = JSON.parse(await promises_1.default.readFile(this.hashPath, 'utf-8'));
|
|
39
|
+
return infoFile.hash !== info.hash;
|
|
40
|
+
}
|
|
41
|
+
catch (ex) {
|
|
42
|
+
// Info file doesn't exist, so we need an update
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Writes both game and drop version metadata
|
|
48
|
+
* @param {number} timestamp Timestamp the build was started at
|
|
49
|
+
*/
|
|
50
|
+
async writeVersion(timestamp) {
|
|
51
|
+
const patchLogsReq = await (0, node_fetch_1.default)(Config_1.default.warframePatchlogsUrl);
|
|
52
|
+
if (!patchLogsReq.ok) {
|
|
53
|
+
Logger_1.default.error('Failed to fetch patchlogs');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const patchlogs = (await patchLogsReq.json());
|
|
57
|
+
// Shamelessly stolen from https://github.com/WFCD/warframe-items/blob/master/build/build.js
|
|
58
|
+
// (MIT License: https://github.com/WFCD/warframe-items/blob/master/LICENSE)
|
|
59
|
+
const version = patchlogs[0].name
|
|
60
|
+
.replace(/ \+ /g, '--')
|
|
61
|
+
.replace(/[^0-9\-.]/g, '')
|
|
62
|
+
.trim();
|
|
63
|
+
const hashReq = await (0, node_fetch_1.default)(Config_1.default.warframeRelicDropInfoUrl);
|
|
64
|
+
if (!hashReq.ok) {
|
|
65
|
+
Logger_1.default.error('Failed to fetch hashInfo');
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const hashInfo = (await hashReq.json());
|
|
69
|
+
const versionInfo = { version, title: patchlogs[0].name };
|
|
70
|
+
const hashFile = { hash: hashInfo.hash, deUpdated: hashInfo.modified, timestamp };
|
|
71
|
+
await promises_1.default.writeFile(this.hashPath, JSON.stringify(hashFile, undefined, 2), 'utf-8');
|
|
72
|
+
await promises_1.default.writeFile(this.versionPath, JSON.stringify(versionInfo, undefined, 2), 'utf-8');
|
|
73
|
+
await promises_1.default.writeFile(this.versionRawPath, version, 'utf-8');
|
|
74
|
+
Logger_1.default.debug('Finished writing version info');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.VersionManager = VersionManager;
|
|
78
|
+
exports.default = VersionManager;
|
|
79
|
+
//# sourceMappingURL=VersionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VersionManager.js","sourceRoot":"","sources":["../src/VersionManager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Types"), exports);
|
|
18
|
+
__exportStar(require("./Generator"), exports);
|
|
19
|
+
__exportStar(require("./VersionManager"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B;AAC5B,mDAAiC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wfcd/relics",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Relic Data for Warframe",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist/*",
|
|
8
|
+
"!dist/*.ts",
|
|
9
|
+
"!dist/spec/**",
|
|
10
|
+
"dist/**.d.ts"
|
|
11
|
+
],
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"coverage": "npm test && nyc report --reporter=text-lcov | coveralls",
|
|
16
|
+
"lint": "eslint .",
|
|
17
|
+
"lint:fix": "eslint . --fix",
|
|
18
|
+
"postinstall": "install-peerdeps @wfcd/eslint-config@^1.2.0 -S",
|
|
19
|
+
"prepack": "npm run build",
|
|
20
|
+
"start": "npm run build && node dist/Build.js",
|
|
21
|
+
"test": "nyc mocha",
|
|
22
|
+
"validate": "tsc --build --dry"
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/WFCD/warframe-relic-data.git"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"Warframe",
|
|
30
|
+
"Relics"
|
|
31
|
+
],
|
|
32
|
+
"author": "Soundofdarkness",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/WFCD/warframe-relic-data/issues"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/WFCD/warframe-relic-data#readme",
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/chai": "^4.3.3",
|
|
40
|
+
"@types/mocha": "^9.1.1",
|
|
41
|
+
"@types/node": "^18.6.4",
|
|
42
|
+
"@types/node-fetch": "^2.6.2",
|
|
43
|
+
"@wfcd/eslint-config": "^1.2.0",
|
|
44
|
+
"chai": "^4.3.6",
|
|
45
|
+
"coveralls": "^3.1.1",
|
|
46
|
+
"install-peerdeps": "^2.0.2",
|
|
47
|
+
"mocha": "^10.0.0",
|
|
48
|
+
"nyc": "^15.1.0",
|
|
49
|
+
"precommit-hook": "^3.0.0",
|
|
50
|
+
"ts-mocha": "^10.0.0",
|
|
51
|
+
"ts-node": "^10.9.1",
|
|
52
|
+
"tsconfig-paths": "^4.1.0",
|
|
53
|
+
"typescript": "^4.7.4"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"node-fetch": "^2.6.7",
|
|
57
|
+
"warframe-patchlogs": "^1.768.0"
|
|
58
|
+
},
|
|
59
|
+
"eslintIgnore": [
|
|
60
|
+
"dist/**"
|
|
61
|
+
],
|
|
62
|
+
"eslintConfig": {
|
|
63
|
+
"extends": [
|
|
64
|
+
"@wfcd/eslint-config/typescript"
|
|
65
|
+
],
|
|
66
|
+
"parserOptions": {
|
|
67
|
+
"project": "./tsconfig.json"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"prettier": "@wfcd/eslint-config/prettier",
|
|
71
|
+
"babel": {
|
|
72
|
+
"presets": [
|
|
73
|
+
"@babel/preset-env"
|
|
74
|
+
],
|
|
75
|
+
"plugins": [
|
|
76
|
+
"@babel/plugin-proposal-class-properties",
|
|
77
|
+
"@babel/plugin-proposal-private-methods"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
"release": {
|
|
81
|
+
"plugins": [
|
|
82
|
+
"@semantic-release/commit-analyzer",
|
|
83
|
+
"@semantic-release/release-notes-generator",
|
|
84
|
+
"@semantic-release/npm",
|
|
85
|
+
"@semantic-release/github",
|
|
86
|
+
[
|
|
87
|
+
"@semantic-release/changelog",
|
|
88
|
+
{
|
|
89
|
+
"assets": [
|
|
90
|
+
"CHANGELOG.md"
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
[
|
|
95
|
+
"@semantic-release/git",
|
|
96
|
+
{
|
|
97
|
+
"assets": [
|
|
98
|
+
"package.json",
|
|
99
|
+
"package-lock.json",
|
|
100
|
+
"CHANGELOG.md"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
],
|
|
105
|
+
"branches": "development"
|
|
106
|
+
},
|
|
107
|
+
"mocha": {
|
|
108
|
+
"exit": true,
|
|
109
|
+
"spec": "src/spec/**/*.spec.ts",
|
|
110
|
+
"timeout": "1000",
|
|
111
|
+
"loader": "ts-node/esm",
|
|
112
|
+
"extension": "ts"
|
|
113
|
+
},
|
|
114
|
+
"nyc": {
|
|
115
|
+
"exclude": [
|
|
116
|
+
"src/spec/**",
|
|
117
|
+
"dist/**"
|
|
118
|
+
],
|
|
119
|
+
"skip-full": true,
|
|
120
|
+
"reporter": [
|
|
121
|
+
"lcov",
|
|
122
|
+
"text"
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
"pre-commit": [
|
|
126
|
+
"lint",
|
|
127
|
+
"test",
|
|
128
|
+
"validate"
|
|
129
|
+
]
|
|
130
|
+
}
|