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.
This commit is contained in:
Daniel Scalzi
2020-05-19 21:52:41 -04:00
parent 43fb84f4a9
commit afcae366b5
6 changed files with 158 additions and 65 deletions

View File

@@ -159,6 +159,7 @@ Ex.
* `TestServer-1.12.2` * `TestServer-1.12.2`
* `files` All modules of type `File`. * `files` All modules of type `File`.
* `libraries` All modules of type `Library`
* `forgemods` All modules of type `ForgeMod`. * `forgemods` All modules of type `ForgeMod`.
* `litemods` All modules of type `LiteMod`. * `litemods` All modules of type `LiteMod`.
* `TestServer-1.12.2.png` Server icon file. * `TestServer-1.12.2.png` Server icon file.

134
package-lock.json generated
View File

@@ -25,9 +25,9 @@
} }
}, },
"@types/adm-zip": { "@types/adm-zip": {
"version": "0.4.32", "version": "0.4.33",
"resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.32.tgz", "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.33.tgz",
"integrity": "sha512-hv1O7ySn+XvP5OeDQcJFWwVb2v+GFGO1A9aMTQ5B/bzxb7WW21O8iRhVdsKKr8QwuiagzGmPP+gsUAYZ6bRddQ==", "integrity": "sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/node": "*" "@types/node": "*"
@@ -45,9 +45,9 @@
"dev": true "dev": true
}, },
"@types/fs-extra": { "@types/fs-extra": {
"version": "8.1.0", "version": "9.0.1",
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.1.tgz",
"integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", "integrity": "sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/node": "*" "@types/node": "*"
@@ -60,15 +60,15 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "12.12.30", "version": "12.12.41",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.30.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.41.tgz",
"integrity": "sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==", "integrity": "sha512-Q+eSkdYQJ2XK1AJnr4Ji8Gvk3sRDybEwfTvtL9CA25FFUSD2EgZQewN6VCyWYZCXg5MWZdwogdTNBhlWRcWS1w==",
"dev": true "dev": true
}, },
"@types/yargs": { "@types/yargs": {
"version": "15.0.4", "version": "15.0.5",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
"integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/yargs-parser": "*" "@types/yargs-parser": "*"
@@ -81,45 +81,56 @@
"dev": true "dev": true
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "2.24.0", "version": "2.34.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz",
"integrity": "sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA==", "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/experimental-utils": "2.24.0", "@typescript-eslint/experimental-utils": "2.34.0",
"eslint-utils": "^1.4.3",
"functional-red-black-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1",
"regexpp": "^3.0.0", "regexpp": "^3.0.0",
"tsutils": "^3.17.1" "tsutils": "^3.17.1"
} }
}, },
"@typescript-eslint/experimental-utils": { "@typescript-eslint/experimental-utils": {
"version": "2.24.0", "version": "2.34.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz",
"integrity": "sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw==", "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.3", "@types/json-schema": "^7.0.3",
"@typescript-eslint/typescript-estree": "2.24.0", "@typescript-eslint/typescript-estree": "2.34.0",
"eslint-scope": "^5.0.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": { "@typescript-eslint/parser": {
"version": "2.24.0", "version": "2.34.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.24.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz",
"integrity": "sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw==", "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/eslint-visitor-keys": "^1.0.0", "@types/eslint-visitor-keys": "^1.0.0",
"@typescript-eslint/experimental-utils": "2.24.0", "@typescript-eslint/experimental-utils": "2.34.0",
"@typescript-eslint/typescript-estree": "2.24.0", "@typescript-eslint/typescript-estree": "2.34.0",
"eslint-visitor-keys": "^1.1.0" "eslint-visitor-keys": "^1.1.0"
} }
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "2.24.0", "version": "2.34.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
"integrity": "sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA==", "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==",
"dev": true, "dev": true,
"requires": { "requires": {
"debug": "^4.1.1", "debug": "^4.1.1",
@@ -127,7 +138,7 @@
"glob": "^7.1.6", "glob": "^7.1.6",
"is-glob": "^4.0.1", "is-glob": "^4.0.1",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"semver": "^6.3.0", "semver": "^7.3.2",
"tsutils": "^3.17.1" "tsutils": "^3.17.1"
}, },
"dependencies": { "dependencies": {
@@ -145,6 +156,12 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true "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==", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
"dev": true "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": { "axios": {
"version": "0.19.2", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
@@ -658,13 +680,14 @@
} }
}, },
"fs-extra": { "fs-extra": {
"version": "8.1.0", "version": "9.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==",
"requires": { "requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0", "graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0", "jsonfile": "^6.0.1",
"universalify": "^0.1.0" "universalify": "^1.0.0"
} }
}, },
"fs.realpath": { "fs.realpath": {
@@ -717,9 +740,9 @@
} }
}, },
"graceful-fs": { "graceful-fs": {
"version": "4.2.3", "version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}, },
"has-flag": { "has-flag": {
"version": "3.0.0", "version": "3.0.0",
@@ -888,11 +911,12 @@
"dev": true "dev": true
}, },
"jsonfile": { "jsonfile": {
"version": "4.0.0", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
"requires": { "requires": {
"graceful-fs": "^4.1.6" "graceful-fs": "^4.1.6",
"universalify": "^1.0.0"
} }
}, },
"levn": { "levn": {
@@ -1076,9 +1100,9 @@
"dev": true "dev": true
}, },
"regexpp": { "regexpp": {
"version": "3.0.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
"integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
"dev": true "dev": true
}, },
"require-directory": { "require-directory": {
@@ -1363,15 +1387,15 @@
"dev": true "dev": true
}, },
"typescript": { "typescript": {
"version": "3.8.3", "version": "3.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz",
"integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==",
"dev": true "dev": true
}, },
"universalify": { "universalify": {
"version": "0.1.2", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug=="
}, },
"uri-js": { "uri-js": {
"version": "4.2.2", "version": "4.2.2",
@@ -1457,9 +1481,9 @@
} }
}, },
"yargs-parser": { "yargs-parser": {
"version": "18.1.1", "version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"requires": { "requires": {
"camelcase": "^5.0.0", "camelcase": "^5.0.0",
"decamelize": "^1.2.0" "decamelize": "^1.2.0"

View File

@@ -26,21 +26,21 @@
}, },
"homepage": "https://github.com/dscalzi/Nebula#readme", "homepage": "https://github.com/dscalzi/Nebula#readme",
"devDependencies": { "devDependencies": {
"@types/adm-zip": "^0.4.32", "@types/adm-zip": "^0.4.33",
"@types/fs-extra": "^8.1.0", "@types/fs-extra": "^9.0.1",
"@types/node": "^12.12.30", "@types/node": "^12.12.41",
"@types/yargs": "^15.0.4", "@types/yargs": "^15.0.5",
"@typescript-eslint/eslint-plugin": "^2.24.0", "@typescript-eslint/eslint-plugin": "^2.34.0",
"@typescript-eslint/parser": "^2.24.0", "@typescript-eslint/parser": "^2.34.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"typescript": "^3.8.3" "typescript": "^3.9.3"
}, },
"dependencies": { "dependencies": {
"adm-zip": "^0.4.14", "adm-zip": "^0.4.14",
"axios": "^0.19.2", "axios": "^0.19.2",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"fs-extra": "^8.1.0", "fs-extra": "^9.0.0",
"toml": "^3.0.0", "toml": "^3.0.0",
"yargs": "^15.3.1", "yargs": "^15.3.1",
"helios-distribution-types": "^1.0.0-pre.1" "helios-distribution-types": "^1.0.0-pre.1"

View File

@@ -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<string> {
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<string> {
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<string> {
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<string | null> {
return null
}
}

View File

@@ -11,7 +11,8 @@ export abstract class ModuleStructure extends BaseModelStructure<Module> {
relativeRoot: string, relativeRoot: string,
structRoot: string, structRoot: string,
baseUrl: string, baseUrl: string,
protected type: Type protected type: Type,
protected filter?: ((name: string, path: string, stats: Stats) => boolean)
) { ) {
super(absoluteRoot, relativeRoot, structRoot, baseUrl) super(absoluteRoot, relativeRoot, structRoot, baseUrl)
} }
@@ -66,7 +67,10 @@ export abstract class ModuleStructure extends BaseModelStructure<Module> {
const filePath = resolve(this.containerDirectory, file) const filePath = resolve(this.containerDirectory, file)
const stats = await lstat(filePath) const stats = await lstat(filePath)
if (stats.isFile()) { 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))
}
} }
} }
} }

View File

@@ -7,6 +7,7 @@ import { ServerMeta } from '../../nebula/servermeta'
import { BaseModelStructure } from './basemodel.struct' import { BaseModelStructure } from './basemodel.struct'
import { MiscFileStructure } from './module/file.struct' import { MiscFileStructure } from './module/file.struct'
import { LiteModStructure } from './module/litemod.struct' import { LiteModStructure } from './module/litemod.struct'
import { LibraryStructure } from './module/library.struct'
export class ServerStructure extends BaseModelStructure<Server> { export class ServerStructure extends BaseModelStructure<Server> {
@@ -64,6 +65,9 @@ export class ServerStructure extends BaseModelStructure<Server> {
await lms.init() await lms.init()
} }
const libS = new LibraryStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
await libS.init()
const mfs = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) const mfs = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
await mfs.init() await mfs.init()
@@ -130,8 +134,12 @@ export class ServerStructure extends BaseModelStructure<Server> {
const fileStruct = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) const fileStruct = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
const fileModules = await fileStruct.getSpecModel() const fileModules = await fileStruct.getSpecModel()
const libraryStruct = new LibraryStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
const libraryModules = await libraryStruct.getSpecModel()
const modules = [ const modules = [
forgeItselfModule, forgeItselfModule,
...libraryModules,
...forgeModModules, ...forgeModModules,
...liteModModules, ...liteModModules,
...fileModules ...fileModules