diff --git a/src/index.ts b/src/index.ts index 6f3f875..65c48e9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import { writeFile } from 'fs-extra' import { resolve as resolvePath } from 'path' import yargs from 'yargs' -import { DistributionStructure } from './model/struct/distribution.struct' +import { DistributionStructure } from './model/struct/model/distribution.struct' function rootOption(yargs: yargs.Argv) { return yargs.option('root', { diff --git a/src/model/resolver/asset.ts b/src/model/resolver/asset.ts new file mode 100644 index 0000000..ed236cf --- /dev/null +++ b/src/model/resolver/asset.ts @@ -0,0 +1,9 @@ +export interface Asset { + + url: string + path: string + size: number + hashType: string + hash: string + +} diff --git a/src/model/struct/basemodel.struct.ts b/src/model/struct/BaseFileStructure.ts similarity index 58% rename from src/model/struct/basemodel.struct.ts rename to src/model/struct/BaseFileStructure.ts index 81b0874..80042f6 100644 --- a/src/model/struct/basemodel.struct.ts +++ b/src/model/struct/BaseFileStructure.ts @@ -1,17 +1,15 @@ import { mkdirs } from 'fs-extra' import { join, resolve } from 'path' -import { ModelStructure } from './model.struct' +import { FileStructure } from './FileStructure' -export abstract class BaseModelStructure implements ModelStructure { +export abstract class BaseFileStructure implements FileStructure { - protected resolvedModels: T[] | undefined protected containerDirectory: string constructor( protected absoluteRoot: string, protected relativeRoot: string, - protected structRoot: string, - protected baseUrl: string + protected structRoot: string ) { this.relativeRoot = join(relativeRoot, structRoot) this.containerDirectory = resolve(absoluteRoot, structRoot) @@ -21,6 +19,4 @@ export abstract class BaseModelStructure implements ModelStructure { mkdirs(this.containerDirectory) } - public abstract async getSpecModel(): Promise - } diff --git a/src/model/struct/FileStructure.ts b/src/model/struct/FileStructure.ts new file mode 100644 index 0000000..d3c2237 --- /dev/null +++ b/src/model/struct/FileStructure.ts @@ -0,0 +1,5 @@ +export interface FileStructure { + + init(): void + +} diff --git a/src/model/struct/model.struct.ts b/src/model/struct/model.struct.ts deleted file mode 100644 index b86b446..0000000 --- a/src/model/struct/model.struct.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface ModelStructure { - - init(): void - - getSpecModel(): Promise - -} diff --git a/src/model/struct/model/ModelStructure.ts b/src/model/struct/model/ModelStructure.ts new file mode 100644 index 0000000..1f6c32e --- /dev/null +++ b/src/model/struct/model/ModelStructure.ts @@ -0,0 +1,7 @@ +import { FileStructure } from '../FileStructure' + +export interface ModelStructure extends FileStructure { + + getSpecModel(): Promise + +} diff --git a/src/model/struct/model/basemodel.struct.ts b/src/model/struct/model/basemodel.struct.ts new file mode 100644 index 0000000..0f92a7b --- /dev/null +++ b/src/model/struct/model/basemodel.struct.ts @@ -0,0 +1,19 @@ +import { BaseFileStructure } from '../BaseFileStructure' +import { ModelStructure } from './ModelStructure' + +export abstract class BaseModelStructure extends BaseFileStructure implements ModelStructure { + + protected resolvedModels: T[] | undefined + + constructor( + absoluteRoot: string, + relativeRoot: string, + structRoot: string, + protected baseUrl: string + ) { + super(absoluteRoot, relativeRoot, structRoot) + } + + public abstract async getSpecModel(): Promise + +} diff --git a/src/model/struct/distribution.struct.ts b/src/model/struct/model/distribution.struct.ts similarity index 87% rename from src/model/struct/distribution.struct.ts rename to src/model/struct/model/distribution.struct.ts index ef9b652..938bea9 100644 --- a/src/model/struct/distribution.struct.ts +++ b/src/model/struct/model/distribution.struct.ts @@ -1,6 +1,6 @@ import { mkdirs } from 'fs-extra' -import { Distribution } from '../spec/distribution' -import { ModelStructure } from './model.struct' +import { Distribution } from '../../spec/distribution' +import { ModelStructure } from './ModelStructure' import { ServerStructure } from './server.struct' export class DistributionStructure implements ModelStructure { diff --git a/src/model/struct/module/file.struct.ts b/src/model/struct/model/module/file.struct.ts similarity index 89% rename from src/model/struct/module/file.struct.ts rename to src/model/struct/model/module/file.struct.ts index 0d37f21..67e7bf3 100644 --- a/src/model/struct/module/file.struct.ts +++ b/src/model/struct/model/module/file.struct.ts @@ -1,10 +1,10 @@ import { Stats } from 'fs' import { join } from 'path' import { resolve } from 'url' -import { Type } from '../../spec/type' +import { Type } from '../../../spec/type' import { ModuleStructure } from './module.struct' -export class FileStructure extends ModuleStructure { +export class MiscFileStructure extends ModuleStructure { constructor( absoluteRoot: string, diff --git a/src/model/struct/module/forgemod.struct.ts b/src/model/struct/model/module/forgemod.struct.ts similarity index 94% rename from src/model/struct/module/forgemod.struct.ts rename to src/model/struct/model/module/forgemod.struct.ts index fac0eb3..6f40fc2 100644 --- a/src/model/struct/module/forgemod.struct.ts +++ b/src/model/struct/model/module/forgemod.struct.ts @@ -2,10 +2,10 @@ import AdmZip from 'adm-zip' import { Stats } from 'fs-extra' import { join } from 'path' import { resolve } from 'url' -import { capitalize } from '../../../util/stringutils' -import { McModInfo } from '../../forge/mcmodinfo' -import { McModInfoList } from '../../forge/mcmodinfolist' -import { Type } from '../../spec/type' +import { capitalize } from '../../../../util/stringutils' +import { McModInfo } from '../../../forge/mcmodinfo' +import { McModInfoList } from '../../../forge/mcmodinfolist' +import { Type } from '../../../spec/type' import { ModuleStructure } from './module.struct' export class ForgeModStructure extends ModuleStructure { diff --git a/src/model/struct/module/litemod.struct.ts b/src/model/struct/model/module/litemod.struct.ts similarity index 92% rename from src/model/struct/module/litemod.struct.ts rename to src/model/struct/model/module/litemod.struct.ts index 8f7eb72..5550d91 100644 --- a/src/model/struct/module/litemod.struct.ts +++ b/src/model/struct/model/module/litemod.struct.ts @@ -2,9 +2,9 @@ import AdmZip from 'adm-zip' import { Stats } from 'fs-extra' import { join } from 'path' import { resolve } from 'url' -import { capitalize } from '../../../util/stringutils' -import { LiteMod } from '../../liteloader/litemod' -import { Type } from '../../spec/type' +import { capitalize } from '../../../../util/stringutils' +import { LiteMod } from '../../../liteloader/litemod' +import { Type } from '../../../spec/type' import { ModuleStructure } from './module.struct' export class LiteModStructure extends ModuleStructure { diff --git a/src/model/struct/module/module.struct.ts b/src/model/struct/model/module/module.struct.ts similarity index 96% rename from src/model/struct/module/module.struct.ts rename to src/model/struct/model/module/module.struct.ts index 23964fc..b1bd835 100644 --- a/src/model/struct/module/module.struct.ts +++ b/src/model/struct/model/module/module.struct.ts @@ -1,8 +1,8 @@ import { createHash } from 'crypto' import { lstat, pathExists, readdir, readFile, Stats } from 'fs-extra' import { resolve } from 'path' -import { Module } from '../../spec/module' -import { Type, TypeMetadata } from '../../spec/type' +import { Module } from '../../../spec/module' +import { Type, TypeMetadata } from '../../../spec/type' import { BaseModelStructure } from '../basemodel.struct' export abstract class ModuleStructure extends BaseModelStructure { diff --git a/src/model/struct/server.struct.ts b/src/model/struct/model/server.struct.ts similarity index 94% rename from src/model/struct/server.struct.ts rename to src/model/struct/model/server.struct.ts index eec5fa6..4bd8b12 100644 --- a/src/model/struct/server.struct.ts +++ b/src/model/struct/model/server.struct.ts @@ -1,9 +1,9 @@ import { lstat, readdir } from 'fs-extra' import { join, resolve as resolvePath } from 'path' import { resolve as resolveUrl } from 'url' -import { Server } from '../spec/server' +import { Server } from '../../spec/server' import { BaseModelStructure } from './basemodel.struct' -import { FileStructure } from './module/file.struct' +import { MiscFileStructure } from './module/file.struct' import { ForgeModStructure } from './module/forgemod.struct' import { LiteModStructure } from './module/litemod.struct' @@ -63,7 +63,7 @@ export class ServerStructure extends BaseModelStructure { const liteModStruct = new LiteModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) const liteModModules = await liteModStruct.getSpecModel() - const fileStruct = new FileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) + const fileStruct = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) const fileModules = await fileStruct.getSpecModel() const modules = [ diff --git a/src/model/struct/repo/forgerepo.struct.ts b/src/model/struct/repo/forgerepo.struct.ts new file mode 100644 index 0000000..6a86925 --- /dev/null +++ b/src/model/struct/repo/forgerepo.struct.ts @@ -0,0 +1,12 @@ +import { BaseFileStructure } from '../BaseFileStructure' + +export class ForgeRepoStructure extends BaseFileStructure { + + constructor( + absoluteRoot: string, + relativeRoot: string + ) { + super(absoluteRoot, relativeRoot, 'forge') + } + +} diff --git a/src/model/struct/repo/librepo.struct.ts b/src/model/struct/repo/librepo.struct.ts new file mode 100644 index 0000000..f121732 --- /dev/null +++ b/src/model/struct/repo/librepo.struct.ts @@ -0,0 +1,12 @@ +import { BaseFileStructure } from '../BaseFileStructure' + +export class LibRepoStructure extends BaseFileStructure { + + constructor( + absoluteRoot: string, + relativeRoot: string + ) { + super(absoluteRoot, relativeRoot, 'lib') + } + +} diff --git a/src/model/struct/repo/liteloaderrepo.struct.ts b/src/model/struct/repo/liteloaderrepo.struct.ts new file mode 100644 index 0000000..16cb47f --- /dev/null +++ b/src/model/struct/repo/liteloaderrepo.struct.ts @@ -0,0 +1,12 @@ +import { BaseFileStructure } from '../BaseFileStructure' + +export class LiteLoaderRepoStructure extends BaseFileStructure { + + constructor( + absoluteRoot: string, + relativeRoot: string + ) { + super(absoluteRoot, relativeRoot, 'liteloader') + } + +} diff --git a/src/model/struct/repo/repo.struct.ts b/src/model/struct/repo/repo.struct.ts new file mode 100644 index 0000000..0eb528b --- /dev/null +++ b/src/model/struct/repo/repo.struct.ts @@ -0,0 +1,41 @@ +import { BaseFileStructure } from '../BaseFileStructure' +import { ForgeRepoStructure } from './forgerepo.struct' +import { LibRepoStructure } from './librepo.struct' +import { LiteLoaderRepoStructure } from './liteloaderrepo.struct' + +export class RepoStructure extends BaseFileStructure { + + private forgeRepoStruct: ForgeRepoStructure + private liteloaderRepoStruct: LiteLoaderRepoStructure + private libRepoStruct: LibRepoStructure + + constructor( + absoluteRoot: string, + relativeRoot: string + ) { + super(absoluteRoot, relativeRoot, 'repo') + this.forgeRepoStruct = new ForgeRepoStructure(this.containerDirectory, this.relativeRoot) + this.liteloaderRepoStruct = new LiteLoaderRepoStructure(this.containerDirectory, this.relativeRoot) + this.libRepoStruct = new LibRepoStructure(this.containerDirectory, this.relativeRoot) + } + + public async init() { + super.init() + await this.forgeRepoStruct.init() + await this.liteloaderRepoStruct.init() + await this.libRepoStruct.init() + } + + public getForgeRepoStruct() { + return this.forgeRepoStruct + } + + public getLiteLoaderRepoStruct() { + return this.liteloaderRepoStruct + } + + public getLibRepoStruct() { + return this.libRepoStruct + } + +} diff --git a/src/resolver/baseresolver.ts b/src/resolver/baseresolver.ts new file mode 100644 index 0000000..be36a3f --- /dev/null +++ b/src/resolver/baseresolver.ts @@ -0,0 +1,13 @@ +import { Module } from '../model/spec/module' +import { Resolver } from './resolver' + +export abstract class BaseResolver implements Resolver { + + constructor( + protected absoluteRoot: string, + protected relativeRoot: string + ) {} + + public abstract getModule(): Promise + +} diff --git a/src/resolver/forge/adapter/forge18.resolver.ts b/src/resolver/forge/adapter/forge18.resolver.ts new file mode 100644 index 0000000..7f852f7 --- /dev/null +++ b/src/resolver/forge/adapter/forge18.resolver.ts @@ -0,0 +1,10 @@ +import { Module } from '../../../model/spec/module' +import { ForgeResolver } from '../forge.resolver' + +export class Forge18Adapter extends ForgeResolver { + + public async getModule(): Promise { + return null as unknown as Module + } + +} diff --git a/src/resolver/forge/forge.resolver.ts b/src/resolver/forge/forge.resolver.ts new file mode 100644 index 0000000..7ae89b0 --- /dev/null +++ b/src/resolver/forge/forge.resolver.ts @@ -0,0 +1,33 @@ +import { Module } from '../../model/spec/module' +import { RepoStructure } from '../../model/struct/repo/repo.struct' +import { BaseResolver } from '../baseresolver' +import { Forge18Adapter } from './adapter/forge18.resolver' + +export abstract class ForgeResolver extends BaseResolver { + + public static getResolver(version: string) { + return ForgeResolver.ADAPTER_LIST[version] + } + + // tslint:disable: object-literal-key-quotes + private static readonly ADAPTER_LIST: {[version: string]: any} = { + '1.8': Forge18Adapter, + '1.9': Forge18Adapter, + '1.10': Forge18Adapter, + '1.11': Forge18Adapter, + '1.12': Forge18Adapter + } + + protected repoStructure: RepoStructure + + constructor( + absoluteRoot: string, + relativeRoot: string + ) { + super(absoluteRoot, relativeRoot) + this.repoStructure = new RepoStructure(absoluteRoot, relativeRoot) + } + + public abstract getModule(): Promise + +} diff --git a/src/resolver/resolver.ts b/src/resolver/resolver.ts new file mode 100644 index 0000000..56a6be8 --- /dev/null +++ b/src/resolver/resolver.ts @@ -0,0 +1,7 @@ +import { Module } from '../model/spec/module' + +export interface Resolver { + + getModule(): Promise + +}