{"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":["PLUGIN_PREFIX","API_PREFIX","parsePolicy","policy","policyName","config","name","policiesRegistry","policies","Map","find","namespaceInfo","pluginName","apiName","get","resolveHandler","policyConfig","Array","isArray","map","Error","validator","handler","keys","from","has","res","getAll","namespace","pickBy","_","uid","hasNamespace","Object","fromEntries","set","add","newPolicies","addNamespace","resolve","castArray"],"mappings":"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"}