{"version":3,"file":"useCacheToken.mjs","sources":["../../../../../../packages/theme/cssinjs/hooks/useCacheToken.ts"],"sourcesContent":["import type { Ref } from 'vue';\nimport type Theme from '../theme/Theme';\nimport hash from '@emotion/hash';\nimport { computed, ref } from 'vue';\nimport { ATTR_TOKEN, CSS_IN_JS_INSTANCE, useStyleInject } from '../StyleContext';\nimport { flattenToken, token2key } from '../util';\nimport useGlobalCache from './useGlobalCache';\n\nconst EMPTY_OVERRIDE = {};\n\nconst isProduction = process.env.NODE_ENV === 'production';\n// nuxt generate when NODE_ENV is prerender\nconst isPrerender = process.env.NODE_ENV === 'prerender';\n\n// Generate different prefix to make user selector break in production env.\n// This helps developer not to do style override directly on the hash id.\nconst hashPrefix = (!isProduction && !isPrerender) ? 'css-dev-only-do-not-override' : 'css';\n\nexport interface Option<DerivativeToken, DesignToken> {\n  /**\n   * Generate token with salt.\n   * This is used to generate different hashId even same derivative token for different version.\n   */\n  salt?: string\n  override?: object\n  /**\n   * Format token as you need. Such as:\n   *\n   * - rename token\n   * - merge token\n   * - delete token\n   *\n   * This should always be the same since it's one time process.\n   * It's ok to useMemo outside but this has better cache strategy.\n   */\n  formatToken?: (mergedToken: any) => DerivativeToken\n  /**\n   * Get final token with origin token, override token and theme.\n   * The parameters do not contain formatToken since it's passed by user.\n   * @param origin The original token.\n   * @param override Extra tokens to override.\n   * @param theme Theme instance. Could get derivative token by `theme.getDerivativeToken`\n   */\n  getComputedToken?: (\n    origin: DesignToken,\n    override: object,\n    theme: Theme<any, any>,\n  ) => DerivativeToken\n}\n\nconst tokenKeys = new Map<string, number>();\nfunction recordCleanToken(tokenKey: string) {\n  tokenKeys.set(tokenKey, (tokenKeys.get(tokenKey) || 0) + 1);\n}\n\nfunction removeStyleTags(key: string, instanceId: string) {\n  if (typeof document !== 'undefined') {\n    const styles = document.querySelectorAll(`style[${ATTR_TOKEN}=\"${key}\"]`);\n\n    styles.forEach((style) => {\n      if ((style as any)[CSS_IN_JS_INSTANCE] === instanceId)\n        style.parentNode?.removeChild(style);\n    });\n  }\n}\nconst TOKEN_THRESHOLD = 0;\n\n// Remove will check current keys first\nfunction cleanTokenStyle(tokenKey: string, instanceId: string) {\n  tokenKeys.set(tokenKey, (tokenKeys.get(tokenKey) || 0) - 1);\n\n  const tokenKeyList = Array.from(tokenKeys.keys());\n  const cleanableKeyList = tokenKeyList.filter((key) => {\n    const count = tokenKeys.get(key) || 0;\n\n    return count <= 0;\n  });\n\n  // Should keep tokens under threshold for not to insert style too often\n  if (tokenKeyList.length - cleanableKeyList.length > TOKEN_THRESHOLD) {\n    cleanableKeyList.forEach((key) => {\n      removeStyleTags(key, instanceId);\n      tokenKeys.delete(key);\n    });\n  }\n}\n\nexport function getComputedToken<DerivativeToken = object, DesignToken = DerivativeToken>(originToken: DesignToken, overrideToken: object, theme: Theme<any, any>, format?: (token: DesignToken) => DerivativeToken) {\n  const derivativeToken = theme.getDerivativeToken(originToken);\n\n  // Merge with override\n  let mergedDerivativeToken = {\n    ...derivativeToken,\n    ...overrideToken,\n  };\n\n  // Format if needed\n  if (format)\n    mergedDerivativeToken = format(mergedDerivativeToken);\n\n  return mergedDerivativeToken;\n}\n\n/**\n * Cache theme derivative token as global shared one\n * @param theme Theme entity\n * @param tokens List of tokens, used for cache. Please do not dynamic generate object directly\n * @param option Additional config\n * @returns Call Theme.getDerivativeToken(tokenObject) to get token\n */\nexport default function useCacheToken<DerivativeToken = object, DesignToken = DerivativeToken>(\n  theme: Ref<Theme<any, any>>,\n  tokens: Ref<Array<Partial<DesignToken>>>,\n  option: Ref<Option<DerivativeToken, DesignToken>> = ref({}),\n) {\n  const style = useStyleInject();\n  // Basic - We do basic cache here\n  const mergedToken = computed(() => Object.assign({}, ...tokens.value));\n  const tokenStr = computed(() => flattenToken(mergedToken.value));\n  const overrideTokenStr = computed(() => flattenToken(option.value.override || EMPTY_OVERRIDE));\n\n  const cachedToken = useGlobalCache<[DerivativeToken & { _tokenKey: string }, string]>(\n    'token',\n    computed(() => [\n      option.value.salt || '',\n      theme.value.id,\n      tokenStr.value,\n      overrideTokenStr.value,\n    ]),\n    () => {\n      const {\n        salt = '',\n        override = EMPTY_OVERRIDE,\n        formatToken,\n        getComputedToken: compute,\n      } = option.value;\n      const mergedDerivativeToken = compute\n        ? compute(mergedToken.value, override, theme.value)\n        : getComputedToken(mergedToken.value, override, theme.value, formatToken);\n\n      // Optimize for `useStyleRegister` performance\n      const tokenKey = token2key(mergedDerivativeToken, salt);\n      mergedDerivativeToken._tokenKey = tokenKey;\n      recordCleanToken(tokenKey);\n\n      const hashId = `${hashPrefix}-${hash(tokenKey)}`;\n      mergedDerivativeToken._hashId = hashId; // Not used\n\n      return [mergedDerivativeToken, hashId];\n    },\n    (cache) => {\n      // Remove token will remove all related style\n      cleanTokenStyle(cache[0]._tokenKey, style.value?.cache.instanceId);\n    },\n  );\n\n  return cachedToken;\n}\n"],"names":["useGlobalCache"],"mappings":"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"}