UNPKG

api

Version:

Magical SDK generation from an OpenAPI definition 🪄

199 lines (198 loc) • 10.2 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; exports.__esModule = true; var crypto_1 = __importDefault(require("crypto")); var fs_1 = __importDefault(require("fs")); var os_1 = __importDefault(require("os")); var path_1 = __importDefault(require("path")); var find_cache_dir_1 = __importDefault(require("find-cache-dir")); require("isomorphic-fetch"); var make_dir_1 = __importDefault(require("make-dir")); var fetcher_1 = __importDefault(require("./fetcher")); var packageInfo_1 = require("./packageInfo"); var Cache = /** @class */ (function () { function Cache(uri, cacheDir) { if (cacheDir === void 0) { cacheDir = false; } Cache.setCacheDir(cacheDir); Cache.cacheStore = path_1["default"].join(Cache.dir, 'cache.json'); Cache.specsCache = path_1["default"].join(Cache.dir, 'specs'); this.fetcher = new fetcher_1["default"](uri); this.uri = this.fetcher.uri; this.uriHash = Cache.getCacheHash(this.uri); // This should default to false so we have awareness if we've looked at the cache yet. this.cached = false; } Cache.getCacheHash = function (file) { var data; if (typeof file === 'object') { // Under certain unit testing circumstances, we might be supplying the class with a raw JSON // object so we'll need to convert it to a string in order to hand it off to the crypto // module. data = JSON.stringify(file); } else { data = file; } return crypto_1["default"].createHash('md5').update(data).digest('hex'); }; Cache.setCacheDir = function (dir) { if (dir) { Cache.dir = dir; return; } else if (Cache.dir) { // If we already have a cache dir set and aren't explicitly it to something new then we // shouldn't overwrite what we've already got. return; } Cache.dir = (0, find_cache_dir_1["default"])({ name: packageInfo_1.PACKAGE_NAME }); if (typeof Cache.dir === 'undefined') { // The `find-cache-dir` module returns `undefined` if the `node_modules/` directory isn't // writable, or there's no `package.json` in the root-most directory. If this happens, we can // instead adhoc create a cache directory in the users OS temp directory and store our data // there. // // @link https://github.com/avajs/find-cache-dir/issues/29 Cache.dir = make_dir_1["default"].sync(path_1["default"].join(os_1["default"].tmpdir(), packageInfo_1.PACKAGE_NAME)); } }; Cache.reset = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (!Cache.cacheStore) return [3 /*break*/, 2]; return [4 /*yield*/, fs_1["default"].promises.rm(Cache.cacheStore)["catch"](function () { // no-op })]; case 1: _a.sent(); _a.label = 2; case 2: if (!Cache.specsCache) return [3 /*break*/, 4]; return [4 /*yield*/, fs_1["default"].promises.rm(Cache.specsCache, { recursive: true })["catch"](function () { // no-op })]; case 3: _a.sent(); _a.label = 4; case 4: return [2 /*return*/]; } }); }); }; Cache.prototype.isCached = function () { var cache = this.getCache(); return cache && this.uriHash in cache; }; Cache.prototype.getCache = function () { if (typeof this.cached === 'object') { return this.cached; } this.cached = {}; if (fs_1["default"].existsSync(Cache.cacheStore)) { this.cached = JSON.parse(fs_1["default"].readFileSync(Cache.cacheStore, 'utf8')); } return this.cached; }; Cache.prototype.get = function () { // If the class was supplied a raw object, just go ahead and bypass the caching system and // return that. if (typeof this.uri === 'object') { return this.uri; } if (!this.isCached()) { throw new Error("".concat(this.uri, " has not been cached yet and must do so before being retrieved.")); } var cache = this.getCache(); // Prior to v4.5.0 we were putting a fully resolved path to the API definition in the cache // store but if you had specified a custom caching directory and would generate the cache on // your system, that filepath would obviously not be the same in other environments. For this // reason the `path` was removed from the cache store in favor of storing the `hash` instead. // // If we still have `path` in the config cache for backwards compatibility we should use it. if ('path' in cache[this.uriHash]) { return JSON.parse(fs_1["default"].readFileSync(cache[this.uriHash].path, 'utf8')); } return JSON.parse(fs_1["default"].readFileSync(path_1["default"].join(Cache.specsCache, "".concat(cache[this.uriHash].hash, ".json")), 'utf8')); }; Cache.prototype.load = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { // If the class was supplied a raw object we should still validate and make sure that it's // dereferenced in order for everything to function, but we shouldn't worry about saving it // into the cache directory architecture. if (typeof this.uri === 'object') { return [2 /*return*/, fetcher_1["default"].validate(this.uri)]; } return [2 /*return*/, this.fetcher.load().then(function (spec) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.save(spec)]; }); }); })]; }); }); }; Cache.prototype.save = function (spec) { if (!fs_1["default"].existsSync(Cache.dir)) { fs_1["default"].mkdirSync(Cache.dir, { recursive: true }); } if (!fs_1["default"].existsSync(Cache.specsCache)) { fs_1["default"].mkdirSync(Cache.specsCache, { recursive: true }); } var cache = this.getCache(); if (!(this.uriHash in cache)) { var saved = JSON.stringify(spec, null, 2); var fileHash = crypto_1["default"].createHash('md5').update(saved).digest('hex'); cache[this.uriHash] = { hash: fileHash, original: this.uri, title: 'title' in spec.info ? spec.info.title : undefined, version: 'version' in spec.info ? spec.info.version : undefined }; fs_1["default"].writeFileSync(path_1["default"].join(Cache.specsCache, "".concat(fileHash, ".json")), saved); fs_1["default"].writeFileSync(Cache.cacheStore, JSON.stringify(cache, null, 2)); this.cached = cache; } return spec; }; return Cache; }()); exports["default"] = Cache;