@nlabs/lex 1.59.4 → 2.0.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 (41) hide show
  1. package/.storybook/main.ts +3 -47
  2. package/README.md +13 -19
  3. package/__mocks__/build.js +3 -3
  4. package/config.json +3 -1
  5. package/examples/lex.config.js +3 -7
  6. package/lib/LexConfig.d.ts +2 -6
  7. package/lib/LexConfig.js +2 -2
  8. package/lib/commands/ai/ai.js +3 -3
  9. package/lib/commands/build/build.d.ts +5 -3
  10. package/lib/commands/build/build.js +66 -156
  11. package/lib/commands/config/config.js +9 -7
  12. package/lib/commands/dev/dev.d.ts +0 -2
  13. package/lib/commands/dev/dev.js +24 -115
  14. package/lib/commands/init/init.js +4 -9
  15. package/lib/commands/migrate/migrate.js +2 -2
  16. package/lib/commands/serverless-dev/serverless-dev.js +2 -2
  17. package/lib/commands/versions/versions.d.ts +1 -1
  18. package/lib/commands/versions/versions.js +4 -4
  19. package/lib/lex.js +10 -11
  20. package/lib/types.d.ts +1 -1
  21. package/lib/types.js +1 -1
  22. package/lib/utils/app.d.ts +0 -2
  23. package/lib/utils/app.js +2 -29
  24. package/lib/utils/{webpack/LexSvgSpritemapPlugin.d.ts → assets/LexSvgSpritemap.d.ts} +6 -8
  25. package/lib/utils/assets/LexSvgSpritemap.js +219 -0
  26. package/lib/utils/file.d.ts +0 -4
  27. package/lib/utils/file.js +4 -100
  28. package/lib/utils/staticSite.d.ts +15 -0
  29. package/lib/utils/staticSite.js +80 -0
  30. package/lib/utils/vite/assets.d.ts +19 -0
  31. package/lib/utils/vite/assets.js +249 -0
  32. package/lib/utils/vite/config.d.ts +12 -0
  33. package/lib/utils/vite/config.js +279 -0
  34. package/package.json +27 -45
  35. package/postcss.config.js +1 -2
  36. package/tsconfig.lint.json +0 -1
  37. package/tsconfig.test.json +0 -1
  38. package/lib/utils/webpack/LexSvgSpritemapPlugin.js +0 -255
  39. package/scripts/test-webpack.js +0 -453
  40. package/webpack.config.d.ts +0 -2
  41. package/webpack.config.js +0 -960
@@ -0,0 +1,219 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else obj[key] = value;
10
+ return obj;
11
+ }
12
+ /**
13
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
14
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
15
+ */ import { readFileSync } from 'fs';
16
+ import { sync as globSync } from 'glob';
17
+ import { basename as pathBasename, extname as pathExtname, resolve as pathResolve } from 'path';
18
+ import { optimize } from 'svgo';
19
+ const DEFAULT_FILENAME = 'icons/icons.svg';
20
+ const ROOT_EXCLUDED_ATTRIBUTES = new Set([
21
+ 'height',
22
+ 'id',
23
+ 'version',
24
+ 'viewBox',
25
+ 'width',
26
+ 'xmlns'
27
+ ]);
28
+ const escapeAttribute = (value)=>{
29
+ return value.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
30
+ };
31
+ const normalizeAssetFilename = (filename)=>{
32
+ return filename.replace(/^[./]+/, '');
33
+ };
34
+ const parseAttributes = (input)=>{
35
+ const attributes = {};
36
+ const attributeRegex = /([:@\w-]+)\s*=\s*("([^"]*)"|'([^']*)')/g;
37
+ let match = attributeRegex.exec(input);
38
+ while(match){
39
+ attributes[match[1]] = match[3] ?? match[4] ?? '';
40
+ match = attributeRegex.exec(input);
41
+ }
42
+ return attributes;
43
+ };
44
+ const parseSvg = (source)=>{
45
+ const svgMatch = source.replace(/<\?xml[\s\S]*?\?>/ig, '').replace(/<!doctype[\s\S]*?>/ig, '').match(/<svg\b([^>]*)>([\s\S]*?)<\/svg>/i);
46
+ if (!svgMatch) {
47
+ return null;
48
+ }
49
+ return {
50
+ attributes: parseAttributes(svgMatch[1] || ''),
51
+ content: svgMatch[2]?.trim() || ''
52
+ };
53
+ };
54
+ const buildAttributeString = (attributes)=>{
55
+ return Object.entries(attributes).map(([name, value])=>`${name}="${escapeAttribute(value)}"`).join(' ');
56
+ };
57
+ const sanitizeIdentifier = (value)=>{
58
+ const sanitizedValue = value.trim().replaceAll(/\s+/g, '-').replaceAll(/[^A-Za-z0-9_-]/g, '-').replaceAll(/-{2,}/g, '-').replaceAll(/^[-_]+|[-_]+$/g, '');
59
+ const safeValue = sanitizedValue || 'icon';
60
+ return /^[A-Za-z_]/.test(safeValue) ? safeValue : `icon-${safeValue}`;
61
+ };
62
+ const getPrefix = (filePath, prefix)=>{
63
+ if (prefix === false) {
64
+ return '';
65
+ }
66
+ if (typeof prefix === 'function') {
67
+ return prefix(filePath);
68
+ }
69
+ return prefix || '';
70
+ };
71
+ const optimizeSvg = (content, enabled)=>{
72
+ if (!enabled) {
73
+ return content;
74
+ }
75
+ return optimize(content, {
76
+ multipass: true,
77
+ plugins: [
78
+ {
79
+ name: 'preset-default',
80
+ params: {
81
+ overrides: {
82
+ cleanupIds: false,
83
+ removeHiddenElems: false
84
+ }
85
+ }
86
+ }
87
+ ]
88
+ }).data;
89
+ };
90
+ const createSpriteSymbol = (filePath, usedIdentifiers, prefix, warnings)=>{
91
+ const source = readFileSync(filePath, 'utf8');
92
+ const parsedSvg = parseSvg(source);
93
+ if (!parsedSvg) {
94
+ warnings.push(new Error(`Invalid SVG icon: ${filePath}`));
95
+ return null;
96
+ }
97
+ if (!parsedSvg.content) {
98
+ warnings.push(new Error(`SVG icon is empty: ${filePath}`));
99
+ return null;
100
+ }
101
+ const rawIdentifier = `${getPrefix(filePath, prefix)}${pathBasename(filePath, pathExtname(filePath))}`;
102
+ const baseIdentifier = sanitizeIdentifier(rawIdentifier);
103
+ let identifier = baseIdentifier;
104
+ let duplicateIndex = 1;
105
+ while(usedIdentifiers.has(identifier)){
106
+ duplicateIndex += 1;
107
+ identifier = `${baseIdentifier}-${duplicateIndex}`;
108
+ }
109
+ if (identifier !== baseIdentifier) {
110
+ warnings.push(new Error(`Duplicate SVG icon id "${baseIdentifier}" detected, using "${identifier}" for ${filePath}`));
111
+ }
112
+ usedIdentifiers.add(identifier);
113
+ const namespaceAttributes = Object.entries(parsedSvg.attributes).reduce((result, [name, value])=>{
114
+ if (name.toLowerCase().startsWith('xmlns:')) {
115
+ result[name] = value;
116
+ }
117
+ return result;
118
+ }, {});
119
+ const symbolAttributes = Object.entries(parsedSvg.attributes).reduce((result, [name, value])=>{
120
+ if (ROOT_EXCLUDED_ATTRIBUTES.has(name)) {
121
+ return result;
122
+ }
123
+ if (name.toLowerCase().startsWith('xmlns:')) {
124
+ return result;
125
+ }
126
+ result[name] = value;
127
+ return result;
128
+ }, {
129
+ id: identifier
130
+ });
131
+ if (parsedSvg.attributes.viewBox) {
132
+ symbolAttributes.viewBox = parsedSvg.attributes.viewBox;
133
+ } else {
134
+ const width = Number.parseFloat(parsedSvg.attributes.width || '');
135
+ const height = Number.parseFloat(parsedSvg.attributes.height || '');
136
+ if (Number.isFinite(width) && Number.isFinite(height)) {
137
+ symbolAttributes.viewBox = `0 0 ${width} ${height}`;
138
+ } else {
139
+ warnings.push(new Error(`SVG icon is missing a viewBox and readable width/height: ${filePath}`));
140
+ return null;
141
+ }
142
+ }
143
+ return {
144
+ filePath,
145
+ namespaceAttributes,
146
+ symbol: `<symbol ${buildAttributeString(symbolAttributes)}>${parsedSvg.content}</symbol>`
147
+ };
148
+ };
149
+ const collectFiles = (patterns, allowDuplicates)=>{
150
+ const files = patterns.flatMap((pattern)=>{
151
+ return globSync(pattern, {
152
+ absolute: true,
153
+ dot: false,
154
+ nodir: true
155
+ });
156
+ }).map((filePath)=>pathResolve(filePath));
157
+ if (allowDuplicates) {
158
+ return files;
159
+ }
160
+ return [
161
+ ...new Set(files)
162
+ ];
163
+ };
164
+ export class LexSvgSpritemap {
165
+ buildSpritemap() {
166
+ const warnings = [];
167
+ const filePaths = collectFiles(this.patterns, this.options.allowDuplicates);
168
+ if (filePaths.length === 0) {
169
+ return {
170
+ content: null,
171
+ filePaths,
172
+ warnings
173
+ };
174
+ }
175
+ const namespaceAttributes = {};
176
+ const usedIdentifiers = new Set();
177
+ const symbols = filePaths.map((filePath)=>{
178
+ return createSpriteSymbol(filePath, usedIdentifiers, this.options.prefix, warnings);
179
+ }).filter((entry)=>entry !== null);
180
+ if (symbols.length === 0) {
181
+ return {
182
+ content: null,
183
+ filePaths,
184
+ warnings
185
+ };
186
+ }
187
+ for (const symbol of symbols){
188
+ for (const [name, value] of Object.entries(symbol.namespaceAttributes)){
189
+ namespaceAttributes[name] = value;
190
+ }
191
+ }
192
+ const rootAttributes = buildAttributeString({
193
+ xmlns: 'http://www.w3.org/2000/svg',
194
+ ...namespaceAttributes
195
+ });
196
+ const spriteContent = `<svg ${rootAttributes}>${symbols.map((symbol)=>symbol.symbol).join('')}</svg>`;
197
+ return {
198
+ content: optimizeSvg(spriteContent, this.options.optimize),
199
+ filePaths,
200
+ warnings
201
+ };
202
+ }
203
+ constructor(patterns, options = {}){
204
+ _define_property(this, "patterns", void 0);
205
+ _define_property(this, "options", void 0);
206
+ this.patterns = Array.isArray(patterns) ? patterns : [
207
+ patterns
208
+ ];
209
+ this.options = {
210
+ allowDuplicates: options.allowDuplicates ?? false,
211
+ filename: normalizeAssetFilename(options.filename || DEFAULT_FILENAME),
212
+ optimize: options.optimize ?? true,
213
+ prefix: options.prefix ?? false
214
+ };
215
+ }
216
+ }
217
+ export default LexSvgSpritemap;
218
+
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9hc3NldHMvTGV4U3ZnU3ByaXRlbWFwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge3JlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7YmFzZW5hbWUgYXMgcGF0aEJhc2VuYW1lLCBleHRuYW1lIGFzIHBhdGhFeHRuYW1lLCByZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7b3B0aW1pemV9IGZyb20gJ3N2Z28nO1xuXG50eXBlIElkZW50aWZpZXJQcmVmaXggPSBmYWxzZSB8IHN0cmluZyB8ICgoZmlsZVBhdGg6IHN0cmluZykgPT4gc3RyaW5nKTtcblxuZXhwb3J0IGludGVyZmFjZSBMZXhTdmdTcHJpdGVtYXBPcHRpb25zIHtcbiAgcmVhZG9ubHkgYWxsb3dEdXBsaWNhdGVzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGltaXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcHJlZml4PzogSWRlbnRpZmllclByZWZpeDtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZFN2ZyB7XG4gIHJlYWRvbmx5IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNwcml0ZVN5bWJvbCB7XG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZUF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IHN5bWJvbDogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0ZJTEVOQU1FID0gJ2ljb25zL2ljb25zLnN2Zyc7XG5jb25zdCBST09UX0VYQ0xVREVEX0FUVFJJQlVURVMgPSBuZXcgU2V0KFtcbiAgJ2hlaWdodCcsXG4gICdpZCcsXG4gICd2ZXJzaW9uJyxcbiAgJ3ZpZXdCb3gnLFxuICAnd2lkdGgnLFxuICAneG1sbnMnXG5dKTtcblxuY29uc3QgZXNjYXBlQXR0cmlidXRlID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gdmFsdWVcbiAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xufTtcblxuY29uc3Qgbm9ybWFsaXplQXNzZXRGaWxlbmFtZSA9IChmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGZpbGVuYW1lLnJlcGxhY2UoL15bLi9dKy8sICcnKTtcbn07XG5cbmNvbnN0IHBhcnNlQXR0cmlidXRlcyA9IChpbnB1dDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgYXR0cmlidXRlUmVnZXggPSAvKFs6QFxcdy1dKylcXHMqPVxccyooXCIoW15cIl0qKVwifCcoW14nXSopJykvZztcblxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBhdHRyaWJ1dGVSZWdleC5leGVjKGlucHV0KTtcbiAgd2hpbGUobWF0Y2gpIHtcbiAgICBhdHRyaWJ1dGVzW21hdGNoWzFdXSA9IG1hdGNoWzNdID8/IG1hdGNoWzRdID8/ICcnO1xuICAgIG1hdGNoID0gYXR0cmlidXRlUmVnZXguZXhlYyhpbnB1dCk7XG4gIH1cblxuICByZXR1cm4gYXR0cmlidXRlcztcbn07XG5cbmNvbnN0IHBhcnNlU3ZnID0gKHNvdXJjZTogc3RyaW5nKTogUGFyc2VkU3ZnIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHN2Z01hdGNoID0gc291cmNlXG4gICAgLnJlcGxhY2UoLzxcXD94bWxbXFxzXFxTXSo/XFw/Pi9pZywgJycpXG4gICAgLnJlcGxhY2UoLzwhZG9jdHlwZVtcXHNcXFNdKj8+L2lnLCAnJylcbiAgICAubWF0Y2goLzxzdmdcXGIoW14+XSopPihbXFxzXFxTXSo/KTxcXC9zdmc+L2kpO1xuXG4gIGlmKCFzdmdNYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzOiBwYXJzZUF0dHJpYnV0ZXMoc3ZnTWF0Y2hbMV0gfHwgJycpLFxuICAgIGNvbnRlbnQ6IHN2Z01hdGNoWzJdPy50cmltKCkgfHwgJydcbiAgfTtcbn07XG5cbmNvbnN0IGJ1aWxkQXR0cmlidXRlU3RyaW5nID0gKGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtuYW1lfT1cIiR7ZXNjYXBlQXR0cmlidXRlKHZhbHVlKX1cImApXG4gICAgLmpvaW4oJyAnKTtcbn07XG5cbmNvbnN0IHNhbml0aXplSWRlbnRpZmllciA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2FuaXRpemVkVmFsdWUgPSB2YWx1ZVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXFxzKy9nLCAnLScpXG4gICAgLnJlcGxhY2VBbGwoL1teQS1aYS16MC05Xy1dL2csICctJylcbiAgICAucmVwbGFjZUFsbCgvLXsyLH0vZywgJy0nKVxuICAgIC5yZXBsYWNlQWxsKC9eWy1fXSt8Wy1fXSskL2csICcnKTtcblxuICBjb25zdCBzYWZlVmFsdWUgPSBzYW5pdGl6ZWRWYWx1ZSB8fCAnaWNvbic7XG5cbiAgcmV0dXJuIC9eW0EtWmEtel9dLy50ZXN0KHNhZmVWYWx1ZSkgPyBzYWZlVmFsdWUgOiBgaWNvbi0ke3NhZmVWYWx1ZX1gO1xufTtcblxuY29uc3QgZ2V0UHJlZml4ID0gKGZpbGVQYXRoOiBzdHJpbmcsIHByZWZpeDogSWRlbnRpZmllclByZWZpeCk6IHN0cmluZyA9PiB7XG4gIGlmKHByZWZpeCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZih0eXBlb2YgcHJlZml4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHByZWZpeChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gcHJlZml4IHx8ICcnO1xufTtcblxuY29uc3Qgb3B0aW1pemVTdmcgPSAoY29udGVudDogc3RyaW5nLCBlbmFibGVkOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYoIWVuYWJsZWQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHJldHVybiBvcHRpbWl6ZShjb250ZW50LCB7XG4gICAgbXVsdGlwYXNzOiB0cnVlLFxuICAgIHBsdWdpbnM6IFt7XG4gICAgICBuYW1lOiAncHJlc2V0LWRlZmF1bHQnLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGNsZWFudXBJZHM6IGZhbHNlLFxuICAgICAgICAgIHJlbW92ZUhpZGRlbkVsZW1zOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfV1cbiAgfSkuZGF0YTtcbn07XG5cbmNvbnN0IGNyZWF0ZVNwcml0ZVN5bWJvbCA9IChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgdXNlZElkZW50aWZpZXJzOiBTZXQ8c3RyaW5nPixcbiAgcHJlZml4OiBJZGVudGlmaWVyUHJlZml4LFxuICB3YXJuaW5nczogRXJyb3JbXVxuKTogU3ByaXRlU3ltYm9sIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgcGFyc2VkU3ZnID0gcGFyc2VTdmcoc291cmNlKTtcblxuICBpZighcGFyc2VkU3ZnKSB7XG4gICAgd2FybmluZ3MucHVzaChuZXcgRXJyb3IoYEludmFsaWQgU1ZHIGljb246ICR7ZmlsZVBhdGh9YCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYoIXBhcnNlZFN2Zy5jb250ZW50KSB7XG4gICAgd2FybmluZ3MucHVzaChuZXcgRXJyb3IoYFNWRyBpY29uIGlzIGVtcHR5OiAke2ZpbGVQYXRofWApKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHJhd0lkZW50aWZpZXIgPSBgJHtnZXRQcmVmaXgoZmlsZVBhdGgsIHByZWZpeCl9JHtwYXRoQmFzZW5hbWUoZmlsZVBhdGgsIHBhdGhFeHRuYW1lKGZpbGVQYXRoKSl9YDtcbiAgY29uc3QgYmFzZUlkZW50aWZpZXIgPSBzYW5pdGl6ZUlkZW50aWZpZXIocmF3SWRlbnRpZmllcik7XG5cbiAgbGV0IGlkZW50aWZpZXIgPSBiYXNlSWRlbnRpZmllcjtcbiAgbGV0IGR1cGxpY2F0ZUluZGV4ID0gMTtcblxuICB3aGlsZSh1c2VkSWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgZHVwbGljYXRlSW5kZXggKz0gMTtcbiAgICBpZGVudGlmaWVyID0gYCR7YmFzZUlkZW50aWZpZXJ9LSR7ZHVwbGljYXRlSW5kZXh9YDtcbiAgfVxuXG4gIGlmKGlkZW50aWZpZXIgIT09IGJhc2VJZGVudGlmaWVyKSB7XG4gICAgd2FybmluZ3MucHVzaChuZXcgRXJyb3IoYER1cGxpY2F0ZSBTVkcgaWNvbiBpZCBcIiR7YmFzZUlkZW50aWZpZXJ9XCIgZGV0ZWN0ZWQsIHVzaW5nIFwiJHtpZGVudGlmaWVyfVwiIGZvciAke2ZpbGVQYXRofWApKTtcbiAgfVxuXG4gIHVzZWRJZGVudGlmaWVycy5hZGQoaWRlbnRpZmllcik7XG5cbiAgY29uc3QgbmFtZXNwYWNlQXR0cmlidXRlcyA9IE9iamVjdC5lbnRyaWVzKHBhcnNlZFN2Zy5hdHRyaWJ1dGVzKS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKHJlc3VsdCwgW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgIGlmKG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCd4bWxuczonKSkge1xuICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xuXG4gIGNvbnN0IHN5bWJvbEF0dHJpYnV0ZXMgPSBPYmplY3QuZW50cmllcyhwYXJzZWRTdmcuYXR0cmlidXRlcykucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChyZXN1bHQsIFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICBpZihST09UX0VYQ0xVREVEX0FUVFJJQlVURVMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmKG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCd4bWxuczonKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHtcbiAgICBpZDogaWRlbnRpZmllclxuICB9KTtcblxuICBpZihwYXJzZWRTdmcuYXR0cmlidXRlcy52aWV3Qm94KSB7XG4gICAgc3ltYm9sQXR0cmlidXRlcy52aWV3Qm94ID0gcGFyc2VkU3ZnLmF0dHJpYnV0ZXMudmlld0JveDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3aWR0aCA9IE51bWJlci5wYXJzZUZsb2F0KHBhcnNlZFN2Zy5hdHRyaWJ1dGVzLndpZHRoIHx8ICcnKTtcbiAgICBjb25zdCBoZWlnaHQgPSBOdW1iZXIucGFyc2VGbG9hdChwYXJzZWRTdmcuYXR0cmlidXRlcy5oZWlnaHQgfHwgJycpO1xuXG4gICAgaWYoTnVtYmVyLmlzRmluaXRlKHdpZHRoKSAmJiBOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSkge1xuICAgICAgc3ltYm9sQXR0cmlidXRlcy52aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke2hlaWdodH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKG5ldyBFcnJvcihgU1ZHIGljb24gaXMgbWlzc2luZyBhIHZpZXdCb3ggYW5kIHJlYWRhYmxlIHdpZHRoL2hlaWdodDogJHtmaWxlUGF0aH1gKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpbGVQYXRoLFxuICAgIG5hbWVzcGFjZUF0dHJpYnV0ZXMsXG4gICAgc3ltYm9sOiBgPHN5bWJvbCAke2J1aWxkQXR0cmlidXRlU3RyaW5nKHN5bWJvbEF0dHJpYnV0ZXMpfT4ke3BhcnNlZFN2Zy5jb250ZW50fTwvc3ltYm9sPmBcbiAgfTtcbn07XG5cbmNvbnN0IGNvbGxlY3RGaWxlcyA9IChwYXR0ZXJuczogcmVhZG9ubHkgc3RyaW5nW10sIGFsbG93RHVwbGljYXRlczogYm9vbGVhbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZmlsZXMgPSBwYXR0ZXJucy5mbGF0TWFwKChwYXR0ZXJuKSA9PiB7XG4gICAgcmV0dXJuIGdsb2JTeW5jKHBhdHRlcm4sIHtcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgZG90OiBmYWxzZSxcbiAgICAgIG5vZGlyOiB0cnVlXG4gICAgfSkgYXMgc3RyaW5nW107XG4gIH0pLm1hcCgoZmlsZVBhdGgpID0+IHBhdGhSZXNvbHZlKGZpbGVQYXRoKSk7XG5cbiAgaWYoYWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzO1xuICB9XG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVzKV07XG59O1xuXG5leHBvcnQgY2xhc3MgTGV4U3ZnU3ByaXRlbWFwIHtcbiAgcmVhZG9ubHkgcGF0dGVybnM6IHN0cmluZ1tdO1xuICByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxMZXhTdmdTcHJpdGVtYXBPcHRpb25zPjtcblxuICBjb25zdHJ1Y3RvcihwYXR0ZXJuczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IExleFN2Z1Nwcml0ZW1hcE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMucGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHBhdHRlcm5zKSA/IHBhdHRlcm5zIDogW3BhdHRlcm5zXTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBhbGxvd0R1cGxpY2F0ZXM6IG9wdGlvbnMuYWxsb3dEdXBsaWNhdGVzID8/IGZhbHNlLFxuICAgICAgZmlsZW5hbWU6IG5vcm1hbGl6ZUFzc2V0RmlsZW5hbWUob3B0aW9ucy5maWxlbmFtZSB8fCBERUZBVUxUX0ZJTEVOQU1FKSxcbiAgICAgIG9wdGltaXplOiBvcHRpb25zLm9wdGltaXplID8/IHRydWUsXG4gICAgICBwcmVmaXg6IG9wdGlvbnMucHJlZml4ID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGJ1aWxkU3ByaXRlbWFwKCk6IHtjb250ZW50OiBzdHJpbmcgfCBudWxsOyBmaWxlUGF0aHM6IHN0cmluZ1tdOyB3YXJuaW5nczogRXJyb3JbXX0ge1xuICAgIGNvbnN0IHdhcm5pbmdzOiBFcnJvcltdID0gW107XG4gICAgY29uc3QgZmlsZVBhdGhzID0gY29sbGVjdEZpbGVzKHRoaXMucGF0dGVybnMsIHRoaXMub3B0aW9ucy5hbGxvd0R1cGxpY2F0ZXMpO1xuXG4gICAgaWYoZmlsZVBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogbnVsbCxcbiAgICAgICAgZmlsZVBhdGhzLFxuICAgICAgICB3YXJuaW5nc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lc3BhY2VBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgY29uc3QgdXNlZElkZW50aWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3ltYm9scyA9IGZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4gY3JlYXRlU3ByaXRlU3ltYm9sKGZpbGVQYXRoLCB1c2VkSWRlbnRpZmllcnMsIHRoaXMub3B0aW9ucy5wcmVmaXgsIHdhcm5pbmdzKTtcbiAgICB9KS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgU3ByaXRlU3ltYm9sID0+IGVudHJ5ICE9PSBudWxsKTtcblxuICAgIGlmKHN5bWJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBudWxsLFxuICAgICAgICBmaWxlUGF0aHMsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZvcihjb25zdCBzeW1ib2wgb2Ygc3ltYm9scykge1xuICAgICAgZm9yKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3ltYm9sLm5hbWVzcGFjZUF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIG5hbWVzcGFjZUF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByb290QXR0cmlidXRlcyA9IGJ1aWxkQXR0cmlidXRlU3RyaW5nKHtcbiAgICAgIHhtbG5zOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgLi4ubmFtZXNwYWNlQXR0cmlidXRlc1xuICAgIH0pO1xuICAgIGNvbnN0IHNwcml0ZUNvbnRlbnQgPSBgPHN2ZyAke3Jvb3RBdHRyaWJ1dGVzfT4ke3N5bWJvbHMubWFwKChzeW1ib2wpID0+IHN5bWJvbC5zeW1ib2wpLmpvaW4oJycpfTwvc3ZnPmA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogb3B0aW1pemVTdmcoc3ByaXRlQ29udGVudCwgdGhpcy5vcHRpb25zLm9wdGltaXplKSxcbiAgICAgIGZpbGVQYXRocyxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IExleFN2Z1Nwcml0ZW1hcDtcbiJdLCJuYW1lcyI6WyJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJiYXNlbmFtZSIsInBhdGhCYXNlbmFtZSIsImV4dG5hbWUiLCJwYXRoRXh0bmFtZSIsInJlc29sdmUiLCJwYXRoUmVzb2x2ZSIsIm9wdGltaXplIiwiREVGQVVMVF9GSUxFTkFNRSIsIlJPT1RfRVhDTFVERURfQVRUUklCVVRFUyIsIlNldCIsImVzY2FwZUF0dHJpYnV0ZSIsInZhbHVlIiwicmVwbGFjZUFsbCIsIm5vcm1hbGl6ZUFzc2V0RmlsZW5hbWUiLCJmaWxlbmFtZSIsInJlcGxhY2UiLCJwYXJzZUF0dHJpYnV0ZXMiLCJpbnB1dCIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVSZWdleCIsIm1hdGNoIiwiZXhlYyIsInBhcnNlU3ZnIiwic291cmNlIiwic3ZnTWF0Y2giLCJjb250ZW50IiwidHJpbSIsImJ1aWxkQXR0cmlidXRlU3RyaW5nIiwiT2JqZWN0IiwiZW50cmllcyIsIm1hcCIsIm5hbWUiLCJqb2luIiwic2FuaXRpemVJZGVudGlmaWVyIiwic2FuaXRpemVkVmFsdWUiLCJzYWZlVmFsdWUiLCJ0ZXN0IiwiZ2V0UHJlZml4IiwiZmlsZVBhdGgiLCJwcmVmaXgiLCJvcHRpbWl6ZVN2ZyIsImVuYWJsZWQiLCJtdWx0aXBhc3MiLCJwbHVnaW5zIiwicGFyYW1zIiwib3ZlcnJpZGVzIiwiY2xlYW51cElkcyIsInJlbW92ZUhpZGRlbkVsZW1zIiwiZGF0YSIsImNyZWF0ZVNwcml0ZVN5bWJvbCIsInVzZWRJZGVudGlmaWVycyIsIndhcm5pbmdzIiwicGFyc2VkU3ZnIiwicHVzaCIsIkVycm9yIiwicmF3SWRlbnRpZmllciIsImJhc2VJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsImR1cGxpY2F0ZUluZGV4IiwiaGFzIiwiYWRkIiwibmFtZXNwYWNlQXR0cmlidXRlcyIsInJlZHVjZSIsInJlc3VsdCIsInRvTG93ZXJDYXNlIiwic3RhcnRzV2l0aCIsInN5bWJvbEF0dHJpYnV0ZXMiLCJpZCIsInZpZXdCb3giLCJ3aWR0aCIsIk51bWJlciIsInBhcnNlRmxvYXQiLCJoZWlnaHQiLCJpc0Zpbml0ZSIsInN5bWJvbCIsImNvbGxlY3RGaWxlcyIsInBhdHRlcm5zIiwiYWxsb3dEdXBsaWNhdGVzIiwiZmlsZXMiLCJmbGF0TWFwIiwicGF0dGVybiIsImFic29sdXRlIiwiZG90Iiwibm9kaXIiLCJMZXhTdmdTcHJpdGVtYXAiLCJidWlsZFNwcml0ZW1hcCIsImZpbGVQYXRocyIsIm9wdGlvbnMiLCJsZW5ndGgiLCJzeW1ib2xzIiwiZmlsdGVyIiwiZW50cnkiLCJyb290QXR0cmlidXRlcyIsInhtbG5zIiwic3ByaXRlQ29udGVudCIsIkFycmF5IiwiaXNBcnJheSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxZQUFZLFFBQU8sS0FBSztBQUNoQyxTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxZQUFZQyxZQUFZLEVBQUVDLFdBQVdDLFdBQVcsRUFBRUMsV0FBV0MsV0FBVyxRQUFPLE9BQU87QUFDOUYsU0FBUUMsUUFBUSxRQUFPLE9BQU87QUFzQjlCLE1BQU1DLG1CQUFtQjtBQUN6QixNQUFNQywyQkFBMkIsSUFBSUMsSUFBSTtJQUN2QztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDRDtBQUVELE1BQU1DLGtCQUFrQixDQUFDQztJQUN2QixPQUFPQSxNQUNKQyxVQUFVLENBQUMsS0FBSyxTQUNoQkEsVUFBVSxDQUFDLEtBQUssVUFDaEJBLFVBQVUsQ0FBQyxLQUFLLFFBQ2hCQSxVQUFVLENBQUMsS0FBSztBQUNyQjtBQUVBLE1BQU1DLHlCQUF5QixDQUFDQztJQUM5QixPQUFPQSxTQUFTQyxPQUFPLENBQUMsVUFBVTtBQUNwQztBQUVBLE1BQU1DLGtCQUFrQixDQUFDQztJQUN2QixNQUFNQyxhQUFxQyxDQUFDO0lBQzVDLE1BQU1DLGlCQUFpQjtJQUV2QixJQUFJQyxRQUFnQ0QsZUFBZUUsSUFBSSxDQUFDSjtJQUN4RCxNQUFN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
@@ -4,7 +4,3 @@ export declare const relativeFilePath: (filename: string, dirPath?: string, back
4
4
  export declare const relativeNodePath: (packageName: string, dirPath?: string) => string;
5
5
  export declare const resolveBinaryPath: (binaryName: string, packageName?: string) => string;
6
6
  export declare const findTailwindCssPath: () => string;
7
- export declare const resolveWebpackPaths: (currentDirname: string) => {
8
- webpackPath: string;
9
- webpackConfig: string;
10
- };
package/lib/utils/file.js CHANGED
@@ -5,45 +5,16 @@
5
5
  import { existsSync, readFileSync } from 'fs';
6
6
  import { sync as globSync } from 'glob';
7
7
  import { resolve as pathResolve, dirname } from 'path';
8
+ import { fileURLToPath } from 'url';
8
9
  import { LexConfig } from '../LexConfig.js';
9
- export const getDirName = ()=>{
10
- try {
11
- return eval('new URL(".", import.meta.url).pathname');
12
- } catch {
13
- return process.cwd();
14
- }
15
- };
10
+ export const getDirName = ()=>dirname(fileURLToPath(import.meta.url));
16
11
  export const getLexPackageJsonPath = ()=>{
17
12
  const LEX_PACKAGE_NAME = '@nlabs/lex';
18
13
  const lexInNodeModules = pathResolve(process.cwd(), 'node_modules/@nlabs/lex/package.json');
19
14
  if (existsSync(lexInNodeModules)) {
20
15
  return lexInNodeModules;
21
16
  }
22
- let startDir;
23
- if (process.env.LEX_ROOT) {
24
- startDir = process.env.LEX_ROOT;
25
- } else {
26
- try {
27
- startDir = eval('new URL(".", import.meta.url).pathname');
28
- } catch {
29
- try {
30
- startDir = eval('__filename ? require("path").dirname(__filename) : null');
31
- if (!startDir) {
32
- throw new Error('__filename not available');
33
- }
34
- } catch {
35
- try {
36
- if (process.argv[1] && !process.argv[1].includes('node')) {
37
- startDir = dirname(process.argv[1]);
38
- } else {
39
- throw new Error('process.argv[1] not suitable');
40
- }
41
- } catch {
42
- startDir = process.cwd();
43
- }
44
- }
45
- }
46
- }
17
+ const startDir = process.env.LEX_ROOT || getDirName();
47
18
  let dir = startDir;
48
19
  for(let i = 0; i < 8; i++){
49
20
  const pkgPath = pathResolve(dir, 'package.json');
@@ -158,72 +129,5 @@ export const findTailwindCssPath = ()=>{
158
129
  }
159
130
  return '';
160
131
  };
161
- export const resolveWebpackPaths = (currentDirname)=>{
162
- const possibleWebpackPaths = [
163
- pathResolve(process.cwd(), 'node_modules/webpack-cli/bin/cli.js'),
164
- pathResolve(process.cwd(), 'node_modules/.bin/webpack'),
165
- pathResolve(process.cwd(), 'node_modules/@nlabs/lex', 'node_modules/webpack-cli/bin/cli.js'),
166
- pathResolve(process.cwd(), 'node_modules/@nlabs/lex', 'node_modules/.bin/webpack'),
167
- pathResolve(currentDirname, 'node_modules/@nlabs/lex/node_modules/webpack-cli/bin/cli.js'),
168
- pathResolve(currentDirname, 'node_modules/@nlabs/lex/node_modules/.bin/webpack'),
169
- pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'node_modules/webpack-cli/bin/cli.js'),
170
- pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'node_modules/.bin/webpack')
171
- ];
172
- let webpackPath = '';
173
- for (const path of possibleWebpackPaths){
174
- if (existsSync(path)) {
175
- webpackPath = path;
176
- break;
177
- }
178
- }
179
- if (!webpackPath) {
180
- try {
181
- const lexPackagePath = getLexPackageJsonPath();
182
- const lexPackageDir = dirname(lexPackagePath);
183
- const lexWebpackCli = pathResolve(lexPackageDir, 'node_modules/webpack-cli/bin/cli.js');
184
- const lexWebpackBin = pathResolve(lexPackageDir, 'node_modules/.bin/webpack');
185
- if (existsSync(lexWebpackCli)) {
186
- webpackPath = lexWebpackCli;
187
- } else if (existsSync(lexWebpackBin)) {
188
- webpackPath = lexWebpackBin;
189
- } else {
190
- webpackPath = 'npx';
191
- }
192
- } catch {
193
- webpackPath = 'npx';
194
- }
195
- }
196
- const possibleWebpackConfigPaths = [
197
- pathResolve(process.cwd(), 'webpack.config.js'),
198
- pathResolve(process.cwd(), 'webpack.config.ts'),
199
- pathResolve(process.cwd(), 'node_modules/@nlabs/lex/webpack.config.js'),
200
- pathResolve(process.cwd(), 'node_modules/@nlabs/lex/webpack.config.ts'),
201
- pathResolve(currentDirname, 'node_modules/@nlabs/lex/webpack.config.js'),
202
- pathResolve(currentDirname, 'node_modules/@nlabs/lex/webpack.config.ts'),
203
- pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'webpack.config.js'),
204
- pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'webpack.config.ts')
205
- ];
206
- let webpackConfig = '';
207
- for (const path of possibleWebpackConfigPaths){
208
- if (existsSync(path)) {
209
- webpackConfig = path;
210
- break;
211
- }
212
- }
213
- if (!webpackConfig) {
214
- const lexPackagePath = getLexPackageJsonPath();
215
- const lexPackageDir = dirname(lexPackagePath);
216
- const lexWebpackConfig = pathResolve(lexPackageDir, 'webpack.config.js');
217
- if (existsSync(lexWebpackConfig)) {
218
- webpackConfig = lexWebpackConfig;
219
- } else {
220
- webpackConfig = pathResolve(currentDirname, '../../webpack.config.js');
221
- }
222
- }
223
- return {
224
- webpackConfig,
225
- webpackPath
226
- };
227
- };
228
132
 
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGRpcm5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vTGV4Q29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IGdldERpck5hbWUgPSAoKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbCgnbmV3IFVSTChcIi5cIiwgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZScpO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGV4UGFja2FnZUpzb25QYXRoID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IExFWF9QQUNLQUdFX05BTUUgPSAnQG5sYWJzL2xleCc7XG5cbiAgY29uc3QgbGV4SW5Ob2RlTW9kdWxlcyA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC9wYWNrYWdlLmpzb24nKTtcblxuICBpZihleGlzdHNTeW5jKGxleEluTm9kZU1vZHVsZXMpKSB7XG4gICAgcmV0dXJuIGxleEluTm9kZU1vZHVsZXM7XG4gIH1cblxuICBsZXQgc3RhcnREaXI6IHN0cmluZztcblxuICBpZihwcm9jZXNzLmVudi5MRVhfUk9PVCkge1xuICAgIHN0YXJ0RGlyID0gcHJvY2Vzcy5lbnYuTEVYX1JPT1Q7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXJ0RGlyID0gZXZhbCgnbmV3IFVSTChcIi5cIiwgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZScpO1xuICAgIH0gY2F0Y2h7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFydERpciA9IGV2YWwoJ19fZmlsZW5hbWUgPyByZXF1aXJlKFwicGF0aFwiKS5kaXJuYW1lKF9fZmlsZW5hbWUpIDogbnVsbCcpO1xuICAgICAgICBpZighc3RhcnREaXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ19fZmlsZW5hbWUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoe1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmKHByb2Nlc3MuYXJndlsxXSAmJiAhcHJvY2Vzcy5hcmd2WzFdLmluY2x1ZGVzKCdub2RlJykpIHtcbiAgICAgICAgICAgIHN0YXJ0RGlyID0gZGlybmFtZShwcm9jZXNzLmFyZ3ZbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYXJndlsxXSBub3Qgc3VpdGFibGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2h7XG4gICAgICAgICAgc3RhcnREaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IGRpciA9IHN0YXJ0RGlyO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGhSZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocGtnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBrZ1BhdGgsICd1dGY4JykpO1xuICAgICAgICBpZihwa2cubmFtZSA9PT0gTEVYX1BBQ0tBR0VfTkFNRSkge1xuICAgICAgICAgIHJldHVybiBwa2dQYXRoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoe1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG4gICAgaWYocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3BhY2thZ2UuanNvbicpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xuICAgIGNvbnN0IHByZXZpb3VzUGF0aDogc3RyaW5nID0gQXJyYXkoYmFja1VwKS5maWxsKG51bGwpLm1hcCgoKSA9PiAnLi4vJykuam9pbignJyk7XG4gICAgcmV0dXJuIHBhdGhSZXNvbHZlKGZpbGVQYXRoLCBwcmV2aW91c1BhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRGaWxlVXAuc3luYyhmaWxlbmFtZSwgZGlyUGF0aCwgbmVzdERlcHRoKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWxhdGl2ZU5vZGVQYXRoID0gKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBub2RlUGF0aCA9IHBhdGhSZXNvbHZlKGRpclBhdGgsICdub2RlX21vZHVsZXMnLCBwYWNrYWdlTmFtZSk7XG4gIGlmKGV4aXN0c1N5bmMobm9kZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vZGVQYXRoO1xuICB9XG5cbiAgLy8gQ2hlY2sgcGFyZW50IGRpcmVjdG9yaWVzIGZvciBub2RlX21vZHVsZXNcbiAgbGV0IGNoZWNrRGlyID0gZGlyUGF0aDtcbiAgZm9yKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICBjb25zdCBjaGVja1BhdGggPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbiAgICBpZihleGlzdHNTeW5jKGNoZWNrUGF0aCkpIHtcbiAgICAgIHJldHVybiBjaGVja1BhdGg7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGhSZXNvbHZlKGNoZWNrRGlyLCAnLi4nKTtcbiAgICBpZihwYXJlbnREaXIgPT09IGNoZWNrRGlyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2hlY2tEaXIgPSBwYXJlbnREaXI7XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUJpbmFyeVBhdGggPSAoYmluYXJ5TmFtZTogc3RyaW5nLCBwYWNrYWdlTmFtZT86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcblxuICBjb25zdCBsZXhCaW5QYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLy5iaW4vJHtiaW5hcnlOYW1lfWApO1xuICBpZihleGlzdHNTeW5jKGxleEJpblBhdGgpKSB7XG4gICAgcmV0dXJuIGxleEJpblBhdGg7XG4gIH1cblxuICBpZihwYWNrYWdlTmFtZSkge1xuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5QYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9L2Jpbi8ke2JpbmFyeU5hbWV9YCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQYWNrYWdlQmluUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhQYWNrYWdlQmluUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBsZXhQYWNrYWdlQmluSnNQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9L2Jpbi8ke2JpbmFyeU5hbWV9LmpzYCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQYWNrYWdlQmluSnNQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5Kc1BhdGg7XG4gICAgfVxuXG4gICAgY29uc3QgbGV4UGFja2FnZUJpbkNqc1BhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX0uY2pzYCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQYWNrYWdlQmluQ2pzUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhQYWNrYWdlQmluQ2pzUGF0aDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjaGVja0JpblVwID0gKHN0YXJ0RGlyOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgY2hlY2tEaXIgPSBzdGFydERpcjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICBjb25zdCBtb25vcmVwb0JpblBhdGggPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgYG5vZGVfbW9kdWxlcy8uYmluLyR7YmluYXJ5TmFtZX1gKTtcbiAgICAgIGlmKGV4aXN0c1N5bmMobW9ub3JlcG9CaW5QYXRoKSkge1xuICAgICAgICByZXR1cm4gbW9ub3JlcG9CaW5QYXRoO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aFJlc29sdmUoY2hlY2tEaXIsICcuLicpO1xuICAgICAgaWYocGFyZW50RGlyID09PSBjaGVja0Rpcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNoZWNrRGlyID0gcGFyZW50RGlyO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgY29uc3QgZnJvbUN3ZCA9IGNoZWNrQmluVXAocHJvY2Vzcy5jd2QoKSk7XG4gIGlmKGZyb21Dd2QpIHtcbiAgICByZXR1cm4gZnJvbUN3ZDtcbiAgfVxuXG4gIGNvbnN0IGZyb21MZXggPSBjaGVja0JpblVwKGxleERpcik7XG4gIGlmKGZyb21MZXgpIHtcbiAgICByZXR1cm4gZnJvbUxleDtcbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kVGFpbHdpbmRDc3NQYXRoID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRhaWx3aW5kUGF0dGVybnMgPSBbJyoqL3RhaWx3aW5kLmNzcyddO1xuXG4gIGZvcihjb25zdCBwYXR0ZXJuIG9mIHRhaWx3aW5kUGF0dGVybnMpIHtcbiAgICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKHBhdHRlcm4sIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovZGlzdC8qKicsICcqKi9saWIvKionLCAnKiovYnVpbGQvKionLCAnKiovLnN0b3J5Ym9vay8qKiddXG4gICAgfSk7XG5cbiAgICBpZihmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZXNbMF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlV2VicGFja1BhdGhzID0gKGN1cnJlbnREaXJuYW1lOiBzdHJpbmcpOiB7d2VicGFja1BhdGg6IHN0cmluZzsgd2VicGFja0NvbmZpZzogc3RyaW5nfSA9PiB7XG4gIGNvbnN0IHBvc3NpYmxlV2VicGFja1BhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvd2VicGFjay1jbGkvYmluL2NsaS5qcycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC9ub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdub2RlX21vZHVsZXMvd2VicGFjay1jbGkvYmluL2NsaS5qcycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzLy5iaW4vd2VicGFjaycpXG4gIF07XG5cbiAgbGV0IHdlYnBhY2tQYXRoID0gJyc7XG5cbiAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVXZWJwYWNrUGF0aHMpIHtcbiAgICBpZihleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICB3ZWJwYWNrUGF0aCA9IHBhdGg7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZighd2VicGFja1BhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGV4UGFja2FnZVBhdGggPSBnZXRMZXhQYWNrYWdlSnNvblBhdGgoKTtcbiAgICAgIGNvbnN0IGxleFBhY2thZ2VEaXIgPSBkaXJuYW1lKGxleFBhY2thZ2VQYXRoKTtcbiAgICAgIGNvbnN0IGxleFdlYnBhY2tDbGkgPSBwYXRoUmVzb2x2ZShsZXhQYWNrYWdlRGlyLCAnbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKTtcbiAgICAgIGNvbnN0IGxleFdlYnBhY2tCaW4gPSBwYXRoUmVzb2x2ZShsZXhQYWNrYWdlRGlyLCAnbm9kZV9tb2R1bGVzLy5iaW4vd2VicGFjaycpO1xuXG4gICAgICBpZihleGlzdHNTeW5jKGxleFdlYnBhY2tDbGkpKSB7XG4gICAgICAgIHdlYnBhY2tQYXRoID0gbGV4V2VicGFja0NsaTtcbiAgICAgIH0gZWxzZSBpZihleGlzdHNTeW5jKGxleFdlYnBhY2tCaW4pKSB7XG4gICAgICAgIHdlYnBhY2tQYXRoID0gbGV4V2VicGFja0JpbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdlYnBhY2tQYXRoID0gJ25weCc7XG4gICAgICB9XG4gICAgfSBjYXRjaHtcbiAgICAgIHdlYnBhY2tQYXRoID0gJ25weCc7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcG9zc2libGVXZWJwYWNrQ29uZmlnUGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnLnRzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3dlYnBhY2suY29uZmlnLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3dlYnBhY2suY29uZmlnLnRzJyksXG4gICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC93ZWJwYWNrLmNvbmZpZy5qcycpLFxuICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ3dlYnBhY2suY29uZmlnLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICd3ZWJwYWNrLmNvbmZpZy50cycpXG4gIF07XG5cbiAgbGV0IHdlYnBhY2tDb25maWcgPSAnJztcblxuICBmb3IoY29uc3QgcGF0aCBvZiBwb3NzaWJsZVdlYnBhY2tDb25maWdQYXRocykge1xuICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBwYXRoO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYoIXdlYnBhY2tDb25maWcpIHtcbiAgICBjb25zdCBsZXhQYWNrYWdlUGF0aCA9IGdldExleFBhY2thZ2VKc29uUGF0aCgpO1xuICAgIGNvbnN0IGxleFBhY2thZ2VEaXIgPSBkaXJuYW1lKGxleFBhY2thZ2VQYXRoKTtcbiAgICBjb25zdCBsZXhXZWJwYWNrQ29uZmlnID0gcGF0aFJlc29sdmUobGV4UGFja2FnZURpciwgJ3dlYnBhY2suY29uZmlnLmpzJyk7XG5cbiAgICBpZihleGlzdHNTeW5jKGxleFdlYnBhY2tDb25maWcpKSB7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gbGV4V2VicGFja0NvbmZpZztcbiAgICB9IGVsc2Uge1xuICAgICAgd2VicGFja0NvbmZpZyA9IHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnLi4vLi4vd2VicGFjay5jb25maWcuanMnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge3dlYnBhY2tDb25maWcsIHdlYnBhY2tQYXRofTtcbn07Il0sIm5hbWVzIjpbImZpbmRGaWxlVXAiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3luYyIsImdsb2JTeW5jIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiZGlybmFtZSIsIkxleENvbmZpZyIsImdldERpck5hbWUiLCJldmFsIiwicHJvY2VzcyIsImN3ZCIsImdldExleFBhY2thZ2VKc29uUGF0aCIsIkxFWF9QQUNLQUdFX05BTUUiLCJsZXhJbk5vZGVNb2R1bGVzIiwic3RhcnREaXIiLCJlbnYiLCJMRVhfUk9PVCIsIkVycm9yIiwiYXJndiIsImluY2x1ZGVzIiwiZGlyIiwiaSIsInBrZ1BhdGgiLCJwa2ciLCJKU09OIiwicGFyc2UiLCJuYW1lIiwicGFyZW50IiwicmVsYXRpdmVGaWxlUGF0aCIsImZpbGVuYW1lIiwiZGlyUGF0aCIsImJhY2tVcCIsIm5lc3REZXB0aCIsImZpbGVQYXRoIiwicHJldmlvdXNQYXRoIiwiQXJyYXkiLCJmaWxsIiwibWFwIiwiam9pbiIsInJlbGF0aXZlTm9kZVBhdGgiLCJwYWNrYWdlTmFtZSIsIm5vZGVQYXRoIiwiY2hlY2tEaXIiLCJjaGVja1BhdGgiLCJwYXJlbnREaXIiLCJyZXNvbHZlQmluYXJ5UGF0aCIsImJpbmFyeU5hbWUiLCJsZXhEaXIiLCJnZXRMZXhEaXIiLCJsZXhCaW5QYXRoIiwibGV4UGFja2FnZUJpblBhdGgiLCJsZXhQYWNrYWdlQmluSnNQYXRoIiwibGV4UGFja2FnZUJpbkNqc1BhdGgiLCJjaGVja0JpblVwIiwibW9ub3JlcG9CaW5QYXRoIiwiZnJvbUN3ZCIsImZyb21MZXgiLCJmaW5kVGFpbHdpbmRDc3NQYXRoIiwidGFpbHdpbmRQYXR0ZXJucyIsInBhdHRlcm4iLCJmaWxlcyIsImlnbm9yZSIsImxlbmd0aCIsInJlc29sdmVXZWJwYWNrUGF0aHMiLCJjdXJyZW50RGlybmFtZSIsInBvc3NpYmxlV2VicGFja1BhdGhzIiwiTEVYX0hPTUUiLCJ3ZWJwYWNrUGF0aCIsInBhdGgiLCJsZXhQYWNrYWdlUGF0aCIsImxleFBhY2thZ2VEaXIiLCJsZXhXZWJwYWNrQ2xpIiwibGV4V2VicGFja0JpbiIsInBvc3NpYmxlV2VicGFja0NvbmZpZ1Bh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
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGRpcm5hbWV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICd1cmwnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vTGV4Q29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IGdldERpck5hbWUgPSAoKTogc3RyaW5nID0+IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGNvbnN0IGdldExleFBhY2thZ2VKc29uUGF0aCA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBMRVhfUEFDS0FHRV9OQU1FID0gJ0BubGFicy9sZXgnO1xuXG4gIGNvbnN0IGxleEluTm9kZU1vZHVsZXMgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvcGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhsZXhJbk5vZGVNb2R1bGVzKSkge1xuICAgIHJldHVybiBsZXhJbk5vZGVNb2R1bGVzO1xuICB9XG5cbiAgY29uc3Qgc3RhcnREaXIgPSBwcm9jZXNzLmVudi5MRVhfUk9PVCB8fCBnZXREaXJOYW1lKCk7XG5cbiAgbGV0IGRpciA9IHN0YXJ0RGlyO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGhSZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocGtnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBrZ1BhdGgsICd1dGY4JykpO1xuICAgICAgICBpZihwa2cubmFtZSA9PT0gTEVYX1BBQ0tBR0VfTkFNRSkge1xuICAgICAgICAgIHJldHVybiBwa2dQYXRoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoe1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG4gICAgaWYocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3BhY2thZ2UuanNvbicpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xuICAgIGNvbnN0IHByZXZpb3VzUGF0aDogc3RyaW5nID0gQXJyYXkoYmFja1VwKS5maWxsKG51bGwpLm1hcCgoKSA9PiAnLi4vJykuam9pbignJyk7XG4gICAgcmV0dXJuIHBhdGhSZXNvbHZlKGZpbGVQYXRoLCBwcmV2aW91c1BhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRGaWxlVXAuc3luYyhmaWxlbmFtZSwgZGlyUGF0aCwgbmVzdERlcHRoKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWxhdGl2ZU5vZGVQYXRoID0gKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBub2RlUGF0aCA9IHBhdGhSZXNvbHZlKGRpclBhdGgsICdub2RlX21vZHVsZXMnLCBwYWNrYWdlTmFtZSk7XG4gIGlmKGV4aXN0c1N5bmMobm9kZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vZGVQYXRoO1xuICB9XG5cbiAgLy8gQ2hlY2sgcGFyZW50IGRpcmVjdG9yaWVzIGZvciBub2RlX21vZHVsZXNcbiAgbGV0IGNoZWNrRGlyID0gZGlyUGF0aDtcbiAgZm9yKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICBjb25zdCBjaGVja1BhdGggPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbiAgICBpZihleGlzdHNTeW5jKGNoZWNrUGF0aCkpIHtcbiAgICAgIHJldHVybiBjaGVja1BhdGg7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGhSZXNvbHZlKGNoZWNrRGlyLCAnLi4nKTtcbiAgICBpZihwYXJlbnREaXIgPT09IGNoZWNrRGlyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2hlY2tEaXIgPSBwYXJlbnREaXI7XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUJpbmFyeVBhdGggPSAoYmluYXJ5TmFtZTogc3RyaW5nLCBwYWNrYWdlTmFtZT86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcblxuICBjb25zdCBsZXhCaW5QYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLy5iaW4vJHtiaW5hcnlOYW1lfWApO1xuICBpZihleGlzdHNTeW5jKGxleEJpblBhdGgpKSB7XG4gICAgcmV0dXJuIGxleEJpblBhdGg7XG4gIH1cblxuICBpZihwYWNrYWdlTmFtZSkge1xuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5QYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9L2Jpbi8ke2JpbmFyeU5hbWV9YCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQYWNrYWdlQmluUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhQYWNrYWdlQmluUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBsZXhQYWNrYWdlQmluSnNQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9L2Jpbi8ke2JpbmFyeU5hbWV9LmpzYCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQYWNrYWdlQmluSnNQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5Kc1BhdGg7XG4gICAgfVxuXG4gICAgY29uc3QgbGV4UGFja2FnZUJpbkNqc1BhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX0uY2pzYCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQYWNrYWdlQmluQ2pzUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhQYWNrYWdlQmluQ2pzUGF0aDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjaGVja0JpblVwID0gKHN0YXJ0RGlyOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgY2hlY2tEaXIgPSBzdGFydERpcjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICBjb25zdCBtb25vcmVwb0JpblBhdGggPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgYG5vZGVfbW9kdWxlcy8uYmluLyR7YmluYXJ5TmFtZX1gKTtcbiAgICAgIGlmKGV4aXN0c1N5bmMobW9ub3JlcG9CaW5QYXRoKSkge1xuICAgICAgICByZXR1cm4gbW9ub3JlcG9CaW5QYXRoO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aFJlc29sdmUoY2hlY2tEaXIsICcuLicpO1xuICAgICAgaWYocGFyZW50RGlyID09PSBjaGVja0Rpcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNoZWNrRGlyID0gcGFyZW50RGlyO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgY29uc3QgZnJvbUN3ZCA9IGNoZWNrQmluVXAocHJvY2Vzcy5jd2QoKSk7XG4gIGlmKGZyb21Dd2QpIHtcbiAgICByZXR1cm4gZnJvbUN3ZDtcbiAgfVxuXG4gIGNvbnN0IGZyb21MZXggPSBjaGVja0JpblVwKGxleERpcik7XG4gIGlmKGZyb21MZXgpIHtcbiAgICByZXR1cm4gZnJvbUxleDtcbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kVGFpbHdpbmRDc3NQYXRoID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRhaWx3aW5kUGF0dGVybnMgPSBbJyoqL3RhaWx3aW5kLmNzcyddO1xuXG4gIGZvcihjb25zdCBwYXR0ZXJuIG9mIHRhaWx3aW5kUGF0dGVybnMpIHtcbiAgICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKHBhdHRlcm4sIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovZGlzdC8qKicsICcqKi9saWIvKionLCAnKiovYnVpbGQvKionLCAnKiovLnN0b3J5Ym9vay8qKiddXG4gICAgfSk7XG5cbiAgICBpZihmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZXNbMF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG4iXSwibmFtZXMiOlsiZmluZEZpbGVVcCIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJkaXJuYW1lIiwiZmlsZVVSTFRvUGF0aCIsIkxleENvbmZpZyIsImdldERpck5hbWUiLCJ1cmwiLCJnZXRMZXhQYWNrYWdlSnNvblBhdGgiLCJMRVhfUEFDS0FHRV9OQU1FIiwibGV4SW5Ob2RlTW9kdWxlcyIsInByb2Nlc3MiLCJjd2QiLCJzdGFydERpciIsImVudiIsIkxFWF9ST09UIiwiZGlyIiwiaSIsInBrZ1BhdGgiLCJwa2ciLCJKU09OIiwicGFyc2UiLCJuYW1lIiwicGFyZW50IiwicmVsYXRpdmVGaWxlUGF0aCIsImZpbGVuYW1lIiwiZGlyUGF0aCIsImJhY2tVcCIsIm5lc3REZXB0aCIsImZpbGVQYXRoIiwicHJldmlvdXNQYXRoIiwiQXJyYXkiLCJmaWxsIiwibWFwIiwiam9pbiIsInJlbGF0aXZlTm9kZVBhdGgiLCJwYWNrYWdlTmFtZSIsIm5vZGVQYXRoIiwiY2hlY2tEaXIiLCJjaGVja1BhdGgiLCJwYXJlbnREaXIiLCJyZXNvbHZlQmluYXJ5UGF0aCIsImJpbmFyeU5hbWUiLCJsZXhEaXIiLCJnZXRMZXhEaXIiLCJsZXhCaW5QYXRoIiwibGV4UGFja2FnZUJpblBhdGgiLCJsZXhQYWNrYWdlQmluSnNQYXRoIiwibGV4UGFja2FnZUJpbkNqc1BhdGgiLCJjaGVja0JpblVwIiwibW9ub3JlcG9CaW5QYXRoIiwiZnJvbUN3ZCIsImZyb21MZXgiLCJmaW5kVGFpbHdpbmRDc3NQYXRoIiwidGFpbHdpbmRQYXR0ZXJucyIsInBhdHRlcm4iLCJmaWxlcyIsImlnbm9yZSIsImxlbmd0aCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsT0FBT0EsZ0JBQWdCLGVBQWU7QUFDdEMsU0FBUUMsVUFBVSxFQUFFQyxZQUFZLFFBQU8sS0FBSztBQUM1QyxTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxXQUFXQyxXQUFXLEVBQUVDLE9BQU8sUUFBTyxPQUFPO0FBQ3JELFNBQVFDLGFBQWEsUUFB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
@@ -0,0 +1,15 @@
1
+ export type StaticRenderOutput = Record<string, string> | string;
2
+ export type StaticRender = ((locals: StaticRenderLocals) => Promise<StaticRenderOutput> | StaticRenderOutput) | ((locals: StaticRenderLocals, callback: (output: StaticRenderOutput) => void) => void);
3
+ export interface StaticRenderLocals {
4
+ readonly assets: Record<string, string>;
5
+ readonly path: string;
6
+ }
7
+ export interface StaticSiteOptions {
8
+ readonly assets?: Record<string, string>;
9
+ readonly crawl?: boolean;
10
+ readonly outputPath: string;
11
+ readonly paths?: string[] | string;
12
+ readonly render: StaticRender;
13
+ }
14
+ export declare const relativePathsFromHtml: (currentPath: string, source: string) => string[];
15
+ export declare const renderStaticSite: (options: StaticSiteOptions) => Promise<void>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { existsSync, mkdirSync, writeFileSync } from 'fs';
5
+ import { posix as path, resolve } from 'path';
6
+ const attributeValues = (html, element, attribute)=>{
7
+ const expression = new RegExp(`<${element}\\b[^>]*\\b${attribute}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`, 'gi');
8
+ const values = [];
9
+ let match = expression.exec(html);
10
+ while(match){
11
+ values.push(match[1] ?? match[2] ?? match[3]);
12
+ match = expression.exec(html);
13
+ }
14
+ return values;
15
+ };
16
+ export const relativePathsFromHtml = (currentPath, source)=>[
17
+ ...attributeValues(source, 'a', 'href'),
18
+ ...attributeValues(source, 'iframe', 'src')
19
+ ].filter((reference)=>reference.length > 0 && !reference.startsWith('#') && !reference.startsWith('//') && !/^[a-z][a-z\d+.-]*:/i.test(reference)).map((reference)=>{
20
+ const resolved = new URL(reference, new URL(currentPath, 'https://lex.local'));
21
+ return `${resolved.pathname}${resolved.search}`;
22
+ });
23
+ const pathToAssetName = (outputPath)=>{
24
+ let outputFileName = outputPath.replace(/^(\/|\\)/, '');
25
+ if (!/\.(html?)$/i.test(outputFileName)) {
26
+ outputFileName = path.join(outputFileName, 'index.html');
27
+ }
28
+ return outputFileName;
29
+ };
30
+ const invokeRender = async (render, locals)=>{
31
+ if (render.length < 2) {
32
+ return Promise.resolve(render(locals));
33
+ }
34
+ return new Promise((resolveOutput)=>{
35
+ render(locals, resolveOutput);
36
+ });
37
+ };
38
+ export const renderStaticSite = async (options)=>{
39
+ const { assets = {}, crawl = true, outputPath, paths = [
40
+ '/'
41
+ ], render } = options;
42
+ const pending = Array.isArray(paths) ? [
43
+ ...paths
44
+ ] : [
45
+ paths
46
+ ];
47
+ const renderedPaths = new Set();
48
+ while(pending.length > 0){
49
+ const currentPath = pending.shift();
50
+ if (!currentPath || renderedPaths.has(currentPath)) {
51
+ continue;
52
+ }
53
+ renderedPaths.add(currentPath);
54
+ const locals = {
55
+ assets,
56
+ path: currentPath
57
+ };
58
+ // Rendering is sequential because each page can enqueue newly discovered routes.
59
+ // eslint-disable-next-line no-await-in-loop
60
+ const output = await invokeRender(render, locals);
61
+ const outputByPath = typeof output === 'object' ? output : {
62
+ [currentPath]: output
63
+ };
64
+ for (const [renderedPath, html] of Object.entries(outputByPath)){
65
+ const assetName = pathToAssetName(renderedPath);
66
+ const filePath = resolve(outputPath, assetName);
67
+ if (!existsSync(filePath)) {
68
+ mkdirSync(resolve(filePath, '..'), {
69
+ recursive: true
70
+ });
71
+ writeFileSync(filePath, html);
72
+ }
73
+ if (crawl) {
74
+ pending.push(...relativePathsFromHtml(renderedPath, html));
75
+ }
76
+ }
77
+ }
78
+ };
79
+
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zdGF0aWNTaXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2V4aXN0c1N5bmMsIG1rZGlyU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtwb3NpeCBhcyBwYXRoLCByZXNvbHZlfSBmcm9tICdwYXRoJztcblxuZXhwb3J0IHR5cGUgU3RhdGljUmVuZGVyT3V0cHV0ID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZztcbmV4cG9ydCB0eXBlIFN0YXRpY1JlbmRlciA9ICgobG9jYWxzOiBTdGF0aWNSZW5kZXJMb2NhbHMpID0+IFByb21pc2U8U3RhdGljUmVuZGVyT3V0cHV0PiB8IFN0YXRpY1JlbmRlck91dHB1dCkgfFxuICAoKGxvY2FsczogU3RhdGljUmVuZGVyTG9jYWxzLCBjYWxsYmFjazogKG91dHB1dDogU3RhdGljUmVuZGVyT3V0cHV0KSA9PiB2b2lkKSA9PiB2b2lkKTtcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNSZW5kZXJMb2NhbHMge1xuICByZWFkb25seSBhc3NldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNTaXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFzc2V0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IGNyYXdsPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb3V0cHV0UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwYXRocz86IHN0cmluZ1tdIHwgc3RyaW5nO1xuICByZWFkb25seSByZW5kZXI6IFN0YXRpY1JlbmRlcjtcbn1cblxuY29uc3QgYXR0cmlidXRlVmFsdWVzID0gKGh0bWw6IHN0cmluZywgZWxlbWVudDogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZXhwcmVzc2lvbiA9IG5ldyBSZWdFeHAoYDwke2VsZW1lbnR9XFxcXGJbXj5dKlxcXFxiJHthdHRyaWJ1dGV9XFxcXHMqPVxcXFxzKig/OlwiKFteXCJdKilcInwnKFteJ10qKSd8KFteXFxcXHM+XSspKWAsICdnaScpO1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBtYXRjaCA9IGV4cHJlc3Npb24uZXhlYyhodG1sKTtcblxuICB3aGlsZShtYXRjaCkge1xuICAgIHZhbHVlcy5wdXNoKG1hdGNoWzFdID8/IG1hdGNoWzJdID8/IG1hdGNoWzNdKTtcbiAgICBtYXRjaCA9IGV4cHJlc3Npb24uZXhlYyhodG1sKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZXM7XG59O1xuXG5leHBvcnQgY29uc3QgcmVsYXRpdmVQYXRoc0Zyb21IdG1sID0gKGN1cnJlbnRQYXRoOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10gPT4gW1xuICAuLi5hdHRyaWJ1dGVWYWx1ZXMoc291cmNlLCAnYScsICdocmVmJyksXG4gIC4uLmF0dHJpYnV0ZVZhbHVlcyhzb3VyY2UsICdpZnJhbWUnLCAnc3JjJylcbl1cbiAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiByZWZlcmVuY2UubGVuZ3RoID4gMCAmJiAhcmVmZXJlbmNlLnN0YXJ0c1dpdGgoJyMnKSAmJiAhcmVmZXJlbmNlLnN0YXJ0c1dpdGgoJy8vJykgJiYgIS9eW2Etel1bYS16XFxkKy4tXSo6L2kudGVzdChyZWZlcmVuY2UpKVxuICAubWFwKChyZWZlcmVuY2UpID0+IHtcbiAgICBjb25zdCByZXNvbHZlZCA9IG5ldyBVUkwocmVmZXJlbmNlLCBuZXcgVVJMKGN1cnJlbnRQYXRoLCAnaHR0cHM6Ly9sZXgubG9jYWwnKSk7XG4gICAgcmV0dXJuIGAke3Jlc29sdmVkLnBhdGhuYW1lfSR7cmVzb2x2ZWQuc2VhcmNofWA7XG4gIH0pO1xuXG5jb25zdCBwYXRoVG9Bc3NldE5hbWUgPSAob3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IG91dHB1dEZpbGVOYW1lID0gb3V0cHV0UGF0aC5yZXBsYWNlKC9eKFxcL3xcXFxcKS8sICcnKTtcbiAgaWYoIS9cXC4oaHRtbD8pJC9pLnRlc3Qob3V0cHV0RmlsZU5hbWUpKSB7XG4gICAgb3V0cHV0RmlsZU5hbWUgPSBwYXRoLmpvaW4ob3V0cHV0RmlsZU5hbWUsICdpbmRleC5odG1sJyk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dEZpbGVOYW1lO1xufTtcblxuY29uc3QgaW52b2tlUmVuZGVyID0gYXN5bmMgKHJlbmRlcjogU3RhdGljUmVuZGVyLCBsb2NhbHM6IFN0YXRpY1JlbmRlckxvY2Fscyk6IFByb21pc2U8U3RhdGljUmVuZGVyT3V0cHV0PiA9PiB7XG4gIGlmKHJlbmRlci5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgocmVuZGVyIGFzIChcbiAgICAgIHJlbmRlckxvY2FsczogU3RhdGljUmVuZGVyTG9jYWxzXG4gICAgKSA9PiBQcm9taXNlPFN0YXRpY1JlbmRlck91dHB1dD4gfCBTdGF0aWNSZW5kZXJPdXRwdXQpKGxvY2FscykpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPFN0YXRpY1JlbmRlck91dHB1dD4oKHJlc29sdmVPdXRwdXQpID0+IHtcbiAgICAocmVuZGVyIGFzIChcbiAgICAgIHJlbmRlckxvY2FsczogU3RhdGljUmVuZGVyTG9jYWxzLFxuICAgICAgY2FsbGJhY2s6ICh2YWx1ZTogU3RhdGljUmVuZGVyT3V0cHV0KSA9PiB2b2lkXG4gICAgKSA9PiB2b2lkKShsb2NhbHMsIHJlc29sdmVPdXRwdXQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW5kZXJTdGF0aWNTaXRlID0gYXN5bmMgKG9wdGlvbnM6IFN0YXRpY1NpdGVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHthc3NldHMgPSB7fSwgY3Jhd2wgPSB0cnVlLCBvdXRwdXRQYXRoLCBwYXRocyA9IFsnLyddLCByZW5kZXJ9ID0gb3B0aW9ucztcbiAgY29uc3QgcGVuZGluZyA9IEFycmF5LmlzQXJyYXkocGF0aHMpID8gWy4uLnBhdGhzXSA6IFtwYXRoc107XG4gIGNvbnN0IHJlbmRlcmVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICB3aGlsZShwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHBlbmRpbmcuc2hpZnQoKTtcbiAgICBpZighY3VycmVudFBhdGggfHwgcmVuZGVyZWRQYXRocy5oYXMoY3VycmVudFBhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVuZGVyZWRQYXRocy5hZGQoY3VycmVudFBhdGgpO1xuXG4gICAgY29uc3QgbG9jYWxzID0ge2Fzc2V0cywgcGF0aDogY3VycmVudFBhdGh9O1xuICAgIC8vIFJlbmRlcmluZyBpcyBzZXF1ZW50aWFsIGJlY2F1c2UgZWFjaCBwYWdlIGNhbiBlbnF1ZXVlIG5ld2x5IGRpc2NvdmVyZWQgcm91dGVzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaW52b2tlUmVuZGVyKHJlbmRlciwgbG9jYWxzKTtcbiAgICBjb25zdCBvdXRwdXRCeVBhdGggPSB0eXBlb2Ygb3V0cHV0ID09PSAnb2JqZWN0JyA/IG91dHB1dCA6IHtbY3VycmVudFBhdGhdOiBvdXRwdXR9O1xuXG4gICAgZm9yKGNvbnN0IFtyZW5kZXJlZFBhdGgsIGh0bWxdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dEJ5UGF0aCkpIHtcbiAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IHBhdGhUb0Fzc2V0TmFtZShyZW5kZXJlZFBhdGgpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKG91dHB1dFBhdGgsIGFzc2V0TmFtZSk7XG4gICAgICBpZighZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgbWtkaXJTeW5jKHJlc29sdmUoZmlsZVBhdGgsICcuLicpLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICAgIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGh0bWwpO1xuICAgICAgfVxuXG4gICAgICBpZihjcmF3bCkge1xuICAgICAgICBwZW5kaW5nLnB1c2goLi4ucmVsYXRpdmVQYXRoc0Zyb21IdG1sKHJlbmRlcmVkUGF0aCwgaHRtbCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwid3JpdGVGaWxlU3luYyIsInBvc2l4IiwicGF0aCIsInJlc29sdmUiLCJhdHRyaWJ1dGVWYWx1ZXMiLCJodG1sIiwiZWxlbWVudCIsImF0dHJpYnV0ZSIsImV4cHJlc3Npb24iLCJSZWdFeHAiLCJ2YWx1ZXMiLCJtYXRjaCIsImV4ZWMiLCJwdXNoIiwicmVsYXRpdmVQYXRoc0Zyb21IdG1sIiwiY3VycmVudFBhdGgiLCJzb3VyY2UiLCJmaWx0ZXIiLCJyZWZlcmVuY2UiLCJsZW5ndGgiLCJzdGFydHNXaXRoIiwidGVzdCIsIm1hcCIsInJlc29sdmVkIiwiVVJMIiwicGF0aG5hbWUiLCJzZWFyY2giLCJwYXRoVG9Bc3NldE5hbWUiLCJvdXRwdXRQYXRoIiwib3V0cHV0RmlsZU5hbWUiLCJyZXBsYWNlIiwiam9pbiIsImludm9rZVJlbmRlciIsInJlbmRlciIsImxvY2FscyIsIlByb21pc2UiLCJyZXNvbHZlT3V0cHV0IiwicmVuZGVyU3RhdGljU2l0ZSIsIm9wdGlvbnMiLCJhc3NldHMiLCJjcmF3bCIsInBhdGhzIiwicGVuZGluZyIsIkFycmF5IiwiaXNBcnJheSIsInJlbmRlcmVkUGF0aHMiLCJTZXQiLCJzaGlmdCIsImhhcyIsImFkZCIsIm91dHB1dCIsIm91dHB1dEJ5UGF0aCIsInJlbmRlcmVkUGF0aCIsIk9iamVjdCIsImVudHJpZXMiLCJhc3NldE5hbWUiLCJmaWxlUGF0aCIsInJlY3Vyc2l2ZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLGFBQWEsUUFBTyxLQUFLO0FBQ3hELFNBQVFDLFNBQVNDLElBQUksRUFBRUMsT0FBTyxRQUFPLE9BQU87QUFtQjVDLE1BQU1DLGtCQUFrQixDQUFDQyxNQUFjQyxTQUFpQkM7SUFDdEQsTUFBTUMsYUFBYSxJQUFJQyxPQUFPLENBQUMsQ0FBQyxFQUFFSCxRQUFRLFdBQVcsRUFBRUMsVUFBVSwyQ0FBMkMsQ0FBQyxFQUFFO0lBQy9HLE1BQU1HLFNBQW1CLEVBQUU7SUFDM0IsSUFBSUMsUUFBUUgsV0FBV0ksSUFBSSxDQUFDUDtJQUU1QixNQUFNTSxNQUFPO1FBQ1hELE9BQU9HLElBQUksQ0FBQ0YsS0FBSyxDQUFDLEVBQUUsSUFBSUEsS0FBSyxDQUFDLEVBQUUsSUFBSUEsS0FBSyxDQUFDLEVBQUU7UUFDNUNBLFFBQVFILFdBQVdJLElBQUksQ0FBQ1A7SUFDMUI7SUFFQSxPQUFPSztBQUNUO0FBRUEsT0FBTyxNQUFNSSx3QkFBd0IsQ0FBQ0MsYUFBcUJDLFNBQTZCO1dBQ25GWixnQkFBZ0JZLFFBQVEsS0FBSztXQUM3QlosZ0JBQWdCWSxRQUFRLFVBQVU7S0FDdEMsQ0FDRUMsTUFBTSxDQUFDLENBQUNDLFlBQWNBLFVBQVVDLE1BQU0sR0FBRyxLQUFLLENBQUNELFVBQVVFLFVBQVUsQ0FBQyxRQUFRLENBQUNGLFVBQVVFLFVBQVUsQ0FBQyxTQUFTLENBQUMsc0JBQXNCQyxJQUFJLENBQUNILFlBQ3ZJSSxHQUFHLENBQUMsQ0FBQ0o7UUFDSixNQUFNSyxXQUFXLElBQUlDLElBQUlOLFdBQVcsSUFBSU0sSUFBSVQsYUFBYTtRQUN6RCxPQUFPLEdBQUdRLFNBQVNFLFFBQVEsR0FBR0YsU0FBU0csTUFBTSxFQUFFO0lBQ2pELEdBQUc7QUFFTCxNQUFNQyxrQkFBa0IsQ0FBQ0M7SUFDdkIsSUFBSUMsaUJBQWlCRCxXQUFXRSxPQUFPLENBQUMsWUFBWTtJQUNwRCxJQUFHLENBQUMsY0FBY1QsSUFBSSxDQUFDUSxpQkFBaUI7UUFDdENBLGlCQUFpQjNCLEtBQUs2QixJQUFJLENBQUNGLGdCQUFnQjtJQUM3QztJQUNBLE9BQU9BO0FBQ1Q7QUFFQSxNQUFNRyxlQUFlLE9BQU9DLFFBQXNCQztJQUNoRCxJQUFHRCxPQUFPZCxNQUFNLEdBQUcsR0FBRztRQUNwQixPQUFPZ0IsUUFBUWhDLE9BQU8sQ0FBQyxBQUFDOEIsT0FFK0JDO0lBQ3pEO0lBRUEsT0FBTyxJQUFJQyxRQUE0QixDQUFDQztRQUNyQ0gsT0FHVUMsUUFBUUU7SUFDckI7QUFDRjtBQUVBLE9BQU8sTUFBTUMsbUJBQW1CLE9BQU9DO0lBQ3JDLE1BQU0sRUFBQ0MsU0FBUyxDQUFDLENBQUMsRUFBRUMsUUFBUSxJQUFJLEVBQUVaLFVBQVUsRUFBRWEsUUFBUTtRQUFDO0tBQUksRUFBRVIsTUFBTSxFQUFDLEdBQUdLO0lBQ3ZFLE1BQU1JLFVBQVVDLE1BQU1DLE9BQU8sQ0FBQ0gsU0FBUztXQUFJQTtLQUFNLEdBQUc7UUFBQ0E7S0FBTTtJQUMzRCxNQUFNSSxnQkFBZ0IsSUFBSUM7SUFFMUIsTUFBTUosUUFBUXZCLE1BQU0sR0FBRyxFQUFHO1FBQ3hCLE1BQU1KLGNBQWMyQixRQUFRSyxLQUFLO1FBQ2pDLElBQUcsQ0FBQ2hDLGVBQWU4QixjQUFjRyxHQUFHLENBQUNqQyxjQUFjO1lBQ2pEO1FBQ0Y7UUFDQThCLGNBQWNJLEdBQUcsQ0FBQ2xDO1FBRWxCLE1BQU1tQixTQUFTO1lBQUNLO1lBQVFyQyxNQUFNYTtRQUFXO1FBQ3pDLGlGQUFpRjtRQUNqRiw0Q0FBNEM7UUFDNUMsTUFBTW1DLFNBQVMsTUFBTWxCLGFBQWFDLFFBQVFDO1FBQzFDLE1BQU1pQixlQUFlLE9BQU9ELFdBQVcsV0FBV0EsU0FBUztZQUFDLENBQUNuQyxZQUFZLEVBQUVtQztRQUFNO1FBRWpGLEtBQUksTUFBTSxDQUFDRSxjQUFjL0MsS0FBSyxJQUFJZ0QsT0FBT0MsT0FBTyxDQUFDSCxjQUFlO1lBQzlELE1BQU1JLFlBQVk1QixnQkFBZ0J5QjtZQUNsQyxNQUFNSSxXQUFXckQsUUFBUXlCLFlBQVkyQjtZQUNyQyxJQUFHLENBQUN6RCxXQUFXMEQsV0FBVztnQkFDeEJ6RCxVQUFVSSxRQUFRcUQsVUFBVSxPQUFPO29CQUFDQyxXQUFXO2dCQUFJO2dCQUNuRHpELGNBQWN3RCxVQUFVbkQ7WUFDMUI7WUFFQSxJQUFHbUMsT0FBTztnQkFDUkUsUUFBUTdCLElBQUksSUFBSUMsc0JBQXNCc0MsY0FBYy9DO1lBQ3REO1FBQ0Y7SUFDRjtBQUNGLEVBQUUifQ==
@@ -0,0 +1,19 @@
1
+ import type { LexConfigType } from '../../LexConfig.js';
2
+ interface GeneratedFavicons {
3
+ readonly files: ReadonlyArray<{
4
+ contents: string;
5
+ name: string;
6
+ }>;
7
+ readonly html: string[];
8
+ readonly images: ReadonlyArray<{
9
+ contents: Buffer;
10
+ name: string;
11
+ }>;
12
+ }
13
+ export declare const generateLexFavicons: (config: LexConfigType) => Promise<GeneratedFavicons | null>;
14
+ export declare const copyLexWebAssets: (config: LexConfigType) => Promise<void>;
15
+ export declare const optimizeLexWebAssets: (config: LexConfigType) => Promise<void>;
16
+ export declare const compressLexWebAssets: (config: LexConfigType) => void;
17
+ export declare const getDevAsset: (config: LexConfigType, requestPath: string) => Promise<Buffer | null>;
18
+ export declare const getAssetRelativePath: (config: LexConfigType, filePath: string) => string;
19
+ export {};