UNPKG

@tripsnek/tmf

Version:

TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)

228 lines (222 loc) 28.6 kB
import { TGenUtils as DU } from './tgen-utils.js'; /** * Generates a package initializer file for the root package that handles * initialization of the entire package hierarchy without circular imports. */ export class TGeneratorPackageInitializer { /** * Generates the package initializer content for a root package. * @param rootPackage The root EPackage * @returns The generated TypeScript content */ generate(rootPackage) { if (rootPackage.getESuperPackage()) { throw new Error('Package initializer should only be generated for root packages'); } const allPackages = this.collectAllPackages(rootPackage); const className = TGeneratorPackageInitializer.generateClassName(rootPackage); const fileName = TGeneratorPackageInitializer.generateFileName(rootPackage); return this.generateContent(rootPackage, allPackages, className); } /** * Generates the class name for the package initializer. */ static generateClassName(rootPackage) { return DU.capitalize(rootPackage.getName()) + 'PackageInitializer'; } /** * Generates the file name for the package initializer. */ static generateFileName(rootPackage) { return DU.kebabLowerCase(rootPackage.getName()) + '-package-initializer'; } /** * Collects all packages in the hierarchy starting from the root. */ collectAllPackages(rootPackage) { const allPackages = []; this.collectPackagesRecursive(rootPackage, allPackages); return allPackages; } /** * Recursively collects all packages in the hierarchy. */ collectPackagesRecursive(pkg, collected) { collected.push(pkg); for (const subPackage of pkg.getESubPackages()) { this.collectPackagesRecursive(subPackage, collected); } } /** * Generates the full content of the package initializer file. */ generateContent(rootPackage, allPackages, className) { const imports = this.generateImports(allPackages); const classBody = this.generateClassBody(allPackages, className); return `${imports} ${classBody}`; } /** * Generates import statements for all packages. */ generateImports(allPackages) { let imports = ''; for (const pkg of allPackages) { const packageClassName = DU.genPackageClassName(pkg); const packageFileName = DU.genPackageFileName(pkg); const factoryClassName = DU.genFactoryClassName(pkg); const factoryFileName = DU.genFactoryFileName(pkg); // Calculate relative path from root to this package const relativePath = this.getRelativePathToPackage(pkg); imports += `import { ${packageClassName} } from '${relativePath}${packageFileName}.js';\n`; imports += `import { ${factoryClassName} } from '${relativePath}${factoryFileName}.js';\n`; } imports += `import { TJson, EClassImpl } from '@tripsnek/tmf';\n`; return imports; } /** * Calculates the relative path from root directory to a package directory. */ getRelativePathToPackage(pkg) { const pathParts = []; let current = pkg; // Build path from package up to root while (current.getESuperPackage()) { pathParts.unshift(current.getName()); current = current.getESuperPackage(); } // If this is the root package, use current directory if (pathParts.length === 0) { return './'; } // Build relative path return './' + pathParts.join('/') + '/'; } /** * Generates the class body with registerAll method. */ generateClassBody(allPackages, className) { const instanceDeclarations = this.generateInstanceDeclarations(allPackages); const packageRelationships = this.generatePackageRelationships(allPackages); const initializationCalls = this.generateInitializationCalls(allPackages); const pkgToFactoryRefs = this.generatePkgToFactoryRefs(allPackages); let names = ''; for (const p of allPackages) { if (names.length > 0) names += ','; names += DU.uncapitalize(p.getName()); } return `/** * A "global initializer" solution for ensuring that package contents * for an entire package hierarchy can be initialized on the first * 'touch' of any individual package, without triggering circular import * issues. * * The way it works: * 1. Whenever any package is 'touched' (by simply being referenced in code) it * initialized it's '_eINSTANCE' field, and uses it to create its initial structures * and Literals references. This does *not* require touching other packages, so there * is no risk of circular imports. * 2. When the first invocation of '<package>.eINSTANCE' is made, each package intercepts * that as a static 'get' on the property, and calls registerAll() on this instance to ensure that * ALL packages are touched and have their initial contents created. * 3. The first time registerAll() is called, the package hierarchy (sub/super) is created, and * all package contents are initialized. */ export class ${className} { private static registered = false; static registerAll() { //if registration is completed, return immediately if (this.registered) return; this.registered = true; ${instanceDeclarations} ${packageRelationships} ${initializationCalls} ${pkgToFactoryRefs} const allPkgs = [${names}]; for (const p of allPkgs) { for (const e of p.getEClassifiers()) { if (e instanceof EClassImpl) { e.recomputeAllLists(); } } } //default TJson configuration TJson.addPackages(allPkgs); } }`; } /** * Generates the instance declarations in registerAll method. */ generateInstanceDeclarations(allPackages) { let declarations = ''; for (const pkg of allPackages) { const packageClassName = DU.genPackageClassName(pkg); const variableName = DU.uncapitalize(pkg.getName()); declarations += ` const ${variableName} = ${packageClassName}._eINSTANCE;\n`; } return declarations; } /** * Generates package relationship setup code. */ generatePackageRelationships(allPackages) { let relationships = '\n //set package/sub-package relationships\n'; for (const pkg of allPackages) { const superPackage = pkg.getESuperPackage(); if (superPackage) { const pkgVarName = DU.uncapitalize(pkg.getName()); const superVarName = DU.uncapitalize(superPackage.getName()); relationships += ` ${pkgVarName}.setESuperPackage(${superVarName});\n`; } } return relationships; } /** * Generates initialization method calls. */ generateInitializationCalls(allPackages) { let calls = '\n //initialize package contents\n'; // Initialize in dependency order (root first, then children) const sortedPackages = this.sortPackagesByDependency(allPackages); for (const pkg of sortedPackages) { const variableName = DU.uncapitalize(pkg.getName()); calls += ` ${variableName}.initializePackageContents();\n`; } return calls; } generatePkgToFactoryRefs(allPackages) { let calls = '\n //initialize package to factory refs\n'; // Initialize in dependency order (root first, then children) const sortedPackages = this.sortPackagesByDependency(allPackages); for (const pkg of sortedPackages) { const variableName = DU.uncapitalize(pkg.getName()); calls += ` ${variableName}.setEFactoryInstance(${DU.genFactoryClassName(pkg)}.eINSTANCE);\n`; } return calls; } /** * Sorts packages by dependency order (parents before children). */ sortPackagesByDependency(packages) { const sorted = []; const processed = new Set(); const processPackage = (pkg) => { if (processed.has(pkg)) return; // Process super package first if it exists const superPackage = pkg.getESuperPackage(); if (superPackage && packages.includes(superPackage)) { processPackage(superPackage); } sorted.push(pkg); processed.add(pkg); }; for (const pkg of packages) { processPackage(pkg); } return sorted; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGdlbmVyYXRvci1wYWNrYWdlLWluaXRpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb3VyY2UtZ2VuZXJhdG9ycy90Z2VuZXJhdG9yLXBhY2thZ2UtaW5pdGlhbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsSUFBSSxFQUFFLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sNEJBQTRCO0lBRXZDOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsV0FBcUI7UUFDbkMsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sUUFBUSxHQUFHLDRCQUE0QixDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTVFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxXQUFxQjtRQUNuRCxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7SUFDckUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQXFCO1FBQ2xELE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztJQUMz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WUFDcEQsS0FBSyxJQUFJLE9BQU8sWUFBWSx3QkFBd0IsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNsRyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBR0Q7O09BRUc7SUFDSyx3QkFBd0IsQ0FBQyxRQUFvQjtRQUNuRCxNQUFNLE1BQU0sR0FBZSxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVksQ0FBQztRQUV0QyxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO1lBQ3ZDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsT0FBTztZQUUvQiwyQ0FBMkM7WUFDM0MsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDNUMsSUFBSSxZQUFZLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFFRixLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzNCLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRVBhY2thZ2UgfSBmcm9tICcuLi9tZXRhbW9kZWwvYXBpL2VwYWNrYWdlLmpzJztcclxuaW1wb3J0IHsgVEdlblV0aWxzIGFzIERVIH0gZnJvbSAnLi90Z2VuLXV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBwYWNrYWdlIGluaXRpYWxpemVyIGZpbGUgZm9yIHRoZSByb290IHBhY2thZ2UgdGhhdCBoYW5kbGVzXHJcbiAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBlbnRpcmUgcGFja2FnZSBoaWVyYXJjaHkgd2l0aG91dCBjaXJjdWxhciBpbXBvcnRzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRHZW5lcmF0b3JQYWNrYWdlSW5pdGlhbGl6ZXIge1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyB0aGUgcGFja2FnZSBpbml0aWFsaXplciBjb250ZW50IGZvciBhIHJvb3QgcGFja2FnZS5cclxuICAgKiBAcGFyYW0gcm9vdFBhY2thZ2UgVGhlIHJvb3QgRVBhY2thZ2VcclxuICAgKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgY29udGVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZW5lcmF0ZShyb290UGFja2FnZTogRVBhY2thZ2UpOiBzdHJpbmcge1xyXG4gICAgaWYgKHJvb3RQYWNrYWdlLmdldEVTdXBlclBhY2thZ2UoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgaW5pdGlhbGl6ZXIgc2hvdWxkIG9ubHkgYmUgZ2VuZXJhdGVkIGZvciByb290IHBhY2thZ2VzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsUGFja2FnZXMgPSB0aGlzLmNvbGxlY3RBbGxQYWNrYWdlcyhyb290UGFja2FnZSk7XHJcbiAgICBjb25zdCBjbGFzc05hbWUgPSBUR2VuZXJhdG9yUGFja2FnZUluaXRpYWxpemVyLmdlbmVyYXRlQ2xhc3NOYW1lKHJvb3RQYWNrYWdlKTtcclxuICAgIGNvbnN0IGZpbGVOYW1lID0gVEdlbmVyYXRvclBhY2thZ2VJbml0aWFsaXplci5nZW5lcmF0ZUZpbGVOYW1lKHJvb3RQYWNrYWdlKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDb250ZW50KHJvb3RQYWNrYWdlLCBhbGxQYWNrYWdlcywgY2xhc3NOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHBhY2thZ2UgaW5pdGlhbGl6ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNsYXNzTmFtZShyb290UGFja2FnZTogRVBhY2thZ2UpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIERVLmNhcGl0YWxpemUocm9vdFBhY2thZ2UuZ2V0TmFtZSgpKSArICdQYWNrYWdlSW5pdGlhbGl6ZXInO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBwYWNrYWdlIGluaXRpYWxpemVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGaWxlTmFtZShyb290UGFja2FnZTogRVBhY2thZ2UpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIERVLmtlYmFiTG93ZXJDYXNlKHJvb3RQYWNrYWdlLmdldE5hbWUoKSkgKyAnLXBhY2thZ2UtaW5pdGlhbGl6ZXInO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdHMgYWxsIHBhY2thZ2VzIGluIHRoZSBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbGxlY3RBbGxQYWNrYWdlcyhyb290UGFja2FnZTogRVBhY2thZ2UpOiBFUGFja2FnZVtdIHtcclxuICAgIGNvbnN0IGFsbFBhY2thZ2VzOiBFUGFja2FnZVtdID0gW107XHJcbiAgICB0aGlzLmNvbGxlY3RQYWNrYWdlc1JlY3Vyc2l2ZShyb290UGFja2FnZSwgYWxsUGFja2FnZXMpO1xyXG4gICAgcmV0dXJuIGFsbFBhY2thZ2VzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVjdXJzaXZlbHkgY29sbGVjdHMgYWxsIHBhY2thZ2VzIGluIHRoZSBoaWVyYXJjaHkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb2xsZWN0UGFja2FnZXNSZWN1cnNpdmUocGtnOiBFUGFja2FnZSwgY29sbGVjdGVkOiBFUGFja2FnZVtdKTogdm9pZCB7XHJcbiAgICBjb2xsZWN0ZWQucHVzaChwa2cpO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IHN1YlBhY2thZ2Ugb2YgcGtnLmdldEVTdWJQYWNrYWdlcygpKSB7XHJcbiAgICAgIHRoaXMuY29sbGVjdFBhY2thZ2VzUmVjdXJzaXZlKHN1YlBhY2thZ2UsIGNvbGxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgdGhlIGZ1bGwgY29udGVudCBvZiB0aGUgcGFja2FnZSBpbml0aWFsaXplciBmaWxlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVDb250ZW50KHJvb3RQYWNrYWdlOiBFUGFja2FnZSwgYWxsUGFja2FnZXM6IEVQYWNrYWdlW10sIGNsYXNzTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGltcG9ydHMgPSB0aGlzLmdlbmVyYXRlSW1wb3J0cyhhbGxQYWNrYWdlcyk7XHJcbiAgICBjb25zdCBjbGFzc0JvZHkgPSB0aGlzLmdlbmVyYXRlQ2xhc3NCb2R5KGFsbFBhY2thZ2VzLCBjbGFzc05hbWUpO1xyXG4gICAgXHJcbiAgICByZXR1cm4gYCR7aW1wb3J0c31cclxuXHJcbiR7Y2xhc3NCb2R5fWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgaW1wb3J0IHN0YXRlbWVudHMgZm9yIGFsbCBwYWNrYWdlcy5cclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlSW1wb3J0cyhhbGxQYWNrYWdlczogRVBhY2thZ2VbXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgaW1wb3J0cyA9ICcnO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IHBrZyBvZiBhbGxQYWNrYWdlcykge1xyXG4gICAgICBjb25zdCBwYWNrYWdlQ2xhc3NOYW1lID0gRFUuZ2VuUGFja2FnZUNsYXNzTmFtZShwa2cpO1xyXG4gICAgICBjb25zdCBwYWNrYWdlRmlsZU5hbWUgPSBEVS5nZW5QYWNrYWdlRmlsZU5hbWUocGtnKTtcclxuICAgICAgY29uc3QgZmFjdG9yeUNsYXNzTmFtZSA9IERVLmdlbkZhY3RvcnlDbGFzc05hbWUocGtnKTtcclxuICAgICAgY29uc3QgZmFjdG9yeUZpbGVOYW1lID0gRFUuZ2VuRmFjdG9yeUZpbGVOYW1lKHBrZyk7XHJcblxyXG4gICAgICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgcGF0aCBmcm9tIHJvb3QgdG8gdGhpcyBwYWNrYWdlXHJcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVQYXRoVG9QYWNrYWdlKHBrZyk7XHJcbiAgICAgIFxyXG4gICAgICBpbXBvcnRzICs9IGBpbXBvcnQgeyAke3BhY2thZ2VDbGFzc05hbWV9IH0gZnJvbSAnJHtyZWxhdGl2ZVBhdGh9JHtwYWNrYWdlRmlsZU5hbWV9LmpzJztcXG5gO1xyXG4gICAgICBpbXBvcnRzICs9IGBpbXBvcnQgeyAke2ZhY3RvcnlDbGFzc05hbWV9IH0gZnJvbSAnJHtyZWxhdGl2ZVBhdGh9JHtmYWN0b3J5RmlsZU5hbWV9LmpzJztcXG5gO1xyXG4gICAgfVxyXG4gICAgaW1wb3J0cyArPSBgaW1wb3J0IHsgVEpzb24sIEVDbGFzc0ltcGwgfSBmcm9tICdAdHJpcHNuZWsvdG1mJztcXG5gO1xyXG4gICAgXHJcbiAgICByZXR1cm4gaW1wb3J0cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSByb290IGRpcmVjdG9yeSB0byBhIHBhY2thZ2UgZGlyZWN0b3J5LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVQYXRoVG9QYWNrYWdlKHBrZzogRVBhY2thZ2UpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGF0aFBhcnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSBwa2c7XHJcbiAgICBcclxuICAgIC8vIEJ1aWxkIHBhdGggZnJvbSBwYWNrYWdlIHVwIHRvIHJvb3RcclxuICAgIHdoaWxlIChjdXJyZW50LmdldEVTdXBlclBhY2thZ2UoKSkge1xyXG4gICAgICBwYXRoUGFydHMudW5zaGlmdChjdXJyZW50LmdldE5hbWUoKSk7XHJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmdldEVTdXBlclBhY2thZ2UoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwYWNrYWdlLCB1c2UgY3VycmVudCBkaXJlY3RvcnlcclxuICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAnLi8nO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBCdWlsZCByZWxhdGl2ZSBwYXRoXHJcbiAgICByZXR1cm4gJy4vJyArIHBhdGhQYXJ0cy5qb2luKCcvJykgKyAnLyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgdGhlIGNsYXNzIGJvZHkgd2l0aCByZWdpc3RlckFsbCBtZXRob2QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUNsYXNzQm9keShhbGxQYWNrYWdlczogRVBhY2thZ2VbXSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaW5zdGFuY2VEZWNsYXJhdGlvbnMgPSB0aGlzLmdlbmVyYXRlSW5zdGFuY2VEZWNsYXJhdGlvbnMoYWxsUGFja2FnZXMpO1xyXG4gICAgY29uc3QgcGFja2FnZVJlbGF0aW9uc2hpcHMgPSB0aGlzLmdlbmVyYXRlUGFja2FnZVJlbGF0aW9uc2hpcHMoYWxsUGFja2FnZXMpO1xyXG4gICAgY29uc3QgaW5pdGlhbGl6YXRpb25DYWxscyA9IHRoaXMuZ2VuZXJhdGVJbml0aWFsaXphdGlvbkNhbGxzKGFsbFBhY2thZ2VzKTtcclxuICAgIGNvbnN0IHBrZ1RvRmFjdG9yeVJlZnMgPSB0aGlzLmdlbmVyYXRlUGtnVG9GYWN0b3J5UmVmcyhhbGxQYWNrYWdlcyk7XHJcblxyXG4gICAgICAgIGxldCBuYW1lcyA9ICcnO1xyXG4gICAgZm9yKGNvbnN0IHAgb2YgYWxsUGFja2FnZXMpe1xyXG4gICAgICBpZihuYW1lcy5sZW5ndGg+MCkgbmFtZXMgKz0gJywnO1xyXG4gICAgICBuYW1lcyArPSBEVS51bmNhcGl0YWxpemUocC5nZXROYW1lKCkpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gYC8qKlxyXG4gKiBBIFwiZ2xvYmFsIGluaXRpYWxpemVyXCIgc29sdXRpb24gZm9yIGVuc3VyaW5nIHRoYXQgcGFja2FnZSBjb250ZW50c1xyXG4gKiBmb3IgYW4gZW50aXJlIHBhY2thZ2UgaGllcmFyY2h5IGNhbiBiZSBpbml0aWFsaXplZCBvbiB0aGUgZmlyc3RcclxuICogJ3RvdWNoJyBvZiBhbnkgaW5kaXZpZHVhbCBwYWNrYWdlLCB3aXRob3V0IHRyaWdnZXJpbmcgY2lyY3VsYXIgaW1wb3J0XHJcbiAqIGlzc3Vlcy5cclxuICpcclxuICogVGhlIHdheSBpdCB3b3JrczpcclxuICogIDEuIFdoZW5ldmVyIGFueSBwYWNrYWdlIGlzICd0b3VjaGVkJyAoYnkgc2ltcGx5IGJlaW5nIHJlZmVyZW5jZWQgaW4gY29kZSkgaXRcclxuICogICAgIGluaXRpYWxpemVkIGl0J3MgJ19lSU5TVEFOQ0UnIGZpZWxkLCBhbmQgdXNlcyBpdCB0byBjcmVhdGUgaXRzIGluaXRpYWwgc3RydWN0dXJlc1xyXG4gKiAgICAgYW5kIExpdGVyYWxzIHJlZmVyZW5jZXMuIFRoaXMgZG9lcyAqbm90KiByZXF1aXJlIHRvdWNoaW5nIG90aGVyIHBhY2thZ2VzLCBzbyB0aGVyZVxyXG4gKiAgICAgaXMgbm8gcmlzayBvZiBjaXJjdWxhciBpbXBvcnRzLlxyXG4gKiAgMi4gV2hlbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiAnPHBhY2thZ2U+LmVJTlNUQU5DRScgaXMgbWFkZSwgZWFjaCBwYWNrYWdlIGludGVyY2VwdHNcclxuICogICAgIHRoYXQgYXMgYSBzdGF0aWMgJ2dldCcgb24gdGhlIHByb3BlcnR5LCBhbmQgY2FsbHMgcmVnaXN0ZXJBbGwoKSBvbiB0aGlzIGluc3RhbmNlIHRvIGVuc3VyZSB0aGF0XHJcbiAqICAgICBBTEwgcGFja2FnZXMgYXJlIHRvdWNoZWQgYW5kIGhhdmUgdGhlaXIgaW5pdGlhbCBjb250ZW50cyBjcmVhdGVkLlxyXG4gKiAgMy4gVGhlIGZpcnN0IHRpbWUgcmVnaXN0ZXJBbGwoKSBpcyBjYWxsZWQsIHRoZSBwYWNrYWdlIGhpZXJhcmNoeSAoc3ViL3N1cGVyKSBpcyBjcmVhdGVkLCBhbmRcclxuICogICAgIGFsbCBwYWNrYWdlIGNvbnRlbnRzIGFyZSBpbml0aWFsaXplZC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyAke2NsYXNzTmFtZX0ge1xyXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyZWQgPSBmYWxzZTtcclxuXHJcbiAgc3RhdGljIHJlZ2lzdGVyQWxsKCkge1xyXG4gICAgLy9pZiByZWdpc3RyYXRpb24gaXMgY29tcGxldGVkLCByZXR1cm4gaW1tZWRpYXRlbHlcclxuICAgIGlmICh0aGlzLnJlZ2lzdGVyZWQpIHJldHVybjtcclxuICAgIHRoaXMucmVnaXN0ZXJlZCA9IHRydWU7XHJcbiR7aW5zdGFuY2VEZWNsYXJhdGlvbnN9XHJcbiR7cGFja2FnZVJlbGF0aW9uc2hpcHN9XHJcbiR7aW5pdGlhbGl6YXRpb25DYWxsc31cclxuJHtwa2dUb0ZhY3RvcnlSZWZzfVxyXG5cclxuICAgIGNvbnN0IGFsbFBrZ3MgPSBbJHtuYW1lc31dO1xyXG5cclxuICAgIGZvciAoY29uc3QgcCBvZiBhbGxQa2dzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZSBvZiBwLmdldEVDbGFzc2lmaWVycygpKSB7XHJcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFQ2xhc3NJbXBsKSB7XHJcbiAgICAgICAgICBlLnJlY29tcHV0ZUFsbExpc3RzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9kZWZhdWx0IFRKc29uIGNvbmZpZ3VyYXRpb25cclxuICAgIFRKc29uLmFkZFBhY2thZ2VzKGFsbFBrZ3MpO1xyXG5cclxuICB9XHJcbn1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIHRoZSBpbnN0YW5jZSBkZWNsYXJhdGlvbnMgaW4gcmVnaXN0ZXJBbGwgbWV0aG9kLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVJbnN0YW5jZURlY2xhcmF0aW9ucyhhbGxQYWNrYWdlczogRVBhY2thZ2VbXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgZGVjbGFyYXRpb25zID0gJyc7XHJcbiAgICBcclxuICAgIGZvciAoY29uc3QgcGtnIG9mIGFsbFBhY2thZ2VzKSB7XHJcbiAgICAgIGNvbnN0IHBhY2thZ2VDbGFzc05hbWUgPSBEVS5nZW5QYWNrYWdlQ2xhc3NOYW1lKHBrZyk7XHJcbiAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IERVLnVuY2FwaXRhbGl6ZShwa2cuZ2V0TmFtZSgpKTtcclxuICAgICAgXHJcbiAgICAgIGRlY2xhcmF0aW9ucyArPSBgICAgIGNvbnN0ICR7dmFyaWFibGVOYW1lfSA9ICR7cGFja2FnZUNsYXNzTmFtZX0uX2VJTlNUQU5DRTtcXG5gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gZGVjbGFyYXRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIHBhY2thZ2UgcmVsYXRpb25zaGlwIHNldHVwIGNvZGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVBhY2thZ2VSZWxhdGlvbnNoaXBzKGFsbFBhY2thZ2VzOiBFUGFja2FnZVtdKTogc3RyaW5nIHtcclxuICAgIGxldCByZWxhdGlvbnNoaXBzID0gJ1xcbiAgICAvL3NldCBwYWNrYWdlL3N1Yi1wYWNrYWdlIHJlbGF0aW9uc2hpcHNcXG4nO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IHBrZyBvZiBhbGxQYWNrYWdlcykge1xyXG4gICAgICBjb25zdCBzdXBlclBhY2thZ2UgPSBwa2cuZ2V0RVN1cGVyUGFja2FnZSgpO1xyXG4gICAgICBpZiAoc3VwZXJQYWNrYWdlKSB7XHJcbiAgICAgICAgY29uc3QgcGtnVmFyTmFtZSA9IERVLnVuY2FwaXRhbGl6ZShwa2cuZ2V0TmFtZSgpKTtcclxuICAgICAgICBjb25zdCBzdXBlclZhck5hbWUgPSBEVS51bmNhcGl0YWxpemUoc3VwZXJQYWNrYWdlLmdldE5hbWUoKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmVsYXRpb25zaGlwcyArPSBgICAgICR7cGtnVmFyTmFtZX0uc2V0RVN1cGVyUGFja2FnZSgke3N1cGVyVmFyTmFtZX0pO1xcbmA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgaW5pdGlhbGl6YXRpb24gbWV0aG9kIGNhbGxzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVJbml0aWFsaXphdGlvbkNhbGxzKGFsbFBhY2thZ2VzOiBFUGFja2FnZVtdKTogc3RyaW5nIHtcclxuICAgIGxldCBjYWxscyA9ICdcXG4gICAgLy9pbml0aWFsaXplIHBhY2thZ2UgY29udGVudHNcXG4nO1xyXG4gICAgXHJcbiAgICAvLyBJbml0aWFsaXplIGluIGRlcGVuZGVuY3kgb3JkZXIgKHJvb3QgZmlyc3QsIHRoZW4gY2hpbGRyZW4pXHJcbiAgICBjb25zdCBzb3J0ZWRQYWNrYWdlcyA9IHRoaXMuc29ydFBhY2thZ2VzQnlEZXBlbmRlbmN5KGFsbFBhY2thZ2VzKTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBwa2cgb2Ygc29ydGVkUGFja2FnZXMpIHtcclxuICAgICAgY29uc3QgdmFyaWFibGVOYW1lID0gRFUudW5jYXBpdGFsaXplKHBrZy5nZXROYW1lKCkpO1xyXG4gICAgICBjYWxscyArPSBgICAgICR7dmFyaWFibGVOYW1lfS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7XFxuYDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGNhbGxzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVBrZ1RvRmFjdG9yeVJlZnMoYWxsUGFja2FnZXM6IEVQYWNrYWdlW10pOiBzdHJpbmcge1xyXG4gICAgbGV0IGNhbGxzID0gJ1xcbiAgICAvL2luaXRpYWxpemUgcGFja2FnZSB0byBmYWN0b3J5IHJlZnNcXG4nO1xyXG4gICAgXHJcbiAgICAvLyBJbml0aWFsaXplIGluIGRlcGVuZGVuY3kgb3JkZXIgKHJvb3QgZmlyc3QsIHRoZW4gY2hpbGRyZW4pXHJcbiAgICBjb25zdCBzb3J0ZWRQYWNrYWdlcyA9IHRoaXMuc29ydFBhY2thZ2VzQnlEZXBlbmRlbmN5KGFsbFBhY2thZ2VzKTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBwa2cgb2Ygc29ydGVkUGFja2FnZXMpIHtcclxuICAgICAgY29uc3QgdmFyaWFibGVOYW1lID0gRFUudW5jYXBpdGFsaXplKHBrZy5nZXROYW1lKCkpO1xyXG4gICAgICBjYWxscyArPSBgICAgICR7dmFyaWFibGVOYW1lfS5zZXRFRmFjdG9yeUluc3RhbmNlKCR7RFUuZ2VuRmFjdG9yeUNsYXNzTmFtZShwa2cpfS5lSU5TVEFOQ0UpO1xcbmA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2FsbHM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydHMgcGFja2FnZXMgYnkgZGVwZW5kZW5jeSBvcmRlciAocGFyZW50cyBiZWZvcmUgY2hpbGRyZW4pLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFBhY2thZ2VzQnlEZXBlbmRlbmN5KHBhY2thZ2VzOiBFUGFja2FnZVtdKTogRVBhY2thZ2VbXSB7XHJcbiAgICBjb25zdCBzb3J0ZWQ6IEVQYWNrYWdlW10gPSBbXTtcclxuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8RVBhY2thZ2U+KCk7XHJcbiAgICBcclxuICAgIGNvbnN0IHByb2Nlc3NQYWNrYWdlID0gKHBrZzogRVBhY2thZ2UpID0+IHtcclxuICAgICAgaWYgKHByb2Nlc3NlZC5oYXMocGtnKSkgcmV0dXJuO1xyXG4gICAgICBcclxuICAgICAgLy8gUHJvY2VzcyBzdXBlciBwYWNrYWdlIGZpcnN0IGlmIGl0IGV4aXN0c1xyXG4gICAgICBjb25zdCBzdXBlclBhY2thZ2UgPSBwa2cuZ2V0RVN1cGVyUGFja2FnZSgpO1xyXG4gICAgICBpZiAoc3VwZXJQYWNrYWdlICYmIHBhY2thZ2VzLmluY2x1ZGVzKHN1cGVyUGFja2FnZSkpIHtcclxuICAgICAgICBwcm9jZXNzUGFja2FnZShzdXBlclBhY2thZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBzb3J0ZWQucHVzaChwa2cpO1xyXG4gICAgICBwcm9jZXNzZWQuYWRkKHBrZyk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IHBrZyBvZiBwYWNrYWdlcykge1xyXG4gICAgICBwcm9jZXNzUGFja2FnZShwa2cpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gc29ydGVkO1xyXG4gIH1cclxufSJdfQ==