@angular/core 10.0.6 → 10.0.10

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 (58) hide show
  1. package/bundles/core-testing.umd.js +1 -1
  2. package/bundles/core-testing.umd.min.js +1 -1
  3. package/bundles/core-testing.umd.min.js.map +1 -1
  4. package/bundles/core.umd.js +1678 -1387
  5. package/bundles/core.umd.js.map +1 -1
  6. package/bundles/core.umd.min.js +152 -124
  7. package/bundles/core.umd.min.js.map +1 -1
  8. package/core.d.ts +258 -58
  9. package/core.metadata.json +1 -1
  10. package/esm2015/core.js +3 -3
  11. package/esm2015/src/application_module.js +2 -2
  12. package/esm2015/src/application_ref.js +2 -2
  13. package/esm2015/src/core_render3_private_export.js +2 -1
  14. package/esm2015/src/metadata/di.js +1 -1
  15. package/esm2015/src/r3_symbols.js +2 -1
  16. package/esm2015/src/reflection/reflection_capabilities.js +38 -8
  17. package/esm2015/src/render3/bindings.js +3 -3
  18. package/esm2015/src/render3/component.js +3 -3
  19. package/esm2015/src/render3/di.js +1 -1
  20. package/esm2015/src/render3/i18n/i18n_apply.js +445 -0
  21. package/esm2015/src/render3/i18n/i18n_debug.js +170 -0
  22. package/esm2015/src/render3/i18n/i18n_locale_id.js +37 -0
  23. package/esm2015/src/render3/i18n/i18n_parse.js +635 -0
  24. package/esm2015/src/render3/i18n/i18n_postprocess.js +121 -0
  25. package/esm2015/src/render3/index.js +3 -2
  26. package/esm2015/src/render3/instructions/advance.js +3 -3
  27. package/esm2015/src/render3/instructions/element.js +3 -3
  28. package/esm2015/src/render3/instructions/element_container.js +3 -3
  29. package/esm2015/src/render3/instructions/i18n.js +164 -0
  30. package/esm2015/src/render3/instructions/listener.js +3 -3
  31. package/esm2015/src/render3/instructions/lview_debug.js +54 -213
  32. package/esm2015/src/render3/instructions/shared.js +54 -38
  33. package/esm2015/src/render3/instructions/text.js +3 -3
  34. package/esm2015/src/render3/interfaces/i18n.js +12 -3
  35. package/esm2015/src/render3/interfaces/node.js +13 -1
  36. package/esm2015/src/render3/interfaces/view.js +1 -1
  37. package/esm2015/src/render3/jit/directive.js +33 -10
  38. package/esm2015/src/render3/ng_module_ref.js +2 -2
  39. package/esm2015/src/render3/node_manipulation.js +1 -11
  40. package/esm2015/src/render3/pure_function.js +3 -3
  41. package/esm2015/src/render3/query.js +14 -12
  42. package/esm2015/src/render3/styling/style_binding_list.js +3 -3
  43. package/esm2015/src/render3/styling/styling_parser.js +3 -2
  44. package/esm2015/src/render3/util/debug_utils.js +31 -2
  45. package/esm2015/src/render3/util/discovery_utils.js +1 -1
  46. package/esm2015/src/render3/util/view_utils.js +5 -5
  47. package/esm2015/src/render3/view_engine_compatibility.js +13 -4
  48. package/esm2015/src/util/assert.js +2 -2
  49. package/esm2015/src/util/char_code.js +1 -1
  50. package/esm2015/src/version.js +1 -1
  51. package/fesm2015/core.js +1652 -1364
  52. package/fesm2015/core.js.map +1 -1
  53. package/fesm2015/testing.js +1 -1
  54. package/package.json +1 -1
  55. package/src/r3_symbols.d.ts +13 -1
  56. package/testing/testing.d.ts +1 -1
  57. package/testing.d.ts +1 -1
  58. package/esm2015/src/render3/i18n.js +0 -1225
@@ -0,0 +1,170 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { assertNumber, assertString } from '../../util/assert';
9
+ import { COMMENT_MARKER, ELEMENT_MARKER, getInstructionFromI18nMutateOpCode, getParentFromI18nMutateOpCode, getRefFromI18nMutateOpCode } from '../interfaces/i18n';
10
+ /**
11
+ * Converts `I18nUpdateOpCodes` array into a human readable format.
12
+ *
13
+ * This function is attached to the `I18nUpdateOpCodes.debug` property if `ngDevMode` is enabled.
14
+ * This function provides a human readable view of the opcodes. This is useful when debugging the
15
+ * application as well as writing more readable tests.
16
+ *
17
+ * @param this `I18nUpdateOpCodes` if attached as a method.
18
+ * @param opcodes `I18nUpdateOpCodes` if invoked as a function.
19
+ */
20
+ export function i18nUpdateOpCodesToString(opcodes) {
21
+ const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));
22
+ let lines = [];
23
+ function consumeOpCode(value) {
24
+ const ref = value >>> 2 /* SHIFT_REF */;
25
+ const opCode = value & 3 /* MASK_OPCODE */;
26
+ switch (opCode) {
27
+ case 0 /* Text */:
28
+ return `(lView[${ref}] as Text).textContent = $$$`;
29
+ case 1 /* Attr */:
30
+ const attrName = parser.consumeString();
31
+ const sanitizationFn = parser.consumeFunction();
32
+ const value = sanitizationFn ? `(${sanitizationFn})($$$)` : '$$$';
33
+ return `(lView[${ref}] as Element).setAttribute('${attrName}', ${value})`;
34
+ case 2 /* IcuSwitch */:
35
+ return `icuSwitchCase(lView[${ref}] as Comment, ${parser.consumeNumber()}, $$$)`;
36
+ case 3 /* IcuUpdate */:
37
+ return `icuUpdateCase(lView[${ref}] as Comment, ${parser.consumeNumber()})`;
38
+ }
39
+ throw new Error('unexpected OpCode');
40
+ }
41
+ while (parser.hasMore()) {
42
+ let mask = parser.consumeNumber();
43
+ let size = parser.consumeNumber();
44
+ const end = parser.i + size;
45
+ const statements = [];
46
+ let statement = '';
47
+ while (parser.i < end) {
48
+ let value = parser.consumeNumberOrString();
49
+ if (typeof value === 'string') {
50
+ statement += value;
51
+ }
52
+ else if (value < 0) {
53
+ // Negative numbers are ref indexes
54
+ statement += '${lView[' + (0 - value) + ']}';
55
+ }
56
+ else {
57
+ // Positive numbers are operations.
58
+ const opCodeText = consumeOpCode(value);
59
+ statements.push(opCodeText.replace('$$$', '`' + statement + '`') + ';');
60
+ statement = '';
61
+ }
62
+ }
63
+ lines.push(`if (mask & 0b${mask.toString(2)}) { ${statements.join(' ')} }`);
64
+ }
65
+ return lines;
66
+ }
67
+ /**
68
+ * Converts `I18nMutableOpCodes` array into a human readable format.
69
+ *
70
+ * This function is attached to the `I18nMutableOpCodes.debug` if `ngDevMode` is enabled. This
71
+ * function provides a human readable view of the opcodes. This is useful when debugging the
72
+ * application as well as writing more readable tests.
73
+ *
74
+ * @param this `I18nMutableOpCodes` if attached as a method.
75
+ * @param opcodes `I18nMutableOpCodes` if invoked as a function.
76
+ */
77
+ export function i18nMutateOpCodesToString(opcodes) {
78
+ const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));
79
+ let lines = [];
80
+ function consumeOpCode(opCode) {
81
+ const parent = getParentFromI18nMutateOpCode(opCode);
82
+ const ref = getRefFromI18nMutateOpCode(opCode);
83
+ switch (getInstructionFromI18nMutateOpCode(opCode)) {
84
+ case 0 /* Select */:
85
+ lastRef = ref;
86
+ return '';
87
+ case 1 /* AppendChild */:
88
+ return `(lView[${parent}] as Element).appendChild(lView[${lastRef}])`;
89
+ case 3 /* Remove */:
90
+ return `(lView[${parent}] as Element).remove(lView[${ref}])`;
91
+ case 4 /* Attr */:
92
+ return `(lView[${ref}] as Element).setAttribute("${parser.consumeString()}", "${parser.consumeString()}")`;
93
+ case 5 /* ElementEnd */:
94
+ return `setPreviousOrParentTNode(tView.data[${ref}] as TNode)`;
95
+ case 6 /* RemoveNestedIcu */:
96
+ return `removeNestedICU(${ref})`;
97
+ }
98
+ throw new Error('Unexpected OpCode');
99
+ }
100
+ let lastRef = -1;
101
+ while (parser.hasMore()) {
102
+ let value = parser.consumeNumberStringOrMarker();
103
+ if (value === COMMENT_MARKER) {
104
+ const text = parser.consumeString();
105
+ lastRef = parser.consumeNumber();
106
+ lines.push(`lView[${lastRef}] = document.createComment("${text}")`);
107
+ }
108
+ else if (value === ELEMENT_MARKER) {
109
+ const text = parser.consumeString();
110
+ lastRef = parser.consumeNumber();
111
+ lines.push(`lView[${lastRef}] = document.createElement("${text}")`);
112
+ }
113
+ else if (typeof value === 'string') {
114
+ lastRef = parser.consumeNumber();
115
+ lines.push(`lView[${lastRef}] = document.createTextNode("${value}")`);
116
+ }
117
+ else if (typeof value === 'number') {
118
+ const line = consumeOpCode(value);
119
+ line && lines.push(line);
120
+ }
121
+ else {
122
+ throw new Error('Unexpected value');
123
+ }
124
+ }
125
+ return lines;
126
+ }
127
+ class OpCodeParser {
128
+ constructor(codes) {
129
+ this.i = 0;
130
+ this.codes = codes;
131
+ }
132
+ hasMore() {
133
+ return this.i < this.codes.length;
134
+ }
135
+ consumeNumber() {
136
+ let value = this.codes[this.i++];
137
+ assertNumber(value, 'expecting number in OpCode');
138
+ return value;
139
+ }
140
+ consumeString() {
141
+ let value = this.codes[this.i++];
142
+ assertString(value, 'expecting string in OpCode');
143
+ return value;
144
+ }
145
+ consumeFunction() {
146
+ let value = this.codes[this.i++];
147
+ if (value === null || typeof value === 'function') {
148
+ return value;
149
+ }
150
+ throw new Error('expecting function in OpCode');
151
+ }
152
+ consumeNumberOrString() {
153
+ let value = this.codes[this.i++];
154
+ if (typeof value === 'string') {
155
+ return value;
156
+ }
157
+ assertNumber(value, 'expecting number or string in OpCode');
158
+ return value;
159
+ }
160
+ consumeNumberStringOrMarker() {
161
+ let value = this.codes[this.i++];
162
+ if (typeof value === 'string' || typeof value === 'number' || value == COMMENT_MARKER ||
163
+ value == ELEMENT_MARKER) {
164
+ return value;
165
+ }
166
+ assertNumber(value, 'expecting number, string, COMMENT_MARKER or ELEMENT_MARKER in OpCode');
167
+ return value;
168
+ }
169
+ }
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bl9kZWJ1Zy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaTE4bi9pMThuX2RlYnVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0QsT0FBTyxFQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsa0NBQWtDLEVBQUUsNkJBQTZCLEVBQUUsMEJBQTBCLEVBQTJFLE1BQU0sb0JBQW9CLENBQUM7QUFFM087Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUNQLE9BQTJCO0lBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RSxJQUFJLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFekIsU0FBUyxhQUFhLENBQUMsS0FBYTtRQUNsQyxNQUFNLEdBQUcsR0FBRyxLQUFLLHNCQUErQixDQUFDO1FBQ2pELE1BQU0sTUFBTSxHQUFHLEtBQUssc0JBQStCLENBQUM7UUFDcEQsUUFBUSxNQUFNLEVBQUU7WUFDZDtnQkFDRSxPQUFPLFVBQVUsR0FBRyw4QkFBOEIsQ0FBQztZQUNyRDtnQkFDRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xFLE9BQU8sVUFBVSxHQUFHLCtC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QUMsQ0FBQztRQUM1RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxJQUFJLGNBQWM7WUFDakYsS0FBSyxJQUFJLGNBQWMsRUFBRTtZQUMzQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsWUFBWSxDQUFDLEtBQUssRUFBRSxzRUFBc0UsQ0FBQyxDQUFDO1FBQzVGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7YXNzZXJ0TnVtYmVyLCBhc3NlcnRTdHJpbmd9IGZyb20gJy4uLy4uL3V0aWwvYXNzZXJ0JztcblxuaW1wb3J0IHtDT01NRU5UX01BUktFUiwgRUxFTUVOVF9NQVJLRVIsIGdldEluc3RydWN0aW9uRnJvbUkxOG5NdXRhdGVPcENvZGUsIGdldFBhcmVudEZyb21JMThuTXV0YXRlT3BDb2RlLCBnZXRSZWZGcm9tSTE4bk11dGF0ZU9wQ29kZSwgSTE4bk11dGF0ZU9wQ29kZSwgSTE4bk11dGF0ZU9wQ29kZXMsIEkxOG5VcGRhdGVPcENvZGUsIEkxOG5VcGRhdGVPcENvZGVzfSBmcm9tICcuLi9pbnRlcmZhY2VzL2kxOG4nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBJMThuVXBkYXRlT3BDb2Rlc2AgYXJyYXkgaW50byBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGF0dGFjaGVkIHRvIHRoZSBgSTE4blVwZGF0ZU9wQ29kZXMuZGVidWdgIHByb3BlcnR5IGlmIGBuZ0Rldk1vZGVgIGlzIGVuYWJsZWQuXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgaHVtYW4gcmVhZGFibGUgdmlldyBvZiB0aGUgb3Bjb2Rlcy4gVGhpcyBpcyB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgdGhlXG4gKiBhcHBsaWNhdGlvbiBhcyB3ZWxsIGFzIHdyaXRpbmcgbW9yZSByZWFkYWJsZSB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0gdGhpcyBgSTE4blVwZGF0ZU9wQ29kZXNgIGlmIGF0dGFjaGVkIGFzIGEgbWV0aG9kLlxuICogQHBhcmFtIG9wY29kZXMgYEkxOG5VcGRhdGVPcENvZGVzYCBpZiBpbnZva2VkIGFzIGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpMThuVXBkYXRlT3BDb2Rlc1RvU3RyaW5nKFxuICAgIHRoaXM6IEkxOG5VcGRhdGVPcENvZGVzfHZvaWQsIG9wY29kZXM/OiBJMThuVXBkYXRlT3BDb2Rlcyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IE9wQ29kZVBhcnNlcihvcGNvZGVzIHx8IChBcnJheS5pc0FycmF5KHRoaXMpID8gdGhpcyA6IFtdKSk7XG4gIGxldCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiBjb25zdW1lT3BDb2RlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZiA9IHZhbHVlID4+PiBJMThuVXBkYXRlT3BDb2RlLlNISUZUX1JFRjtcbiAgICBjb25zdCBvcENvZGUgPSB2YWx1ZSAmIEkxOG5VcGRhdGVPcENvZGUuTUFTS19PUENPREU7XG4gICAgc3dpdGNoIChvcENvZGUpIHtcbiAgICAgIGNhc2UgSTE4blVwZGF0ZU9wQ29kZS5UZXh0OlxuICAgICAgICByZXR1cm4gYChsVmlld1ske3JlZn1dIGFzIFRleHQpLnRleHRDb250ZW50ID0gJCQkYDtcbiAgICAgIGNhc2UgSTE4blVwZGF0ZU9wQ29kZS5BdHRyOlxuICAgICAgICBjb25zdCBhdHRyTmFtZSA9IHBhcnNlci5jb25zdW1lU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHNhbml0aXphdGlvbkZuID0gcGFyc2VyLmNvbnN1bWVGdW5jdGlvbigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNhbml0aXphdGlvbkZuID8gYCgke3Nhbml0aXphdGlvbkZufSkoJCQkKWAgOiAnJCQkJztcbiAgICAgICAgcmV0dXJuIGAobFZpZXdbJHtyZWZ9XSBhcyBFbGVtZW50KS5zZXRBdHRyaWJ1dGUoJyR7YXR0ck5hbWV9JywgJHt2YWx1ZX0pYDtcbiAgICAgIGNhc2UgSTE4blVwZGF0ZU9wQ29kZS5JY3VTd2l0Y2g6XG4gICAgICAgIHJldHVybiBgaWN1U3dpdGNoQ2FzZShsVmlld1ske3JlZn1dIGFzIENvbW1lbnQsICR7cGFyc2VyLmNvbnN1bWVOdW1iZXIoKX0sICQkJClgO1xuICAgICAgY2FzZSBJMThuVXBkYXRlT3BDb2RlLkljdVVwZGF0ZTpcbiAgICAgICAgcmV0dXJuIGBpY3VVcGRhdGVDYXNlKGxWaWV3WyR7cmVmfV0gYXMgQ29tbWVudCwgJHtwYXJzZXIuY29uc3VtZU51bWJlcigpfSlgO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgT3BDb2RlJyk7XG4gIH1cblxuXG4gIHdoaWxlIChwYXJzZXIuaGFzTW9yZSgpKSB7XG4gICAgbGV0IG1hc2sgPSBwYXJzZXIuY29uc3VtZU51bWJlcigpO1xuICAgIGxldCBzaXplID0gcGFyc2VyLmNvbnN1bWVOdW1iZXIoKTtcbiAgICBjb25zdCBlbmQgPSBwYXJzZXIuaSArIHNpemU7XG4gICAgY29uc3Qgc3RhdGVtZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc3RhdGVtZW50ID0gJyc7XG4gICAgd2hpbGUgKHBhcnNlci5pIDwgZW5kKSB7XG4gICAgICBsZXQgdmFsdWUgPSBwYXJzZXIuY29uc3VtZU51bWJlck9yU3RyaW5nKCk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzdGF0ZW1lbnQgKz0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAvLyBOZWdhdGl2ZSBudW1iZXJzIGFyZSByZWYgaW5kZXhlc1xuICAgICAgICBzdGF0ZW1lbnQgKz0gJyR7bFZpZXdbJyArICgwIC0gdmFsdWUpICsgJ119JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBvc2l0aXZlIG51bWJlcnMgYXJlIG9wZXJhdGlvbnMuXG4gICAgICAgIGNvbnN0IG9wQ29kZVRleHQgPSBjb25zdW1lT3BDb2RlKHZhbHVlKTtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoKG9wQ29kZVRleHQucmVwbGFjZSgnJCQkJywgJ2AnICsgc3RhdGVtZW50ICsgJ2AnKSArICc7Jyk7XG4gICAgICAgIHN0YXRlbWVudCA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICBsaW5lcy5wdXNoKGBpZiAobWFzayAmIDBiJHttYXNrLnRvU3RyaW5nKDIpfSkgeyAke3N0YXRlbWVudHMuam9pbignICcpfSB9YCk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBJMThuTXV0YWJsZU9wQ29kZXNgIGFycmF5IGludG8gYSBodW1hbiByZWFkYWJsZSBmb3JtYXQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBhdHRhY2hlZCB0byB0aGUgYEkxOG5NdXRhYmxlT3BDb2Rlcy5kZWJ1Z2AgaWYgYG5nRGV2TW9kZWAgaXMgZW5hYmxlZC4gVGhpc1xuICogZnVuY3Rpb24gcHJvdmlkZXMgYSBodW1hbiByZWFkYWJsZSB2aWV3IG9mIHRoZSBvcGNvZGVzLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZyB0aGVcbiAqIGFwcGxpY2F0aW9uIGFzIHdlbGwgYXMgd3JpdGluZyBtb3JlIHJlYWRhYmxlIHRlc3RzLlxuICpcbiAqIEBwYXJhbSB0aGlzIGBJMThuTXV0YWJsZU9wQ29kZXNgIGlmIGF0dGFjaGVkIGFzIGEgbWV0aG9kLlxuICogQHBhcmFtIG9wY29kZXMgYEkxOG5NdXRhYmxlT3BDb2Rlc2AgaWYgaW52b2tlZCBhcyBhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaTE4bk11dGF0ZU9wQ29kZXNUb1N0cmluZyhcbiAgICB0aGlzOiBJMThuTXV0YXRlT3BDb2Rlc3x2b2lkLCBvcGNvZGVzPzogSTE4bk11dGF0ZU9wQ29kZXMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBPcENvZGVQYXJzZXIob3Bjb2RlcyB8fCAoQXJyYXkuaXNBcnJheSh0aGlzKSA/IHRoaXMgOiBbXSkpO1xuICBsZXQgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZnVuY3Rpb24gY29uc3VtZU9wQ29kZShvcENvZGU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyZW50ID0gZ2V0UGFyZW50RnJvbUkxOG5NdXRhdGVPcENvZGUob3BDb2RlKTtcbiAgICBjb25zdCByZWYgPSBnZXRSZWZGcm9tSTE4bk11dGF0ZU9wQ29kZShvcENvZGUpO1xuICAgIHN3aXRjaCAoZ2V0SW5zdHJ1Y3Rpb25Gcm9tSTE4bk11dGF0ZU9wQ29kZShvcENvZGUpKSB7XG4gICAgICBjYXNlIEkxOG5NdXRhdGVPcENvZGUuU2VsZWN0OlxuICAgICAgICBsYXN0UmVmID0gcmVmO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICBjYXNlIEkxOG5NdXRhdGVPcENvZGUuQXBwZW5kQ2hpbGQ6XG4gICAgICAgIHJldHVybiBgKGxWaWV3WyR7cGFyZW50fV0gYXMgRWxlbWVudCkuYXBwZW5kQ2hpbGQobFZpZXdbJHtsYXN0UmVmfV0pYDtcbiAgICAgIGNhc2UgSTE4bk11dGF0ZU9wQ29kZS5SZW1vdmU6XG4gICAgICAgIHJldHVybiBgKGxWaWV3WyR7cGFyZW50fV0gYXMgRWxlbWVudCkucmVtb3ZlKGxWaWV3WyR7cmVmfV0pYDtcbiAgICAgIGNhc2UgSTE4bk11dGF0ZU9wQ29kZS5BdHRyOlxuICAgICAgICByZXR1cm4gYChsVmlld1ske3JlZn1dIGFzIEVsZW1lbnQpLnNldEF0dHJpYnV0ZShcIiR7cGFyc2VyLmNvbnN1bWVTdHJpbmcoKX1cIiwgXCIke1xuICAgICAgICAgICAgcGFyc2VyLmNvbnN1bWVTdHJpbmcoKX1cIilgO1xuICAgICAgY2FzZSBJMThuTXV0YXRlT3BDb2RlLkVsZW1lbnRFbmQ6XG4gICAgICAgIHJldHVybiBgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHRWaWV3LmRhdGFbJHtyZWZ9XSBhcyBUTm9kZSlgO1xuICAgICAgY2FzZSBJMThuTXV0YXRlT3BDb2RlLlJlbW92ZU5lc3RlZEljdTpcbiAgICAgICAgcmV0dXJuIGByZW1vdmVOZXN0ZWRJQ1UoJHtyZWZ9KWA7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBPcENvZGUnKTtcbiAgfVxuXG4gIGxldCBsYXN0UmVmID0gLTE7XG4gIHdoaWxlIChwYXJzZXIuaGFzTW9yZSgpKSB7XG4gICAgbGV0IHZhbHVlID0gcGFyc2VyLmNvbnN1bWVOdW1iZXJTdHJpbmdPck1hcmtlcigpO1xuICAgIGlmICh2YWx1ZSA9PT0gQ09NTUVOVF9NQVJLRVIpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBwYXJzZXIuY29uc3VtZVN0cmluZygpO1xuICAgICAgbGFzdFJlZiA9IHBhcnNlci5jb25zdW1lTnVtYmVyKCk7XG4gICAgICBsaW5lcy5wdXNoKGBsVmlld1ske2xhc3RSZWZ9XSA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCIke3RleHR9XCIpYCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gRUxFTUVOVF9NQVJLRVIpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBwYXJzZXIuY29uc3VtZVN0cmluZygpO1xuICAgICAgbGFzdFJlZiA9IHBhcnNlci5jb25zdW1lTnVtYmVyKCk7XG4gICAgICBsaW5lcy5wdXNoKGBsVmlld1ske2xhc3RSZWZ9XSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCIke3RleHR9XCIpYCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsYXN0UmVmID0gcGFyc2VyLmNvbnN1bWVOdW1iZXIoKTtcbiAgICAgIGxpbmVzLnB1c2goYGxWaWV3WyR7bGFzdFJlZn1dID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIke3ZhbHVlfVwiKWApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgbGluZSA9IGNvbnN1bWVPcENvZGUodmFsdWUpO1xuICAgICAgbGluZSAmJiBsaW5lcy5wdXNoKGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdmFsdWUnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGluZXM7XG59XG5cblxuY2xhc3MgT3BDb2RlUGFyc2VyIHtcbiAgaTogbnVtYmVyID0gMDtcbiAgY29kZXM6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvZGVzOiBhbnlbXSkge1xuICAgIHRoaXMuY29kZXMgPSBjb2RlcztcbiAgfVxuXG4gIGhhc01vcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaSA8IHRoaXMuY29kZXMubGVuZ3RoO1xuICB9XG5cbiAgY29uc3VtZU51bWJlcigpOiBudW1iZXIge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY29kZXNbdGhpcy5pKytdO1xuICAgIGFzc2VydE51bWJlcih2YWx1ZSwgJ2V4cGVjdGluZyBudW1iZXIgaW4gT3BDb2RlJyk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3VtZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY29kZXNbdGhpcy5pKytdO1xuICAgIGFzc2VydFN0cmluZyh2YWx1ZSwgJ2V4cGVjdGluZyBzdHJpbmcgaW4gT3BDb2RlJyk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3VtZUZ1bmN0aW9uKCk6IEZ1bmN0aW9ufG51bGwge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY29kZXNbdGhpcy5pKytdO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgZnVuY3Rpb24gaW4gT3BDb2RlJyk7XG4gIH1cblxuICBjb25zdW1lTnVtYmVyT3JTdHJpbmcoKTogbnVtYmVyfHN0cmluZyB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5jb2Rlc1t0aGlzLmkrK107XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgYXNzZXJ0TnVtYmVyKHZhbHVlLCAnZXhwZWN0aW5nIG51bWJlciBvciBzdHJpbmcgaW4gT3BDb2RlJyk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3VtZU51bWJlclN0cmluZ09yTWFya2VyKCk6IG51bWJlcnxzdHJpbmd8Q09NTUVOVF9NQVJLRVJ8RUxFTUVOVF9NQVJLRVIge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY29kZXNbdGhpcy5pKytdO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgPT0gQ09NTUVOVF9NQVJLRVIgfHxcbiAgICAgICAgdmFsdWUgPT0gRUxFTUVOVF9NQVJLRVIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgYXNzZXJ0TnVtYmVyKHZhbHVlLCAnZXhwZWN0aW5nIG51bWJlciwgc3RyaW5nLCBDT01NRU5UX01BUktFUiBvciBFTEVNRU5UX01BUktFUiBpbiBPcENvZGUnKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { DEFAULT_LOCALE_ID } from '../../i18n/localization';
9
+ import { assertDefined } from '../../util/assert';
10
+ /**
11
+ * The locale id that the application is currently using (for translations and ICU expressions).
12
+ * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
13
+ * but is now defined as a global value.
14
+ */
15
+ let LOCALE_ID = DEFAULT_LOCALE_ID;
16
+ /**
17
+ * Sets the locale id that will be used for translations and ICU expressions.
18
+ * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
19
+ * but is now defined as a global value.
20
+ *
21
+ * @param localeId
22
+ */
23
+ export function setLocaleId(localeId) {
24
+ assertDefined(localeId, `Expected localeId to be defined`);
25
+ if (typeof localeId === 'string') {
26
+ LOCALE_ID = localeId.toLowerCase().replace(/_/g, '-');
27
+ }
28
+ }
29
+ /**
30
+ * Gets the locale id that will be used for translations and ICU expressions.
31
+ * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
32
+ * but is now defined as a global value.
33
+ */
34
+ export function getLocaleId() {
35
+ return LOCALE_ID;
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bl9sb2NhbGVfaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2kxOG4vaTE4bl9sb2NhbGVfaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBR2hEOzs7O0dBSUc7QUFDSCxJQUFJLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLFFBQWdCO0lBQzFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUMzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUNoQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDdkQ7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtERUZBVUxUX0xPQ0FMRV9JRH0gZnJvbSAnLi4vLi4vaTE4bi9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHthc3NlcnREZWZpbmVkfSBmcm9tICcuLi8uLi91dGlsL2Fzc2VydCc7XG5cblxuLyoqXG4gKiBUaGUgbG9jYWxlIGlkIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSB1c2luZyAoZm9yIHRyYW5zbGF0aW9ucyBhbmQgSUNVIGV4cHJlc3Npb25zKS5cbiAqIFRoaXMgaXMgdGhlIGl2eSB2ZXJzaW9uIG9mIGBMT0NBTEVfSURgIHRoYXQgd2FzIGRlZmluZWQgYXMgYW4gaW5qZWN0aW9uIHRva2VuIGZvciB0aGUgdmlldyBlbmdpbmVcbiAqIGJ1dCBpcyBub3cgZGVmaW5lZCBhcyBhIGdsb2JhbCB2YWx1ZS5cbiAqL1xubGV0IExPQ0FMRV9JRCA9IERFRkFVTFRfTE9DQUxFX0lEO1xuXG4vKipcbiAqIFNldHMgdGhlIGxvY2FsZSBpZCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdHJhbnNsYXRpb25zIGFuZCBJQ1UgZXhwcmVzc2lvbnMuXG4gKiBUaGlzIGlzIHRoZSBpdnkgdmVyc2lvbiBvZiBgTE9DQUxFX0lEYCB0aGF0IHdhcyBkZWZpbmVkIGFzIGFuIGluamVjdGlvbiB0b2tlbiBmb3IgdGhlIHZpZXcgZW5naW5lXG4gKiBidXQgaXMgbm93IGRlZmluZWQgYXMgYSBnbG9iYWwgdmFsdWUuXG4gKlxuICogQHBhcmFtIGxvY2FsZUlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGVJZChsb2NhbGVJZDogc3RyaW5nKSB7XG4gIGFzc2VydERlZmluZWQobG9jYWxlSWQsIGBFeHBlY3RlZCBsb2NhbGVJZCB0byBiZSBkZWZpbmVkYCk7XG4gIGlmICh0eXBlb2YgbG9jYWxlSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgTE9DQUxFX0lEID0gbG9jYWxlSWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsb2NhbGUgaWQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRyYW5zbGF0aW9ucyBhbmQgSUNVIGV4cHJlc3Npb25zLlxuICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZVxuICogYnV0IGlzIG5vdyBkZWZpbmVkIGFzIGEgZ2xvYmFsIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxlSWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIExPQ0FMRV9JRDtcbn1cbiJdfQ==