UNPKG

@shopify/shopify-api

Version:

Shopify API Library for Node - accelerate development with support for authentication, graphql proxy, webhooks

1 lines 19.4 kB
{"version":3,"file":"base.mjs","sources":["../../../../../rest/base.ts"],"sourcesContent":["import {RestResourceError} from '../lib/error';\nimport {Session} from '../lib/session/session';\nimport {PageInfo, RestRequestReturn} from '../lib/clients/admin/types';\nimport {DataType} from '../lib/clients/types';\nimport {RestClient} from '../lib/clients/admin/rest/client';\nimport {ApiVersion} from '../lib/types';\nimport {ConfigInterface} from '../lib/base-types';\nimport {Headers} from '../runtime/http';\n\nimport {IdSet, Body, ResourcePath, ParamSet, ResourceNames} from './types';\n\ninterface BaseFindArgs {\n session: Session;\n params?: ParamSet;\n urlIds: IdSet;\n requireIds?: boolean;\n}\n\ninterface BaseConstructorArgs {\n session: Session;\n fromData?: Body | null;\n}\n\ninterface SaveArgs {\n update?: boolean;\n}\n\ninterface RequestArgs extends BaseFindArgs {\n http_method: string;\n operation: string;\n body?: Body | null;\n entity?: Base | null;\n}\n\ninterface GetPathArgs {\n http_method: string;\n operation: string;\n urlIds: IdSet;\n entity?: Base | null;\n}\n\ninterface SetClassPropertiesArgs {\n Client: typeof RestClient;\n config: ConfigInterface;\n}\n\nexport interface FindAllResponse<T = Base> {\n data: T[];\n headers: Headers;\n pageInfo?: PageInfo;\n}\n\nexport class Base {\n // For instance attributes\n [key: string]: any;\n\n public static Client: typeof RestClient;\n public static config: ConfigInterface;\n\n public static apiVersion: string;\n protected static resourceNames: ResourceNames[] = [];\n\n protected static primaryKey = 'id';\n protected static customPrefix: string | null = null;\n protected static readOnlyAttributes: string[] = [];\n\n protected static hasOne: Record<string, typeof Base> = {};\n protected static hasMany: Record<string, typeof Base> = {};\n\n protected static paths: ResourcePath[] = [];\n\n public static setClassProperties({Client, config}: SetClassPropertiesArgs) {\n this.Client = Client;\n this.config = config;\n }\n\n protected static async baseFind<T extends Base = Base>({\n session,\n urlIds,\n params,\n requireIds = false,\n }: BaseFindArgs): Promise<FindAllResponse<T>> {\n if (requireIds) {\n const hasIds = Object.entries(urlIds).some(([_key, value]) => value);\n\n if (!hasIds) {\n throw new RestResourceError(\n 'No IDs given for request, cannot find path',\n );\n }\n }\n\n const response = await this.request<T>({\n http_method: 'get',\n operation: 'get',\n session,\n urlIds,\n params,\n });\n\n return {\n data: this.createInstancesFromResponse<T>(session, response.body as Body),\n headers: response.headers,\n pageInfo: response.pageInfo,\n };\n }\n\n protected static async request<T = unknown>({\n session,\n http_method,\n operation,\n urlIds,\n params,\n body,\n entity,\n }: RequestArgs): Promise<RestRequestReturn<T>> {\n const client = new this.Client({\n session,\n apiVersion: this.apiVersion as ApiVersion,\n });\n\n const path = this.getPath({http_method, operation, urlIds, entity});\n\n const cleanParams: Record<string, string | number> = {};\n if (params) {\n for (const key in params) {\n if (params[key] !== null) {\n cleanParams[key] = params[key];\n }\n }\n }\n\n switch (http_method) {\n case 'get':\n return client.get<T>({path, query: cleanParams});\n case 'post':\n return client.post<T>({\n path,\n query: cleanParams,\n data: body!,\n type: DataType.JSON,\n });\n case 'put':\n return client.put<T>({\n path,\n query: cleanParams,\n data: body!,\n type: DataType.JSON,\n });\n case 'delete':\n return client.delete<T>({path, query: cleanParams});\n default:\n throw new Error(`Unrecognized HTTP method \"${http_method}\"`);\n }\n }\n\n protected static getJsonBodyName(): string {\n return this.name.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n }\n\n protected static getPath({\n http_method,\n operation,\n urlIds,\n entity,\n }: GetPathArgs): string {\n let match: string | null = null;\n let specificity = -1;\n\n const potentialPaths: ResourcePath[] = [];\n this.paths.forEach((path: ResourcePath) => {\n if (\n http_method !== path.http_method ||\n operation !== path.operation ||\n path.ids.length <= specificity\n ) {\n return;\n }\n\n potentialPaths.push(path);\n\n let pathUrlIds: IdSet = {...urlIds};\n path.ids.forEach((id) => {\n if (!pathUrlIds[id] && entity && entity[id]) {\n pathUrlIds[id] = entity[id];\n }\n });\n\n pathUrlIds = Object.entries(pathUrlIds).reduce(\n (acc: IdSet, [key, value]: [string, string | number | null]) => {\n if (value) {\n acc[key] = value;\n }\n return acc;\n },\n {},\n );\n\n // If we weren't given all of the path's required ids, we can't use it\n const diff = path.ids.reduce(\n (acc: string[], id: string) => (pathUrlIds[id] ? acc : acc.concat(id)),\n [],\n );\n if (diff.length > 0) {\n return;\n }\n\n specificity = path.ids.length;\n match = path.path.replace(\n /(<([^>]+)>)/g,\n (_m1, _m2, id) => `${pathUrlIds[id]}`,\n );\n });\n\n if (!match) {\n const pathOptions = potentialPaths.map((path) => path.path);\n\n throw new RestResourceError(\n `Could not find a path for request. If you are trying to make a request to one of the following paths, ensure all relevant IDs are set. :\\n - ${pathOptions.join(\n '\\n - ',\n )}`,\n );\n }\n\n if (this.customPrefix) {\n return `${this.customPrefix}/${match}`;\n } else {\n return match;\n }\n }\n\n protected static createInstancesFromResponse<T extends Base = Base>(\n session: Session,\n data: Body,\n ): T[] {\n let instances: T[] = [];\n this.resourceNames.forEach((resourceName) => {\n const singular = resourceName.singular;\n const plural = resourceName.plural;\n if (data[plural] || Array.isArray(data[singular])) {\n instances = instances.concat(\n (data[plural] || data[singular]).reduce(\n (acc: T[], entry: Body) =>\n acc.concat(this.createInstance<T>(session, entry)),\n [],\n ),\n );\n } else if (data[singular]) {\n instances.push(this.createInstance<T>(session, data[singular]));\n }\n });\n\n return instances;\n }\n\n protected static createInstance<T extends Base = Base>(\n session: Session,\n data: Body,\n prevInstance?: T,\n ): T {\n const instance: T = prevInstance\n ? prevInstance\n : new (this as any)({session});\n\n if (data) {\n instance.setData(data);\n }\n\n return instance;\n }\n\n #session: Session;\n\n get session(): Session {\n return this.#session;\n }\n\n constructor({session, fromData}: BaseConstructorArgs) {\n this.#session = session;\n\n if (fromData) {\n this.setData(fromData);\n }\n }\n\n public async save({update = false}: SaveArgs = {}): Promise<void> {\n const {primaryKey, resourceNames} = this.resource();\n const method = this[primaryKey] ? 'put' : 'post';\n\n const data = this.serialize(true);\n\n const response = await this.resource().request({\n http_method: method,\n operation: method,\n session: this.session,\n urlIds: {},\n body: {[this.resource().getJsonBodyName()]: data},\n entity: this,\n });\n\n const flattenResourceNames: string[] = resourceNames.reduce<string[]>(\n (acc, obj) => {\n return acc.concat(Object.values(obj));\n },\n [],\n );\n\n const matchResourceName = Object.keys(response.body as Body).filter(\n (key: string) => flattenResourceNames.includes(key),\n );\n\n const body: Body | undefined = (response.body as Body)[\n matchResourceName[0]\n ];\n\n if (update && body) {\n this.setData(body);\n }\n }\n\n public async saveAndUpdate(): Promise<void> {\n await this.save({update: true});\n }\n\n public async delete(): Promise<void> {\n await this.resource().request({\n http_method: 'delete',\n operation: 'delete',\n session: this.session,\n urlIds: {},\n entity: this,\n });\n }\n\n public serialize(saving = false): Body {\n const {hasMany, hasOne, readOnlyAttributes} = this.resource();\n\n return Object.entries(this).reduce((acc: Body, [attribute, value]) => {\n if (\n ['#session'].includes(attribute) ||\n (saving && readOnlyAttributes.includes(attribute))\n ) {\n return acc;\n }\n\n if (attribute in hasMany && value) {\n acc[attribute] = value.reduce((attrAcc: Body, entry: Base) => {\n return attrAcc.concat(this.serializeSubAttribute(entry, saving));\n }, []);\n } else if (attribute in hasOne && value) {\n acc[attribute] = this.serializeSubAttribute(value, saving);\n } else {\n acc[attribute] = value;\n }\n\n return acc;\n }, {});\n }\n\n public toJSON(): Body {\n return this.serialize();\n }\n\n public request<T = unknown>(args: RequestArgs) {\n return this.resource().request<T>(args);\n }\n\n protected setData(data: Body): void {\n const {hasMany, hasOne} = this.resource();\n\n Object.entries(data).forEach(([attribute, val]) => {\n if (attribute in hasMany) {\n const HasManyResource: typeof Base = hasMany[attribute];\n this[attribute] = [];\n val.forEach((entry: Body) => {\n const obj = new HasManyResource({session: this.session});\n if (entry) {\n obj.setData(entry);\n }\n\n this[attribute].push(obj);\n });\n } else if (attribute in hasOne) {\n const HasOneResource: typeof Base = hasOne[attribute];\n const obj = new HasOneResource({session: this.session});\n if (val) {\n obj.setData(val);\n }\n this[attribute] = obj;\n } else {\n this[attribute] = val;\n }\n });\n }\n\n protected resource(): typeof Base {\n return this.constructor as unknown as typeof Base;\n }\n\n private serializeSubAttribute(attribute: Base, saving: boolean): Body {\n return attribute.serialize\n ? attribute.serialize(saving)\n : this.resource()\n .createInstance(this.session, attribute)\n .serialize(saving);\n }\n}\n"],"names":[],"mappings":"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"}