From d04fb61f2a06555965dfbc11e215556263078844 Mon Sep 17 00:00:00 2001 From: Daniel Scalzi Date: Tue, 10 Sep 2019 00:59:51 -0400 Subject: [PATCH] Setting up flow for resolvers. Repo structure classes should be responsible for pulling versioned files. Ex. /forge/1.14/ -> get the latest file (or only allow one file). The resolver then gets that file to work with in order to resolve the forge module, pull its libs, and attach them as submodules. --- src/index.ts | 2 +- src/model/resolver/asset.ts | 9 ++++ ...semodel.struct.ts => BaseFileStructure.ts} | 10 ++--- src/model/struct/FileStructure.ts | 5 +++ src/model/struct/model.struct.ts | 7 ---- src/model/struct/model/ModelStructure.ts | 7 ++++ src/model/struct/model/basemodel.struct.ts | 19 +++++++++ .../struct/{ => model}/distribution.struct.ts | 4 +- .../struct/{ => model}/module/file.struct.ts | 4 +- .../{ => model}/module/forgemod.struct.ts | 8 ++-- .../{ => model}/module/litemod.struct.ts | 6 +-- .../{ => model}/module/module.struct.ts | 4 +- src/model/struct/{ => model}/server.struct.ts | 6 +-- src/model/struct/repo/forgerepo.struct.ts | 12 ++++++ src/model/struct/repo/librepo.struct.ts | 12 ++++++ .../struct/repo/liteloaderrepo.struct.ts | 12 ++++++ src/model/struct/repo/repo.struct.ts | 41 +++++++++++++++++++ src/resolver/baseresolver.ts | 13 ++++++ .../forge/adapter/forge18.resolver.ts | 10 +++++ src/resolver/forge/forge.resolver.ts | 33 +++++++++++++++ src/resolver/resolver.ts | 7 ++++ 21 files changed, 200 insertions(+), 31 deletions(-) create mode 100644 src/model/resolver/asset.ts rename src/model/struct/{basemodel.struct.ts => BaseFileStructure.ts} (58%) create mode 100644 src/model/struct/FileStructure.ts delete mode 100644 src/model/struct/model.struct.ts create mode 100644 src/model/struct/model/ModelStructure.ts create mode 100644 src/model/struct/model/basemodel.struct.ts rename src/model/struct/{ => model}/distribution.struct.ts (87%) rename src/model/struct/{ => model}/module/file.struct.ts (89%) rename src/model/struct/{ => model}/module/forgemod.struct.ts (94%) rename src/model/struct/{ => model}/module/litemod.struct.ts (92%) rename src/model/struct/{ => model}/module/module.struct.ts (96%) rename src/model/struct/{ => model}/server.struct.ts (94%) create mode 100644 src/model/struct/repo/forgerepo.struct.ts create mode 100644 src/model/struct/repo/librepo.struct.ts create mode 100644 src/model/struct/repo/liteloaderrepo.struct.ts create mode 100644 src/model/struct/repo/repo.struct.ts create mode 100644 src/resolver/baseresolver.ts create mode 100644 src/resolver/forge/adapter/forge18.resolver.ts create mode 100644 src/resolver/forge/forge.resolver.ts create mode 100644 src/resolver/resolver.ts 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 + +}