UNPKG

@codegena/oapi3ts

Version:

Codegeneration from OAS3 to TypeScript

133 lines 24.7 kB
import { createSourceFile, ScriptTarget, } from "typescript"; import * as _ from 'lodash'; // tslint:enable:no-implicit-dependencies import { Convertor } from './legacy/adapters/typescript'; import { ParsingError } from './legacy/core'; import { extractCommonDependencies } from './utils'; export class Facade { constructor(specification, fileSavingStrategy) { this.specification = specification; this.fileSavingStrategy = fileSavingStrategy; this.convertor = new Convertor(); this.convertorContext = {}; this.convertor.loadOAPI3Structure(specification); this.entryPoints = this.convertor.getOAPI3EntryPoints(this.convertorContext); this._operations = this.getOperations(); const { allDependencies, commonDependencies, } = extractCommonDependencies(...this._operations.map(operation => operation.allDependencies)); this._allDependencies = allDependencies; this._commonDependencies = commonDependencies; } get allDependencies() { return this._allDependencies; } get commonDependencies() { return this._commonDependencies; } get operations() { return this._operations; } commit() { const committingSources = this._allDependencies.forEach(dependency => { this.fileSavingStrategy.commit(dependency.source); }); } getOperations() { return this.convertor.getApiMeta().map(({ apiMeta, operationJsonPath }) => { const oas3OperationJsonPath = operationJsonPath; const oas3Operation = _.get(this.specification, operationJsonPath); const parameters = this.extractDependencies(apiMeta, apiMeta.paramsModelName); const request = this.extractDependencies(apiMeta, apiMeta.requestModelName); const response = this.extractDependencies(apiMeta, apiMeta.responseModelName); if (parameters) { parameters.schema = apiMeta.paramsSchema; } if (request) { request.schema = apiMeta.requestSchema; } if (response) { response.schema = apiMeta.responseSchema; } return Object.assign(Object.assign({ oas3OperationJsonPath, oas3Operation, method: apiMeta.method, path: apiMeta.path, servers: apiMeta.servers, parameters, request, response, dependencies: [] }, extractCommonDependencies([ parameters, request, response, ].filter(dep => !!dep), (parameters === null || parameters === void 0 ? void 0 : parameters.dependencies) || [], (request === null || request === void 0 ? void 0 : request.dependencies) || [], (response === null || response === void 0 ? void 0 : response.dependencies) || [])), { queryParameters: apiMeta.queryParams || null }); }); } extractDependencies(operationMeta, modelName) { const neededEntrypoint = this.entryPoints.find(entrypoint => entrypoint.modelName === modelName); if (!neededEntrypoint) { return null; } const renderedDependencies = this.renderEntrypointWithDeps(neededEntrypoint, operationMeta.baseTypeName); const parametersModelSource = renderedDependencies.pop(); return { source: parametersModelSource.source, dependencies: renderedDependencies, schema: neededEntrypoint.schema, }; } renderEntrypointWithDeps(entrypoint, operationName) { const result = {}; const topLevelModelName = entrypoint.modelName || entrypoint.suggestedModelName; Convertor.renderRecursive([entrypoint], (descriptor, text, dependencies) => { const modelName = descriptor.modelName || descriptor.suggestedModelName; let fullpath; if (modelName === topLevelModelName) { fullpath = this.fileSavingStrategy.getDependencyFullPath(modelName, operationName); } else { fullpath = this.fileSavingStrategy .getCommonDependencyFullPath(modelName); } const renderedDependencies = _.uniq(dependencies).map((dependency) => { const dependencyName = dependency.modelName || dependency.suggestedModelName; const dependencyFullPath = this.fileSavingStrategy .getCommonDependencyFullPath(dependencyName); const existedDependency = result[dependencyFullPath]; if (!existedDependency) { throw new ParsingError('Error at dependency graph rendering!', { descriptors: [descriptor, ...dependencies], oasStructure: this.specification, schema: dependency.schema, relatedRef: dependency.originalSchemaPath, }); } return existedDependency; }); result[fullpath] = { source: this.createSource(fullpath, text, renderedDependencies), schema: descriptor.schema, dependencies: renderedDependencies, }; }); return _.values(result); } createSource(fullpath, text, dependencies) { const imports = dependencies.map(dependency => { const importPath = this.fileSavingStrategy.getRelativePath(fullpath, dependency.source.fileName).replace(/\.\w+$/, ''); const dependencyIdentifiers = this .findRootIdentifiers(dependency.source) .join(', '); return `import { ${dependencyIdentifiers} } from '${importPath}';`; }); const importsBlock = imports.join('\n'); const textWithImports = importsBlock.length ? [importsBlock, text].join('\n\n') : text; return createSourceFile(fullpath, textWithImports, ScriptTarget.Latest); } findRootIdentifiers(source) { if (!source.statements) { return []; } return source.statements .map(statement => { var _a; return (_a = statement['name']) === null || _a === void 0 ? void 0 : _a.escapedText; }) .filter(name => !!name); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjYWRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGlicy9vYXBpM3RzL3NyYy9mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGdCQUFnQixFQUVoQixZQUFZLEdBQ2YsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFZNUIseUNBQXlDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTTdDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVwRCxNQUFNLE9BQU8sTUFBTTtJQXFCZixZQUNvQixhQUFnQyxFQUM3QixrQkFBc0M7UUFEekMsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQzdCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFUckQsY0FBUyxHQUFjLElBQUksU0FBUyxFQUFFLENBQUM7UUFDdkMscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBVTFCLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXhDLE1BQU0sRUFDRixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ3JCLEdBQUcseUJBQXlCLENBQ3pCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FDaEMsU0FBUyxDQUFDLGVBQWUsQ0FDNUIsQ0FDSixDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUN4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QUM7WUFFeEIsTUFBTSxxQkFBcUIsR0FBRyxJQUFJO2lCQUM3QixtQkFBbUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2lCQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEIsT0FBTyxZQUFZLHFCQUFxQixZQUFZLFVBQVUsSUFBSSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsTUFBTTtZQUN2QyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRVgsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sbUJBQW1CLENBQUMsTUFBa0I7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDcEIsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELE9BQU8sTUFBTSxDQUFDLFVBQVU7YUFDbkIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQUMsT0FBQSxNQUFBLFNBQVMsQ0FBQyxNQUFNLENBQUMsMENBQUUsV0FBVyxDQUFBLEVBQUEsQ0FBQzthQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjcmVhdGVTb3VyY2VGaWxlLFxuICAgIFNvdXJjZUZpbGUsXG4gICAgU2NyaXB0VGFyZ2V0LFxufSBmcm9tIFwidHlwZXNjcmlwdFwiO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgT2FzM1NwZWNpZmljYXRpb24gfSBmcm9tICdAY29kZWdlbmEvZGVmaW5pdGlvbnMvb2FzMyc7XG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1pbXBsaWNpdC1kZXBlbmRlbmNpZXNcbmltcG9ydCB7XG4gICAgRGVwZW5kZW5jeSxcbiAgICBGYWNhZGUgYXMgRmFjYWRlQ29udHJhY3QsXG4gICAgRmlsZVNhdmluZ1N0cmF0ZWd5LFxuICAgIE9wZXJhdGlvbixcbiAgICBQYXJhbWV0ZXJzLFxuICAgIFJlcXVlc3QsXG4gICAgUmVzcG9uc2UsXG59IGZyb20gJ0Bjb2RlZ2VuYS9vYXBpM3RzL2NvbnRyYWN0Jztcbi8vIHRzbGludDplbmFibGU6bm8taW1wbGljaXQtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBDb252ZXJ0b3IgfSBmcm9tICcuL2xlZ2FjeS9hZGFwdGVycy90eXBlc2NyaXB0JztcbmltcG9ydCB7IFBhcnNpbmdFcnJvciB9IGZyb20gJy4vbGVnYWN5L2NvcmUnO1xuaW1wb3J0IHtcbiAgICBEYXRhVHlwZUNvbnRhaW5lcixcbiAgICBBcGlNZXRhSW5mbyxcbiAgICBEYXRhVHlwZURlc2NyaXB0b3IsXG59IGZyb20gXCIuL2xlZ2FjeS9jb3JlXCI7XG5pbXBvcnQgeyBleHRyYWN0Q29tbW9uRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBGYWNhZGUgaW1wbGVtZW50cyBGYWNhZGVDb250cmFjdCB7XG5cbiAgICBwdWJsaWMgZ2V0IGFsbERlcGVuZGVuY2llcygpOiBEZXBlbmRlbmN5W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsRGVwZW5kZW5jaWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29tbW9uRGVwZW5kZW5jaWVzKCk6IERlcGVuZGVuY3lbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21tb25EZXBlbmRlbmNpZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvcGVyYXRpb25zKCk6IE9wZXJhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb252ZXJ0b3I6IENvbnZlcnRvciA9IG5ldyBDb252ZXJ0b3IoKTtcbiAgICBwcml2YXRlIGNvbnZlcnRvckNvbnRleHQgPSB7fTtcbiAgICBwcml2YXRlIGVudHJ5UG9pbnRzOiBEYXRhVHlwZUNvbnRhaW5lcjtcbiAgICBwcml2YXRlIF9hbGxEZXBlbmRlbmNpZXM6IERlcGVuZGVuY3lbXTtcbiAgICBwcml2YXRlIF9jb21tb25EZXBlbmRlbmNpZXM6IERlcGVuZGVuY3lbXTtcbiAgICBwcml2YXRlIF9vcGVyYXRpb25zOiBPcGVyYXRpb25bXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3BlY2lmaWNhdGlvbjogT2FzM1NwZWNpZmljYXRpb24sXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBmaWxlU2F2aW5nU3RyYXRlZ3k6IEZpbGVTYXZpbmdTdHJhdGVneSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5jb252ZXJ0b3IubG9hZE9BUEkzU3RydWN0dXJlKHNwZWNpZmljYXRpb24pO1xuICAgICAgICB0aGlzLmVudHJ5UG9pbnRzID0gdGhpcy5jb252ZXJ0b3IuZ2V0T0FQSTNFbnRyeVBvaW50cyh0aGlzLmNvbnZlcnRvckNvbnRleHQpO1xuICAgICAgICB0aGlzLl9vcGVyYXRpb25zID0gdGhpcy5nZXRPcGVyYXRpb25zKCk7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgYWxsRGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgY29tbW9uRGVwZW5kZW5jaWVzLFxuICAgICAgICB9ID0gZXh0cmFjdENvbW1vbkRlcGVuZGVuY2llcyhcbiAgICAgICAgICAgIC4uLnRoaXMuX29wZXJhdGlvbnMubWFwKG9wZXJhdGlvbiA9PlxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hbGxEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2FsbERlcGVuZGVuY2llcyA9IGFsbERlcGVuZGVuY2llcztcbiAgICAgICAgdGhpcy5fY29tbW9uRGVwZW5kZW5jaWVzID0gY29tbW9uRGVwZW5kZW5jaWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21taXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbW1pdHRpbmdTb3VyY2VzID0gdGhpcy5fYWxsRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbGVTYXZpbmdTdHJhdGVneS5jb21taXQoZGVwZW5kZW5jeS5zb3VyY2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9wZXJhdGlvbnMoKTogT3BlcmF0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0b3IuZ2V0QXBpTWV0YSgpLm1hcChcbiAgICAgICAgICAgICh7YXBpTWV0YSwgb3BlcmF0aW9uSnNvblBhdGh9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2FzM09wZXJhdGlvbkpzb25QYXRoID0gb3BlcmF0aW9uSnNvblBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2FzM09wZXJhdGlvbiA9IF8uZ2V0KHRoaXMuc3BlY2lmaWNhdGlvbiwgb3BlcmF0aW9uSnNvblBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLmV4dHJhY3REZXBlbmRlbmNpZXM8UGFyYW1ldGVycz4oYXBpTWV0YSwgYXBpTWV0YS5wYXJhbXNNb2RlbE5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmV4dHJhY3REZXBlbmRlbmNpZXM8UmVxdWVzdD4oYXBpTWV0YSwgYXBpTWV0YS5yZXF1ZXN0TW9kZWxOYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuZXh0cmFjdERlcGVuZGVuY2llczxSZXNwb25zZT4oYXBpTWV0YSwgYXBpTWV0YS5yZXNwb25zZU1vZGVsTmFtZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNjaGVtYSA9IGFwaU1ldGEucGFyYW1zU2NoZW1hO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2NoZW1hID0gYXBpTWV0YS5yZXF1ZXN0U2NoZW1hO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zY2hlbWEgPSBhcGlNZXRhLnJlc3BvbnNlU2NoZW1hO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9hczNPcGVyYXRpb25Kc29uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgb2FzM09wZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBhcGlNZXRhLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYXBpTWV0YS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJzOiBhcGlNZXRhLnNlcnZlcnMsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAuLi5leHRyYWN0Q29tbW9uRGVwZW5kZW5jaWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0uZmlsdGVyKGRlcCA9PiAhIWRlcCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzPy5kZXBlbmRlbmNpZXMgfHwgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Py5kZXBlbmRlbmNpZXMgfHwgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZT8uZGVwZW5kZW5jaWVzIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnM6IGFwaU1ldGEucXVlcnlQYXJhbXMgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3REZXBlbmRlbmNpZXM8VCBleHRlbmRzIERlcGVuZGVuY3k+KFxuICAgICAgICBvcGVyYXRpb25NZXRhOiBBcGlNZXRhSW5mbyxcbiAgICAgICAgbW9kZWxOYW1lOiBzdHJpbmcsXG4gICAgKTogVCB7XG4gICAgICAgIGNvbnN0IG5lZWRlZEVudHJ5cG9pbnQgPSB0aGlzLmVudHJ5UG9pbnRzLmZpbmQoXG4gICAgICAgICAgICBlbnRyeXBvaW50ID0+IGVudHJ5cG9pbnQubW9kZWxOYW1lID09PSBtb2RlbE5hbWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFuZWVkZWRFbnRyeXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkRGVwZW5kZW5jaWVzID0gdGhpcy5yZW5kZXJFbnRyeXBvaW50V2l0aERlcHMoXG4gICAgICAgICAgICBuZWVkZWRFbnRyeXBvaW50LFxuICAgICAgICAgICAgb3BlcmF0aW9uTWV0YS5iYXNlVHlwZU5hbWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVyc01vZGVsU291cmNlID0gcmVuZGVyZWREZXBlbmRlbmNpZXMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZTogcGFyYW1ldGVyc01vZGVsU291cmNlLnNvdXJjZSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogcmVuZGVyZWREZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICBzY2hlbWE6IG5lZWRlZEVudHJ5cG9pbnQuc2NoZW1hLFxuICAgICAgICB9IGFzIFQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJFbnRyeXBvaW50V2l0aERlcHMoXG4gICAgICAgIGVudHJ5cG9pbnQ6IERhdGFUeXBlRGVzY3JpcHRvcixcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogc3RyaW5nLFxuICAgICk6IERlcGVuZGVuY3lbXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeT4gPSB7fTtcbiAgICAgICAgY29uc3QgdG9wTGV2ZWxNb2RlbE5hbWUgPSBlbnRyeXBvaW50Lm1vZGVsTmFtZSB8fCBlbnRyeXBvaW50LnN1Z2dlc3RlZE1vZGVsTmFtZTtcblxuICAgICAgICBDb252ZXJ0b3IucmVuZGVyUmVjdXJzaXZlKFxuICAgICAgICAgICAgW2VudHJ5cG9pbnRdLFxuICAgICAgICAgICAgKGRlc2NyaXB0b3IsIHRleHQsIGRlcGVuZGVuY2llcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGRlc2NyaXB0b3IubW9kZWxOYW1lIHx8IGRlc2NyaXB0b3Iuc3VnZ2VzdGVkTW9kZWxOYW1lO1xuICAgICAgICAgICAgICAgIGxldCBmdWxscGF0aDtcblxuICAgICAgICAgICAgICAgIGlmIChtb2RlbE5hbWUgPT09IHRvcExldmVsTW9kZWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gdGhpcy5maWxlU2F2aW5nU3RyYXRlZ3kuZ2V0RGVwZW5kZW5jeUZ1bGxQYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCA9IHRoaXMuZmlsZVNhdmluZ1N0cmF0ZWd5XG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tbW9uRGVwZW5kZW5jeUZ1bGxQYXRoKG1vZGVsTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZWREZXBlbmRlbmNpZXMgPSBfLnVuaXEoZGVwZW5kZW5jaWVzKS5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChkZXBlbmRlbmN5OiBEYXRhVHlwZURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5tb2RlbE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZXBlbmRlbmN5LnN1Z2dlc3RlZE1vZGVsTmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jeUZ1bGxQYXRoID0gdGhpcy5maWxlU2F2aW5nU3RyYXRlZ3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tbW9uRGVwZW5kZW5jeUZ1bGxQYXRoKGRlcGVuZGVuY3lOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RlZERlcGVuZGVuY3kgPSByZXN1bHRbZGVwZW5kZW5jeUZ1bGxQYXRoXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGVkRGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzaW5nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBhdCBkZXBlbmRlbmN5IGdyYXBoIHJlbmRlcmluZyEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yczogW2Rlc2NyaXB0b3IsIC4uLmRlcGVuZGVuY2llc10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYXNTdHJ1Y3R1cmU6IHRoaXMuc3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogZGVwZW5kZW5jeS5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkUmVmOiBkZXBlbmRlbmN5Lm9yaWdpbmFsU2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGVkRGVwZW5kZW5jeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICByZXN1bHRbZnVsbHBhdGhdID0ge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuY3JlYXRlU291cmNlKGZ1bGxwYXRoLCB0ZXh0LCByZW5kZXJlZERlcGVuZGVuY2llcyksXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYTogZGVzY3JpcHRvci5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llczogcmVuZGVyZWREZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gXy52YWx1ZXMocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVNvdXJjZShcbiAgICAgICAgZnVsbHBhdGg6IHN0cmluZyxcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY3lbXSxcbiAgICApOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGRlcGVuZGVuY2llcy5tYXAoZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5maWxlU2F2aW5nU3RyYXRlZ3kuZ2V0UmVsYXRpdmVQYXRoKFxuICAgICAgICAgICAgICAgIGZ1bGxwYXRoLFxuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kuc291cmNlLmZpbGVOYW1lLFxuICAgICAgICAgICAgKS5yZXBsYWNlKC9cXC5cXHcrJC8sICcnKTtcblxuICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jeUlkZW50aWZpZXJzID0gdGhpc1xuICAgICAgICAgICAgICAgIC5maW5kUm9vdElkZW50aWZpZXJzKGRlcGVuZGVuY3kuc291cmNlKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7ZGVwZW5kZW5jeUlkZW50aWZpZXJzfSB9IGZyb20gJyR7aW1wb3J0UGF0aH0nO2A7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbXBvcnRzQmxvY2sgPSBpbXBvcnRzLmpvaW4oJ1xcbicpO1xuICAgICAgICBjb25zdCB0ZXh0V2l0aEltcG9ydHMgPSBpbXBvcnRzQmxvY2subGVuZ3RoXG4gICAgICAgICAgICA/IFtpbXBvcnRzQmxvY2ssIHRleHRdLmpvaW4oJ1xcblxcbicpXG4gICAgICAgICAgICA6IHRleHQ7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNvdXJjZUZpbGUoZnVsbHBhdGgsIHRleHRXaXRoSW1wb3J0cywgU2NyaXB0VGFyZ2V0LkxhdGVzdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kUm9vdElkZW50aWZpZXJzKHNvdXJjZTogU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKCFzb3VyY2Uuc3RhdGVtZW50cykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdGF0ZW1lbnRzXG4gICAgICAgICAgICAubWFwKHN0YXRlbWVudCA9PiBzdGF0ZW1lbnRbJ25hbWUnXT8uZXNjYXBlZFRleHQpXG4gICAgICAgICAgICAuZmlsdGVyKG5hbWUgPT4gISFuYW1lKTtcbiAgICB9XG59XG4iXX0=