UNPKG

comic-vine-sdk

Version:

A JS/TS client for the Comic Vine API

68 lines 12.5 kB
import { HttpClientFactory } from './http-client/index.js'; import { loadOptions } from './options/index.js'; import { ResourceFactory } from './resources/index.js'; import * as resources from './resources/resource-list.js'; function classNameToPropertyName(className) { return className.charAt(0).toLowerCase() + className.slice(1); } export class ComicVine { constructor(key, options) { this.resourceCache = new Map(); const _options = loadOptions(options); const httpClient = HttpClientFactory.createClient(); const urlBuilder = HttpClientFactory.createUrlBuilder(key, _options.baseUrl); this.resourceFactory = new ResourceFactory(httpClient, urlBuilder); // Discover available resources dynamically this.resourceNames = Object.keys(resources); // Return a proxy that provides lazy loading with full type safety return new Proxy(this, { get(target, prop) { if (typeof prop === 'string' && target.isResourceProperty(prop)) { return target.getResource(prop); } return Reflect.get(target, prop); }, }); } isResourceProperty(prop) { // Check if this property corresponds to a known resource const className = prop.charAt(0).toUpperCase() + prop.slice(1); return this.resourceNames.includes(className); } getResource(propertyName) { // Lazy loading: create resource only when first accessed if (!this.resourceCache.has(propertyName)) { const className = propertyName.charAt(0).toUpperCase() + propertyName.slice(1); try { const resource = this.resourceFactory.create(className); this.resourceCache.set(propertyName, resource); } catch (error) { throw new Error(`Failed to create resource '${className}': ${error}`); } } return this.resourceCache.get(propertyName); } getAvailableResources() { return this.resourceNames.map((name) => classNameToPropertyName(name)); } hasResource(resourceName) { return this.isResourceProperty(resourceName); } getResourceByName(resourceName) { if (!this.isResourceProperty(resourceName)) { return undefined; } return this.getResource(resourceName); } isResourceLoaded(resourceName) { return this.resourceCache.has(resourceName); } getCacheStats() { const total = this.resourceNames.length; const loaded = this.resourceCache.size; const loadedResources = Array.from(this.resourceCache.keys()); return { total, loaded, loadedResources }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29taWMtdmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21pYy12aW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFNBQVMsTUFBTSw4QkFBOEIsQ0FBQztBQUUxRCxTQUFTLHVCQUF1QixDQUFDLFNBQWlCO0lBQ2hELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFXRCxNQUFNLE9BQU8sU0FBUztJQTBCcEIsWUFBWSxHQUFXLEVBQUUsT0FBcUI7UUF4QnRDLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUF5QjFELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwRCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FDbkQsR0FBRyxFQUNILFFBQVEsQ0FBQyxPQUFPLENBQ2pCLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVuRSwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLGtFQUFrRTtRQUNsRSxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtZQUNyQixHQUFHLENBQUMsTUFBTSxFQUFFLElBQXFCO2dCQUMvQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO2dCQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkMsQ0FBQztTQUNGLENBQWMsQ0FBQztJQUNsQixDQUFDO0lBRU8sa0JBQWtCLENBQUMsSUFBWTtRQUNyQyx5REFBeUQ7UUFDekQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLFdBQVcsQ0FBQyxZQUFvQjtRQUN0Qyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxTQUFTLEdBQ2IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDMUMsU0FBbUMsQ0FDcEMsQ0FBQztnQkFDRixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsU0FBUyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsV0FBVyxDQUFDLFlBQW9CO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxZQUFvQjtRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsWUFBb0I7UUFDbkMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsYUFBYTtRQUtYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDO0lBQzVDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnRGYWN0b3J5IH0gZnJvbSAnLi9odHRwLWNsaWVudC9pbmRleC5qcyc7XG5pbXBvcnQgeyB1c2VyT3B0aW9ucywgbG9hZE9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0IHsgUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi9yZXNvdXJjZXMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgcmVzb3VyY2VzIGZyb20gJy4vcmVzb3VyY2VzL3Jlc291cmNlLWxpc3QuanMnO1xuXG5mdW5jdGlvbiBjbGFzc05hbWVUb1Byb3BlcnR5TmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjbGFzc05hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjbGFzc05hbWUuc2xpY2UoMSk7XG59XG5cbnR5cGUgUmVzb3VyY2VJbnN0YW5jZSA9IFJldHVyblR5cGU8UmVzb3VyY2VGYWN0b3J5WydjcmVhdGUnXT47XG5cbi8vIENyZWF0ZSByZXNvdXJjZSBwcm9wZXJ0eSB0eXBlIG1hcHBpbmcgZHluYW1pY2FsbHlcbnR5cGUgUmVzb3VyY2VQcm9wZXJ0eU1hcCA9IHtcbiAgW0sgaW4ga2V5b2YgdHlwZW9mIHJlc291cmNlcyBhcyBVbmNhcGl0YWxpemU8Sz5dOiBJbnN0YW5jZVR5cGU8XG4gICAgKHR5cGVvZiByZXNvdXJjZXMpW0tdXG4gID47XG59O1xuXG5leHBvcnQgY2xhc3MgQ29taWNWaW5lIGltcGxlbWVudHMgUmVzb3VyY2VQcm9wZXJ0eU1hcCB7XG4gIHByaXZhdGUgcmVzb3VyY2VGYWN0b3J5OiBSZXNvdXJjZUZhY3Rvcnk7XG4gIHByaXZhdGUgcmVzb3VyY2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZXNvdXJjZUluc3RhbmNlPigpO1xuICBwcml2YXRlIHJlc291cmNlTmFtZXM6IHN0cmluZ1tdO1xuXG4gIC8vIFR5cGVTY3JpcHQgcHJvcGVydHkgZGVjbGFyYXRpb25zIGZvciBzdGF0aWMgdHlwaW5nICh3aWxsIGJlIHByb3ZpZGVkIGJ5IFByb3h5KVxuICBkZWNsYXJlIHJlYWRvbmx5IGNoYXJhY3RlcjogUmVzb3VyY2VQcm9wZXJ0eU1hcFsnY2hhcmFjdGVyJ107XG4gIGRlY2xhcmUgcmVhZG9ubHkgY29uY2VwdDogUmVzb3VyY2VQcm9wZXJ0eU1hcFsnY29uY2VwdCddO1xuICBkZWNsYXJlIHJlYWRvbmx5IGVwaXNvZGU6IFJlc291cmNlUHJvcGVydHlNYXBbJ2VwaXNvZGUnXTtcbiAgZGVjbGFyZSByZWFkb25seSBpc3N1ZTogUmVzb3VyY2VQcm9wZXJ0eU1hcFsnaXNzdWUnXTtcbiAgZGVjbGFyZSByZWFkb25seSBsb2NhdGlvbjogUmVzb3VyY2VQcm9wZXJ0eU1hcFsnbG9jYXRpb24nXTtcbiAgZGVjbGFyZSByZWFkb25seSBtb3ZpZTogUmVzb3VyY2VQcm9wZXJ0eU1hcFsnbW92aWUnXTtcbiAgZGVjbGFyZSByZWFkb25seSBvcmlnaW46IFJlc291cmNlUHJvcGVydHlNYXBbJ29yaWdpbiddO1xuICBkZWNsYXJlIHJlYWRvbmx5IHBlcnNvbjogUmVzb3VyY2VQcm9wZXJ0eU1hcFsncGVyc29uJ107XG4gIGRlY2xhcmUgcmVhZG9ubHkgcG93ZXI6IFJlc291cmNlUHJvcGVydHlNYXBbJ3Bvd2VyJ107XG4gIGRlY2xhcmUgcmVhZG9ubHkgcHJvbW86IFJlc291cmNlUHJvcGVydHlNYXBbJ3Byb21vJ107XG4gIGRlY2xhcmUgcmVhZG9ubHkgcHVibGlzaGVyOiBSZXNvdXJjZVByb3BlcnR5TWFwWydwdWJsaXNoZXInXTtcbiAgZGVjbGFyZSByZWFkb25seSBzZXJpZXM6IFJlc291cmNlUHJvcGVydHlNYXBbJ3NlcmllcyddO1xuICBkZWNsYXJlIHJlYWRvbmx5IHN0b3J5QXJjOiBSZXNvdXJjZVByb3BlcnR5TWFwWydzdG9yeUFyYyddO1xuICBkZWNsYXJlIHJlYWRvbmx5IHRlYW06IFJlc291cmNlUHJvcGVydHlNYXBbJ3RlYW0nXTtcbiAgZGVjbGFyZSByZWFkb25seSB0aGluZzogUmVzb3VyY2VQcm9wZXJ0eU1hcFsndGhpbmcnXTtcbiAgZGVjbGFyZSByZWFkb25seSB2aWRlbzogUmVzb3VyY2VQcm9wZXJ0eU1hcFsndmlkZW8nXTtcbiAgZGVjbGFyZSByZWFkb25seSB2aWRlb0NhdGVnb3J5OiBSZXNvdXJjZVByb3BlcnR5TWFwWyd2aWRlb0NhdGVnb3J5J107XG4gIGRlY2xhcmUgcmVhZG9ubHkgdmlkZW9UeXBlOiBSZXNvdXJjZVByb3BlcnR5TWFwWyd2aWRlb1R5cGUnXTtcbiAgZGVjbGFyZSByZWFkb25seSB2b2x1bWU6IFJlc291cmNlUHJvcGVydHlNYXBbJ3ZvbHVtZSddO1xuXG4gIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nLCBvcHRpb25zPzogdXNlck9wdGlvbnMpIHtcbiAgICBjb25zdCBfb3B0aW9ucyA9IGxvYWRPcHRpb25zKG9wdGlvbnMpO1xuICAgIGNvbnN0IGh0dHBDbGllbnQgPSBIdHRwQ2xpZW50RmFjdG9yeS5jcmVhdGVDbGllbnQoKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gSHR0cENsaWVudEZhY3RvcnkuY3JlYXRlVXJsQnVpbGRlcihcbiAgICAgIGtleSxcbiAgICAgIF9vcHRpb25zLmJhc2VVcmwsXG4gICAgKTtcbiAgICB0aGlzLnJlc291cmNlRmFjdG9yeSA9IG5ldyBSZXNvdXJjZUZhY3RvcnkoaHR0cENsaWVudCwgdXJsQnVpbGRlcik7XG5cbiAgICAvLyBEaXNjb3ZlciBhdmFpbGFibGUgcmVzb3VyY2VzIGR5bmFtaWNhbGx5XG4gICAgdGhpcy5yZXNvdXJjZU5hbWVzID0gT2JqZWN0LmtleXMocmVzb3VyY2VzKTtcblxuICAgIC8vIFJldHVybiBhIHByb3h5IHRoYXQgcHJvdmlkZXMgbGF6eSBsb2FkaW5nIHdpdGggZnVsbCB0eXBlIHNhZmV0eVxuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0KHRhcmdldCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgJiYgdGFyZ2V0LmlzUmVzb3VyY2VQcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQuZ2V0UmVzb3VyY2UocHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICB9LFxuICAgIH0pIGFzIENvbWljVmluZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNSZXNvdXJjZVByb3BlcnR5KHByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gYSBrbm93biByZXNvdXJjZVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpO1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlTmFtZXMuaW5jbHVkZXMoY2xhc3NOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVzb3VyY2UocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBSZXNvdXJjZUluc3RhbmNlIHtcbiAgICAvLyBMYXp5IGxvYWRpbmc6IGNyZWF0ZSByZXNvdXJjZSBvbmx5IHdoZW4gZmlyc3QgYWNjZXNzZWRcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VDYWNoZS5oYXMocHJvcGVydHlOYW1lKSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lID1cbiAgICAgICAgcHJvcGVydHlOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHlOYW1lLnNsaWNlKDEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlRmFjdG9yeS5jcmVhdGUoXG4gICAgICAgICAgY2xhc3NOYW1lIGFzIGtleW9mIHR5cGVvZiByZXNvdXJjZXMsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVzb3VyY2VDYWNoZS5zZXQocHJvcGVydHlOYW1lLCByZXNvdXJjZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgcmVzb3VyY2UgJyR7Y2xhc3NOYW1lfSc6ICR7ZXJyb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc291cmNlQ2FjaGUuZ2V0KHByb3BlcnR5TmFtZSkhO1xuICB9XG5cbiAgZ2V0QXZhaWxhYmxlUmVzb3VyY2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZU5hbWVzLm1hcCgobmFtZSkgPT4gY2xhc3NOYW1lVG9Qcm9wZXJ0eU5hbWUobmFtZSkpO1xuICB9XG5cbiAgaGFzUmVzb3VyY2UocmVzb3VyY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Jlc291cmNlUHJvcGVydHkocmVzb3VyY2VOYW1lKTtcbiAgfVxuXG4gIGdldFJlc291cmNlQnlOYW1lKHJlc291cmNlTmFtZTogc3RyaW5nKTogUmVzb3VyY2VJbnN0YW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVzb3VyY2VQcm9wZXJ0eShyZXNvdXJjZU5hbWUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZShyZXNvdXJjZU5hbWUpO1xuICB9XG5cbiAgaXNSZXNvdXJjZUxvYWRlZChyZXNvdXJjZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlQ2FjaGUuaGFzKHJlc291cmNlTmFtZSk7XG4gIH1cblxuICBnZXRDYWNoZVN0YXRzKCk6IHtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIGxvYWRlZDogbnVtYmVyO1xuICAgIGxvYWRlZFJlc291cmNlczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5yZXNvdXJjZU5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBsb2FkZWQgPSB0aGlzLnJlc291cmNlQ2FjaGUuc2l6ZTtcbiAgICBjb25zdCBsb2FkZWRSZXNvdXJjZXMgPSBBcnJheS5mcm9tKHRoaXMucmVzb3VyY2VDYWNoZS5rZXlzKCkpO1xuICAgIHJldHVybiB7IHRvdGFsLCBsb2FkZWQsIGxvYWRlZFJlc291cmNlcyB9O1xuICB9XG59XG4iXX0=