From afcae366b53c31211865ab9d7bcc5dbb8b9f2271 Mon Sep 17 00:00:00 2001 From: Daniel Scalzi Date: Tue, 19 May 2020 21:52:41 -0400 Subject: [PATCH] Added basic library discovery. Put all libraries into the libraries folder at the root of your server directory. These will be added to the distribution as Library modules. Recall, Library modules are added to the client's classpath at runtime. --- README.md | 1 + package-lock.json | 134 +++++++++++------- package.json | 16 +-- .../struct/model/module/library.struct.ts | 56 ++++++++ .../struct/model/module/module.struct.ts | 8 +- src/model/struct/model/server.struct.ts | 8 ++ 6 files changed, 158 insertions(+), 65 deletions(-) create mode 100644 src/model/struct/model/module/library.struct.ts diff --git a/README.md b/README.md index a47bbb0..6d72e60 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ Ex. * `TestServer-1.12.2` * `files` All modules of type `File`. + * `libraries` All modules of type `Library` * `forgemods` All modules of type `ForgeMod`. * `litemods` All modules of type `LiteMod`. * `TestServer-1.12.2.png` Server icon file. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9c49df5..1dfb1be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,9 +25,9 @@ } }, "@types/adm-zip": { - "version": "0.4.32", - "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.32.tgz", - "integrity": "sha512-hv1O7ySn+XvP5OeDQcJFWwVb2v+GFGO1A9aMTQ5B/bzxb7WW21O8iRhVdsKKr8QwuiagzGmPP+gsUAYZ6bRddQ==", + "version": "0.4.33", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.33.tgz", + "integrity": "sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==", "dev": true, "requires": { "@types/node": "*" @@ -45,9 +45,9 @@ "dev": true }, "@types/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==", "dev": true, "requires": { "@types/node": "*" @@ -60,15 +60,15 @@ "dev": true }, "@types/node": { - "version": "12.12.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.30.tgz", - "integrity": "sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==", + "version": "12.12.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.41.tgz", + "integrity": "sha512-Q+eSkdYQJ2XK1AJnr4Ji8Gvk3sRDybEwfTvtL9CA25FFUSD2EgZQewN6VCyWYZCXg5MWZdwogdTNBhlWRcWS1w==", "dev": true }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -81,45 +81,56 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz", - "integrity": "sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.24.0", - "eslint-utils": "^1.4.3", + "@typescript-eslint/experimental-utils": "2.34.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz", - "integrity": "sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.24.0", - "eslint-scope": "^5.0.0" + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } } }, "@typescript-eslint/parser": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.24.0.tgz", - "integrity": "sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.24.0", - "@typescript-eslint/typescript-estree": "2.24.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz", - "integrity": "sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -127,7 +138,7 @@ "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" }, "dependencies": { @@ -145,6 +156,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, @@ -223,6 +240,11 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "axios": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", @@ -658,13 +680,14 @@ } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs.realpath": { @@ -717,9 +740,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "has-flag": { "version": "3.0.0", @@ -888,11 +911,12 @@ "dev": true }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, "levn": { @@ -1076,9 +1100,9 @@ "dev": true }, "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "require-directory": { @@ -1363,15 +1387,15 @@ "dev": true }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", + "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", "dev": true }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" }, "uri-js": { "version": "4.2.2", @@ -1457,9 +1481,9 @@ } }, "yargs-parser": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", - "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index e305035..760f3f4 100644 --- a/package.json +++ b/package.json @@ -26,21 +26,21 @@ }, "homepage": "https://github.com/dscalzi/Nebula#readme", "devDependencies": { - "@types/adm-zip": "^0.4.32", - "@types/fs-extra": "^8.1.0", - "@types/node": "^12.12.30", - "@types/yargs": "^15.0.4", - "@typescript-eslint/eslint-plugin": "^2.24.0", - "@typescript-eslint/parser": "^2.24.0", + "@types/adm-zip": "^0.4.33", + "@types/fs-extra": "^9.0.1", + "@types/node": "^12.12.41", + "@types/yargs": "^15.0.5", + "@typescript-eslint/eslint-plugin": "^2.34.0", + "@typescript-eslint/parser": "^2.34.0", "eslint": "^6.8.0", "rimraf": "^3.0.2", - "typescript": "^3.8.3" + "typescript": "^3.9.3" }, "dependencies": { "adm-zip": "^0.4.14", "axios": "^0.19.2", "dotenv": "^8.2.0", - "fs-extra": "^8.1.0", + "fs-extra": "^9.0.0", "toml": "^3.0.0", "yargs": "^15.3.1", "helios-distribution-types": "^1.0.0-pre.1" diff --git a/src/model/struct/model/module/library.struct.ts b/src/model/struct/model/module/library.struct.ts new file mode 100644 index 0000000..80b96a7 --- /dev/null +++ b/src/model/struct/model/module/library.struct.ts @@ -0,0 +1,56 @@ +import { ModuleStructure } from './module.struct' +import { Type } from 'helios-distribution-types' +import { Stats } from 'fs-extra' +import { join } from 'path' +import { resolve } from 'url' + +export class LibraryStructure extends ModuleStructure { + + private readonly crudeRegex = /(.+)-([\d.]+).[jJ][aA][rR]/ + private readonly libraryExt = '.jar' + + constructor( + absoluteRoot: string, + relativeRoot: string, + baseUrl: string + ) { + super(absoluteRoot, relativeRoot, 'libraries', baseUrl, Type.Library, (name: string) => { + return name.toLowerCase().endsWith(this.libraryExt) + }) + } + + private attemptCrudeInference(name: string): { name: string, version: string } { + const result = this.crudeRegex.exec(name) + if(result != null) { + return { + name: result[1], + version: result[2] + } + } else { + return { + name: name.substring(0, name.toLowerCase().indexOf(this.libraryExt)), + version: '0.0.0' + } + } + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected async getModuleId(name: string, path: string, stats: Stats, buf: Buffer): Promise { + const inference = this.attemptCrudeInference(name) + return this.generateMavenIdentifier(inference.name, inference.version) + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected async getModuleName(name: string, path: string, stats: Stats, buf: Buffer): Promise { + const inference = this.attemptCrudeInference(name) + return inference.name + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected async getModuleUrl(name: string, path: string, stats: Stats): Promise { + return resolve(this.baseUrl, join(this.relativeRoot, name)) + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected async getModulePath(name: string, path: string, stats: Stats): Promise { + return null + } + +} \ No newline at end of file diff --git a/src/model/struct/model/module/module.struct.ts b/src/model/struct/model/module/module.struct.ts index 233b235..7df446f 100644 --- a/src/model/struct/model/module/module.struct.ts +++ b/src/model/struct/model/module/module.struct.ts @@ -11,7 +11,8 @@ export abstract class ModuleStructure extends BaseModelStructure { relativeRoot: string, structRoot: string, baseUrl: string, - protected type: Type + protected type: Type, + protected filter?: ((name: string, path: string, stats: Stats) => boolean) ) { super(absoluteRoot, relativeRoot, structRoot, baseUrl) } @@ -66,7 +67,10 @@ export abstract class ModuleStructure extends BaseModelStructure { const filePath = resolve(this.containerDirectory, file) const stats = await lstat(filePath) if (stats.isFile()) { - accumulator.push(await this.parseModule(file, filePath, stats)) + if(this.filter == null || this.filter(file, filePath, stats)) { + accumulator.push(await this.parseModule(file, filePath, stats)) + } + } } } diff --git a/src/model/struct/model/server.struct.ts b/src/model/struct/model/server.struct.ts index 7972b90..f20768f 100644 --- a/src/model/struct/model/server.struct.ts +++ b/src/model/struct/model/server.struct.ts @@ -7,6 +7,7 @@ import { ServerMeta } from '../../nebula/servermeta' import { BaseModelStructure } from './basemodel.struct' import { MiscFileStructure } from './module/file.struct' import { LiteModStructure } from './module/litemod.struct' +import { LibraryStructure } from './module/library.struct' export class ServerStructure extends BaseModelStructure { @@ -64,6 +65,9 @@ export class ServerStructure extends BaseModelStructure { await lms.init() } + const libS = new LibraryStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) + await libS.init() + const mfs = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) await mfs.init() @@ -130,8 +134,12 @@ export class ServerStructure extends BaseModelStructure { const fileStruct = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) const fileModules = await fileStruct.getSpecModel() + const libraryStruct = new LibraryStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) + const libraryModules = await libraryStruct.getSpecModel() + const modules = [ forgeItselfModule, + ...libraryModules, ...forgeModModules, ...liteModModules, ...fileModules