@angular/localize 15.0.0-next.6 → 15.0.0-rc.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 (36) hide show
  1. package/esm2020/init/index.mjs +1 -1
  2. package/esm2020/localize.mjs +1 -2
  3. package/fesm2015/init.mjs +1 -1
  4. package/fesm2015/init.mjs.map +1 -1
  5. package/fesm2015/localize.mjs +1 -1
  6. package/fesm2015/localize.mjs.map +1 -1
  7. package/fesm2020/init.mjs +1 -1
  8. package/fesm2020/init.mjs.map +1 -1
  9. package/fesm2020/localize.mjs +1 -1
  10. package/fesm2020/localize.mjs.map +1 -1
  11. package/index.d.ts +6 -484
  12. package/init/index.d.ts +16 -103
  13. package/localize.d.ts +107 -0
  14. package/package.json +3 -3
  15. package/private.d.ts +10 -0
  16. package/schematics/ng-add/index.d.ts +1 -2
  17. package/schematics/ng-add/index.js +44 -66
  18. package/src/localize/index.d.ts +10 -0
  19. package/src/localize/src/global.d.ts +17 -0
  20. package/src/localize/src/localize.d.ts +139 -0
  21. package/src/translate.d.ts +62 -0
  22. package/src/utils/index.d.ts +11 -0
  23. package/src/utils/src/constants.d.ts +58 -0
  24. package/src/utils/src/messages.d.ts +240 -0
  25. package/src/utils/src/translations.d.ts +59 -0
  26. package/tools/bundles/{chunk-B2TZRIF5.js → chunk-G27PJM3A.js} +18 -18
  27. package/tools/bundles/{chunk-B2TZRIF5.js.map → chunk-G27PJM3A.js.map} +0 -0
  28. package/tools/bundles/{chunk-HS5BMNX3.js → chunk-KDBNAH7Y.js} +18 -18
  29. package/tools/bundles/{chunk-HS5BMNX3.js.map → chunk-KDBNAH7Y.js.map} +0 -0
  30. package/tools/bundles/{chunk-N3C6NOYD.js → chunk-NGRPHNS5.js} +5 -5
  31. package/tools/bundles/{chunk-N3C6NOYD.js.map → chunk-NGRPHNS5.js.map} +0 -0
  32. package/tools/bundles/index.js +4 -4
  33. package/tools/bundles/src/extract/cli.js +5 -5
  34. package/tools/bundles/src/migrate/cli.js +5 -5
  35. package/tools/bundles/src/translate/cli.js +11 -11
  36. package/tools/bundles_metadata.json +1 -1
package/localize.d.ts ADDED
@@ -0,0 +1,107 @@
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
+ /// <amd-module name="@angular/localize/localize" />
9
+ import { LocalizeFn } from './src/localize';
10
+ export { clearTranslations, loadTranslations } from './src/translate';
11
+ export { MessageId, TargetMessage } from './src/utils';
12
+ export * from './private';
13
+ declare global {
14
+ /**
15
+ * Tag a template literal string for localization.
16
+ *
17
+ * For example:
18
+ *
19
+ * ```ts
20
+ * $localize `some string to localize`
21
+ * ```
22
+ *
23
+ * **Providing meaning, description and id**
24
+ *
25
+ * You can optionally specify one or more of `meaning`, `description` and `id` for a localized
26
+ * string by pre-pending it with a colon delimited block of the form:
27
+ *
28
+ * ```ts
29
+ * $localize`:meaning|description@@id:source message text`;
30
+ *
31
+ * $localize`:meaning|:source message text`;
32
+ * $localize`:description:source message text`;
33
+ * $localize`:@@id:source message text`;
34
+ * ```
35
+ *
36
+ * This format is the same as that used for `i18n` markers in Angular templates. See the
37
+ * [Angular i18n guide](guide/i18n-common-prepare#mark-text-in-component-template).
38
+ *
39
+ * **Naming placeholders**
40
+ *
41
+ * If the template literal string contains expressions, then the expressions will be automatically
42
+ * associated with placeholder names for you.
43
+ *
44
+ * For example:
45
+ *
46
+ * ```ts
47
+ * $localize `Hi ${name}! There are ${items.length} items.`;
48
+ * ```
49
+ *
50
+ * will generate a message-source of `Hi {$PH}! There are {$PH_1} items`.
51
+ *
52
+ * The recommended practice is to name the placeholder associated with each expression though.
53
+ *
54
+ * Do this by providing the placeholder name wrapped in `:` characters directly after the
55
+ * expression. These placeholder names are stripped out of the rendered localized string.
56
+ *
57
+ * For example, to name the `items.length` expression placeholder `itemCount` you write:
58
+ *
59
+ * ```ts
60
+ * $localize `There are ${items.length}:itemCount: items`;
61
+ * ```
62
+ *
63
+ * **Escaping colon markers**
64
+ *
65
+ * If you need to use a `:` character directly at the start of a tagged string that has no
66
+ * metadata block, or directly after a substitution expression that has no name you must escape
67
+ * the `:` by preceding it with a backslash:
68
+ *
69
+ * For example:
70
+ *
71
+ * ```ts
72
+ * // message has a metadata block so no need to escape colon
73
+ * $localize `:some description::this message starts with a colon (:)`;
74
+ * // no metadata block so the colon must be escaped
75
+ * $localize `\:this message starts with a colon (:)`;
76
+ * ```
77
+ *
78
+ * ```ts
79
+ * // named substitution so no need to escape colon
80
+ * $localize `${label}:label:: ${}`
81
+ * // anonymous substitution so colon must be escaped
82
+ * $localize `${label}\: ${}`
83
+ * ```
84
+ *
85
+ * **Processing localized strings:**
86
+ *
87
+ * There are three scenarios:
88
+ *
89
+ * * **compile-time inlining**: the `$localize` tag is transformed at compile time by a
90
+ * transpiler, removing the tag and replacing the template literal string with a translated
91
+ * literal string from a collection of translations provided to the transpilation tool.
92
+ *
93
+ * * **run-time evaluation**: the `$localize` tag is a run-time function that replaces and
94
+ * reorders the parts (static strings and expressions) of the template literal string with strings
95
+ * from a collection of translations loaded at run-time.
96
+ *
97
+ * * **pass-through evaluation**: the `$localize` tag is a run-time function that simply evaluates
98
+ * the original template literal string without applying any translations to the parts. This
99
+ * version is used during development or where there is no need to translate the localized
100
+ * template literals.
101
+ *
102
+ * @param messageParts a collection of the static parts of the template string.
103
+ * @param expressions a collection of the values of each placeholder in the template string.
104
+ * @returns the translated string, with the `messageParts` and `expressions` interleaved together.
105
+ */
106
+ const $localize: LocalizeFn;
107
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/localize",
3
- "version": "15.0.0-next.6",
3
+ "version": "15.0.0-rc.0",
4
4
  "description": "Angular - library for localizing messages",
5
5
  "bin": {
6
6
  "localize-translate": "./tools/bundles/src/translate/cli.js",
@@ -76,8 +76,8 @@
76
76
  "yargs": "^17.2.1"
77
77
  },
78
78
  "peerDependencies": {
79
- "@angular/compiler": "15.0.0-next.6",
80
- "@angular/compiler-cli": "15.0.0-next.6"
79
+ "@angular/compiler": "15.0.0-rc.0",
80
+ "@angular/compiler-cli": "15.0.0-rc.0"
81
81
  },
82
82
  "fesm2020": "./fesm2020/localize.mjs",
83
83
  "fesm2015": "./fesm2015/localize.mjs",
package/private.d.ts ADDED
@@ -0,0 +1,10 @@
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
+ /// <amd-module name="@angular/localize/private" />
9
+ export { $localize as ɵ$localize, _global as ɵ_global, LocalizeFn as ɵLocalizeFn, TranslateFn as ɵTranslateFn } from './src/localize';
10
+ export { computeMsgId as ɵcomputeMsgId, findEndOfBlock as ɵfindEndOfBlock, isMissingTranslationError as ɵisMissingTranslationError, makeParsedTranslation as ɵmakeParsedTranslation, makeTemplateObject as ɵmakeTemplateObject, MissingTranslationError as ɵMissingTranslationError, ParsedMessage as ɵParsedMessage, ParsedTranslation as ɵParsedTranslation, ParsedTranslations as ɵParsedTranslations, parseMessage as ɵparseMessage, parseMetadata as ɵparseMetadata, parseTranslation as ɵparseTranslation, SourceLocation as ɵSourceLocation, SourceMessage as ɵSourceMessage, splitBlock as ɵsplitBlock, translate as ɵtranslate } from './src/utils';
@@ -5,10 +5,9 @@
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  *
8
- * @fileoverview Schematics for ng-new project that builds with Bazel.
8
+ * @fileoverview Schematics for `ng add @angular/localize` schematic.
9
9
  */
10
10
  /// <amd-module name="@angular/localize/schematics/ng-add" />
11
11
  import { Rule } from '@angular-devkit/schematics';
12
12
  import { Schema } from './schema';
13
- export declare const localizePolyfill = "@angular/localize/init";
14
13
  export default function (options: Schema): Rule;
@@ -5,7 +5,7 @@
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  *
8
- * @fileoverview Schematics for ng-new project that builds with Bazel.
8
+ * @fileoverview Schematics for `ng add @angular/localize` schematic.
9
9
  */
10
10
  (function (factory) {
11
11
  if (typeof module === "object" && typeof module.exports === "object") {
@@ -13,95 +13,74 @@
13
13
  if (v !== undefined) module.exports = v;
14
14
  }
15
15
  else if (typeof define === "function" && define.amd) {
16
- define("@angular/localize/schematics/ng-add", ["require", "exports", "tslib", "@angular-devkit/core", "@angular-devkit/schematics", "@angular-devkit/schematics/tasks", "@schematics/angular/utility/dependencies", "@schematics/angular/utility/workspace", "@schematics/angular/utility/workspace-models"], factory);
16
+ define("@angular/localize/schematics/ng-add", ["require", "exports", "tslib", "@angular-devkit/schematics", "@angular-devkit/schematics/tasks", "@schematics/angular/utility/dependencies", "@schematics/angular/utility/json-file", "@schematics/angular/utility/workspace", "@schematics/angular/utility/workspace-models"], factory);
17
17
  }
18
18
  })(function (require, exports) {
19
19
  "use strict";
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.localizePolyfill = void 0;
22
21
  const tslib_1 = require("tslib");
23
- const core_1 = require("@angular-devkit/core");
24
22
  const schematics_1 = require("@angular-devkit/schematics");
25
23
  const tasks_1 = require("@angular-devkit/schematics/tasks");
26
24
  const dependencies_1 = require("@schematics/angular/utility/dependencies");
25
+ const json_file_1 = require("@schematics/angular/utility/json-file");
27
26
  const workspace_1 = require("@schematics/angular/utility/workspace");
28
27
  const workspace_models_1 = require("@schematics/angular/utility/workspace-models");
29
- exports.localizePolyfill = `@angular/localize/init`;
30
- function prependToMainFiles(projectName) {
28
+ const localizeType = `@angular/localize`;
29
+ function addTypeScriptConfigTypes(projectName) {
31
30
  return (host) => tslib_1.__awaiter(this, void 0, void 0, function* () {
31
+ var _a, _b;
32
32
  const workspace = yield (0, workspace_1.getWorkspace)(host);
33
33
  const project = workspace.projects.get(projectName);
34
34
  if (!project) {
35
- throw new schematics_1.SchematicsException(`Invalid project name (${projectName})`);
35
+ throw new schematics_1.SchematicsException(`Invalid project name '${projectName}'.`);
36
36
  }
37
- const fileList = new Set();
37
+ // We add the root workspace tsconfig for better IDE support.
38
+ const tsConfigFiles = new Set(['tsconfig.json']);
38
39
  for (const target of project.targets.values()) {
39
- if (target.builder !== workspace_models_1.Builders.Server) {
40
- continue;
41
- }
42
- for (const [, options] of (0, workspace_1.allTargetOptions)(target)) {
43
- const value = options['main'];
44
- if (typeof value === 'string') {
45
- fileList.add(value);
46
- }
40
+ switch (target.builder) {
41
+ case workspace_models_1.Builders.Karma:
42
+ case workspace_models_1.Builders.Server:
43
+ case workspace_models_1.Builders.Browser:
44
+ const value = (_a = target.options) === null || _a === void 0 ? void 0 : _a['tsConfig'];
45
+ if (typeof value === 'string') {
46
+ tsConfigFiles.add(value);
47
+ }
48
+ break;
47
49
  }
48
50
  }
49
- for (const path of fileList) {
50
- const content = host.readText(path);
51
- if (content.includes(exports.localizePolyfill)) {
52
- // If the file already contains the polyfill (or variations), ignore it too.
51
+ const typesJsonPath = ['compilerOptions', 'types'];
52
+ for (const path of tsConfigFiles) {
53
+ if (!host.exists(path)) {
53
54
  continue;
54
55
  }
55
- // Add string at the start of the file.
56
- const recorder = host.beginUpdate(path);
57
- const localizeStr = core_1.tags.stripIndents `/***************************************************************************************************
58
- * Load \`$localize\` onto the global scope - used if i18n tags appear in Angular templates.
59
- */
60
- import '${exports.localizePolyfill}';
61
- `;
62
- recorder.insertLeft(0, localizeStr);
63
- host.commitUpdate(recorder);
64
- }
65
- });
66
- }
67
- function addToPolyfillsOption(projectName) {
68
- return (0, workspace_1.updateWorkspace)((workspace) => {
69
- var _a, _b;
70
- var _c;
71
- const project = workspace.projects.get(projectName);
72
- if (!project) {
73
- throw new schematics_1.SchematicsException(`Invalid project name (${projectName})`);
74
- }
75
- for (const target of project.targets.values()) {
76
- if (target.builder !== workspace_models_1.Builders.Browser && target.builder !== workspace_models_1.Builders.Karma) {
77
- continue;
56
+ const json = new json_file_1.JSONFile(host, path);
57
+ const types = (_b = json.get(typesJsonPath)) !== null && _b !== void 0 ? _b : [];
58
+ if (!Array.isArray(types)) {
59
+ throw new schematics_1.SchematicsException(`TypeScript configuration file '${path}' has an invalid 'types' property. It must be an array.`);
78
60
  }
79
- (_a = target.options) !== null && _a !== void 0 ? _a : (target.options = {});
80
- (_b = (_c = target.options)['polyfills']) !== null && _b !== void 0 ? _b : (_c['polyfills'] = [exports.localizePolyfill]);
81
- for (const [, options] of (0, workspace_1.allTargetOptions)(target)) {
82
- // Convert polyfills option to array.
83
- const polyfillsValue = typeof options['polyfills'] === 'string' ? [options['polyfills']] :
84
- options['polyfills'];
85
- if (Array.isArray(polyfillsValue) && !polyfillsValue.includes(exports.localizePolyfill)) {
86
- options['polyfills'] = [...polyfillsValue, exports.localizePolyfill];
87
- }
61
+ const hasLocalizeType = types.some((t) => t === localizeType || t === '@angular/localize/init');
62
+ if (hasLocalizeType) {
63
+ // Skip has already localize type.
64
+ continue;
88
65
  }
66
+ json.modify(typesJsonPath, [...types, localizeType]);
89
67
  }
90
68
  });
91
69
  }
92
70
  function moveToDependencies(host, context) {
93
- if (host.exists('package.json')) {
94
- // Remove the previous dependency and add in a new one under the desired type.
95
- (0, dependencies_1.removePackageJsonDependency)(host, '@angular/localize');
96
- (0, dependencies_1.addPackageJsonDependency)(host, {
97
- name: '@angular/localize',
98
- type: dependencies_1.NodeDependencyType.Default,
99
- version: `~15.0.0-next.6`,
100
- });
101
- // Add a task to run the package manager. This is necessary because we updated
102
- // "package.json" and we want lock files to reflect this.
103
- context.addTask(new tasks_1.NodePackageInstallTask());
71
+ if (!host.exists('package.json')) {
72
+ return;
104
73
  }
74
+ // Remove the previous dependency and add in a new one under the desired type.
75
+ (0, dependencies_1.removePackageJsonDependency)(host, '@angular/localize');
76
+ (0, dependencies_1.addPackageJsonDependency)(host, {
77
+ name: '@angular/localize',
78
+ type: dependencies_1.NodeDependencyType.Default,
79
+ version: `~15.0.0-rc.0`,
80
+ });
81
+ // Add a task to run the package manager. This is necessary because we updated
82
+ // "package.json" and we want lock files to reflect this.
83
+ context.addTask(new tasks_1.NodePackageInstallTask());
105
84
  }
106
85
  function default_1(options) {
107
86
  return () => {
@@ -113,8 +92,7 @@
113
92
  throw new schematics_1.SchematicsException('Option "project" is required.');
114
93
  }
115
94
  return (0, schematics_1.chain)([
116
- prependToMainFiles(projectName),
117
- addToPolyfillsOption(projectName),
95
+ addTypeScriptConfigTypes(projectName),
118
96
  // If `$localize` will be used at runtime then must install `@angular/localize`
119
97
  // into `dependencies`, rather than the default of `devDependencies`.
120
98
  options.useAtRuntime ? moveToDependencies : (0, schematics_1.noop)(),
@@ -123,4 +101,4 @@
123
101
  }
124
102
  exports.default = default_1;
125
103
  });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sb2NhbGl6ZS9zY2hlbWF0aWNzL25nLWFkZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRzs7Ozs7Ozs7Ozs7Ozs7SUFFSCwrQ0FBMEM7SUFDMUMsMkRBQTJHO0lBQzNHLDREQUF3RTtJQUN4RSwyRUFBb0k7SUFDcEkscUVBQXVHO0lBQ3ZHLG1GQUFzRTtJQUl6RCxRQUFBLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDO0lBRXpELFNBQVMsa0JBQWtCLENBQUMsV0FBbUI7UUFDN0MsT0FBTyxDQUFPLElBQVUsRUFBRSxFQUFFO1lBQzFCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSx3QkFBWSxFQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLGdDQUFtQixDQUFDLHlCQUF5QixXQUFXLEdBQUcsQ0FBQyxDQUFDO2FBQ3hFO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUNuQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQzdDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSywyQkFBUSxDQUFDLE1BQU0sRUFBRTtvQkFDdEMsU0FBUztpQkFDVjtnQkFFRCxLQUFLLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUEsNEJBQWdCLEVBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ2xELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7d0JBQzdCLFFB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LDhCQUFzQixFQUFFLENBQUMsQ0FBQztTQUMvQztJQUNILENBQUM7SUFFRCxtQkFBd0IsT0FBZTtRQUNyQyxPQUFPLEdBQUcsRUFBRTs7WUFDViw0REFBNEQ7WUFDNUQsMEVBQTBFO1lBQzFFLE1BQU0sV0FBVyxHQUFHLE1BQUEsT0FBTyxDQUFDLElBQUksbUNBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUVwRCxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNoQixNQUFNLElBQUksZ0NBQW1CLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUNoRTtZQUVELE9BQU8sSUFBQSxrQkFBSyxFQUFDO2dCQUNYLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztnQkFDL0Isb0JBQW9CLENBQUMsV0FBVyxDQUFDO2dCQUNqQywrRUFBK0U7Z0JBQy9FLHFFQUFxRTtnQkFDckUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUEsaUJBQUksR0FBRTthQUNuRCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDSixDQUFDO0lBbEJELDRCQWtCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqXG4gKiBAZmlsZW92ZXJ2aWV3IFNjaGVtYXRpY3MgZm9yIG5nLW5ldyBwcm9qZWN0IHRoYXQgYnVpbGRzIHdpdGggQmF6ZWwuXG4gKi9cblxuaW1wb3J0IHt0YWdzfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQge2NoYWluLCBub29wLCBSdWxlLCBTY2hlbWF0aWNDb250ZXh0LCBTY2hlbWF0aWNzRXhjZXB0aW9uLCBUcmVlLH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3MnO1xuaW1wb3J0IHtOb2RlUGFja2FnZUluc3RhbGxUYXNrfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy90YXNrcyc7XG5pbXBvcnQge2FkZFBhY2thZ2VKc29uRGVwZW5kZW5jeSwgTm9kZURlcGVuZGVuY3lUeXBlLCByZW1vdmVQYWNrYWdlSnNvbkRlcGVuZGVuY3ksfSBmcm9tICdAc2NoZW1hdGljcy9hbmd1bGFyL3V0aWxpdHkvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7YWxsVGFyZ2V0T3B0aW9ucywgZ2V0V29ya3NwYWNlLCB1cGRhdGVXb3Jrc3BhY2UsfSBmcm9tICdAc2NoZW1hdGljcy9hbmd1bGFyL3V0aWxpdHkvd29ya3NwYWNlJztcbmltcG9ydCB7QnVpbGRlcnN9IGZyb20gJ0BzY2hlbWF0aWNzL2FuZ3VsYXIvdXRpbGl0eS93b3Jrc3BhY2UtbW9kZWxzJztcblxuaW1wb3J0IHtTY2hlbWF9IGZyb20gJy4vc2NoZW1hJztcblxuZXhwb3J0IGNvbnN0IGxvY2FsaXplUG9seWZpbGwgPSBgQGFuZ3VsYXIvbG9jYWxpemUvaW5pdGA7XG5cbmZ1bmN0aW9uIHByZXBlbmRUb01haW5GaWxlcyhwcm9qZWN0TmFtZTogc3RyaW5nKTogUnVsZSB7XG4gIHJldHVybiBhc3luYyAoaG9zdDogVHJlZSkgPT4ge1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IGF3YWl0IGdldFdvcmtzcGFjZShob3N0KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gd29ya3NwYWNlLnByb2plY3RzLmdldChwcm9qZWN0TmFtZSk7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihgSW52YWxpZCBwcm9qZWN0IG5hbWUgKCR7cHJvamVjdE5hbWV9KWApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVMaXN0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgcHJvamVjdC50YXJnZXRzLnZhbHVlcygpKSB7XG4gICAgICBpZiAodGFyZ2V0LmJ1aWxkZXIgIT09IEJ1aWxkZXJzLlNlcnZlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBbLCBvcHRpb25zXSBvZiBhbGxUYXJnZXRPcHRpb25zKHRhcmdldCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zWydtYWluJ107XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZmlsZUxpc3QuYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlTGlzdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGhvc3QucmVhZFRleHQocGF0aCk7XG4gICAgICBpZiAoY29udGVudC5pbmNsdWRlcyhsb2NhbGl6ZVBvbHlmaWxsKSkge1xuICAgICAgICAvLyBJZiB0aGUgZmlsZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBwb2x5ZmlsbCAob3IgdmFyaWF0aW9ucyksIGlnbm9yZSBpdCB0b28uXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgc3RyaW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZS5cbiAgICAgIGNvbnN0IHJlY29yZGVyID0gaG9zdC5iZWdpblVwZGF0ZShwYXRoKTtcblxuICAgICAgY29uc3QgbG9jYWxpemVTdHIgPVxuICAgICAgICAgIHRhZ3Muc3RyaXBJbmRlbnRzYC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKiBMb2FkIFxcYCRsb2NhbGl6ZVxcYCBvbnRvIHRoZSBnbG9iYWwgc2NvcGUgLSB1c2VkIGlmIGkxOG4gdGFncyBhcHBlYXIgaW4gQW5ndWxhciB0ZW1wbGF0ZXMuXG4gICAgICovXG4gICAgIGltcG9ydCAnJHtsb2NhbGl6ZVBvbHlmaWxsfSc7XG4gICAgYDtcbiAgICAgIHJlY29yZGVyLmluc2VydExlZnQoMCwgbG9jYWxpemVTdHIpO1xuICAgICAgaG9zdC5jb21taXRVcGRhdGUocmVjb3JkZXIpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkVG9Qb2x5ZmlsbHNPcHRpb24ocHJvamVjdE5hbWU6IHN0cmluZyk6IFJ1bGUge1xuICByZXR1cm4gdXBkYXRlV29ya3NwYWNlKCh3b3Jrc3BhY2UpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0ID0gd29ya3NwYWNlLnByb2plY3RzLmdldChwcm9qZWN0TmFtZSk7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihgSW52YWxpZCBwcm9qZWN0IG5hbWUgKCR7cHJvamVjdE5hbWV9KWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb2plY3QudGFyZ2V0cy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHRhcmdldC5idWlsZGVyICE9PSBCdWlsZGVycy5Ccm93c2VyICYmIHRhcmdldC5idWlsZGVyICE9PSBCdWlsZGVycy5LYXJtYSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0Lm9wdGlvbnMgPz89IHt9O1xuICAgICAgdGFyZ2V0Lm9wdGlvbnNbJ3BvbHlmaWxscyddID8/PSBbbG9jYWxpemVQb2x5ZmlsbF07XG5cbiAgICAgIGZvciAoY29uc3QgWywgb3B0aW9uc10gb2YgYWxsVGFyZ2V0T3B0aW9ucyh0YXJnZXQpKSB7XG4gICAgICAgIC8vIENvbnZlcnQgcG9seWZpbGxzIG9wdGlvbiB0byBhcnJheS5cbiAgICAgICAgY29uc3QgcG9seWZpbGxzVmFsdWUgPSB0eXBlb2Ygb3B0aW9uc1sncG9seWZpbGxzJ10gPT09ICdzdHJpbmcnID8gW29wdGlvbnNbJ3BvbHlmaWxscyddXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbJ3BvbHlmaWxscyddO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwb2x5ZmlsbHNWYWx1ZSkgJiYgIXBvbHlmaWxsc1ZhbHVlLmluY2x1ZGVzKGxvY2FsaXplUG9seWZpbGwpKSB7XG4gICAgICAgICAgb3B0aW9uc1sncG9seWZpbGxzJ10gPSBbLi4ucG9seWZpbGxzVmFsdWUsIGxvY2FsaXplUG9seWZpbGxdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gbW92ZVRvRGVwZW5kZW5jaWVzKGhvc3Q6IFRyZWUsIGNvbnRleHQ6IFNjaGVtYXRpY0NvbnRleHQpOiB2b2lkIHtcbiAgaWYgKGhvc3QuZXhpc3RzKCdwYWNrYWdlLmpzb24nKSkge1xuICAgIC8vIFJlbW92ZSB0aGUgcHJldmlvdXMgZGVwZW5kZW5jeSBhbmQgYWRkIGluIGEgbmV3IG9uZSB1bmRlciB0aGUgZGVzaXJlZCB0eXBlLlxuICAgIHJlbW92ZVBhY2thZ2VKc29uRGVwZW5kZW5jeShob3N0LCAnQGFuZ3VsYXIvbG9jYWxpemUnKTtcbiAgICBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY3koaG9zdCwge1xuICAgICAgbmFtZTogJ0Bhbmd1bGFyL2xvY2FsaXplJyxcbiAgICAgIHR5cGU6IE5vZGVEZXBlbmRlbmN5VHlwZS5EZWZhdWx0LFxuICAgICAgdmVyc2lvbjogYH4wLjAuMC1QTEFDRUhPTERFUmAsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYSB0YXNrIHRvIHJ1biB0aGUgcGFja2FnZSBtYW5hZ2VyLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVwZGF0ZWRcbiAgICAvLyBcInBhY2thZ2UuanNvblwiIGFuZCB3ZSB3YW50IGxvY2sgZmlsZXMgdG8gcmVmbGVjdCB0aGlzLlxuICAgIGNvbnRleHQuYWRkVGFzayhuZXcgTm9kZVBhY2thZ2VJbnN0YWxsVGFzaygpKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvcHRpb25zOiBTY2hlbWEpOiBSdWxlIHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICAvLyBXZSBmYXZvciB0aGUgbmFtZSBvcHRpb24gYmVjYXVzZSB0aGUgcHJvamVjdCBvcHRpb24gaGFzIGFcbiAgICAvLyBzbWFydCBkZWZhdWx0IHdoaWNoIGNhbiBiZSBwb3B1bGF0ZWQgZXZlbiB3aGVuIHVuc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxuICAgIGNvbnN0IHByb2plY3ROYW1lID0gb3B0aW9ucy5uYW1lID8/IG9wdGlvbnMucHJvamVjdDtcblxuICAgIGlmICghcHJvamVjdE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWF0aWNzRXhjZXB0aW9uKCdPcHRpb24gXCJwcm9qZWN0XCIgaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYWluKFtcbiAgICAgIHByZXBlbmRUb01haW5GaWxlcyhwcm9qZWN0TmFtZSksXG4gICAgICBhZGRUb1BvbHlmaWxsc09wdGlvbihwcm9qZWN0TmFtZSksXG4gICAgICAvLyBJZiBgJGxvY2FsaXplYCB3aWxsIGJlIHVzZWQgYXQgcnVudGltZSB0aGVuIG11c3QgaW5zdGFsbCBgQGFuZ3VsYXIvbG9jYWxpemVgXG4gICAgICAvLyBpbnRvIGBkZXBlbmRlbmNpZXNgLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBvZiBgZGV2RGVwZW5kZW5jaWVzYC5cbiAgICAgIG9wdGlvbnMudXNlQXRSdW50aW1lID8gbW92ZVRvRGVwZW5kZW5jaWVzIDogbm9vcCgpLFxuICAgIF0pO1xuICB9O1xufVxuIl19
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sb2NhbGl6ZS9zY2hlbWF0aWNzL25nLWFkZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRzs7Ozs7Ozs7Ozs7OztJQUVILDJEQUEyRztJQUMzRyw0REFBd0U7SUFDeEUsMkVBQW9JO0lBQ3BJLHFFQUF5RTtJQUN6RSxxRUFBbUU7SUFDbkUsbUZBQXNFO0lBSXRFLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDO0lBRXpDLFNBQVMsd0JBQXdCLENBQUMsV0FBbUI7UUFDbkQsT0FBTyxDQUFPLElBQVUsRUFBRSxFQUFFOztZQUMxQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsd0JBQVksRUFBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNaLE1BQU0sSUFBSSxnQ0FBbUIsQ0FBQyx5QkFBeUIsV0FBVyxJQUFJLENBQUMsQ0FBQzthQUN6RTtZQUVELDZEQUE2RDtZQUM3RCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDekQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM3QyxRQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQ3RCLEtBQUssMkJBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ3BCLEtBQUssMkJBQVEsQ0FBQyxNQUFNLENBQUM7b0JBQ3JCLEtBQUssMkJBQVEsQ0FBQyxPQUFPO3dCQUNuQixNQUFNLEtBQUssR0FBRyxNQUFBLE1BQU0sQ0FBQyxPQUFPLDBDQUFHLFVBQVUsQ0FBQyxDQUFDO3dCQUMzQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTs0QkFDN0IsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDMUI7d0JBRUQsTUFBTTtpQkFDVDthQUNGO1lBRUQsTUFBTSxhQUFhLEdBQWEsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3RCxLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3RCLFNBQVM7aUJBQ1Y7Z0JBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxvQkFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxLQUFLLEdBQUcsTUFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN6QixNQUFNLElBQUksZ0NBQW1CLENBQUMsa0NBQzFCLElBQUkseURBQXlELENBQUMsQ0FBQztpQkFDcEU7Z0JBRUQsTUFBTSxlQUFlLEdBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxLQUFLLHdCQUF3QixDQUFDLENBQUM7Z0JBQzVFLElBQUksZUFBZSxFQUFFO29CQUNuQixrQ0FBa0M7b0JBQ2xDLFNBQVM7aUJBQ1Y7Z0JBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2FBQ3REO1FBQ0gsQ0FBQyxDQUFBLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFVLEVBQUUsT0FBeUI7UUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDaEMsT0FBTztTQUNSO1FBRUQsOEVBQThFO1FBQzlFLElBQUEsMENBQTJCLEVBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDdkQsSUFBQSx1Q0FBd0IsRUFBQyxJQUFJLEVBQUU7WUFDN0IsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixJQUFJLEVBQUUsaUNBQWtCLENBQUMsT0FBTztZQUNoQyxPQUFPLEVBQUUsb0JBQW9CO1NBQzlCLENBQUMsQ0FBQztRQUVILDhFQUE4RTtRQUM5RSx5REFBeUQ7UUFDekQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLDhCQUFzQixFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsbUJBQXdCLE9BQWU7UUFDckMsT0FBTyxHQUFHLEVBQUU7O1lBQ1YsNERBQTREO1lBQzVELDBFQUEwRTtZQUMxRSxNQUFNLFdBQVcsR0FBRyxNQUFBLE9BQU8sQ0FBQyxJQUFJLG1DQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFFcEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDaEIsTUFBTSxJQUFJLGdDQUFtQixDQUFDLCtCQUErQixDQUFDLENBQUM7YUFDaEU7WUFFRCxPQUFPLElBQUEsa0JBQUssRUFBQztnQkFDWCx3QkFBd0IsQ0FBQyxXQUFXLENBQUM7Z0JBQ3JDLCtFQUErRTtnQkFDL0UscUVBQXFFO2dCQUNyRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBQSxpQkFBSSxHQUFFO2FBQ25ELENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNKLENBQUM7SUFqQkQsNEJBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICpcbiAqIEBmaWxlb3ZlcnZpZXcgU2NoZW1hdGljcyBmb3IgYG5nIGFkZCBAYW5ndWxhci9sb2NhbGl6ZWAgc2NoZW1hdGljLlxuICovXG5cbmltcG9ydCB7Y2hhaW4sIG5vb3AsIFJ1bGUsIFNjaGVtYXRpY0NvbnRleHQsIFNjaGVtYXRpY3NFeGNlcHRpb24sIFRyZWUsfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQge05vZGVQYWNrYWdlSW5zdGFsbFRhc2t9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3Rhc2tzJztcbmltcG9ydCB7YWRkUGFja2FnZUpzb25EZXBlbmRlbmN5LCBOb2RlRGVwZW5kZW5jeVR5cGUsIHJlbW92ZVBhY2thZ2VKc29uRGVwZW5kZW5jeSx9IGZyb20gJ0BzY2hlbWF0aWNzL2FuZ3VsYXIvdXRpbGl0eS9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtKU09ORmlsZSwgSlNPTlBhdGh9IGZyb20gJ0BzY2hlbWF0aWNzL2FuZ3VsYXIvdXRpbGl0eS9qc29uLWZpbGUnO1xuaW1wb3J0IHtnZXRXb3Jrc3BhY2V9IGZyb20gJ0BzY2hlbWF0aWNzL2FuZ3VsYXIvdXRpbGl0eS93b3Jrc3BhY2UnO1xuaW1wb3J0IHtCdWlsZGVyc30gZnJvbSAnQHNjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5L3dvcmtzcGFjZS1tb2RlbHMnO1xuXG5pbXBvcnQge1NjaGVtYX0gZnJvbSAnLi9zY2hlbWEnO1xuXG5jb25zdCBsb2NhbGl6ZVR5cGUgPSBgQGFuZ3VsYXIvbG9jYWxpemVgO1xuXG5mdW5jdGlvbiBhZGRUeXBlU2NyaXB0Q29uZmlnVHlwZXMocHJvamVjdE5hbWU6IHN0cmluZyk6IFJ1bGUge1xuICByZXR1cm4gYXN5bmMgKGhvc3Q6IFRyZWUpID0+IHtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSBhd2FpdCBnZXRXb3Jrc3BhY2UoaG9zdCk7XG4gICAgY29uc3QgcHJvamVjdCA9IHdvcmtzcGFjZS5wcm9qZWN0cy5nZXQocHJvamVjdE5hbWUpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oYEludmFsaWQgcHJvamVjdCBuYW1lICcke3Byb2plY3ROYW1lfScuYCk7XG4gICAgfVxuXG4gICAgLy8gV2UgYWRkIHRoZSByb290IHdvcmtzcGFjZSB0c2NvbmZpZyBmb3IgYmV0dGVyIElERSBzdXBwb3J0LlxuICAgIGNvbnN0IHRzQ29uZmlnRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oWyd0c2NvbmZpZy5qc29uJ10pO1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb2plY3QudGFyZ2V0cy52YWx1ZXMoKSkge1xuICAgICAgc3dpdGNoICh0YXJnZXQuYnVpbGRlcikge1xuICAgICAgICBjYXNlIEJ1aWxkZXJzLkthcm1hOlxuICAgICAgICBjYXNlIEJ1aWxkZXJzLlNlcnZlcjpcbiAgICAgICAgY2FzZSBCdWlsZGVycy5Ccm93c2VyOlxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0Lm9wdGlvbnM/LlsndHNDb25maWcnXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHNDb25maWdGaWxlcy5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHR5cGVzSnNvblBhdGg6IEpTT05QYXRoID0gWydjb21waWxlck9wdGlvbnMnLCAndHlwZXMnXTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdHNDb25maWdGaWxlcykge1xuICAgICAgaWYgKCFob3N0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QganNvbiA9IG5ldyBKU09ORmlsZShob3N0LCBwYXRoKTtcbiAgICAgIGNvbnN0IHR5cGVzID0ganNvbi5nZXQodHlwZXNKc29uUGF0aCkgPz8gW107XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWF0aWNzRXhjZXB0aW9uKGBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZSAnJHtcbiAgICAgICAgICAgIHBhdGh9JyBoYXMgYW4gaW52YWxpZCAndHlwZXMnIHByb3BlcnR5LiBJdCBtdXN0IGJlIGFuIGFycmF5LmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNMb2NhbGl6ZVR5cGUgPVxuICAgICAgICAgIHR5cGVzLnNvbWUoKHQpID0+IHQgPT09IGxvY2FsaXplVHlwZSB8fCB0ID09PSAnQGFuZ3VsYXIvbG9jYWxpemUvaW5pdCcpO1xuICAgICAgaWYgKGhhc0xvY2FsaXplVHlwZSkge1xuICAgICAgICAvLyBTa2lwIGhhcyBhbHJlYWR5IGxvY2FsaXplIHR5cGUuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBqc29uLm1vZGlmeSh0eXBlc0pzb25QYXRoLCBbLi4udHlwZXMsIGxvY2FsaXplVHlwZV0pO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gbW92ZVRvRGVwZW5kZW5jaWVzKGhvc3Q6IFRyZWUsIGNvbnRleHQ6IFNjaGVtYXRpY0NvbnRleHQpOiB2b2lkIHtcbiAgaWYgKCFob3N0LmV4aXN0cygncGFja2FnZS5qc29uJykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHByZXZpb3VzIGRlcGVuZGVuY3kgYW5kIGFkZCBpbiBhIG5ldyBvbmUgdW5kZXIgdGhlIGRlc2lyZWQgdHlwZS5cbiAgcmVtb3ZlUGFja2FnZUpzb25EZXBlbmRlbmN5KGhvc3QsICdAYW5ndWxhci9sb2NhbGl6ZScpO1xuICBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY3koaG9zdCwge1xuICAgIG5hbWU6ICdAYW5ndWxhci9sb2NhbGl6ZScsXG4gICAgdHlwZTogTm9kZURlcGVuZGVuY3lUeXBlLkRlZmF1bHQsXG4gICAgdmVyc2lvbjogYH4wLjAuMC1QTEFDRUhPTERFUmAsXG4gIH0pO1xuXG4gIC8vIEFkZCBhIHRhc2sgdG8gcnVuIHRoZSBwYWNrYWdlIG1hbmFnZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXBkYXRlZFxuICAvLyBcInBhY2thZ2UuanNvblwiIGFuZCB3ZSB3YW50IGxvY2sgZmlsZXMgdG8gcmVmbGVjdCB0aGlzLlxuICBjb250ZXh0LmFkZFRhc2sobmV3IE5vZGVQYWNrYWdlSW5zdGFsbFRhc2soKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9wdGlvbnM6IFNjaGVtYSk6IFJ1bGUge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIC8vIFdlIGZhdm9yIHRoZSBuYW1lIG9wdGlvbiBiZWNhdXNlIHRoZSBwcm9qZWN0IG9wdGlvbiBoYXMgYVxuICAgIC8vIHNtYXJ0IGRlZmF1bHQgd2hpY2ggY2FuIGJlIHBvcHVsYXRlZCBldmVuIHdoZW4gdW5zcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAgY29uc3QgcHJvamVjdE5hbWUgPSBvcHRpb25zLm5hbWUgPz8gb3B0aW9ucy5wcm9qZWN0O1xuXG4gICAgaWYgKCFwcm9qZWN0TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oJ09wdGlvbiBcInByb2plY3RcIiBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhaW4oW1xuICAgICAgYWRkVHlwZVNjcmlwdENvbmZpZ1R5cGVzKHByb2plY3ROYW1lKSxcbiAgICAgIC8vIElmIGAkbG9jYWxpemVgIHdpbGwgYmUgdXNlZCBhdCBydW50aW1lIHRoZW4gbXVzdCBpbnN0YWxsIGBAYW5ndWxhci9sb2NhbGl6ZWBcbiAgICAgIC8vIGludG8gYGRlcGVuZGVuY2llc2AsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9mIGBkZXZEZXBlbmRlbmNpZXNgLlxuICAgICAgb3B0aW9ucy51c2VBdFJ1bnRpbWUgPyBtb3ZlVG9EZXBlbmRlbmNpZXMgOiBub29wKCksXG4gICAgXSk7XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ /// <amd-module name="@angular/localize/src/localize" />
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ export { _global } from './src/global';
10
+ export { $localize, LocalizeFn, TranslateFn } from './src/localize';
@@ -0,0 +1,17 @@
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
+ /// <amd-module name="@angular/localize/src/localize/src/global" />
9
+ declare global {
10
+ interface WorkerGlobalScope extends EventTarget, WindowOrWorkerGlobalScope {
11
+ }
12
+ var WorkerGlobalScope: {
13
+ prototype: WorkerGlobalScope;
14
+ new (): WorkerGlobalScope;
15
+ };
16
+ }
17
+ export declare const _global: any;
@@ -0,0 +1,139 @@
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
+ /// <amd-module name="@angular/localize/src/localize/src/localize" />
9
+ /** @nodoc */
10
+ export interface LocalizeFn {
11
+ (messageParts: TemplateStringsArray, ...expressions: readonly any[]): string;
12
+ /**
13
+ * A function that converts an input "message with expressions" into a translated "message with
14
+ * expressions".
15
+ *
16
+ * The conversion may be done in place, modifying the array passed to the function, so
17
+ * don't assume that this has no side-effects.
18
+ *
19
+ * The expressions must be passed in since it might be they need to be reordered for
20
+ * different translations.
21
+ */
22
+ translate?: TranslateFn;
23
+ /**
24
+ * The current locale of the translated messages.
25
+ *
26
+ * The compile-time translation inliner is able to replace the following code:
27
+ *
28
+ * ```
29
+ * typeof $localize !== "undefined" && $localize.locale
30
+ * ```
31
+ *
32
+ * with a string literal of the current locale. E.g.
33
+ *
34
+ * ```
35
+ * "fr"
36
+ * ```
37
+ */
38
+ locale?: string;
39
+ }
40
+ /** @nodoc */
41
+ export interface TranslateFn {
42
+ (messageParts: TemplateStringsArray, expressions: readonly any[]): [TemplateStringsArray, readonly any[]];
43
+ }
44
+ /**
45
+ * Tag a template literal string for localization.
46
+ *
47
+ * For example:
48
+ *
49
+ * ```ts
50
+ * $localize `some string to localize`
51
+ * ```
52
+ *
53
+ * **Providing meaning, description and id**
54
+ *
55
+ * You can optionally specify one or more of `meaning`, `description` and `id` for a localized
56
+ * string by pre-pending it with a colon delimited block of the form:
57
+ *
58
+ * ```ts
59
+ * $localize`:meaning|description@@id:source message text`;
60
+ *
61
+ * $localize`:meaning|:source message text`;
62
+ * $localize`:description:source message text`;
63
+ * $localize`:@@id:source message text`;
64
+ * ```
65
+ *
66
+ * This format is the same as that used for `i18n` markers in Angular templates. See the
67
+ * [Angular i18n guide](guide/i18n-common-prepare#mark-text-in-component-template).
68
+ *
69
+ * **Naming placeholders**
70
+ *
71
+ * If the template literal string contains expressions, then the expressions will be automatically
72
+ * associated with placeholder names for you.
73
+ *
74
+ * For example:
75
+ *
76
+ * ```ts
77
+ * $localize `Hi ${name}! There are ${items.length} items.`;
78
+ * ```
79
+ *
80
+ * will generate a message-source of `Hi {$PH}! There are {$PH_1} items`.
81
+ *
82
+ * The recommended practice is to name the placeholder associated with each expression though.
83
+ *
84
+ * Do this by providing the placeholder name wrapped in `:` characters directly after the
85
+ * expression. These placeholder names are stripped out of the rendered localized string.
86
+ *
87
+ * For example, to name the `items.length` expression placeholder `itemCount` you write:
88
+ *
89
+ * ```ts
90
+ * $localize `There are ${items.length}:itemCount: items`;
91
+ * ```
92
+ *
93
+ * **Escaping colon markers**
94
+ *
95
+ * If you need to use a `:` character directly at the start of a tagged string that has no
96
+ * metadata block, or directly after a substitution expression that has no name you must escape
97
+ * the `:` by preceding it with a backslash:
98
+ *
99
+ * For example:
100
+ *
101
+ * ```ts
102
+ * // message has a metadata block so no need to escape colon
103
+ * $localize `:some description::this message starts with a colon (:)`;
104
+ * // no metadata block so the colon must be escaped
105
+ * $localize `\:this message starts with a colon (:)`;
106
+ * ```
107
+ *
108
+ * ```ts
109
+ * // named substitution so no need to escape colon
110
+ * $localize `${label}:label:: ${}`
111
+ * // anonymous substitution so colon must be escaped
112
+ * $localize `${label}\: ${}`
113
+ * ```
114
+ *
115
+ * **Processing localized strings:**
116
+ *
117
+ * There are three scenarios:
118
+ *
119
+ * * **compile-time inlining**: the `$localize` tag is transformed at compile time by a
120
+ * transpiler, removing the tag and replacing the template literal string with a translated
121
+ * literal string from a collection of translations provided to the transpilation tool.
122
+ *
123
+ * * **run-time evaluation**: the `$localize` tag is a run-time function that replaces and
124
+ * reorders the parts (static strings and expressions) of the template literal string with strings
125
+ * from a collection of translations loaded at run-time.
126
+ *
127
+ * * **pass-through evaluation**: the `$localize` tag is a run-time function that simply evaluates
128
+ * the original template literal string without applying any translations to the parts. This
129
+ * version is used during development or where there is no need to translate the localized
130
+ * template literals.
131
+ *
132
+ * @param messageParts a collection of the static parts of the template string.
133
+ * @param expressions a collection of the values of each placeholder in the template string.
134
+ * @returns the translated string, with the `messageParts` and `expressions` interleaved together.
135
+ *
136
+ * @globalApi
137
+ * @publicApi
138
+ */
139
+ export declare const $localize: LocalizeFn;
@@ -0,0 +1,62 @@
1
+ /// <amd-module name="@angular/localize/src/translate" />
2
+ import { MessageId, TargetMessage } from './utils';
3
+ /**
4
+ * Load translations for use by `$localize`, if doing runtime translation.
5
+ *
6
+ * If the `$localize` tagged strings are not going to be replaced at compiled time, it is possible
7
+ * to load a set of translations that will be applied to the `$localize` tagged strings at runtime,
8
+ * in the browser.
9
+ *
10
+ * Loading a new translation will overwrite a previous translation if it has the same `MessageId`.
11
+ *
12
+ * Note that `$localize` messages are only processed once, when the tagged string is first
13
+ * encountered, and does not provide dynamic language changing without refreshing the browser.
14
+ * Loading new translations later in the application life-cycle will not change the translated text
15
+ * of messages that have already been translated.
16
+ *
17
+ * The message IDs and translations are in the same format as that rendered to "simple JSON"
18
+ * translation files when extracting messages. In particular, placeholders in messages are rendered
19
+ * using the `{$PLACEHOLDER_NAME}` syntax. For example the message from the following template:
20
+ *
21
+ * ```html
22
+ * <div i18n>pre<span>inner-pre<b>bold</b>inner-post</span>post</div>
23
+ * ```
24
+ *
25
+ * would have the following form in the `translations` map:
26
+ *
27
+ * ```ts
28
+ * {
29
+ * "2932901491976224757":
30
+ * "pre{$START_TAG_SPAN}inner-pre{$START_BOLD_TEXT}bold{$CLOSE_BOLD_TEXT}inner-post{$CLOSE_TAG_SPAN}post"
31
+ * }
32
+ * ```
33
+ *
34
+ * @param translations A map from message ID to translated message.
35
+ *
36
+ * These messages are processed and added to a lookup based on their `MessageId`.
37
+ *
38
+ * @see `clearTranslations()` for removing translations loaded using this function.
39
+ * @see `$localize` for tagging messages as needing to be translated.
40
+ * @publicApi
41
+ */
42
+ export declare function loadTranslations(translations: Record<MessageId, TargetMessage>): void;
43
+ /**
44
+ * Remove all translations for `$localize`, if doing runtime translation.
45
+ *
46
+ * All translations that had been loading into memory using `loadTranslations()` will be removed.
47
+ *
48
+ * @see `loadTranslations()` for loading translations at runtime.
49
+ * @see `$localize` for tagging messages as needing to be translated.
50
+ *
51
+ * @publicApi
52
+ */
53
+ export declare function clearTranslations(): void;
54
+ /**
55
+ * Translate the text of the given message, using the loaded translations.
56
+ *
57
+ * This function may reorder (or remove) substitutions as indicated in the matching translation.
58
+ */
59
+ export declare function translate(messageParts: TemplateStringsArray, substitutions: readonly any[]): [
60
+ TemplateStringsArray,
61
+ readonly any[]
62
+ ];
@@ -0,0 +1,11 @@
1
+ /// <amd-module name="@angular/localize/src/utils" />
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ export * from './src/constants';
10
+ export * from './src/messages';
11
+ export * from './src/translations';
@@ -0,0 +1,58 @@
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
+ /// <amd-module name="@angular/localize/src/utils/src/constants" />
9
+ /**
10
+ * The character used to mark the start and end of a "block" in a `$localize` tagged string.
11
+ * A block can indicate metadata about the message or specify a name of a placeholder for a
12
+ * substitution expressions.
13
+ *
14
+ * For example:
15
+ *
16
+ * ```ts
17
+ * $localize`Hello, ${title}:title:!`;
18
+ * $localize`:meaning|description@@id:source message text`;
19
+ * ```
20
+ */
21
+ export declare const BLOCK_MARKER = ":";
22
+ /**
23
+ * The marker used to separate a message's "meaning" from its "description" in a metadata block.
24
+ *
25
+ * For example:
26
+ *
27
+ * ```ts
28
+ * $localize `:correct|Indicates that the user got the answer correct: Right!`;
29
+ * $localize `:movement|Button label for moving to the right: Right!`;
30
+ * ```
31
+ */
32
+ export declare const MEANING_SEPARATOR = "|";
33
+ /**
34
+ * The marker used to separate a message's custom "id" from its "description" in a metadata block.
35
+ *
36
+ * For example:
37
+ *
38
+ * ```ts
39
+ * $localize `:A welcome message on the home page@@myApp-homepage-welcome: Welcome!`;
40
+ * ```
41
+ */
42
+ export declare const ID_SEPARATOR = "@@";
43
+ /**
44
+ * The marker used to separate legacy message ids from the rest of a metadata block.
45
+ *
46
+ * For example:
47
+ *
48
+ * ```ts
49
+ * $localize `:@@custom-id␟2df64767cd895a8fabe3e18b94b5b6b6f9e2e3f0: Welcome!`;
50
+ * ```
51
+ *
52
+ * Note that this character is the "symbol for the unit separator" (␟) not the "unit separator
53
+ * character" itself, since that has no visual representation. See https://graphemica.com/%E2%90%9F.
54
+ *
55
+ * Here is some background for the original "unit separator character":
56
+ * https://stackoverflow.com/questions/8695118/whats-the-file-group-record-unit-separator-control-characters-and-its-usage
57
+ */
58
+ export declare const LEGACY_ID_INDICATOR = "\u241F";