{"version":3,"sources":["../../src/manifest.ts"],"sourcesContent":["import { MethodDescriptor, MethodDescriptorParams } from './method-descriptor'\nimport { assign } from './utils/index'\nimport type { ParameterEncoderFn } from './types'\nimport type { GatewayConfiguration } from './gateway/types'\nimport type { Gateway } from './gateway/index'\nimport { Context, Middleware, MiddlewareDescriptor, MiddlewareParams } from './middleware/index'\n\nexport interface GlobalConfigs {\n  context: Context\n  middleware: Middleware[]\n  Promise: PromiseConstructor | null\n  fetch: typeof fetch | null\n  gateway: typeof Gateway | null\n  gatewayConfigs: GatewayConfiguration\n  maxMiddlewareStackExecutionAllowed: number\n}\n\nexport type ResourceTypeConstraint = {\n  [resourceName: string]: {\n    [methodName: string]: Omit<MethodDescriptorParams, 'host'> & { host?: string }\n  }\n}\n\nexport interface ManifestOptions<Resources extends ResourceTypeConstraint> {\n  allowResourceHostOverride?: boolean\n  authAttr?: string\n  bodyAttr?: string\n  clientId?: string\n  gatewayConfigs?: Partial<GatewayConfiguration>\n  headersAttr?: string\n  host: string\n  hostAttr?: string\n  middleware?: Middleware[]\n  parameterEncoder?: ParameterEncoderFn\n  resources?: Resources\n  signalAttr?: string\n  timeoutAttr?: string\n  /**\n   * @deprecated - use `middleware` instead\n   */\n  middlewares?: Middleware[]\n  ignoreGlobalMiddleware?: boolean\n}\n\nexport type Method = { name: string; descriptor: MethodDescriptor }\ntype EachResourceCallbackFn = (name: string, methods: Method[]) => void\ntype EachMethodCallbackFn = (name: string) => Method\ntype CreateMiddlewareParams = Partial<Omit<MiddlewareParams, 'resourceName' | 'resourceMethod'>> &\n  Pick<MiddlewareParams, 'resourceName' | 'resourceMethod'>\n/**\n * @typedef Manifest\n * @param {Object} obj\n *   @param {Object} obj.gatewayConfigs - default: base values from mappersmith\n *   @param {Object} obj.ignoreGlobalMiddleware - default: false\n *   @param {Object} obj.resources - default: {}\n *   @param {Array}  obj.middleware or obj.middlewares - default: []\n * @param {Object} globalConfigs\n */\nexport class Manifest<Resources extends ResourceTypeConstraint> {\n  public allowResourceHostOverride: boolean\n  public authAttr?: string\n  public bodyAttr?: string\n  public clientId: string | null\n  public context: Context\n  public gatewayConfigs: GatewayConfiguration\n  public headersAttr?: string\n  public host: string\n  public hostAttr?: string\n  public middleware: Middleware[]\n  public parameterEncoder: ParameterEncoderFn\n  public resources: Resources\n  public signalAttr?: string\n  public timeoutAttr?: string\n\n  constructor(\n    options: ManifestOptions<Resources>,\n    { gatewayConfigs, middleware = [], context = {} }: GlobalConfigs\n  ) {\n    this.allowResourceHostOverride = options.allowResourceHostOverride || false\n    this.authAttr = options.authAttr\n    this.bodyAttr = options.bodyAttr\n    this.clientId = options.clientId || null\n    this.context = context\n    this.gatewayConfigs = assign({}, gatewayConfigs, options.gatewayConfigs)\n    this.headersAttr = options.headersAttr\n    this.host = options.host\n    this.hostAttr = options.hostAttr\n    this.parameterEncoder = options.parameterEncoder || encodeURIComponent\n    this.resources = options.resources || ({} as Resources)\n    this.signalAttr = options.signalAttr\n    this.timeoutAttr = options.timeoutAttr\n\n    // TODO: deprecate obj.middlewares in favor of obj.middleware\n    const clientMiddleware = options.middleware || options.middlewares || []\n\n    if (options.ignoreGlobalMiddleware) {\n      this.middleware = clientMiddleware\n    } else {\n      this.middleware = [...clientMiddleware, ...middleware]\n    }\n  }\n\n  public eachResource(callback: EachResourceCallbackFn) {\n    Object.keys(this.resources).forEach((resourceName) => {\n      const methods = this.eachMethod(resourceName, (methodName) => ({\n        name: methodName,\n        descriptor: this.createMethodDescriptor(resourceName, methodName),\n      }))\n\n      callback(resourceName, methods)\n    })\n  }\n\n  private eachMethod(resourceName: string, callback: EachMethodCallbackFn) {\n    return Object.keys(this.resources[resourceName]).map(callback)\n  }\n\n  public createMethodDescriptor(resourceName: string, methodName: string) {\n    const definition = this.resources[resourceName][methodName]\n    if (!definition || !['string', 'function'].includes(typeof definition.path)) {\n      throw new Error(\n        `[Mappersmith] path is undefined for resource \"${resourceName}\" method \"${methodName}\"`\n      )\n    }\n    return new MethodDescriptor(\n      assign(\n        {\n          host: this.host,\n          allowResourceHostOverride: this.allowResourceHostOverride,\n          parameterEncoder: this.parameterEncoder,\n          bodyAttr: this.bodyAttr,\n          headersAttr: this.headersAttr,\n          authAttr: this.authAttr,\n          timeoutAttr: this.timeoutAttr,\n          hostAttr: this.hostAttr,\n          signalAttr: this.signalAttr,\n        },\n        definition\n      )\n    )\n  }\n\n  /**\n   * @param {Object} args\n   *   @param {String|Null} args.clientId\n   *   @param {String} args.resourceName\n   *   @param {String} args.resourceMethod\n   *   @param {Object} args.context\n   *   @param {Boolean} args.mockRequest\n   *\n   * @return {Array<Object>}\n   */\n  public createMiddleware(args: CreateMiddlewareParams) {\n    const createInstance = (middlewareFactory: Middleware) => {\n      const defaultDescriptor: MiddlewareDescriptor = {\n        __name: middlewareFactory.name || middlewareFactory.toString(),\n        response(next) {\n          return next()\n        },\n        /**\n         * @since 2.27.0\n         * Replaced the request method\n         */\n        prepareRequest(next) {\n          return this.request ? next().then((req) => this.request?.(req)) : next()\n        },\n      }\n\n      const middlewareParams = assign(args, {\n        clientId: this.clientId,\n        context: assign({}, this.context),\n      })\n\n      return assign(defaultDescriptor, middlewareFactory(middlewareParams))\n    }\n\n    const { resourceName: name, resourceMethod: method } = args\n    const resourceMiddleware = this.createMethodDescriptor(name, method).middleware\n    const middlewares = [...resourceMiddleware, ...this.middleware]\n\n    return middlewares.map(createInstance)\n  }\n}\n\nexport default Manifest\n"],"mappings":"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","names":[]}