comic-vine-sdk
Version:
A JS/TS client for the Comic Vine API
68 lines • 12.5 kB
JavaScript
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=