{"version":3,"file":"index.mjs","sources":["../src/intlBase.ts","../src/parse.ts","../src/serialize.ts","../src/makeIntl.ts"],"sourcesContent":["export type IntlBase = {\n  locale: string;\n  pluralRulesCardinal: Intl.PluralRules;\n  pluralRulesOrdinal: Intl.PluralRules;\n  makeDateTimeFormat: (options: Intl.DateTimeFormatOptions) => Intl.DateTimeFormat;\n};\nexport const makeIntlBase = (locale: string): IntlBase => ({\n  locale,\n  pluralRulesCardinal: new Intl.PluralRules(locale, { type: 'cardinal' }),\n  pluralRulesOrdinal: new Intl.PluralRules(locale, { type: 'ordinal' }),\n  makeDateTimeFormat: (options) => new Intl.DateTimeFormat(locale, options),\n});\n","type VariableNode = {\n  type: 'variable';\n  name: string;\n  offset?: PluralOffset;\n  bracketsGroup: number;\n};\ntype PluralNode = {\n  type: 'plural';\n  cardinal: boolean;\n  variable: VariableNode;\n  offset?: PluralOffset;\n  options: {\n    zero?: AstNode[];\n    one?: AstNode[];\n    two?: AstNode[];\n    few?: AstNode[];\n    many?: AstNode[];\n    other?: AstNode[];\n    exacts?: {\n      [value: string]: AstNode[];\n    };\n  };\n};\ntype SelectNode = {\n  type: 'select';\n  variable: VariableNode;\n  options: Record<string, AstNode[]>;\n};\ntype PluralExactValue = {\n  type: 'plural-exact-value';\n  value: string;\n};\ntype PluralOffset = {\n  type: 'plural-offset';\n  rawValue: string;\n  value: number;\n};\ntype ExternalNode<T = any> = {\n  type: 'external';\n  name: string;\n  optionsPart: boolean;\n  variableName: string;\n  data: T;\n  rawData: string;\n};\ntype PureTextNode = {\n  type: 'pure-text';\n  text: string;\n};\nexport type AstNode =\n  | string\n  | VariableNode\n  | PluralNode\n  | PluralExactValue\n  | PluralOffset\n  | SelectNode\n  | ExternalNode\n  | PureTextNode;\n\nexport type ExternalParser<Params = unknown> = (rawData: string, variableName: string, verboseInput?: any) => Params;\nexport type ExternalParsers<Params = unknown> = {\n  [parseName: string]: ExternalParser<Params>;\n};\n\nconst pluralOptions = ['zero', 'one', 'two', 'few', 'many', 'other'];\nconst externals = ['number', 'date', 'time'];\n\nexport type ParseIcuOptions = {\n  externalParsers?: ExternalParsers;\n  verboseParsing?: { [variableName: string]: any };\n  postParsers?: PostParser<AstNode[], AstNode[]>[];\n};\nconst runPostParsers = (ast: AstNode[], postParsers: ParseIcuOptions['postParsers'] = []) =>\n  postParsers.reduce((ast, postParser) => postParser(ast), ast);\n\nexport const parseIcu = (message: string, options: ParseIcuOptions): AstNode[] => {\n  if (!message.includes('{')) return runPostParsers([message], options.postParsers);\n\n  const topLevel: AstNode[] = [];\n  const parentAstChain: AstNode[][] = [];\n  let scopeVariableName: string | null = null;\n  let ast: AstNode[] = topLevel;\n  let prevAstPart: AstNode | null = null;\n  let currentAstPart: AstNode | null = null;\n  let escaping = false;\n  let depth = 0;\n  let bracketsGroupChunkId = 0;\n  const nextPart = (triggerChar: string) => {\n    let currentPart = currentAstPart!;\n    let partConsumed = false;\n    if (typeof currentPart === 'object' && currentPart !== null && typeof prevAstPart === 'object' && prevAstPart !== null) {\n      if (\n        currentPart.type === 'variable' &&\n        prevAstPart.type === 'variable' &&\n        currentPart.bracketsGroup == prevAstPart.bracketsGroup\n      ) {\n        if (currentPart.name === 'plural' || currentPart.name === 'selectordinal' || currentPart.name === 'select') {\n          scopeVariableName = prevAstPart.name;\n          currentPart = {\n            type: currentPart.name === 'select' ? 'select' : 'plural',\n            cardinal: currentPart.name !== 'selectordinal',\n            variable: prevAstPart,\n            options: {},\n          } as PluralNode | SelectNode;\n          ast.pop();\n        } else if (externals.includes(currentPart.name)) {\n          currentPart = {\n            type: 'external',\n            name: currentPart.name,\n            variableName: prevAstPart.name,\n            data: null,\n            optionsPart: triggerChar !== '}',\n            rawData: '',\n          };\n          ast.pop();\n        } else {\n          throw new Error(`Unsupported syntax rule \"${currentPart.name}\"`);\n        }\n      }\n      if (currentPart.type === 'plural-offset' && prevAstPart.type === 'plural') {\n        partConsumed = true;\n        currentPart.value = Number.parseInt(currentPart.rawValue, 10);\n        prevAstPart.offset = currentPart;\n      }\n      if (currentPart.type === 'plural-exact-value' && prevAstPart.type === 'plural') {\n        partConsumed = true;\n        prevAstPart.options.exacts = prevAstPart.options.exacts ?? {};\n        prevAstPart.options.exacts[currentPart.value] = [];\n        parentAstChain.push(ast);\n        ast = prevAstPart.options.exacts[currentPart.value];\n      }\n      if (\n        currentPart.type === 'variable' &&\n        ((prevAstPart.type === 'plural' && pluralOptions.includes(currentPart.name)) || prevAstPart.type === 'select')\n      ) {\n        partConsumed = true;\n        prevAstPart.options[currentPart.name as keyof typeof prevAstPart.options] = [];\n        parentAstChain.push(ast);\n        ast = prevAstPart.options[currentPart.name as keyof typeof prevAstPart.options] as AstNode[];\n      }\n    }\n    if (!partConsumed && currentPart !== null) {\n      ast.push(currentPart);\n      prevAstPart = currentPart;\n    }\n    currentAstPart = null;\n  };\n\n  for (let i = 0; i < message.length; i++) {\n    const char = message[i];\n    const currentEscaping = escaping;\n    if (char === \"'\") {\n      escaping = !escaping;\n      nextPart(char);\n      if (message[i - 1] === \"'\") {\n        currentAstPart = { type: 'pure-text', text: \"'\" };\n        nextPart(char);\n      }\n      continue;\n    }\n    const prevDepth = depth;\n\n    if (char === '}' && !currentEscaping) {\n      if (depth <= 0) {\n        throw new Error(`Broken order of \"{\" and \"}\" in \"${message}\" of symbol ${i}`);\n      }\n      depth--;\n    }\n\n    if (char === '{' && !currentEscaping) {\n      depth++;\n      bracketsGroupChunkId++;\n    }\n\n    if (typeof prevAstPart === 'object' && prevAstPart?.type === 'external' && prevAstPart.optionsPart) {\n      if (prevDepth === depth) {\n        prevAstPart.rawData += char;\n      } else {\n        const verboseParsing =\n          prevAstPart.rawData.trim() === 'verbose' ? (options.verboseParsing ?? {})[prevAstPart.variableName] : undefined;\n        const parserAvailable = options.externalParsers?.[prevAstPart.name] || verboseParsing;\n        if (!parserAvailable) {\n          throw new Error(`Parser for \"${prevAstPart.name}\" (variable \"${prevAstPart.variableName}\") was not provided`);\n        }\n        prevAstPart.data = options.externalParsers?.[prevAstPart.name](\n          prevAstPart.rawData,\n          prevAstPart.variableName,\n          verboseParsing,\n        );\n        prevAstPart = null;\n      }\n      continue;\n    }\n\n    if (char === '#' && !currentEscaping && scopeVariableName) {\n      const parentAst = parentAstChain[parentAstChain.length - 1];\n      const parentNode = parentAst?.[parentAst?.length - 1];\n      if (typeof parentNode === 'object' && parentNode.type === 'plural') {\n        nextPart(char);\n\n        currentAstPart = {\n          type: 'external',\n          name: 'number',\n          optionsPart: false,\n          variableName: parentNode.variable.name,\n          data: { offset: parentNode.offset?.value },\n          rawData: '#',\n        };\n\n        nextPart(char);\n        continue;\n      }\n    }\n    const valueDepth = depth % 2 === 0;\n    if (prevDepth !== depth && currentAstPart !== null) {\n      nextPart(char);\n    }\n    if (!valueDepth && prevDepth > depth && parentAstChain.length > 0) {\n      ast = parentAstChain.pop()!;\n      prevAstPart = ast[ast.length - 1];\n    }\n    if (prevDepth !== depth) continue;\n\n    if (currentAstPart === null) {\n      if (currentEscaping) {\n        currentAstPart = { type: 'pure-text', text: '' };\n      } else if (valueDepth) currentAstPart = '';\n      else if (char === ' ') continue;\n      else if (char === '\\n') continue;\n      else if (char === '\\r') continue;\n      else if (char === '\\t') continue;\n      else if (char === '=') {\n        currentAstPart = { type: 'plural-exact-value', value: '' } as AstNode;\n        continue;\n      } else {\n        currentAstPart = {\n          type: 'variable',\n          name: '',\n          bracketsGroup: bracketsGroupChunkId,\n        } as AstNode;\n      }\n    }\n    if (typeof currentAstPart === 'object' && currentAstPart !== null && (char === ',' || char === ' ') && !currentEscaping) {\n      nextPart(char);\n    }\n    if (currentAstPart === null) {\n      if (valueDepth) currentAstPart = '';\n    }\n\n    if (typeof currentAstPart === 'string') currentAstPart += char;\n    if (typeof currentAstPart === 'object' && currentAstPart !== null) {\n      if (currentAstPart.type === 'pure-text') currentAstPart.text += char;\n      if (currentAstPart.type === 'plural-exact-value') currentAstPart.value += char;\n      if (currentAstPart.type === 'plural-offset') currentAstPart.rawValue += char;\n      if (currentAstPart.type === 'variable') {\n        if (char === ':' && currentAstPart.name === 'offset') {\n          currentAstPart = { type: 'plural-offset', rawValue: '', value: 0 };\n        } else {\n          currentAstPart.name += char;\n        }\n      }\n    }\n  }\n  if (depth > 0) {\n    throw new Error(`Broken order of \"{\" and \"}\" in \"${message}\" (need ${depth} more \"}\")`);\n  }\n  if (depth < 0) {\n    throw new Error(`Broken order of \"{\" and \"}\" in \"${message}\" (${depth * -1} \"}\" is/are extra)`);\n  }\n  while (parentAstChain.length > 0) {\n    ast = parentAstChain.pop()!;\n  }\n  if (currentAstPart !== null) ast.push(currentAstPart);\n\n  return runPostParsers(ast, options.postParsers);\n};\n\nexport type PostParser<InputAst extends AstNode[], OutputAst extends AstNode[]> = (inputAst: InputAst) => OutputAst;\n","import { IntlBase } from './intlBase';\nimport { AstNode } from './parse';\n\nexport type ExternalSerializer<Params = unknown> = (\n  params: Params | null,\n  variableValue: unknown,\n  intl: IntlBase,\n  serializeNested: (ast: AstNode[]) => unknown,\n  node: AstNode,\n  values: Record<string, string | number | boolean | undefined | unknown>,\n) => string;\nexport type ExternalSerializers<Params = unknown> = {\n  [serializerName: string]: ExternalSerializer<Params>;\n};\n\nexport type VerboseSerialization = {\n  [variableName: string]: unknown;\n};\n\ntype Reducer<T> = {\n  getInit: () => T;\n  reduce: (acc: T, item: unknown, nodeType: 'string' | 'variable' | 'plural' | 'select' | 'external' | 'unknown') => T;\n};\nconst defaultReducer: Reducer<string | (string | unknown)[]> = {\n  getInit: () => '',\n  reduce: (acc, item) => {\n    if (typeof item !== 'object') {\n      if (Array.isArray(acc)) {\n        if (typeof acc[acc.length - 1] !== 'object') acc[acc.length - 1] += String(item);\n        else acc.push(String(item));\n      } else {\n        acc += String(item);\n      }\n    } else {\n      if (Array.isArray(acc)) acc.push(item);\n      else if (acc === '') return [item];\n      else return [acc, item];\n    }\n    return acc;\n  },\n};\n\nexport type SerializeIcuOptions = {\n  externalSerializers?: ExternalSerializers;\n  reducer?: Reducer<any>;\n  original?: string;\n};\n\nexport const serializeIcu = <T = string>(\n  ast: AstNode[],\n  values: Record<string, string | number | boolean | undefined | unknown>,\n  intl: IntlBase,\n  options?: SerializeIcuOptions,\n): T => {\n  const serializeNested = (ast: AstNode[]) => serializeIcu(ast, values, intl, options);\n  const reducer = options?.reducer ?? (defaultReducer as any as Reducer<T>);\n  let result = reducer.getInit();\n  for (const node of ast) {\n    if (typeof node === 'string') {\n      result = reducer.reduce(result, node, 'string');\n    } else if (typeof node === 'object' && node !== null) {\n      if (node.type === 'pure-text') {\n        result = reducer.reduce(result, node.text, 'string');\n      } else if (node.type === 'variable') {\n        if (!values || !(node.name in values)) {\n          throw new Error(`Variable \"${node.name}\" was not provided for string \"${options?.original}\"`);\n        }\n        let value = values[node.name as keyof typeof values];\n        if (typeof value === 'number' && node.offset) value -= node.offset.value;\n        if (value !== false && value !== null && value !== undefined) {\n          result = reducer.reduce(result, value, 'variable');\n        }\n      } else if (node.type === 'plural') {\n        const value = values?.[node.variable.name as keyof typeof values];\n        const exactRule = node.options.exacts?.[value as keyof typeof node.options.exacts];\n        let nestedAst = value;\n        if (exactRule) {\n          nestedAst = exactRule;\n        } else {\n          const finalValue = (value as number) - (node.offset?.value ?? 0);\n          const pluralBase = node.cardinal ? intl.pluralRulesCardinal : intl.pluralRulesOrdinal;\n          const selected = pluralBase.select(finalValue);\n          nestedAst = node.options[selected] ?? node.options.other;\n        }\n        if (Array.isArray(nestedAst)) {\n          result = reducer.reduce(result, serializeIcu(nestedAst, values, intl, options), 'plural');\n        } else {\n          result = reducer.reduce(result, nestedAst, 'plural');\n        }\n      } else if (node.type === 'select') {\n        const value = values?.[node.variable.name as keyof typeof values];\n        const nestedAst = node.options[value as keyof typeof node.options] ?? node.options.other ?? String(value);\n        result = reducer.reduce(result, serializeIcu(nestedAst as AstNode[], values, intl, options), 'select');\n      } else if (node.type === 'external') {\n        const value = values[node.variableName];\n        if (!options?.externalSerializers?.[node.name]) {\n          if (!node.optionsPart && node.name === 'number') {\n            result = reducer.reduce(result, new Intl.NumberFormat(intl.locale).format(value as number), 'external');\n            continue;\n          }\n          throw new Error(`No serializer provided for type ${node.name}`);\n        }\n        const subResult = options.externalSerializers?.[node.name](\n          node.data,\n          values[node.variableName],\n          intl,\n          serializeNested,\n          node,\n          values,\n        );\n        if (Array.isArray(subResult)) {\n          for (const chunk of subResult) {\n            result = reducer.reduce(result, chunk, 'external');\n          }\n        } else {\n          result = reducer.reduce(result, subResult, 'external');\n        }\n      } else {\n        result = reducer.reduce(result, node, 'unknown');\n      }\n    }\n  }\n  return result;\n};\n\nexport type PreSerializer<InputAst extends AstNode[], OutputAst extends AstNode[]> = (inputAst: InputAst) => OutputAst;\n","import { makeIntlBase } from './intlBase';\nimport { AstNode, ExternalParser, ExternalParsers, parseIcu, ParseIcuOptions, PostParser } from './parse';\nimport { ExternalSerializer, ExternalSerializers, serializeIcu } from './serialize';\nimport { ICUVariablesMapFromTemplate, SerializationResult } from './typings';\n\n/**\n * @description Required but undefined possible */\ntype RUP<T extends {}> = {\n  [K in keyof T]: T[K] | undefined;\n};\ntype NeverIfObjectHasNoProperties<T extends {}> = {} extends T ? never : T;\n\ntype EntitiesOfMessage<Message extends string, Values extends { [key: string]: any } = {}> = string extends Message\n  ? { [key: string]: any } & {\n      how_to_add_autocomplete_and_strict_types_checking_for_nanointl?: 'http://github.com/phytonmk/nanointl/#strict-typings';\n    }\n  : NeverIfObjectHasNoProperties<RUP<ICUVariablesMapFromTemplate<Message, Values>>>;\n\nexport type FormatMessage<Messages extends { [messageId: string]: string }> = <\n  MessageKey extends keyof Messages,\n  Values extends EntitiesOfMessage<Messages[MessageKey], Values>,\n>(\n  messageId: MessageKey,\n  values?: Values,\n) => SerializationResult<Values> &\n  (<MessageKey extends keyof Messages>(\n    messageId: EntitiesOfMessage<Messages[MessageKey], {}> extends never ? MessageKey : never,\n  ) => string);\n\nexport type NanointlPlugin<Params = unknown> = {\n  name: string;\n  init: (options: {\n    addParser: (token: string, parser: ExternalParser<Params>) => void;\n    addSerializer: (token: string, serializer: ExternalSerializer<Params>) => void;\n    addPostParser: (postParser: PostParser<AstNode[], AstNode[]>) => void;\n  }) => void;\n};\n\nexport type MakeIntlOptions = {\n  verboseParsing?: { [variableName: string]: any };\n  disableCache?: boolean;\n  plugins?: NanointlPlugin<any>[];\n};\n\nexport type IntlInstance<\n  Messages extends { [messageId: string]: string },\n  FM extends FormatMessage<Messages> = FormatMessage<Messages>,\n> = {\n  formatMessage: FM;\n  clearCache: () => void;\n};\n\ntype Cache<V> = { s: Map<any, Cache<V>>; w: WeakMap<any, Cache<V>>; v: V | undefined };\nconst getFromCache = <T = unknown>(cache: Cache<T>, path: any[]): T => {\n  if (!cache) return cache as any;\n  if (path.length === 0) return cache.v as T;\n  if (typeof path[0] === 'object' && path[0] !== null) return getFromCache(cache?.w.get(path[0]) as Cache<T>, path.slice(1));\n  return getFromCache<T>(cache?.s.get(path[0]) as Cache<T>, path.slice(1));\n};\nconst addToCache = <T>(cache: Cache<T>, path: any[], value: T): T => {\n  if (path.length === 0) return (cache.v = value);\n  const pathHeadIsObject = typeof path[0] === 'object' && path[0] !== null;\n  const nextCacheNode = pathHeadIsObject ? cache.w.get(path[0]) : cache.s.get(path[0]);\n  if (!nextCacheNode) {\n    if (pathHeadIsObject) cache.w.set(path[0], { s: new Map(), w: new WeakMap(), v: undefined });\n    else cache.s.set(path[0], { s: new Map(), w: new WeakMap(), v: undefined });\n  }\n  return addToCache<T>((pathHeadIsObject ? cache.w.get(path[0]) : cache.s.get(path[0]))!, path.slice(1), value);\n};\n\nexport const makeIntl = <\n  Messages extends { [messageId: string]: string },\n  FM extends FormatMessage<Messages> = FormatMessage<Messages>,\n>(\n  locale: string,\n  messages: Messages,\n  options?: MakeIntlOptions,\n): IntlInstance<Messages, FM> => {\n  const astStore: { [messageId: string]: AstNode[] } = {};\n  const cache: Cache<string> = { s: new Map(), w: new WeakMap(), v: undefined };\n  const externalParsers: ExternalParsers = {};\n  const externalSerializers: ExternalSerializers = {};\n  const postParsers: PostParser<AstNode[], AstNode[]>[] = [];\n\n  for (const plugin of options?.plugins ?? []) {\n    try {\n      plugin.init({\n        addParser: (token, parser) => (externalParsers[token] = parser),\n        addSerializer: (token, serializer) => (externalSerializers[token] = serializer),\n        addPostParser: (postParser) => {\n          postParsers.push(postParser);\n        },\n      });\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error(`Error ocurred during \"${plugin.name}\" init call:`);\n      throw err;\n    }\n  }\n\n  const parsingOptions: ParseIcuOptions = {\n    externalParsers,\n    verboseParsing: options?.verboseParsing,\n    postParsers,\n  };\n  for (const messageId in messages) {\n    astStore[messageId] = parseIcu(messages[messageId], parsingOptions);\n  }\n\n  const intlBase = makeIntlBase(locale);\n  return {\n    formatMessage: ((messageId, values) => {\n      if (!(messageId in astStore)) {\n        return String(messageId);\n      }\n      const cachePath = [messageId, ...Object.values(values ?? {})];\n      const cached = getFromCache(cache, cachePath);\n      if (cached) return cached;\n      const ast = astStore[messageId as keyof typeof astStore];\n      const result = serializeIcu(ast, values ?? {}, intlBase, {\n        externalSerializers,\n        original: messages[messageId],\n      });\n      if (options?.disableCache) return result;\n      return addToCache(cache, cachePath, result);\n    }) as FM,\n    clearCache: () => {\n      cache.s = new Map();\n      cache.w = new WeakMap();\n      cache.v = undefined;\n    },\n  };\n};\n"],"names":["makeIntlBase","pluralOptions","externals","runPostParsers","ast","postParsers","reduce","postParser","parseIcu","message","options","includes","parentAstChain","scopeVariableName","prevAstPart","currentAstPart","escaping","depth","bracketsGroupChunkId","nextPart","triggerChar","currentPart","partConsumed","type","bracketsGroup","name","cardinal","variable","pop","variableName","data","optionsPart","rawData","value","Number","parseInt","rawValue","offset","exacts","_prevAstPart$options$","push","i","length","_prevAstPart","_char","currentEscaping","char","prevDepth","Error","_options$verboseParsi","_options$externalPars","_options$externalPars2","trim","verboseParsing","undefined","externalParsers","parentAst","parentNode","_parentNode$offset","valueDepth","text","getInit","acc","item","Array","isArray","String","values","intl","_options$reducer","_step","serializeNested","serializeIcu","reducer","defaultReducer","result","_iterator","done","node","original","_node$options$exacts","_value","exactRule","nestedAst","_node$offset$value","_node$offset","_node$options$selecte","finalValue","pluralRulesCardinal","pluralRulesOrdinal","select","selected","other","_ref","_node$options$_value","_options$externalSeri","_options$externalSeri2","externalSerializers","NumberFormat","locale","format","subResult","getFromCache","cache","path","v","w","get","s","slice","addToCache","pathHeadIsObject","set","Map","WeakMap","messages","astStore","plugins","_options$plugins","plugin","init","addParser","token","parser","addSerializer","serializer","addPostParser","err","console","error","parsingOptions","messageId","Intl","PluralRules","makeDateTimeFormat","DateTimeFormat","formatMessage","cachePath","Object","cached","intlBase","disableCache","clearCache"],"mappings":"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"}