{"version":3,"file":"policies.mjs","sources":["../../src/registries/policies.ts"],"sourcesContent":["import { pickBy, has, castArray } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nconst PLUGIN_PREFIX = 'plugin::';\nconst API_PREFIX = 'api::';\n\ninterface PolicyInfo {\n  name: string;\n  config: unknown;\n}\n\ntype PolicyConfig = string | PolicyInfo;\n\ninterface NamespaceInfo {\n  pluginName?: string;\n  apiName?: string;\n}\n\nconst parsePolicy = (policy: string | PolicyInfo) => {\n  if (typeof policy === 'string') {\n    return { policyName: policy, config: {} };\n  }\n\n  const { name, config } = policy;\n  return { policyName: name, config };\n};\n\nconst policiesRegistry = () => {\n  const policies = new Map<string, Core.Policy>();\n\n  const find = (name: string, namespaceInfo?: NamespaceInfo) => {\n    const { pluginName, apiName } = namespaceInfo ?? {};\n\n    // try to resolve a full name to avoid extra prefixing\n    const policy = policies.get(name);\n\n    if (policy) {\n      return policy;\n    }\n\n    if (pluginName) {\n      return policies.get(`${PLUGIN_PREFIX}${pluginName}.${name}`);\n    }\n\n    if (apiName) {\n      return policies.get(`${API_PREFIX}${apiName}.${name}`);\n    }\n  };\n\n  function resolveHandler(policyConfig: PolicyConfig, namespaceInfo?: NamespaceInfo): Core.Policy;\n  function resolveHandler(\n    policyConfig: PolicyConfig[],\n    namespaceInfo?: NamespaceInfo\n  ): Core.Policy[];\n  function resolveHandler(\n    policyConfig: PolicyConfig | PolicyConfig[],\n    namespaceInfo?: NamespaceInfo\n  ): Core.Policy | Core.Policy[] {\n    if (Array.isArray(policyConfig)) {\n      return policyConfig.map((config) => {\n        return resolveHandler(config, namespaceInfo);\n      });\n    }\n\n    const { policyName, config } = parsePolicy(policyConfig);\n\n    const policy = find(policyName, namespaceInfo);\n\n    if (!policy) {\n      throw new Error(`Policy ${policyName} not found.`);\n    }\n\n    if (typeof policy === 'function') {\n      return policy;\n    }\n\n    if (policy.validator) {\n      policy.validator(config);\n    }\n\n    return policy.handler;\n  }\n\n  return {\n    /**\n     * Returns this list of registered policies uids\n     */\n    keys() {\n      // Return an array so format stays the same as controllers, services, etc\n      return Array.from(policies.keys());\n    },\n\n    /**\n     * Returns the instance of a policy. Instantiate the policy if not already done\n     */\n    get(name: string, namespaceInfo?: NamespaceInfo) {\n      return find(name, namespaceInfo);\n    },\n    /**\n     * Checks if a policy is registered\n     */\n    has(name: string, namespaceInfo?: NamespaceInfo) {\n      const res = find(name, namespaceInfo);\n      return !!res;\n    },\n\n    /**\n     * Returns a map with all the policies in a namespace\n     */\n    getAll(namespace: string) {\n      return pickBy((_, uid) => hasNamespace(uid, namespace))(Object.fromEntries(policies));\n    },\n\n    /**\n     * Registers a policy\n     */\n    set(uid: string, policy: Core.Policy) {\n      policies.set(uid, policy);\n      return this;\n    },\n\n    /**\n     * Registers a map of policies for a specific namespace\n     */\n    add(namespace: string, newPolicies: Record<string, Core.Policy>) {\n      for (const policyName of Object.keys(newPolicies)) {\n        const policy = newPolicies[policyName];\n        const uid = addNamespace(policyName, namespace);\n\n        if (has(uid, policies)) {\n          throw new Error(`Policy ${uid} has already been registered.`);\n        }\n\n        policies.set(uid, policy);\n      }\n    },\n\n    /**\n     * Resolves a list of policies\n     */\n    resolve(config: PolicyConfig | PolicyConfig[], namespaceInfo?: NamespaceInfo) {\n      const { pluginName, apiName } = namespaceInfo ?? {};\n\n      return castArray(config).map((policyConfig) => {\n        return {\n          handler: resolveHandler(policyConfig, { pluginName, apiName }),\n          config: (typeof policyConfig === 'object' && policyConfig.config) || {},\n        };\n      });\n    },\n  };\n};\n\nexport default policiesRegistry;\n"],"names":["config"],"mappings":";;AAIA,MAAM,gBAAgB;AACtB,MAAM,aAAa;AAcnB,MAAM,cAAc,CAAC,WAAgC;AAC/C,MAAA,OAAO,WAAW,UAAU;AAC9B,WAAO,EAAE,YAAY,QAAQ,QAAQ,CAAG,EAAA;AAAA,EAC1C;AAEM,QAAA,EAAE,MAAM,OAAW,IAAA;AAClB,SAAA,EAAE,YAAY,MAAM;AAC7B;AAEA,MAAM,mBAAmB,MAAM;AACvB,QAAA,+BAAe;AAEf,QAAA,OAAO,CAAC,MAAc,kBAAkC;AAC5D,UAAM,EAAE,YAAY,YAAY,iBAAiB,CAAA;AAG3C,UAAA,SAAS,SAAS,IAAI,IAAI;AAEhC,QAAI,QAAQ;AACH,aAAA;AAAA,IACT;AAEA,QAAI,YAAY;AACP,aAAA,SAAS,IAAI,GAAG,aAAa,GAAG,UAAU,IAAI,IAAI,EAAE;AAAA,IAC7D;AAEA,QAAI,SAAS;AACJ,aAAA,SAAS,IAAI,GAAG,UAAU,GAAG,OAAO,IAAI,IAAI,EAAE;AAAA,IACvD;AAAA,EAAA;AAQO,WAAA,eACP,cACA,eAC6B;AACzB,QAAA,MAAM,QAAQ,YAAY,GAAG;AACxB,aAAA,aAAa,IAAI,CAACA,YAAW;AAC3B,eAAA,eAAeA,SAAQ,aAAa;AAAA,MAAA,CAC5C;AAAA,IACH;AAEA,UAAM,EAAE,YAAY,OAAO,IAAI,YAAY,YAAY;AAEjD,UAAA,SAAS,KAAK,YAAY,aAAa;AAE7C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,UAAU,UAAU,aAAa;AAAA,IACnD;AAEI,QAAA,OAAO,WAAW,YAAY;AACzB,aAAA;AAAA,IACT;AAEA,QAAI,OAAO,WAAW;AACpB,aAAO,UAAU,MAAM;AAAA,IACzB;AAEA,WAAO,OAAO;AAAA,EAChB;AAEO,SAAA;AAAA;AAAA;AAAA;AAAA,IAIL,OAAO;AAEL,aAAO,MAAM,KAAK,SAAS,KAAM,CAAA;AAAA,IACnC;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,MAAc,eAA+B;AACxC,aAAA,KAAK,MAAM,aAAa;AAAA,IACjC;AAAA;AAAA;AAAA;AAAA,IAIA,IAAI,MAAc,eAA+B;AACzC,YAAA,MAAM,KAAK,MAAM,aAAa;AACpC,aAAO,CAAC,CAAC;AAAA,IACX;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,WAAmB;AACxB,aAAO,OAAO,CAAC,GAAG,QAAQ,aAAa,KAAK,SAAS,CAAC,EAAE,OAAO,YAAY,QAAQ,CAAC;AAAA,IACtF;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,KAAa,QAAqB;AAC3B,eAAA,IAAI,KAAK,MAAM;AACjB,aAAA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,WAAmB,aAA0C;AAC/D,iBAAW,cAAc,OAAO,KAAK,WAAW,GAAG;AAC3C,cAAA,SAAS,YAAY,UAAU;AAC/B,cAAA,MAAM,aAAa,YAAY,SAAS;AAE1C,YAAA,IAAI,KAAK,QAAQ,GAAG;AACtB,gBAAM,IAAI,MAAM,UAAU,GAAG,+BAA+B;AAAA,QAC9D;AAES,iBAAA,IAAI,KAAK,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,QAAQ,QAAuC,eAA+B;AAC5E,YAAM,EAAE,YAAY,YAAY,iBAAiB,CAAA;AAEjD,aAAO,UAAU,MAAM,EAAE,IAAI,CAAC,iBAAiB;AACtC,eAAA;AAAA,UACL,SAAS,eAAe,cAAc,EAAE,YAAY,SAAS;AAAA,UAC7D,QAAS,OAAO,iBAAiB,YAAY,aAAa,UAAW,CAAC;AAAA,QAAA;AAAA,MACxE,CACD;AAAA,IACH;AAAA,EAAA;AAEJ;"}