@ultraq/icu-message-formatter 0.13.0 → 0.14.1

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +2 -4
  3. package/dist/icu-message-formatter.browser.es.min.js +2 -0
  4. package/dist/icu-message-formatter.browser.es.min.js.map +1 -0
  5. package/dist/icu-message-formatter.browser.min.js +2 -0
  6. package/dist/icu-message-formatter.browser.min.js.map +1 -0
  7. package/{lib/icu-message-formatter.cjs.js → dist/icu-message-formatter.cjs} +65 -52
  8. package/dist/icu-message-formatter.cjs.map +1 -0
  9. package/dist/icu-message-formatter.d.cts +153 -0
  10. package/dist/icu-message-formatter.d.ts +153 -0
  11. package/{lib/icu-message-formatter.es.js → dist/icu-message-formatter.js} +65 -52
  12. package/dist/icu-message-formatter.js.map +1 -0
  13. package/package.json +25 -16
  14. package/dist/icu-message-formatter.es.min.js +0 -2
  15. package/dist/icu-message-formatter.es.min.js.map +0 -1
  16. package/dist/icu-message-formatter.min.js +0 -2
  17. package/dist/icu-message-formatter.min.js.map +0 -1
  18. package/index.d.ts +0 -5
  19. package/lib/icu-message-formatter.cjs.js.map +0 -1
  20. package/lib/icu-message-formatter.es.js.map +0 -1
  21. package/rollup.config.dist.js +0 -36
  22. package/rollup.config.js +0 -35
  23. package/source/IcuMessageFormatter.js +0 -20
  24. package/source/MessageFormatter.js +0 -138
  25. package/source/MessageFormatter.test.js +0 -153
  26. package/source/pluralTypeHandler.js +0 -122
  27. package/source/pluralTypeHandler.test.js +0 -188
  28. package/source/selectTypeHandler.js +0 -46
  29. package/source/selectTypeHandler.test.js +0 -59
  30. package/source/utilities.js +0 -174
  31. package/source/utilities.test.js +0 -123
  32. package/types/IcuMessageFormatter.d.ts +0 -4
  33. package/types/MessageFormatter.d.ts +0 -71
  34. package/types/pluralTypeHandler.d.ts +0 -15
  35. package/types/selectTypeHandler.d.ts +0 -15
  36. package/types/typedefs.d.ts +0 -3
  37. package/types/utilities.d.ts +0 -52
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ ### 0.14.1
6
+ - Update generated types for some of the utility exports
7
+
8
+ ### 0.14.0
9
+ - On the road to making this pure ESM, the following internal changes have been
10
+ made:
11
+ - Added `"type": "module"` so ESM is now the default
12
+ - Package outputs defined using an `exports` map w/ `import` pointing to the
13
+ main source and `require` to a transpiled version of the source
14
+
5
15
  ### 0.13.0
6
16
  - Minimum supported version of Node is now 18
7
17
  - Browser target in `.browserslistrc` file is now `defaults`, so the explicit
package/README.md CHANGED
@@ -34,13 +34,11 @@ npm install @ultraq/icu-message-formatter
34
34
  ### As a script for the browser via the unpkg CDN:
35
35
 
36
36
  An IIFE version of this library is available at:
37
- https://unpkg.com/@ultraq/icu-message-formatter/dist/icu-message-formatter.min.js
38
-
37
+ https://unpkg.com/@ultraq/icu-message-formatter/dist/icu-message-formatter.browser.min.js
39
38
  In this form, this module will then be present in the global scope as `IcuMessageFormatter`.
40
39
 
41
40
  An ESM version of this library is available at:
42
- https://unpkg.com/@ultraq/icu-message-formatter/dist/icu-message-formatter.es.min.js
43
-
41
+ https://unpkg.com/@ultraq/icu-message-formatter/dist/icu-message-formatter.browser.es.min.js
44
42
  That URL can be used directly in ESM scripts made for the browser, and otherwise
45
43
  works like the NPM package.
46
44
 
@@ -0,0 +1,2 @@
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(...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,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
+ //# sourceMappingURL=icu-message-formatter.browser.es.min.js.map
@@ -0,0 +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 {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","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]}
@@ -0,0 +1,2 @@
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(...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),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
+ //# sourceMappingURL=icu-message-formatter.browser.min.js.map
@@ -0,0 +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 {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","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]}
@@ -1,18 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
- var arrayUtils = require('@ultraq/array-utils');
5
3
  var functionUtils = require('@ultraq/function-utils');
6
4
 
7
- /*
5
+ /*
8
6
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
9
- *
7
+ *
10
8
  * Licensed under the Apache License, Version 2.0 (the "License");
11
9
  * you may not use this file except in compliance with the License.
12
10
  * You may obtain a copy of the License at
13
- *
11
+ *
14
12
  * http://www.apache.org/licenses/LICENSE-2.0
15
- *
13
+ *
16
14
  * Unless required by applicable law or agreed to in writing, software
17
15
  * distributed under the License is distributed on an "AS IS" BASIS,
18
16
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -32,16 +30,17 @@ var functionUtils = require('@ultraq/function-utils');
32
30
  * Most branch-based type handlers are based around "cases". For example,
33
31
  * `select` and `plural` compare compare a value to "case keys" to choose a
34
32
  * subtranslation.
35
- *
33
+ *
36
34
  * This util splits "matches" portions provided to the aforementioned handlers
37
35
  * into case strings, and extracts any prepended arguments (for example,
38
36
  * `plural` supports an `offset:n` argument used for populating the magic `#`
39
37
  * variable).
40
- *
38
+ *
41
39
  * @param {string} string
42
40
  * @return {ParseCasesResult}
43
41
  */
44
- function parseCases(string) {
42
+ function parseCases() {
43
+ let string = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
45
44
  const isWhitespace = ch => /\s/.test(ch);
46
45
  const args = [];
47
46
  const cases = {};
@@ -102,7 +101,7 @@ function parseCases(string) {
102
101
  /**
103
102
  * Finds the index of the matching closing curly bracket, including through
104
103
  * strings that could have nested brackets.
105
- *
104
+ *
106
105
  * @param {string} string
107
106
  * @param {number} fromIndex
108
107
  * @return {number}
@@ -128,7 +127,7 @@ function findClosingBracket(string, fromIndex) {
128
127
  /**
129
128
  * Split a `{key, type, format}` block into those 3 parts, taking into account
130
129
  * nested message syntax that can exist in the `format` part.
131
- *
130
+ *
132
131
  * @param {string} block
133
132
  * @return {string[]}
134
133
  * An array with `key`, `type`, and `format` items in that order, if present
@@ -141,7 +140,7 @@ function splitFormattedArgument(block) {
141
140
  /**
142
141
  * Like `String.prototype.split()` but where the limit parameter causes the
143
142
  * remainder of the string to be grouped together in a final entry.
144
- *
143
+ *
145
144
  * @private
146
145
  * @param {string} string
147
146
  * @param {string} separator
@@ -169,6 +168,23 @@ function split(string, separator, limit) {
169
168
  return split(tail, separator, limit - 1, accumulator);
170
169
  }
171
170
 
171
+ /*
172
+ * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
173
+ *
174
+ * Licensed under the Apache License, Version 2.0 (the "License");
175
+ * you may not use this file except in compliance with the License.
176
+ * You may obtain a copy of the License at
177
+ *
178
+ * http://www.apache.org/licenses/LICENSE-2.0
179
+ *
180
+ * Unless required by applicable law or agreed to in writing, software
181
+ * distributed under the License is distributed on an "AS IS" BASIS,
182
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183
+ * See the License for the specific language governing permissions and
184
+ * limitations under the License.
185
+ */
186
+
187
+
172
188
  /**
173
189
  * @typedef {Record<string,any>} FormatValues
174
190
  */
@@ -199,14 +215,14 @@ function split(string, separator, limit) {
199
215
 
200
216
  /**
201
217
  * The main class for formatting messages.
202
- *
218
+ *
203
219
  * @author Emanuel Rabina
204
220
  */
205
221
  class MessageFormatter {
206
222
  /**
207
223
  * Creates a new formatter that can work using any of the custom type handlers
208
224
  * you register.
209
- *
225
+ *
210
226
  * @param {string} locale
211
227
  * @param {Record<string,TypeHandler>} [typeHandlers]
212
228
  * Optional object where the keys are the names of the types to register,
@@ -214,21 +230,25 @@ class MessageFormatter {
214
230
  * string for the data and locale they are given.
215
231
  */
216
232
  constructor(locale) {
217
- var _this = this;
218
233
  let typeHandlers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
219
- /**
220
- * Formats an ICU message syntax string using `values` for placeholder data
221
- * and any currently-registered type handlers.
222
- *
223
- * @type {(message: string, values?: FormatValues) => string}
224
- */
225
- _defineProperty(this, "format", functionUtils.memoize(function (message) {
226
- let values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
227
- return arrayUtils.flatten(_this.process(message, values)).join('');
228
- }));
229
234
  this.locale = locale;
230
235
  this.typeHandlers = typeHandlers;
231
236
  }
237
+
238
+ /**
239
+ * Formats an ICU message syntax string using `values` for placeholder data
240
+ * and any currently-registered type handlers.
241
+ *
242
+ * @type {(message: string, values?: FormatValues) => string}
243
+ */
244
+ format = functionUtils.memoize((() => {
245
+ var _this = this;
246
+ return function (message) {
247
+ let values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
248
+ return _this.process(message, values).flat(Infinity).join('');
249
+ };
250
+ })());
251
+
232
252
  /**
233
253
  * Process an ICU message syntax string using `values` for placeholder data
234
254
  * and any currently-registered type handlers. The result of this method is
@@ -236,10 +256,10 @@ class MessageFormatter {
236
256
  * their own type handlers. This raw output is useful for other renderers,
237
257
  * eg: React where components can be used instead of being forced to return
238
258
  * raw strings.
239
- *
259
+ *
240
260
  * This method is used by {@link MessageFormatter#format} where it acts as a
241
261
  * string renderer.
242
- *
262
+ *
243
263
  * @param {string} message
244
264
  * @param {FormatValues} [values]
245
265
  * @return {any[]}
@@ -281,15 +301,15 @@ class MessageFormatter {
281
301
  }
282
302
  }
283
303
 
284
- /*
304
+ /*
285
305
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
286
- *
306
+ *
287
307
  * Licensed under the Apache License, Version 2.0 (the "License");
288
308
  * you may not use this file except in compliance with the License.
289
309
  * You may obtain a copy of the License at
290
- *
310
+ *
291
311
  * http://www.apache.org/licenses/LICENSE-2.0
292
- *
312
+ *
293
313
  * Unless required by applicable law or agreed to in writing, software
294
314
  * distributed under the License is distributed on an "AS IS" BASIS,
295
315
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -339,22 +359,18 @@ function replaceNumberSign(caseBody, value) {
339
359
  /**
340
360
  * Handler for `plural` statements within ICU message syntax strings. Returns
341
361
  * a formatted string for the branch that closely matches the current value.
342
- *
362
+ *
343
363
  * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more
344
364
  * details on how the `plural` statement works.
345
365
  *
346
366
  * @param {string} value
347
367
  * @param {string} matches
348
368
  * @param {string} locale
349
- * @param {Record<string,any>} values
350
- * @param {(message: string, values?: Record<string,any>) => any[]} process
369
+ * @param {import('./MessageFormatter.js').FormatValues} values
370
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
351
371
  * @return {any | any[]}
352
372
  */
353
- function pluralTypeHandler(value) {
354
- let matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
355
- let locale = arguments.length > 2 ? arguments[2] : undefined;
356
- let values = arguments.length > 3 ? arguments[3] : undefined;
357
- let process = arguments.length > 4 ? arguments[4] : undefined;
373
+ function pluralTypeHandler(value, matches, locale, values, process) {
358
374
  const {
359
375
  args,
360
376
  cases
@@ -398,15 +414,15 @@ function pluralTypeHandler(value) {
398
414
  return value;
399
415
  }
400
416
 
401
- /*
417
+ /*
402
418
  * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
403
- *
419
+ *
404
420
  * Licensed under the Apache License, Version 2.0 (the "License");
405
421
  * you may not use this file except in compliance with the License.
406
422
  * You may obtain a copy of the License at
407
- *
423
+ *
408
424
  * http://www.apache.org/licenses/LICENSE-2.0
409
- *
425
+ *
410
426
  * Unless required by applicable law or agreed to in writing, software
411
427
  * distributed under the License is distributed on an "AS IS" BASIS,
412
428
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -419,21 +435,18 @@ const OTHER = 'other';
419
435
  /**
420
436
  * Handler for `select` statements within ICU message syntax strings. Returns
421
437
  * a formatted string for the branch that closely matches the current value.
422
- *
438
+ *
423
439
  * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more
424
440
  * details on how the `select` statement works.
425
- *
441
+ *
426
442
  * @param {string} value
427
443
  * @param {string} matches
428
444
  * @param {string} locale
429
- * @param {Record<string,any>} values
430
- * @param {(message: string, values?: Record<string,any>) => any[]} process
445
+ * @param {import('./MessageFormatter.js').FormatValues} values
446
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
431
447
  * @return {any | any[]}
432
448
  */
433
- function selectTypeHandler(value) {
434
- let matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
435
- let values = arguments.length > 3 ? arguments[3] : undefined;
436
- let process = arguments.length > 4 ? arguments[4] : undefined;
449
+ function selectTypeHandler(value, matches, locale, values, process) {
437
450
  const {
438
451
  cases
439
452
  } = parseCases(matches);
@@ -451,4 +464,4 @@ exports.parseCases = parseCases;
451
464
  exports.pluralTypeHandler = pluralTypeHandler;
452
465
  exports.selectTypeHandler = selectTypeHandler;
453
466
  exports.splitFormattedArgument = splitFormattedArgument;
454
- //# sourceMappingURL=icu-message-formatter.cjs.js.map
467
+ //# sourceMappingURL=icu-message-formatter.cjs.map
@@ -0,0 +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 {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","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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"}
@@ -0,0 +1,153 @@
1
+ export type ParseCasesResult = {
2
+ /**
3
+ * A list of prepended arguments.
4
+ */
5
+ args: string[];
6
+ /**
7
+ * A map of all cases.
8
+ */
9
+ cases: Record<string, string>;
10
+ };
11
+ export type FormatValues = Record<string, any>;
12
+ export type ProcessFunction = (message: string, values?: FormatValues) => any[];
13
+ export type TypeHandler = (value: any, matches: string, locale: string, values: FormatValues, process: ProcessFunction) => any | any[];
14
+ /**
15
+ * @typedef {Record<string,any>} FormatValues
16
+ */
17
+ /**
18
+ * @callback ProcessFunction
19
+ * @param {string} message
20
+ * @param {FormatValues} [values={}]
21
+ * @return {any[]}
22
+ */
23
+ /**
24
+ * @callback TypeHandler
25
+ * @param {any} value
26
+ * The object which matched the key of the block being processed.
27
+ * @param {string} matches
28
+ * Any format options associated with the block being processed.
29
+ * @param {string} locale
30
+ * The locale to use for formatting.
31
+ * @param {FormatValues} values
32
+ * The object of placeholder data given to the original `format`/`process`
33
+ * call.
34
+ * @param {ProcessFunction} process
35
+ * The `process` function itself so that sub-messages can be processed by type
36
+ * handlers.
37
+ * @return {any | any[]}
38
+ */
39
+ /**
40
+ * The main class for formatting messages.
41
+ *
42
+ * @author Emanuel Rabina
43
+ */
44
+ export class MessageFormatter {
45
+ /**
46
+ * Creates a new formatter that can work using any of the custom type handlers
47
+ * you register.
48
+ *
49
+ * @param {string} locale
50
+ * @param {Record<string,TypeHandler>} [typeHandlers]
51
+ * Optional object where the keys are the names of the types to register,
52
+ * their values being the functions that will return a nicely formatted
53
+ * string for the data and locale they are given.
54
+ */
55
+ constructor(locale: string, ...args: any[]);
56
+ locale: string;
57
+ typeHandlers: any;
58
+ /**
59
+ * Formats an ICU message syntax string using `values` for placeholder data
60
+ * and any currently-registered type handlers.
61
+ *
62
+ * @type {(message: string, values?: FormatValues) => string}
63
+ */
64
+ format: (message: string, values?: FormatValues) => string;
65
+ /**
66
+ * Process an ICU message syntax string using `values` for placeholder data
67
+ * and any currently-registered type handlers. The result of this method is
68
+ * an array of the component parts after they have been processed in turn by
69
+ * their own type handlers. This raw output is useful for other renderers,
70
+ * eg: React where components can be used instead of being forced to return
71
+ * raw strings.
72
+ *
73
+ * This method is used by {@link MessageFormatter#format} where it acts as a
74
+ * string renderer.
75
+ *
76
+ * @param {string} message
77
+ * @param {FormatValues} [values]
78
+ * @return {any[]}
79
+ */
80
+ process(message: string, ...args: any[]): any[];
81
+ }
82
+ /**
83
+ * Finds the index of the matching closing curly bracket, including through
84
+ * strings that could have nested brackets.
85
+ *
86
+ * @param {string} string
87
+ * @param {number} fromIndex
88
+ * @return {number}
89
+ * The index of the matching closing bracket, or -1 if no closing bracket
90
+ * could be found.
91
+ */
92
+ export function findClosingBracket(string: string, fromIndex: number): number;
93
+ /**
94
+ * @typedef ParseCasesResult
95
+ * @property {string[]} args
96
+ * A list of prepended arguments.
97
+ * @property {Record<string,string>} cases
98
+ * A map of all cases.
99
+ */
100
+ /**
101
+ * Most branch-based type handlers are based around "cases". For example,
102
+ * `select` and `plural` compare compare a value to "case keys" to choose a
103
+ * subtranslation.
104
+ *
105
+ * This util splits "matches" portions provided to the aforementioned handlers
106
+ * into case strings, and extracts any prepended arguments (for example,
107
+ * `plural` supports an `offset:n` argument used for populating the magic `#`
108
+ * variable).
109
+ *
110
+ * @param {string} string
111
+ * @return {ParseCasesResult}
112
+ */
113
+ export function parseCases(...args: any[]): ParseCasesResult;
114
+ /**
115
+ * Handler for `plural` statements within ICU message syntax strings. Returns
116
+ * a formatted string for the branch that closely matches the current value.
117
+ *
118
+ * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more
119
+ * details on how the `plural` statement works.
120
+ *
121
+ * @param {string} value
122
+ * @param {string} matches
123
+ * @param {string} locale
124
+ * @param {import('./MessageFormatter.js').FormatValues} values
125
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
126
+ * @return {any | any[]}
127
+ */
128
+ export function pluralTypeHandler(value: string, matches: string, locale: string, values: any, process: any): any | any[];
129
+ /**
130
+ * Handler for `select` statements within ICU message syntax strings. Returns
131
+ * a formatted string for the branch that closely matches the current value.
132
+ *
133
+ * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more
134
+ * details on how the `select` statement works.
135
+ *
136
+ * @param {string} value
137
+ * @param {string} matches
138
+ * @param {string} locale
139
+ * @param {import('./MessageFormatter.js').FormatValues} values
140
+ * @param {import('./MessageFormatter.js').ProcessFunction} process
141
+ * @return {any | any[]}
142
+ */
143
+ export function selectTypeHandler(value: string, matches: string, locale: string, values: any, process: any): any | any[];
144
+ /**
145
+ * Split a `{key, type, format}` block into those 3 parts, taking into account
146
+ * nested message syntax that can exist in the `format` part.
147
+ *
148
+ * @param {string} block
149
+ * @return {string[]}
150
+ * An array with `key`, `type`, and `format` items in that order, if present
151
+ * in the formatted argument block.
152
+ */
153
+ export function splitFormattedArgument(block: string): string[];