@ultraq/icu-message-formatter 0.13.0 → 0.14.0

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 +7 -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} +37 -18
  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} +37 -18
  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
@@ -1,5 +1,3 @@
1
- import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
- import { flatten } from '@ultraq/array-utils';
3
1
  import { memoize } from '@ultraq/function-utils';
4
2
 
5
3
  /*
@@ -167,6 +165,23 @@ function split(string, separator, limit) {
167
165
  return split(tail, separator, limit - 1, accumulator);
168
166
  }
169
167
 
168
+ /*
169
+ * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)
170
+ *
171
+ * Licensed under the Apache License, Version 2.0 (the "License");
172
+ * you may not use this file except in compliance with the License.
173
+ * You may obtain a copy of the License at
174
+ *
175
+ * http://www.apache.org/licenses/LICENSE-2.0
176
+ *
177
+ * Unless required by applicable law or agreed to in writing, software
178
+ * distributed under the License is distributed on an "AS IS" BASIS,
179
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
180
+ * See the License for the specific language governing permissions and
181
+ * limitations under the License.
182
+ */
183
+
184
+
170
185
  /**
171
186
  * @typedef {Record<string,any>} FormatValues
172
187
  */
@@ -197,14 +212,14 @@ function split(string, separator, limit) {
197
212
 
198
213
  /**
199
214
  * The main class for formatting messages.
200
- *
215
+ *
201
216
  * @author Emanuel Rabina
202
217
  */
203
218
  class MessageFormatter {
204
219
  /**
205
220
  * Creates a new formatter that can work using any of the custom type handlers
206
221
  * you register.
207
- *
222
+ *
208
223
  * @param {string} locale
209
224
  * @param {Record<string,TypeHandler>} [typeHandlers]
210
225
  * Optional object where the keys are the names of the types to register,
@@ -212,21 +227,25 @@ class MessageFormatter {
212
227
  * string for the data and locale they are given.
213
228
  */
214
229
  constructor(locale) {
215
- var _this = this;
216
230
  let typeHandlers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
217
- /**
218
- * Formats an ICU message syntax string using `values` for placeholder data
219
- * and any currently-registered type handlers.
220
- *
221
- * @type {(message: string, values?: FormatValues) => string}
222
- */
223
- _defineProperty(this, "format", memoize(function (message) {
224
- let values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
225
- return flatten(_this.process(message, values)).join('');
226
- }));
227
231
  this.locale = locale;
228
232
  this.typeHandlers = typeHandlers;
229
233
  }
234
+
235
+ /**
236
+ * Formats an ICU message syntax string using `values` for placeholder data
237
+ * and any currently-registered type handlers.
238
+ *
239
+ * @type {(message: string, values?: FormatValues) => string}
240
+ */
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
+ })());
248
+
230
249
  /**
231
250
  * Process an ICU message syntax string using `values` for placeholder data
232
251
  * and any currently-registered type handlers. The result of this method is
@@ -234,10 +253,10 @@ class MessageFormatter {
234
253
  * their own type handlers. This raw output is useful for other renderers,
235
254
  * eg: React where components can be used instead of being forced to return
236
255
  * raw strings.
237
- *
256
+ *
238
257
  * This method is used by {@link MessageFormatter#format} where it acts as a
239
258
  * string renderer.
240
- *
259
+ *
241
260
  * @param {string} message
242
261
  * @param {FormatValues} [values]
243
262
  * @return {any[]}
@@ -444,4 +463,4 @@ function selectTypeHandler(value) {
444
463
  }
445
464
 
446
465
  export { MessageFormatter, findClosingBracket, parseCases, pluralTypeHandler, selectTypeHandler, splitFormattedArgument };
447
- //# sourceMappingURL=icu-message-formatter.es.js.map
466
+ //# sourceMappingURL=icu-message-formatter.js.map
@@ -0,0 +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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ultraq/icu-message-formatter",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
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",
@@ -15,30 +15,40 @@
15
15
  "intl",
16
16
  "i18n"
17
17
  ],
18
- "module": "lib/icu-message-formatter.es.js",
19
- "main": "lib/icu-message-formatter.cjs.js",
20
- "types": "index.d.ts",
18
+ "type": "module",
19
+ "module": "dist/icu-message-formatter.js",
20
+ "main": "dist/icu-message-formatter.cjs",
21
+ "types": "dist/icu-message-formatter.d.ts",
22
+ "exports": {
23
+ "import": {
24
+ "default": "./dist/icu-message-formatter.js",
25
+ "types": "./dist/icu-message-formatter.d.ts"
26
+ },
27
+ "require": {
28
+ "default": "./dist/icu-message-formatter.cjs",
29
+ "types": "./dist/icu-message-formatter.d.cts"
30
+ }
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "CHANGELOG.md"
35
+ ],
21
36
  "sideEffects": false,
22
37
  "scripts": {
23
- "format": "eslint --fix \"**/*.js\"",
24
38
  "lint": "eslint \"**/*.js\"",
25
39
  "test": "jest",
26
- "build": "npm run build:lib && npm run build:dist && npm run build:dts",
27
- "build:lib": "rollup --config --bundleConfigAsCjs",
28
- "build:dist": "rollup --config rollup.config.dist.js --bundleConfigAsCjs",
29
- "build:dts": "tsc source/IcuMessageFormatter.js --allowJs --declaration --emitDeclarationOnly --outDir types",
40
+ "build": "npm run build:dist && npm run build:browser && npm run build:dts",
41
+ "build:dist": "rollup --config",
42
+ "build:browser": "rollup --config rollup.config.browser.js",
43
+ "build:dts": "tsc --allowJs --declaration --emitDeclarationOnly dist/icu-message-formatter.js dist/icu-message-formatter.cjs",
30
44
  "prepublishOnly": "npm run build"
31
45
  },
32
46
  "dependencies": {
33
47
  "@babel/runtime": "^7.22.15",
34
- "@ultraq/array-utils": "^3.0.1",
35
- "@ultraq/function-utils": "^0.4.0"
48
+ "@ultraq/function-utils": "^0.5.1"
36
49
  },
37
50
  "devDependencies": {
38
51
  "@babel/core": "^7.22.15",
39
- "@babel/eslint-parser": "^7.22.15",
40
- "@babel/eslint-plugin": "^7.22.10",
41
- "@babel/plugin-transform-class-properties": "^7.22.5",
42
52
  "@babel/plugin-transform-runtime": "^7.22.15",
43
53
  "@babel/preset-env": "^7.22.15",
44
54
  "@formatjs/intl-locale": "^3.3.2",
@@ -50,11 +60,10 @@
50
60
  "@types/jest": "^29.5.4",
51
61
  "eslint": "^8.48.0",
52
62
  "eslint-config-ultraq": "^3.1.0",
53
- "eslint-plugin-compat": "^4.2.0",
54
63
  "eslint-plugin-import": "^2.28.1",
55
64
  "eslint-plugin-jsdoc": "^46.5.1",
56
65
  "jest": "^29.6.4",
57
- "rollup": "^3.29.0",
66
+ "rollup": "^4.9.1",
58
67
  "typescript": "^5.2.2"
59
68
  },
60
69
  "engines": {
@@ -1,2 +0,0 @@
1
- function t(t,e,n){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function e(t){const e=t=>/\s/.test(t),r=[],i={};let l=0,s=null,o=!1,u=0;for(;u<t.length;){if(o&&(e(t[u])||"{"===t[u]))o=!1,s=t.slice(l,u),"{"===t[u]&&u--;else if(!o&&!e(t[u])){const e="{"===t[u];if(s&&e){const e=n(t,u);if(-1===e)throw new Error(`Unbalanced curly braces in string: "${t}"`);i[s]=t.slice(u+1,e),u=e,s=null}else s&&(r.push(s),s=null),o=!0,l=u}u++}return o&&(s=t.slice(l)),s&&r.push(s),{args:r,cases:i}}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 i(t.slice(1,-1),",",3)}function i(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 s=t.substring(0,l).trim(),o=t.substring(l+e.length+1).trim();return r.push(s),i(o,e,n-1,r)}function l(t){return t.reduce(((t,e)=>t.concat(Array.isArray(e)?l(e):e)),[])}class s{constructor(e){var n=this;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};var i,s;t(this,"format",(i=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return l(n.process(t,e)).join("")},s={},function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var r=e.length?e.map((function(t){return 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(s,r))return s[r];var l=i.apply(void 0,e);return s[r]=l,l})),this.locale=e,this.typeHandlers=r}process(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return[];let i=t.indexOf("{");if(-1!==i){let l=n(t,i);if(-1===l)throw new Error(`Unbalanced curly braces in string: "${t}"`);{let n=t.substring(i,l+1);if(n){let s=[],o=t.substring(0,i);o&&s.push(o);let[u,c,a]=r(n),f=e[u];null==f&&(f="");let h=c&&this.typeHandlers[c];s.push(h?h(f,a,this.locale,e,this.process.bind(this)):f);let g=t.substring(l+1);return g&&s.push(this.process(g,e)),s}}}return[t]}}let o,u=0;const c="other";function a(t,e){let n=0,r="",i=0;const l={};for(;n<t.length;){if("#"!==t[n]||i)r+=t[n];else{let t="__hashToken"+u++;r+=`{${t}, number}`,l[t]=e}"{"===t[n]?i++:"}"===t[n]&&i--,n++}return{caseBody:r,numberValues:l}}function f(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0,l=arguments.length>4?arguments[4]:void 0;const{args:s,cases:u}=e(n);let f=parseInt(t);s.forEach((t=>{t.startsWith("offset:")&&(f-=parseInt(t.slice(7)))}));const h=[];if("PluralRules"in Intl){void 0!==o&&o.resolvedOptions().locale===r||(o=new Intl.PluralRules(r));const t=o.select(f);t!==c&&h.push(t)}1===f&&h.push("one"),h.push(`=${f}`,c);for(let t=0;t<h.length;t++){const e=h[t];if(e in u){const{caseBody:t,numberValues:n}=a(u[e],f);return l(t,{...i,...n})}}return t}const h="other";function g(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0;const{cases:l}=e(n);return t in l?i(l[t],r):h in l?i(l[h],r):t}export{s as MessageFormatter,n as findClosingBracket,e as parseCases,f as pluralTypeHandler,g as selectTypeHandler,r as splitFormattedArgument};
2
- //# sourceMappingURL=icu-message-formatter.es.min.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icu-message-formatter.es.min.js","sources":["../source/utilities.js","../node_modules/@ultraq/array-utils/array-utils.es.js","../source/MessageFormatter.js","../node_modules/@ultraq/function-utils/function-utils.es.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 2017, 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 * Flattens an array of arrays of infinite depth into a single-dimension array.\n *\n * > This is now natively in JavaScript as the `flat` method on an Array\n * > instance. [Check MDN for which browsers have access to this feature](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat).\n * > If you can't use `flat`, then this method will do the job 🙂\n *\n * @param {Array<any>} array\n * @return {Array<any>} Flattened array.\n */\nexport function flatten(array) {\n return array.reduce((acc, value) => {\n return acc.concat(Array.isArray(value) ? flatten(value) : value);\n }, []);\n}\n\n/**\n * Creates an array of numbers from the starting value (inclusive) to the end\n * (exclusive), with an optional step (the gap between values).\n *\n * @param {Number} start\n * The value to start at, the first item in the returned array.\n * @param {Number} end\n * The value to end with, the last item in the returned array.\n * @param {Number} [step=1]\n * The increment/gap between values, defaults to 1.\n * @return {number[]} An array encompassing the given range.\n */\nexport function range(start, end) {\n let step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n return Array.apply(0, Array(Math.ceil((end - start) / step))).map((empty, index) => index * step + start);\n}\n\n/**\n * A function to execute on each item in an array, returning truthy\n * if the item passes whatever test is required for the use of this\n * predicate.\n *\n * @template T\n * @callback Predicate<T>\n * @param {T} item\n * @return {boolean}\n */\n\n/**\n * Remove and return the first item from `array` that matches the predicate\n * function.\n *\n * @template T\n * @param {T[]} array\n * @param {Predicate<T>} predicate\n * Function to test each item of the array with. If it returns a truthy value\n * for the item, then that item is removed and returned.\n * @return {T | undefined} The matching item, or `undefined` if no match was found.\n */\nexport function remove(array, predicate) {\n return array.find((item, index) => {\n if (predicate(item)) {\n array.splice(index, 1);\n return item;\n }\n return false;\n });\n}\n\n//# sourceMappingURL=array-utils.es.js.map","/* \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 {flatten} from '@ultraq/array-utils';\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 flatten(this.process(message, values)).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 var cache = {};\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var key = args.length ? args.map(function (arg) {\n return arg === null ? 'null' : arg === undefined ? 'undefined' : typeof arg === 'function' ? arg.toString() : arg instanceof Date ? arg.toISOString() : JSON.stringify(arg);\n }).join('|') : '_(no-args)_';\n if (Object.prototype.hasOwnProperty.call(cache, key)) {\n return cache[key];\n }\n var result = func.apply(void 0, args);\n cache[key] = result;\n return result;\n };\n}\n\n//# sourceMappingURL=function-utils.es.js.map","/* \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","flatten","array","reduce","acc","value","concat","Array","isArray","MessageFormatter","constructor","locale","_this","this","typeHandlers","func","cache","_defineProperty","memoize","message","values","process","join","_len","_key","key","map","arg","toString","Date","toISOString","JSON","stringify","Object","prototype","hasOwnProperty","call","result","apply","blockStartIndex","blockEndIndex","type","format","body","typeHandler","bind","pluralFormatter","keyCounter","OTHER","replaceNumberSign","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":[1,3]}
@@ -1,2 +0,0 @@
1
- var IcuMessageFormatter=function(t){"use strict";function e(t,e,n){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function n(t){const e=t=>/\s/.test(t),n=[],i={};let s=0,l=null,o=!1,u=0;for(;u<t.length;){if(o&&(e(t[u])||"{"===t[u]))o=!1,l=t.slice(s,u),"{"===t[u]&&u--;else if(!o&&!e(t[u])){const e="{"===t[u];if(l&&e){const e=r(t,u);if(-1===e)throw new Error(`Unbalanced curly braces in string: "${t}"`);i[l]=t.slice(u+1,e),u=e,l=null}else l&&(n.push(l),l=null),o=!0,s=u}u++}return o&&(l=t.slice(s)),l&&n.push(l),{args:n,cases:i}}function r(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 i(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 i=t.indexOf(e);if(-1===i)return r.push(t),r;let l=t.substring(0,i).trim(),o=t.substring(i+e.length+1).trim();return r.push(l),s(o,e,n-1,r)}function l(t){return t.reduce(((t,e)=>t.concat(Array.isArray(e)?l(e):e)),[])}let o,u=0;const c="other";function a(t,e){let n=0,r="",i=0;const s={};for(;n<t.length;){if("#"!==t[n]||i)r+=t[n];else{let t="__hashToken"+u++;r+=`{${t}, number}`,s[t]=e}"{"===t[n]?i++:"}"===t[n]&&i--,n++}return{caseBody:r,numberValues:s}}const f="other";return t.MessageFormatter=class{constructor(t){var n=this;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};var i,s;e(this,"format",(i=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return l(n.process(t,e)).join("")},s={},function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var r=e.length?e.map((function(t){return 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(s,r))return s[r];var l=i.apply(void 0,e);return s[r]=l,l})),this.locale=t,this.typeHandlers=r}process(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return[];let n=t.indexOf("{");if(-1!==n){let s=r(t,n);if(-1===s)throw new Error(`Unbalanced curly braces in string: "${t}"`);{let r=t.substring(n,s+1);if(r){let l=[],o=t.substring(0,n);o&&l.push(o);let[u,c,a]=i(r),f=e[u];null==f&&(f="");let h=c&&this.typeHandlers[c];l.push(h?h(f,a,this.locale,e,this.process.bind(this)):f);let g=t.substring(s+1);return g&&l.push(this.process(g,e)),l}}}return[t]}},t.findClosingBracket=r,t.parseCases=n,t.pluralTypeHandler=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0;const{args:l,cases:u}=n(e);let f=parseInt(t);l.forEach((t=>{t.startsWith("offset:")&&(f-=parseInt(t.slice(7)))}));const h=[];if("PluralRules"in Intl){void 0!==o&&o.resolvedOptions().locale===r||(o=new Intl.PluralRules(r));const t=o.select(f);t!==c&&h.push(t)}1===f&&h.push("one"),h.push(`=${f}`,c);for(let t=0;t<h.length;t++){const e=h[t];if(e in u){const{caseBody:t,numberValues:n}=a(u[e],f);return s(t,{...i,...n})}}return t},t.selectTypeHandler=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0;const{cases:s}=n(e);return t in s?i(s[t],r):f in s?i(s[f],r):t},t.splitFormattedArgument=i,t}({});
2
- //# sourceMappingURL=icu-message-formatter.min.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icu-message-formatter.min.js","sources":["../source/utilities.js","../node_modules/@ultraq/array-utils/array-utils.es.js","../source/pluralTypeHandler.js","../source/selectTypeHandler.js","../source/MessageFormatter.js","../node_modules/@ultraq/function-utils/function-utils.es.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 2017, 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 * Flattens an array of arrays of infinite depth into a single-dimension array.\n *\n * > This is now natively in JavaScript as the `flat` method on an Array\n * > instance. [Check MDN for which browsers have access to this feature](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat).\n * > If you can't use `flat`, then this method will do the job 🙂\n *\n * @param {Array<any>} array\n * @return {Array<any>} Flattened array.\n */\nexport function flatten(array) {\n return array.reduce((acc, value) => {\n return acc.concat(Array.isArray(value) ? flatten(value) : value);\n }, []);\n}\n\n/**\n * Creates an array of numbers from the starting value (inclusive) to the end\n * (exclusive), with an optional step (the gap between values).\n *\n * @param {Number} start\n * The value to start at, the first item in the returned array.\n * @param {Number} end\n * The value to end with, the last item in the returned array.\n * @param {Number} [step=1]\n * The increment/gap between values, defaults to 1.\n * @return {number[]} An array encompassing the given range.\n */\nexport function range(start, end) {\n let step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n return Array.apply(0, Array(Math.ceil((end - start) / step))).map((empty, index) => index * step + start);\n}\n\n/**\n * A function to execute on each item in an array, returning truthy\n * if the item passes whatever test is required for the use of this\n * predicate.\n *\n * @template T\n * @callback Predicate<T>\n * @param {T} item\n * @return {boolean}\n */\n\n/**\n * Remove and return the first item from `array` that matches the predicate\n * function.\n *\n * @template T\n * @param {T[]} array\n * @param {Predicate<T>} predicate\n * Function to test each item of the array with. If it returns a truthy value\n * for the item, then that item is removed and returned.\n * @return {T | undefined} The matching item, or `undefined` if no match was found.\n */\nexport function remove(array, predicate) {\n return array.find((item, index) => {\n if (predicate(item)) {\n array.splice(index, 1);\n return item;\n }\n return false;\n });\n}\n\n//# sourceMappingURL=array-utils.es.js.map","/* \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 {flatten} from '@ultraq/array-utils';\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 flatten(this.process(message, values)).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 var cache = {};\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var key = args.length ? args.map(function (arg) {\n return arg === null ? 'null' : arg === undefined ? 'undefined' : typeof arg === 'function' ? arg.toString() : arg instanceof Date ? arg.toISOString() : JSON.stringify(arg);\n }).join('|') : '_(no-args)_';\n if (Object.prototype.hasOwnProperty.call(cache, key)) {\n return cache[key];\n }\n var result = func.apply(void 0, args);\n cache[key] = result;\n return result;\n };\n}\n\n//# sourceMappingURL=function-utils.es.js.map"],"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","flatten","array","reduce","acc","value","concat","Array","isArray","pluralFormatter","keyCounter","OTHER","replaceNumberSign","output","numBraces","numberValues","keyParam","constructor","locale","_this","this","typeHandlers","func","cache","_defineProperty","memoize","message","values","process","join","_len","_key","key","map","arg","toString","Date","toISOString","JSON","stringify","Object","prototype","hasOwnProperty","call","result","apply","blockStartIndex","blockEndIndex","type","format","body","typeHandler","bind","matches","intValue","parseInt","forEach","startsWith","keywordPossibilities","Intl","resolvedOptions","PluralRules","pluralKeyword","select","keyword"],"mappings":"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","x_google_ignoreList":[1,5]}
package/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export * from './types/IcuMessageFormatter';
2
- export * from './types/MessageFormatter';
3
- export * from './types/pluralTypeHandler';
4
- export * from './types/selectTypeHandler';
5
- export * from './types/utilities';
@@ -1 +0,0 @@
1
- {"version":3,"file":"icu-message-formatter.cjs.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 {flatten} from '@ultraq/array-utils';\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 flatten(this.process(message, values)).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","_this","typeHandlers","_defineProperty","memoize","message","values","flatten","process","join","blockStartIndex","blockEndIndex","result","key","type","format","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 +0,0 @@
1
- {"version":3,"file":"icu-message-formatter.es.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 {flatten} from '@ultraq/array-utils';\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 flatten(this.process(message, values)).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","_this","typeHandlers","_defineProperty","memoize","message","values","flatten","process","join","blockStartIndex","blockEndIndex","result","key","type","format","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,36 +0,0 @@
1
- import babel from '@rollup/plugin-babel';
2
- import commonjs from '@rollup/plugin-commonjs';
3
- import nodeResolve from '@rollup/plugin-node-resolve';
4
- import terser from '@rollup/plugin-terser';
5
-
6
- export default {
7
- input: 'source/IcuMessageFormatter.js',
8
- output: [
9
- {
10
- file: 'dist/icu-message-formatter.min.js',
11
- format: 'iife',
12
- name: 'IcuMessageFormatter',
13
- sourcemap: true
14
- },
15
- {
16
- file: 'dist/icu-message-formatter.es.min.js',
17
- format: 'es',
18
- name: 'IcuMessageFormatter',
19
- sourcemap: true
20
- }
21
- ],
22
- plugins: [
23
- commonjs(),
24
- babel({
25
- babelHelpers: 'bundled',
26
- skipPreflightCheck: true // See: https://github.com/rollup/plugins/issues/381#issuecomment-627215009
27
- }),
28
- nodeResolve({
29
- browser: true
30
- }),
31
- terser()
32
- ],
33
- treeshake: {
34
- moduleSideEffects: false
35
- }
36
- };
package/rollup.config.js DELETED
@@ -1,35 +0,0 @@
1
-
2
- import babel from '@rollup/plugin-babel';
3
- import commonjs from '@rollup/plugin-commonjs';
4
- import nodeResolve from '@rollup/plugin-node-resolve';
5
-
6
- export default {
7
- input: 'source/IcuMessageFormatter.js',
8
- output: [
9
- {
10
- file: `lib/icu-message-formatter.cjs.js`,
11
- format: 'cjs',
12
- sourcemap: true
13
- },
14
- {
15
- file: `lib/icu-message-formatter.es.js`,
16
- format: 'es',
17
- sourcemap: true
18
- }
19
- ],
20
- plugins: [
21
- commonjs(),
22
- babel({
23
- babelHelpers: 'runtime'
24
- }),
25
- nodeResolve()
26
- ],
27
- external: [
28
- /@babel\/runtime/,
29
- '@ultraq/array-utils',
30
- '@ultraq/function-utils'
31
- ],
32
- treeshake: {
33
- moduleSideEffects: false
34
- }
35
- };