@zthun/romulator-api 1.4.0 → 1.5.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.
@@ -1,9 +1,9 @@
1
- import { IZDataRequestQuery } from '@zthun/helpful-query';
1
+ import { IZDataRequestQuery, IZPage } from '@zthun/helpful-query';
2
2
  import { IZRomulatorGame } from '@zthun/romulator-client';
3
3
  import { IZRomulatorGamesService } from './games-service.mjs';
4
4
  export declare class ZRomulatorGamesController {
5
5
  private readonly _games;
6
6
  constructor(_games: IZRomulatorGamesService);
7
- list(query: IZDataRequestQuery): Promise<IZRomulatorGame[]>;
7
+ list(query: IZDataRequestQuery): Promise<IZPage<IZRomulatorGame>>;
8
8
  get(identification: string): Promise<IZRomulatorGame>;
9
9
  }
@@ -1,18 +1,18 @@
1
1
  import { IZFileSystemService } from '@zthun/crumbtrail-fs';
2
- import { IZDataRequest } from '@zthun/helpful-query';
2
+ import { IZDataRequest, IZPage } from '@zthun/helpful-query';
3
3
  import { IZLogger } from '@zthun/lumberjacky-log';
4
4
  import { IZRomulatorGame } from '@zthun/romulator-client';
5
5
  import { IZRestfulGet } from '@zthun/webigail-rest';
6
6
  import { IZRomulatorConfigsService } from '../config/configs-service.mjs';
7
7
  export declare const ZRomulatorGamesToken: unique symbol;
8
8
  export interface IZRomulatorGamesService extends IZRestfulGet<IZRomulatorGame> {
9
- list(req: IZDataRequest): Promise<IZRomulatorGame[]>;
9
+ list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>>;
10
10
  }
11
11
  export declare class ZRomulatorGamesService implements IZRomulatorGamesService {
12
12
  private readonly _file;
13
13
  private readonly _config;
14
14
  private readonly _logger;
15
15
  constructor(_file: IZFileSystemService, _config: IZRomulatorConfigsService, logger: IZLogger);
16
- list(req: IZDataRequest): Promise<IZRomulatorGame[]>;
16
+ list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>>;
17
17
  get(id: string): Promise<IZRomulatorGame>;
18
18
  }
package/dist/main.cjs CHANGED
@@ -512,10 +512,11 @@ class ZRomulatorGamesService {
512
512
  const $sort = new helpfulQuery.ZSortBuilder().sorts(helpfulFn.firstDefined([], req.sort)).ascending("system").ascending("name").build();
513
513
  const $request = new helpfulQuery.ZDataRequestBuilder().copy(req).sort($sort).build();
514
514
  const data = await source.retrieve($request);
515
- return data;
515
+ const count = await source.count($request);
516
+ return new helpfulQuery.ZPageBuilder().count(count).data(data).build();
516
517
  }
517
518
  async get(id) {
518
- const games = await this.list(new helpfulQuery.ZDataRequestBuilder().build());
519
+ const { data: games } = await this.list(new helpfulQuery.ZDataRequestBuilder().build());
519
520
  const match = games.find((game)=>game.id === id);
520
521
  if (!match) {
521
522
  throw new common.NotFoundException(`Unable to find game with id, ${id}.`);
package/dist/main.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":["../src/config/config-update.mts","../src/dir/dir.ts","../src/config/config-known.mts","../src/config/configs-service.mts","../src/config/configs-controller.mts","../src/config/configs-module.mts","../src/systems/system-known.mts","../src/games/data-match-game.mts","../src/games/games-service.mts","../src/games/games-controller.mts","../src/games/games-module.mts","../src/media/media-service.mts","../src/media/media-controller.mts","../src/media/media-module.mts","../src/systems/systems-service.mts","../src/systems/systems-controller.mts","../src/systems/systems-module.mts","../src/app/app-module.mts","../src/main.mts"],"sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\nimport { IsDefined, IsNotEmptyObject, IsObject } from \"class-validator\";\n\nexport class ZRomulatorConfigUpdateDto<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n @ApiProperty({ type: \"object\", properties: {} })\n @IsDefined({ message: \"The contents of the config is required\" })\n @IsObject({ message: \"The contents of the config must be an object \" })\n @IsNotEmptyObject()\n contents: T;\n}\n","import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport abstract class ZDir {\n public static application() {\n return resolve(homedir(), \".zthunworks\", \"romulator\");\n }\n\n public static configs() {\n return resolve(ZDir.application(), \"configs\");\n }\n}\n","import {\n ZRomulatorConfigBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n ZRomulatorConfigMediaMetadata,\n} from \"@zthun/romulator-client\";\nimport { resolve } from \"node:path\";\nimport { ZDir } from \"../dir/dir.js\";\n\nexport abstract class ZRomulatorConfigKnown {\n public static all() {\n return [ZRomulatorConfigKnown.games(), ZRomulatorConfigKnown.media()];\n }\n\n private static create(id: ZRomulatorConfigId) {\n const file = resolve(ZDir.configs(), `${id}.json`);\n return new ZRomulatorConfigBuilder().id(id).file(file);\n }\n\n public static games() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Games)\n .name(\"Game Settings\")\n .description(\"Modify where your games are stored and related settings\")\n .avatar(\"gamepad\")\n .metadata(ZRomulatorConfigGamesMetadata.all())\n .build();\n }\n\n public static media() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Media)\n .name(\"Media Settings\")\n .description(\"Modify where media is stored and what media to retrieve\")\n .avatar(\"image\")\n .metadata(ZRomulatorConfigMediaMetadata.all())\n .build();\n }\n}\n","import {\n Inject,\n Injectable,\n InternalServerErrorException,\n NotFoundException,\n} from \"@nestjs/common\";\nimport { createError, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport type { IZLogger } from \"@zthun/lumberjacky-log\";\nimport { ZLogEntryBuilder, ZLoggerContext } from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigBuilder } from \"@zthun/romulator-client\";\nimport type { IZRestfulGet, IZRestfulUpdate } from \"@zthun/webigail-rest\";\nimport { find } from \"lodash-es\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"./config-known.mjs\";\n\nexport const ZRomulatorConfigsToken = Symbol(\"configs\");\n\nexport interface IZRomulatorConfigsService\n extends IZRestfulUpdate<IZRomulatorConfig>,\n IZRestfulGet<IZRomulatorConfig> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>>;\n}\n\n@Injectable()\nexport class ZRomulatorConfigsService implements IZRomulatorConfigsService {\n private _logger: IZLogger;\n\n public constructor(@Inject(ZLoggerToken) _logger: IZLogger) {\n this._logger = new ZLoggerContext(\"ZRomulatorConfigsService\", _logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving configs page, ${page}, with size, ${size}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const configs = ZRomulatorConfigKnown.all();\n const options = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic<IZRomulatorConfig>(configs, options);\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n msg = `Responding with ${data.length} configs out of ${count} total`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return new ZPageBuilder<IZRomulatorConfig>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get<T>(\n id: ZRomulatorConfigId,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this._find(id);\n let msg = `Attempting to read the file contents for config, ${id}.`;\n let contents: any = {};\n\n try {\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const buffer = await readFile(config.file);\n const json = buffer.toString(\"utf-8\");\n contents = JSON.parse(json);\n msg = `Finished reading config contents (${buffer.byteLength} bytes)`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n } catch (e) {\n msg = createError(e).message;\n this._logger.log(new ZLogEntryBuilder().warning().message(msg).build());\n }\n\n const result = new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(contents)\n .build();\n\n return Promise.resolve(result as Required<IZRomulatorConfig<T>>);\n }\n\n public async update<T>(\n id: ZRomulatorConfigId,\n record: Pick<IZRomulatorConfig, \"contents\">,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this.get<T>(id);\n\n let msg = `Updating config file, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const next = { ...config.contents, ...record.contents };\n const json = JSON.stringify(next);\n\n try {\n await mkdir(dirname(config.file), { recursive: true });\n await writeFile(config.file, json);\n return new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(next)\n .build() as Required<IZRomulatorConfig<T>>;\n } catch (e) {\n const error = createError(e);\n msg = `Unable to write to, ${config.file}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n msg = error.message;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new InternalServerErrorException(error));\n }\n }\n\n private async _find(id: ZRomulatorConfigId): Promise<IZRomulatorConfig> {\n let msg = `Attempting to retrieve config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const configs = ZRomulatorConfigKnown.all();\n const config = find(configs, (c) => c.id === id);\n\n if (config == null) {\n msg = `Could not find config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new NotFoundException(msg));\n }\n\n msg = `Config, ${id}, found`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return config;\n }\n}\n","import {\n Body,\n Controller,\n Get,\n Inject,\n Param,\n Patch,\n Query,\n UsePipes,\n ValidationPipe,\n} from \"@nestjs/common\";\nimport { ApiBody, ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigUpdateDto } from \"./config-update.mjs\";\nimport type { IZRomulatorConfigsService } from \"./configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"./configs-service.mjs\";\n\n@Controller(\"configs\")\nexport class ZRomulatorConfigsController {\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n ) {}\n\n @Get()\n public async list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorConfig>> {\n const request = new ZDataRequestBuilder().query(query).build();\n return this._configs.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @ApiBody({\n type: ZRomulatorConfigUpdateDto,\n })\n @Patch(\":identification\")\n @UsePipes(\n new ValidationPipe({\n transform: true,\n whitelist: true,\n skipMissingProperties: false,\n skipNullProperties: false,\n skipUndefinedProperties: false,\n }),\n )\n public async update(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n @Body() payload: ZRomulatorConfigUpdateDto,\n ): Promise<IZRomulatorConfig> {\n return this._configs.update(identification, payload);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n ): Promise<IZRomulatorConfig> {\n return await this._configs.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsController } from \"./configs-controller.mjs\";\nimport {\n ZRomulatorConfigsService,\n ZRomulatorConfigsToken,\n} from \"./configs-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorConfigsController],\n providers: [\n { provide: ZRomulatorConfigsToken, useClass: ZRomulatorConfigsService },\n ],\n exports: [ZRomulatorConfigsToken],\n})\nexport class ZRomulatorConfigsModule {}\n","import { isTagged, ZTag } from \"@zthun/helpful-reflection\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorSystemBuilder,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport \"reflect-metadata\";\n\nconst KnownSystem = \"@zthunworks/romulator/known-system\";\n\n/**\n * A helper factory class for creating supported systems.\n */\nexport abstract class ZRomulatorSystemKnown {\n /**\n * Returns all known systems.\n *\n * @returns\n * All supported systems.\n */\n public static all() {\n const properties = Object.getOwnPropertyNames(ZRomulatorSystemKnown);\n const methods = properties\n .filter((p) => isTagged(KnownSystem, ZRomulatorSystemKnown, p))\n .map((p) => ZRomulatorSystemKnown[p])\n .map((f) => f as () => IZRomulatorSystem);\n return methods.map((m) => m.call(null));\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Entertainment System (NES).\n *\n * @returns\n * A {@link ZRomulatorSystemBuilder} instance that has\n * built the nes.\n */\n @ZTag(KnownSystem)\n public static nes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo)\n .console()\n .name(\"Nintendo Entertainment System\")\n .alias(\"Famicom\")\n .alias(\"NES\")\n .alias(\"Hyundai Comboy\")\n .alias(\"Samurai Electronic TV Game System\")\n .alias(\"Dendy\")\n .generation(3)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Super\n * Nintendo Entertainment System (SNES).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static snes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.SuperNintendo)\n .console()\n .name(\"Super Nintendo Entertainment System\")\n .alias(\"Super Nintendo\")\n .alias(\"Super Famicom\")\n .alias(\"SNES\")\n .alias(\"Super NES\")\n .alias(\"Super Comboy\")\n .generation(4)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * 64 (N64).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static n64() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo64)\n .console()\n .name(\"Nintendo 64\")\n .alias(\"N64\")\n .alias(\"Ultra 64\")\n .alias(\"Hyundai Comboy 64\")\n .generation(5)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * GameCube (GC).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static gc() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.GameCube)\n .console()\n .name(\"Nintendo GameCube\")\n .alias(\"GameCube\")\n .alias(\"Dolphin\")\n .generation(6)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii (Wii).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wii() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Wii)\n .console()\n .name(\"Nintendo Wii\")\n .alias(\"Wii\")\n .alias(\"Revolution\")\n .generation(7)\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii U (WiiU).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wiiu() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.WiiU)\n .console()\n .name(\"Nintendo Wii U\")\n .alias(\"WiiU\")\n .alias(\"Project Cafe\")\n .generation(8)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Mitsumi\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Switch (Switch).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static switch() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Switch)\n .console()\n .name(\"Nintendo Switch\")\n .alias(\"Switch\")\n .alias(\"NX\")\n .alias(\"HAC\")\n .alias(\"Odin\")\n .generation(9)\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Hosiden\")\n .build();\n }\n\n /**\n * Creates a system from an id slug.\n *\n * @param id -\n * The id slug of the system to create.\n *\n * @return\n * The system, or null if the id is not known.\n */\n public static from(id: string): IZRomulatorSystem | null {\n if (isTagged(KnownSystem, ZRomulatorSystemKnown, id)) {\n return ZRomulatorSystemKnown[id]();\n }\n\n return null;\n }\n}\n","import { firstTruthy } from \"@zthun/helpful-fn\";\nimport type { IZDataMatch } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\n/**\n * A data match function which matches a string (search) filter\n * to a game's name, system slug, or system name.\n */\nexport class ZRomulatorDataMatchGame\n implements IZDataMatch<IZRomulatorGame, string>\n{\n public match(data: IZRomulatorGame, filter: string): boolean {\n const needle = filter?.trim().toLowerCase();\n const { name = \"\", system = \"\" } = data;\n const target = ZRomulatorSystemKnown.from(system);\n const systemName = firstTruthy(\"\", target?.name);\n\n if (!needle?.length) {\n return true;\n }\n\n return [name, system, systemName]\n .filter((s) => s.length)\n .some((k) => k.toLowerCase().includes(needle));\n }\n}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorGame,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorGameBuilder,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { kebabCase } from \"lodash-es\";\nimport { basename, dirname, parse } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\nimport { ZRomulatorDataMatchGame } from \"./data-match-game.mjs\";\n\nexport const ZRomulatorGamesToken = Symbol(\"romulator-games-service\");\n\nexport interface IZRomulatorGamesService extends IZRestfulGet<IZRomulatorGame> {\n list(req: IZDataRequest): Promise<IZRomulatorGame[]>;\n}\n\n@Injectable()\nexport class ZRomulatorGamesService implements IZRomulatorGamesService {\n private readonly _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorGamesService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZRomulatorGame[]> {\n const config = ZRomulatorConfigKnown.games();\n const { contents } = await this._config.get(config.id);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n\n const cwd = detokenize(firstDefined(fallback, gamesFolder), process.env);\n const time = new Date();\n\n let msg = `Searching for games in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const systems = ZRomulatorSystemKnown.all().map((system) => system.id);\n const glob = `{${systems.join(\",\")}}/**/*.zip`;\n const nodes = await this._file.search(glob, { cwd, stat: false });\n const span = new Date().getTime() - time.getTime();\n\n msg = `Found ${nodes.length} games. Search took ${span} milliseconds.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const games = nodes.map(({ path }) => {\n const dir = basename(dirname(path)) as ZRomulatorSystemId;\n const { name: file } = parse(path);\n const id = `${dir}-${kebabCase(file)}`;\n\n return new ZRomulatorGameBuilder()\n .id(id)\n .system(dir)\n .file(path)\n .name(file)\n .build();\n });\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorGame>()\n .search(new ZRomulatorDataMatchGame())\n .build();\n const source = new ZDataSourceStatic(games, options);\n\n const $sort = new ZSortBuilder()\n .sorts(firstDefined([], req.sort))\n .ascending(\"system\")\n .ascending(\"name\")\n .build();\n const $request = new ZDataRequestBuilder().copy(req).sort($sort).build();\n const data = await source.retrieve($request);\n\n return data;\n }\n\n public async get(id: string): Promise<IZRomulatorGame> {\n const games = await this.list(new ZDataRequestBuilder().build());\n const match = games.find((game) => game.id === id);\n\n if (!match) {\n throw new NotFoundException(`Unable to find game with id, ${id}.`);\n }\n\n return match;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport type { IZDataRequestQuery } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport type { IZRomulatorGamesService } from \"./games-service.mjs\";\nimport { ZRomulatorGamesToken } from \"./games-service.mjs\";\n\n@Controller(\"games\")\nexport class ZRomulatorGamesController {\n public constructor(\n @Inject(ZRomulatorGamesToken)\n private readonly _games: IZRomulatorGamesService,\n ) {}\n\n @Get()\n public list(@Query() query: IZDataRequestQuery): Promise<IZRomulatorGame[]> {\n return this._games.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._games.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesController } from \"./games-controller.mjs\";\nimport {\n ZRomulatorGamesService,\n ZRomulatorGamesToken,\n} from \"./games-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorGamesController],\n providers: [\n {\n provide: ZRomulatorGamesToken,\n useClass: ZRomulatorGamesService,\n },\n ],\n})\nexport class ZRomulatorGamesModule {}\n","import {\n ForbiddenException,\n Inject,\n Injectable,\n NotAcceptableException,\n NotFoundException,\n StreamableFile,\n} from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport {\n createError,\n detokenize,\n firstDefined,\n firstTruthy,\n} from \"@zthun/helpful-fn\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n type IZDataRequest,\n type IZPage,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport {\n ZRomulatorConfigMediaBuilder,\n ZRomulatorMediaBuilder,\n type IZRomulatorMedia,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulDelete, IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { ZMimeTypeApplication } from \"@zthun/webigail-url\";\nimport { findIndex } from \"lodash-es\";\nimport { lookup } from \"mime-types\";\nimport { createReadStream } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport { env } from \"node:process\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\nexport const ZRomulatorMediaToken = Symbol(\"romulator-media-service\");\n\nexport interface IZRomulatorMediaService\n extends IZRestfulGet<IZRomulatorMedia>,\n IZRestfulDelete {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>>;\n download(id: string, accept: string): Promise<StreamableFile>;\n}\n\n@Injectable()\nexport class ZRomulatorMediaService implements IZRomulatorMediaService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken) private _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken) private _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorMediaService\", logger);\n }\n\n private async getMediaFolder(): Promise<string> {\n const mediaConfig = ZRomulatorConfigKnown.media();\n const { contents } = await this._config.get(mediaConfig.id);\n const { mediaFolder } = new ZRomulatorConfigMediaBuilder()\n .copy(contents)\n .build();\n\n return detokenize(mediaFolder, env);\n }\n\n private async findAllMedia(cwd: string): Promise<IZRomulatorMedia[]> {\n const systems = ZRomulatorSystemKnown.all()\n .map((s) => s.id)\n .join(\",\");\n const glob = `{${systems}}/**`;\n\n const files = await this._file.search(glob, { cwd, stat: false });\n\n return files\n .map((f) => new ZRomulatorMediaBuilder().from(f.path).build())\n .filter((media) => !!media.id);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>> {\n const cwd = await this.getMediaFolder();\n\n let msg = `Reading all media from ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const time = new Date();\n const mediaList = await this.findAllMedia(cwd);\n const span = new Date().getTime() - time.getTime();\n msg = `Found ${mediaList.length} media files. Search took ${span} milliseconds`;\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorMedia>()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic(mediaList, options);\n const page = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorMedia>().data(page).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorMedia> {\n const cwd = await this.getMediaFolder();\n\n const time = new Date();\n let log = `Searching for media with id ${id}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const mediaList = await this.findAllMedia(cwd);\n const index = findIndex(mediaList, (m) => m.id === id);\n const span = new Date().getTime() - time.getTime();\n\n if (index < 0) {\n const msg = `Could not find any media with id, ${id}.`;\n log = `${msg} Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().warning().message(log).build());\n throw new NotFoundException(msg);\n }\n\n const media = mediaList[index];\n log = `Found media, ${media.url} after ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return media;\n }\n\n public async download(id: string, accept: string): Promise<StreamableFile> {\n let log = `Download request received for ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const fallback = ZMimeTypeApplication.OctetStream;\n const { fileName, url } = await this.get(id);\n const lookupResult = lookup(firstDefined(\"\", fileName));\n const mime = firstTruthy(fallback, lookupResult) as string;\n const accepts = accept.split(\",\").map((h) => h.split(\";\")[0].trim());\n\n const acceptable = accepts.some((a) => {\n if (a === \"*/*\") {\n return true;\n }\n if (a.endsWith(\"/*\")) {\n return mime.startsWith(a.slice(0, -1));\n }\n return a === mime;\n });\n\n if (!acceptable) {\n const msg =\n `The media requested is of type ${mime}. ` +\n `The request only accepts ${accept}.`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n throw new NotAcceptableException(msg);\n }\n\n log = `Streaming ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return new StreamableFile(createReadStream(firstDefined(\"\", url)), {\n type: mime,\n disposition: `inline; filename=${fileName}`,\n });\n }\n\n public async delete(id: string): Promise<void> {\n const { url } = await this.get(id);\n const _url = firstDefined(\"\", url);\n\n let log = `Attempting to delete file ${_url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n try {\n await unlink(_url);\n } catch (err) {\n const { message } = createError(err);\n this._logger.log(new ZLogEntryBuilder().error().message(message).build());\n throw new ForbiddenException(message);\n }\n\n log = `Deleted ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n }\n}\n","import {\n Controller,\n Delete,\n Get,\n Inject,\n Param,\n Query,\n Req,\n} from \"@nestjs/common\";\nimport { ApiParam, ApiResponse } from \"@nestjs/swagger\";\nimport {\n ZDataRequestBuilder,\n type IZDataRequestQuery,\n} from \"@zthun/helpful-query\";\nimport { ZHttpCodeClient, ZHttpCodeSuccess } from \"@zthun/webigail-http\";\nimport type { Request } from \"express\";\nimport type { IZRomulatorMediaService } from \"./media-service.mjs\";\nimport { ZRomulatorMediaToken } from \"./media-service.mjs\";\n\n@Controller(\"media\")\nexport class ZRomulatorMediaController {\n public constructor(\n @Inject(ZRomulatorMediaToken)\n private _media: IZRomulatorMediaService,\n ) {}\n\n @Get()\n public list(@Query() params: IZDataRequestQuery) {\n const request = new ZDataRequestBuilder().query(params).build();\n return this._media.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the media\",\n content: {\n \"*/*\": {},\n \"image/*\": {},\n \"image/png\": {},\n \"image/jpeg\": {},\n \"application/mp4\": {},\n \"application/json\": {},\n },\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotFound,\n description: \"Media not found\",\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotAcceptable,\n description: \"Unsupported Accept header\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: string,\n @Req() req: Request,\n ) {\n const { accept = \"*/*\" } = req.headers;\n\n return accept.includes(\"application/json\")\n ? this._media.get(identification)\n : this._media.download(identification, accept);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @Delete(\":identification\")\n public async delete(@Param(\"identification\") identification: string) {\n await this._media.delete(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorMediaController } from \"./media-controller.mjs\";\nimport {\n ZRomulatorMediaService,\n ZRomulatorMediaToken,\n} from \"./media-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZRomulatorConfigsModule, ZLoggerModule],\n controllers: [ZRomulatorMediaController],\n providers: [\n { provide: ZRomulatorMediaToken, useClass: ZRomulatorMediaService },\n ],\n})\nexport class ZRomulatorMediaModule {}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { find } from \"lodash-es\";\nimport { basename } from \"node:path\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"./system-known.mjs\";\n\nexport const ZRomulatorSystemsToken = Symbol(\"romulator-systems-service\");\n\nexport interface IZRomulatorSystemsService {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>>;\n get(id: string): Promise<IZRomulatorSystem>;\n}\n\n@Injectable()\nexport class ZRomulatorSystemsService implements IZRomulatorSystemsService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) readonly logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorSystemsService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving systems page, ${page}, with size, ${size}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const { contents } = await this._configs.get(ZRomulatorConfigId.Games);\n const { gamesFolder } = contents;\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n const _folder = firstDefined(fallback, gamesFolder);\n\n const cwd = detokenize(_folder, process.env);\n msg = `Looking for systems in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const searchOptions = { cwd };\n const folders = await this._file.search(\"*/\", searchOptions);\n\n const systems = folders\n .map((folder) => folder.path)\n .map((path) => basename(path))\n .map((slug) => ZRomulatorSystemKnown.from(slug))\n .filter((system) => system != null);\n\n msg = `Found ${systems.length} systems`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const sourceOptions = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields([\"id\", \"name\", \"short\"]))\n .build();\n\n const source = new ZDataSourceStatic<IZRomulatorSystem>(\n systems,\n sourceOptions,\n );\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorSystem>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get(id: string): Promise<IZRomulatorSystem> {\n const all = await this.list(new ZDataRequestBuilder().build());\n const system = find(all.data, (system) => system.id === id);\n\n if (!system) {\n throw new NotFoundException(`Unable to find system with id, ${id}.`);\n }\n\n return system;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport { ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport type { IZRomulatorSystemsService } from \"./systems-service.mjs\";\nimport { ZRomulatorSystemsToken } from \"./systems-service.mjs\";\n\n@Controller(\"systems\")\nexport class ZRomulatorSystemsController {\n public constructor(\n @Inject(ZRomulatorSystemsToken)\n private readonly _systems: IZRomulatorSystemsService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorSystem>> {\n return this._systems.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the system\",\n })\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._systems.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorSystemsController } from \"./systems-controller.mjs\";\nimport {\n ZRomulatorSystemsService,\n ZRomulatorSystemsToken,\n} from \"./systems-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorSystemsController],\n providers: [\n { provide: ZRomulatorSystemsToken, useClass: ZRomulatorSystemsService },\n ],\n})\nexport class ZRomulatorSystemsModule {}\n","/* istanbul ignore file -- @preserve */\nimport { Module } from \"@nestjs/common\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesModule } from \"../games/games-module.mjs\";\nimport { ZRomulatorMediaModule } from \"../media/media-module.mjs\";\nimport { ZRomulatorSystemsModule } from \"../systems/systems-module.mjs\";\n\n@Module({\n imports: [\n ZRomulatorSystemsModule,\n ZRomulatorConfigsModule,\n ZRomulatorMediaModule,\n ZRomulatorGamesModule,\n ],\n})\nexport class ZRomulatorModule {}\n","import { NestFactory } from \"@nestjs/core\";\nimport { DocumentBuilder, SwaggerModule } from \"@nestjs/swagger\";\nimport { ZRomulatorModule } from \"./app/app-module.mjs\";\n\nconst PORT = 3000;\n\n(async function () {\n const app = await NestFactory.create(ZRomulatorModule);\n app.setGlobalPrefix(\"api\");\n app.enableCors();\n\n const config = new DocumentBuilder()\n .setTitle(\"Romulator API\")\n .setDescription(\"The Romulator API\")\n .setVersion(\"1\")\n .build();\n\n const document = () => SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n await app.listen(PORT);\n})();\n"],"names":["ZRomulatorConfigUpdateDto","contents","type","properties","message","ZDir","application","resolve","homedir","configs","ZRomulatorConfigKnown","all","games","media","create","id","file","ZRomulatorConfigBuilder","ZRomulatorConfigId","Games","name","description","avatar","metadata","ZRomulatorConfigGamesMetadata","build","Media","ZRomulatorConfigMediaMetadata","ZRomulatorConfigsToken","Symbol","ZRomulatorConfigsService","_logger","ZLoggerContext","list","req","page","firstDefined","size","Infinity","msg","log","ZLogEntryBuilder","info","options","ZDataSourceStaticOptionsBuilder","search","ZDataSearchFields","source","ZDataSourceStatic","data","retrieve","count","length","ZPageBuilder","get","config","_find","buffer","readFile","json","toString","JSON","parse","byteLength","e","createError","warning","result","copy","Promise","update","record","next","stringify","mkdir","dirname","recursive","writeFile","error","reject","InternalServerErrorException","find","c","NotFoundException","ZRomulatorConfigsController","_configs","request","ZDataRequestBuilder","query","payload","identification","ValidationPipe","transform","whitelist","skipMissingProperties","skipNullProperties","skipUndefinedProperties","ZRomulatorConfigsModule","imports","ZFileSystemModule","ZLoggerModule","controllers","providers","provide","useClass","exports","KnownSystem","ZRomulatorSystemKnown","Object","getOwnPropertyNames","methods","filter","p","isTagged","map","f","m","call","nes","ZRomulatorSystemBuilder","ZRomulatorSystemId","Nintendo","console","alias","generation","manufacturer","snes","SuperNintendo","n64","Nintendo64","gc","GameCube","wii","Wii","wiiu","WiiU","switch","Switch","from","ZRomulatorDataMatchGame","match","needle","trim","toLowerCase","system","target","systemName","firstTruthy","s","some","k","includes","ZRomulatorGamesToken","ZRomulatorGamesService","_file","_config","logger","gamesFolder","ZRomulatorConfigGamesBuilder","fallback","cwd","detokenize","process","env","time","Date","systems","glob","join","nodes","stat","span","getTime","path","dir","basename","kebabCase","ZRomulatorGameBuilder","$sort","ZSortBuilder","sorts","sort","ascending","$request","game","ZRomulatorGamesController","_games","ZRomulatorGamesModule","ZRomulatorMediaToken","ZRomulatorMediaService","getMediaFolder","mediaConfig","mediaFolder","ZRomulatorConfigMediaBuilder","findAllMedia","files","ZRomulatorMediaBuilder","mediaList","index","findIndex","url","download","accept","ZMimeTypeApplication","OctetStream","fileName","lookupResult","lookup","mime","accepts","split","h","acceptable","a","endsWith","startsWith","slice","NotAcceptableException","StreamableFile","createReadStream","disposition","delete","_url","unlink","err","ForbiddenException","ZRomulatorMediaController","_media","params","headers","status","ZHttpCodeSuccess","OK","content","ZHttpCodeClient","NotFound","NotAcceptable","ZRomulatorMediaModule","ZRomulatorSystemsToken","ZRomulatorSystemsService","_folder","searchOptions","folders","folder","slug","sourceOptions","ZRomulatorSystemsController","_systems","ZRomulatorSystemsModule","ZRomulatorModule","PORT","app","NestFactory","setGlobalPrefix","enableCors","DocumentBuilder","setTitle","setDescription","setVersion","document","SwaggerModule","createDocument","setup","listen"],"mappings":"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"}
1
+ {"version":3,"file":"main.cjs","sources":["../src/config/config-update.mts","../src/dir/dir.ts","../src/config/config-known.mts","../src/config/configs-service.mts","../src/config/configs-controller.mts","../src/config/configs-module.mts","../src/systems/system-known.mts","../src/games/data-match-game.mts","../src/games/games-service.mts","../src/games/games-controller.mts","../src/games/games-module.mts","../src/media/media-service.mts","../src/media/media-controller.mts","../src/media/media-module.mts","../src/systems/systems-service.mts","../src/systems/systems-controller.mts","../src/systems/systems-module.mts","../src/app/app-module.mts","../src/main.mts"],"sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\nimport { IsDefined, IsNotEmptyObject, IsObject } from \"class-validator\";\n\nexport class ZRomulatorConfigUpdateDto<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n @ApiProperty({ type: \"object\", properties: {} })\n @IsDefined({ message: \"The contents of the config is required\" })\n @IsObject({ message: \"The contents of the config must be an object \" })\n @IsNotEmptyObject()\n contents: T;\n}\n","import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport abstract class ZDir {\n public static application() {\n return resolve(homedir(), \".zthunworks\", \"romulator\");\n }\n\n public static configs() {\n return resolve(ZDir.application(), \"configs\");\n }\n}\n","import {\n ZRomulatorConfigBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n ZRomulatorConfigMediaMetadata,\n} from \"@zthun/romulator-client\";\nimport { resolve } from \"node:path\";\nimport { ZDir } from \"../dir/dir.js\";\n\nexport abstract class ZRomulatorConfigKnown {\n public static all() {\n return [ZRomulatorConfigKnown.games(), ZRomulatorConfigKnown.media()];\n }\n\n private static create(id: ZRomulatorConfigId) {\n const file = resolve(ZDir.configs(), `${id}.json`);\n return new ZRomulatorConfigBuilder().id(id).file(file);\n }\n\n public static games() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Games)\n .name(\"Game Settings\")\n .description(\"Modify where your games are stored and related settings\")\n .avatar(\"gamepad\")\n .metadata(ZRomulatorConfigGamesMetadata.all())\n .build();\n }\n\n public static media() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Media)\n .name(\"Media Settings\")\n .description(\"Modify where media is stored and what media to retrieve\")\n .avatar(\"image\")\n .metadata(ZRomulatorConfigMediaMetadata.all())\n .build();\n }\n}\n","import {\n Inject,\n Injectable,\n InternalServerErrorException,\n NotFoundException,\n} from \"@nestjs/common\";\nimport { createError, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport type { IZLogger } from \"@zthun/lumberjacky-log\";\nimport { ZLogEntryBuilder, ZLoggerContext } from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigBuilder } from \"@zthun/romulator-client\";\nimport type { IZRestfulGet, IZRestfulUpdate } from \"@zthun/webigail-rest\";\nimport { find } from \"lodash-es\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"./config-known.mjs\";\n\nexport const ZRomulatorConfigsToken = Symbol(\"configs\");\n\nexport interface IZRomulatorConfigsService\n extends IZRestfulUpdate<IZRomulatorConfig>,\n IZRestfulGet<IZRomulatorConfig> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>>;\n}\n\n@Injectable()\nexport class ZRomulatorConfigsService implements IZRomulatorConfigsService {\n private _logger: IZLogger;\n\n public constructor(@Inject(ZLoggerToken) _logger: IZLogger) {\n this._logger = new ZLoggerContext(\"ZRomulatorConfigsService\", _logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving configs page, ${page}, with size, ${size}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const configs = ZRomulatorConfigKnown.all();\n const options = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic<IZRomulatorConfig>(configs, options);\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n msg = `Responding with ${data.length} configs out of ${count} total`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return new ZPageBuilder<IZRomulatorConfig>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get<T>(\n id: ZRomulatorConfigId,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this._find(id);\n let msg = `Attempting to read the file contents for config, ${id}.`;\n let contents: any = {};\n\n try {\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const buffer = await readFile(config.file);\n const json = buffer.toString(\"utf-8\");\n contents = JSON.parse(json);\n msg = `Finished reading config contents (${buffer.byteLength} bytes)`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n } catch (e) {\n msg = createError(e).message;\n this._logger.log(new ZLogEntryBuilder().warning().message(msg).build());\n }\n\n const result = new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(contents)\n .build();\n\n return Promise.resolve(result as Required<IZRomulatorConfig<T>>);\n }\n\n public async update<T>(\n id: ZRomulatorConfigId,\n record: Pick<IZRomulatorConfig, \"contents\">,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this.get<T>(id);\n\n let msg = `Updating config file, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const next = { ...config.contents, ...record.contents };\n const json = JSON.stringify(next);\n\n try {\n await mkdir(dirname(config.file), { recursive: true });\n await writeFile(config.file, json);\n return new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(next)\n .build() as Required<IZRomulatorConfig<T>>;\n } catch (e) {\n const error = createError(e);\n msg = `Unable to write to, ${config.file}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n msg = error.message;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new InternalServerErrorException(error));\n }\n }\n\n private async _find(id: ZRomulatorConfigId): Promise<IZRomulatorConfig> {\n let msg = `Attempting to retrieve config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const configs = ZRomulatorConfigKnown.all();\n const config = find(configs, (c) => c.id === id);\n\n if (config == null) {\n msg = `Could not find config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new NotFoundException(msg));\n }\n\n msg = `Config, ${id}, found`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return config;\n }\n}\n","import {\n Body,\n Controller,\n Get,\n Inject,\n Param,\n Patch,\n Query,\n UsePipes,\n ValidationPipe,\n} from \"@nestjs/common\";\nimport { ApiBody, ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigUpdateDto } from \"./config-update.mjs\";\nimport type { IZRomulatorConfigsService } from \"./configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"./configs-service.mjs\";\n\n@Controller(\"configs\")\nexport class ZRomulatorConfigsController {\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n ) {}\n\n @Get()\n public async list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorConfig>> {\n const request = new ZDataRequestBuilder().query(query).build();\n return this._configs.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @ApiBody({\n type: ZRomulatorConfigUpdateDto,\n })\n @Patch(\":identification\")\n @UsePipes(\n new ValidationPipe({\n transform: true,\n whitelist: true,\n skipMissingProperties: false,\n skipNullProperties: false,\n skipUndefinedProperties: false,\n }),\n )\n public async update(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n @Body() payload: ZRomulatorConfigUpdateDto,\n ): Promise<IZRomulatorConfig> {\n return this._configs.update(identification, payload);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n ): Promise<IZRomulatorConfig> {\n return await this._configs.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsController } from \"./configs-controller.mjs\";\nimport {\n ZRomulatorConfigsService,\n ZRomulatorConfigsToken,\n} from \"./configs-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorConfigsController],\n providers: [\n { provide: ZRomulatorConfigsToken, useClass: ZRomulatorConfigsService },\n ],\n exports: [ZRomulatorConfigsToken],\n})\nexport class ZRomulatorConfigsModule {}\n","import { isTagged, ZTag } from \"@zthun/helpful-reflection\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorSystemBuilder,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport \"reflect-metadata\";\n\nconst KnownSystem = \"@zthunworks/romulator/known-system\";\n\n/**\n * A helper factory class for creating supported systems.\n */\nexport abstract class ZRomulatorSystemKnown {\n /**\n * Returns all known systems.\n *\n * @returns\n * All supported systems.\n */\n public static all() {\n const properties = Object.getOwnPropertyNames(ZRomulatorSystemKnown);\n const methods = properties\n .filter((p) => isTagged(KnownSystem, ZRomulatorSystemKnown, p))\n .map((p) => ZRomulatorSystemKnown[p])\n .map((f) => f as () => IZRomulatorSystem);\n return methods.map((m) => m.call(null));\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Entertainment System (NES).\n *\n * @returns\n * A {@link ZRomulatorSystemBuilder} instance that has\n * built the nes.\n */\n @ZTag(KnownSystem)\n public static nes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo)\n .console()\n .name(\"Nintendo Entertainment System\")\n .alias(\"Famicom\")\n .alias(\"NES\")\n .alias(\"Hyundai Comboy\")\n .alias(\"Samurai Electronic TV Game System\")\n .alias(\"Dendy\")\n .generation(3)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Super\n * Nintendo Entertainment System (SNES).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static snes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.SuperNintendo)\n .console()\n .name(\"Super Nintendo Entertainment System\")\n .alias(\"Super Nintendo\")\n .alias(\"Super Famicom\")\n .alias(\"SNES\")\n .alias(\"Super NES\")\n .alias(\"Super Comboy\")\n .generation(4)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * 64 (N64).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static n64() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo64)\n .console()\n .name(\"Nintendo 64\")\n .alias(\"N64\")\n .alias(\"Ultra 64\")\n .alias(\"Hyundai Comboy 64\")\n .generation(5)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * GameCube (GC).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static gc() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.GameCube)\n .console()\n .name(\"Nintendo GameCube\")\n .alias(\"GameCube\")\n .alias(\"Dolphin\")\n .generation(6)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii (Wii).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wii() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Wii)\n .console()\n .name(\"Nintendo Wii\")\n .alias(\"Wii\")\n .alias(\"Revolution\")\n .generation(7)\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii U (WiiU).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wiiu() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.WiiU)\n .console()\n .name(\"Nintendo Wii U\")\n .alias(\"WiiU\")\n .alias(\"Project Cafe\")\n .generation(8)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Mitsumi\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Switch (Switch).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static switch() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Switch)\n .console()\n .name(\"Nintendo Switch\")\n .alias(\"Switch\")\n .alias(\"NX\")\n .alias(\"HAC\")\n .alias(\"Odin\")\n .generation(9)\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Hosiden\")\n .build();\n }\n\n /**\n * Creates a system from an id slug.\n *\n * @param id -\n * The id slug of the system to create.\n *\n * @return\n * The system, or null if the id is not known.\n */\n public static from(id: string): IZRomulatorSystem | null {\n if (isTagged(KnownSystem, ZRomulatorSystemKnown, id)) {\n return ZRomulatorSystemKnown[id]();\n }\n\n return null;\n }\n}\n","import { firstTruthy } from \"@zthun/helpful-fn\";\nimport type { IZDataMatch } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\n/**\n * A data match function which matches a string (search) filter\n * to a game's name, system slug, or system name.\n */\nexport class ZRomulatorDataMatchGame\n implements IZDataMatch<IZRomulatorGame, string>\n{\n public match(data: IZRomulatorGame, filter: string): boolean {\n const needle = filter?.trim().toLowerCase();\n const { name = \"\", system = \"\" } = data;\n const target = ZRomulatorSystemKnown.from(system);\n const systemName = firstTruthy(\"\", target?.name);\n\n if (!needle?.length) {\n return true;\n }\n\n return [name, system, systemName]\n .filter((s) => s.length)\n .some((k) => k.toLowerCase().includes(needle));\n }\n}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorGame,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorGameBuilder,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { kebabCase } from \"lodash-es\";\nimport { basename, dirname, parse } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\nimport { ZRomulatorDataMatchGame } from \"./data-match-game.mjs\";\n\nexport const ZRomulatorGamesToken = Symbol(\"romulator-games-service\");\n\nexport interface IZRomulatorGamesService extends IZRestfulGet<IZRomulatorGame> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>>;\n}\n\n@Injectable()\nexport class ZRomulatorGamesService implements IZRomulatorGamesService {\n private readonly _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorGamesService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>> {\n const config = ZRomulatorConfigKnown.games();\n const { contents } = await this._config.get(config.id);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n\n const cwd = detokenize(firstDefined(fallback, gamesFolder), process.env);\n const time = new Date();\n\n let msg = `Searching for games in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const systems = ZRomulatorSystemKnown.all().map((system) => system.id);\n const glob = `{${systems.join(\",\")}}/**/*.zip`;\n const nodes = await this._file.search(glob, { cwd, stat: false });\n const span = new Date().getTime() - time.getTime();\n\n msg = `Found ${nodes.length} games. Search took ${span} milliseconds.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const games = nodes.map(({ path }) => {\n const dir = basename(dirname(path)) as ZRomulatorSystemId;\n const { name: file } = parse(path);\n const id = `${dir}-${kebabCase(file)}`;\n\n return new ZRomulatorGameBuilder()\n .id(id)\n .system(dir)\n .file(path)\n .name(file)\n .build();\n });\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorGame>()\n .search(new ZRomulatorDataMatchGame())\n .build();\n const source = new ZDataSourceStatic(games, options);\n\n const $sort = new ZSortBuilder()\n .sorts(firstDefined([], req.sort))\n .ascending(\"system\")\n .ascending(\"name\")\n .build();\n const $request = new ZDataRequestBuilder().copy(req).sort($sort).build();\n\n const data = await source.retrieve($request);\n const count = await source.count($request);\n\n return new ZPageBuilder().count(count).data(data).build();\n }\n\n public async get(id: string): Promise<IZRomulatorGame> {\n const { data: games } = await this.list(new ZDataRequestBuilder().build());\n const match = games.find((game) => game.id === id);\n\n if (!match) {\n throw new NotFoundException(`Unable to find game with id, ${id}.`);\n }\n\n return match;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport type { IZRomulatorGamesService } from \"./games-service.mjs\";\nimport { ZRomulatorGamesToken } from \"./games-service.mjs\";\n\n@Controller(\"games\")\nexport class ZRomulatorGamesController {\n public constructor(\n @Inject(ZRomulatorGamesToken)\n private readonly _games: IZRomulatorGamesService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorGame>> {\n return this._games.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._games.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesController } from \"./games-controller.mjs\";\nimport {\n ZRomulatorGamesService,\n ZRomulatorGamesToken,\n} from \"./games-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorGamesController],\n providers: [\n {\n provide: ZRomulatorGamesToken,\n useClass: ZRomulatorGamesService,\n },\n ],\n})\nexport class ZRomulatorGamesModule {}\n","import {\n ForbiddenException,\n Inject,\n Injectable,\n NotAcceptableException,\n NotFoundException,\n StreamableFile,\n} from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport {\n createError,\n detokenize,\n firstDefined,\n firstTruthy,\n} from \"@zthun/helpful-fn\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n type IZDataRequest,\n type IZPage,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport {\n ZRomulatorConfigMediaBuilder,\n ZRomulatorMediaBuilder,\n type IZRomulatorMedia,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulDelete, IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { ZMimeTypeApplication } from \"@zthun/webigail-url\";\nimport { findIndex } from \"lodash-es\";\nimport { lookup } from \"mime-types\";\nimport { createReadStream } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport { env } from \"node:process\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\nexport const ZRomulatorMediaToken = Symbol(\"romulator-media-service\");\n\nexport interface IZRomulatorMediaService\n extends IZRestfulGet<IZRomulatorMedia>,\n IZRestfulDelete {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>>;\n download(id: string, accept: string): Promise<StreamableFile>;\n}\n\n@Injectable()\nexport class ZRomulatorMediaService implements IZRomulatorMediaService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken) private _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken) private _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorMediaService\", logger);\n }\n\n private async getMediaFolder(): Promise<string> {\n const mediaConfig = ZRomulatorConfigKnown.media();\n const { contents } = await this._config.get(mediaConfig.id);\n const { mediaFolder } = new ZRomulatorConfigMediaBuilder()\n .copy(contents)\n .build();\n\n return detokenize(mediaFolder, env);\n }\n\n private async findAllMedia(cwd: string): Promise<IZRomulatorMedia[]> {\n const systems = ZRomulatorSystemKnown.all()\n .map((s) => s.id)\n .join(\",\");\n const glob = `{${systems}}/**`;\n\n const files = await this._file.search(glob, { cwd, stat: false });\n\n return files\n .map((f) => new ZRomulatorMediaBuilder().from(f.path).build())\n .filter((media) => !!media.id);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>> {\n const cwd = await this.getMediaFolder();\n\n let msg = `Reading all media from ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const time = new Date();\n const mediaList = await this.findAllMedia(cwd);\n const span = new Date().getTime() - time.getTime();\n msg = `Found ${mediaList.length} media files. Search took ${span} milliseconds`;\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorMedia>()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic(mediaList, options);\n const page = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorMedia>().data(page).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorMedia> {\n const cwd = await this.getMediaFolder();\n\n const time = new Date();\n let log = `Searching for media with id ${id}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const mediaList = await this.findAllMedia(cwd);\n const index = findIndex(mediaList, (m) => m.id === id);\n const span = new Date().getTime() - time.getTime();\n\n if (index < 0) {\n const msg = `Could not find any media with id, ${id}.`;\n log = `${msg} Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().warning().message(log).build());\n throw new NotFoundException(msg);\n }\n\n const media = mediaList[index];\n log = `Found media, ${media.url} after ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return media;\n }\n\n public async download(id: string, accept: string): Promise<StreamableFile> {\n let log = `Download request received for ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const fallback = ZMimeTypeApplication.OctetStream;\n const { fileName, url } = await this.get(id);\n const lookupResult = lookup(firstDefined(\"\", fileName));\n const mime = firstTruthy(fallback, lookupResult) as string;\n const accepts = accept.split(\",\").map((h) => h.split(\";\")[0].trim());\n\n const acceptable = accepts.some((a) => {\n if (a === \"*/*\") {\n return true;\n }\n if (a.endsWith(\"/*\")) {\n return mime.startsWith(a.slice(0, -1));\n }\n return a === mime;\n });\n\n if (!acceptable) {\n const msg =\n `The media requested is of type ${mime}. ` +\n `The request only accepts ${accept}.`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n throw new NotAcceptableException(msg);\n }\n\n log = `Streaming ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return new StreamableFile(createReadStream(firstDefined(\"\", url)), {\n type: mime,\n disposition: `inline; filename=${fileName}`,\n });\n }\n\n public async delete(id: string): Promise<void> {\n const { url } = await this.get(id);\n const _url = firstDefined(\"\", url);\n\n let log = `Attempting to delete file ${_url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n try {\n await unlink(_url);\n } catch (err) {\n const { message } = createError(err);\n this._logger.log(new ZLogEntryBuilder().error().message(message).build());\n throw new ForbiddenException(message);\n }\n\n log = `Deleted ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n }\n}\n","import {\n Controller,\n Delete,\n Get,\n Inject,\n Param,\n Query,\n Req,\n} from \"@nestjs/common\";\nimport { ApiParam, ApiResponse } from \"@nestjs/swagger\";\nimport {\n ZDataRequestBuilder,\n type IZDataRequestQuery,\n} from \"@zthun/helpful-query\";\nimport { ZHttpCodeClient, ZHttpCodeSuccess } from \"@zthun/webigail-http\";\nimport type { Request } from \"express\";\nimport type { IZRomulatorMediaService } from \"./media-service.mjs\";\nimport { ZRomulatorMediaToken } from \"./media-service.mjs\";\n\n@Controller(\"media\")\nexport class ZRomulatorMediaController {\n public constructor(\n @Inject(ZRomulatorMediaToken)\n private _media: IZRomulatorMediaService,\n ) {}\n\n @Get()\n public list(@Query() params: IZDataRequestQuery) {\n const request = new ZDataRequestBuilder().query(params).build();\n return this._media.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the media\",\n content: {\n \"*/*\": {},\n \"image/*\": {},\n \"image/png\": {},\n \"image/jpeg\": {},\n \"application/mp4\": {},\n \"application/json\": {},\n },\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotFound,\n description: \"Media not found\",\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotAcceptable,\n description: \"Unsupported Accept header\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: string,\n @Req() req: Request,\n ) {\n const { accept = \"*/*\" } = req.headers;\n\n return accept.includes(\"application/json\")\n ? this._media.get(identification)\n : this._media.download(identification, accept);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @Delete(\":identification\")\n public async delete(@Param(\"identification\") identification: string) {\n await this._media.delete(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorMediaController } from \"./media-controller.mjs\";\nimport {\n ZRomulatorMediaService,\n ZRomulatorMediaToken,\n} from \"./media-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZRomulatorConfigsModule, ZLoggerModule],\n controllers: [ZRomulatorMediaController],\n providers: [\n { provide: ZRomulatorMediaToken, useClass: ZRomulatorMediaService },\n ],\n})\nexport class ZRomulatorMediaModule {}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { find } from \"lodash-es\";\nimport { basename } from \"node:path\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"./system-known.mjs\";\n\nexport const ZRomulatorSystemsToken = Symbol(\"romulator-systems-service\");\n\nexport interface IZRomulatorSystemsService {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>>;\n get(id: string): Promise<IZRomulatorSystem>;\n}\n\n@Injectable()\nexport class ZRomulatorSystemsService implements IZRomulatorSystemsService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) readonly logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorSystemsService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving systems page, ${page}, with size, ${size}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const { contents } = await this._configs.get(ZRomulatorConfigId.Games);\n const { gamesFolder } = contents;\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n const _folder = firstDefined(fallback, gamesFolder);\n\n const cwd = detokenize(_folder, process.env);\n msg = `Looking for systems in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const searchOptions = { cwd };\n const folders = await this._file.search(\"*/\", searchOptions);\n\n const systems = folders\n .map((folder) => folder.path)\n .map((path) => basename(path))\n .map((slug) => ZRomulatorSystemKnown.from(slug))\n .filter((system) => system != null);\n\n msg = `Found ${systems.length} systems`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const sourceOptions = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields([\"id\", \"name\", \"short\"]))\n .build();\n\n const source = new ZDataSourceStatic<IZRomulatorSystem>(\n systems,\n sourceOptions,\n );\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder().data(data).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorSystem> {\n const all = await this.list(new ZDataRequestBuilder().build());\n const system = find(all.data, (system) => system.id === id);\n\n if (!system) {\n throw new NotFoundException(`Unable to find system with id, ${id}.`);\n }\n\n return system;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport { ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport type { IZRomulatorSystemsService } from \"./systems-service.mjs\";\nimport { ZRomulatorSystemsToken } from \"./systems-service.mjs\";\n\n@Controller(\"systems\")\nexport class ZRomulatorSystemsController {\n public constructor(\n @Inject(ZRomulatorSystemsToken)\n private readonly _systems: IZRomulatorSystemsService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorSystem>> {\n return this._systems.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the system\",\n })\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._systems.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorSystemsController } from \"./systems-controller.mjs\";\nimport {\n ZRomulatorSystemsService,\n ZRomulatorSystemsToken,\n} from \"./systems-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorSystemsController],\n providers: [\n { provide: ZRomulatorSystemsToken, useClass: ZRomulatorSystemsService },\n ],\n})\nexport class ZRomulatorSystemsModule {}\n","/* istanbul ignore file -- @preserve */\nimport { Module } from \"@nestjs/common\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesModule } from \"../games/games-module.mjs\";\nimport { ZRomulatorMediaModule } from \"../media/media-module.mjs\";\nimport { ZRomulatorSystemsModule } from \"../systems/systems-module.mjs\";\n\n@Module({\n imports: [\n ZRomulatorSystemsModule,\n ZRomulatorConfigsModule,\n ZRomulatorMediaModule,\n ZRomulatorGamesModule,\n ],\n})\nexport class ZRomulatorModule {}\n","import { NestFactory } from \"@nestjs/core\";\nimport { DocumentBuilder, SwaggerModule } from \"@nestjs/swagger\";\nimport { ZRomulatorModule } from \"./app/app-module.mjs\";\n\nconst PORT = 3000;\n\n(async function () {\n const app = await NestFactory.create(ZRomulatorModule);\n app.setGlobalPrefix(\"api\");\n app.enableCors();\n\n const config = new DocumentBuilder()\n .setTitle(\"Romulator API\")\n .setDescription(\"The Romulator API\")\n .setVersion(\"1\")\n .build();\n\n const document = () => SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n await app.listen(PORT);\n})();\n"],"names":["ZRomulatorConfigUpdateDto","contents","type","properties","message","ZDir","application","resolve","homedir","configs","ZRomulatorConfigKnown","all","games","media","create","id","file","ZRomulatorConfigBuilder","ZRomulatorConfigId","Games","name","description","avatar","metadata","ZRomulatorConfigGamesMetadata","build","Media","ZRomulatorConfigMediaMetadata","ZRomulatorConfigsToken","Symbol","ZRomulatorConfigsService","_logger","ZLoggerContext","list","req","page","firstDefined","size","Infinity","msg","log","ZLogEntryBuilder","info","options","ZDataSourceStaticOptionsBuilder","search","ZDataSearchFields","source","ZDataSourceStatic","data","retrieve","count","length","ZPageBuilder","get","config","_find","buffer","readFile","json","toString","JSON","parse","byteLength","e","createError","warning","result","copy","Promise","update","record","next","stringify","mkdir","dirname","recursive","writeFile","error","reject","InternalServerErrorException","find","c","NotFoundException","ZRomulatorConfigsController","_configs","request","ZDataRequestBuilder","query","payload","identification","ValidationPipe","transform","whitelist","skipMissingProperties","skipNullProperties","skipUndefinedProperties","ZRomulatorConfigsModule","imports","ZFileSystemModule","ZLoggerModule","controllers","providers","provide","useClass","exports","KnownSystem","ZRomulatorSystemKnown","Object","getOwnPropertyNames","methods","filter","p","isTagged","map","f","m","call","nes","ZRomulatorSystemBuilder","ZRomulatorSystemId","Nintendo","console","alias","generation","manufacturer","snes","SuperNintendo","n64","Nintendo64","gc","GameCube","wii","Wii","wiiu","WiiU","switch","Switch","from","ZRomulatorDataMatchGame","match","needle","trim","toLowerCase","system","target","systemName","firstTruthy","s","some","k","includes","ZRomulatorGamesToken","ZRomulatorGamesService","_file","_config","logger","gamesFolder","ZRomulatorConfigGamesBuilder","fallback","cwd","detokenize","process","env","time","Date","systems","glob","join","nodes","stat","span","getTime","path","dir","basename","kebabCase","ZRomulatorGameBuilder","$sort","ZSortBuilder","sorts","sort","ascending","$request","game","ZRomulatorGamesController","_games","ZRomulatorGamesModule","ZRomulatorMediaToken","ZRomulatorMediaService","getMediaFolder","mediaConfig","mediaFolder","ZRomulatorConfigMediaBuilder","findAllMedia","files","ZRomulatorMediaBuilder","mediaList","index","findIndex","url","download","accept","ZMimeTypeApplication","OctetStream","fileName","lookupResult","lookup","mime","accepts","split","h","acceptable","a","endsWith","startsWith","slice","NotAcceptableException","StreamableFile","createReadStream","disposition","delete","_url","unlink","err","ForbiddenException","ZRomulatorMediaController","_media","params","headers","status","ZHttpCodeSuccess","OK","content","ZHttpCodeClient","NotFound","NotAcceptable","ZRomulatorMediaModule","ZRomulatorSystemsToken","ZRomulatorSystemsService","_folder","searchOptions","folders","folder","slug","sourceOptions","ZRomulatorSystemsController","_systems","ZRomulatorSystemsModule","ZRomulatorModule","PORT","app","NestFactory","setGlobalPrefix","enableCors","DocumentBuilder","setTitle","setDescription","setVersion","document","SwaggerModule","createDocument","setup","listen"],"mappings":"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"}
package/dist/main.js CHANGED
@@ -510,10 +510,11 @@ class ZRomulatorGamesService {
510
510
  const $sort = new ZSortBuilder().sorts(firstDefined([], req.sort)).ascending("system").ascending("name").build();
511
511
  const $request = new ZDataRequestBuilder().copy(req).sort($sort).build();
512
512
  const data = await source.retrieve($request);
513
- return data;
513
+ const count = await source.count($request);
514
+ return new ZPageBuilder().count(count).data(data).build();
514
515
  }
515
516
  async get(id) {
516
- const games = await this.list(new ZDataRequestBuilder().build());
517
+ const { data: games } = await this.list(new ZDataRequestBuilder().build());
517
518
  const match = games.find((game)=>game.id === id);
518
519
  if (!match) {
519
520
  throw new NotFoundException(`Unable to find game with id, ${id}.`);
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sources":["../src/config/config-update.mts","../src/dir/dir.ts","../src/config/config-known.mts","../src/config/configs-service.mts","../src/config/configs-controller.mts","../src/config/configs-module.mts","../src/systems/system-known.mts","../src/games/data-match-game.mts","../src/games/games-service.mts","../src/games/games-controller.mts","../src/games/games-module.mts","../src/media/media-service.mts","../src/media/media-controller.mts","../src/media/media-module.mts","../src/systems/systems-service.mts","../src/systems/systems-controller.mts","../src/systems/systems-module.mts","../src/app/app-module.mts","../src/main.mts"],"sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\nimport { IsDefined, IsNotEmptyObject, IsObject } from \"class-validator\";\n\nexport class ZRomulatorConfigUpdateDto<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n @ApiProperty({ type: \"object\", properties: {} })\n @IsDefined({ message: \"The contents of the config is required\" })\n @IsObject({ message: \"The contents of the config must be an object \" })\n @IsNotEmptyObject()\n contents: T;\n}\n","import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport abstract class ZDir {\n public static application() {\n return resolve(homedir(), \".zthunworks\", \"romulator\");\n }\n\n public static configs() {\n return resolve(ZDir.application(), \"configs\");\n }\n}\n","import {\n ZRomulatorConfigBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n ZRomulatorConfigMediaMetadata,\n} from \"@zthun/romulator-client\";\nimport { resolve } from \"node:path\";\nimport { ZDir } from \"../dir/dir.js\";\n\nexport abstract class ZRomulatorConfigKnown {\n public static all() {\n return [ZRomulatorConfigKnown.games(), ZRomulatorConfigKnown.media()];\n }\n\n private static create(id: ZRomulatorConfigId) {\n const file = resolve(ZDir.configs(), `${id}.json`);\n return new ZRomulatorConfigBuilder().id(id).file(file);\n }\n\n public static games() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Games)\n .name(\"Game Settings\")\n .description(\"Modify where your games are stored and related settings\")\n .avatar(\"gamepad\")\n .metadata(ZRomulatorConfigGamesMetadata.all())\n .build();\n }\n\n public static media() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Media)\n .name(\"Media Settings\")\n .description(\"Modify where media is stored and what media to retrieve\")\n .avatar(\"image\")\n .metadata(ZRomulatorConfigMediaMetadata.all())\n .build();\n }\n}\n","import {\n Inject,\n Injectable,\n InternalServerErrorException,\n NotFoundException,\n} from \"@nestjs/common\";\nimport { createError, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport type { IZLogger } from \"@zthun/lumberjacky-log\";\nimport { ZLogEntryBuilder, ZLoggerContext } from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigBuilder } from \"@zthun/romulator-client\";\nimport type { IZRestfulGet, IZRestfulUpdate } from \"@zthun/webigail-rest\";\nimport { find } from \"lodash-es\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"./config-known.mjs\";\n\nexport const ZRomulatorConfigsToken = Symbol(\"configs\");\n\nexport interface IZRomulatorConfigsService\n extends IZRestfulUpdate<IZRomulatorConfig>,\n IZRestfulGet<IZRomulatorConfig> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>>;\n}\n\n@Injectable()\nexport class ZRomulatorConfigsService implements IZRomulatorConfigsService {\n private _logger: IZLogger;\n\n public constructor(@Inject(ZLoggerToken) _logger: IZLogger) {\n this._logger = new ZLoggerContext(\"ZRomulatorConfigsService\", _logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving configs page, ${page}, with size, ${size}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const configs = ZRomulatorConfigKnown.all();\n const options = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic<IZRomulatorConfig>(configs, options);\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n msg = `Responding with ${data.length} configs out of ${count} total`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return new ZPageBuilder<IZRomulatorConfig>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get<T>(\n id: ZRomulatorConfigId,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this._find(id);\n let msg = `Attempting to read the file contents for config, ${id}.`;\n let contents: any = {};\n\n try {\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const buffer = await readFile(config.file);\n const json = buffer.toString(\"utf-8\");\n contents = JSON.parse(json);\n msg = `Finished reading config contents (${buffer.byteLength} bytes)`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n } catch (e) {\n msg = createError(e).message;\n this._logger.log(new ZLogEntryBuilder().warning().message(msg).build());\n }\n\n const result = new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(contents)\n .build();\n\n return Promise.resolve(result as Required<IZRomulatorConfig<T>>);\n }\n\n public async update<T>(\n id: ZRomulatorConfigId,\n record: Pick<IZRomulatorConfig, \"contents\">,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this.get<T>(id);\n\n let msg = `Updating config file, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const next = { ...config.contents, ...record.contents };\n const json = JSON.stringify(next);\n\n try {\n await mkdir(dirname(config.file), { recursive: true });\n await writeFile(config.file, json);\n return new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(next)\n .build() as Required<IZRomulatorConfig<T>>;\n } catch (e) {\n const error = createError(e);\n msg = `Unable to write to, ${config.file}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n msg = error.message;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new InternalServerErrorException(error));\n }\n }\n\n private async _find(id: ZRomulatorConfigId): Promise<IZRomulatorConfig> {\n let msg = `Attempting to retrieve config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const configs = ZRomulatorConfigKnown.all();\n const config = find(configs, (c) => c.id === id);\n\n if (config == null) {\n msg = `Could not find config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new NotFoundException(msg));\n }\n\n msg = `Config, ${id}, found`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return config;\n }\n}\n","import {\n Body,\n Controller,\n Get,\n Inject,\n Param,\n Patch,\n Query,\n UsePipes,\n ValidationPipe,\n} from \"@nestjs/common\";\nimport { ApiBody, ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigUpdateDto } from \"./config-update.mjs\";\nimport type { IZRomulatorConfigsService } from \"./configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"./configs-service.mjs\";\n\n@Controller(\"configs\")\nexport class ZRomulatorConfigsController {\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n ) {}\n\n @Get()\n public async list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorConfig>> {\n const request = new ZDataRequestBuilder().query(query).build();\n return this._configs.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @ApiBody({\n type: ZRomulatorConfigUpdateDto,\n })\n @Patch(\":identification\")\n @UsePipes(\n new ValidationPipe({\n transform: true,\n whitelist: true,\n skipMissingProperties: false,\n skipNullProperties: false,\n skipUndefinedProperties: false,\n }),\n )\n public async update(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n @Body() payload: ZRomulatorConfigUpdateDto,\n ): Promise<IZRomulatorConfig> {\n return this._configs.update(identification, payload);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n ): Promise<IZRomulatorConfig> {\n return await this._configs.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsController } from \"./configs-controller.mjs\";\nimport {\n ZRomulatorConfigsService,\n ZRomulatorConfigsToken,\n} from \"./configs-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorConfigsController],\n providers: [\n { provide: ZRomulatorConfigsToken, useClass: ZRomulatorConfigsService },\n ],\n exports: [ZRomulatorConfigsToken],\n})\nexport class ZRomulatorConfigsModule {}\n","import { isTagged, ZTag } from \"@zthun/helpful-reflection\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorSystemBuilder,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport \"reflect-metadata\";\n\nconst KnownSystem = \"@zthunworks/romulator/known-system\";\n\n/**\n * A helper factory class for creating supported systems.\n */\nexport abstract class ZRomulatorSystemKnown {\n /**\n * Returns all known systems.\n *\n * @returns\n * All supported systems.\n */\n public static all() {\n const properties = Object.getOwnPropertyNames(ZRomulatorSystemKnown);\n const methods = properties\n .filter((p) => isTagged(KnownSystem, ZRomulatorSystemKnown, p))\n .map((p) => ZRomulatorSystemKnown[p])\n .map((f) => f as () => IZRomulatorSystem);\n return methods.map((m) => m.call(null));\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Entertainment System (NES).\n *\n * @returns\n * A {@link ZRomulatorSystemBuilder} instance that has\n * built the nes.\n */\n @ZTag(KnownSystem)\n public static nes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo)\n .console()\n .name(\"Nintendo Entertainment System\")\n .alias(\"Famicom\")\n .alias(\"NES\")\n .alias(\"Hyundai Comboy\")\n .alias(\"Samurai Electronic TV Game System\")\n .alias(\"Dendy\")\n .generation(3)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Super\n * Nintendo Entertainment System (SNES).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static snes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.SuperNintendo)\n .console()\n .name(\"Super Nintendo Entertainment System\")\n .alias(\"Super Nintendo\")\n .alias(\"Super Famicom\")\n .alias(\"SNES\")\n .alias(\"Super NES\")\n .alias(\"Super Comboy\")\n .generation(4)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * 64 (N64).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static n64() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo64)\n .console()\n .name(\"Nintendo 64\")\n .alias(\"N64\")\n .alias(\"Ultra 64\")\n .alias(\"Hyundai Comboy 64\")\n .generation(5)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * GameCube (GC).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static gc() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.GameCube)\n .console()\n .name(\"Nintendo GameCube\")\n .alias(\"GameCube\")\n .alias(\"Dolphin\")\n .generation(6)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii (Wii).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wii() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Wii)\n .console()\n .name(\"Nintendo Wii\")\n .alias(\"Wii\")\n .alias(\"Revolution\")\n .generation(7)\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii U (WiiU).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wiiu() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.WiiU)\n .console()\n .name(\"Nintendo Wii U\")\n .alias(\"WiiU\")\n .alias(\"Project Cafe\")\n .generation(8)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Mitsumi\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Switch (Switch).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static switch() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Switch)\n .console()\n .name(\"Nintendo Switch\")\n .alias(\"Switch\")\n .alias(\"NX\")\n .alias(\"HAC\")\n .alias(\"Odin\")\n .generation(9)\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Hosiden\")\n .build();\n }\n\n /**\n * Creates a system from an id slug.\n *\n * @param id -\n * The id slug of the system to create.\n *\n * @return\n * The system, or null if the id is not known.\n */\n public static from(id: string): IZRomulatorSystem | null {\n if (isTagged(KnownSystem, ZRomulatorSystemKnown, id)) {\n return ZRomulatorSystemKnown[id]();\n }\n\n return null;\n }\n}\n","import { firstTruthy } from \"@zthun/helpful-fn\";\nimport type { IZDataMatch } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\n/**\n * A data match function which matches a string (search) filter\n * to a game's name, system slug, or system name.\n */\nexport class ZRomulatorDataMatchGame\n implements IZDataMatch<IZRomulatorGame, string>\n{\n public match(data: IZRomulatorGame, filter: string): boolean {\n const needle = filter?.trim().toLowerCase();\n const { name = \"\", system = \"\" } = data;\n const target = ZRomulatorSystemKnown.from(system);\n const systemName = firstTruthy(\"\", target?.name);\n\n if (!needle?.length) {\n return true;\n }\n\n return [name, system, systemName]\n .filter((s) => s.length)\n .some((k) => k.toLowerCase().includes(needle));\n }\n}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorGame,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorGameBuilder,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { kebabCase } from \"lodash-es\";\nimport { basename, dirname, parse } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\nimport { ZRomulatorDataMatchGame } from \"./data-match-game.mjs\";\n\nexport const ZRomulatorGamesToken = Symbol(\"romulator-games-service\");\n\nexport interface IZRomulatorGamesService extends IZRestfulGet<IZRomulatorGame> {\n list(req: IZDataRequest): Promise<IZRomulatorGame[]>;\n}\n\n@Injectable()\nexport class ZRomulatorGamesService implements IZRomulatorGamesService {\n private readonly _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorGamesService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZRomulatorGame[]> {\n const config = ZRomulatorConfigKnown.games();\n const { contents } = await this._config.get(config.id);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n\n const cwd = detokenize(firstDefined(fallback, gamesFolder), process.env);\n const time = new Date();\n\n let msg = `Searching for games in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const systems = ZRomulatorSystemKnown.all().map((system) => system.id);\n const glob = `{${systems.join(\",\")}}/**/*.zip`;\n const nodes = await this._file.search(glob, { cwd, stat: false });\n const span = new Date().getTime() - time.getTime();\n\n msg = `Found ${nodes.length} games. Search took ${span} milliseconds.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const games = nodes.map(({ path }) => {\n const dir = basename(dirname(path)) as ZRomulatorSystemId;\n const { name: file } = parse(path);\n const id = `${dir}-${kebabCase(file)}`;\n\n return new ZRomulatorGameBuilder()\n .id(id)\n .system(dir)\n .file(path)\n .name(file)\n .build();\n });\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorGame>()\n .search(new ZRomulatorDataMatchGame())\n .build();\n const source = new ZDataSourceStatic(games, options);\n\n const $sort = new ZSortBuilder()\n .sorts(firstDefined([], req.sort))\n .ascending(\"system\")\n .ascending(\"name\")\n .build();\n const $request = new ZDataRequestBuilder().copy(req).sort($sort).build();\n const data = await source.retrieve($request);\n\n return data;\n }\n\n public async get(id: string): Promise<IZRomulatorGame> {\n const games = await this.list(new ZDataRequestBuilder().build());\n const match = games.find((game) => game.id === id);\n\n if (!match) {\n throw new NotFoundException(`Unable to find game with id, ${id}.`);\n }\n\n return match;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport type { IZDataRequestQuery } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport type { IZRomulatorGamesService } from \"./games-service.mjs\";\nimport { ZRomulatorGamesToken } from \"./games-service.mjs\";\n\n@Controller(\"games\")\nexport class ZRomulatorGamesController {\n public constructor(\n @Inject(ZRomulatorGamesToken)\n private readonly _games: IZRomulatorGamesService,\n ) {}\n\n @Get()\n public list(@Query() query: IZDataRequestQuery): Promise<IZRomulatorGame[]> {\n return this._games.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._games.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesController } from \"./games-controller.mjs\";\nimport {\n ZRomulatorGamesService,\n ZRomulatorGamesToken,\n} from \"./games-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorGamesController],\n providers: [\n {\n provide: ZRomulatorGamesToken,\n useClass: ZRomulatorGamesService,\n },\n ],\n})\nexport class ZRomulatorGamesModule {}\n","import {\n ForbiddenException,\n Inject,\n Injectable,\n NotAcceptableException,\n NotFoundException,\n StreamableFile,\n} from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport {\n createError,\n detokenize,\n firstDefined,\n firstTruthy,\n} from \"@zthun/helpful-fn\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n type IZDataRequest,\n type IZPage,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport {\n ZRomulatorConfigMediaBuilder,\n ZRomulatorMediaBuilder,\n type IZRomulatorMedia,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulDelete, IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { ZMimeTypeApplication } from \"@zthun/webigail-url\";\nimport { findIndex } from \"lodash-es\";\nimport { lookup } from \"mime-types\";\nimport { createReadStream } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport { env } from \"node:process\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\nexport const ZRomulatorMediaToken = Symbol(\"romulator-media-service\");\n\nexport interface IZRomulatorMediaService\n extends IZRestfulGet<IZRomulatorMedia>,\n IZRestfulDelete {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>>;\n download(id: string, accept: string): Promise<StreamableFile>;\n}\n\n@Injectable()\nexport class ZRomulatorMediaService implements IZRomulatorMediaService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken) private _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken) private _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorMediaService\", logger);\n }\n\n private async getMediaFolder(): Promise<string> {\n const mediaConfig = ZRomulatorConfigKnown.media();\n const { contents } = await this._config.get(mediaConfig.id);\n const { mediaFolder } = new ZRomulatorConfigMediaBuilder()\n .copy(contents)\n .build();\n\n return detokenize(mediaFolder, env);\n }\n\n private async findAllMedia(cwd: string): Promise<IZRomulatorMedia[]> {\n const systems = ZRomulatorSystemKnown.all()\n .map((s) => s.id)\n .join(\",\");\n const glob = `{${systems}}/**`;\n\n const files = await this._file.search(glob, { cwd, stat: false });\n\n return files\n .map((f) => new ZRomulatorMediaBuilder().from(f.path).build())\n .filter((media) => !!media.id);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>> {\n const cwd = await this.getMediaFolder();\n\n let msg = `Reading all media from ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const time = new Date();\n const mediaList = await this.findAllMedia(cwd);\n const span = new Date().getTime() - time.getTime();\n msg = `Found ${mediaList.length} media files. Search took ${span} milliseconds`;\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorMedia>()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic(mediaList, options);\n const page = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorMedia>().data(page).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorMedia> {\n const cwd = await this.getMediaFolder();\n\n const time = new Date();\n let log = `Searching for media with id ${id}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const mediaList = await this.findAllMedia(cwd);\n const index = findIndex(mediaList, (m) => m.id === id);\n const span = new Date().getTime() - time.getTime();\n\n if (index < 0) {\n const msg = `Could not find any media with id, ${id}.`;\n log = `${msg} Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().warning().message(log).build());\n throw new NotFoundException(msg);\n }\n\n const media = mediaList[index];\n log = `Found media, ${media.url} after ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return media;\n }\n\n public async download(id: string, accept: string): Promise<StreamableFile> {\n let log = `Download request received for ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const fallback = ZMimeTypeApplication.OctetStream;\n const { fileName, url } = await this.get(id);\n const lookupResult = lookup(firstDefined(\"\", fileName));\n const mime = firstTruthy(fallback, lookupResult) as string;\n const accepts = accept.split(\",\").map((h) => h.split(\";\")[0].trim());\n\n const acceptable = accepts.some((a) => {\n if (a === \"*/*\") {\n return true;\n }\n if (a.endsWith(\"/*\")) {\n return mime.startsWith(a.slice(0, -1));\n }\n return a === mime;\n });\n\n if (!acceptable) {\n const msg =\n `The media requested is of type ${mime}. ` +\n `The request only accepts ${accept}.`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n throw new NotAcceptableException(msg);\n }\n\n log = `Streaming ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return new StreamableFile(createReadStream(firstDefined(\"\", url)), {\n type: mime,\n disposition: `inline; filename=${fileName}`,\n });\n }\n\n public async delete(id: string): Promise<void> {\n const { url } = await this.get(id);\n const _url = firstDefined(\"\", url);\n\n let log = `Attempting to delete file ${_url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n try {\n await unlink(_url);\n } catch (err) {\n const { message } = createError(err);\n this._logger.log(new ZLogEntryBuilder().error().message(message).build());\n throw new ForbiddenException(message);\n }\n\n log = `Deleted ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n }\n}\n","import {\n Controller,\n Delete,\n Get,\n Inject,\n Param,\n Query,\n Req,\n} from \"@nestjs/common\";\nimport { ApiParam, ApiResponse } from \"@nestjs/swagger\";\nimport {\n ZDataRequestBuilder,\n type IZDataRequestQuery,\n} from \"@zthun/helpful-query\";\nimport { ZHttpCodeClient, ZHttpCodeSuccess } from \"@zthun/webigail-http\";\nimport type { Request } from \"express\";\nimport type { IZRomulatorMediaService } from \"./media-service.mjs\";\nimport { ZRomulatorMediaToken } from \"./media-service.mjs\";\n\n@Controller(\"media\")\nexport class ZRomulatorMediaController {\n public constructor(\n @Inject(ZRomulatorMediaToken)\n private _media: IZRomulatorMediaService,\n ) {}\n\n @Get()\n public list(@Query() params: IZDataRequestQuery) {\n const request = new ZDataRequestBuilder().query(params).build();\n return this._media.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the media\",\n content: {\n \"*/*\": {},\n \"image/*\": {},\n \"image/png\": {},\n \"image/jpeg\": {},\n \"application/mp4\": {},\n \"application/json\": {},\n },\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotFound,\n description: \"Media not found\",\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotAcceptable,\n description: \"Unsupported Accept header\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: string,\n @Req() req: Request,\n ) {\n const { accept = \"*/*\" } = req.headers;\n\n return accept.includes(\"application/json\")\n ? this._media.get(identification)\n : this._media.download(identification, accept);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @Delete(\":identification\")\n public async delete(@Param(\"identification\") identification: string) {\n await this._media.delete(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorMediaController } from \"./media-controller.mjs\";\nimport {\n ZRomulatorMediaService,\n ZRomulatorMediaToken,\n} from \"./media-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZRomulatorConfigsModule, ZLoggerModule],\n controllers: [ZRomulatorMediaController],\n providers: [\n { provide: ZRomulatorMediaToken, useClass: ZRomulatorMediaService },\n ],\n})\nexport class ZRomulatorMediaModule {}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { find } from \"lodash-es\";\nimport { basename } from \"node:path\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"./system-known.mjs\";\n\nexport const ZRomulatorSystemsToken = Symbol(\"romulator-systems-service\");\n\nexport interface IZRomulatorSystemsService {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>>;\n get(id: string): Promise<IZRomulatorSystem>;\n}\n\n@Injectable()\nexport class ZRomulatorSystemsService implements IZRomulatorSystemsService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) readonly logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorSystemsService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving systems page, ${page}, with size, ${size}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const { contents } = await this._configs.get(ZRomulatorConfigId.Games);\n const { gamesFolder } = contents;\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n const _folder = firstDefined(fallback, gamesFolder);\n\n const cwd = detokenize(_folder, process.env);\n msg = `Looking for systems in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const searchOptions = { cwd };\n const folders = await this._file.search(\"*/\", searchOptions);\n\n const systems = folders\n .map((folder) => folder.path)\n .map((path) => basename(path))\n .map((slug) => ZRomulatorSystemKnown.from(slug))\n .filter((system) => system != null);\n\n msg = `Found ${systems.length} systems`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const sourceOptions = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields([\"id\", \"name\", \"short\"]))\n .build();\n\n const source = new ZDataSourceStatic<IZRomulatorSystem>(\n systems,\n sourceOptions,\n );\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorSystem>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get(id: string): Promise<IZRomulatorSystem> {\n const all = await this.list(new ZDataRequestBuilder().build());\n const system = find(all.data, (system) => system.id === id);\n\n if (!system) {\n throw new NotFoundException(`Unable to find system with id, ${id}.`);\n }\n\n return system;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport { ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport type { IZRomulatorSystemsService } from \"./systems-service.mjs\";\nimport { ZRomulatorSystemsToken } from \"./systems-service.mjs\";\n\n@Controller(\"systems\")\nexport class ZRomulatorSystemsController {\n public constructor(\n @Inject(ZRomulatorSystemsToken)\n private readonly _systems: IZRomulatorSystemsService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorSystem>> {\n return this._systems.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the system\",\n })\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._systems.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorSystemsController } from \"./systems-controller.mjs\";\nimport {\n ZRomulatorSystemsService,\n ZRomulatorSystemsToken,\n} from \"./systems-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorSystemsController],\n providers: [\n { provide: ZRomulatorSystemsToken, useClass: ZRomulatorSystemsService },\n ],\n})\nexport class ZRomulatorSystemsModule {}\n","/* istanbul ignore file -- @preserve */\nimport { Module } from \"@nestjs/common\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesModule } from \"../games/games-module.mjs\";\nimport { ZRomulatorMediaModule } from \"../media/media-module.mjs\";\nimport { ZRomulatorSystemsModule } from \"../systems/systems-module.mjs\";\n\n@Module({\n imports: [\n ZRomulatorSystemsModule,\n ZRomulatorConfigsModule,\n ZRomulatorMediaModule,\n ZRomulatorGamesModule,\n ],\n})\nexport class ZRomulatorModule {}\n","import { NestFactory } from \"@nestjs/core\";\nimport { DocumentBuilder, SwaggerModule } from \"@nestjs/swagger\";\nimport { ZRomulatorModule } from \"./app/app-module.mjs\";\n\nconst PORT = 3000;\n\n(async function () {\n const app = await NestFactory.create(ZRomulatorModule);\n app.setGlobalPrefix(\"api\");\n app.enableCors();\n\n const config = new DocumentBuilder()\n .setTitle(\"Romulator API\")\n .setDescription(\"The Romulator API\")\n .setVersion(\"1\")\n .build();\n\n const document = () => SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n await app.listen(PORT);\n})();\n"],"names":["ZRomulatorConfigUpdateDto","contents","type","properties","message","ZDir","application","resolve","homedir","configs","ZRomulatorConfigKnown","all","games","media","create","id","file","ZRomulatorConfigBuilder","ZRomulatorConfigId","Games","name","description","avatar","metadata","ZRomulatorConfigGamesMetadata","build","Media","ZRomulatorConfigMediaMetadata","ZRomulatorConfigsToken","Symbol","ZRomulatorConfigsService","_logger","ZLoggerContext","list","req","page","firstDefined","size","Infinity","msg","log","ZLogEntryBuilder","info","options","ZDataSourceStaticOptionsBuilder","search","ZDataSearchFields","source","ZDataSourceStatic","data","retrieve","count","length","ZPageBuilder","get","config","_find","buffer","readFile","json","toString","JSON","parse","byteLength","e","createError","warning","result","copy","Promise","update","record","next","stringify","mkdir","dirname","recursive","writeFile","error","reject","InternalServerErrorException","find","c","NotFoundException","ZRomulatorConfigsController","_configs","request","ZDataRequestBuilder","query","payload","identification","ValidationPipe","transform","whitelist","skipMissingProperties","skipNullProperties","skipUndefinedProperties","ZRomulatorConfigsModule","imports","ZFileSystemModule","ZLoggerModule","controllers","providers","provide","useClass","exports","KnownSystem","ZRomulatorSystemKnown","Object","getOwnPropertyNames","methods","filter","p","isTagged","map","f","m","call","nes","ZRomulatorSystemBuilder","ZRomulatorSystemId","Nintendo","console","alias","generation","manufacturer","snes","SuperNintendo","n64","Nintendo64","gc","GameCube","wii","Wii","wiiu","WiiU","switch","Switch","from","ZRomulatorDataMatchGame","match","needle","trim","toLowerCase","system","target","systemName","firstTruthy","s","some","k","includes","ZRomulatorGamesToken","ZRomulatorGamesService","_file","_config","logger","gamesFolder","ZRomulatorConfigGamesBuilder","fallback","cwd","detokenize","process","env","time","Date","systems","glob","join","nodes","stat","span","getTime","path","dir","basename","kebabCase","ZRomulatorGameBuilder","$sort","ZSortBuilder","sorts","sort","ascending","$request","game","ZRomulatorGamesController","_games","ZRomulatorGamesModule","ZRomulatorMediaToken","ZRomulatorMediaService","getMediaFolder","mediaConfig","mediaFolder","ZRomulatorConfigMediaBuilder","findAllMedia","files","ZRomulatorMediaBuilder","mediaList","index","findIndex","url","download","accept","ZMimeTypeApplication","OctetStream","fileName","lookupResult","lookup","mime","accepts","split","h","acceptable","a","endsWith","startsWith","slice","NotAcceptableException","StreamableFile","createReadStream","disposition","delete","_url","unlink","err","ForbiddenException","ZRomulatorMediaController","_media","params","headers","status","ZHttpCodeSuccess","OK","content","ZHttpCodeClient","NotFound","NotAcceptable","ZRomulatorMediaModule","ZRomulatorSystemsToken","ZRomulatorSystemsService","_folder","searchOptions","folders","folder","slug","sourceOptions","ZRomulatorSystemsController","_systems","ZRomulatorSystemsModule","ZRomulatorModule","PORT","app","NestFactory","setGlobalPrefix","enableCors","DocumentBuilder","setTitle","setDescription","setVersion","document","SwaggerModule","createDocument","setup","listen"],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sources":["../src/config/config-update.mts","../src/dir/dir.ts","../src/config/config-known.mts","../src/config/configs-service.mts","../src/config/configs-controller.mts","../src/config/configs-module.mts","../src/systems/system-known.mts","../src/games/data-match-game.mts","../src/games/games-service.mts","../src/games/games-controller.mts","../src/games/games-module.mts","../src/media/media-service.mts","../src/media/media-controller.mts","../src/media/media-module.mts","../src/systems/systems-service.mts","../src/systems/systems-controller.mts","../src/systems/systems-module.mts","../src/app/app-module.mts","../src/main.mts"],"sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\nimport { IsDefined, IsNotEmptyObject, IsObject } from \"class-validator\";\n\nexport class ZRomulatorConfigUpdateDto<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n @ApiProperty({ type: \"object\", properties: {} })\n @IsDefined({ message: \"The contents of the config is required\" })\n @IsObject({ message: \"The contents of the config must be an object \" })\n @IsNotEmptyObject()\n contents: T;\n}\n","import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport abstract class ZDir {\n public static application() {\n return resolve(homedir(), \".zthunworks\", \"romulator\");\n }\n\n public static configs() {\n return resolve(ZDir.application(), \"configs\");\n }\n}\n","import {\n ZRomulatorConfigBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n ZRomulatorConfigMediaMetadata,\n} from \"@zthun/romulator-client\";\nimport { resolve } from \"node:path\";\nimport { ZDir } from \"../dir/dir.js\";\n\nexport abstract class ZRomulatorConfigKnown {\n public static all() {\n return [ZRomulatorConfigKnown.games(), ZRomulatorConfigKnown.media()];\n }\n\n private static create(id: ZRomulatorConfigId) {\n const file = resolve(ZDir.configs(), `${id}.json`);\n return new ZRomulatorConfigBuilder().id(id).file(file);\n }\n\n public static games() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Games)\n .name(\"Game Settings\")\n .description(\"Modify where your games are stored and related settings\")\n .avatar(\"gamepad\")\n .metadata(ZRomulatorConfigGamesMetadata.all())\n .build();\n }\n\n public static media() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Media)\n .name(\"Media Settings\")\n .description(\"Modify where media is stored and what media to retrieve\")\n .avatar(\"image\")\n .metadata(ZRomulatorConfigMediaMetadata.all())\n .build();\n }\n}\n","import {\n Inject,\n Injectable,\n InternalServerErrorException,\n NotFoundException,\n} from \"@nestjs/common\";\nimport { createError, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport type { IZLogger } from \"@zthun/lumberjacky-log\";\nimport { ZLogEntryBuilder, ZLoggerContext } from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigBuilder } from \"@zthun/romulator-client\";\nimport type { IZRestfulGet, IZRestfulUpdate } from \"@zthun/webigail-rest\";\nimport { find } from \"lodash-es\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"./config-known.mjs\";\n\nexport const ZRomulatorConfigsToken = Symbol(\"configs\");\n\nexport interface IZRomulatorConfigsService\n extends IZRestfulUpdate<IZRomulatorConfig>,\n IZRestfulGet<IZRomulatorConfig> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>>;\n}\n\n@Injectable()\nexport class ZRomulatorConfigsService implements IZRomulatorConfigsService {\n private _logger: IZLogger;\n\n public constructor(@Inject(ZLoggerToken) _logger: IZLogger) {\n this._logger = new ZLoggerContext(\"ZRomulatorConfigsService\", _logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving configs page, ${page}, with size, ${size}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const configs = ZRomulatorConfigKnown.all();\n const options = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic<IZRomulatorConfig>(configs, options);\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n msg = `Responding with ${data.length} configs out of ${count} total`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return new ZPageBuilder<IZRomulatorConfig>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get<T>(\n id: ZRomulatorConfigId,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this._find(id);\n let msg = `Attempting to read the file contents for config, ${id}.`;\n let contents: any = {};\n\n try {\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const buffer = await readFile(config.file);\n const json = buffer.toString(\"utf-8\");\n contents = JSON.parse(json);\n msg = `Finished reading config contents (${buffer.byteLength} bytes)`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n } catch (e) {\n msg = createError(e).message;\n this._logger.log(new ZLogEntryBuilder().warning().message(msg).build());\n }\n\n const result = new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(contents)\n .build();\n\n return Promise.resolve(result as Required<IZRomulatorConfig<T>>);\n }\n\n public async update<T>(\n id: ZRomulatorConfigId,\n record: Pick<IZRomulatorConfig, \"contents\">,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this.get<T>(id);\n\n let msg = `Updating config file, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const next = { ...config.contents, ...record.contents };\n const json = JSON.stringify(next);\n\n try {\n await mkdir(dirname(config.file), { recursive: true });\n await writeFile(config.file, json);\n return new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(next)\n .build() as Required<IZRomulatorConfig<T>>;\n } catch (e) {\n const error = createError(e);\n msg = `Unable to write to, ${config.file}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n msg = error.message;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new InternalServerErrorException(error));\n }\n }\n\n private async _find(id: ZRomulatorConfigId): Promise<IZRomulatorConfig> {\n let msg = `Attempting to retrieve config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const configs = ZRomulatorConfigKnown.all();\n const config = find(configs, (c) => c.id === id);\n\n if (config == null) {\n msg = `Could not find config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new NotFoundException(msg));\n }\n\n msg = `Config, ${id}, found`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return config;\n }\n}\n","import {\n Body,\n Controller,\n Get,\n Inject,\n Param,\n Patch,\n Query,\n UsePipes,\n ValidationPipe,\n} from \"@nestjs/common\";\nimport { ApiBody, ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigUpdateDto } from \"./config-update.mjs\";\nimport type { IZRomulatorConfigsService } from \"./configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"./configs-service.mjs\";\n\n@Controller(\"configs\")\nexport class ZRomulatorConfigsController {\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n ) {}\n\n @Get()\n public async list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorConfig>> {\n const request = new ZDataRequestBuilder().query(query).build();\n return this._configs.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @ApiBody({\n type: ZRomulatorConfigUpdateDto,\n })\n @Patch(\":identification\")\n @UsePipes(\n new ValidationPipe({\n transform: true,\n whitelist: true,\n skipMissingProperties: false,\n skipNullProperties: false,\n skipUndefinedProperties: false,\n }),\n )\n public async update(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n @Body() payload: ZRomulatorConfigUpdateDto,\n ): Promise<IZRomulatorConfig> {\n return this._configs.update(identification, payload);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n ): Promise<IZRomulatorConfig> {\n return await this._configs.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsController } from \"./configs-controller.mjs\";\nimport {\n ZRomulatorConfigsService,\n ZRomulatorConfigsToken,\n} from \"./configs-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorConfigsController],\n providers: [\n { provide: ZRomulatorConfigsToken, useClass: ZRomulatorConfigsService },\n ],\n exports: [ZRomulatorConfigsToken],\n})\nexport class ZRomulatorConfigsModule {}\n","import { isTagged, ZTag } from \"@zthun/helpful-reflection\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorSystemBuilder,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport \"reflect-metadata\";\n\nconst KnownSystem = \"@zthunworks/romulator/known-system\";\n\n/**\n * A helper factory class for creating supported systems.\n */\nexport abstract class ZRomulatorSystemKnown {\n /**\n * Returns all known systems.\n *\n * @returns\n * All supported systems.\n */\n public static all() {\n const properties = Object.getOwnPropertyNames(ZRomulatorSystemKnown);\n const methods = properties\n .filter((p) => isTagged(KnownSystem, ZRomulatorSystemKnown, p))\n .map((p) => ZRomulatorSystemKnown[p])\n .map((f) => f as () => IZRomulatorSystem);\n return methods.map((m) => m.call(null));\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Entertainment System (NES).\n *\n * @returns\n * A {@link ZRomulatorSystemBuilder} instance that has\n * built the nes.\n */\n @ZTag(KnownSystem)\n public static nes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo)\n .console()\n .name(\"Nintendo Entertainment System\")\n .alias(\"Famicom\")\n .alias(\"NES\")\n .alias(\"Hyundai Comboy\")\n .alias(\"Samurai Electronic TV Game System\")\n .alias(\"Dendy\")\n .generation(3)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Super\n * Nintendo Entertainment System (SNES).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static snes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.SuperNintendo)\n .console()\n .name(\"Super Nintendo Entertainment System\")\n .alias(\"Super Nintendo\")\n .alias(\"Super Famicom\")\n .alias(\"SNES\")\n .alias(\"Super NES\")\n .alias(\"Super Comboy\")\n .generation(4)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * 64 (N64).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static n64() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo64)\n .console()\n .name(\"Nintendo 64\")\n .alias(\"N64\")\n .alias(\"Ultra 64\")\n .alias(\"Hyundai Comboy 64\")\n .generation(5)\n .manufacturer(\"Nintendo\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * GameCube (GC).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static gc() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.GameCube)\n .console()\n .name(\"Nintendo GameCube\")\n .alias(\"GameCube\")\n .alias(\"Dolphin\")\n .generation(6)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii (Wii).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wii() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Wii)\n .console()\n .name(\"Nintendo Wii\")\n .alias(\"Wii\")\n .alias(\"Revolution\")\n .generation(7)\n .manufacturer(\"Foxconn\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii U (WiiU).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wiiu() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.WiiU)\n .console()\n .name(\"Nintendo Wii U\")\n .alias(\"WiiU\")\n .alias(\"Project Cafe\")\n .generation(8)\n .manufacturer(\"Nintendo\")\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Mitsumi\")\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Switch (Switch).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static switch() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Switch)\n .console()\n .name(\"Nintendo Switch\")\n .alias(\"Switch\")\n .alias(\"NX\")\n .alias(\"HAC\")\n .alias(\"Odin\")\n .generation(9)\n .manufacturer(\"Foxconn\")\n .manufacturer(\"Hosiden\")\n .build();\n }\n\n /**\n * Creates a system from an id slug.\n *\n * @param id -\n * The id slug of the system to create.\n *\n * @return\n * The system, or null if the id is not known.\n */\n public static from(id: string): IZRomulatorSystem | null {\n if (isTagged(KnownSystem, ZRomulatorSystemKnown, id)) {\n return ZRomulatorSystemKnown[id]();\n }\n\n return null;\n }\n}\n","import { firstTruthy } from \"@zthun/helpful-fn\";\nimport type { IZDataMatch } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\n/**\n * A data match function which matches a string (search) filter\n * to a game's name, system slug, or system name.\n */\nexport class ZRomulatorDataMatchGame\n implements IZDataMatch<IZRomulatorGame, string>\n{\n public match(data: IZRomulatorGame, filter: string): boolean {\n const needle = filter?.trim().toLowerCase();\n const { name = \"\", system = \"\" } = data;\n const target = ZRomulatorSystemKnown.from(system);\n const systemName = firstTruthy(\"\", target?.name);\n\n if (!needle?.length) {\n return true;\n }\n\n return [name, system, systemName]\n .filter((s) => s.length)\n .some((k) => k.toLowerCase().includes(needle));\n }\n}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorGame,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorGameBuilder,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { kebabCase } from \"lodash-es\";\nimport { basename, dirname, parse } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\nimport { ZRomulatorDataMatchGame } from \"./data-match-game.mjs\";\n\nexport const ZRomulatorGamesToken = Symbol(\"romulator-games-service\");\n\nexport interface IZRomulatorGamesService extends IZRestfulGet<IZRomulatorGame> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>>;\n}\n\n@Injectable()\nexport class ZRomulatorGamesService implements IZRomulatorGamesService {\n private readonly _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorGamesService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>> {\n const config = ZRomulatorConfigKnown.games();\n const { contents } = await this._config.get(config.id);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n\n const cwd = detokenize(firstDefined(fallback, gamesFolder), process.env);\n const time = new Date();\n\n let msg = `Searching for games in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const systems = ZRomulatorSystemKnown.all().map((system) => system.id);\n const glob = `{${systems.join(\",\")}}/**/*.zip`;\n const nodes = await this._file.search(glob, { cwd, stat: false });\n const span = new Date().getTime() - time.getTime();\n\n msg = `Found ${nodes.length} games. Search took ${span} milliseconds.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const games = nodes.map(({ path }) => {\n const dir = basename(dirname(path)) as ZRomulatorSystemId;\n const { name: file } = parse(path);\n const id = `${dir}-${kebabCase(file)}`;\n\n return new ZRomulatorGameBuilder()\n .id(id)\n .system(dir)\n .file(path)\n .name(file)\n .build();\n });\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorGame>()\n .search(new ZRomulatorDataMatchGame())\n .build();\n const source = new ZDataSourceStatic(games, options);\n\n const $sort = new ZSortBuilder()\n .sorts(firstDefined([], req.sort))\n .ascending(\"system\")\n .ascending(\"name\")\n .build();\n const $request = new ZDataRequestBuilder().copy(req).sort($sort).build();\n\n const data = await source.retrieve($request);\n const count = await source.count($request);\n\n return new ZPageBuilder().count(count).data(data).build();\n }\n\n public async get(id: string): Promise<IZRomulatorGame> {\n const { data: games } = await this.list(new ZDataRequestBuilder().build());\n const match = games.find((game) => game.id === id);\n\n if (!match) {\n throw new NotFoundException(`Unable to find game with id, ${id}.`);\n }\n\n return match;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport type { IZRomulatorGamesService } from \"./games-service.mjs\";\nimport { ZRomulatorGamesToken } from \"./games-service.mjs\";\n\n@Controller(\"games\")\nexport class ZRomulatorGamesController {\n public constructor(\n @Inject(ZRomulatorGamesToken)\n private readonly _games: IZRomulatorGamesService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorGame>> {\n return this._games.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._games.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesController } from \"./games-controller.mjs\";\nimport {\n ZRomulatorGamesService,\n ZRomulatorGamesToken,\n} from \"./games-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorGamesController],\n providers: [\n {\n provide: ZRomulatorGamesToken,\n useClass: ZRomulatorGamesService,\n },\n ],\n})\nexport class ZRomulatorGamesModule {}\n","import {\n ForbiddenException,\n Inject,\n Injectable,\n NotAcceptableException,\n NotFoundException,\n StreamableFile,\n} from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport {\n createError,\n detokenize,\n firstDefined,\n firstTruthy,\n} from \"@zthun/helpful-fn\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n type IZDataRequest,\n type IZPage,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport {\n ZRomulatorConfigMediaBuilder,\n ZRomulatorMediaBuilder,\n type IZRomulatorMedia,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulDelete, IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { ZMimeTypeApplication } from \"@zthun/webigail-url\";\nimport { findIndex } from \"lodash-es\";\nimport { lookup } from \"mime-types\";\nimport { createReadStream } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport { env } from \"node:process\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\nexport const ZRomulatorMediaToken = Symbol(\"romulator-media-service\");\n\nexport interface IZRomulatorMediaService\n extends IZRestfulGet<IZRomulatorMedia>,\n IZRestfulDelete {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>>;\n download(id: string, accept: string): Promise<StreamableFile>;\n}\n\n@Injectable()\nexport class ZRomulatorMediaService implements IZRomulatorMediaService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken) private _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken) private _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorMediaService\", logger);\n }\n\n private async getMediaFolder(): Promise<string> {\n const mediaConfig = ZRomulatorConfigKnown.media();\n const { contents } = await this._config.get(mediaConfig.id);\n const { mediaFolder } = new ZRomulatorConfigMediaBuilder()\n .copy(contents)\n .build();\n\n return detokenize(mediaFolder, env);\n }\n\n private async findAllMedia(cwd: string): Promise<IZRomulatorMedia[]> {\n const systems = ZRomulatorSystemKnown.all()\n .map((s) => s.id)\n .join(\",\");\n const glob = `{${systems}}/**`;\n\n const files = await this._file.search(glob, { cwd, stat: false });\n\n return files\n .map((f) => new ZRomulatorMediaBuilder().from(f.path).build())\n .filter((media) => !!media.id);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>> {\n const cwd = await this.getMediaFolder();\n\n let msg = `Reading all media from ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const time = new Date();\n const mediaList = await this.findAllMedia(cwd);\n const span = new Date().getTime() - time.getTime();\n msg = `Found ${mediaList.length} media files. Search took ${span} milliseconds`;\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorMedia>()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic(mediaList, options);\n const page = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorMedia>().data(page).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorMedia> {\n const cwd = await this.getMediaFolder();\n\n const time = new Date();\n let log = `Searching for media with id ${id}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const mediaList = await this.findAllMedia(cwd);\n const index = findIndex(mediaList, (m) => m.id === id);\n const span = new Date().getTime() - time.getTime();\n\n if (index < 0) {\n const msg = `Could not find any media with id, ${id}.`;\n log = `${msg} Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().warning().message(log).build());\n throw new NotFoundException(msg);\n }\n\n const media = mediaList[index];\n log = `Found media, ${media.url} after ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return media;\n }\n\n public async download(id: string, accept: string): Promise<StreamableFile> {\n let log = `Download request received for ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const fallback = ZMimeTypeApplication.OctetStream;\n const { fileName, url } = await this.get(id);\n const lookupResult = lookup(firstDefined(\"\", fileName));\n const mime = firstTruthy(fallback, lookupResult) as string;\n const accepts = accept.split(\",\").map((h) => h.split(\";\")[0].trim());\n\n const acceptable = accepts.some((a) => {\n if (a === \"*/*\") {\n return true;\n }\n if (a.endsWith(\"/*\")) {\n return mime.startsWith(a.slice(0, -1));\n }\n return a === mime;\n });\n\n if (!acceptable) {\n const msg =\n `The media requested is of type ${mime}. ` +\n `The request only accepts ${accept}.`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n throw new NotAcceptableException(msg);\n }\n\n log = `Streaming ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return new StreamableFile(createReadStream(firstDefined(\"\", url)), {\n type: mime,\n disposition: `inline; filename=${fileName}`,\n });\n }\n\n public async delete(id: string): Promise<void> {\n const { url } = await this.get(id);\n const _url = firstDefined(\"\", url);\n\n let log = `Attempting to delete file ${_url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n try {\n await unlink(_url);\n } catch (err) {\n const { message } = createError(err);\n this._logger.log(new ZLogEntryBuilder().error().message(message).build());\n throw new ForbiddenException(message);\n }\n\n log = `Deleted ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n }\n}\n","import {\n Controller,\n Delete,\n Get,\n Inject,\n Param,\n Query,\n Req,\n} from \"@nestjs/common\";\nimport { ApiParam, ApiResponse } from \"@nestjs/swagger\";\nimport {\n ZDataRequestBuilder,\n type IZDataRequestQuery,\n} from \"@zthun/helpful-query\";\nimport { ZHttpCodeClient, ZHttpCodeSuccess } from \"@zthun/webigail-http\";\nimport type { Request } from \"express\";\nimport type { IZRomulatorMediaService } from \"./media-service.mjs\";\nimport { ZRomulatorMediaToken } from \"./media-service.mjs\";\n\n@Controller(\"media\")\nexport class ZRomulatorMediaController {\n public constructor(\n @Inject(ZRomulatorMediaToken)\n private _media: IZRomulatorMediaService,\n ) {}\n\n @Get()\n public list(@Query() params: IZDataRequestQuery) {\n const request = new ZDataRequestBuilder().query(params).build();\n return this._media.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the media\",\n content: {\n \"*/*\": {},\n \"image/*\": {},\n \"image/png\": {},\n \"image/jpeg\": {},\n \"application/mp4\": {},\n \"application/json\": {},\n },\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotFound,\n description: \"Media not found\",\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotAcceptable,\n description: \"Unsupported Accept header\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: string,\n @Req() req: Request,\n ) {\n const { accept = \"*/*\" } = req.headers;\n\n return accept.includes(\"application/json\")\n ? this._media.get(identification)\n : this._media.download(identification, accept);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @Delete(\":identification\")\n public async delete(@Param(\"identification\") identification: string) {\n await this._media.delete(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorMediaController } from \"./media-controller.mjs\";\nimport {\n ZRomulatorMediaService,\n ZRomulatorMediaToken,\n} from \"./media-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZRomulatorConfigsModule, ZLoggerModule],\n controllers: [ZRomulatorMediaController],\n providers: [\n { provide: ZRomulatorMediaToken, useClass: ZRomulatorMediaService },\n ],\n})\nexport class ZRomulatorMediaModule {}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { find } from \"lodash-es\";\nimport { basename } from \"node:path\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"./system-known.mjs\";\n\nexport const ZRomulatorSystemsToken = Symbol(\"romulator-systems-service\");\n\nexport interface IZRomulatorSystemsService {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>>;\n get(id: string): Promise<IZRomulatorSystem>;\n}\n\n@Injectable()\nexport class ZRomulatorSystemsService implements IZRomulatorSystemsService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) readonly logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorSystemsService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving systems page, ${page}, with size, ${size}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const { contents } = await this._configs.get(ZRomulatorConfigId.Games);\n const { gamesFolder } = contents;\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n const _folder = firstDefined(fallback, gamesFolder);\n\n const cwd = detokenize(_folder, process.env);\n msg = `Looking for systems in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const searchOptions = { cwd };\n const folders = await this._file.search(\"*/\", searchOptions);\n\n const systems = folders\n .map((folder) => folder.path)\n .map((path) => basename(path))\n .map((slug) => ZRomulatorSystemKnown.from(slug))\n .filter((system) => system != null);\n\n msg = `Found ${systems.length} systems`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const sourceOptions = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields([\"id\", \"name\", \"short\"]))\n .build();\n\n const source = new ZDataSourceStatic<IZRomulatorSystem>(\n systems,\n sourceOptions,\n );\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder().data(data).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorSystem> {\n const all = await this.list(new ZDataRequestBuilder().build());\n const system = find(all.data, (system) => system.id === id);\n\n if (!system) {\n throw new NotFoundException(`Unable to find system with id, ${id}.`);\n }\n\n return system;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport { ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport type { IZRomulatorSystemsService } from \"./systems-service.mjs\";\nimport { ZRomulatorSystemsToken } from \"./systems-service.mjs\";\n\n@Controller(\"systems\")\nexport class ZRomulatorSystemsController {\n public constructor(\n @Inject(ZRomulatorSystemsToken)\n private readonly _systems: IZRomulatorSystemsService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorSystem>> {\n return this._systems.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the system\",\n })\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._systems.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorSystemsController } from \"./systems-controller.mjs\";\nimport {\n ZRomulatorSystemsService,\n ZRomulatorSystemsToken,\n} from \"./systems-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorSystemsController],\n providers: [\n { provide: ZRomulatorSystemsToken, useClass: ZRomulatorSystemsService },\n ],\n})\nexport class ZRomulatorSystemsModule {}\n","/* istanbul ignore file -- @preserve */\nimport { Module } from \"@nestjs/common\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesModule } from \"../games/games-module.mjs\";\nimport { ZRomulatorMediaModule } from \"../media/media-module.mjs\";\nimport { ZRomulatorSystemsModule } from \"../systems/systems-module.mjs\";\n\n@Module({\n imports: [\n ZRomulatorSystemsModule,\n ZRomulatorConfigsModule,\n ZRomulatorMediaModule,\n ZRomulatorGamesModule,\n ],\n})\nexport class ZRomulatorModule {}\n","import { NestFactory } from \"@nestjs/core\";\nimport { DocumentBuilder, SwaggerModule } from \"@nestjs/swagger\";\nimport { ZRomulatorModule } from \"./app/app-module.mjs\";\n\nconst PORT = 3000;\n\n(async function () {\n const app = await NestFactory.create(ZRomulatorModule);\n app.setGlobalPrefix(\"api\");\n app.enableCors();\n\n const config = new DocumentBuilder()\n .setTitle(\"Romulator API\")\n .setDescription(\"The Romulator API\")\n .setVersion(\"1\")\n .build();\n\n const document = () => SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n await app.listen(PORT);\n})();\n"],"names":["ZRomulatorConfigUpdateDto","contents","type","properties","message","ZDir","application","resolve","homedir","configs","ZRomulatorConfigKnown","all","games","media","create","id","file","ZRomulatorConfigBuilder","ZRomulatorConfigId","Games","name","description","avatar","metadata","ZRomulatorConfigGamesMetadata","build","Media","ZRomulatorConfigMediaMetadata","ZRomulatorConfigsToken","Symbol","ZRomulatorConfigsService","_logger","ZLoggerContext","list","req","page","firstDefined","size","Infinity","msg","log","ZLogEntryBuilder","info","options","ZDataSourceStaticOptionsBuilder","search","ZDataSearchFields","source","ZDataSourceStatic","data","retrieve","count","length","ZPageBuilder","get","config","_find","buffer","readFile","json","toString","JSON","parse","byteLength","e","createError","warning","result","copy","Promise","update","record","next","stringify","mkdir","dirname","recursive","writeFile","error","reject","InternalServerErrorException","find","c","NotFoundException","ZRomulatorConfigsController","_configs","request","ZDataRequestBuilder","query","payload","identification","ValidationPipe","transform","whitelist","skipMissingProperties","skipNullProperties","skipUndefinedProperties","ZRomulatorConfigsModule","imports","ZFileSystemModule","ZLoggerModule","controllers","providers","provide","useClass","exports","KnownSystem","ZRomulatorSystemKnown","Object","getOwnPropertyNames","methods","filter","p","isTagged","map","f","m","call","nes","ZRomulatorSystemBuilder","ZRomulatorSystemId","Nintendo","console","alias","generation","manufacturer","snes","SuperNintendo","n64","Nintendo64","gc","GameCube","wii","Wii","wiiu","WiiU","switch","Switch","from","ZRomulatorDataMatchGame","match","needle","trim","toLowerCase","system","target","systemName","firstTruthy","s","some","k","includes","ZRomulatorGamesToken","ZRomulatorGamesService","_file","_config","logger","gamesFolder","ZRomulatorConfigGamesBuilder","fallback","cwd","detokenize","process","env","time","Date","systems","glob","join","nodes","stat","span","getTime","path","dir","basename","kebabCase","ZRomulatorGameBuilder","$sort","ZSortBuilder","sorts","sort","ascending","$request","game","ZRomulatorGamesController","_games","ZRomulatorGamesModule","ZRomulatorMediaToken","ZRomulatorMediaService","getMediaFolder","mediaConfig","mediaFolder","ZRomulatorConfigMediaBuilder","findAllMedia","files","ZRomulatorMediaBuilder","mediaList","index","findIndex","url","download","accept","ZMimeTypeApplication","OctetStream","fileName","lookupResult","lookup","mime","accepts","split","h","acceptable","a","endsWith","startsWith","slice","NotAcceptableException","StreamableFile","createReadStream","disposition","delete","_url","unlink","err","ForbiddenException","ZRomulatorMediaController","_media","params","headers","status","ZHttpCodeSuccess","OK","content","ZHttpCodeClient","NotFound","NotAcceptable","ZRomulatorMediaModule","ZRomulatorSystemsToken","ZRomulatorSystemsService","_folder","searchOptions","folders","folder","slug","sourceOptions","ZRomulatorSystemsController","_systems","ZRomulatorSystemsModule","ZRomulatorModule","PORT","app","NestFactory","setGlobalPrefix","enableCors","DocumentBuilder","setTitle","setDescription","setVersion","document","SwaggerModule","createDocument","setup","listen"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zthun/romulator-api",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "A service for your rom directory for managing media and the directory structure.",
5
5
  "author": "Anthony Bonta",
6
6
  "license": "MIT",
@@ -27,12 +27,12 @@
27
27
  "@nestjs/swagger": "^11.2.0",
28
28
  "@zthun/crumbtrail-fs": "^2.1.4",
29
29
  "@zthun/crumbtrail-nest": "^2.1.4",
30
- "@zthun/helpful-fn": "^9.4.5",
31
- "@zthun/helpful-query": "^9.5.0",
32
- "@zthun/helpful-reflection": "^9.4.5",
30
+ "@zthun/helpful-fn": "^9.6.0",
31
+ "@zthun/helpful-query": "^9.6.0",
32
+ "@zthun/helpful-reflection": "^9.6.0",
33
33
  "@zthun/lumberjacky-log": "^3.0.6",
34
34
  "@zthun/lumberjacky-nest": "^3.0.6",
35
- "@zthun/romulator-client": "^1.4.0",
35
+ "@zthun/romulator-client": "^1.5.0",
36
36
  "@zthun/webigail-http": "^4.0.8",
37
37
  "@zthun/webigail-rest": "^4.0.8",
38
38
  "@zthun/webigail-url": "^4.0.8",
@@ -54,7 +54,7 @@
54
54
  "supertest": "^7.1.4",
55
55
  "tsx": "^4.20.6",
56
56
  "typescript": "^5.9.3",
57
- "vite": "^7.1.9",
57
+ "vite": "^7.1.10",
58
58
  "vitest": "^3.2.4",
59
59
  "vitest-mock-extended": "^3.1.0"
60
60
  },
@@ -62,5 +62,5 @@
62
62
  "dist"
63
63
  ],
64
64
  "sideEffects": false,
65
- "gitHead": "1074a358943150732e7fff33a8555e1b0490aab5"
65
+ "gitHead": "9c359c7ae547a644301763c746d6bcebde5469ac"
66
66
  }