{"version":3,"file":"main.min.mjs","sources":["../../source/type.ts","../../source/Error/InvalidInput.ts","../../source/Error/DuplicateCharacter.ts","../../source/main.ts"],"sourcesContent":["/**\n * Simple type detection\n *\n * @param {*} input\n * @return {string} type\n */\nexport function type(input: unknown): string {\n\treturn input === null ? 'null' : Array.isArray(input) ? 'array' : typeof input;\n}\n","import { type } from '../type';\n\n/**\n * Error thrown if an Alphabet receives less characters than needed\n *\n * @class InvalidInputError\n * @extends {Error}\n */\nexport class InvalidInputError extends Error {\n\t/**\n\t * Creates an instance of InvalidInputError\n\t *\n\t * @memberof InvalidInputError\n\t */\n\tconstructor(source: unknown) {\n\t\tsuper(\n\t\t\t`Alphabets requires a string(able), got (${type(source)}) ${source}`\n\t\t);\n\n\t\tconst {\n\t\t\tconstructor,\n\t\t\tconstructor: { name }\n\t\t} = this;\n\t\tthis.name = name;\n\n\t\tError.captureStackTrace(this, constructor);\n\t}\n}\n","/**\n * Error thrown if an Alphabet receives duplicate characters\n *\n * @class DuplicateCharacterError\n * @extends {Error}\n */\nexport class DuplicateCharacterError extends Error {\n\t/**\n\t * Creates an instance of DuplicateCharacterError\n\t *\n\t * @param {object} [meta={source, duplicate}]\n\t * @memberof DuplicateCharacterError\n\t */\n\tconstructor(source: string, duplicate: string) {\n\t\tsuper(\n\t\t\t`Alphabets cannot contain duplicate characters, found \"${duplicate}\" in \"${source}\"`\n\t\t);\n\n\t\tconst {\n\t\t\tconstructor,\n\t\t\tconstructor: { name }\n\t\t} = this;\n\t\tthis.name = name;\n\n\t\tError.captureStackTrace(this, constructor);\n\t}\n}\n","import { InvalidInputError as InvalidInput } from './Error/InvalidInput';\nimport { DuplicateCharacterError as DuplicateCharacter } from './Error/DuplicateCharacter';\nimport { type } from './type';\n\nconst storage = new WeakMap();\nconst defaultCharacters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\nconst stringable = (input: unknown): boolean => /string|object/.test(type(input));\n\nexport const InvalidInputError = InvalidInput;\nexport const DuplicateCharacterError = DuplicateCharacter;\n\n/**\n * Immutable alphabet\n *\n * @class Alphabet\n */\nexport class Alphabet {\n\tconstructor(source: string = defaultCharacters) {\n\t\tconst characters = stringable(source) ? String(source) : '';\n\t\tconst alphabet = Array.from(characters);\n\t\tconst duplicate = alphabet.filter((v, i, a) => a.indexOf(v) !== i).join('');\n\n\t\tif (!characters.length) {\n\t\t\tthrow new InvalidInput(source);\n\t\t}\n\n\t\tif (duplicate.length) {\n\t\t\tthrow new DuplicateCharacter(characters, duplicate);\n\t\t}\n\n\t\tstorage.set(this, { characters, alphabet });\n\t}\n\n\t/**\n\t * Obtain the configured characters\n\t *\n\t * @readonly\n\t * @memberof Alphabet\n\t */\n\tget characters(): string {\n\t\tconst { characters } = storage.get(this);\n\n\t\treturn characters;\n\t}\n\n\t/**\n\t * Get the number of bytes of the alphabet\n\t *\n\t * @readonly\n\t * @memberof Alphabet\n\t */\n\tget byteLength(): number {\n\t\treturn this.characters.length;\n\t}\n\n\t/**\n\t * Get the character length of the alphabet\n\t *\n\t * @readonly\n\t * @memberof Alphabet\n\t */\n\tget length(): number {\n\t\tconst { alphabet: { length } } = storage.get(this);\n\n\t\treturn length;\n\t}\n\n\t/**\n\t * Extract part of the alphabet and return it as a (singleton) instance of alphabet\n\t *\n\t * @param {number} start\n\t * @param {number} end\n\t * @returns {Alphabet} instance\n\t * @memberof Alphabet\n\t */\n\tslice(start: number, end: number): Alphabet {\n\t\tconst { alphabet } = storage.get(this);\n\t\tconst { constructor: Ctor } = Object.getPrototypeOf(this);\n\n\t\treturn Ctor.from(alphabet.slice(start, end).join(''));\n\t}\n\n\t/**\n\t * Get the character at given index\n\t *\n\t * @param {number} index\n\t * @returns {string} char\n\t * @memberof Alphabet\n\t */\n\tcharAt(index: number): string {\n\t\tconst { alphabet } = storage.get(this);\n\n\t\treturn alphabet[index];\n\t}\n\n\t/**\n\t * Get the character code at given index\n\t *\n\t * @param {numer} index\n\t * @returns {number} charcode\n\t * @memberof Alphabet\n\t */\n\tcharCodeAt(index: number): number | undefined {\n\t\tconst { characters, length } = this;\n\n\t\treturn index >= 0 && index < length ? characters.charCodeAt(index) : undefined;\n\t}\n\n\t/**\n\t * Get the code point at given index\n\t *\n\t * @param {numer} index\n\t * @returns {number} codepoint\n\t * @memberof Alphabet\n\t */\n\tcodePointAt(index: number): number | undefined {\n\t\tconst char = this.charAt(index);\n\n\t\treturn char ? char.codePointAt(0) : undefined;\n\t}\n\n\t/**\n\t * Get the index of the given character\n\t *\n\t * @param {string} char\n\t * @returns {number} index\n\t * @memberof Alphabet\n\t */\n\tindexOf(char: string): number {\n\t\tconst { alphabet } = storage.get(this);\n\n\t\treturn alphabet.indexOf(char);\n\t}\n\n\t/**\n\t * Map any amount of indices to the corresponding characters (wrapping the\n\t * indices around if they exceed the length of the alphabet)\n\t *\n\t * @param {number} ...list\n\t * @returns {string} [char]\n\t * @memberof Alphabet\n\t */\n\tmap(...list: Array<number>): Array<string> {\n\t\tconst { length } = this;\n\t\tconst normal = (index: number): number => index < 0 ? normal(length + index) : index;\n\n\t\treturn list.map((index) => this.charAt(normal(index) % length));\n\t}\n\n\t/**\n\t * Convert the Alphabet into a string\n\t *\n\t * @returns {string} chars\n\t * @memberof Alphabet\n\t */\n\ttoString(): string {\n\t\treturn this.characters;\n\t}\n\n\t/**\n\t * Ensure the Alphabet is properly JSON-stringified\n\t *\n\t * @returns\n\t * @memberof Alphabet\n\t */\n\ttoJSON(): string {\n\t\treturn String(this);\n\t}\n\n\t/**\n\t * Obtain a singleton instance of Alphabet representing the provided characters\n\t *\n\t * @static\n\t * @param {*} characters\n\t * @returns\n\t * @memberof Alphabet\n\t */\n\tstatic from(characters: string): Alphabet {\n\t\tif (!storage.has(this)) {\n\t\t\tstorage.set(this, new Map());\n\t\t}\n\n\t\tconst map = storage.get(this);\n\n\t\tif (!map.has(characters)) {\n\t\t\tmap.set(characters, new this(characters));\n\t\t}\n\n\t\treturn map.get(characters);\n\t}\n}\n"],"names":["type","input","Array","isArray","Error","constructor","source","super","name","this","captureStackTrace","duplicate","storage","WeakMap","InvalidInputError","InvalidInput","DuplicateCharacterError","DuplicateCharacter","Alphabet","characters","test","String","alphabet","from","filter","v","i","a","indexOf","join","length","set","get","byteLength","slice","start","end","Ctor","Object","getPrototypeOf","charAt","index","charCodeAt","undefined","codePointAt","char","map","list","normal","toString","toJSON","has","Map"],"mappings":"AAMM,SAAUA,EAAKC,GACpB,OAAiB,OAAVA,EAAiB,OAASC,MAAMC,QAAQF,GAAS,eAAiBA,CAC1E,OCAM,cAAiCG,MAMtC,WAAAC,CAAYC,GACXC,MACC,2CAA2CP,EAAKM,OAAYA,KAG7D,MAAMD,YACLA,EACAA,aAAaG,KAAEA,IACZC,KACJA,KAAKD,KAAOA,EAEZJ,MAAMM,kBAAkBD,KAAMJ,EAC9B,KCpBI,cAAuCD,MAO5C,WAAAC,CAAYC,EAAgBK,GAC3BJ,MACC,yDAAyDI,UAAkBL,MAG5E,MAAMD,YACLA,EACAA,aAAaG,KAAEA,IACZC,KACJA,KAAKD,KAAOA,EAEZJ,MAAMM,kBAAkBD,KAAMJ,EAC9B,GCrBF,MAAMO,EAAU,IAAIC,QAIPC,EAAoBC,EACpBC,EAA0BC,QAO1BC,EACZ,WAAAb,CAAYC,EAZa,kEAaxB,MAAMa,EAZwC,gBAAgBC,KAAKpB,EAYrCM,IAAUe,OAAOf,GAAU,GACzD,MAAMgB,EAAWpB,MAAMqB,KAAKJ,GACtBR,EAAYW,EAASE,QAAO,CAACC,EAAGC,EAAGC,IAAMA,EAAEC,QAAQH,KAAOC,IAAGG,KAAK,IAExE,IAAKV,EAAWW,OACf,MAAM,IAAIf,EAAaT,GAGxB,GAAIK,EAAUmB,OACb,MAAM,IAAIb,EAAmBE,EAAYR,GAG1CC,EAAQmB,IAAItB,KAAM,CAAEU,aAAYG,YAChC,CAQD,cAAIH,GACH,MAAMA,WAAEA,GAAeP,EAAQoB,IAAIvB,MAEnC,OAAOU,CACP,CAQD,cAAIc,GACH,OAAOxB,KAAKU,WAAWW,MACvB,CAQD,UAAIA,GACH,MAAQR,UAAUQ,OAAEA,IAAalB,EAAQoB,IAAIvB,MAE7C,OAAOqB,CACP,CAUD,KAAAI,CAAMC,EAAeC,GACpB,MAAMd,SAAEA,GAAaV,EAAQoB,IAAIvB,OACzBJ,YAAagC,GAASC,OAAOC,eAAe9B,MAEpD,OAAO4B,EAAKd,KAAKD,EAASY,MAAMC,EAAOC,GAAKP,KAAK,IACjD,CASD,MAAAW,CAAOC,GACN,MAAMnB,SAAEA,GAAaV,EAAQoB,IAAIvB,MAEjC,OAAOa,EAASmB,EAChB,CASD,UAAAC,CAAWD,GACV,MAAMtB,WAAEA,EAAUW,OAAEA,GAAWrB,KAE/B,OAAOgC,GAAS,GAAKA,EAAQX,EAASX,EAAWuB,WAAWD,QAASE,CACrE,CASD,WAAAC,CAAYH,GACX,MAAMI,EAAOpC,KAAK+B,OAAOC,GAEzB,OAAOI,EAAOA,EAAKD,YAAY,QAAKD,CACpC,CASD,OAAAf,CAAQiB,GACP,MAAMvB,SAAEA,GAAaV,EAAQoB,IAAIvB,MAEjC,OAAOa,EAASM,QAAQiB,EACxB,CAUD,GAAAC,IAAOC,GACN,MAAMjB,OAAEA,GAAWrB,KACbuC,EAAUP,GAA0BA,EAAQ,EAAIO,EAAOlB,EAASW,GAASA,EAE/E,OAAOM,EAAKD,KAAKL,GAAUhC,KAAK+B,OAAOQ,EAAOP,GAASX,IACvD,CAQD,QAAAmB,GACC,OAAOxC,KAAKU,UACZ,CAQD,MAAA+B,GACC,OAAO7B,OAAOZ,KACd,CAUD,WAAOc,CAAKJ,GACNP,EAAQuC,IAAI1C,OAChBG,EAAQmB,IAAItB,KAAM,IAAI2C,KAGvB,MAAMN,EAAMlC,EAAQoB,IAAIvB,MAMxB,OAJKqC,EAAIK,IAAIhC,IACZ2B,EAAIf,IAAIZ,EAAY,IAAIV,KAAKU,IAGvB2B,EAAId,IAAIb,EACf"}