coh-content-db 2.0.0-rc.4 → 2.0.0-rc.5

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.
Files changed (37) hide show
  1. package/README.md +28 -4
  2. package/dist/coh-content-db.d.ts +189 -68
  3. package/dist/coh-content-db.js +323 -229
  4. package/dist/coh-content-db.js.map +1 -1
  5. package/dist/coh-content-db.mjs +317 -228
  6. package/dist/coh-content-db.mjs.map +1 -1
  7. package/package.json +1 -4
  8. package/src/main/api/alternate-data.ts +2 -2
  9. package/src/main/api/badge-data.ts +5 -10
  10. package/src/main/api/badge-partial-data.ts +6 -5
  11. package/src/main/api/change.ts +5 -2
  12. package/src/main/api/content-bundle.ts +2 -3
  13. package/src/main/api/markdown-string.ts +4 -0
  14. package/src/main/api/vidiot-map-point-of-interest-data.ts +3 -3
  15. package/src/main/changelog.ts +3 -2
  16. package/src/main/db/alignments.ts +17 -0
  17. package/src/main/db/alternates.ts +8 -14
  18. package/src/main/db/badge-index.ts +87 -0
  19. package/src/main/db/badge-partial.ts +54 -6
  20. package/src/main/db/badge-search-options.ts +51 -0
  21. package/src/main/db/badge.ts +8 -13
  22. package/src/main/db/bundle-metadata.ts +2 -3
  23. package/src/main/db/coh-content-database.ts +17 -25
  24. package/src/main/db/paged.ts +7 -0
  25. package/src/main/db/vidiot-map-point-of-interest.ts +2 -3
  26. package/src/main/index.ts +7 -1
  27. package/src/main/util.ts +36 -6
  28. package/src/test/api/alignments.test.ts +40 -0
  29. package/src/test/api/badge-partial-data.fixture.ts +1 -1
  30. package/src/test/db/alternates.test.ts +16 -74
  31. package/src/test/db/badge-index.test.ts +488 -0
  32. package/src/test/db/coh-content-database.test.ts +15 -0
  33. package/src/test/index.test.ts +4 -2
  34. package/src/test/util.test.ts +49 -13
  35. package/src/main/db/badge-search-document.ts +0 -16
  36. package/src/test/db/badge-search-document.test.ts +0 -35
  37. package/src/test/db/coh-content-database-search.test.ts +0 -119
@@ -1 +1 @@
1
- {"version":3,"file":"coh-content-db.mjs","sources":["../src/main/api/alignment.ts","../src/main/api/badge-partial-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/plaque-type.ts","../src/main/api/sex.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/db/badge-partial.ts","../src/main/db/alternates.ts","../src/main/db/badge.ts","../src/main/db/vidiot-map-point-of-interest.ts","../src/main/db/vidiot-map.ts","../src/main/db/game-map.ts","../src/main/db/bundle-metadata.ts","../src/main/db/badge-search-document.ts","../src/main/db/coh-content-database.ts","../src/main/changelog.ts","../src/main/util.ts"],"sourcesContent":["export const ALIGNMENT = ['H', 'V', 'P'] as const\n\nexport type Alignment = typeof ALIGNMENT[number]\n","export const BADGE_PARTIAL_TYPE = [\n 'PLAQUE',\n 'BADGE',\n 'INVENTION',\n 'INVENTION_PLUS_ONE', // Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n] as const\n\nexport type BadgePartialType = typeof BADGE_PARTIAL_TYPE[number]\n","export const BADGE_TYPE = [\n 'EXPLORATION',\n 'HISTORY',\n 'ACCOMPLISHMENT',\n 'ACHIEVEMENT',\n 'ACCOLADE',\n 'GLADIATOR',\n 'VETERAN',\n 'PVP',\n 'INVENTION',\n 'DEFEAT',\n 'EVENT',\n 'OUROBOROS',\n 'CONSIGNMENT',\n 'DAY_JOB',\n 'AE',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'DEFENSE_DEBUFF',\n 'TO_HIT_DEBUFF',\n 'TAUNT',\n 'CONFUSE',\n 'HEALING',\n 'DEFENSE_BUFF',\n 'RESIST_DAMAGE',\n 'INTANGIBILITY',\n 'SLEEP',\n 'SLOW',\n 'HOLD',\n 'STUN',\n 'IMMOBILIZE',\n 'FEAR',\n 'ENDURANCE_MODIFICATION',\n 'ENDURANCE_REDUCTION',\n 'RECHARGE_REDUCTION',\n 'INTERRUPT_DURATION',\n 'ACCURACY',\n 'TO_HIT_BUFF',\n 'DAMAGE',\n 'KNOCKBACK',\n 'RUN_SPEED',\n 'JUMP',\n 'FLY_SPEED',\n 'RANGE',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const PLAQUE_TYPE = [\n 'WALL_PLAQUE',\n 'MONUMENT',\n]\n\nexport type PlaqueType = typeof PLAQUE_TYPE[number]\n","export const SEX = ['M', 'F'] as const\n\nexport type Sex = typeof SEX[number]\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","import { BadgePartialData } from '../api/badge-partial-data'\nimport { PlaqueType } from '../api/plaque-type'\nimport { BadgePartialType } from '../api/badge-partial-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\n\nexport class BadgePartial {\n readonly key: string\n readonly type: BadgePartialType | string\n readonly mapKey?: string\n readonly loc?: number[]\n readonly plaqueType?: PlaqueType | string\n readonly inscription?: string\n readonly vidiotMapKey?: string\n readonly badgeKey?: string\n readonly inventionLevel?: number\n readonly inventionTypes?: (EnhancementCategory | string)[]\n readonly inventionCount?: number\n readonly notes?: string\n\n constructor(data: BadgePartialData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.mapKey = data.mapKey\n this.loc = data.loc\n this.plaqueType = data.plaqueType\n this.inscription = data.inscription\n this.vidiotMapKey = data.vidiotMapKey\n this.badgeKey = data.badgeKey\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.inventionCount = data.inventionCount\n this.notes = data.notes\n }\n}\n","import { AlternateData } from '../api/alternate-data'\nimport { Sex } from '../api/sex'\nimport { Alignment } from '../api/alignment'\n\nconst ALIGNMENT_SORT: Record<string, number> = { H: 2, V: 1, P: 0 }\nconst SEX_SORT: Record<string, number> = { M: 1, F: 0 }\n\nexport class Alternates<T> {\n readonly #sortedValues: AlternateData<T>[] = []\n\n constructor(values: AlternateData<T>[]) {\n this.#sortedValues = values.sort()\n this.#sortedValues.sort((a, b) => this.#compareAlternates(a, b))\n }\n\n getValue(alignment?: Alignment | string, sex?: Sex | string): T | undefined {\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry.value\n }\n\n return this.default\n }\n\n /**\n * Get the default value for this list of alternates, the value with the highest priority and lowest specificity.\n */\n get default(): T | undefined {\n return this.#sortedValues[0]?.value\n }\n\n /**\n * Get the list of alternates sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): AlternateData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the alternate values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareAlternates(a: AlternateData<T>, b: AlternateData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = this.#compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = this.#compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n\n #compareAlignment(a: Alignment | string | undefined, b: Alignment | string | undefined): number {\n if (a === b) return 0\n if (a === undefined && b !== undefined) return -1\n if (b === undefined && a !== undefined) return 1\n\n const aSort = a === undefined ? -1 : ALIGNMENT_SORT[a] ?? -1 // Unknown values get -1 priority\n const bSort = b === undefined ? -1 : ALIGNMENT_SORT[b] ?? -1\n\n if (aSort !== bSort) return bSort - aSort\n\n // Unknown values (not in ALIGNMENT_SORT) are sorted alphabetically\n return a?.localeCompare(b ?? '') ?? 0\n }\n\n #compareSex(a?: Sex | string | undefined, b?: Sex | string | undefined): number {\n if (a === b) return 0\n if (a === undefined && b !== undefined) return -1\n if (b === undefined && a !== undefined) return 1\n\n const aSort = SEX_SORT[a ?? -1] ?? -1 // Unknown values get -1 priority\n const bSort = SEX_SORT[b ?? -1] ?? -1\n\n if (aSort !== bSort) return bSort - aSort\n\n // Unknown values (not in SEX_SORT) are sorted alphabetically\n return a?.localeCompare(b ?? '') ?? 0\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Alignment } from '../api/alignment'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgePartial } from './badge-partial'\nimport { Key } from './key'\nimport { Alternates } from './alternates'\n\nexport class Badge {\n readonly #partialsIndex: Record<string, BadgePartial> = {}\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType | string\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Alternates<string>\n\n /**\n * The character alignments that this badge is available to.\n */\n readonly alignment: Alignment[]\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Alternates<string>\n\n /**\n * Description of how to acquire the badge.\n *\n * Supports {@link https://www.markdownguide.org/|Markdown} format.\n */\n readonly acquisition?: string\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Alternates<string>\n\n /**\n * Freeform notes or tips about the badge.\n *\n * Supports {@link https://www.markdownguide.org/|Markdown} format.\n */\n readonly notes?: string\n\n /**\n * List of external links for this Badge. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n /**\n * For exploration badges, the key of the {@link GameMap} that this badge is found on.\n */\n readonly mapKey?: string\n\n /**\n * For exploration badges, the `/loc` coordinates of the badge on the in-game map.\n */\n readonly loc?: [number, number, number]\n\n /**\n * For badges that appear on a Vidiot Map, the number or letter the badge appears as.\n */\n readonly vidiotMapKey?: string\n\n /**\n * ID used with the in-game `/settitle` command to apply the badge.\n */\n readonly setTitle?: {\n /**\n * `/settitle` id.\n */\n id?: number\n /**\n * `/settitle` id if different for praetorian characters.\n */\n praetorianId?: number\n }\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n *\n * Supports {@link https://www.markdownguide.org/|Markdown} format.\n */\n readonly effect?: string\n\n /**\n * A list of requirements for badges that have partial fulfilment steps, such as visiting plaques for history badges, or collecting other badges for meta-badges like accolades.\n */\n readonly partials?: BadgePartial[]\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(data: BadgeData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.name = new Alternates(data.name)\n this.alignment = data.alignment\n this.badgeText = new Alternates(data.badgeText ?? [])\n this.acquisition = data.acquisition\n this.icon = new Alternates(data.icon ?? [])\n this.notes = data.notes\n this.links = data.links\n this.mapKey = data.mapKey\n this.loc = data.loc\n this.effect = data.effect\n this.vidiotMapKey = data.vidiotMapKey\n this.setTitle = data.setTitle\n this.ignoreInTotals = data.ignoreInTotals ?? false\n\n this.partials = data.partials?.map((data) => {\n if (this.#partialsIndex[data.key] !== undefined) throw new Error(`Duplicate badge partial key [${data.key}]`)\n const badge = new BadgePartial(data)\n this.#partialsIndex[badge.key] = badge\n return badge\n })\n }\n\n getPartial(key: string): BadgePartial {\n const result = this.#partialsIndex[key]\n if (result === undefined) throw new Error(`Unknown badge partial key [${key}]`)\n return result\n }\n}\n","import { VidiotMapPointOfInterestData } from '../api/vidiot-map-point-of-interest-data'\n\nexport class VidiotMapPointOfInterest {\n /**\n * The pixel-space position of the PoI on the map graphic.\n *\n * Screen-space, pixels from top-left `[0, 0]`.\n */\n readonly pos?: [number, number]\n\n /**\n * Freeform notes about the PoI.\n *\n * Supports {@link https://www.markdownguide.org/|Markdown} format.\n */\n readonly notes?: string\n\n /**\n * If the POI is a zone transfer, the map it transfers to.\n */\n readonly mapKey?: string\n\n /**\n * If the POI is a badge, the badge.\n */\n readonly badgeKey?: string\n\n /**\n * If the POI is a partial for a badge, the partial key.\n */\n readonly badgePartialKey?: string\n\n constructor(data: VidiotMapPointOfInterestData) {\n this.pos = data.pos\n this.notes = data.notes\n this.mapKey = data.mapKey\n this.badgeKey = data.badgeKey\n this.badgePartialKey = data.badgePartialKey\n }\n}\n","import { VidiotMapData } from '../api/vidiot-map-data'\nimport { VidiotMapPointOfInterest } from './vidiot-map-point-of-interest'\n\nexport class VidiotMap {\n /**\n * URL of the map image.\n */\n readonly imageUrl: string\n\n /**\n * Name to display for the Vidiot map.\n */\n readonly name?: string\n\n /**\n * List of Points of Interest labelled on the image.\n */\n readonly pointsOfInterest?: VidiotMapPointOfInterest[]\n\n constructor(data: VidiotMapData) {\n this.imageUrl = data.imageUrl\n this.name = data.name\n this.pointsOfInterest = data.pointsOfInterest?.map(data => new VidiotMapPointOfInterest(data))\n }\n}\n","import { VidiotMap } from './vidiot-map'\nimport { Link } from '../api/link'\nimport { GameMapData } from '../api/game-map-data'\nimport { Key } from './key'\n\nexport class GameMap {\n /**\n * The database key for this map.\n */\n readonly key: string\n\n /**\n * The name of the map as it appears in-game.\n */\n readonly name: string\n\n /**\n * List of external links for this Map. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n /**\n * List of Vidiot Map assets for this map.\n */\n readonly vidiotMaps?: VidiotMap[]\n\n constructor(data: GameMapData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.links = data.links\n this.vidiotMaps = data.vidiotMaps?.map(data => new VidiotMap(data))\n }\n}\n","import { ContentBundle } from '../api/content-bundle'\nimport { Change } from '../api/change'\nimport { Link } from '../api/link'\n\nexport class BundleMetadata {\n /**\n * Name of the server group.\n */\n readonly name: string\n\n /**\n * Description of the server group.\n *\n * Supports {@link https://www.markdownguide.org/|Markdown} format.\n */\n readonly description?: string\n\n /**\n * Repository where the db content package is maintained.\n */\n readonly repository?: string\n\n /**\n * List of external links for this Server Group. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * Change log for this data package.\n */\n readonly changelog: Change[]\n\n constructor(bundle: ContentBundle) {\n this.name = bundle.name\n this.description = bundle.description\n this.repository = bundle.repository\n this.links = bundle.links ?? []\n this.changelog = bundle.changelog ?? []\n }\n}\n","import { Badge } from './badge'\n\nexport class BadgeSearchDocument {\n id: string\n key: string\n name: string\n badgeText: string\n acquisition: string\n\n constructor(badge: Badge) {\n this.id = this.key = badge.key\n this.name = badge.name.toString(', ')\n this.badgeText = badge.badgeText.toString(', ')\n this.acquisition = badge.acquisition ?? ''\n }\n}\n","import { ContentBundle } from '../api/content-bundle'\nimport { Archetype } from './archetype'\nimport { GameMap } from './game-map'\nimport { Badge } from './badge'\nimport { BundleMetadata } from './bundle-metadata'\nimport MiniSearch from 'minisearch'\nimport { BadgeSearchDocument } from './badge-search-document'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex: Record<string, Archetype> = {}\n readonly #mapIndex: Record<string, GameMap> = {}\n readonly #badgeIndex: Record<string, Badge> = {}\n readonly #badgeSearch: MiniSearch\n\n /**\n * Metadata about the content bundle.\n */\n readonly metadata: BundleMetadata\n\n /**\n * List of the game server names in this server group.\n * Torchbearer, Excelsior, etc.\n */\n readonly servers: string[]\n\n /**\n * List of archetypes available in this server group.\n */\n readonly archetypes: Archetype[]\n\n /**\n * List of game maps supported by this server group.\n */\n readonly maps: GameMap[]\n\n /**\n * List of badges available on this server group.\n */\n readonly badges: Badge[]\n\n /**\n * Initialize the database with a content bundle.\n * @param bundle The data to load.\n */\n constructor(bundle: ContentBundle) {\n this.metadata = new BundleMetadata(bundle)\n this.servers = bundle.servers ?? []\n this.archetypes = bundle.archetypes?.map((data) => {\n if (this.#archetypeIndex[data.key] !== undefined) throw new Error(`Duplicate archetype key [${data.key}]`)\n const archetype = new Archetype(data)\n this.#archetypeIndex[archetype.key] = archetype\n return archetype\n }) ?? []\n this.maps = bundle.maps?.map((data) => {\n if (this.#mapIndex[data.key] !== undefined) throw new Error(`Duplicate map key [${data.key}]`)\n const map = new GameMap(data)\n this.#mapIndex[map.key] = map\n return map\n }) ?? []\n this.badges = bundle.badges?.map((data) => {\n if (this.#badgeIndex[data.key] !== undefined) throw new Error(`Duplicate badge key [${data.key}]`)\n const badge = new Badge(data)\n this.#badgeIndex[badge.key] = badge\n return badge\n }) ?? []\n\n this.#badgeSearch = new MiniSearch({\n fields: ['key', 'name', 'badgeText', 'acquisition'],\n storeFields: ['key'],\n })\n for (const badge of this.badges) {\n this.#badgeSearch.add(new BadgeSearchDocument(badge))\n }\n }\n\n getArchetype(key: string): Archetype {\n const result = this.#archetypeIndex[key]\n if (result === undefined) throw new Error(`Unknown archetype key [${key}]`)\n return result\n }\n\n getMap(key: string): GameMap {\n const result = this.#mapIndex[key]\n if (result === undefined) throw new Error(`Unknown map key [${key}]`)\n return result\n }\n\n getBadge(key: string): Badge {\n const result = this.#badgeIndex[key]\n if (result === undefined) throw new Error(`Unknown badge key [${key}]`)\n return result\n }\n\n searchBadges(query?: string): Badge[] {\n if (!query) return this.badges\n const keys = this.#badgeSearch.search(query, { prefix: true, fuzzy: true })\n\n return keys.map(result => this.getBadge(result['key']))\n }\n}\n","import { Change } from './api/change'\n\nexport const CHANGELOG: Change[] = [\n {\n version: '2.0.0',\n date: new Date('2025-03-12'),\n description: ''\n + '* Replaced redundant interfaces with their concrete equivalents.\\n'\n + `* Server groups are now referred to as 'forks'.\\n`\n + '* Replaced enums with extensible union types; Forks with new badge types, enhancement types, etc. can now extend them locally.\\n'\n + '* `IServerGroupData` is now `ContentBundle` and each database instance is now designed to accept only a single server group.\\n'\n + '* Removed the `serverGroup` property from entities to simplify the object tree given that only a single context can exist per db now.\\n'\n + '* Added a simple indexing and search function for badge names, text and acquisition info.\\n'\n + '* Standardized pluralization of some field names (name, icon).\\n'\n + '* Combined `settitle` ids into a single tuple field.\\n'\n + '* Change from GNU to The Unlicense.\\n'\n + '* Removed dependency on lodash.\\n'\n + '* Moved from webpack to rollup for packaging.\\n'\n + '* Add eslint for linting.\\n'\n + '* Add jest for unit tests.\\n'\n + '* Added GitHub Actions for CI.\\n',\n },\n]\n","/**\n * Create a reference string that can be used in most text strings to display a link to the given badge.\n * @param target The badge or badge key to target.\n */\nexport function createBadgeReference(target: string | { key: string }): string {\n const key = typeof target === 'string' ? target : target.key\n return `[badge:${key}]`\n}\n\n/**\n * Create a reference string that can be used in most text strings to display a link to the given map.\n * @param target The {@link GameMap} or map key to target.\n */\nexport function createMapReference(target: string | { key: string }): string {\n const key = typeof target === 'string' ? target : target.key\n return `[map:${key}]`\n}\n"],"names":["__privateAdd","__privateMethod","__privateSet","__privateGet","__publicField","data"],"mappings":"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"}
1
+ {"version":3,"file":"coh-content-db.mjs","sources":["../src/main/api/alignment.ts","../src/main/api/badge-partial-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/plaque-type.ts","../src/main/api/sex.ts","../src/main/db/alignments.ts","../src/main/db/alternates.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/db/badge-partial.ts","../src/main/db/badge.ts","../src/main/db/badge-index.ts","../src/main/db/bundle-metadata.ts","../src/main/db/vidiot-map-point-of-interest.ts","../src/main/db/vidiot-map.ts","../src/main/db/game-map.ts","../src/main/db/coh-content-database.ts","../src/main/changelog.ts","../src/main/util.ts"],"sourcesContent":["export const ALIGNMENT = ['H', 'V', 'P'] as const\n\nexport type Alignment = typeof ALIGNMENT[number]\n","export const BADGE_PARTIAL_TYPE = [\n 'PLAQUE',\n 'BADGE',\n 'INVENTION',\n 'INVENTION_PLUS_ONE', // Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n] as const\n\nexport type BadgePartialType = typeof BADGE_PARTIAL_TYPE[number]\n","export const BADGE_TYPE = [\n 'EXPLORATION',\n 'HISTORY',\n 'ACCOMPLISHMENT',\n 'ACHIEVEMENT',\n 'ACCOLADE',\n 'GLADIATOR',\n 'VETERAN',\n 'PVP',\n 'INVENTION',\n 'DEFEAT',\n 'EVENT',\n 'OUROBOROS',\n 'CONSIGNMENT',\n 'DAY_JOB',\n 'AE',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'DEFENSE_DEBUFF',\n 'TO_HIT_DEBUFF',\n 'TAUNT',\n 'CONFUSE',\n 'HEALING',\n 'DEFENSE_BUFF',\n 'RESIST_DAMAGE',\n 'INTANGIBILITY',\n 'SLEEP',\n 'SLOW',\n 'HOLD',\n 'STUN',\n 'IMMOBILIZE',\n 'FEAR',\n 'ENDURANCE_MODIFICATION',\n 'ENDURANCE_REDUCTION',\n 'RECHARGE_REDUCTION',\n 'INTERRUPT_DURATION',\n 'ACCURACY',\n 'TO_HIT_BUFF',\n 'DAMAGE',\n 'KNOCKBACK',\n 'RUN_SPEED',\n 'JUMP',\n 'FLY_SPEED',\n 'RANGE',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const PLAQUE_TYPE = [\n 'WALL_PLAQUE',\n 'MONUMENT',\n]\n\nexport type PlaqueType = typeof PLAQUE_TYPE[number]\n","export const SEX = ['M', 'F'] as const\n\nexport type Sex = typeof SEX[number]\n","import { Alignment } from '../api/alignment'\n\nexport class Alignments {\n readonly items: Alignment[]\n readonly hero: boolean\n readonly villain: boolean\n readonly praetorian: boolean\n readonly primal: boolean\n\n constructor(raw: Alignment[]) {\n this.items = raw\n this.hero = raw.includes('H')\n this.villain = raw.includes('V')\n this.praetorian = raw.includes('P')\n this.primal = !this.praetorian && (this.hero || this.villain)\n }\n}\n","import { AlternateData } from '../api/alternate-data'\nimport { Sex } from '../api/sex'\nimport { Alignment } from '../api/alignment'\n\nconst ALIGNMENT_SORT: Record<string, number> = { H: 2, V: 1, P: 0 }\nconst SEX_SORT: Record<string, number> = { M: 1, F: 0 }\n\nexport class Alternates<T> {\n readonly #sortedValues: AlternateData<T>[] = []\n\n constructor(values: AlternateData<T>[]) {\n this.#sortedValues = values.sort()\n this.#sortedValues.sort((a, b) => this.#compareAlternates(a, b))\n }\n\n getValue(alignment?: Alignment, sex?: Sex): T | undefined {\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry.value\n }\n\n return this.default?.value\n }\n\n /**\n * Get the default value for this list of alternates, the value with the highest priority and lowest specificity.\n */\n get default(): AlternateData<T> | undefined {\n return this.#sortedValues[0]\n }\n\n /**\n * Get the list of alternates sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): AlternateData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the alternate values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareAlternates(a: AlternateData<T>, b: AlternateData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = this.#compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = this.#compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n\n #compareAlignment(a?: Alignment, b?: Alignment): number {\n if (a === b) return 0\n if (a === undefined && b !== undefined) return -1\n if (b === undefined && a !== undefined) return 1\n\n const aSort = a === undefined ? -1 : ALIGNMENT_SORT[a] ?? -1 // Unknown values get -1 priority\n const bSort = b === undefined ? -1 : ALIGNMENT_SORT[b] ?? -1\n\n return bSort - aSort\n }\n\n #compareSex(a?: Sex, b?: Sex): number {\n if (a === b) return 0\n if (a === undefined && b !== undefined) return -1\n if (b === undefined && a !== undefined) return 1\n\n const aSort = SEX_SORT[a ?? -1] ?? -1 // Unknown values get -1 priority\n const bSort = SEX_SORT[b ?? -1] ?? -1\n\n return bSort - aSort\n }\n}\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","import { BadgePartialData } from '../api/badge-partial-data'\nimport { PlaqueType } from '../api/plaque-type'\nimport { BadgePartialType } from '../api/badge-partial-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\n\nexport class BadgePartial {\n /**\n * Key.\n */\n readonly key: string\n\n /**\n * Type of partial.\n */\n readonly type: BadgePartialType\n\n /**\n * Map the partial is located on.\n */\n readonly mapKey?: string\n\n /**\n * /loc coordinates.\n */\n readonly loc?: number[]\n\n /**\n * Is it a wall plaque or a physical monument?\n */\n readonly plaqueType?: PlaqueType\n\n /**\n * Plaque inscription.\n */\n readonly plaqueInscription?: string\n\n /**\n * The number or letter the partial appears as on Vidiot Maps.\n */\n readonly vidiotMapKey?: string\n\n /**\n * The badge required for this partial.\n */\n readonly badgeKey?: string\n\n /**\n * Level of the invention required.\n */\n readonly inventionLevel?: number\n\n /**\n * The types of enhancements required to be crafted.\n */\n readonly inventionTypes?: EnhancementCategory[]\n\n /**\n * Number of invention crafts required.\n */\n readonly inventionCount?: number\n\n /**\n * Any additional notes.\n */\n readonly notes?: MarkdownString\n\n constructor(data: BadgePartialData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.mapKey = data.mapKey\n this.loc = data.loc\n this.plaqueType = data.plaqueType\n this.plaqueInscription = data.plaqueInscription\n this.vidiotMapKey = data.vidiotMapKey\n this.badgeKey = data.badgeKey\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.inventionCount = data.inventionCount\n this.notes = data.notes\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgePartial } from './badge-partial'\nimport { Key } from './key'\nimport { Alternates } from './alternates'\nimport { Alignments } from './alignments'\nimport { MarkdownString } from '../api/markdown-string'\n\nexport class Badge {\n readonly #partialsIndex: Record<string, BadgePartial> = {}\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Alternates<string>\n\n /**\n * The character alignments that this badge is available to.\n */\n readonly alignment: Alignments\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Alternates<string>\n\n /**\n * Description of how to acquire the badge.\n */\n readonly acquisition?: MarkdownString\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Alternates<string>\n\n /**\n * Freeform notes or tips about the badge.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links for this Badge. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n /**\n * For exploration badges, the key of the {@link GameMap} that this badge is found on.\n */\n readonly mapKey?: string\n\n /**\n * For exploration badges, the `/loc` coordinates of the badge on the in-game map.\n */\n readonly loc?: [number, number, number]\n\n /**\n * For badges that appear on a Vidiot Map, the number or letter the badge appears as.\n */\n readonly vidiotMapKey?: string\n\n /**\n * ID used with the in-game `/settitle` command to apply the badge.\n */\n readonly setTitle?: {\n /**\n * `/settitle` id.\n */\n id?: number\n /**\n * `/settitle` id if different for praetorian characters.\n */\n praetorianId?: number\n }\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n */\n readonly effect?: MarkdownString\n\n /**\n * A list of requirements for badges that have partial fulfilment steps, such as visiting plaques for history badges, or collecting other badges for meta-badges like accolades.\n */\n readonly partials?: BadgePartial[]\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(data: BadgeData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.name = new Alternates(data.name)\n this.alignment = new Alignments(data.alignment)\n this.badgeText = new Alternates(data.badgeText ?? [])\n this.acquisition = data.acquisition\n this.icon = new Alternates(data.icon ?? [])\n this.notes = data.notes\n this.links = data.links\n this.mapKey = data.mapKey\n this.loc = data.loc\n this.effect = data.effect\n this.vidiotMapKey = data.vidiotMapKey\n this.setTitle = data.setTitle\n this.ignoreInTotals = data.ignoreInTotals ?? false\n\n this.partials = data.partials?.map((data) => {\n if (this.#partialsIndex[data.key] !== undefined) throw new Error(`Duplicate badge partial key [${data.key}]`)\n const badge = new BadgePartial(data)\n this.#partialsIndex[badge.key] = badge\n return badge\n })\n }\n\n getPartial(key: string): BadgePartial {\n const result = this.#partialsIndex[key]\n if (result === undefined) throw new Error(`Unknown badge partial key [${key}]`)\n return result\n }\n}\n","import { Badge } from './badge'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { GameMap } from './game-map'\nimport { Paged } from './paged'\n\nexport class BadgeIndex {\n readonly #badges: Badge[] = []\n readonly #badgeIndex: Record<string, Badge> = {}\n\n readonly #mapOrder: Record<string, number> = {}\n\n constructor(badges: Badge[], maps?: GameMap[]) {\n this.#mapOrder = Object.fromEntries(\n maps\n ?.sort((a, b) => a.name.localeCompare(b.name))\n ?.map((x, index) => [x.key, index]) ?? [],\n )\n\n this.#badges = badges\n for (const badge of badges) {\n if (this.#badgeIndex[badge.key] !== undefined) throw new Error(`Duplicate badge key [${badge.key}]`)\n this.#badgeIndex[badge.key] = badge\n }\n }\n\n getBadge(key: string): Badge {\n const result = this.#badgeIndex[key]\n if (result === undefined) throw new Error(`Unknown badge key [${key}]`)\n return result\n }\n\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n const filtered = (options?.query || options?.filter)\n ? this.#badges.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))\n : this.#badges\n\n const paged = options?.pageSize ? filtered.slice(((options?.page ?? 1) - 1) * options.pageSize, (options?.page ?? 1) * options?.pageSize) : filtered\n\n const sorted = this.#sort(paged, options?.sort)\n\n return {\n items: sorted,\n page: options?.page ?? 1,\n pageSize: options?.pageSize,\n totalItems: filtered.length,\n totalPages: options?.pageSize ? Math.ceil(filtered.length / (options?.pageSize)) : 1,\n }\n }\n\n #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {\n const queryString = query?.str?.toLowerCase() ?? ''\n return !!(((query?.on?.name ?? true) && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (query?.on?.badgeText && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (query?.on?.acquisition && badge.acquisition?.toLowerCase().includes(queryString))\n || (query?.on?.effect && badge.effect?.toLowerCase().includes(queryString))\n || (query?.on?.notes && badge.notes?.toLowerCase().includes(queryString))\n || (query?.on?.setTitle && (badge.setTitle?.id?.toString().includes(queryString) || badge.setTitle?.praetorianId?.toString().includes(queryString))))\n }\n\n #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {\n return (!filter?.type || badge.type === filter.type)\n && (!filter?.mapKey || badge.mapKey === filter.mapKey)\n && (!filter?.alignment || badge.alignment.items.includes(filter.alignment))\n }\n\n #sort(badges: Badge[], sort?: BadgeSearchOptions['sort']): Badge[] {\n if (!sort) return badges\n const ascending = sort.dir !== 'DESC'\n\n if (!sort.by || sort.by === 'CANONICAL') return sort.dir === 'DESC' ? badges.reverse() : badges\n\n if (sort.by === 'BADGE_NAME') return ascending\n ? badges.sort((a, b) => a.name.default?.value.localeCompare(b.name.default?.value ?? '') ?? 0)\n : badges.sort((a, b) => b.name.default?.value.localeCompare(a.name.default?.value ?? '') ?? 0)\n\n return badges.sort((a, b) => {\n const aIndex = this.#mapOrder[a.mapKey ?? '']\n const bIndex = this.#mapOrder[b.mapKey ?? '']\n\n if (aIndex === bIndex) return 0\n if (aIndex === undefined) return ascending ? 1 : -1\n if (bIndex === undefined) return ascending ? -1 : 1\n\n return ascending ? aIndex - bIndex : bIndex - aIndex\n })\n }\n}\n","import { ContentBundle } from '../api/content-bundle'\nimport { Change } from '../api/change'\nimport { Link } from '../api/link'\nimport { MarkdownString } from '../api/markdown-string'\n\nexport class BundleMetadata {\n /**\n * Name of the server group.\n */\n readonly name: string\n\n /**\n * Description of the server group.\n */\n readonly description?: MarkdownString\n\n /**\n * Repository where the db content package is maintained.\n */\n readonly repository?: string\n\n /**\n * List of external links for this Server Group. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * Change log for this data package.\n */\n readonly changelog: Change[]\n\n constructor(bundle: ContentBundle) {\n this.name = bundle.name\n this.description = bundle.description\n this.repository = bundle.repository\n this.links = bundle.links ?? []\n this.changelog = bundle.changelog ?? []\n }\n}\n","import { VidiotMapPointOfInterestData } from '../api/vidiot-map-point-of-interest-data'\nimport { MarkdownString } from '../api/markdown-string'\n\nexport class VidiotMapPointOfInterest {\n /**\n * The pixel-space position of the PoI on the map graphic.\n *\n * Screen-space, pixels from top-left `[0, 0]`.\n */\n readonly pos?: [number, number]\n\n /**\n * Freeform notes about the PoI.\n */\n readonly notes?: MarkdownString\n\n /**\n * If the POI is a zone transfer, the map it transfers to.\n */\n readonly mapKey?: string\n\n /**\n * If the POI is a badge, the badge.\n */\n readonly badgeKey?: string\n\n /**\n * If the POI is a partial for a badge, the partial key.\n */\n readonly badgePartialKey?: string\n\n constructor(data: VidiotMapPointOfInterestData) {\n this.pos = data.pos\n this.notes = data.notes\n this.mapKey = data.mapKey\n this.badgeKey = data.badgeKey\n this.badgePartialKey = data.badgePartialKey\n }\n}\n","import { VidiotMapData } from '../api/vidiot-map-data'\nimport { VidiotMapPointOfInterest } from './vidiot-map-point-of-interest'\n\nexport class VidiotMap {\n /**\n * URL of the map image.\n */\n readonly imageUrl: string\n\n /**\n * Name to display for the Vidiot map.\n */\n readonly name?: string\n\n /**\n * List of Points of Interest labelled on the image.\n */\n readonly pointsOfInterest?: VidiotMapPointOfInterest[]\n\n constructor(data: VidiotMapData) {\n this.imageUrl = data.imageUrl\n this.name = data.name\n this.pointsOfInterest = data.pointsOfInterest?.map(data => new VidiotMapPointOfInterest(data))\n }\n}\n","import { VidiotMap } from './vidiot-map'\nimport { Link } from '../api/link'\nimport { GameMapData } from '../api/game-map-data'\nimport { Key } from './key'\n\nexport class GameMap {\n /**\n * The database key for this map.\n */\n readonly key: string\n\n /**\n * The name of the map as it appears in-game.\n */\n readonly name: string\n\n /**\n * List of external links for this Map. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n /**\n * List of Vidiot Map assets for this map.\n */\n readonly vidiotMaps?: VidiotMap[]\n\n constructor(data: GameMapData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.links = data.links\n this.vidiotMaps = data.vidiotMaps?.map(data => new VidiotMap(data))\n }\n}\n","import { ContentBundle } from '../api/content-bundle'\nimport { Archetype } from './archetype'\nimport { GameMap } from './game-map'\nimport { Badge } from './badge'\nimport { BundleMetadata } from './bundle-metadata'\nimport { BadgeIndex } from './badge-index'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex: Record<string, Archetype> = {}\n readonly #mapIndex: Record<string, GameMap> = {}\n readonly #badgeIndex: BadgeIndex\n\n /**\n * Metadata about the content bundle.\n */\n readonly metadata: BundleMetadata\n\n /**\n * List of the game server names in this server group.\n * Torchbearer, Excelsior, etc.\n */\n readonly servers: string[]\n\n /**\n * List of archetypes available in this server group.\n */\n readonly archetypes: Archetype[]\n\n /**\n * List of game maps supported by this server group.\n */\n readonly maps: GameMap[]\n\n /**\n * List of badges available on this server group.\n */\n readonly badges: Badge[]\n\n /**\n * Initialize the database with a content bundle.\n * @param bundle The data to load.\n */\n constructor(bundle: ContentBundle) {\n this.metadata = new BundleMetadata(bundle)\n this.servers = bundle.servers ?? []\n\n this.archetypes = bundle.archetypes?.map((data) => {\n if (this.#archetypeIndex[data.key] !== undefined) throw new Error(`Duplicate archetype key [${data.key}]`)\n const archetype = new Archetype(data)\n this.#archetypeIndex[archetype.key] = archetype\n return archetype\n }) ?? []\n\n this.maps = bundle.maps?.map((data) => {\n if (this.#mapIndex[data.key] !== undefined) throw new Error(`Duplicate map key [${data.key}]`)\n const map = new GameMap(data)\n this.#mapIndex[map.key] = map\n return map\n }) ?? []\n\n this.badges = bundle.badges?.map(data => new Badge(data)) ?? []\n this.#badgeIndex = new BadgeIndex(this.badges, this.maps)\n }\n\n getArchetype(key: string): Archetype {\n const result = this.#archetypeIndex[key]\n if (result === undefined) throw new Error(`Unknown archetype key [${key}]`)\n return result\n }\n\n getMap(key: string): GameMap {\n const result = this.#mapIndex[key]\n if (result === undefined) throw new Error(`Unknown map key [${key}]`)\n return result\n }\n\n getBadge(key: string): Badge {\n return this.#badgeIndex.getBadge(key)\n }\n\n /**\n * Search, sort and filter the badge list.\n * This is a fairly brute-forced approach and will not be as performant as loading the badge data into a traditional\n * database engine, but is sufficient for most operations.\n * @param options {@link BadgeSearchOptions}\n */\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n return this.#badgeIndex.searchBadges(options)\n }\n}\n","import { Change } from './api/change'\n\nexport const CHANGELOG: Change[] = [\n {\n version: '2.0.0',\n date: new Date('2025-03-12'),\n description: ''\n + '* Replaced redundant interfaces with their concrete equivalents.\\n'\n + `* Server groups are now referred to as 'forks'.\\n`\n + '* Replaced enums with union types.\\n'\n + '* `IServerGroupData` is now `ContentBundle` and each database instance is now designed to accept only a single server group.\\n'\n + '* Removed the `serverGroup` property from entities to simplify the object tree given that only a single context can exist per db now.\\n'\n + '* Added a simple indexing and search function for badge names, text and acquisition info.\\n'\n + '* Map and badge references now follow a standard Markdown link format with a `badge://` or `map://` protocol.\\n'\n + '* Standardized pluralization of some field names (name, icon).\\n'\n + '* Combined `settitle` ids into a single tuple field.\\n'\n + '* Change from GNU to The Unlicense.\\n'\n + '* Removed all third-party dependencies.\\n'\n + '* Moved from webpack to rollup for packaging.\\n'\n + '* Add eslint for linting.\\n'\n + '* Add jest for unit tests.\\n'\n + '* Added GitHub Actions for CI.\\n',\n },\n]\n","/**\n * Returns the URI of the given badge that can be used in {@link MarkdownString} links.\n *\n * URI format: `badge://<key>`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeUri(target: string | { key: string }): string {\n const key = typeof target === 'string' ? target : target.key\n return `badge://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given badge.\n *\n * Link format: `[<key>](badge://<key>)`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeLink(target: string | { key: string }): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${badgeUri(target)})`\n}\n\n/**\n * Returns the URI of the given map that can be used in {@link MarkdownString} links.\n *\n * URI format: `map://<key>`\n *\n * @param target The {@link GameMap} or map key to target.\n */\nexport function mapUri(target: string | { key: string }): string {\n const key = typeof target === 'string' ? target : target.key\n return `map://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given map.\n *\n * Link format: `[<key>](map://<key>)`\n *\n * @param target The map or map key to target.\n */\nexport function mapLink(target: string | { key: string }): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${mapUri(target)})`\n}\n"],"names":["__publicField","__privateAdd","__privateSet","__privateGet","__privateMethod","data","_badgeIndex"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coh-content-db",
3
- "version": "2.0.0-rc.4",
3
+ "version": "2.0.0-rc.5",
4
4
  "description": "City of Heroes Content Database",
5
5
  "homepage": "https://github.com/n15g/coh-content-db#readme",
6
6
  "bugs": {
@@ -40,8 +40,5 @@
40
40
  },
41
41
  "engines": {
42
42
  "node": ">=22"
43
- },
44
- "dependencies": {
45
- "minisearch": "^7.1.2"
46
43
  }
47
44
  }
@@ -8,12 +8,12 @@ export interface AlternateData<V> {
8
8
  /**
9
9
  * The character alignment this alternate applies to.
10
10
  */
11
- readonly alignment?: Alignment | string
11
+ readonly alignment?: Alignment
12
12
 
13
13
  /**
14
14
  * The character sex this alternate applies to.
15
15
  */
16
- readonly sex?: Sex | string
16
+ readonly sex?: Sex
17
17
 
18
18
  /**
19
19
  * The value for this combination.
@@ -3,6 +3,7 @@ import { Link } from './link'
3
3
  import { BadgeType } from './badge-type'
4
4
  import { AlternateData } from './alternate-data'
5
5
  import { Alignment } from './alignment'
6
+ import { MarkdownString } from './markdown-string'
6
7
 
7
8
  export interface BadgeData {
8
9
 
@@ -16,7 +17,7 @@ export interface BadgeData {
16
17
  /**
17
18
  * The type of badge.
18
19
  */
19
- readonly type: BadgeType | string
20
+ readonly type: BadgeType
20
21
 
21
22
  /**
22
23
  * The name of this badge.
@@ -37,10 +38,8 @@ export interface BadgeData {
37
38
 
38
39
  /**
39
40
  * Description of how to acquire the badge.
40
- *
41
- * Supports {@link https://www.markdownguide.org/|Markdown} format.
42
41
  */
43
- readonly acquisition?: string
42
+ readonly acquisition?: MarkdownString
44
43
 
45
44
  /**
46
45
  * List of absolute URLs for this badge's icons.
@@ -51,10 +50,8 @@ export interface BadgeData {
51
50
 
52
51
  /**
53
52
  * Freeform notes or tips about the badge.
54
- *
55
- * Supports {@link https://www.markdownguide.org/|Markdown} format.
56
53
  */
57
- readonly notes?: string
54
+ readonly notes?: MarkdownString
58
55
 
59
56
  /**
60
57
  * List of external links for this Badge. Wiki, forums, etc.
@@ -92,10 +89,8 @@ export interface BadgeData {
92
89
 
93
90
  /**
94
91
  * A description of the effect the badge will have, such as a buff or granting a temporary power.
95
- *
96
- * Supports {@link https://www.markdownguide.org/|Markdown} format.
97
92
  */
98
- readonly effect?: string
93
+ readonly effect?: MarkdownString
99
94
 
100
95
  /**
101
96
  * A list of requirements for badges that have partial fulfilment steps, such as visiting plaques for history badges, or collecting other badges for meta-badges like accolades.
@@ -1,6 +1,7 @@
1
1
  import { EnhancementCategory } from './enhancement-category'
2
2
  import { BadgePartialType } from './badge-partial-type'
3
3
  import { PlaqueType } from './plaque-type'
4
+ import { MarkdownString } from './markdown-string'
4
5
 
5
6
  export interface BadgePartialData {
6
7
  /**
@@ -11,7 +12,7 @@ export interface BadgePartialData {
11
12
  /**
12
13
  * Type of partial.
13
14
  */
14
- readonly type: BadgePartialType | string
15
+ readonly type: BadgePartialType
15
16
 
16
17
  /**
17
18
  * Map the partial is located on.
@@ -26,12 +27,12 @@ export interface BadgePartialData {
26
27
  /**
27
28
  * Is it a wall plaque or a physical monument?
28
29
  */
29
- readonly plaqueType?: PlaqueType | string
30
+ readonly plaqueType?: PlaqueType
30
31
 
31
32
  /**
32
33
  * Plaque inscription.
33
34
  */
34
- readonly inscription?: string
35
+ readonly plaqueInscription?: string
35
36
 
36
37
  /**
37
38
  * The number or letter the partial appears as on Vidiot Maps.
@@ -51,7 +52,7 @@ export interface BadgePartialData {
51
52
  /**
52
53
  * The types of enhancements required to be crafted.
53
54
  */
54
- readonly inventionTypes?: (EnhancementCategory | string)[]
55
+ readonly inventionTypes?: EnhancementCategory[]
55
56
 
56
57
  /**
57
58
  * Number of invention crafts required.
@@ -61,5 +62,5 @@ export interface BadgePartialData {
61
62
  /**
62
63
  * Any additional notes.
63
64
  */
64
- readonly notes?: string
65
+ readonly notes?: MarkdownString
65
66
  }
@@ -1,3 +1,5 @@
1
+ import { MarkdownString } from './markdown-string'
2
+
1
3
  export interface Change {
2
4
  /**
3
5
  * The version number in {@link http://semver.org|semver} format.
@@ -7,8 +9,9 @@ export interface Change {
7
9
  * Date of the change.
8
10
  */
9
11
  date: Date
12
+
10
13
  /**
11
- * Description of the change in {@link https://www.markdownguide.org/|Markdown} format.
14
+ * Description of the change.
12
15
  */
13
- description: string
16
+ description: MarkdownString
14
17
  }
@@ -3,6 +3,7 @@ import { GameMapData } from './game-map-data'
3
3
  import { BadgeData } from './badge-data'
4
4
  import { Change } from './change'
5
5
  import { Link } from './link'
6
+ import { MarkdownString } from './markdown-string'
6
7
 
7
8
  /**
8
9
  * A content bundle holds the data that makes up one forked instance of the game since the original sunset, such as Homecoming (https://forums.homecomingservers.com/).
@@ -15,10 +16,8 @@ export interface ContentBundle {
15
16
 
16
17
  /**
17
18
  * Description of the fork.
18
- *
19
- * Supports {@link https://www.markdownguide.org/|Markdown} format.
20
19
  */
21
- readonly description?: string
20
+ readonly description?: MarkdownString
22
21
 
23
22
  /**
24
23
  * Repository where the db content package is maintained.
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Tage type to indicate that a string will accept {@link https://www.markdownguide.org/|Markdown} format.
3
+ */
4
+ export type MarkdownString = string
@@ -1,3 +1,5 @@
1
+ import { MarkdownString } from './markdown-string'
2
+
1
3
  export interface VidiotMapPointOfInterestData {
2
4
  /**
3
5
  * The pixel-space position of the PoI on the map graphic.
@@ -8,10 +10,8 @@ export interface VidiotMapPointOfInterestData {
8
10
 
9
11
  /**
10
12
  * Freeform notes about the PoI.
11
- *
12
- * Supports {@link https://www.markdownguide.org/|Markdown} format.
13
13
  */
14
- readonly notes?: string
14
+ readonly notes?: MarkdownString
15
15
 
16
16
  /**
17
17
  * If the POI is a zone transfer, the map it transfers to.
@@ -7,14 +7,15 @@ export const CHANGELOG: Change[] = [
7
7
  description: ''
8
8
  + '* Replaced redundant interfaces with their concrete equivalents.\n'
9
9
  + `* Server groups are now referred to as 'forks'.\n`
10
- + '* Replaced enums with extensible union types; Forks with new badge types, enhancement types, etc. can now extend them locally.\n'
10
+ + '* Replaced enums with union types.\n'
11
11
  + '* `IServerGroupData` is now `ContentBundle` and each database instance is now designed to accept only a single server group.\n'
12
12
  + '* Removed the `serverGroup` property from entities to simplify the object tree given that only a single context can exist per db now.\n'
13
13
  + '* Added a simple indexing and search function for badge names, text and acquisition info.\n'
14
+ + '* Map and badge references now follow a standard Markdown link format with a `badge://` or `map://` protocol.\n'
14
15
  + '* Standardized pluralization of some field names (name, icon).\n'
15
16
  + '* Combined `settitle` ids into a single tuple field.\n'
16
17
  + '* Change from GNU to The Unlicense.\n'
17
- + '* Removed dependency on lodash.\n'
18
+ + '* Removed all third-party dependencies.\n'
18
19
  + '* Moved from webpack to rollup for packaging.\n'
19
20
  + '* Add eslint for linting.\n'
20
21
  + '* Add jest for unit tests.\n'
@@ -0,0 +1,17 @@
1
+ import { Alignment } from '../api/alignment'
2
+
3
+ export class Alignments {
4
+ readonly items: Alignment[]
5
+ readonly hero: boolean
6
+ readonly villain: boolean
7
+ readonly praetorian: boolean
8
+ readonly primal: boolean
9
+
10
+ constructor(raw: Alignment[]) {
11
+ this.items = raw
12
+ this.hero = raw.includes('H')
13
+ this.villain = raw.includes('V')
14
+ this.praetorian = raw.includes('P')
15
+ this.primal = !this.praetorian && (this.hero || this.villain)
16
+ }
17
+ }
@@ -13,7 +13,7 @@ export class Alternates<T> {
13
13
  this.#sortedValues.sort((a, b) => this.#compareAlternates(a, b))
14
14
  }
15
15
 
16
- getValue(alignment?: Alignment | string, sex?: Sex | string): T | undefined {
16
+ getValue(alignment?: Alignment, sex?: Sex): T | undefined {
17
17
  for (let index = this.#sortedValues.length; index--;) {
18
18
  const entry = this.#sortedValues[index]
19
19
  if ((entry.alignment === undefined || entry.alignment === alignment)
@@ -21,14 +21,14 @@ export class Alternates<T> {
21
21
  ) return entry.value
22
22
  }
23
23
 
24
- return this.default
24
+ return this.default?.value
25
25
  }
26
26
 
27
27
  /**
28
28
  * Get the default value for this list of alternates, the value with the highest priority and lowest specificity.
29
29
  */
30
- get default(): T | undefined {
31
- return this.#sortedValues[0]?.value
30
+ get default(): AlternateData<T> | undefined {
31
+ return this.#sortedValues[0]
32
32
  }
33
33
 
34
34
  /**
@@ -60,7 +60,7 @@ export class Alternates<T> {
60
60
  return String(a.value).localeCompare(String(b.value))
61
61
  }
62
62
 
63
- #compareAlignment(a: Alignment | string | undefined, b: Alignment | string | undefined): number {
63
+ #compareAlignment(a?: Alignment, b?: Alignment): number {
64
64
  if (a === b) return 0
65
65
  if (a === undefined && b !== undefined) return -1
66
66
  if (b === undefined && a !== undefined) return 1
@@ -68,13 +68,10 @@ export class Alternates<T> {
68
68
  const aSort = a === undefined ? -1 : ALIGNMENT_SORT[a] ?? -1 // Unknown values get -1 priority
69
69
  const bSort = b === undefined ? -1 : ALIGNMENT_SORT[b] ?? -1
70
70
 
71
- if (aSort !== bSort) return bSort - aSort
72
-
73
- // Unknown values (not in ALIGNMENT_SORT) are sorted alphabetically
74
- return a?.localeCompare(b ?? '') ?? 0
71
+ return bSort - aSort
75
72
  }
76
73
 
77
- #compareSex(a?: Sex | string | undefined, b?: Sex | string | undefined): number {
74
+ #compareSex(a?: Sex, b?: Sex): number {
78
75
  if (a === b) return 0
79
76
  if (a === undefined && b !== undefined) return -1
80
77
  if (b === undefined && a !== undefined) return 1
@@ -82,9 +79,6 @@ export class Alternates<T> {
82
79
  const aSort = SEX_SORT[a ?? -1] ?? -1 // Unknown values get -1 priority
83
80
  const bSort = SEX_SORT[b ?? -1] ?? -1
84
81
 
85
- if (aSort !== bSort) return bSort - aSort
86
-
87
- // Unknown values (not in SEX_SORT) are sorted alphabetically
88
- return a?.localeCompare(b ?? '') ?? 0
82
+ return bSort - aSort
89
83
  }
90
84
  }
@@ -0,0 +1,87 @@
1
+ import { Badge } from './badge'
2
+ import { BadgeSearchOptions } from './badge-search-options'
3
+ import { GameMap } from './game-map'
4
+ import { Paged } from './paged'
5
+
6
+ export class BadgeIndex {
7
+ readonly #badges: Badge[] = []
8
+ readonly #badgeIndex: Record<string, Badge> = {}
9
+
10
+ readonly #mapOrder: Record<string, number> = {}
11
+
12
+ constructor(badges: Badge[], maps?: GameMap[]) {
13
+ this.#mapOrder = Object.fromEntries(
14
+ maps
15
+ ?.sort((a, b) => a.name.localeCompare(b.name))
16
+ ?.map((x, index) => [x.key, index]) ?? [],
17
+ )
18
+
19
+ this.#badges = badges
20
+ for (const badge of badges) {
21
+ if (this.#badgeIndex[badge.key] !== undefined) throw new Error(`Duplicate badge key [${badge.key}]`)
22
+ this.#badgeIndex[badge.key] = badge
23
+ }
24
+ }
25
+
26
+ getBadge(key: string): Badge {
27
+ const result = this.#badgeIndex[key]
28
+ if (result === undefined) throw new Error(`Unknown badge key [${key}]`)
29
+ return result
30
+ }
31
+
32
+ searchBadges(options?: BadgeSearchOptions): Paged<Badge> {
33
+ const filtered = (options?.query || options?.filter)
34
+ ? this.#badges.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))
35
+ : this.#badges
36
+
37
+ const paged = options?.pageSize ? filtered.slice(((options?.page ?? 1) - 1) * options.pageSize, (options?.page ?? 1) * options?.pageSize) : filtered
38
+
39
+ const sorted = this.#sort(paged, options?.sort)
40
+
41
+ return {
42
+ items: sorted,
43
+ page: options?.page ?? 1,
44
+ pageSize: options?.pageSize,
45
+ totalItems: filtered.length,
46
+ totalPages: options?.pageSize ? Math.ceil(filtered.length / (options?.pageSize)) : 1,
47
+ }
48
+ }
49
+
50
+ #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {
51
+ const queryString = query?.str?.toLowerCase() ?? ''
52
+ return !!(((query?.on?.name ?? true) && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))
53
+ || (query?.on?.badgeText && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))
54
+ || (query?.on?.acquisition && badge.acquisition?.toLowerCase().includes(queryString))
55
+ || (query?.on?.effect && badge.effect?.toLowerCase().includes(queryString))
56
+ || (query?.on?.notes && badge.notes?.toLowerCase().includes(queryString))
57
+ || (query?.on?.setTitle && (badge.setTitle?.id?.toString().includes(queryString) || badge.setTitle?.praetorianId?.toString().includes(queryString))))
58
+ }
59
+
60
+ #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {
61
+ return (!filter?.type || badge.type === filter.type)
62
+ && (!filter?.mapKey || badge.mapKey === filter.mapKey)
63
+ && (!filter?.alignment || badge.alignment.items.includes(filter.alignment))
64
+ }
65
+
66
+ #sort(badges: Badge[], sort?: BadgeSearchOptions['sort']): Badge[] {
67
+ if (!sort) return badges
68
+ const ascending = sort.dir !== 'DESC'
69
+
70
+ if (!sort.by || sort.by === 'CANONICAL') return sort.dir === 'DESC' ? badges.reverse() : badges
71
+
72
+ if (sort.by === 'BADGE_NAME') return ascending
73
+ ? badges.sort((a, b) => a.name.default?.value.localeCompare(b.name.default?.value ?? '') ?? 0)
74
+ : badges.sort((a, b) => b.name.default?.value.localeCompare(a.name.default?.value ?? '') ?? 0)
75
+
76
+ return badges.sort((a, b) => {
77
+ const aIndex = this.#mapOrder[a.mapKey ?? '']
78
+ const bIndex = this.#mapOrder[b.mapKey ?? '']
79
+
80
+ if (aIndex === bIndex) return 0
81
+ if (aIndex === undefined) return ascending ? 1 : -1
82
+ if (bIndex === undefined) return ascending ? -1 : 1
83
+
84
+ return ascending ? aIndex - bIndex : bIndex - aIndex
85
+ })
86
+ }
87
+ }