{"version":3,"sources":["packages.ts"],"names":["fse","property","Package","Packages","Object","constructor","path","_path","loaded","_packagesList","update","data","map","Map","pkg","itter","name","file","size","sha256","set","_setPackagesList","_parseData","updated","added","removed","obj","before","get","delete","push","assertLoaded","Error","exists","pathExists","read","readJson","_castData","write","writeJson","spaces","readIfExists","packages","_packages","entry","has","assertHas","byName","_packagesByName","bySha256","_packagesBySha256","byUnique","unique","_packagesByUnique","_createPackage","info","packagesList","_validateFormat","format","parsed","_parsePackages","_listPackages","_packagesMapName","_packagesMapSha256","_packagesMapUnique","Constructor","version","FORMAT","split","Number","parts","length","r","Set","shift","add","chilren","unshift","JSON","parse","Array","isArray"],"mappings":"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","sourcesContent":["import fse from 'fs-extra';\n\nimport {property} from './decorators';\nimport {Package} from './package';\nimport {\n\tIPackagesList,\n\tIPackagesListPackage,\n\tIPackageUpdated\n} from './types';\n\n/**\n * Packages constructor.\n *\n * @param path The path to the packages file.\n */\nexport class Packages extends Object {\n\t/**\n\t * Packages data.\n\t */\n\t@property(false)\n\tprotected _packagesList: IPackagesList | null = null;\n\n\t/**\n\t * Packages array.\n\t */\n\t@property(false)\n\tprotected _packages = new Set<Package>();\n\n\t/**\n\t * Packages mapped by name.\n\t */\n\t@property(false)\n\tprotected _packagesByName = new Map<string, Package>();\n\n\t/**\n\t * Packages mapped by sha256.\n\t */\n\t@property(false)\n\tprotected _packagesBySha256 = new Map<string, Package>();\n\n\t/**\n\t * Packages mapped by unique.\n\t */\n\t@property(false)\n\tprotected _packagesByUnique = new Map<string, Package>();\n\n\t/**\n\t * The path to the packages file.\n\t */\n\t@property(false)\n\tprotected readonly _path: string;\n\n\t/**\n\t * Format version.\n\t */\n\tpublic static readonly FORMAT: string = '1.0';\n\n\tconstructor(path: string) {\n\t\tsuper();\n\n\t\tthis._path = path;\n\t}\n\n\t/**\n\t * Get path of the packages file.\n\t *\n\t * @returns The path.\n\t */\n\tpublic get path() {\n\t\treturn this._path;\n\t}\n\n\t/**\n\t * Get if packages loaded.\n\t *\n\t * @returns Is loaded.\n\t */\n\tpublic get loaded() {\n\t\treturn !!this._packagesList;\n\t}\n\n\t/**\n\t * Update packages.\n\t *\n\t * @param data Encoded data.\n\t * @returns Update report.\n\t */\n\tpublic update(data: string) {\n\t\t// Map out current list if any.\n\t\tconst map = new Map<string, IPackageUpdated>();\n\t\tfor (const pkg of this.itter()) {\n\t\t\tconst {name, file, size, sha256} = pkg;\n\t\t\tmap.set(name, {\n\t\t\t\tname,\n\t\t\t\tfile,\n\t\t\t\tsize,\n\t\t\t\tsha256\n\t\t\t});\n\t\t}\n\n\t\t// Actually set the data.\n\t\tthis._setPackagesList(this._parseData(data));\n\n\t\t// List out the changes of significance.\n\t\tconst updated: IPackageUpdated[] = [];\n\t\tconst added: IPackageUpdated[] = [];\n\t\tconst removed: IPackageUpdated[] = [];\n\t\tfor (const pkg of this.itter()) {\n\t\t\tconst {name, file, size, sha256} = pkg;\n\t\t\tconst obj: IPackageUpdated = {\n\t\t\t\tname,\n\t\t\t\tfile,\n\t\t\t\tsize,\n\t\t\t\tsha256\n\t\t\t};\n\n\t\t\tconst before = map.get(name) || null;\n\t\t\tmap.delete(name);\n\n\t\t\tif (!before) {\n\t\t\t\tadded.push(obj);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tbefore.sha256 !== sha256 ||\n\t\t\t\tbefore.size !== size ||\n\t\t\t\tbefore.file !== file\n\t\t\t) {\n\t\t\t\tupdated.push(obj);\n\t\t\t}\n\t\t}\n\t\tfor (const [, obj] of map) {\n\t\t\tremoved.push(obj);\n\t\t}\n\n\t\treturn {\n\t\t\tupdated,\n\t\t\tadded,\n\t\t\tremoved\n\t\t};\n\t}\n\n\t/**\n\t * Assert loaded.\n\t */\n\tpublic assertLoaded() {\n\t\tif (!this.loaded) {\n\t\t\tthrow new Error('Packages list not loaded');\n\t\t}\n\t}\n\n\t/**\n\t * Check if the file path exists.\n\t *\n\t * @returns Does exist.\n\t */\n\tpublic async exists() {\n\t\treturn fse.pathExists(this.path);\n\t}\n\n\t/**\n\t * Read the file path.\n\t */\n\tpublic async read() {\n\t\tconst data = await fse.readJson(this.path);\n\t\tthis._setPackagesList(this._castData(data));\n\t}\n\n\t/**\n\t * Write packages to the file path.\n\t */\n\tpublic async write() {\n\t\tif (!this._packagesList) {\n\t\t\tthrow new Error('Cannot write unloaded list');\n\t\t}\n\t\tawait fse.writeJson(this.path, this._packagesList, {\n\t\t\tspaces: '\\t'\n\t\t});\n\t}\n\n\t/**\n\t * Read the file path if the file exists.\n\t *\n\t * @returns Did exist.\n\t */\n\tpublic async readIfExists() {\n\t\tif (await this.exists()) {\n\t\t\tawait this.read();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Itterate over the packages.\n\t */\n\tpublic * itter() {\n\t\tconst packages = this._packages;\n\t\tfor (const entry of packages) {\n\t\t\t// If the set changes, break loop.\n\t\t\tif (packages !== this._packages) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tyield entry;\n\t\t}\n\t}\n\n\t/**\n\t * Check if package is in this collection.\n\t *\n\t * @param pkg Package instance.\n\t * @returns If the package instance is present.\n\t */\n\tpublic has(pkg: Package) {\n\t\treturn this._packages.has(pkg);\n\t}\n\n\t/**\n\t * Assert the package is in this collection.\n\t *\n\t * @param pkg Package instance.\n\t */\n\tpublic assertHas(pkg: Package) {\n\t\tif (!this.has(pkg)) {\n\t\t\tthrow new Error('Package not in collection');\n\t\t}\n\t}\n\n\t/**\n\t * Get package by the unique name.\n\t *\n\t * @param name Package name.\n\t * @returns The package or null.\n\t */\n\tpublic byName(name: string) {\n\t\treturn this._packagesByName.get(name) || null;\n\t}\n\n\t/**\n\t * Get package by the sha256 hash.\n\t *\n\t * @param sha256 Package sha256.\n\t * @returns The package or null.\n\t */\n\tpublic bySha256(sha256: string) {\n\t\treturn this._packagesBySha256.get(sha256) || null;\n\t}\n\n\t/**\n\t * Get package by the unique value.\n\t *\n\t * @param unique Package unique.\n\t * @returns The package or null.\n\t */\n\tpublic byUnique(unique: string) {\n\t\treturn this._packagesByUnique.get(unique) || null;\n\t}\n\n\t/**\n\t * Create a package instance.\n\t *\n\t * @param info Package info.\n\t * @returns Package instance.\n\t */\n\tprotected _createPackage(info: IPackagesListPackage) {\n\t\treturn new Package(info);\n\t}\n\n\t/**\n\t * Set the packages list.\n\t *\n\t * @param packagesList Parsed list.\n\t */\n\tprotected _setPackagesList(packagesList: IPackagesList) {\n\t\tthis._validateFormat(packagesList.format);\n\n\t\tconst parsed = this._parsePackages(packagesList.packages);\n\t\tconst packages = this._listPackages(parsed);\n\n\t\t// Map out the names and hashes.\n\t\tconst byName = this._packagesMapName(packages);\n\t\tconst bySha256 = this._packagesMapSha256(packages);\n\t\tconst byUnique = this._packagesMapUnique(packages);\n\n\t\t// If all parsed successfully, set properties.\n\t\tthis._packagesList = packagesList;\n\t\tthis._packages = packages;\n\t\tthis._packagesByName = byName;\n\t\tthis._packagesBySha256 = bySha256;\n\t\tthis._packagesByUnique = byUnique;\n\t}\n\n\t/**\n\t * Validate format version string.\n\t *\n\t * @param format The format version string.\n\t */\n\tprotected _validateFormat(format: string) {\n\t\tconst Constructor = this.constructor as typeof Packages;\n\t\tconst version = Constructor.FORMAT.split('.').map(Number);\n\t\tconst parts = format.split('.').map(Number);\n\n\t\tif (parts.length !== 2) {\n\t\t\tthrow new Error(`Invalid format version value: ${format}`);\n\t\t}\n\n\t\tif (!(parts[0] === version[0])) {\n\t\t\tthrow new Error(`Invalid format version major: ${format}`);\n\t\t}\n\n\t\tif (!(parts[1] >= version[1])) {\n\t\t\tthrow new Error(`Invalid format version minor: ${format}`);\n\t\t}\n\t}\n\n\t/**\n\t * Parse the packages list.\n\t *\n\t * @param packages Packages list.\n\t * @returns Parsed list.\n\t */\n\tprotected _parsePackages(packages: IPackagesListPackage[]) {\n\t\treturn packages.map(info => this._createPackage(info));\n\t}\n\n\t/**\n\t * List all packages deep.\n\t *\n\t * @param packages A list of packages.\n\t * @returns A set of all packages and their children.\n\t */\n\tprotected _listPackages(packages: Package[]) {\n\t\tconst r = new Set<Package>();\n\t\tconst itter = [...packages];\n\n\t\t// tslint:disable-next-line: no-constant-condition\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tconst entry = itter.shift();\n\t\t\tif (!entry) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tr.add(entry);\n\t\t\tconst chilren = entry.packages;\n\t\t\tif (chilren) {\n\t\t\t\titter.unshift(...chilren);\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map out package list by name.\n\t * Throws on any duplicates.\n\t *\n\t * @param packages Packages list.\n\t * @returns Map from package name to package.\n\t */\n\tprotected _packagesMapName(packages: Set<Package>) {\n\t\tconst r = new Map<string, Package>();\n\n\t\tfor (const entry of packages) {\n\t\t\tconst {name} = entry;\n\t\t\tif (r.has(name)) {\n\t\t\t\tthrow new Error(`Duplicate package name: ${name}`);\n\t\t\t}\n\t\t\tr.set(name, entry);\n\t\t}\n\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map out package list by sha256.\n\t * Throws on any duplicates.\n\t *\n\t * @param packages Packages list.\n\t * @returns Map from package sha256 to package.\n\t */\n\tprotected _packagesMapSha256(packages: Set<Package>) {\n\t\tconst r = new Map<string, Package>();\n\n\t\tfor (const entry of packages) {\n\t\t\tconst {sha256} = entry;\n\t\t\tif (r.has(sha256)) {\n\t\t\t\tthrow new Error(`Duplicate package sha256: ${sha256}`);\n\t\t\t}\n\t\t\tr.set(sha256, entry);\n\t\t}\n\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map out package list by unique.\n\t * Throws on any duplicates.\n\t *\n\t * @param packages Packages list.\n\t * @returns Map from package unique to package.\n\t */\n\tprotected _packagesMapUnique(packages: Set<Package>) {\n\t\tconst r = new Map<string, Package>();\n\n\t\tfor (const entry of packages) {\n\t\t\tfor (const unique of [\n\t\t\t\tentry.name,\n\t\t\t\tentry.sha256\n\t\t\t]) {\n\t\t\t\tif (r.has(unique)) {\n\t\t\t\t\tthrow new Error(`Duplicate package unique: ${unique}`);\n\t\t\t\t}\n\t\t\t\tr.set(unique, entry);\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n\n\t/**\n\t * Parse and cast the encoded data.\n\t *\n\t * @param data Encoded data.\n\t * @returns Parsed and cast data.\n\t */\n\tprotected _parseData(data: string) {\n\t\tconst parsed = JSON.parse(data);\n\t\treturn this._castData(parsed);\n\t}\n\n\t/**\n\t * Cast the parsed data.\n\t *\n\t * @param packages Parsed data.\n\t * @returns Cast data.\n\t */\n\tprotected _castData(packages: any) {\n\t\tif (\n\t\t\t!packages ||\n\t\t\ttypeof packages !== 'object' ||\n\t\t\ttypeof packages.format !== 'string' ||\n\t\t\t!Array.isArray(packages.packages)\n\t\t) {\n\t\t\tthrow new Error('Failed to validate packages');\n\t\t}\n\n\t\treturn packages as IPackagesList;\n\t}\n}\n"],"file":"packages.mjs","sourceRoot":"../src"}