UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

164 lines 18.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.bestAssemblyMatch = bestAssemblyMatch; exports.discoverAssemblies = discoverAssemblies; const fs = __importStar(require("fs")); const path = __importStar(require("path")); const zlib = __importStar(require("zlib")); const spec_1 = require("@jsii/spec"); const fg = __importStar(require("fast-glob")); const semver = __importStar(require("semver")); const errors_1 = require("../../errors"); ; /** * Given an AssemblyLookup map and an assembly name + version constraint, * returns the best possible match. * * This is not a strict semver implementation, instead the following algorithm is used: * 1. the highest (latest) version matching the semver constraint * 2. a matching major version, even if constraint doesn't match (this will use the lowest major version of the constraint) * 3. the highest available version of the dependency regardless of constraint * * @param assemblies a map of assembly identifier to name, version and path * @param constraint the assembly name and version to match * * @returns the best matching assembly info or undefined if no match was found */ function bestAssemblyMatch(assemblies, constraint) { const lastAtIndex = constraint.lastIndexOf('@'); const name = lastAtIndex === -1 ? constraint : constraint.substring(0, lastAtIndex); const versionConstraint = lastAtIndex === -1 ? undefined : constraint.substring(lastAtIndex + 1); const candidates = Object.values(assemblies).filter(a => a.name === name); if (candidates.length === 0) { // `assemblies` is a view on top of the installation directory, // it should contain the assembly. throw new errors_1.CorruptedAssemblyError(`Unable to locate assembly for dependency: ${constraint}`); } candidates.sort((a, b) => semver.rcompare(a.version, b.version) || 0); if (!versionConstraint) { return candidates[0]; } // 1. Try semver constraint match const semverMatch = candidates.find(a => { try { return semver.satisfies(a.version, versionConstraint); } catch { return false; } }); if (semverMatch) { return semverMatch; } // 2. Try major version match const targetVersion = semver.valid(versionConstraint) || semver.minVersion(versionConstraint); if (targetVersion) { const constraintMajor = semver.major(targetVersion); const majorMatch = candidates.find(a => { try { return semver.major(a.version) === constraintMajor; } catch { return false; } }); if (majorMatch) { return majorMatch; } } // 3. Return highest version regardless of constraint return candidates[0]; } /** * Search a directory for jsii assemblies and return a map of assembly identifier to name, version and path. */ function discoverAssemblies(searchDir) { // searchDir might include backslashes on Windows. // The glob pattern must only used forward slashes, so we pass the assembliesDir as CWD which does not have this restriction const discovered = fg.sync(`**/${spec_1.SPEC_FILE_NAME}`, { cwd: path.normalize(searchDir), absolute: true, }); const assemblies = {}; for (let dotJsii of discovered) { const info = getAssemblyInfoFromFile(dotJsii); assemblies[`${info.name}@${info.version}`] = { ...info }; } return assemblies; } /** * Opens the assembly file to get the assemblies name and, * if present, follows instructions found in the file to unzip compressed assemblies. * * @param pathToFile the path to the SPEC_FILE_NAME file * @returns the assembly name */ function getAssemblyInfoFromFile(pathToFile) { const data = fs.readFileSync(pathToFile); try { const readFile = (filename) => fs.readFileSync(path.resolve(pathToFile, '..', filename)); let contents = JSON.parse(data.toString('utf-8')); // check if the file holds instructions to the actual assembly file while ((0, spec_1.isAssemblyRedirect)(contents)) { contents = followRedirect(contents, readFile); } return { name: contents.name, version: contents.version, path: pathToFile, }; } catch (e) { throw new Error(`Error loading assembly from file ${pathToFile}:\n${e}`); } } function followRedirect(assemblyRedirect, readFile) { // Validating the schema, this is cheap (the schema is small). (0, spec_1.validateAssemblyRedirect)(assemblyRedirect); let data = readFile(assemblyRedirect.filename); switch (assemblyRedirect.compression) { case 'gzip': data = zlib.gunzipSync(data); break; case undefined: break; default: throw new Error(`Unsupported compression algorithm: ${JSON.stringify(assemblyRedirect.compression)}`); } const json = data.toString('utf-8'); return JSON.parse(json); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jZ2VuL3ZpZXcvYXNzZW1ibHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkEsOENBZ0RDO0FBS0QsZ0RBZUM7QUFuR0QsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwyQ0FBNkI7QUFDN0IscUNBQTRHO0FBQzVHLDhDQUFnQztBQUVoQywrQ0FBaUM7QUFDakMseUNBQXNEO0FBTXJELENBQUM7QUFJRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsVUFBMEIsRUFBRSxVQUFrQjtJQUM5RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sSUFBSSxHQUFHLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRixNQUFNLGlCQUFpQixHQUFHLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFFMUUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVCLCtEQUErRDtRQUMvRCxrQ0FBa0M7UUFDbEMsTUFBTSxJQUFJLCtCQUFzQixDQUFDLDZDQUE2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzlG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dCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgemxpYiBmcm9tICd6bGliJztcbmltcG9ydCB7IEFzc2VtYmx5UmVkaXJlY3QsIGlzQXNzZW1ibHlSZWRpcmVjdCwgU1BFQ19GSUxFX05BTUUsIHZhbGlkYXRlQXNzZW1ibHlSZWRpcmVjdCB9IGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IEFzc2VtYmx5IH0gZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgQ29ycnVwdGVkQXNzZW1ibHlFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZW1ibHlJbmZvIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFzc2VtYmx5TG9va3VwID0gUmVjb3JkPHN0cmluZywgQXNzZW1ibHlJbmZvPjtcblxuLyoqXG4gKiBHaXZlbiBhbiBBc3NlbWJseUxvb2t1cCBtYXAgYW5kIGFuIGFzc2VtYmx5IG5hbWUgKyB2ZXJzaW9uIGNvbnN0cmFpbnQsXG4gKiByZXR1cm5zIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoLlxuICpcbiAqIFRoaXMgaXMgbm90IGEgc3RyaWN0IHNlbXZlciBpbXBsZW1lbnRhdGlvbiwgaW5zdGVhZCB0aGUgZm9sbG93aW5nIGFsZ29yaXRobSBpcyB1c2VkOlxuICogICAxLiB0aGUgaGlnaGVzdCAobGF0ZXN0KSB2ZXJzaW9uIG1hdGNoaW5nIHRoZSBzZW12ZXIgY29uc3RyYWludFxuICogICAyLiBhIG1hdGNoaW5nIG1ham9yIHZlcnNpb24sIGV2ZW4gaWYgY29uc3RyYWludCBkb2Vzbid0IG1hdGNoICh0aGlzIHdpbGwgdXNlIHRoZSBsb3dlc3QgbWFqb3IgdmVyc2lvbiBvZiB0aGUgY29uc3RyYWludClcbiAqICAgMy4gdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHZlcnNpb24gb2YgdGhlIGRlcGVuZGVuY3kgcmVnYXJkbGVzcyBvZiBjb25zdHJhaW50XG4gKlxuICogQHBhcmFtIGFzc2VtYmxpZXMgYSBtYXAgb2YgYXNzZW1ibHkgaWRlbnRpZmllciB0byBuYW1lLCB2ZXJzaW9uIGFuZCBwYXRoXG4gKiBAcGFyYW0gY29uc3RyYWludCB0aGUgYXNzZW1ibHkgbmFtZSBhbmQgdmVyc2lvbiB0byBtYXRjaFxuICpcbiAqIEByZXR1cm5zIHRoZSBiZXN0IG1hdGNoaW5nIGFzc2VtYmx5IGluZm8gb3IgdW5kZWZpbmVkIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmVzdEFzc2VtYmx5TWF0Y2goYXNzZW1ibGllczogQXNzZW1ibHlMb29rdXAsIGNvbnN0cmFpbnQ6IHN0cmluZyk6IEFzc2VtYmx5SW5mbyB7XG4gIGNvbnN0IGxhc3RBdEluZGV4ID0gY29uc3RyYWludC5sYXN0SW5kZXhPZignQCcpO1xuICBjb25zdCBuYW1lID0gbGFzdEF0SW5kZXggPT09IC0xID8gY29uc3RyYWludCA6IGNvbnN0cmFpbnQuc3Vic3RyaW5nKDAsIGxhc3RBdEluZGV4KTtcbiAgY29uc3QgdmVyc2lvbkNvbnN0cmFpbnQgPSBsYXN0QXRJbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBjb25zdHJhaW50LnN1YnN0cmluZyhsYXN0QXRJbmRleCArIDEpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gT2JqZWN0LnZhbHVlcyhhc3NlbWJsaWVzKS5maWx0ZXIoYSA9PiBhLm5hbWUgPT09IG5hbWUpO1xuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGBhc3NlbWJsaWVzYCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LFxuICAgIC8vIGl0IHNob3VsZCBjb250YWluIHRoZSBhc3NlbWJseS5cbiAgICB0aHJvdyBuZXcgQ29ycnVwdGVkQXNzZW1ibHlFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSBhc3NlbWJseSBmb3IgZGVwZW5kZW5jeTogJHtjb25zdHJhaW50fWApO1xuICB9XG5cbiAgY2FuZGlkYXRlcy5zb3J0KChhLCBiKSA9PiBzZW12ZXIucmNvbXBhcmUoYS52ZXJzaW9uLCBiLnZlcnNpb24pIHx8IDApO1xuXG4gIGlmICghdmVyc2lvbkNvbnN0cmFpbnQpIHtcbiAgICByZXR1cm4gY2FuZGlkYXRlc1swXTtcbiAgfVxuXG4gIC8vIDEuIFRyeSBzZW12ZXIgY29uc3RyYWludCBtYXRjaFxuICBjb25zdCBzZW12ZXJNYXRjaCA9IGNhbmRpZGF0ZXMuZmluZChhID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNlbXZlci5zYXRpc2ZpZXMoYS52ZXJzaW9uLCB2ZXJzaW9uQ29uc3RyYWludCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgaWYgKHNlbXZlck1hdGNoKSB7XG4gICAgcmV0dXJuIHNlbXZlck1hdGNoO1xuICB9XG5cbiAgLy8gMi4gVHJ5IG1ham9yIHZlcnNpb24gbWF0Y2hcbiAgY29uc3QgdGFyZ2V0VmVyc2lvbiA9IHNlbXZlci52YWxpZCh2ZXJzaW9uQ29uc3RyYWludCkgfHwgc2VtdmVyLm1pblZlcnNpb24odmVyc2lvbkNvbnN0cmFpbnQpO1xuICBpZiAodGFyZ2V0VmVyc2lvbikge1xuICAgIGNvbnN0IGNvbnN0cmFpbnRNYWpvciA9IHNlbXZlci5tYWpvcih0YXJnZXRWZXJzaW9uKTtcbiAgICBjb25zdCBtYWpvck1hdGNoID0gY2FuZGlkYXRlcy5maW5kKGEgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNlbXZlci5tYWpvcihhLnZlcnNpb24pID09PSBjb25zdHJhaW50TWFqb3I7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChtYWpvck1hdGNoKSB7XG4gICAgICByZXR1cm4gbWFqb3JNYXRjaDtcbiAgICB9XG4gIH1cblxuICAvLyAzLiBSZXR1cm4gaGlnaGVzdCB2ZXJzaW9uIHJlZ2FyZGxlc3Mgb2YgY29uc3RyYWludFxuICByZXR1cm4gY2FuZGlkYXRlc1swXTtcbn1cblxuLyoqXG4gKiBTZWFyY2ggYSBkaXJlY3RvcnkgZm9yIGpzaWkgYXNzZW1ibGllcyBhbmQgcmV0dXJuIGEgbWFwIG9mIGFzc2VtYmx5IGlkZW50aWZpZXIgdG8gbmFtZSwgdmVyc2lvbiBhbmQgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NvdmVyQXNzZW1ibGllcyhzZWFyY2hEaXI6IHN0cmluZyk6IEFzc2VtYmx5TG9va3VwIHtcbiAgLy8gc2VhcmNoRGlyIG1pZ2h0IGluY2x1ZGUgYmFja3NsYXNoZXMgb24gV2luZG93cy5cbiAgLy8gVGhlIGdsb2IgcGF0dGVybiBtdXN0IG9ubHkgdXNlZCBmb3J3YXJkIHNsYXNoZXMsIHNvIHdlIHBhc3MgdGhlIGFzc2VtYmxpZXNEaXIgYXMgQ1dEIHdoaWNoIGRvZXMgbm90IGhhdmUgdGhpcyByZXN0cmljdGlvblxuICBjb25zdCBkaXNjb3ZlcmVkID0gZmcuc3luYyhgKiovJHtTUEVDX0ZJTEVfTkFNRX1gLCB7XG4gICAgY3dkOiBwYXRoLm5vcm1hbGl6ZShzZWFyY2hEaXIpLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBhc3NlbWJsaWVzOiBBc3NlbWJseUxvb2t1cCA9IHt9O1xuICBmb3IgKGxldCBkb3RKc2lpIG9mIGRpc2NvdmVyZWQpIHtcbiAgICBjb25zdCBpbmZvID0gZ2V0QXNzZW1ibHlJbmZvRnJvbUZpbGUoZG90SnNpaSk7XG4gICAgYXNzZW1ibGllc1tgJHtpbmZvLm5hbWV9QCR7aW5mby52ZXJzaW9ufWBdID0geyAuLi5pbmZvIH07XG4gIH1cblxuICByZXR1cm4gYXNzZW1ibGllcztcbn1cblxuLyoqXG4gKiBPcGVucyB0aGUgYXNzZW1ibHkgZmlsZSB0byBnZXQgdGhlIGFzc2VtYmxpZXMgbmFtZSBhbmQsXG4gKiBpZiBwcmVzZW50LCBmb2xsb3dzIGluc3RydWN0aW9ucyBmb3VuZCBpbiB0aGUgZmlsZSB0byB1bnppcCBjb21wcmVzc2VkIGFzc2VtYmxpZXMuXG4gKlxuICogQHBhcmFtIHBhdGhUb0ZpbGUgdGhlIHBhdGggdG8gdGhlIFNQRUNfRklMRV9OQU1FIGZpbGVcbiAqIEByZXR1cm5zIHRoZSBhc3NlbWJseSBuYW1lXG4gKi9cbmZ1bmN0aW9uIGdldEFzc2VtYmx5SW5mb0Zyb21GaWxlKHBhdGhUb0ZpbGU6IHN0cmluZyk6IEFzc2VtYmx5SW5mbyB7XG4gIGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aFRvRmlsZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVhZEZpbGUgPSAoZmlsZW5hbWU6IHN0cmluZykgPT4gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShwYXRoVG9GaWxlLCAnLi4nLCBmaWxlbmFtZSkpO1xuICAgIGxldCBjb250ZW50cyA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygndXRmLTgnKSk7XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZmlsZSBob2xkcyBpbnN0cnVjdGlvbnMgdG8gdGhlIGFjdHVhbCBhc3NlbWJseSBmaWxlXG4gICAgd2hpbGUgKGlzQXNzZW1ibHlSZWRpcmVjdChjb250ZW50cykpIHtcbiAgICAgIGNvbnRlbnRzID0gZm9sbG93UmVkaXJlY3QoY29udGVudHMsIHJlYWRGaWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogKGNvbnRlbnRzIGFzIEFzc2VtYmx5KS5uYW1lLFxuICAgICAgdmVyc2lvbjogKGNvbnRlbnRzIGFzIEFzc2VtYmx5KS52ZXJzaW9uLFxuICAgICAgcGF0aDogcGF0aFRvRmlsZSxcbiAgICB9O1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGxvYWRpbmcgYXNzZW1ibHkgZnJvbSBmaWxlICR7cGF0aFRvRmlsZX06XFxuJHtlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvbGxvd1JlZGlyZWN0KFxuICBhc3NlbWJseVJlZGlyZWN0OiBBc3NlbWJseVJlZGlyZWN0LFxuICByZWFkRmlsZTogKGZpbGVuYW1lOiBzdHJpbmcpID0+IEJ1ZmZlcixcbikge1xuICAvLyBWYWxpZGF0aW5nIHRoZSBzY2hlbWEsIHRoaXMgaXMgY2hlYXAgKHRoZSBzY2hlbWEgaXMgc21hbGwpLlxuICB2YWxpZGF0ZUFzc2VtYmx5UmVkaXJlY3QoYXNzZW1ibHlSZWRpcmVjdCk7XG5cbiAgbGV0IGRhdGEgPSByZWFkRmlsZShhc3NlbWJseVJlZGlyZWN0LmZpbGVuYW1lKTtcbiAgc3dpdGNoIChhc3NlbWJseVJlZGlyZWN0LmNvbXByZXNzaW9uKSB7XG4gICAgY2FzZSAnZ3ppcCc6XG4gICAgICBkYXRhID0gemxpYi5ndW56aXBTeW5jKGRhdGEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gYWxnb3JpdGhtOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGFzc2VtYmx5UmVkaXJlY3QuY29tcHJlc3Npb24sXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gIH1cbiAgY29uc3QganNvbiA9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xufVxuIl19