ember-scoped-css 0.18.0 → 0.19.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 (62) hide show
  1. package/README.md +7 -0
  2. package/declarations/lib/path/hash-from-absolute-path.d.ts +3 -0
  3. package/declarations/lib/path/hash-from-absolute-path.d.ts.map +1 -0
  4. package/declarations/lib/path/hash-from-absolute-path.test.d.ts +2 -0
  5. package/declarations/lib/path/hash-from-absolute-path.test.d.ts.map +1 -0
  6. package/declarations/lib/path/hash-from-module-path.d.ts +31 -0
  7. package/declarations/lib/path/hash-from-module-path.d.ts.map +1 -0
  8. package/declarations/lib/path/template-transform-paths.d.ts +11 -0
  9. package/declarations/lib/path/template-transform-paths.d.ts.map +1 -0
  10. package/declarations/lib/path/template-transform-paths.test.d.ts +2 -0
  11. package/declarations/lib/path/template-transform-paths.test.d.ts.map +1 -0
  12. package/declarations/lib/path/utils.appPath.test.d.ts +2 -0
  13. package/declarations/lib/path/utils.appPath.test.d.ts.map +1 -0
  14. package/declarations/lib/path/utils.d.ts +85 -0
  15. package/declarations/lib/path/utils.d.ts.map +1 -0
  16. package/declarations/lib/path/utils.hashFrom.test.d.ts +2 -0
  17. package/declarations/lib/path/utils.hashFrom.test.d.ts.map +1 -0
  18. package/declarations/lib/path/utils.isRelevantFile.test.d.ts +2 -0
  19. package/declarations/lib/path/utils.isRelevantFile.test.d.ts.map +1 -0
  20. package/declarations/lib/path/utils.paths.test.d.ts +7 -0
  21. package/declarations/lib/path/utils.paths.test.d.ts.map +1 -0
  22. package/dist/cjs/app-css-loader.cjs +220 -0
  23. package/dist/cjs/app-dependency-loader.cjs +41 -0
  24. package/dist/cjs/babel-plugin.cjs +378 -0
  25. package/dist/cjs/ember-classic-support.cjs +466 -0
  26. package/dist/cjs/index.cjs +662 -0
  27. package/dist/cjs/template-plugin.cjs +434 -0
  28. package/dist/runtime/test-support.js +7 -8
  29. package/dist/runtime/test-support.js.map +3 -3
  30. package/package.json +35 -25
  31. package/src/build/app-css-loader.js +19 -14
  32. package/src/build/app-dependency-loader.js +4 -4
  33. package/src/build/app-js-unplugin.js +3 -10
  34. package/src/build/babel-plugin.js +26 -35
  35. package/src/build/ember-classic-support.js +21 -14
  36. package/src/build/scoped-css-unplugin.js +8 -10
  37. package/src/build/template-plugin.js +76 -0
  38. package/src/lib/css/utils.js +17 -0
  39. package/src/lib/path/hash-from-absolute-path.js +16 -0
  40. package/src/lib/path/hash-from-absolute-path.test.ts +42 -0
  41. package/src/lib/path/hash-from-module-path.js +43 -0
  42. package/src/lib/path/template-transform-paths.js +103 -0
  43. package/src/lib/path/template-transform-paths.test.ts +47 -0
  44. package/src/lib/path/utils.appPath.test.ts +33 -0
  45. package/src/lib/path/utils.hashFrom.test.ts +51 -0
  46. package/src/lib/path/utils.isRelevantFile.test.ts +75 -0
  47. package/src/lib/path/utils.js +328 -0
  48. package/src/lib/path/utils.paths.test.ts +26 -0
  49. package/src/lib/replaceGlimmerAst.js +2 -3
  50. package/src/lib/rewriteHbs.js +15 -12
  51. package/src/runtime/test-support.ts +4 -4
  52. package/declarations/lib/generateRelativePathHash.d.ts +0 -7
  53. package/declarations/lib/generateRelativePathHash.d.ts.map +0 -1
  54. package/dist/cjs/build/app-css-loader.cjs +0 -202
  55. package/dist/cjs/build/app-dependency-loader.cjs +0 -53
  56. package/dist/cjs/build/ember-classic-support.cjs +0 -458
  57. package/dist/cjs/build/index.cjs +0 -656
  58. package/dist/cjs/scoped-babel-plugin.cjs +0 -295
  59. package/src/lib/fsExists.js +0 -11
  60. package/src/lib/generateAbsolutePathHash.js +0 -176
  61. package/src/lib/generateRelativePathHash.js +0 -10
  62. package/src/scoped-babel-plugin.js +0 -1
package/README.md CHANGED
@@ -19,6 +19,13 @@ This build tool emits CSS in a `@layer`.
19
19
  - non-embroider apps
20
20
  - embroider apps
21
21
 
22
+ | You Have | ember-scoped-css | ember-scoped-css-compat |
23
+ | -------- | ----------- | ---------------------- |
24
+ | ember-template-imports@v4 or babel-plugin-ember-template-compilation@2.2.5+ | 0.19.0 | 10.0.0 |
25
+ | ember-template-imports@v3 or babel-plugin-ember-template-compilation@2.2.1 or rollup-plugin-glimmer-template-tag | <= 0.18.0 | <= 9.0.0 |
26
+ | classic components | <= 0.18.0 | <= 8.0.0 |
27
+ | ember < 4 | <= 0.18.0 | <= 8.0.0 |
28
+
22
29
 
23
30
  ## Installation for a non-embroider ember app
24
31
 
@@ -0,0 +1,3 @@
1
+ export function hashFromAbsolutePath(absolutePath: any): string;
2
+ export { hash } from "./hash-from-module-path.js";
3
+ //# sourceMappingURL=hash-from-absolute-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-from-absolute-path.d.ts","sourceRoot":"","sources":["../../../src/lib/path/hash-from-absolute-path.js"],"names":[],"mappings":"AAKA,gEAUC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hash-from-absolute-path.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-from-absolute-path.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/hash-from-absolute-path.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The intent of this function is to generate the suffix/postfix for the
3
+ * css classes, based on the module-scoped path name.
4
+ *
5
+ * for example,
6
+ * hash('my-app/components/foo')
7
+ * instead of
8
+ * hash('app/components/foo')
9
+ *
10
+ * (unless your app name is 'app')
11
+ *
12
+ * @param {string} modulePath
13
+ * @returns {string}
14
+ */
15
+ export function hash(modulePath: string): string;
16
+ /**
17
+ * The intent of this function is to generate the suffix/postfix for the
18
+ * css classes, based on the module-scoped path name.
19
+ *
20
+ * for example,
21
+ * hash('my-app/components/foo')
22
+ * instead of
23
+ * hash('app/components/foo')
24
+ *
25
+ * (unless your app name is 'app')
26
+ *
27
+ * @param {string} modulePath
28
+ * @returns {string}
29
+ */
30
+ export function hashFromModulePath(modulePath: string): string;
31
+ //# sourceMappingURL=hash-from-module-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-from-module-path.d.ts","sourceRoot":"","sources":["../../../src/lib/path/hash-from-module-path.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,iCAHW,MAAM,GACJ,MAAM,CAIlB;AAhBD;;;;;;;;;;;;;GAaG;AACH,+CAHW,MAAM,GACJ,MAAM,CAIlB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * template plugins do not hand us the correct file path.
3
+ * additionally, we may not be able to rely on this data in the future,
4
+ * so this functions acts as a means of normalizing _whatever_ we're given
5
+ * in the future.
6
+ *
7
+ * @param {string} filename
8
+ * @returns {string} the absolute path to the file
9
+ */
10
+ export function fixFilename(filename: string): string;
11
+ //# sourceMappingURL=template-transform-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-transform-paths.d.ts","sourceRoot":"","sources":["../../../src/lib/path/template-transform-paths.js"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,sCAHW,MAAM,GACJ,MAAM,CAqElB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=template-transform-paths.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-transform-paths.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/template-transform-paths.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.appPath.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.appPath.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.appPath.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Regardless of what the filePath format is,
3
+ * this will try to return the correct postfix.
4
+ *
5
+ * @param {string} filePath
6
+ * @returns
7
+ */
8
+ export function hashFrom(filePath: string): string;
9
+ /**
10
+ * Based on ember's component location conventions,
11
+ * this function will provide a path for where we
12
+ * expect the CSS to live.
13
+ *
14
+ * For co-located structure:
15
+ * - components/my-component.hbs
16
+ * - components/my-component.css
17
+ *
18
+ * For nested co-located structure
19
+ * - components/my-component/foo.hbs
20
+ * - components/my-component/foo.css
21
+ *
22
+ * For Pods routes structure
23
+ * - routes/my-route/template.{hbs,js}
24
+ * - routes/my-route/styles.css
25
+ *
26
+ * Deliberately not supported:
27
+ * - components w/ pods -- this is deprecated in 5.10
28
+ *
29
+ * @param {string} fileName - the hbs, js, gjs, gts or whatever co-located path.
30
+ * @returns {string} - expected css path
31
+ */
32
+ export function cssPathFor(fileName: string): string;
33
+ /**
34
+ * Note that components in the "pods" convention will
35
+ * never be supported.
36
+ *
37
+ * @param {string} filePath
38
+ */
39
+ export function isPodTemplate(filePath: string): boolean;
40
+ /**
41
+ * Note that components in the "pods" convention will
42
+ * never be supported.
43
+ *
44
+ * Checks if a file ends with
45
+ * - template.js
46
+ * - template.hbs
47
+ * - styles.css
48
+ *
49
+ * @param {string} filePath
50
+ */
51
+ export function isPod(filePath: string): boolean;
52
+ /**
53
+ *
54
+ * @param {string} filePath
55
+ * @returns the same path, but without the extension
56
+ */
57
+ export function withoutExtension(filePath: string): string;
58
+ /**
59
+ * Examples for fileName
60
+ * - absolute on-disk path
61
+ * - in webpack
62
+ * - URL-absolute path, starting with /
63
+ *
64
+ * @param {string} fileName
65
+ * @param {string[]} [additionalRoots]
66
+ * @returns
67
+ */
68
+ export function isRelevantFile(fileName: string, additionalRoots?: string[] | undefined): boolean | undefined;
69
+ export function packageScopedPathToModulePath(packageScopedPath: any): string;
70
+ /**
71
+ * returns the app-module path of the source file
72
+ *
73
+ * This assumes normal ember app conventions
74
+ *
75
+ * which is `<package.json#name>/path-to-file`
76
+ */
77
+ export function appPath(sourcePath: any): string;
78
+ /**
79
+ * Populates the "seen" workspace cache,
80
+ * so that we don't hit the file system too often.
81
+ */
82
+ export function findWorkspacePath(sourcePath: any): any;
83
+ export { hashFromAbsolutePath } from "./hash-from-absolute-path.js";
84
+ export { hashFromModulePath } from "./hash-from-module-path.js";
85
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.js"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,mCAHW,MAAM,UAShB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qCAHW,MAAM,GACJ,MAAM,CAalB;AAED;;;;;GAKG;AACH,wCAFW,MAAM,WAQhB;AAED;;;;;;;;;;GAUG;AACH,gCAFW,MAAM,WAYhB;AAED;;;;GAIG;AACH,2CAHW,MAAM,UAOhB;AAMD;;;;;;;;;GASG;AACH,yCAJW,MAAM,+DAmEhB;AAED,8EAsCC;AAED;;;;;;GAMG;AACH,iDA4BC;AAoBD;;;GAGG;AACH,wDAgBC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.hashFrom.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.hashFrom.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.hashFrom.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.isRelevantFile.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.isRelevantFile.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.isRelevantFile.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export declare const paths: {
2
+ rewritten: string;
3
+ embroiderApp: string;
4
+ classicApp: string;
5
+ v2Addon: string;
6
+ };
7
+ //# sourceMappingURL=utils.paths.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.paths.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.paths.test.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,KAAK;;;;;CAKjB,CAAC"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/build/app-css-loader.js
31
+ var app_css_loader_exports = {};
32
+ __export(app_css_loader_exports, {
33
+ default: () => app_css_loader_default
34
+ });
35
+ module.exports = __toCommonJS(app_css_loader_exports);
36
+ var import_node_fs2 = require("node:fs");
37
+ var import_node_path2 = __toESM(require("node:path"), 1);
38
+
39
+ // src/lib/path/utils.js
40
+ var import_node_fs = __toESM(require("node:fs"), 1);
41
+ var import_node_path = __toESM(require("node:path"), 1);
42
+ var import_find_up = __toESM(require("find-up"), 1);
43
+
44
+ // src/lib/path/hash-from-module-path.js
45
+ var import_blueimp_md5 = __toESM(require("blueimp-md5"), 1);
46
+ function hash(modulePath) {
47
+ return "e" + (0, import_blueimp_md5.default)(modulePath).substring(0, 8);
48
+ }
49
+ var hashFromModulePath = hash;
50
+
51
+ // src/lib/path/hash-from-absolute-path.js
52
+ function hashFromAbsolutePath(absolutePath) {
53
+ const modulePath = appPath(absolutePath);
54
+ const postfix = hash(modulePath);
55
+ return postfix;
56
+ }
57
+
58
+ // src/lib/path/utils.js
59
+ function hashFrom(filePath) {
60
+ if (filePath.startsWith("/")) {
61
+ return hashFromAbsolutePath(filePath);
62
+ }
63
+ return hashFromModulePath(filePath);
64
+ }
65
+ function isPodTemplate(filePath) {
66
+ if (filePath.includes("/components/")) {
67
+ return false;
68
+ }
69
+ return filePath.endsWith("template.js") || filePath.endsWith("template.hbs");
70
+ }
71
+ function isPod(filePath) {
72
+ if (filePath.includes("/components/")) {
73
+ return false;
74
+ }
75
+ if (isPodTemplate(filePath)) {
76
+ return true;
77
+ }
78
+ return filePath.endsWith("styles.css");
79
+ }
80
+ function packageScopedPathToModulePath(packageScopedPath) {
81
+ let packageRelative = packageScopedPath.replace(/^\/src\//, "/");
82
+ let parsed = import_node_path.default.parse(packageRelative);
83
+ if (isPod(packageRelative)) {
84
+ return parsed.dir;
85
+ }
86
+ let localPackagerStylePath = import_node_path.default.join(parsed.dir, parsed.name);
87
+ return localPackagerStylePath;
88
+ }
89
+ function appPath(sourcePath) {
90
+ let workspacePath = findWorkspacePath(sourcePath);
91
+ let name = workspacePackageName(sourcePath);
92
+ let packageRelative = sourcePath.replace(workspacePath, "");
93
+ packageRelative = packageRelative.replace(`/app/`, `/`);
94
+ packageRelative = packageRelative.replace(
95
+ `/node_modules/.embroider/rewritten-app/`,
96
+ "/"
97
+ );
98
+ let localPackagerStylePath = packageScopedPathToModulePath(packageRelative);
99
+ return `${name}${localPackagerStylePath}`;
100
+ }
101
+ var CACHE = /* @__PURE__ */ new Set();
102
+ function hasSeen(sourcePath) {
103
+ for (let entry of CACHE) {
104
+ if (sourcePath.startsWith(entry)) {
105
+ return entry;
106
+ }
107
+ }
108
+ return;
109
+ }
110
+ function findWorkspacePath(sourcePath) {
111
+ let seen = hasSeen(sourcePath);
112
+ if (seen) {
113
+ return seen;
114
+ }
115
+ const packageJsonPath = import_find_up.default.sync("package.json", {
116
+ cwd: import_node_path.default.dirname(sourcePath)
117
+ });
118
+ const workspacePath = import_node_path.default.dirname(packageJsonPath);
119
+ CACHE.add(workspacePath);
120
+ return workspacePath;
121
+ }
122
+ var MANIFEST_CACHE = /* @__PURE__ */ new Map();
123
+ function workspacePackageName(sourcePath) {
124
+ const workspace = findWorkspacePath(sourcePath);
125
+ let existing = MANIFEST_CACHE.get(workspace);
126
+ if (existing) {
127
+ return existing.name;
128
+ }
129
+ let buffer = import_node_fs.default.readFileSync(import_node_path.default.join(workspace, "package.json"));
130
+ let content = buffer.toString();
131
+ let json = JSON.parse(content);
132
+ MANIFEST_CACHE.set(workspace, json);
133
+ return json.name;
134
+ }
135
+
136
+ // src/lib/rewriteCss.js
137
+ var import_postcss = __toESM(require("postcss"), 1);
138
+ var import_postcss_selector_parser = __toESM(require("postcss-selector-parser"), 1);
139
+
140
+ // src/lib/isInsideGlobal.js
141
+ function isInsideGlobal(node, func) {
142
+ const parent = node.parent;
143
+ if (!parent) return false;
144
+ if (parent.type === "pseudo" && parent.value === ":global") return true;
145
+ return isInsideGlobal(parent, func);
146
+ }
147
+
148
+ // src/lib/rewriteCss.js
149
+ function rewriteSelector(sel, postfix) {
150
+ const transform = (selectors) => {
151
+ selectors.walk((selector) => {
152
+ if (selector.type === "class" && !isInsideGlobal(selector)) {
153
+ selector.value += "_" + postfix;
154
+ } else if (selector.type === "tag" && !isInsideGlobal(selector)) {
155
+ selector.replaceWith(
156
+ import_postcss_selector_parser.default.tag({ value: selector.value }),
157
+ import_postcss_selector_parser.default.className({ value: postfix })
158
+ );
159
+ }
160
+ });
161
+ selectors.walk((selector) => {
162
+ if (selector.type === "pseudo" && selector.value === ":global") {
163
+ selector.replaceWith(...selector.nodes);
164
+ }
165
+ });
166
+ };
167
+ const transformed = (0, import_postcss_selector_parser.default)(transform).processSync(sel);
168
+ return transformed;
169
+ }
170
+ function isInsideKeyframes(node) {
171
+ const parent = node.parent;
172
+ if (!parent) return false;
173
+ if (parent.type === "atrule" && parent.name === "keyframes") return true;
174
+ return isInsideKeyframes(parent);
175
+ }
176
+ function rewriteCss(css, postfix, fileName, layerName) {
177
+ const layerNameWithDefault = layerName ?? "components";
178
+ const ast = import_postcss.default.parse(css);
179
+ ast.walk((node) => {
180
+ if (node.type === "rule" && !isInsideKeyframes(node)) {
181
+ node.selector = rewriteSelector(node.selector, postfix);
182
+ }
183
+ });
184
+ const rewrittenCss = ast.toString();
185
+ if (!layerNameWithDefault) {
186
+ return `/* ${fileName} */
187
+ ${rewrittenCss}
188
+ `;
189
+ }
190
+ return `/* ${fileName} */
191
+ @layer ${layerNameWithDefault} {
192
+
193
+ ` + rewrittenCss + "\n}\n";
194
+ }
195
+
196
+ // src/build/app-css-loader.js
197
+ async function app_css_loader_default(code) {
198
+ const options = this.getOptions();
199
+ const cssPath = this.resourcePath;
200
+ if (!cssPath.startsWith(this.rootContext)) {
201
+ return code;
202
+ }
203
+ const cssFileName = import_node_path2.default.basename(cssPath);
204
+ const hbsPath = cssPath.replace(".css", ".hbs");
205
+ const gjsPath = cssPath.replace(".css", ".js");
206
+ const hbsExists = (0, import_node_fs2.existsSync)(hbsPath);
207
+ const gjsExists = (0, import_node_fs2.existsSync)(gjsPath);
208
+ if (hbsExists || gjsExists) {
209
+ const postfix = hashFrom(cssPath);
210
+ const rewrittenCss = rewriteCss(
211
+ code,
212
+ postfix,
213
+ cssFileName,
214
+ options.layerName
215
+ );
216
+ return rewrittenCss;
217
+ }
218
+ return code;
219
+ }
220
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2FwcC1jc3MtbG9hZGVyLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvaGFzaC1mcm9tLW1vZHVsZS1wYXRoLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVDc3MuanMiLCAiLi4vLi4vc3JjL2xpYi9pc0luc2lkZUdsb2JhbC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gaW1wb3J0IHsgY3JlYXRlVW5wbHVnaW4gfSAgZnJvbSAndW5wbHVnaW4nO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaGFzaEZyb20gfSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgcmV3cml0ZUNzcyBmcm9tICcuLi9saWIvcmV3cml0ZUNzcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIChjb2RlKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgY29uc3QgY3NzUGF0aCA9IHRoaXMucmVzb3VyY2VQYXRoO1xuXG4gIGlmICghY3NzUGF0aC5zdGFydHNXaXRoKHRoaXMucm9vdENvbnRleHQpKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICBjb25zdCBjc3NGaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoY3NzUGF0aCk7XG5cbiAgY29uc3QgaGJzUGF0aCA9IGNzc1BhdGgucmVwbGFjZSgnLmNzcycsICcuaGJzJyk7XG4gIGNvbnN0IGdqc1BhdGggPSBjc3NQYXRoLnJlcGxhY2UoJy5jc3MnLCAnLmpzJyk7XG4gIGNvbnN0IGhic0V4aXN0cyA9IGV4aXN0c1N5bmMoaGJzUGF0aCk7XG4gIGNvbnN0IGdqc0V4aXN0cyA9IGV4aXN0c1N5bmMoZ2pzUGF0aCk7XG5cbiAgaWYgKGhic0V4aXN0cyB8fCBnanNFeGlzdHMpIHtcbiAgICBjb25zdCBwb3N0Zml4ID0gaGFzaEZyb20oY3NzUGF0aCk7XG4gICAgY29uc3QgcmV3cml0dGVuQ3NzID0gcmV3cml0ZUNzcyhcbiAgICAgIGNvZGUsXG4gICAgICBwb3N0Zml4LFxuICAgICAgY3NzRmlsZU5hbWUsXG4gICAgICBvcHRpb25zLmxheWVyTmFtZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJld3JpdHRlbkNzcztcbiAgfVxuXG4gIHJldHVybiBjb2RlO1xufVxuIiwgImltcG9ydCBmc1N5bmMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmluZFVwIGZyb20gJ2ZpbmQtdXAnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG4vKipcbiAqIFJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgZmlsZVBhdGggZm9ybWF0IGlzLFxuICogdGhpcyB3aWxsIHRyeSB0byByZXR1cm4gdGhlIGNvcnJlY3QgcG9zdGZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRnJvbShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGhhc2hGcm9tQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoRnJvbU1vZHVsZVBhdGgoZmlsZVBhdGgpO1xufVxuXG4vKipcbiAqIEJhc2VkIG9uIGVtYmVyJ3MgY29tcG9uZW50IGxvY2F0aW9uIGNvbnZlbnRpb25zLFxuICogdGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgYSBwYXRoIGZvciB3aGVyZSB3ZVxuICogZXhwZWN0IHRoZSBDU1MgdG8gbGl2ZS5cbiAqXG4gKiBGb3IgY28tbG9jYXRlZCBzdHJ1Y3R1cmU6XG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuY3NzXG4gKlxuICogRm9yIG5lc3RlZCBjby1sb2NhdGVkIHN0cnVjdHVyZVxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uY3NzXG4gKlxuICogRm9yIFBvZHMgcm91dGVzIHN0cnVjdHVyZVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS90ZW1wbGF0ZS57aGJzLGpzfVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS9zdHlsZXMuY3NzXG4gKlxuICogRGVsaWJlcmF0ZWx5IG5vdCBzdXBwb3J0ZWQ6XG4gKiAgIC0gY29tcG9uZW50cyB3LyBwb2RzIC0tIHRoaXMgaXMgZGVwcmVjYXRlZCBpbiA1LjEwXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lIC0gdGhlIGhicywganMsIGdqcywgZ3RzIG9yIHdoYXRldmVyIGNvLWxvY2F0ZWQgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gZXhwZWN0ZWQgY3NzIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc1BhdGhGb3IoZmlsZU5hbWUpIHtcbiAgbGV0IHdpdGhvdXRFeHQgPSB3aXRob3V0RXh0ZW5zaW9uKGZpbGVOYW1lKTtcbiAgbGV0IGNzc1BhdGggPSB3aXRob3V0RXh0ICsgJy5jc3MnO1xuXG4gIGlmIChpc1BvZChmaWxlTmFtZSkpIHtcbiAgICBjc3NQYXRoID0gZmlsZU5hbWVcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmpzJC8sICdzdHlsZXMuY3NzJylcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmhicy8sICdzdHlsZXMuY3NzJyk7XG4gIH1cblxuICByZXR1cm4gY3NzUGF0aDtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmpzJykgfHwgZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmhicycpO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGVuZHMgd2l0aFxuICogLSB0ZW1wbGF0ZS5qc1xuICogLSB0ZW1wbGF0ZS5oYnNcbiAqIC0gc3R5bGVzLmNzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2QoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJyk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnMgdGhlIHNhbWUgcGF0aCwgYnV0IHdpdGhvdXQgdGhlIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEV4dGVuc2lvbihmaWxlUGF0aCkge1xuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShmaWxlUGF0aCk7XG5cbiAgcmV0dXJuIHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG59XG5cbmNvbnN0IElSUkVMRVZBTlRfUEFUSFMgPSBbJ25vZGVfbW9kdWxlcy8ucG5wbSddO1xuXG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuLyoqXG4gKiBFeGFtcGxlcyBmb3IgZmlsZU5hbWVcbiAqIC0gYWJzb2x1dGUgb24tZGlzayBwYXRoXG4gKiAtIGluIHdlYnBhY2tcbiAqICAgLSBVUkwtYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcgd2l0aCAvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWRkaXRpb25hbFJvb3RzXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCBhZGRpdGlvbmFsUm9vdHMpIHtcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJy9AZW1icm9pZGVyJykpIHJldHVybiBmYWxzZTtcbiAgaWYgKElSUkVMRVZBTlRfUEFUSFMuc29tZSgoaSkgPT4gZmlsZU5hbWUuaW5jbHVkZXMoaSkpKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpKSB7XG4gICAgLy8gaWYgYSBmaWxlIGlzIG5vdCB0aGUgZW1icm9pZGVyIGNhY2hlIGRpcmVjdG9yeVxuICAgIC8vIGFuZCBpcyBpbiBub2RlX21vZHVsZXMsIHNraXAgaXQuXG4gICAgaWYgKCFmaWxlTmFtZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8uZW1icm9pZGVyLycpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmV3cml0dGVuIHBhY2thZ2VzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYXQgdGhlaXIgb3duXG4gICAgLy8gcHVibGlzaCB0aW1lXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvcmV3cml0dGVuLXBhY2thZ2VzLycpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgYXJlIGFscmVhZHkgdGhlIGJ1bmRsZWQgZmlsZXMuXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvcmV3cml0dGVuLWFwcC9hc3NldHMvJykpIHtcbiAgICAgIC8vIG5vdCBzdXBwb3J0ZWQsIG5ldmVyIHdpbGwgYmVcbiAgICAgIGlmIChcbiAgICAgICAgZmlsZU5hbWUuZW5kc1dpdGgoXG4gICAgICAgICAgJy9ub2RlX21vZHVsZXMvLmVtYnJvaWRlci9yZXdyaXR0ZW4tYXBwL2Fzc2V0cy90ZXN0cy5qcycsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElkZWFsbHksIHdlIG5ldmVyIGdldCBoZXJlIC0tIGluZGljYXRlcyB3ZSdyZSBub3QgZmlsdGVyaW5nIGVmZmVjdGl2ZWx5IGluIGJhYmVsXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbU2NvcGVkQ1NTXTogdHJhbnNmb3JtYXRpb24gaXMgYXR0ZW1wdGluZyB0b28gbGF0ZS4gQ2Fubm90IG9wZXJhdGUgb24gb3V0cHV0IGZpbGU6ICR7ZmlsZU5hbWV9YCxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuICBsZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgbGV0IG91cldvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGN3ZCk7XG5cbiAgaWYgKHdvcmtzcGFjZSAhPT0gb3VyV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGxvY2FsID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgbGV0IFssIC4uLnBhcnRzXSA9IGxvY2FsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUy5oYXMocGFydHNbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBwb2RzIHN1cHBvcnQuXG4gICAqIGZvbGtzIG5lZWQgdG8gb3B0IGluIHRvIHBvZHMgKHJvdXRlcyksIGJlY2F1c2UgZXZlcnkgcG9kcyBhcHAgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHlcbiAgICovXG4gIGxldCByb290cyA9IFsnL2NvbXBvbmVudHMvJywgLi4uKGFkZGl0aW9uYWxSb290cyB8fCBbXSldO1xuXG4gIGlmICghcm9vdHMuc29tZSgocm9vdCkgPT4gZmlsZU5hbWUuaW5jbHVkZXMocm9vdCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlU2NvcGVkUGF0aCkge1xuICAvKipcbiAgICogKkJ5IGNvbnZlbnRpb24qLCBgc3JjYCBpcyBvbWl0dGVkIGZyb20gY29tcG9uZW50IHBhdGhzLlxuICAgKiBXZSBjYW4gcmVmbGVjdCB0aGUgc2FtZSBiZWhhdmlvciBieSByZXBsYWNpbmcgc3JjL1xuICAgKiB3aXRoIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQ1NTIGlzbid0IGVtaXR0ZWQgYXMgYSBjby1sb2NhdGVkIG1vZHVsZSwgYnV0XG4gICAqIHRvIGtlZXAgY29udmVudGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgbGFuZ3VhZ2VzLFxuICAgKiB3ZSBjYW4gcHJldGVuZCBpdCBpcy5cbiAgICpcbiAgICogQW55IGN1c3RvbWl6YXRpb24gYmV5b25kIHJlbW92aW5nIGBzcmNgIGFuZCBgYXBwYCBpcyBwb3RlbnRpYWxseSBjb25mdXNpbmcuXG4gICAqIElmIHdlIG5lZWQgZnVydGhlciBjdXN0b21pemF0aW9ucywgd2UnbGwgd2FudCB0byBtYXRjaCBvbiBgZXhwb3J0c2AgaW4gdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgcGFja2FnZS5qc29uXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVNjb3BlZFBhdGgucmVwbGFjZSgvXlxcL3NyY1xcLy8sICcvJyk7XG5cbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UocGFja2FnZVJlbGF0aXZlKTtcblxuICBpZiAoaXNQb2QocGFja2FnZVJlbGF0aXZlKSkge1xuICAgIC8qKlxuICAgICAqIEZvciBwb2RzLCB3ZSBjaG9wIG9mZiB0aGUgd2hvbGUgZmlsZSwgYW5kIHVzZSB0aGUgZGlyIG5hbWUgYXMgdGhlIFwibW9kdWxlUGF0aFwiXG4gICAgICovXG4gICAgcmV0dXJuIHBhcnNlZC5kaXI7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIGlzIHBhc3NlZCwgcmVtb3ZlIGl0LlxuICAgKiBXaGVuIHVzaW5nIHBhY2thZ2VycywgZm9sa3MgYXJlIHVzZWQgdG8gbm90IGhhdmluZyB0byBzcGVjaWZ5IGV4dGVuc2lvbnMgZm9yIGZpbGVzLlxuICAgKiBTaW5jZSB3ZSBkb24ndCBldmVuIGVtaXQgY3NzIGZpbGVzIGNvLWxvY2F0ZWQgdG8gZWFjaCBtb2R1bGUsXG4gICAqIHRoaXMgaGVscHMgdXMgbm90IGNvbnZleSBhIGxpZSB0aGF0IGEgZmlsZSBtYXkgZXhpc3QgaW4gYXQgcnVudGltZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgYDxtb2R1bGUtbmFtZT4vY29tcG9uZW50cy9idXR0b25gLlxuICAgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBleHRlbnNpb24gaXMsIGJlY2F1c2UgeW91IGNhbiBvbmx5IGhhdmUgb25lIGNzcyBmaWxlXG4gICAqIGZvciB0aGUgYnV0dG9uIG1vZHVsZSBhbnl3YXkuXG4gICAqL1xuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG5cbiAgcmV0dXJuIGxvY2FsUGFja2FnZXJTdHlsZVBhdGg7XG59XG5cbi8qKlxuICogcmV0dXJucyB0aGUgYXBwLW1vZHVsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZVxuICpcbiAqIFRoaXMgYXNzdW1lcyBub3JtYWwgZW1iZXIgYXBwIGNvbnZlbnRpb25zXG4gKlxuICogd2hpY2ggaXMgYDxwYWNrYWdlLmpzb24jbmFtZT4vcGF0aC10by1maWxlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwUGF0aChzb3VyY2VQYXRoKSB7XG4gIGxldCB3b3Jrc3BhY2VQYXRoID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGxldCBuYW1lID0gd29ya3NwYWNlUGFja2FnZU5hbWUoc291cmNlUGF0aCk7XG5cbiAgLyoqXG4gICAqICBVbmRlciBlbWJyb2lkZXIgYnVpbGRzLCB0aGUgc3BlYy1jb21wbGlhbnQgdmVyc2lvbiBvZiB0aGUgYXBwXG4gICAqIGhhcyBhbGwgdGhlIGZpbGVzIHVuZGVyIGEgZm9sZGVyIHdoaWNoIHJlcHJlc2VudHMgdGhlIHBhY2thZ2UgbmFtZSxcbiAgICogcmF0aGVyIHRoYW4gXCJhcHBcIi5cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBzb3VyY2VQYXRoLnJlcGxhY2Uod29ya3NwYWNlUGF0aCwgJycpO1xuXG4gIC8qKlxuICAgKiBCdXQgd2UgYWxzbyBkb24ndCB3YW50ICdhcHAnIC0tIHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIHYxIGFkZG9uIHBpcGVsaW5lXG4gICAqL1xuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZShgL2FwcC9gLCBgL2ApO1xuXG4gIC8qKlxuICAgKiBhbHNvIGFsc28sIHdlIGtub3cgdGhhdCB0aGUgcmUtd3JpdHRlbiBhcHAgc3RydWN0dXJlIGluIGVtYnJvaWRlckB2M1xuICAgKiBpcyBleHRyYW5lb3VzLCBhbmQgd2UgY2FuIGNvbGxhcHNlIGl0XG4gICAqL1xuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZShcbiAgICBgL25vZGVfbW9kdWxlcy8uZW1icm9pZGVyL3Jld3JpdHRlbi1hcHAvYCxcbiAgICAnLycsXG4gICk7XG5cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIHJldHVybiBgJHtuYW1lfSR7bG9jYWxQYWNrYWdlclN0eWxlUGF0aH1gO1xufVxuXG5jb25zdCBDQUNIRSA9IG5ldyBTZXQoKTtcblxuLyoqXG4gKiBGb3IgYSBnaXZlbiBzb3VyY2UgcGF0aCwgaWYgd2UgaGF2ZSBzZWVuIGFcbiAqIHNvdXJjZSBmaWxlIHdpdGhpbiB0aGUgd29ya3NwYWNlIGRpcmVjdG9yeSxcbiAqIGZpbmQgdGhhdCB3b3Jrc3BhY2UgZGlyZWN0b3J5IGFuZCByZXR1cm4gaXQuXG4gKi9cbmZ1bmN0aW9uIGhhc1NlZW4oc291cmNlUGF0aCkge1xuICBmb3IgKGxldCBlbnRyeSBvZiBDQUNIRSkge1xuICAgIGlmIChzb3VyY2VQYXRoLnN0YXJ0c1dpdGgoZW50cnkpKSB7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9XG5cbiAgLy8gd2UgaGF2ZSBub3Qgc2VlbiB0aGlzIHNvdXJjZSBwYXRoIHlldFxuICByZXR1cm47XG59XG5cbi8qKlxuICogUG9wdWxhdGVzIHRoZSBcInNlZW5cIiB3b3Jrc3BhY2UgY2FjaGUsXG4gKiBzbyB0aGF0IHdlIGRvbid0IGhpdCB0aGUgZmlsZSBzeXN0ZW0gdG9vIG9mdGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCkge1xuICBsZXQgc2VlbiA9IGhhc1NlZW4oc291cmNlUGF0aCk7XG5cbiAgaWYgKHNlZW4pIHtcbiAgICByZXR1cm4gc2VlbjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGZpbmRVcC5zeW5jKCdwYWNrYWdlLmpzb24nLCB7XG4gICAgY3dkOiBwYXRoLmRpcm5hbWUoc291cmNlUGF0aCksXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtzcGFjZVBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKTtcblxuICBDQUNIRS5hZGQod29ya3NwYWNlUGF0aCk7XG5cbiAgcmV0dXJuIHdvcmtzcGFjZVBhdGg7XG59XG5cbmNvbnN0IE1BTklGRVNUX0NBQ0hFID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIHJldHVybnMgdGhlIHBhY2thZ2UuanNvbiNuYW1lIGZvciBhIGdpdmVuIHNvdXJjZVBhdGhcbiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlUGFja2FnZU5hbWUoc291cmNlUGF0aCkge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcblxuICBsZXQgZXhpc3RpbmcgPSBNQU5JRkVTVF9DQUNIRS5nZXQod29ya3NwYWNlKTtcblxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3RpbmcubmFtZTtcbiAgfVxuXG4gIGxldCBidWZmZXIgPSBmc1N5bmMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3Jrc3BhY2UsICdwYWNrYWdlLmpzb24nKSk7XG4gIGxldCBjb250ZW50ID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gIGxldCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KTtcblxuICBNQU5JRkVTVF9DQUNIRS5zZXQod29ya3NwYWNlLCBqc29uKTtcblxuICByZXR1cm4ganNvbi5uYW1lO1xufVxuIiwgImltcG9ydCBtZDUgZnJvbSAnYmx1ZWltcC1tZDUnO1xuXG4vKipcbiAqIFRoZSBpbnRlbnQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBnZW5lcmF0ZSB0aGUgc3VmZml4L3Bvc3RmaXggZm9yIHRoZVxuICogY3NzIGNsYXNzZXMsIGJhc2VkIG9uIHRoZSBtb2R1bGUtc2NvcGVkIHBhdGggbmFtZS5cbiAqXG4gKiBmb3IgZXhhbXBsZSxcbiAqICAgIGhhc2goJ215LWFwcC9jb21wb25lbnRzL2ZvbycpXG4gKiAgaW5zdGVhZCBvZlxuICogICAgaGFzaCgnYXBwL2NvbXBvbmVudHMvZm9vJylcbiAqXG4gKiAgKHVubGVzcyB5b3VyIGFwcCBuYW1lIGlzICdhcHAnKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVQYXRoXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaChtb2R1bGVQYXRoKSB7XG4gIHJldHVybiAnZScgKyBtZDUobW9kdWxlUGF0aCkuc3Vic3RyaW5nKDAsIDgpO1xufVxuXG5cbmV4cG9ydCBjb25zdCBoYXNoRnJvbU1vZHVsZVBhdGggPSBoYXNoO1xuIiwgImltcG9ydCB7IGhhc2ggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5pbXBvcnQgeyBhcHBQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCB7IGhhc2ggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRnJvbUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpIHtcbiAgLyoqXG4gICAqIFRoZSB3aG9sZSBvZiBgYXBwUGF0aGAgdWx0aW1hdGVseSB0cmFuc2Zvcm1zIHRoZSBgYWJzb2x1dGVQYXRoYFxuICAgKiBpbnRvIHRoZSBleGFjdCBzdHJpbmcgdGhhdCBmb2xrcyB3aWxsIHBhc3MgdG8gYHJlbGF0aXZlUGF0aGBcbiAgICogYXQgcnVudGltZS5cbiAgICovXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBhcHBQYXRoKGFic29sdXRlUGF0aCk7XG4gIGNvbnN0IHBvc3RmaXggPSBoYXNoKG1vZHVsZVBhdGgpO1xuXG4gIHJldHVybiBwb3N0Zml4O1xufVxuIiwgImltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBhcnNlciBmcm9tICdwb3N0Y3NzLXNlbGVjdG9yLXBhcnNlcic7XG5cbmltcG9ydCBpc0luc2lkZUdsb2JhbCBmcm9tICcuL2lzSW5zaWRlR2xvYmFsLmpzJztcblxuZnVuY3Rpb24gcmV3cml0ZVNlbGVjdG9yKHNlbCwgcG9zdGZpeCkge1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoc2VsZWN0b3JzKSA9PiB7XG4gICAgc2VsZWN0b3JzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9yLnZhbHVlICs9ICdfJyArIHBvc3RmaXg7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgc2VsZWN0b3IucmVwbGFjZVdpdGgoXG4gICAgICAgICAgcGFyc2VyLnRhZyh7IHZhbHVlOiBzZWxlY3Rvci52YWx1ZSB9KSxcbiAgICAgICAgICBwYXJzZXIuY2xhc3NOYW1lKHsgdmFsdWU6IHBvc3RmaXggfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyByZW1vdmUgOmdsb2JhbFxuICAgIHNlbGVjdG9ycy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdwc2V1ZG8nICYmIHNlbGVjdG9yLnZhbHVlID09PSAnOmdsb2JhbCcpIHtcbiAgICAgICAgc2VsZWN0b3IucmVwbGFjZVdpdGgoLi4uc2VsZWN0b3Iubm9kZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCB0cmFuc2Zvcm1lZCA9IHBhcnNlcih0cmFuc2Zvcm0pLnByb2Nlc3NTeW5jKHNlbCk7XG5cbiAgcmV0dXJuIHRyYW5zZm9ybWVkO1xufVxuXG5mdW5jdGlvbiBpc0luc2lkZUtleWZyYW1lcyhub2RlKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ2F0cnVsZScgJiYgcGFyZW50Lm5hbWUgPT09ICdrZXlmcmFtZXMnKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gaXNJbnNpZGVLZXlmcmFtZXMocGFyZW50KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmV3cml0ZUNzcyhjc3MsIHBvc3RmaXgsIGZpbGVOYW1lLCBsYXllck5hbWUpIHtcbiAgY29uc3QgbGF5ZXJOYW1lV2l0aERlZmF1bHQgPSBsYXllck5hbWUgPz8gJ2NvbXBvbmVudHMnO1xuICBjb25zdCBhc3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cbiAgYXN0LndhbGsoKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAncnVsZScgJiYgIWlzSW5zaWRlS2V5ZnJhbWVzKG5vZGUpKSB7XG4gICAgICBub2RlLnNlbGVjdG9yID0gcmV3cml0ZVNlbGVjdG9yKG5vZGUuc2VsZWN0b3IsIHBvc3RmaXgpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgcmV3cml0dGVuQ3NzID0gYXN0LnRvU3RyaW5nKCk7XG5cbiAgaWYgKCFsYXllck5hbWVXaXRoRGVmYXVsdCkge1xuICAgIHJldHVybiBgLyogJHtmaWxlTmFtZX0gKi9cXG4ke3Jld3JpdHRlbkNzc31cXG5gO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBgLyogJHtmaWxlTmFtZX0gKi9cXG5AbGF5ZXIgJHtsYXllck5hbWVXaXRoRGVmYXVsdH0ge1xcblxcbmAgK1xuICAgIHJld3JpdHRlbkNzcyArXG4gICAgJ1xcbn1cXG4nXG4gICk7XG59XG5cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0luc2lkZUdsb2JhbChub2RlLCBmdW5jKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ3BzZXVkbycgJiYgcGFyZW50LnZhbHVlID09PSAnOmdsb2JhbCcpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUdsb2JhbChwYXJlbnQsIGZ1bmMpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLElBQUFBLGtCQUEyQjtBQUMzQixJQUFBQyxvQkFBaUI7OztBQ0ZqQixxQkFBbUI7QUFDbkIsdUJBQWlCO0FBRWpCLHFCQUFtQjs7O0FDSG5CLHlCQUFnQjtBQWdCVCxTQUFTLEtBQUssWUFBWTtBQUMvQixTQUFPLFVBQU0sbUJBQUFDLFNBQUksVUFBVSxFQUFFLFVBQVUsR0FBRyxDQUFDO0FBQzdDO0FBR08sSUFBTSxxQkFBcUI7OztBQ2hCM0IsU0FBUyxxQkFBcUIsY0FBYztBQU1qRCxRQUFNLGFBQWEsUUFBUSxZQUFZO0FBQ3ZDLFFBQU0sVUFBVSxLQUFLLFVBQVU7QUFFL0IsU0FBTztBQUNUOzs7QUZHTyxTQUFTLFNBQVMsVUFBVTtBQUNqQyxNQUFJLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFDNUIsV0FBTyxxQkFBcUIsUUFBUTtBQUFBLEVBQ3RDO0FBRUEsU0FBTyxtQkFBbUIsUUFBUTtBQUNwQztBQTRDTyxTQUFTLGNBQWMsVUFBVTtBQUN0QyxNQUFJLFNBQVMsU0FBUyxjQUFjLEdBQUc7QUFDckMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLFNBQVMsU0FBUyxhQUFhLEtBQUssU0FBUyxTQUFTLGNB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QVUsS0FBSztBQUVyQixNQUFJLENBQUMsUUFBUSxXQUFXLEtBQUssV0FBVyxHQUFHO0FBQ3pDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxjQUFjLGtCQUFBQyxRQUFLLFNBQVMsT0FBTztBQUV6QyxRQUFNLFVBQVUsUUFBUSxRQUFRLFFBQVEsTUFBTTtBQUM5QyxRQUFNLFVBQVUsUUFBUSxRQUFRLFFBQVEsS0FBSztBQUM3QyxRQUFNLGdCQUFZLDRCQUFXLE9BQU87QUFDcEMsUUFBTSxnQkFBWSw0QkFBVyxPQUFPO0FBRXBDLE1BQUksYUFBYSxXQUFXO0FBQzFCLFVBQU0sVUFBVSxTQUFTLE9BQU87QUFDaEMsVUFBTSxlQUFlO0FBQUEsTUFDbkI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsUUFBUTtBQUFBLElBQ1Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X25vZGVfZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJtZDUiLCAicGF0aCIsICJmaW5kVXAiLCAiZnNTeW5jIiwgInBhcnNlciIsICJwb3N0Y3NzIiwgInBhdGgiXQp9Cg==
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/build/app-dependency-loader.js
21
+ var app_dependency_loader_exports = {};
22
+ __export(app_dependency_loader_exports, {
23
+ default: () => app_dependency_loader_default
24
+ });
25
+ module.exports = __toCommonJS(app_dependency_loader_exports);
26
+ var import_node_fs = require("node:fs");
27
+ function app_dependency_loader_default(source) {
28
+ if (this.resourcePath.endsWith(".js")) {
29
+ const hbsExists = (0, import_node_fs.existsSync)(this.resourcePath.replace(/\.js/, ".hbs"));
30
+ if (hbsExists) {
31
+ return source;
32
+ }
33
+ }
34
+ const cssPath = this.resourcePath.replace(/(\.js)|(\.hbs)/, ".css");
35
+ const cssExists = (0, import_node_fs.existsSync)(cssPath);
36
+ if (cssExists) {
37
+ this.addDependency(cssPath);
38
+ }
39
+ return source;
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2FwcC1kZXBlbmRlbmN5LWxvYWRlci5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc291cmNlKSB7XG4gIGlmICh0aGlzLnJlc291cmNlUGF0aC5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICBjb25zdCBoYnNFeGlzdHMgPSBleGlzdHNTeW5jKHRoaXMucmVzb3VyY2VQYXRoLnJlcGxhY2UoL1xcLmpzLywgJy5oYnMnKSk7XG5cbiAgICBpZiAoaGJzRXhpc3RzKSB7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNzc1BhdGggPSB0aGlzLnJlc291cmNlUGF0aC5yZXBsYWNlKC8oXFwuanMpfChcXC5oYnMpLywgJy5jc3MnKTtcbiAgY29uc3QgY3NzRXhpc3RzID0gZXhpc3RzU3luYyhjc3NQYXRoKTtcblxuICBpZiAoY3NzRXhpc3RzKSB7XG4gICAgdGhpcy5hZGREZXBlbmRlbmN5KGNzc1BhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUEyQjtBQUVaLFNBQVIsOEJBQWtCLFFBQVE7QUFDL0IsTUFBSSxLQUFLLGFBQWEsU0FBUyxLQUFLLEdBQUc7QUFDckMsVUFBTSxnQkFBWSwyQkFBVyxLQUFLLGFBQWEsUUFBUSxRQUFRLE1BQU0sQ0FBQztBQUV0RSxRQUFJLFdBQVc7QUFDYixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVUsS0FBSyxhQUFhLFFBQVEsa0JBQWtCLE1BQU07QUFDbEUsUUFBTSxnQkFBWSwyQkFBVyxPQUFPO0FBRXBDLE1BQUksV0FBVztBQUNiLFNBQUssY0FBYyxPQUFPO0FBQUEsRUFDNUI7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==