@ultraq/icu-message-formatter 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,12 +2,19 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ ### 0.14.2
6
+ - Fix types on the main exports too (tsc was being run over
7
+ transpiled-for-browser code 🤦‍♂️)
8
+
9
+ ### 0.14.1
10
+ - Update generated types for some of the utility exports
11
+
5
12
  ### 0.14.0
6
13
  - On the road to making this pure ESM, the following internal changes have been
7
14
  made:
8
- - Added `"type": "module"` so ESM is now the default
9
- - Package outputs defined using an `exports` map w/ `import` pointing to the
10
- main source and `require` to a transpiled version of the source
15
+ - Added `"type": "module"` so ESM is now the default
16
+ - Package outputs defined using an `exports` map w/ `import` pointing to the
17
+ main source and `require` to a transpiled version of the source
11
18
 
12
19
  ### 0.13.0
13
20
  - Minimum supported version of Node is now 18
package/README.md CHANGED
File without changes
@@ -1,2 +1,2 @@
1
- function t(t){const n=t=>/\s/.test(t),r=[],s={};let l=0,i=null,o=!1,u=0;for(;u<t.length;){if(o&&(n(t[u])||"{"===t[u]))o=!1,i=t.slice(l,u),"{"===t[u]&&u--;else if(!o&&!n(t[u])){const n="{"===t[u];if(i&&n){const n=e(t,u);if(-1===n)throw new Error(`Unbalanced curly braces in string: "${t}"`);s[i]=t.slice(u+1,n),u=n,i=null}else i&&(r.push(i),i=null),o=!0,l=u}u++}return o&&(i=t.slice(l)),i&&r.push(i),{args:r,cases:s}}function e(t,e){let n=0;for(let r=e+1;r<t.length;r++){let e=t.charAt(r);if("}"===e){if(0===n)return r;n--}else"{"===e&&n++}return-1}function n(t){return r(t.slice(1,-1),",",3)}function r(t,e,n){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(!t)return s;if(1===n)return s.push(t),s;let l=t.indexOf(e);if(-1===l)return s.push(t),s;let i=t.substring(0,l).trim(),o=t.substring(l+e.length+1).trim();return s.push(i),r(o,e,n-1,s)}class s{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.locale=t,this.typeHandlers=e}format=function(t){const e={};return function(...n){let r=n.length?n.map((t=>null===t?"null":void 0===t?"undefined":"function"==typeof t?t.toString():t instanceof Date?t.toISOString():JSON.stringify(t))).join("|"):"_(no-args)_";if(Object.prototype.hasOwnProperty.call(e,r))return e[r];let s=t(...n);return e[r]=s,s}}((()=>{var t=this;return function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.process(e,n).flat(1/0).join("")}})());process(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return[];let s=t.indexOf("{");if(-1!==s){let l=e(t,s);if(-1===l)throw new Error(`Unbalanced curly braces in string: "${t}"`);{let e=t.substring(s,l+1);if(e){let i=[],o=t.substring(0,s);o&&i.push(o);let[u,c,h]=n(e),f=r[u];null==f&&(f="");let a=c&&this.typeHandlers[c];i.push(a?a(f,h,this.locale,r,this.process.bind(this)):f);let g=t.substring(l+1);return g&&i.push(this.process(g,r)),i}}}return[t]}}let l,i=0;const o="other";function u(t,e){let n=0,r="",s=0;const l={};for(;n<t.length;){if("#"!==t[n]||s)r+=t[n];else{let t="__hashToken"+i++;r+=`{${t}, number}`,l[t]=e}"{"===t[n]?s++:"}"===t[n]&&s--,n++}return{caseBody:r,numberValues:l}}function c(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,s=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0;const{args:c,cases:h}=t(n);let f=parseInt(e);c.forEach((t=>{t.startsWith("offset:")&&(f-=parseInt(t.slice(7)))}));const a=[];if("PluralRules"in Intl){void 0!==l&&l.resolvedOptions().locale===r||(l=new Intl.PluralRules(r));const t=l.select(f);t!==o&&a.push(t)}1===f&&a.push("one"),a.push(`=${f}`,o);for(let t=0;t<a.length;t++){const e=a[t];if(e in h){const{caseBody:t,numberValues:n}=u(h[e],f);return i(t,{...s,...n})}}return e}const h="other";function f(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0;const{cases:l}=t(n);return e in l?s(l[e],r):h in l?s(l[h],r):e}export{s as MessageFormatter,e as findClosingBracket,t as parseCases,c as pluralTypeHandler,f as selectTypeHandler,n as splitFormattedArgument};
1
+ function t(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const n=t=>/\s/.test(t),r=[],s={};let l=0,i=null,o=!1,u=0;for(;u<t.length;){if(o&&(n(t[u])||"{"===t[u]))o=!1,i=t.slice(l,u),"{"===t[u]&&u--;else if(!o&&!n(t[u])){const n="{"===t[u];if(i&&n){const n=e(t,u);if(-1===n)throw new Error(`Unbalanced curly braces in string: "${t}"`);s[i]=t.slice(u+1,n),u=n,i=null}else i&&(r.push(i),i=null),o=!0,l=u}u++}return o&&(i=t.slice(l)),i&&r.push(i),{args:r,cases:s}}function e(t,e){let n=0;for(let r=e+1;r<t.length;r++){let e=t.charAt(r);if("}"===e){if(0===n)return r;n--}else"{"===e&&n++}return-1}function n(t){return r(t.slice(1,-1),",",3)}function r(t,e,n){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(!t)return s;if(1===n)return s.push(t),s;let l=t.indexOf(e);if(-1===l)return s.push(t),s;let i=t.substring(0,l).trim(),o=t.substring(l+e.length+1).trim();return s.push(i),r(o,e,n-1,s)}class s{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.locale=t,this.typeHandlers=e}format=function(t){const e={};return function(){for(var n=arguments.length,r=new Array(n),s=0;s<n;s++)r[s]=arguments[s];let l=r.length?r.map((t=>null===t?"null":void 0===t?"undefined":"function"==typeof t?t.toString():t instanceof Date?t.toISOString():JSON.stringify(t))).join("|"):"_(no-args)_";if(Object.prototype.hasOwnProperty.call(e,l))return e[l];let i=t(...r);return e[l]=i,i}}((()=>{var t=this;return function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.process(e,n).flat(1/0).join("")}})());process(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return[];let s=t.indexOf("{");if(-1!==s){let l=e(t,s);if(-1===l)throw new Error(`Unbalanced curly braces in string: "${t}"`);{let e=t.substring(s,l+1);if(e){let i=[],o=t.substring(0,s);o&&i.push(o);let[u,c,f]=n(e),h=r[u];null==h&&(h="");let a=c&&this.typeHandlers[c];i.push(a?a(h,f,this.locale,r,this.process.bind(this)):h);let p=t.substring(l+1);return p&&i.push(this.process(p,r)),i}}}return[t]}}let l,i=0;const o="other";function u(t,e){let n=0,r="",s=0;const l={};for(;n<t.length;){if("#"!==t[n]||s)r+=t[n];else{let t="__hashToken"+i++;r+=`{${t}, number}`,l[t]=e}"{"===t[n]?s++:"}"===t[n]&&s--,n++}return{caseBody:r,numberValues:l}}function c(e,n,r,s,i){const{args:c,cases:f}=t(n);let h=parseInt(e);c.forEach((t=>{t.startsWith("offset:")&&(h-=parseInt(t.slice(7)))}));const a=[];if("PluralRules"in Intl){void 0!==l&&l.resolvedOptions().locale===r||(l=new Intl.PluralRules(r));const t=l.select(h);t!==o&&a.push(t)}1===h&&a.push("one"),a.push(`=${h}`,o);for(let t=0;t<a.length;t++){const e=a[t];if(e in f){const{caseBody:t,numberValues:n}=u(f[e],h);return i(t,{...s,...n})}}return e}const f="other";function h(e,n,r,s,l){const{cases:i}=t(n);return e in i?l(i[e],s):f in i?l(i[f],s):e}export{s as MessageFormatter,e as findClosingBracket,t as parseCases,c as pluralTypeHandler,h as selectTypeHandler,n as splitFormattedArgument};
2
2
  //# sourceMappingURL=icu-message-formatter.browser.es.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"icu-message-formatter.browser.es.min.js","sources":["../source/utilities.js","../source/MessageFormatter.js","../node_modules/@ultraq/function-utils/function-utils.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js"],"sourcesContent":["/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n * \n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n * \n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string) {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n * \n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n * \n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n * \n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/**\n * A higher-order function to apply [memoization](https://en.wikipedia.org/wiki/Memoization).\n * \n * If memoizing a recursive function, then memoize and define the function at\n * the same time so you can make a call to the memoized function, eg:\n * \n * ```javascript\n * const myFunction = memoize(() => myFunction());\n * ```\n * \n * @param {Function} func\n * @return {Function} \n */\nexport function memoize(func) {\n\tconst cache = {};\n\treturn function(...args) {\n\t\tlet key = args.length ? args\n\t\t\t.map(arg =>\n\t\t\t\targ === null ? 'null' :\n\t\t\t\targ === undefined ? 'undefined' :\n\t\t\t\ttypeof arg === 'function' ? arg.toString() :\n\t\t\t\targ instanceof Date ? arg.toISOString() :\n\t\t\t\tJSON.stringify(arg)\n\t\t\t)\n\t\t\t.join('|') :\n\t\t\t'_(no-args)_';\n\t\tif (Object.prototype.hasOwnProperty.call(cache, key)) {\n\t\t\treturn cache[key];\n\t\t}\n\t\tlet result = func(...args);\n\t\tcache[key] = result;\n\t\treturn result;\n\t};\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches = '', locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n * \n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches = '', locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n"],"names":["parseCases","string","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","length","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","arguments","undefined","indexOfDelimiter","indexOf","head","substring","trim","tail","MessageFormatter","constructor","locale","typeHandlers","this","format","func","cache","key","map","arg","toString","Date","toISOString","JSON","stringify","join","Object","prototype","hasOwnProperty","call","result","memoize","_this","message","values","process","flat","Infinity","blockStartIndex","blockEndIndex","type","body","typeHandler","bind","pluralFormatter","keyCounter","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","pluralTypeHandler","matches","intValue","parseInt","forEach","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword","selectTypeHandler"],"mappings":"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","x_google_ignoreList":[2]}
1
+ {"version":3,"file":"icu-message-formatter.browser.es.min.js","sources":["../source/utilities.js","../source/MessageFormatter.js","../node_modules/@ultraq/function-utils/function-utils.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js"],"sourcesContent":["/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n *\n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n *\n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string = '') {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n *\n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n *\n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n *\n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/**\n * A higher-order function to apply [memoization](https://en.wikipedia.org/wiki/Memoization).\n * \n * If memoizing a recursive function, then memoize and define the function at\n * the same time so you can make a call to the memoized function, eg:\n * \n * ```javascript\n * const myFunction = memoize(() => myFunction());\n * ```\n * \n * @param {Function} func\n * @return {Function} \n */\nexport function memoize(func) {\n\tconst cache = {};\n\treturn function(...args) {\n\t\tlet key = args.length ? args\n\t\t\t.map(arg =>\n\t\t\t\targ === null ? 'null' :\n\t\t\t\targ === undefined ? 'undefined' :\n\t\t\t\ttypeof arg === 'function' ? arg.toString() :\n\t\t\t\targ instanceof Date ? arg.toISOString() :\n\t\t\t\tJSON.stringify(arg)\n\t\t\t)\n\t\t\t.join('|') :\n\t\t\t'_(no-args)_';\n\t\tif (Object.prototype.hasOwnProperty.call(cache, key)) {\n\t\t\treturn cache[key];\n\t\t}\n\t\tlet result = func(...args);\n\t\tcache[key] = result;\n\t\treturn result;\n\t};\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches, locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches, locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n"],"names":["parseCases","string","arguments","length","undefined","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","indexOfDelimiter","indexOf","head","substring","trim","tail","MessageFormatter","constructor","locale","typeHandlers","this","format","func","cache","_len","Array","_key","key","map","arg","toString","Date","toISOString","JSON","stringify","join","Object","prototype","hasOwnProperty","call","result","memoize","_this","message","values","process","flat","Infinity","blockStartIndex","blockEndIndex","type","body","typeHandler","bind","pluralFormatter","keyCounter","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","pluralTypeHandler","matches","intValue","parseInt","forEach","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword","selectTypeHandler"],"mappings":"AAqCO,SAASA,IAAwB,IAAbC,EAAMC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GACnC,MAAMG,EAAeC,GAAM,KAAKC,KAAKD,GAE/BE,EAAO,GACPC,EAAQ,CAAA,EAEd,IAAIC,EAAgB,EAChBC,EAAa,KACbC,GAAS,EAETC,EAAI,EACR,KAAOA,EAAIZ,EAAOE,QAAQ,CAEzB,GAAIS,IAAWP,EAAaJ,EAAOY,KAAqB,MAAdZ,EAAOY,IAChDD,GAAS,EACTD,EAAaV,EAAOa,MAAMJ,EAAeG,GAGvB,MAAdZ,EAAOY,IACVA,SAKG,IAAKD,IAAWP,EAAaJ,EAAOY,IAAK,CAC7C,MAAME,EAAyB,MAAdd,EAAOY,GAIxB,GAAIF,GAAcI,EAAU,CAC3B,MAAMC,EAAiBC,EAAmBhB,EAAQY,GAElD,IAAwB,IAApBG,EACH,MAAM,IAAIE,MAAO,uCAAsCjB,MAGxDQ,EAAME,GAAcV,EAAOa,MAAMD,EAAI,EAAGG,GAExCH,EAAIG,EACJL,EAAa,IACd,MAEKA,IACHH,EAAKW,KAAKR,GACVA,EAAa,MAGdC,GAAS,EACTF,EAAgBG,CAElB,CACAA,GACD,CAUA,OARID,IACHD,EAAaV,EAAOa,MAAMJ,IAGvBC,GACHH,EAAKW,KAAKR,GAGJ,CACNH,OACAC,QAEF,CAYO,SAASQ,EAAmBhB,EAAQmB,GAC1C,IAAIC,EAAQ,EACZ,IAAK,IAAIR,EAAIO,EAAY,EAAGP,EAAIZ,EAAOE,OAAQU,IAAK,CACnD,IAAIS,EAAOrB,EAAOsB,OAAOV,GACzB,GAAa,MAATS,EAAc,CACjB,GAAc,IAAVD,EACH,OAAOR,EAERQ,GACD,KACkB,MAATC,GACRD,GAEF,CACA,OAAQ,CACT,CAWO,SAASG,EAAuBC,GACtC,OAAOC,EAAMD,EAAMX,MAAM,GAAI,GAAI,IAAK,EACvC,CAaA,SAASY,EAAMzB,EAAQ0B,EAAWC,GAAyB,IAAlBC,EAAW3B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GACtD,IAAKD,EACJ,OAAO4B,EAER,GAAc,IAAVD,EAEH,OADAC,EAAYV,KAAKlB,GACV4B,EAER,IAAIC,EAAmB7B,EAAO8B,QAAQJ,GACtC,IAA0B,IAAtBG,EAEH,OADAD,EAAYV,KAAKlB,GACV4B,EAER,IAAIG,EAAO/B,EAAOgC,UAAU,EAAGH,GAAkBI,OAC7CC,EAAOlC,EAAOgC,UAAUH,EAAmBH,EAAUxB,OAAS,GAAG+B,OAErE,OADAL,EAAYV,KAAKa,GACVN,EAAMS,EAAMR,EAAWC,EAAQ,EAAGC,EAC1C,CCxHe,MAAMO,EAYpBC,WAAAA,CAAYC,GAA2B,IAAnBC,EAAYrC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAElCsC,KAAKF,OAASA,EACdE,KAAKD,aAAeA,CACrB,CAQAE,OChEM,SAAiBC,GACvB,MAAMC,EAAQ,CAAA,EACd,OAAO,WAAkB,IAAA,IAAAC,EAAA1C,UAAAC,OAANK,EAAIqC,IAAAA,MAAAD,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAJtC,EAAIsC,GAAA5C,UAAA4C,GACtB,IAAIC,EAAMvC,EAAKL,OAASK,EACtBwC,KAAIC,GACI,OAARA,EAAe,YACP7C,IAAR6C,EAAoB,YACL,mBAARA,EAAqBA,EAAIC,WAChCD,aAAeE,KAAOF,EAAIG,cAC1BC,KAAKC,UAAUL,KAEfM,KAAK,KACN,cACD,GAAIC,OAAOC,UAAUC,eAAeC,KAAKhB,EAAOI,GAC/C,OAAOJ,EAAMI,GAEd,IAAIa,EAASlB,KAAQlC,GAErB,OADAmC,EAAMI,GAAOa,EACNA,EAET,CD4CUC,CAAO,MAAA,IAAAC,EAAAtB,KAAA,OAAC,SAACuB,GAAyB,IAAhBC,EAAM9D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEnC,OAAO4D,EAAKG,QAAQF,EAASC,GAAQE,KAAKC,KAAUZ,KAAK,IACxD,EAHc,IAoBhBU,OAAAA,CAAQF,GAAsB,IAAbC,EAAM9D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEzB,IAAK6D,EACJ,MAAO,GAGR,IAAIK,EAAkBL,EAAQhC,QAAQ,KACtC,IAAyB,IAArBqC,EAAwB,CAC3B,IAAIC,EAAgBpD,EAAmB8C,EAASK,GAChD,IAAuB,IAAnBC,EAyBH,MAAM,IAAInD,MAAO,uCAAsC6C,MAzB9B,CACzB,IAAItC,EAAQsC,EAAQ9B,UAAUmC,EAAiBC,EAAgB,GAC/D,GAAI5C,EAAO,CACV,IAAImC,EAAS,GACT5B,EAAO+B,EAAQ9B,UAAU,EAAGmC,GAC5BpC,GACH4B,EAAOzC,KAAKa,GAEb,IAAKe,EAAKuB,EAAM7B,GAAUjB,EAAuBC,GAC7C8C,EAAOP,EAAOjB,GACdwB,UACHA,EAAO,IAER,IAAIC,EAAcF,GAAQ9B,KAAKD,aAAa+B,GAC5CV,EAAOzC,KAAKqD,EACXA,EAAYD,EAAM9B,EAAQD,KAAKF,OAAQ0B,EAAQxB,KAAKyB,QAAQQ,KAAKjC,OACjE+B,GACD,IAAIpC,EAAO4B,EAAQ9B,UAAUoC,EAAgB,GAI7C,OAHIlC,GACHyB,EAAOzC,KAAKqB,KAAKyB,QAAQ9B,EAAM6B,IAEzBJ,CACR,CACD,CAID,CACA,MAAO,CAACG,EACT,EErHD,IAAIW,EAEAC,EAAa,EAGjB,MACMC,EAAQ,QAQd,SAASC,EAAkB9D,EAAU+D,GACpC,IAAIjE,EAAI,EACJkE,EAAS,GACTC,EAAY,EAChB,MAAMC,EAAe,CAAA,EAErB,KAAOpE,EAAIE,EAASZ,QAAQ,CAC3B,GAAoB,MAAhBY,EAASF,IAAemE,EAM3BD,GAAUhE,EAASF,OANmB,CACtC,IAAIqE,EAAY,cAAaP,IAC7BI,GAAW,IAAGG,aACdD,EAAaC,GAAYJ,CAC1B,CAKoB,MAAhB/D,EAASF,GACZmE,IAEwB,MAAhBjE,EAASF,IACjBmE,IAGDnE,GACD,CAEA,MAAO,CACNE,SAAUgE,EACVE,eAEF,CAgBe,SAASE,EAAkBL,EAAOM,EAAS9C,EAAQ0B,EAAQC,GACzE,MAAMzD,KAACA,EAAIC,MAAEA,GAAST,EAAWoF,GAEjC,IAAIC,EAAWC,SAASR,GAExBtE,EAAK+E,SAAStC,IACTA,EAAIuC,WAAW,aAClBH,GAAYC,SAASrC,EAAInC,MAAM,IAChC,IAGD,MAAM2E,EAAuB,GAE7B,GAAI,gBAAiBC,KAAM,MAEFtF,IAApBsE,GAAiCA,EAAgBiB,kBAAkBrD,SAAWA,IACjFoC,EAAkB,IAAIgB,KAAKE,YAAYtD,IAGxC,MAAMuD,EAAgBnB,EAAgBoB,OAAOT,GAGzCQ,IAAkBjB,GACrBa,EAAqBtE,KAAK0E,EAE5B,CACiB,IAAbR,GACHI,EAAqBtE,KAlFT,OAoFbsE,EAAqBtE,KAAM,IAAGkE,IAAYT,GAE1C,IAAK,IAAI/D,EAAI,EAAGA,EAAI4E,EAAqBtF,OAAQU,IAAK,CACrD,MAAMkF,EAAUN,EAAqB5E,GACrC,GAAIkF,KAAWtF,EAAO,CACrB,MAAMM,SAACA,EAAQkE,aAAEA,GAAgBJ,EAAkBpE,EAAMsF,GAAUV,GACnE,OAAOpB,EAAQlD,EAAU,IACrBiD,KACAiB,GAEL,CACD,CAEA,OAAOH,CACR,CCvGA,MAAMF,EAAQ,QAgBC,SAASoB,EAAkBlB,EAAOM,EAAS9C,EAAQ0B,EAAQC,GACzE,MAAMxD,MAACA,GAAST,EAAWoF,GAE3B,OAAIN,KAASrE,EACLwD,EAAQxD,EAAMqE,GAAQd,GAErBY,KAASnE,EACVwD,EAAQxD,EAAMmE,GAAQZ,GAGvBc,CACR","x_google_ignoreList":[2]}
@@ -1,2 +1,2 @@
1
- var IcuMessageFormatter=function(t){"use strict";function e(t){const e=t=>/\s/.test(t),r=[],s={};let l=0,i=null,o=!1,u=0;for(;u<t.length;){if(o&&(e(t[u])||"{"===t[u]))o=!1,i=t.slice(l,u),"{"===t[u]&&u--;else if(!o&&!e(t[u])){const e="{"===t[u];if(i&&e){const e=n(t,u);if(-1===e)throw new Error(`Unbalanced curly braces in string: "${t}"`);s[i]=t.slice(u+1,e),u=e,i=null}else i&&(r.push(i),i=null),o=!0,l=u}u++}return o&&(i=t.slice(l)),i&&r.push(i),{args:r,cases:s}}function n(t,e){let n=0;for(let r=e+1;r<t.length;r++){let e=t.charAt(r);if("}"===e){if(0===n)return r;n--}else"{"===e&&n++}return-1}function r(t){return s(t.slice(1,-1),",",3)}function s(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(!t)return r;if(1===n)return r.push(t),r;let l=t.indexOf(e);if(-1===l)return r.push(t),r;let i=t.substring(0,l).trim(),o=t.substring(l+e.length+1).trim();return r.push(i),s(o,e,n-1,r)}let l,i=0;const o="other";function u(t,e){let n=0,r="",s=0;const l={};for(;n<t.length;){if("#"!==t[n]||s)r+=t[n];else{let t="__hashToken"+i++;r+=`{${t}, number}`,l[t]=e}"{"===t[n]?s++:"}"===t[n]&&s--,n++}return{caseBody:r,numberValues:l}}const c="other";return t.MessageFormatter=class{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.locale=t,this.typeHandlers=e}format=function(t){const e={};return function(...n){let r=n.length?n.map((t=>null===t?"null":void 0===t?"undefined":"function"==typeof t?t.toString():t instanceof Date?t.toISOString():JSON.stringify(t))).join("|"):"_(no-args)_";if(Object.prototype.hasOwnProperty.call(e,r))return e[r];let s=t(...n);return e[r]=s,s}}((()=>{var t=this;return function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.process(e,n).flat(1/0).join("")}})());process(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return[];let s=t.indexOf("{");if(-1!==s){let l=n(t,s);if(-1===l)throw new Error(`Unbalanced curly braces in string: "${t}"`);{let n=t.substring(s,l+1);if(n){let i=[],o=t.substring(0,s);o&&i.push(o);let[u,c,a]=r(n),h=e[u];null==h&&(h="");let f=c&&this.typeHandlers[c];i.push(f?f(h,a,this.locale,e,this.process.bind(this)):h);let g=t.substring(l+1);return g&&i.push(this.process(g,e)),i}}}return[t]}},t.findClosingBracket=n,t.parseCases=e,t.pluralTypeHandler=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,s=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0;const{args:c,cases:a}=e(n);let h=parseInt(t);c.forEach((t=>{t.startsWith("offset:")&&(h-=parseInt(t.slice(7)))}));const f=[];if("PluralRules"in Intl){void 0!==l&&l.resolvedOptions().locale===r||(l=new Intl.PluralRules(r));const t=l.select(h);t!==o&&f.push(t)}1===h&&f.push("one"),f.push(`=${h}`,o);for(let t=0;t<f.length;t++){const e=f[t];if(e in a){const{caseBody:t,numberValues:n}=u(a[e],h);return i(t,{...s,...n})}}return t},t.selectTypeHandler=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0;const{cases:l}=e(n);return t in l?s(l[t],r):c in l?s(l[c],r):t},t.splitFormattedArgument=r,t}({});
1
+ var IcuMessageFormatter=function(t){"use strict";function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const e=t=>/\s/.test(t),r=[],s={};let l=0,i=null,o=!1,u=0;for(;u<t.length;){if(o&&(e(t[u])||"{"===t[u]))o=!1,i=t.slice(l,u),"{"===t[u]&&u--;else if(!o&&!e(t[u])){const e="{"===t[u];if(i&&e){const e=n(t,u);if(-1===e)throw new Error(`Unbalanced curly braces in string: "${t}"`);s[i]=t.slice(u+1,e),u=e,i=null}else i&&(r.push(i),i=null),o=!0,l=u}u++}return o&&(i=t.slice(l)),i&&r.push(i),{args:r,cases:s}}function n(t,e){let n=0;for(let r=e+1;r<t.length;r++){let e=t.charAt(r);if("}"===e){if(0===n)return r;n--}else"{"===e&&n++}return-1}function r(t){return s(t.slice(1,-1),",",3)}function s(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(!t)return r;if(1===n)return r.push(t),r;let l=t.indexOf(e);if(-1===l)return r.push(t),r;let i=t.substring(0,l).trim(),o=t.substring(l+e.length+1).trim();return r.push(i),s(o,e,n-1,r)}let l,i=0;const o="other";function u(t,e){let n=0,r="",s=0;const l={};for(;n<t.length;){if("#"!==t[n]||s)r+=t[n];else{let t="__hashToken"+i++;r+=`{${t}, number}`,l[t]=e}"{"===t[n]?s++:"}"===t[n]&&s--,n++}return{caseBody:r,numberValues:l}}const c="other";return t.MessageFormatter=class{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.locale=t,this.typeHandlers=e}format=function(t){const e={};return function(){for(var n=arguments.length,r=new Array(n),s=0;s<n;s++)r[s]=arguments[s];let l=r.length?r.map((t=>null===t?"null":void 0===t?"undefined":"function"==typeof t?t.toString():t instanceof Date?t.toISOString():JSON.stringify(t))).join("|"):"_(no-args)_";if(Object.prototype.hasOwnProperty.call(e,l))return e[l];let i=t(...r);return e[l]=i,i}}((()=>{var t=this;return function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.process(e,n).flat(1/0).join("")}})());process(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return[];let s=t.indexOf("{");if(-1!==s){let l=n(t,s);if(-1===l)throw new Error(`Unbalanced curly braces in string: "${t}"`);{let n=t.substring(s,l+1);if(n){let i=[],o=t.substring(0,s);o&&i.push(o);let[u,c,a]=r(n),f=e[u];null==f&&(f="");let h=c&&this.typeHandlers[c];i.push(h?h(f,a,this.locale,e,this.process.bind(this)):f);let p=t.substring(l+1);return p&&i.push(this.process(p,e)),i}}}return[t]}},t.findClosingBracket=n,t.parseCases=e,t.pluralTypeHandler=function(t,n,r,s,i){const{args:c,cases:a}=e(n);let f=parseInt(t);c.forEach((t=>{t.startsWith("offset:")&&(f-=parseInt(t.slice(7)))}));const h=[];if("PluralRules"in Intl){void 0!==l&&l.resolvedOptions().locale===r||(l=new Intl.PluralRules(r));const t=l.select(f);t!==o&&h.push(t)}1===f&&h.push("one"),h.push(`=${f}`,o);for(let t=0;t<h.length;t++){const e=h[t];if(e in a){const{caseBody:t,numberValues:n}=u(a[e],f);return i(t,{...s,...n})}}return t},t.selectTypeHandler=function(t,n,r,s,l){const{cases:i}=e(n);return t in i?l(i[t],s):c in i?l(i[c],s):t},t.splitFormattedArgument=r,t}({});
2
2
  //# sourceMappingURL=icu-message-formatter.browser.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"icu-message-formatter.browser.min.js","sources":["../source/utilities.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js","../source/MessageFormatter.js","../node_modules/@ultraq/function-utils/function-utils.js"],"sourcesContent":["/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n * \n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n * \n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string) {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n * \n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n * \n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n * \n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches = '', locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n * \n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches = '', locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/**\n * A higher-order function to apply [memoization](https://en.wikipedia.org/wiki/Memoization).\n * \n * If memoizing a recursive function, then memoize and define the function at\n * the same time so you can make a call to the memoized function, eg:\n * \n * ```javascript\n * const myFunction = memoize(() => myFunction());\n * ```\n * \n * @param {Function} func\n * @return {Function} \n */\nexport function memoize(func) {\n\tconst cache = {};\n\treturn function(...args) {\n\t\tlet key = args.length ? args\n\t\t\t.map(arg =>\n\t\t\t\targ === null ? 'null' :\n\t\t\t\targ === undefined ? 'undefined' :\n\t\t\t\ttypeof arg === 'function' ? arg.toString() :\n\t\t\t\targ instanceof Date ? arg.toISOString() :\n\t\t\t\tJSON.stringify(arg)\n\t\t\t)\n\t\t\t.join('|') :\n\t\t\t'_(no-args)_';\n\t\tif (Object.prototype.hasOwnProperty.call(cache, key)) {\n\t\t\treturn cache[key];\n\t\t}\n\t\tlet result = func(...args);\n\t\tcache[key] = result;\n\t\treturn result;\n\t};\n}\n"],"names":["parseCases","string","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","length","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","arguments","undefined","indexOfDelimiter","indexOf","head","substring","trim","tail","pluralFormatter","keyCounter","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","constructor","locale","typeHandlers","this","format","func","cache","key","map","arg","toString","Date","toISOString","JSON","stringify","join","Object","prototype","hasOwnProperty","call","result","memoize","_this","message","values","process","flat","Infinity","blockStartIndex","blockEndIndex","type","body","typeHandler","bind","matches","intValue","parseInt","forEach","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword"],"mappings":"iDAqCO,SAASA,EAAWC,GAC1B,MAAMC,EAAeC,GAAM,KAAKC,KAAKD,GAE/BE,EAAO,GACPC,EAAQ,CAAA,EAEd,IAAIC,EAAgB,EAChBC,EAAa,KACbC,GAAS,EAETC,EAAI,EACR,KAAOA,EAAIT,EAAOU,QAAQ,CAEzB,GAAIF,IAAWP,EAAaD,EAAOS,KAAqB,MAAdT,EAAOS,IAChDD,GAAS,EACTD,EAAaP,EAAOW,MAAML,EAAeG,GAGvB,MAAdT,EAAOS,IACVA,SAKG,IAAKD,IAAWP,EAAaD,EAAOS,IAAK,CAC7C,MAAMG,EAAyB,MAAdZ,EAAOS,GAIxB,GAAIF,GAAcK,EAAU,CAC3B,MAAMC,EAAiBC,EAAmBd,EAAQS,GAElD,IAAwB,IAApBI,EACH,MAAM,IAAIE,MAAO,uCAAsCf,MAGxDK,EAAME,GAAcP,EAAOW,MAAMF,EAAI,EAAGI,GAExCJ,EAAII,EACJN,EAAa,IACd,MAEKA,IACHH,EAAKY,KAAKT,GACVA,EAAa,MAGdC,GAAS,EACTF,EAAgBG,CAElB,CACAA,GACD,CAUA,OARID,IACHD,EAAaP,EAAOW,MAAML,IAGvBC,GACHH,EAAKY,KAAKT,GAGJ,CACNH,OACAC,QAEF,CAYO,SAASS,EAAmBd,EAAQiB,GAC1C,IAAIC,EAAQ,EACZ,IAAK,IAAIT,EAAIQ,EAAY,EAAGR,EAAIT,EAAOU,OAAQD,IAAK,CACnD,IAAIU,EAAOnB,EAAOoB,OAAOX,GACzB,GAAa,MAATU,EAAc,CACjB,GAAc,IAAVD,EACH,OAAOT,EAERS,GACD,KACkB,MAATC,GACRD,GAEF,CACA,OAAQ,CACT,CAWO,SAASG,EAAuBC,GACtC,OAAOC,EAAMD,EAAMX,MAAM,GAAI,GAAI,IAAK,EACvC,CAaA,SAASY,EAAMvB,EAAQwB,EAAWC,GAAyB,IAAlBC,EAAWC,UAAAjB,OAAA,QAAAkB,IAAAD,UAAA,GAAAA,UAAA,GAAG,GACtD,IAAK3B,EACJ,OAAO0B,EAER,GAAc,IAAVD,EAEH,OADAC,EAAYV,KAAKhB,GACV0B,EAER,IAAIG,EAAmB7B,EAAO8B,QAAQN,GACtC,IAA0B,IAAtBK,EAEH,OADAH,EAAYV,KAAKhB,GACV0B,EAER,IAAIK,EAAO/B,EAAOgC,UAAU,EAAGH,GAAkBI,OAC7CC,EAAOlC,EAAOgC,UAAUH,EAAmBL,EAAUd,OAAS,GAAGuB,OAErE,OADAP,EAAYV,KAAKe,GACVR,EAAMW,EAAMV,EAAWC,EAAQ,EAAGC,EAC1C,CC3JA,IAAIS,EAEAC,EAAa,EAGjB,MACMC,EAAQ,QAQd,SAASC,EAAkB1B,EAAU2B,GACpC,IAAI9B,EAAI,EACJ+B,EAAS,GACTC,EAAY,EAChB,MAAMC,EAAe,CAAA,EAErB,KAAOjC,EAAIG,EAASF,QAAQ,CAC3B,GAAoB,MAAhBE,EAASH,IAAegC,EAM3BD,GAAU5B,EAASH,OANmB,CACtC,IAAIkC,EAAY,cAAaP,IAC7BI,GAAW,IAAGG,aACdD,EAAaC,GAAYJ,CAC1B,CAKoB,MAAhB3B,EAASH,GACZgC,IAEwB,MAAhB7B,EAASH,IACjBgC,IAGDhC,GACD,CAEA,MAAO,CACNG,SAAU4B,EACVE,eAEF,CC5CA,MAAML,EAAQ,kCCmCC,MAYdO,WAAAA,CAAYC,GAA2B,IAAnBC,EAAYnB,UAAAjB,OAAA,QAAAkB,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAA,EAElCoB,KAAKF,OAASA,EACdE,KAAKD,aAAeA,CACrB,CAQAE,OChEM,SAAiBC,GACvB,MAAMC,EAAQ,CAAA,EACd,OAAO,YAAY9C,GAClB,IAAI+C,EAAM/C,EAAKM,OAASN,EACtBgD,KAAIC,GACI,OAARA,EAAe,YACPzB,IAARyB,EAAoB,YACL,mBAARA,EAAqBA,EAAIC,WAChCD,aAAeE,KAAOF,EAAIG,cAC1BC,KAAKC,UAAUL,KAEfM,KAAK,KACN,cACD,GAAIC,OAAOC,UAAUC,eAAeC,KAAKb,EAAOC,GAC/C,OAAOD,EAAMC,GAEd,IAAIa,EAASf,KAAQ7C,GAErB,OADA8C,EAAMC,GAAOa,EACNA,EAET,CD4CUC,CAAO,MAAA,IAAAC,EAAAnB,KAAA,OAAC,SAACoB,GAAyB,IAAhBC,EAAMzC,UAAAjB,OAAA,QAAAkB,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEnC,OAAOuC,EAAKG,QAAQF,EAASC,GAAQE,KAAKC,KAAUZ,KAAK,IACxD,EAHc,IAoBhBU,OAAAA,CAAQF,GAAsB,IAAbC,EAAMzC,UAAAjB,OAAA,QAAAkB,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEzB,IAAKwC,EACJ,MAAO,GAGR,IAAIK,EAAkBL,EAAQrC,QAAQ,KACtC,IAAyB,IAArB0C,EAAwB,CAC3B,IAAIC,EAAgB3D,EAAmBqD,EAASK,GAChD,IAAuB,IAAnBC,EAyBH,MAAM,IAAI1D,MAAO,uCAAsCoD,MAzB9B,CACzB,IAAI7C,EAAQ6C,EAAQnC,UAAUwC,EAAiBC,EAAgB,GAC/D,GAAInD,EAAO,CACV,IAAI0C,EAAS,GACTjC,EAAOoC,EAAQnC,UAAU,EAAGwC,GAC5BzC,GACHiC,EAAOhD,KAAKe,GAEb,IAAKoB,EAAKuB,EAAM1B,GAAU3B,EAAuBC,GAC7CqD,EAAOP,EAAOjB,GACdwB,UACHA,EAAO,IAER,IAAIC,EAAcF,GAAQ3B,KAAKD,aAAa4B,GAC5CV,EAAOhD,KAAK4D,EACXA,EAAYD,EAAM3B,EAAQD,KAAKF,OAAQuB,EAAQrB,KAAKsB,QAAQQ,KAAK9B,OACjE4B,GACD,IAAIzC,EAAOiC,EAAQnC,UAAUyC,EAAgB,GAI7C,OAHIvC,GACH8B,EAAOhD,KAAK+B,KAAKsB,QAAQnC,EAAMkC,IAEzBJ,CACR,CACD,CAID,CACA,MAAO,CAACG,EACT,6DFzDc,SAA2B5B,GAA8C,IAAvCuC,EAAOnD,UAAAjB,OAAA,QAAAkB,IAAAD,UAAA,GAAAA,UAAA,GAAG,GAAIkB,EAAMlB,UAAAjB,OAAAiB,EAAAA,kBAAAC,EAAEwC,EAAMzC,UAAAjB,OAAAiB,EAAAA,kBAAAC,EAAEyC,EAAO1C,UAAAjB,OAAAiB,EAAAA,kBAAAC,EACrF,MAAMxB,KAACA,EAAIC,MAAEA,GAASN,EAAW+E,GAEjC,IAAIC,EAAWC,SAASzC,GAExBnC,EAAK6E,SAAS5B,IACTA,EAAI6B,WAAW,aAClBH,GAAYC,SAAS3B,EAAI1C,MAAM,IAChC,IAGD,MAAMwE,EAAuB,GAE7B,GAAI,gBAAiBC,KAAM,MAEFxD,IAApBO,GAAiCA,EAAgBkD,kBAAkBxC,SAAWA,IACjFV,EAAkB,IAAIiD,KAAKE,YAAYzC,IAGxC,MAAM0C,EAAgBpD,EAAgBqD,OAAOT,GAGzCQ,IAAkBlD,GACrB8C,EAAqBnE,KAAKuE,EAE5B,CACiB,IAAbR,GACHI,EAAqBnE,KAlFT,OAoFbmE,EAAqBnE,KAAM,IAAG+D,IAAY1C,GAE1C,IAAK,IAAI5B,EAAI,EAAGA,EAAI0E,EAAqBzE,OAAQD,IAAK,CACrD,MAAMgF,EAAUN,EAAqB1E,GACrC,GAAIgF,KAAWpF,EAAO,CACrB,MAAMO,SAACA,EAAQ8B,aAAEA,GAAgBJ,EAAkBjC,EAAMoF,GAAUV,GACnE,OAAOV,EAAQzD,EAAU,IACrBwD,KACA1B,GAEL,CACD,CAEA,OAAOH,CACR,sBCvFe,SAA2BA,GAA8C,IAAvCuC,EAAOnD,UAAAjB,OAAA,QAAAkB,IAAAD,UAAA,GAAAA,UAAA,GAAG,GAAYyC,EAAMzC,UAAAjB,OAAAiB,EAAAA,kBAAAC,EAAEyC,EAAO1C,UAAAjB,OAAAiB,EAAAA,kBAAAC,EACrF,MAAMvB,MAACA,GAASN,EAAW+E,GAE3B,OAAIvC,KAASlC,EACLgE,EAAQhE,EAAMkC,GAAQ6B,GAErB/B,KAAShC,EACVgE,EAAQhE,EAAMgC,GAAQ+B,GAGvB7B,CACR","x_google_ignoreList":[4]}
1
+ {"version":3,"file":"icu-message-formatter.browser.min.js","sources":["../source/utilities.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js","../source/MessageFormatter.js","../node_modules/@ultraq/function-utils/function-utils.js"],"sourcesContent":["/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n *\n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n *\n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string = '') {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n *\n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n *\n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n *\n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches, locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches, locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/**\n * A higher-order function to apply [memoization](https://en.wikipedia.org/wiki/Memoization).\n * \n * If memoizing a recursive function, then memoize and define the function at\n * the same time so you can make a call to the memoized function, eg:\n * \n * ```javascript\n * const myFunction = memoize(() => myFunction());\n * ```\n * \n * @param {Function} func\n * @return {Function} \n */\nexport function memoize(func) {\n\tconst cache = {};\n\treturn function(...args) {\n\t\tlet key = args.length ? args\n\t\t\t.map(arg =>\n\t\t\t\targ === null ? 'null' :\n\t\t\t\targ === undefined ? 'undefined' :\n\t\t\t\ttypeof arg === 'function' ? arg.toString() :\n\t\t\t\targ instanceof Date ? arg.toISOString() :\n\t\t\t\tJSON.stringify(arg)\n\t\t\t)\n\t\t\t.join('|') :\n\t\t\t'_(no-args)_';\n\t\tif (Object.prototype.hasOwnProperty.call(cache, key)) {\n\t\t\treturn cache[key];\n\t\t}\n\t\tlet result = func(...args);\n\t\tcache[key] = result;\n\t\treturn result;\n\t};\n}\n"],"names":["parseCases","string","arguments","length","undefined","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","indexOfDelimiter","indexOf","head","substring","trim","tail","pluralFormatter","keyCounter","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","constructor","locale","typeHandlers","this","format","func","cache","_len","Array","_key","key","map","arg","toString","Date","toISOString","JSON","stringify","join","Object","prototype","hasOwnProperty","call","result","memoize","_this","message","values","process","flat","Infinity","blockStartIndex","blockEndIndex","type","body","typeHandler","bind","matches","intValue","parseInt","forEach","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword"],"mappings":"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","x_google_ignoreList":[4]}
@@ -2,15 +2,15 @@
2
2
 
3
3
  var functionUtils = require('@ultraq/function-utils');
4
4
 
5
- /*
5
+ /*
6
6
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
7
- *
7
+ *
8
8
  * Licensed under the Apache License, Version 2.0 (the "License");
9
9
  * you may not use this file except in compliance with the License.
10
10
  * You may obtain a copy of the License at
11
- *
11
+ *
12
12
  * http://www.apache.org/licenses/LICENSE-2.0
13
- *
13
+ *
14
14
  * Unless required by applicable law or agreed to in writing, software
15
15
  * distributed under the License is distributed on an "AS IS" BASIS,
16
16
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -30,16 +30,16 @@ var functionUtils = require('@ultraq/function-utils');
30
30
  * Most branch-based type handlers are based around "cases". For example,
31
31
  * `select` and `plural` compare compare a value to "case keys" to choose a
32
32
  * subtranslation.
33
- *
33
+ *
34
34
  * This util splits "matches" portions provided to the aforementioned handlers
35
35
  * into case strings, and extracts any prepended arguments (for example,
36
36
  * `plural` supports an `offset:n` argument used for populating the magic `#`
37
37
  * variable).
38
- *
38
+ *
39
39
  * @param {string} string
40
40
  * @return {ParseCasesResult}
41
41
  */
42
- function parseCases(string) {
42
+ function parseCases(string = '') {
43
43
  const isWhitespace = ch => /\s/.test(ch);
44
44
  const args = [];
45
45
  const cases = {};
@@ -100,7 +100,7 @@ function parseCases(string) {
100
100
  /**
101
101
  * Finds the index of the matching closing curly bracket, including through
102
102
  * strings that could have nested brackets.
103
- *
103
+ *
104
104
  * @param {string} string
105
105
  * @param {number} fromIndex
106
106
  * @return {number}
@@ -126,7 +126,7 @@ function findClosingBracket(string, fromIndex) {
126
126
  /**
127
127
  * Split a `{key, type, format}` block into those 3 parts, taking into account
128
128
  * nested message syntax that can exist in the `format` part.
129
- *
129
+ *
130
130
  * @param {string} block
131
131
  * @return {string[]}
132
132
  * An array with `key`, `type`, and `format` items in that order, if present
@@ -139,7 +139,7 @@ function splitFormattedArgument(block) {
139
139
  /**
140
140
  * Like `String.prototype.split()` but where the limit parameter causes the
141
141
  * remainder of the string to be grouped together in a final entry.
142
- *
142
+ *
143
143
  * @private
144
144
  * @param {string} string
145
145
  * @param {string} separator
@@ -147,8 +147,7 @@ function splitFormattedArgument(block) {
147
147
  * @param {string[]} accumulator
148
148
  * @return {string[]}
149
149
  */
150
- function split(string, separator, limit) {
151
- let accumulator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
150
+ function split(string, separator, limit, accumulator = []) {
152
151
  if (!string) {
153
152
  return accumulator;
154
153
  }
@@ -228,8 +227,7 @@ class MessageFormatter {
228
227
  * their values being the functions that will return a nicely formatted
229
228
  * string for the data and locale they are given.
230
229
  */
231
- constructor(locale) {
232
- let typeHandlers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
230
+ constructor(locale, typeHandlers = {}) {
233
231
  this.locale = locale;
234
232
  this.typeHandlers = typeHandlers;
235
233
  }
@@ -240,13 +238,9 @@ class MessageFormatter {
240
238
  *
241
239
  * @type {(message: string, values?: FormatValues) => string}
242
240
  */
243
- format = functionUtils.memoize((() => {
244
- var _this = this;
245
- return function (message) {
246
- let values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
247
- return _this.process(message, values).flat(Infinity).join('');
248
- };
249
- })());
241
+ format = functionUtils.memoize((message, values = {}) => {
242
+ return this.process(message, values).flat(Infinity).join('');
243
+ });
250
244
 
251
245
  /**
252
246
  * Process an ICU message syntax string using `values` for placeholder data
@@ -263,8 +257,7 @@ class MessageFormatter {
263
257
  * @param {FormatValues} [values]
264
258
  * @return {any[]}
265
259
  */
266
- process(message) {
267
- let values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
260
+ process(message, values = {}) {
268
261
  if (!message) {
269
262
  return [];
270
263
  }
@@ -300,15 +293,15 @@ class MessageFormatter {
300
293
  }
301
294
  }
302
295
 
303
- /*
296
+ /*
304
297
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
305
- *
298
+ *
306
299
  * Licensed under the Apache License, Version 2.0 (the "License");
307
300
  * you may not use this file except in compliance with the License.
308
301
  * You may obtain a copy of the License at
309
- *
302
+ *
310
303
  * http://www.apache.org/licenses/LICENSE-2.0
311
- *
304
+ *
312
305
  * Unless required by applicable law or agreed to in writing, software
313
306
  * distributed under the License is distributed on an "AS IS" BASIS,
314
307
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -358,22 +351,18 @@ function replaceNumberSign(caseBody, value) {
358
351
  /**
359
352
  * Handler for `plural` statements within ICU message syntax strings. Returns
360
353
  * a formatted string for the branch that closely matches the current value.
361
- *
354
+ *
362
355
  * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more
363
356
  * details on how the `plural` statement works.
364
357
  *
365
358
  * @param {string} value
366
359
  * @param {string} matches
367
360
  * @param {string} locale
368
- * @param {Record<string,any>} values
369
- * @param {(message: string, values?: Record<string,any>) => any[]} process
361
+ * @param {import('./MessageFormatter.js').FormatValues} values
362
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
370
363
  * @return {any | any[]}
371
364
  */
372
- function pluralTypeHandler(value) {
373
- let matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
374
- let locale = arguments.length > 2 ? arguments[2] : undefined;
375
- let values = arguments.length > 3 ? arguments[3] : undefined;
376
- let process = arguments.length > 4 ? arguments[4] : undefined;
365
+ function pluralTypeHandler(value, matches, locale, values, process) {
377
366
  const {
378
367
  args,
379
368
  cases
@@ -417,15 +406,15 @@ function pluralTypeHandler(value) {
417
406
  return value;
418
407
  }
419
408
 
420
- /*
409
+ /*
421
410
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
422
- *
411
+ *
423
412
  * Licensed under the Apache License, Version 2.0 (the "License");
424
413
  * you may not use this file except in compliance with the License.
425
414
  * You may obtain a copy of the License at
426
- *
415
+ *
427
416
  * http://www.apache.org/licenses/LICENSE-2.0
428
- *
417
+ *
429
418
  * Unless required by applicable law or agreed to in writing, software
430
419
  * distributed under the License is distributed on an "AS IS" BASIS,
431
420
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -438,21 +427,18 @@ const OTHER = 'other';
438
427
  /**
439
428
  * Handler for `select` statements within ICU message syntax strings. Returns
440
429
  * a formatted string for the branch that closely matches the current value.
441
- *
430
+ *
442
431
  * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more
443
432
  * details on how the `select` statement works.
444
- *
433
+ *
445
434
  * @param {string} value
446
435
  * @param {string} matches
447
436
  * @param {string} locale
448
- * @param {Record<string,any>} values
449
- * @param {(message: string, values?: Record<string,any>) => any[]} process
437
+ * @param {import('./MessageFormatter.js').FormatValues} values
438
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
450
439
  * @return {any | any[]}
451
440
  */
452
- function selectTypeHandler(value) {
453
- let matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
454
- let values = arguments.length > 3 ? arguments[3] : undefined;
455
- let process = arguments.length > 4 ? arguments[4] : undefined;
441
+ function selectTypeHandler(value, matches, locale, values, process) {
456
442
  const {
457
443
  cases
458
444
  } = parseCases(matches);
@@ -1 +1 @@
1
- {"version":3,"file":"icu-message-formatter.cjs","sources":["../source/utilities.js","../source/MessageFormatter.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js"],"sourcesContent":["/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n * \n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n * \n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string) {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n * \n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n * \n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n * \n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches = '', locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n * \n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches = '', locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n"],"names":["parseCases","string","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","length","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","arguments","undefined","indexOfDelimiter","indexOf","head","substring","trim","tail","MessageFormatter","constructor","locale","typeHandlers","format","memoize","_this","message","values","process","flat","Infinity","join","blockStartIndex","blockEndIndex","result","key","type","body","typeHandler","bind","pluralFormatter","keyCounter","ONE","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","pluralTypeHandler","matches","intValue","parseInt","forEach","arg","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword","selectTypeHandler"],"mappings":"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"}
1
+ {"version":3,"file":"icu-message-formatter.cjs","sources":["../source/utilities.js","../source/MessageFormatter.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js"],"sourcesContent":["/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n *\n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n *\n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string = '') {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n *\n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n *\n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n *\n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches, locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches, locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n"],"names":["parseCases","string","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","length","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","indexOfDelimiter","indexOf","head","substring","trim","tail","MessageFormatter","constructor","locale","typeHandlers","format","memoize","message","values","process","flat","Infinity","join","blockStartIndex","blockEndIndex","result","key","type","body","undefined","typeHandler","bind","pluralFormatter","keyCounter","ONE","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","pluralTypeHandler","matches","intValue","parseInt","forEach","arg","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword","selectTypeHandler"],"mappings":"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"}
@@ -52,9 +52,9 @@ export class MessageFormatter {
52
52
  * their values being the functions that will return a nicely formatted
53
53
  * string for the data and locale they are given.
54
54
  */
55
- constructor(locale: string, ...args: any[]);
55
+ constructor(locale: string, typeHandlers?: Record<string, TypeHandler>);
56
56
  locale: string;
57
- typeHandlers: any;
57
+ typeHandlers: Record<string, TypeHandler>;
58
58
  /**
59
59
  * Formats an ICU message syntax string using `values` for placeholder data
60
60
  * and any currently-registered type handlers.
@@ -77,7 +77,7 @@ export class MessageFormatter {
77
77
  * @param {FormatValues} [values]
78
78
  * @return {any[]}
79
79
  */
80
- process(message: string, ...args: any[]): any[];
80
+ process(message: string, values?: FormatValues): any[];
81
81
  }
82
82
  /**
83
83
  * Finds the index of the matching closing curly bracket, including through
@@ -110,7 +110,7 @@ export function findClosingBracket(string: string, fromIndex: number): number;
110
110
  * @param {string} string
111
111
  * @return {ParseCasesResult}
112
112
  */
113
- export function parseCases(string: string): ParseCasesResult;
113
+ export function parseCases(string?: string): ParseCasesResult;
114
114
  /**
115
115
  * Handler for `plural` statements within ICU message syntax strings. Returns
116
116
  * a formatted string for the branch that closely matches the current value.
@@ -121,11 +121,11 @@ export function parseCases(string: string): ParseCasesResult;
121
121
  * @param {string} value
122
122
  * @param {string} matches
123
123
  * @param {string} locale
124
- * @param {Record<string,any>} values
125
- * @param {(message: string, values?: Record<string,any>) => any[]} process
124
+ * @param {import('./MessageFormatter.js').FormatValues} values
125
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
126
126
  * @return {any | any[]}
127
127
  */
128
- export function pluralTypeHandler(value: string, ...args: any[]): any | any[];
128
+ export function pluralTypeHandler(value: string, matches: string, locale: string, values: any, process: any): any | any[];
129
129
  /**
130
130
  * Handler for `select` statements within ICU message syntax strings. Returns
131
131
  * a formatted string for the branch that closely matches the current value.
@@ -136,11 +136,11 @@ export function pluralTypeHandler(value: string, ...args: any[]): any | any[];
136
136
  * @param {string} value
137
137
  * @param {string} matches
138
138
  * @param {string} locale
139
- * @param {Record<string,any>} values
140
- * @param {(message: string, values?: Record<string,any>) => any[]} process
139
+ * @param {import('./MessageFormatter.js').FormatValues} values
140
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
141
141
  * @return {any | any[]}
142
142
  */
143
- export function selectTypeHandler(value: string, ...args: any[]): any | any[];
143
+ export function selectTypeHandler(value: string, matches: string, locale: string, values: any, process: any): any | any[];
144
144
  /**
145
145
  * Split a `{key, type, format}` block into those 3 parts, taking into account
146
146
  * nested message syntax that can exist in the `format` part.
@@ -52,9 +52,9 @@ export class MessageFormatter {
52
52
  * their values being the functions that will return a nicely formatted
53
53
  * string for the data and locale they are given.
54
54
  */
55
- constructor(locale: string, ...args: any[]);
55
+ constructor(locale: string, typeHandlers?: Record<string, TypeHandler>);
56
56
  locale: string;
57
- typeHandlers: any;
57
+ typeHandlers: Record<string, TypeHandler>;
58
58
  /**
59
59
  * Formats an ICU message syntax string using `values` for placeholder data
60
60
  * and any currently-registered type handlers.
@@ -77,7 +77,7 @@ export class MessageFormatter {
77
77
  * @param {FormatValues} [values]
78
78
  * @return {any[]}
79
79
  */
80
- process(message: string, ...args: any[]): any[];
80
+ process(message: string, values?: FormatValues): any[];
81
81
  }
82
82
  /**
83
83
  * Finds the index of the matching closing curly bracket, including through
@@ -110,7 +110,7 @@ export function findClosingBracket(string: string, fromIndex: number): number;
110
110
  * @param {string} string
111
111
  * @return {ParseCasesResult}
112
112
  */
113
- export function parseCases(string: string): ParseCasesResult;
113
+ export function parseCases(string?: string): ParseCasesResult;
114
114
  /**
115
115
  * Handler for `plural` statements within ICU message syntax strings. Returns
116
116
  * a formatted string for the branch that closely matches the current value.
@@ -121,11 +121,11 @@ export function parseCases(string: string): ParseCasesResult;
121
121
  * @param {string} value
122
122
  * @param {string} matches
123
123
  * @param {string} locale
124
- * @param {Record<string,any>} values
125
- * @param {(message: string, values?: Record<string,any>) => any[]} process
124
+ * @param {import('./MessageFormatter.js').FormatValues} values
125
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
126
126
  * @return {any | any[]}
127
127
  */
128
- export function pluralTypeHandler(value: string, ...args: any[]): any | any[];
128
+ export function pluralTypeHandler(value: string, matches: string, locale: string, values: any, process: any): any | any[];
129
129
  /**
130
130
  * Handler for `select` statements within ICU message syntax strings. Returns
131
131
  * a formatted string for the branch that closely matches the current value.
@@ -136,11 +136,11 @@ export function pluralTypeHandler(value: string, ...args: any[]): any | any[];
136
136
  * @param {string} value
137
137
  * @param {string} matches
138
138
  * @param {string} locale
139
- * @param {Record<string,any>} values
140
- * @param {(message: string, values?: Record<string,any>) => any[]} process
139
+ * @param {import('./MessageFormatter.js').FormatValues} values
140
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
141
141
  * @return {any | any[]}
142
142
  */
143
- export function selectTypeHandler(value: string, ...args: any[]): any | any[];
143
+ export function selectTypeHandler(value: string, matches: string, locale: string, values: any, process: any): any | any[];
144
144
  /**
145
145
  * Split a `{key, type, format}` block into those 3 parts, taking into account
146
146
  * nested message syntax that can exist in the `format` part.
@@ -1,14 +1,14 @@
1
1
  import { memoize } from '@ultraq/function-utils';
2
2
 
3
- /*
3
+ /*
4
4
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
5
- *
5
+ *
6
6
  * Licensed under the Apache License, Version 2.0 (the "License");
7
7
  * you may not use this file except in compliance with the License.
8
8
  * You may obtain a copy of the License at
9
- *
9
+ *
10
10
  * http://www.apache.org/licenses/LICENSE-2.0
11
- *
11
+ *
12
12
  * Unless required by applicable law or agreed to in writing, software
13
13
  * distributed under the License is distributed on an "AS IS" BASIS,
14
14
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -28,16 +28,16 @@ import { memoize } from '@ultraq/function-utils';
28
28
  * Most branch-based type handlers are based around "cases". For example,
29
29
  * `select` and `plural` compare compare a value to "case keys" to choose a
30
30
  * subtranslation.
31
- *
31
+ *
32
32
  * This util splits "matches" portions provided to the aforementioned handlers
33
33
  * into case strings, and extracts any prepended arguments (for example,
34
34
  * `plural` supports an `offset:n` argument used for populating the magic `#`
35
35
  * variable).
36
- *
36
+ *
37
37
  * @param {string} string
38
38
  * @return {ParseCasesResult}
39
39
  */
40
- function parseCases(string) {
40
+ function parseCases(string = '') {
41
41
  const isWhitespace = ch => /\s/.test(ch);
42
42
  const args = [];
43
43
  const cases = {};
@@ -98,7 +98,7 @@ function parseCases(string) {
98
98
  /**
99
99
  * Finds the index of the matching closing curly bracket, including through
100
100
  * strings that could have nested brackets.
101
- *
101
+ *
102
102
  * @param {string} string
103
103
  * @param {number} fromIndex
104
104
  * @return {number}
@@ -124,7 +124,7 @@ function findClosingBracket(string, fromIndex) {
124
124
  /**
125
125
  * Split a `{key, type, format}` block into those 3 parts, taking into account
126
126
  * nested message syntax that can exist in the `format` part.
127
- *
127
+ *
128
128
  * @param {string} block
129
129
  * @return {string[]}
130
130
  * An array with `key`, `type`, and `format` items in that order, if present
@@ -137,7 +137,7 @@ function splitFormattedArgument(block) {
137
137
  /**
138
138
  * Like `String.prototype.split()` but where the limit parameter causes the
139
139
  * remainder of the string to be grouped together in a final entry.
140
- *
140
+ *
141
141
  * @private
142
142
  * @param {string} string
143
143
  * @param {string} separator
@@ -145,8 +145,7 @@ function splitFormattedArgument(block) {
145
145
  * @param {string[]} accumulator
146
146
  * @return {string[]}
147
147
  */
148
- function split(string, separator, limit) {
149
- let accumulator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
148
+ function split(string, separator, limit, accumulator = []) {
150
149
  if (!string) {
151
150
  return accumulator;
152
151
  }
@@ -226,8 +225,7 @@ class MessageFormatter {
226
225
  * their values being the functions that will return a nicely formatted
227
226
  * string for the data and locale they are given.
228
227
  */
229
- constructor(locale) {
230
- let typeHandlers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
228
+ constructor(locale, typeHandlers = {}) {
231
229
  this.locale = locale;
232
230
  this.typeHandlers = typeHandlers;
233
231
  }
@@ -238,13 +236,9 @@ class MessageFormatter {
238
236
  *
239
237
  * @type {(message: string, values?: FormatValues) => string}
240
238
  */
241
- format = memoize((() => {
242
- var _this = this;
243
- return function (message) {
244
- let values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
245
- return _this.process(message, values).flat(Infinity).join('');
246
- };
247
- })());
239
+ format = memoize((message, values = {}) => {
240
+ return this.process(message, values).flat(Infinity).join('');
241
+ });
248
242
 
249
243
  /**
250
244
  * Process an ICU message syntax string using `values` for placeholder data
@@ -261,8 +255,7 @@ class MessageFormatter {
261
255
  * @param {FormatValues} [values]
262
256
  * @return {any[]}
263
257
  */
264
- process(message) {
265
- let values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
258
+ process(message, values = {}) {
266
259
  if (!message) {
267
260
  return [];
268
261
  }
@@ -298,15 +291,15 @@ class MessageFormatter {
298
291
  }
299
292
  }
300
293
 
301
- /*
294
+ /*
302
295
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
303
- *
296
+ *
304
297
  * Licensed under the Apache License, Version 2.0 (the "License");
305
298
  * you may not use this file except in compliance with the License.
306
299
  * You may obtain a copy of the License at
307
- *
300
+ *
308
301
  * http://www.apache.org/licenses/LICENSE-2.0
309
- *
302
+ *
310
303
  * Unless required by applicable law or agreed to in writing, software
311
304
  * distributed under the License is distributed on an "AS IS" BASIS,
312
305
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -356,22 +349,18 @@ function replaceNumberSign(caseBody, value) {
356
349
  /**
357
350
  * Handler for `plural` statements within ICU message syntax strings. Returns
358
351
  * a formatted string for the branch that closely matches the current value.
359
- *
352
+ *
360
353
  * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more
361
354
  * details on how the `plural` statement works.
362
355
  *
363
356
  * @param {string} value
364
357
  * @param {string} matches
365
358
  * @param {string} locale
366
- * @param {Record<string,any>} values
367
- * @param {(message: string, values?: Record<string,any>) => any[]} process
359
+ * @param {import('./MessageFormatter.js').FormatValues} values
360
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
368
361
  * @return {any | any[]}
369
362
  */
370
- function pluralTypeHandler(value) {
371
- let matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
372
- let locale = arguments.length > 2 ? arguments[2] : undefined;
373
- let values = arguments.length > 3 ? arguments[3] : undefined;
374
- let process = arguments.length > 4 ? arguments[4] : undefined;
363
+ function pluralTypeHandler(value, matches, locale, values, process) {
375
364
  const {
376
365
  args,
377
366
  cases
@@ -415,15 +404,15 @@ function pluralTypeHandler(value) {
415
404
  return value;
416
405
  }
417
406
 
418
- /*
407
+ /*
419
408
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
420
- *
409
+ *
421
410
  * Licensed under the Apache License, Version 2.0 (the "License");
422
411
  * you may not use this file except in compliance with the License.
423
412
  * You may obtain a copy of the License at
424
- *
413
+ *
425
414
  * http://www.apache.org/licenses/LICENSE-2.0
426
- *
415
+ *
427
416
  * Unless required by applicable law or agreed to in writing, software
428
417
  * distributed under the License is distributed on an "AS IS" BASIS,
429
418
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -436,21 +425,18 @@ const OTHER = 'other';
436
425
  /**
437
426
  * Handler for `select` statements within ICU message syntax strings. Returns
438
427
  * a formatted string for the branch that closely matches the current value.
439
- *
428
+ *
440
429
  * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more
441
430
  * details on how the `select` statement works.
442
- *
431
+ *
443
432
  * @param {string} value
444
433
  * @param {string} matches
445
434
  * @param {string} locale
446
- * @param {Record<string,any>} values
447
- * @param {(message: string, values?: Record<string,any>) => any[]} process
435
+ * @param {import('./MessageFormatter.js').FormatValues} values
436
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
448
437
  * @return {any | any[]}
449
438
  */
450
- function selectTypeHandler(value) {
451
- let matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
452
- let values = arguments.length > 3 ? arguments[3] : undefined;
453
- let process = arguments.length > 4 ? arguments[4] : undefined;
439
+ function selectTypeHandler(value, matches, locale, values, process) {
454
440
  const {
455
441
  cases
456
442
  } = parseCases(matches);
@@ -1 +1 @@
1
- {"version":3,"file":"icu-message-formatter.js","sources":["../source/utilities.js","../source/MessageFormatter.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js"],"sourcesContent":["/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n * \n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n * \n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string) {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n * \n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n * \n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n * \n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches = '', locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n * \n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {Record<string,any>} values\n * @param {(message: string, values?: Record<string,any>) => any[]} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches = '', locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n"],"names":["parseCases","string","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","length","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","arguments","undefined","indexOfDelimiter","indexOf","head","substring","trim","tail","MessageFormatter","constructor","locale","typeHandlers","format","memoize","_this","message","values","process","flat","Infinity","join","blockStartIndex","blockEndIndex","result","key","type","body","typeHandler","bind","pluralFormatter","keyCounter","ONE","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","pluralTypeHandler","matches","intValue","parseInt","forEach","arg","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword","selectTypeHandler"],"mappings":"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"}
1
+ {"version":3,"file":"icu-message-formatter.js","sources":["../source/utilities.js","../source/MessageFormatter.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js"],"sourcesContent":["/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @typedef ParseCasesResult\n * @property {string[]} args\n * A list of prepended arguments.\n * @property {Record<string,string>} cases\n * A map of all cases.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\". For example,\n * `select` and `plural` compare compare a value to \"case keys\" to choose a\n * subtranslation.\n *\n * This util splits \"matches\" portions provided to the aforementioned handlers\n * into case strings, and extracts any prepended arguments (for example,\n * `plural` supports an `offset:n` argument used for populating the magic `#`\n * variable).\n *\n * @param {string} string\n * @return {ParseCasesResult}\n */\nexport function parseCases(string = '') {\n\tconst isWhitespace = ch => /\\s/.test(ch);\n\n\tconst args = [];\n\tconst cases = {};\n\n\tlet currTermStart = 0;\n\tlet latestTerm = null;\n\tlet inTerm = false;\n\n\tlet i = 0;\n\twhile (i < string.length) {\n\t\t// Term ended\n\t\tif (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n\t\t\tinTerm = false;\n\t\t\tlatestTerm = string.slice(currTermStart, i);\n\n\t\t\t// We want to process the opening char again so the case will be properly registered.\n\t\t\tif (string[i] === '{') {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\t// New term\n\t\telse if (!inTerm && !isWhitespace(string[i])) {\n\t\t\tconst caseBody = string[i] === '{';\n\n\t\t\t// If there's a previous term, we can either handle a whole\n\t\t\t// case, or add that as an argument.\n\t\t\tif (latestTerm && caseBody) {\n\t\t\t\tconst branchEndIndex = findClosingBracket(string, i);\n\n\t\t\t\tif (branchEndIndex === -1) {\n\t\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${string}\"`);\n\t\t\t\t}\n\n\t\t\t\tcases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n\t\t\t\ti = branchEndIndex; // Will be moved up where needed at end of loop.\n\t\t\t\tlatestTerm = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (latestTerm) {\n\t\t\t\t\targs.push(latestTerm);\n\t\t\t\t\tlatestTerm = null;\n\t\t\t\t}\n\n\t\t\t\tinTerm = true;\n\t\t\t\tcurrTermStart = i;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tif (inTerm) {\n\t\tlatestTerm = string.slice(currTermStart);\n\t}\n\n\tif (latestTerm) {\n\t\targs.push(latestTerm);\n\t}\n\n\treturn {\n\t\targs,\n\t\tcases\n\t};\n}\n\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n *\n * @param {string} string\n * @param {number} fromIndex\n * @return {number}\n * The index of the matching closing bracket, or -1 if no closing bracket\n * could be found.\n */\nexport function findClosingBracket(string, fromIndex) {\n\tlet depth = 0;\n\tfor (let i = fromIndex + 1; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === '}') {\n\t\t\tif (depth === 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tdepth--;\n\t\t}\n\t\telse if (char === '{') {\n\t\t\tdepth++;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n *\n * @param {string} block\n * @return {string[]}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\nexport function splitFormattedArgument(block) {\n\treturn split(block.slice(1, -1), ',', 3);\n}\n\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n *\n * @private\n * @param {string} string\n * @param {string} separator\n * @param {number} limit\n * @param {string[]} accumulator\n * @return {string[]}\n */\nfunction split(string, separator, limit, accumulator = []) {\n\tif (!string) {\n\t\treturn accumulator;\n\t}\n\tif (limit === 1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet indexOfDelimiter = string.indexOf(separator);\n\tif (indexOfDelimiter === -1) {\n\t\taccumulator.push(string);\n\t\treturn accumulator;\n\t}\n\tlet head = string.substring(0, indexOfDelimiter).trim();\n\tlet tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n\taccumulator.push(head);\n\treturn split(tail, separator, limit - 1, accumulator);\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {findClosingBracket, splitFormattedArgument} from './utilities.js';\n\nimport {memoize} from '@ultraq/function-utils';\n\n/**\n * @typedef {Record<string,any>} FormatValues\n */\n\n/**\n * @callback ProcessFunction\n * @param {string} message\n * @param {FormatValues} [values={}]\n * @return {any[]}\n */\n\n/**\n * @callback TypeHandler\n * @param {any} value\n * The object which matched the key of the block being processed.\n * @param {string} matches\n * Any format options associated with the block being processed.\n * @param {string} locale\n * The locale to use for formatting.\n * @param {FormatValues} values\n * The object of placeholder data given to the original `format`/`process`\n * call.\n * @param {ProcessFunction} process\n * The `process` function itself so that sub-messages can be processed by type\n * handlers.\n * @return {any | any[]}\n */\n\n/**\n * The main class for formatting messages.\n *\n * @author Emanuel Rabina\n */\nexport default class MessageFormatter {\n\n\t/**\n\t * Creates a new formatter that can work using any of the custom type handlers\n\t * you register.\n\t *\n\t * @param {string} locale\n\t * @param {Record<string,TypeHandler>} [typeHandlers]\n\t * Optional object where the keys are the names of the types to register,\n\t * their values being the functions that will return a nicely formatted\n\t * string for the data and locale they are given.\n\t */\n\tconstructor(locale, typeHandlers = {}) {\n\n\t\tthis.locale = locale;\n\t\tthis.typeHandlers = typeHandlers;\n\t}\n\n\t/**\n\t * Formats an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers.\n\t *\n\t * @type {(message: string, values?: FormatValues) => string}\n\t */\n\tformat = memoize((message, values = {}) => {\n\n\t\treturn this.process(message, values).flat(Infinity).join('');\n\t});\n\n\t/**\n\t * Process an ICU message syntax string using `values` for placeholder data\n\t * and any currently-registered type handlers. The result of this method is\n\t * an array of the component parts after they have been processed in turn by\n\t * their own type handlers. This raw output is useful for other renderers,\n\t * eg: React where components can be used instead of being forced to return\n\t * raw strings.\n\t *\n\t * This method is used by {@link MessageFormatter#format} where it acts as a\n\t * string renderer.\n\t *\n\t * @param {string} message\n\t * @param {FormatValues} [values]\n\t * @return {any[]}\n\t */\n\tprocess(message, values = {}) {\n\n\t\tif (!message) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet blockStartIndex = message.indexOf('{');\n\t\tif (blockStartIndex !== -1) {\n\t\t\tlet blockEndIndex = findClosingBracket(message, blockStartIndex);\n\t\t\tif (blockEndIndex !== -1) {\n\t\t\t\tlet block = message.substring(blockStartIndex, blockEndIndex + 1);\n\t\t\t\tif (block) {\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tlet head = message.substring(0, blockStartIndex);\n\t\t\t\t\tif (head) {\n\t\t\t\t\t\tresult.push(head);\n\t\t\t\t\t}\n\t\t\t\t\tlet [key, type, format] = splitFormattedArgument(block);\n\t\t\t\t\tlet body = values[key];\n\t\t\t\t\tif (body === null || body === undefined) {\n\t\t\t\t\t\tbody = '';\n\t\t\t\t\t}\n\t\t\t\t\tlet typeHandler = type && this.typeHandlers[type];\n\t\t\t\t\tresult.push(typeHandler ?\n\t\t\t\t\t\ttypeHandler(body, format, this.locale, values, this.process.bind(this)) :\n\t\t\t\t\t\tbody);\n\t\t\t\t\tlet tail = message.substring(blockEndIndex + 1);\n\t\t\t\t\tif (tail) {\n\t\t\t\t\t\tresult.push(this.process(tail, values));\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unbalanced curly braces in string: \"${message}\"`);\n\t\t\t}\n\t\t}\n\t\treturn [message];\n\t}\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nlet pluralFormatter;\n\nlet keyCounter = 0;\n\n// All the special keywords that can be used in `plural` blocks for the various branches\nconst ONE = 'one';\nconst OTHER = 'other';\n\n/**\n * @private\n * @param {string} caseBody\n * @param {number} value\n * @return {{caseBody: string, numberValues: object}}\n */\nfunction replaceNumberSign(caseBody, value) {\n\tlet i = 0;\n\tlet output = '';\n\tlet numBraces = 0;\n\tconst numberValues = {};\n\n\twhile (i < caseBody.length) {\n\t\tif (caseBody[i] === '#' && !numBraces) {\n\t\t\tlet keyParam = `__hashToken${keyCounter++}`;\n\t\t\toutput += `{${keyParam}, number}`;\n\t\t\tnumberValues[keyParam] = value;\n\t\t}\n\t\telse {\n\t\t\toutput += caseBody[i];\n\t\t}\n\n\t\tif (caseBody[i] === '{') {\n\t\t\tnumBraces++;\n\t\t}\n\t\telse if (caseBody[i] === '}') {\n\t\t\tnumBraces--;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn {\n\t\tcaseBody: output,\n\t\tnumberValues\n\t};\n}\n\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function pluralTypeHandler(value, matches, locale, values, process) {\n\tconst {args, cases} = parseCases(matches);\n\n\tlet intValue = parseInt(value);\n\n\targs.forEach((arg) => {\n\t\tif (arg.startsWith('offset:')) {\n\t\t\tintValue -= parseInt(arg.slice('offset:'.length));\n\t\t}\n\t});\n\n\tconst keywordPossibilities = [];\n\n\tif ('PluralRules' in Intl) {\n\t\t// Effectively memoize because instantiation of `Int.*` objects is expensive.\n\t\tif (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n\t\t\tpluralFormatter = new Intl.PluralRules(locale);\n\t\t}\n\n\t\tconst pluralKeyword = pluralFormatter.select(intValue);\n\n\t\t// Other is always added last with least priority, so we don't want to add it here.\n\t\tif (pluralKeyword !== OTHER) {\n\t\t\tkeywordPossibilities.push(pluralKeyword);\n\t\t}\n\t}\n\tif (intValue === 1) {\n\t\tkeywordPossibilities.push(ONE);\n\t}\n\tkeywordPossibilities.push(`=${intValue}`, OTHER);\n\n\tfor (let i = 0; i < keywordPossibilities.length; i++) {\n\t\tconst keyword = keywordPossibilities[i];\n\t\tif (keyword in cases) {\n\t\t\tconst {caseBody, numberValues} = replaceNumberSign(cases[keyword], intValue);\n\t\t\treturn process(caseBody, {\n\t\t\t\t...values,\n\t\t\t\t...numberValues\n\t\t\t});\n\t\t}\n\t}\n\n\treturn value;\n}\n","/*\n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {parseCases} from './utilities.js';\n\nconst OTHER = 'other';\n\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n *\n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n *\n * @param {string} value\n * @param {string} matches\n * @param {string} locale\n * @param {import('./MessageFormatter.js').FormatValues} values\n * @param {import('./MessageFormatter.js').ProcessFunction} process\n * @return {any | any[]}\n */\nexport default function selectTypeHandler(value, matches, locale, values, process) {\n\tconst {cases} = parseCases(matches);\n\n\tif (value in cases) {\n\t\treturn process(cases[value], values);\n\t}\n\telse if (OTHER in cases) {\n\t\treturn process(cases[OTHER], values);\n\t}\n\n\treturn value;\n}\n"],"names":["parseCases","string","isWhitespace","ch","test","args","cases","currTermStart","latestTerm","inTerm","i","length","slice","caseBody","branchEndIndex","findClosingBracket","Error","push","fromIndex","depth","char","charAt","splitFormattedArgument","block","split","separator","limit","accumulator","indexOfDelimiter","indexOf","head","substring","trim","tail","MessageFormatter","constructor","locale","typeHandlers","format","memoize","message","values","process","flat","Infinity","join","blockStartIndex","blockEndIndex","result","key","type","body","undefined","typeHandler","bind","pluralFormatter","keyCounter","ONE","OTHER","replaceNumberSign","value","output","numBraces","numberValues","keyParam","pluralTypeHandler","matches","intValue","parseInt","forEach","arg","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword","selectTypeHandler"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,UAAUA,CAACC,MAAM,GAAG,EAAE,EAAE;EACvC,MAAMC,YAAY,GAAGC,EAAE,IAAI,IAAI,CAACC,IAAI,CAACD,EAAE,CAAC,CAAA;EAExC,MAAME,IAAI,GAAG,EAAE,CAAA;EACf,MAAMC,KAAK,GAAG,EAAE,CAAA;EAEhB,IAAIC,aAAa,GAAG,CAAC,CAAA;EACrB,IAAIC,UAAU,GAAG,IAAI,CAAA;EACrB,IAAIC,MAAM,GAAG,KAAK,CAAA;EAElB,IAAIC,CAAC,GAAG,CAAC,CAAA;AACT,EAAA,OAAOA,CAAC,GAAGT,MAAM,CAACU,MAAM,EAAE;AACzB;AACA,IAAA,IAAIF,MAAM,KAAKP,YAAY,CAACD,MAAM,CAACS,CAAC,CAAC,CAAC,IAAIT,MAAM,CAACS,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE;AAC7DD,MAAAA,MAAM,GAAG,KAAK,CAAA;MACdD,UAAU,GAAGP,MAAM,CAACW,KAAK,CAACL,aAAa,EAAEG,CAAC,CAAC,CAAA;;AAE3C;AACA,MAAA,IAAIT,MAAM,CAACS,CAAC,CAAC,KAAK,GAAG,EAAE;AACtBA,QAAAA,CAAC,EAAE,CAAA;AACJ,OAAA;AACD,KAAA;;AAEA;AAAA,SACK,IAAI,CAACD,MAAM,IAAI,CAACP,YAAY,CAACD,MAAM,CAACS,CAAC,CAAC,CAAC,EAAE;AAC7C,MAAA,MAAMG,QAAQ,GAAGZ,MAAM,CAACS,CAAC,CAAC,KAAK,GAAG,CAAA;;AAElC;AACA;MACA,IAAIF,UAAU,IAAIK,QAAQ,EAAE;AAC3B,QAAA,MAAMC,cAAc,GAAGC,kBAAkB,CAACd,MAAM,EAAES,CAAC,CAAC,CAAA;AAEpD,QAAA,IAAII,cAAc,KAAK,CAAC,CAAC,EAAE;AAC1B,UAAA,MAAM,IAAIE,KAAK,CAAE,CAAsCf,oCAAAA,EAAAA,MAAO,GAAE,CAAC,CAAA;AAClE,SAAA;AAEAK,QAAAA,KAAK,CAACE,UAAU,CAAC,GAAGP,MAAM,CAACW,KAAK,CAACF,CAAC,GAAG,CAAC,EAAEI,cAAc,CAAC,CAAC;;QAExDJ,CAAC,GAAGI,cAAc,CAAC;AACnBN,QAAAA,UAAU,GAAG,IAAI,CAAA;AAClB,OAAC,MACI;AACJ,QAAA,IAAIA,UAAU,EAAE;AACfH,UAAAA,IAAI,CAACY,IAAI,CAACT,UAAU,CAAC,CAAA;AACrBA,UAAAA,UAAU,GAAG,IAAI,CAAA;AAClB,SAAA;AAEAC,QAAAA,MAAM,GAAG,IAAI,CAAA;AACbF,QAAAA,aAAa,GAAGG,CAAC,CAAA;AAClB,OAAA;AACD,KAAA;AACAA,IAAAA,CAAC,EAAE,CAAA;AACJ,GAAA;AAEA,EAAA,IAAID,MAAM,EAAE;AACXD,IAAAA,UAAU,GAAGP,MAAM,CAACW,KAAK,CAACL,aAAa,CAAC,CAAA;AACzC,GAAA;AAEA,EAAA,IAAIC,UAAU,EAAE;AACfH,IAAAA,IAAI,CAACY,IAAI,CAACT,UAAU,CAAC,CAAA;AACtB,GAAA;EAEA,OAAO;IACNH,IAAI;AACJC,IAAAA,KAAAA;GACA,CAAA;AACF,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASS,kBAAkBA,CAACd,MAAM,EAAEiB,SAAS,EAAE;EACrD,IAAIC,KAAK,GAAG,CAAC,CAAA;AACb,EAAA,KAAK,IAAIT,CAAC,GAAGQ,SAAS,GAAG,CAAC,EAAER,CAAC,GAAGT,MAAM,CAACU,MAAM,EAAED,CAAC,EAAE,EAAE;AACnD,IAAA,IAAIU,IAAI,GAAGnB,MAAM,CAACoB,MAAM,CAACX,CAAC,CAAC,CAAA;IAC3B,IAAIU,IAAI,KAAK,GAAG,EAAE;MACjB,IAAID,KAAK,KAAK,CAAC,EAAE;AAChB,QAAA,OAAOT,CAAC,CAAA;AACT,OAAA;AACAS,MAAAA,KAAK,EAAE,CAAA;AACR,KAAC,MACI,IAAIC,IAAI,KAAK,GAAG,EAAE;AACtBD,MAAAA,KAAK,EAAE,CAAA;AACR,KAAA;AACD,GAAA;AACA,EAAA,OAAO,CAAC,CAAC,CAAA;AACV,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,sBAAsBA,CAACC,KAAK,EAAE;AAC7C,EAAA,OAAOC,KAAK,CAACD,KAAK,CAACX,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;AACzC,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASY,KAAKA,CAACvB,MAAM,EAAEwB,SAAS,EAAEC,KAAK,EAAEC,WAAW,GAAG,EAAE,EAAE;EAC1D,IAAI,CAAC1B,MAAM,EAAE;AACZ,IAAA,OAAO0B,WAAW,CAAA;AACnB,GAAA;EACA,IAAID,KAAK,KAAK,CAAC,EAAE;AAChBC,IAAAA,WAAW,CAACV,IAAI,CAAChB,MAAM,CAAC,CAAA;AACxB,IAAA,OAAO0B,WAAW,CAAA;AACnB,GAAA;AACA,EAAA,IAAIC,gBAAgB,GAAG3B,MAAM,CAAC4B,OAAO,CAACJ,SAAS,CAAC,CAAA;AAChD,EAAA,IAAIG,gBAAgB,KAAK,CAAC,CAAC,EAAE;AAC5BD,IAAAA,WAAW,CAACV,IAAI,CAAChB,MAAM,CAAC,CAAA;AACxB,IAAA,OAAO0B,WAAW,CAAA;AACnB,GAAA;AACA,EAAA,IAAIG,IAAI,GAAG7B,MAAM,CAAC8B,SAAS,CAAC,CAAC,EAAEH,gBAAgB,CAAC,CAACI,IAAI,EAAE,CAAA;AACvD,EAAA,IAAIC,IAAI,GAAGhC,MAAM,CAAC8B,SAAS,CAACH,gBAAgB,GAAGH,SAAS,CAACd,MAAM,GAAG,CAAC,CAAC,CAACqB,IAAI,EAAE,CAAA;AAC3EL,EAAAA,WAAW,CAACV,IAAI,CAACa,IAAI,CAAC,CAAA;EACtB,OAAON,KAAK,CAACS,IAAI,EAAER,SAAS,EAAEC,KAAK,GAAG,CAAC,EAAEC,WAAW,CAAC,CAAA;AACtD;;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAMA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACe,MAAMO,gBAAgB,CAAC;AAErC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACCC,EAAAA,WAAWA,CAACC,MAAM,EAAEC,YAAY,GAAG,EAAE,EAAE;IAEtC,IAAI,CAACD,MAAM,GAAGA,MAAM,CAAA;IACpB,IAAI,CAACC,YAAY,GAAGA,YAAY,CAAA;AACjC,GAAA;;AAEA;AACD;AACA;AACA;AACA;AACA;EACCC,MAAM,GAAGC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,GAAG,EAAE,KAAK;AAE1C,IAAA,OAAO,IAAI,CAACC,OAAO,CAACF,OAAO,EAAEC,MAAM,CAAC,CAACE,IAAI,CAACC,QAAQ,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC7D,GAAC,CAAC,CAAA;;AAEF;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACCH,EAAAA,OAAOA,CAACF,OAAO,EAAEC,MAAM,GAAG,EAAE,EAAE;IAE7B,IAAI,CAACD,OAAO,EAAE;AACb,MAAA,OAAO,EAAE,CAAA;AACV,KAAA;AAEA,IAAA,IAAIM,eAAe,GAAGN,OAAO,CAACX,OAAO,CAAC,GAAG,CAAC,CAAA;AAC1C,IAAA,IAAIiB,eAAe,KAAK,CAAC,CAAC,EAAE;AAC3B,MAAA,IAAIC,aAAa,GAAGhC,kBAAkB,CAACyB,OAAO,EAAEM,eAAe,CAAC,CAAA;AAChE,MAAA,IAAIC,aAAa,KAAK,CAAC,CAAC,EAAE;QACzB,IAAIxB,KAAK,GAAGiB,OAAO,CAACT,SAAS,CAACe,eAAe,EAAEC,aAAa,GAAG,CAAC,CAAC,CAAA;AACjE,QAAA,IAAIxB,KAAK,EAAE;UACV,IAAIyB,MAAM,GAAG,EAAE,CAAA;UACf,IAAIlB,IAAI,GAAGU,OAAO,CAACT,SAAS,CAAC,CAAC,EAAEe,eAAe,CAAC,CAAA;AAChD,UAAA,IAAIhB,IAAI,EAAE;AACTkB,YAAAA,MAAM,CAAC/B,IAAI,CAACa,IAAI,CAAC,CAAA;AAClB,WAAA;UACA,IAAI,CAACmB,GAAG,EAAEC,IAAI,EAAEZ,MAAM,CAAC,GAAGhB,sBAAsB,CAACC,KAAK,CAAC,CAAA;AACvD,UAAA,IAAI4B,IAAI,GAAGV,MAAM,CAACQ,GAAG,CAAC,CAAA;AACtB,UAAA,IAAIE,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAKC,SAAS,EAAE;AACxCD,YAAAA,IAAI,GAAG,EAAE,CAAA;AACV,WAAA;UACA,IAAIE,WAAW,GAAGH,IAAI,IAAI,IAAI,CAACb,YAAY,CAACa,IAAI,CAAC,CAAA;AACjDF,UAAAA,MAAM,CAAC/B,IAAI,CAACoC,WAAW,GACtBA,WAAW,CAACF,IAAI,EAAEb,MAAM,EAAE,IAAI,CAACF,MAAM,EAAEK,MAAM,EAAE,IAAI,CAACC,OAAO,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC,GACvEH,IAAI,CAAC,CAAA;UACN,IAAIlB,IAAI,GAAGO,OAAO,CAACT,SAAS,CAACgB,aAAa,GAAG,CAAC,CAAC,CAAA;AAC/C,UAAA,IAAId,IAAI,EAAE;YACTe,MAAM,CAAC/B,IAAI,CAAC,IAAI,CAACyB,OAAO,CAACT,IAAI,EAAEQ,MAAM,CAAC,CAAC,CAAA;AACxC,WAAA;AACA,UAAA,OAAOO,MAAM,CAAA;AACd,SAAA;AACD,OAAC,MACI;AACJ,QAAA,MAAM,IAAIhC,KAAK,CAAE,CAAsCwB,oCAAAA,EAAAA,OAAQ,GAAE,CAAC,CAAA;AACnE,OAAA;AACD,KAAA;IACA,OAAO,CAACA,OAAO,CAAC,CAAA;AACjB,GAAA;AACD;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,IAAIe,eAAe,CAAA;AAEnB,IAAIC,UAAU,GAAG,CAAC,CAAA;;AAElB;AACA,MAAMC,GAAG,GAAK,KAAK,CAAA;AACnB,MAAMC,OAAK,GAAG,OAAO,CAAA;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,iBAAiBA,CAAC9C,QAAQ,EAAE+C,KAAK,EAAE;EAC3C,IAAIlD,CAAC,GAAG,CAAC,CAAA;EACT,IAAImD,MAAM,GAAG,EAAE,CAAA;EACf,IAAIC,SAAS,GAAG,CAAC,CAAA;EACjB,MAAMC,YAAY,GAAG,EAAE,CAAA;AAEvB,EAAA,OAAOrD,CAAC,GAAGG,QAAQ,CAACF,MAAM,EAAE;IAC3B,IAAIE,QAAQ,CAACH,CAAC,CAAC,KAAK,GAAG,IAAI,CAACoD,SAAS,EAAE;AACtC,MAAA,IAAIE,QAAQ,GAAI,CAAaR,WAAAA,EAAAA,UAAU,EAAG,CAAC,CAAA,CAAA;MAC3CK,MAAM,IAAK,CAAGG,CAAAA,EAAAA,QAAS,CAAU,SAAA,CAAA,CAAA;AACjCD,MAAAA,YAAY,CAACC,QAAQ,CAAC,GAAGJ,KAAK,CAAA;AAC/B,KAAC,MACI;AACJC,MAAAA,MAAM,IAAIhD,QAAQ,CAACH,CAAC,CAAC,CAAA;AACtB,KAAA;AAEA,IAAA,IAAIG,QAAQ,CAACH,CAAC,CAAC,KAAK,GAAG,EAAE;AACxBoD,MAAAA,SAAS,EAAE,CAAA;KACX,MACI,IAAIjD,QAAQ,CAACH,CAAC,CAAC,KAAK,GAAG,EAAE;AAC7BoD,MAAAA,SAAS,EAAE,CAAA;AACZ,KAAA;AAEApD,IAAAA,CAAC,EAAE,CAAA;AACJ,GAAA;EAEA,OAAO;AACNG,IAAAA,QAAQ,EAAEgD,MAAM;AAChBE,IAAAA,YAAAA;GACA,CAAA;AACF,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASE,iBAAiBA,CAACL,KAAK,EAAEM,OAAO,EAAE9B,MAAM,EAAEK,MAAM,EAAEC,OAAO,EAAE;EAClF,MAAM;IAACrC,IAAI;AAAEC,IAAAA,KAAAA;AAAK,GAAC,GAAGN,UAAU,CAACkE,OAAO,CAAC,CAAA;AAEzC,EAAA,IAAIC,QAAQ,GAAGC,QAAQ,CAACR,KAAK,CAAC,CAAA;AAE9BvD,EAAAA,IAAI,CAACgE,OAAO,CAAEC,GAAG,IAAK;AACrB,IAAA,IAAIA,GAAG,CAACC,UAAU,CAAC,SAAS,CAAC,EAAE;MAC9BJ,QAAQ,IAAIC,QAAQ,CAACE,GAAG,CAAC1D,KAAK,CAAC,SAAS,CAACD,MAAM,CAAC,CAAC,CAAA;AAClD,KAAA;AACD,GAAC,CAAC,CAAA;EAEF,MAAM6D,oBAAoB,GAAG,EAAE,CAAA;EAE/B,IAAI,aAAa,IAAIC,IAAI,EAAE;AAC1B;AACA,IAAA,IAAIlB,eAAe,KAAKH,SAAS,IAAIG,eAAe,CAACmB,eAAe,EAAE,CAACtC,MAAM,KAAKA,MAAM,EAAE;AACzFmB,MAAAA,eAAe,GAAG,IAAIkB,IAAI,CAACE,WAAW,CAACvC,MAAM,CAAC,CAAA;AAC/C,KAAA;AAEA,IAAA,MAAMwC,aAAa,GAAGrB,eAAe,CAACsB,MAAM,CAACV,QAAQ,CAAC,CAAA;;AAEtD;IACA,IAAIS,aAAa,KAAKlB,OAAK,EAAE;AAC5Bc,MAAAA,oBAAoB,CAACvD,IAAI,CAAC2D,aAAa,CAAC,CAAA;AACzC,KAAA;AACD,GAAA;EACA,IAAIT,QAAQ,KAAK,CAAC,EAAE;AACnBK,IAAAA,oBAAoB,CAACvD,IAAI,CAACwC,GAAG,CAAC,CAAA;AAC/B,GAAA;EACAe,oBAAoB,CAACvD,IAAI,CAAE,CAAA,CAAA,EAAGkD,QAAS,CAAC,CAAA,EAAET,OAAK,CAAC,CAAA;AAEhD,EAAA,KAAK,IAAIhD,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG8D,oBAAoB,CAAC7D,MAAM,EAAED,CAAC,EAAE,EAAE;AACrD,IAAA,MAAMoE,OAAO,GAAGN,oBAAoB,CAAC9D,CAAC,CAAC,CAAA;IACvC,IAAIoE,OAAO,IAAIxE,KAAK,EAAE;MACrB,MAAM;QAACO,QAAQ;AAAEkD,QAAAA,YAAAA;OAAa,GAAGJ,iBAAiB,CAACrD,KAAK,CAACwE,OAAO,CAAC,EAAEX,QAAQ,CAAC,CAAA;MAC5E,OAAOzB,OAAO,CAAC7B,QAAQ,EAAE;AACxB,QAAA,GAAG4B,MAAM;QACT,GAAGsB,YAAAA;AACJ,OAAC,CAAC,CAAA;AACH,KAAA;AACD,GAAA;AAEA,EAAA,OAAOH,KAAK,CAAA;AACb;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,MAAMF,KAAK,GAAG,OAAO,CAAA;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASqB,iBAAiBA,CAACnB,KAAK,EAAEM,OAAO,EAAE9B,MAAM,EAAEK,MAAM,EAAEC,OAAO,EAAE;EAClF,MAAM;AAACpC,IAAAA,KAAAA;AAAK,GAAC,GAAGN,UAAU,CAACkE,OAAO,CAAC,CAAA;EAEnC,IAAIN,KAAK,IAAItD,KAAK,EAAE;IACnB,OAAOoC,OAAO,CAACpC,KAAK,CAACsD,KAAK,CAAC,EAAEnB,MAAM,CAAC,CAAA;AACrC,GAAC,MACI,IAAIiB,KAAK,IAAIpD,KAAK,EAAE;IACxB,OAAOoC,OAAO,CAACpC,KAAK,CAACoD,KAAK,CAAC,EAAEjB,MAAM,CAAC,CAAA;AACrC,GAAA;AAEA,EAAA,OAAOmB,KAAK,CAAA;AACb;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ultraq/icu-message-formatter",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Format ICU message syntax strings from supplied parameters and your own configurable types",
5
5
  "author": "Emanuel Rabina <emanuelrabina@gmail.com> (http://www.ultraq.net.nz/)",
6
6
  "license": "Apache-2.0",
@@ -36,7 +36,7 @@
36
36
  "sideEffects": false,
37
37
  "scripts": {
38
38
  "lint": "eslint \"**/*.js\"",
39
- "test": "jest",
39
+ "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest",
40
40
  "build": "npm run build:dist && npm run build:browser && npm run build:dts",
41
41
  "build:dist": "rollup --config",
42
42
  "build:browser": "rollup --config rollup.config.browser.js",
@@ -53,11 +53,13 @@
53
53
  "@babel/preset-env": "^7.22.15",
54
54
  "@formatjs/intl-locale": "^3.3.2",
55
55
  "@formatjs/intl-numberformat": "^8.7.0",
56
+ "@jest/globals": "^29.7.0",
56
57
  "@rollup/plugin-babel": "^6.0.3",
57
58
  "@rollup/plugin-commonjs": "^25.0.4",
58
59
  "@rollup/plugin-node-resolve": "^15.2.1",
59
60
  "@rollup/plugin-terser": "^0.4.3",
60
61
  "@types/jest": "^29.5.4",
62
+ "cross-env": "^7.0.3",
61
63
  "eslint": "^8.48.0",
62
64
  "eslint-config-ultraq": "^3.1.0",
63
65
  "eslint-plugin-import": "^2.28.1",