cyclops-infobook-html 3.1.0 → 4.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/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ <a name="v4.0.0"></a>
5
+ ## [v4.0.0](https://github.com/CyclopsMC/infobook-html/compare/v3.0.0...v4.0.0) - 2024-07-23
6
+
7
+ ### BREAKING CHANGE
8
+ * [Update to NeoForge 1.21](https://github.com/CyclopsMC/infobook-html/commit/bec55a8a0d2049a07cc3dafee2276c94ed738e73)
9
+ The most notable change here is that "nbt" on items and fluids is replaced by "components".
10
+
4
11
  <a name="v3.1.0"></a>
5
12
  ## [v3.1.0](https://github.com/CyclopsMC/infobook-html/compare/v3.0.0...v3.1.0) - 2024-01-31
6
13
 
package/README.md CHANGED
@@ -54,6 +54,8 @@ Before you can execute this phase, you need a `modpack.json` file with contents
54
54
  }
55
55
  ```
56
56
 
57
+ *The "forge" entry may be replaced by "neoforge".*
58
+
57
59
  To start this phase, simply run `generate-mod-metadata modpack.json generate`.
58
60
 
59
61
  Optionally, you can delete the resulting server files afterwards using `generate-mod-metadata modpack.json clean`.
@@ -18,7 +18,7 @@ function run(command, configPath) {
18
18
  const modLoader = new ModLoader_1.ModLoader({
19
19
  mods: config.mods,
20
20
  path: path_1.join(process.cwd(), 'server'),
21
- versionForge: config.forge,
21
+ loader: 'forge' in config ? { versionForge: config.forge } : { versionNeoForge: config.neoforge },
22
22
  versionMinecraft: config.minecraft,
23
23
  });
24
24
  switch (command) {
@@ -1,5 +1,5 @@
1
1
  export interface IItem {
2
2
  item: string;
3
3
  count?: number;
4
- nbt?: string;
4
+ components?: string;
5
5
  }
@@ -6,7 +6,7 @@ import { ChildProcess } from "child_process";
6
6
  export declare class ModLoader {
7
7
  private readonly mods;
8
8
  private readonly path;
9
- private readonly versionForge;
9
+ private readonly loader;
10
10
  private readonly versionMinecraft;
11
11
  constructor(args: IModLoaderArgs);
12
12
  /**
@@ -76,14 +76,20 @@ export declare class ModLoader {
76
76
  export interface IModLoaderArgs {
77
77
  mods: IMod[];
78
78
  path: string;
79
- versionForge: string;
79
+ loader: ILoader;
80
80
  versionMinecraft: string;
81
81
  }
82
+ export declare type ILoader = {
83
+ versionForge: string;
84
+ } | {
85
+ versionNeoForge: string;
86
+ };
82
87
  export declare type IMod = IModMaven | IModCurseforge | IModRaw;
83
88
  export interface IModMaven {
84
89
  type: 'maven';
85
90
  artifact: string;
86
91
  repo: string;
92
+ name?: string;
87
93
  }
88
94
  export interface IModCurseforge {
89
95
  type: 'curseforge';
@@ -20,7 +20,7 @@ class ModLoader {
20
20
  constructor(args) {
21
21
  this.mods = args.mods;
22
22
  this.path = args.path;
23
- this.versionForge = args.versionForge;
23
+ this.loader = args.loader;
24
24
  this.versionMinecraft = args.versionMinecraft;
25
25
  }
26
26
  /**
@@ -37,22 +37,41 @@ class ModLoader {
37
37
  if (!fs.existsSync(this.path)) {
38
38
  yield fs.promises.mkdir(this.path);
39
39
  }
40
- // Download Forge installer
41
- process.stdout.write('Downloading Forge...\n');
42
- const forgeInstaller = `https://files.minecraftforge.net/maven/net/minecraftforge/forge/${this.versionMinecraft}-${this.versionForge}/forge-${this.versionMinecraft}-${this.versionForge}-installer.jar`;
43
- const res = yield node_fetch_1.default(forgeInstaller);
44
- if (!res.ok) {
45
- throw new Error(`Failed to fetch (${res.statusText}): ${forgeInstaller}`);
40
+ let installerFile;
41
+ if ('versionForge' in this.loader) {
42
+ // Download Forge installer
43
+ process.stdout.write('Downloading Forge...\n');
44
+ const forgeInstaller = `https://files.minecraftforge.net/maven/net/minecraftforge/forge/${this.versionMinecraft}-${this.loader.versionForge}/forge-${this.versionMinecraft}-${this.loader.versionForge}-installer.jar`;
45
+ const res = yield node_fetch_1.default(forgeInstaller);
46
+ if (!res.ok) {
47
+ throw new Error(`Failed to fetch (${res.statusText}): ${forgeInstaller}`);
48
+ }
49
+ installerFile = path_1.join(this.path, 'forge-installer.jar');
50
+ yield new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
51
+ return fs.writeFile(installerFile, yield res.buffer(), (err) => err ? reject(err) : resolve());
52
+ }));
53
+ // Install Forge
54
+ process.stdout.write('Installing Forge...\n');
55
+ yield new Promise((resolve, reject) => child_process_1.exec(`cd ${this.path} && java -jar forge-installer.jar --installServer`).on('exit', resolve));
56
+ }
57
+ else {
58
+ // Download NeoForge installer
59
+ process.stdout.write('Downloading NeoForge...\n');
60
+ const installer = `https://maven.neoforged.net/releases/net/neoforged/neoforge/${this.loader.versionNeoForge}/neoforge-${this.loader.versionNeoForge}-installer.jar`;
61
+ const res = yield node_fetch_1.default(installer);
62
+ if (!res.ok) {
63
+ throw new Error(`Failed to fetch (${res.statusText}): ${installer}`);
64
+ }
65
+ installerFile = path_1.join(this.path, 'neoforge-installer.jar');
66
+ yield new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
67
+ return fs.writeFile(installerFile, yield res.buffer(), (err) => err ? reject(err) : resolve());
68
+ }));
69
+ // Install Forge
70
+ process.stdout.write('Installing NeoForge...\n');
71
+ yield new Promise((resolve, reject) => child_process_1.exec(`cd ${this.path} && java -jar neoforge-installer.jar --installServer`).on('exit', resolve));
46
72
  }
47
- const installerFile = path_1.join(this.path, 'forge-installer.jar');
48
- yield new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
49
- return fs.writeFile(installerFile, yield res.buffer(), (err) => err ? reject(err) : resolve());
50
- }));
51
- // Install Forge
52
- process.stdout.write('Installing Forge...\n');
53
- yield new Promise((resolve, reject) => child_process_1.exec(`cd ${this.path} && java -jar forge-installer.jar --installServer`).on('exit', resolve));
54
73
  // Wait a bit, because otherwise some files don't exist yet (while they should...)
55
- process.stdout.write('Wait a bit after Forge installation...\n');
74
+ process.stdout.write('Wait a bit after mod loader installation...\n');
56
75
  yield new Promise((resolve) => setTimeout(resolve, 10000));
57
76
  // Cleanup
58
77
  process.stdout.write('Cleaning up...\n');
@@ -95,7 +114,11 @@ class ModLoader {
95
114
  }
96
115
  else if (mod.type === 'maven') {
97
116
  process.stdout.write(` - ${mod.artifact} from ${mod.repo}...\n`);
98
- yield mvn_artifact_download_1.default(mod.artifact, modsDir, mod.repo);
117
+ const name = yield mvn_artifact_download_1.default(mod.artifact, modsDir, mod.repo);
118
+ // Rename file if needed
119
+ if ('name' in mod) {
120
+ fs.renameSync(name, path_1.join(modsDir, mod.name));
121
+ }
99
122
  }
100
123
  else if (mod.type === 'raw') {
101
124
  process.stdout.write(` - ${mod.name} from ${mod.url}...\n`);
@@ -179,7 +179,7 @@ class ResourceHandler {
179
179
  */
180
180
  addItemTranslationKey(item, translationKey) {
181
181
  const { namespace, path } = ResourceHandler.splitItemId(item.item);
182
- ResourceHandler.addItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.nbt, translationKey);
182
+ ResourceHandler.addItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.components, translationKey);
183
183
  }
184
184
  /**
185
185
  * Get an item translation key.
@@ -188,7 +188,7 @@ class ResourceHandler {
188
188
  */
189
189
  getItemTranslationKey(item) {
190
190
  const { namespace, path } = ResourceHandler.splitItemId(item.item);
191
- return ResourceHandler.getItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.nbt);
191
+ return ResourceHandler.getItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.components);
192
192
  }
193
193
  /**
194
194
  * Add an fluid translation key.
@@ -126,7 +126,7 @@ class ResourceLoader {
126
126
  // Ignore mods without language files
127
127
  }
128
128
  // Handle advancements
129
- const advancementsDir = path_1.join(fullPath, 'advancements');
129
+ const advancementsDir = path_1.join(fullPath, 'advancement');
130
130
  try {
131
131
  if ((yield fs_1.promises.stat(langDir)).isDirectory()) {
132
132
  yield this.loadAssetsAdvancements(modid, advancementsDir, '');
@@ -177,7 +177,7 @@ class HtmlInfoBookSerializer {
177
177
  if (item.item === 'minecraft:air') {
178
178
  return slot ? '<div class="item item-slot">&nbsp;</div>' : '<div class="item">&nbsp;</div>';
179
179
  }
180
- const icon = resourceHandler.getItemIconFile(item.item, item.nbt);
180
+ const icon = resourceHandler.getItemIconFile(item.item, item.components);
181
181
  if (!icon) {
182
182
  throw new Error(`Could not find an icon for item ${JSON.stringify(item)}`);
183
183
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cyclops-infobook-html",
3
- "version": "3.1.0",
3
+ "version": "4.0.0",
4
4
  "description": "Output Cyclops infobooks as HTML",
5
5
  "main": "index.js",
6
6
  "repository": "git@github.com:CyclopsMC/infobook-html.git",
@@ -50,13 +50,13 @@
50
50
  "testEnvironment": "node"
51
51
  },
52
52
  "devDependencies": {
53
- "@types/jest": "^26.0.0",
53
+ "@types/jest": "^28.0.0",
54
54
  "@types/minimist": "^1.2.0",
55
55
  "coveralls": "^3.0.3",
56
- "jest": "^26.0.0",
56
+ "jest": "^28.0.0",
57
57
  "manual-git-changelog": "^1.0.1",
58
58
  "pre-commit": "^1.2.2",
59
- "ts-jest": "^26.0.0",
59
+ "ts-jest": "^28.0.0",
60
60
  "tslint": "^6.0.0",
61
61
  "tslint-eslint-rules": "^5.4.0",
62
62
  "typescript": "^4.0.0"
@@ -90,5 +90,8 @@
90
90
  "rimraf": "^3.0.0",
91
91
  "xml2js": "^0.4.19",
92
92
  "yauzl": "^2.10.0"
93
+ },
94
+ "resolutions": {
95
+ "@types/istanbul-reports": "3.0.0"
93
96
  }
94
97
  }