@nlabs/lex 1.54.2 → 1.55.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 (58) hide show
  1. package/.github/copilot-instructions.md +4 -4
  2. package/README.md +25 -25
  3. package/__mocks__/LexConfig.js +9 -9
  4. package/__mocks__/boxen.js +1 -1
  5. package/__mocks__/build.js +6 -6
  6. package/__mocks__/compare-versions.js +1 -1
  7. package/__mocks__/compile.js +2 -2
  8. package/__mocks__/execa.js +2 -2
  9. package/__mocks__/latest-version.js +1 -1
  10. package/__mocks__/ora.js +13 -13
  11. package/__mocks__/versions.js +4 -4
  12. package/config.json +2 -2
  13. package/examples/lex.config.js +4 -4
  14. package/lex.config.js +4 -4
  15. package/lib/Button.stories.js +1 -1
  16. package/lib/LexConfig.d.ts +2 -9
  17. package/lib/LexConfig.js +2 -2
  18. package/lib/commands/ai/ai.js +2 -2
  19. package/lib/commands/clean/clean.js +1 -1
  20. package/lib/commands/config/config.js +14 -8
  21. package/lib/commands/copy/copy.js +1 -1
  22. package/lib/commands/create/create.js +1 -1
  23. package/lib/commands/dev/dev.js +1 -1
  24. package/lib/commands/init/init.js +1 -1
  25. package/lib/commands/link/link.js +1 -1
  26. package/lib/commands/lint/lint.js +1 -1
  27. package/lib/commands/migrate/migrate.js +2 -2
  28. package/lib/commands/serverless/serverless.js +1 -1
  29. package/lib/commands/storybook/storybook.js +1 -1
  30. package/lib/commands/test/test.d.ts +2 -0
  31. package/lib/commands/test/test.js +130 -117
  32. package/lib/commands/versions/versions.d.ts +1 -1
  33. package/lib/commands/versions/versions.js +3 -3
  34. package/lib/create/changelog.js +1 -1
  35. package/lib/lex.js +2 -2
  36. package/lib/test-react/index.d.ts +1 -1
  37. package/lib/test-react/index.js +2 -2
  38. package/lib/types.d.ts +1 -1
  39. package/lib/types.js +1 -1
  40. package/lib/utils/aiService.js +1 -1
  41. package/lib/utils/app.js +2 -2
  42. package/lib/vitest.d.js +3 -0
  43. package/package.json +41 -53
  44. package/resolver.cjs +11 -9
  45. package/tsconfig/reactNative.json +3 -2
  46. package/tsconfig.build.json +3 -3
  47. package/tsconfig.json +4 -3
  48. package/tsconfig.lint.json +3 -2
  49. package/tsconfig.template.json +3 -2
  50. package/tsconfig.test.json +4 -3
  51. package/vitest.config.d.mts +2 -0
  52. package/vitest.config.mjs +61 -0
  53. package/vitest.config.template.cjs +66 -0
  54. package/vitest.setup.template.js +19 -0
  55. package/jest.config.d.mts +0 -50
  56. package/jest.config.mjs +0 -72
  57. package/jest.config.template.cjs +0 -71
  58. package/jest.setup.template.js +0 -18
package/lib/utils/app.js CHANGED
@@ -210,7 +210,7 @@ export const removeConflictModules = (moduleList)=>{
210
210
  ...moduleList
211
211
  };
212
212
  Object.keys(updatedList).forEach((moduleName)=>{
213
- const regex = new RegExp('^(?!@types/).*?(jest|webpack).*$', 'gi');
213
+ const regex = new RegExp('^(?!@types/).*?(vitest|webpack).*$', 'gi');
214
214
  if (regex.test(moduleName)) {
215
215
  delete updatedList[moduleName];
216
216
  }
@@ -298,4 +298,4 @@ export const updateTemplateName = (filePath, replace, replaceCaps)=>{
298
298
  writeFileSync(filePath, data, 'utf8');
299
299
  };
300
300
 
301
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hcHAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuaW1wb3J0IGJveGVuIGZyb20gJ2JveGVuJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2NvcHlGaWxlLCBleGlzdHNTeW5jLCBsc3RhdFN5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5LmpzJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCB7YmFzZW5hbWUgYXMgcGF0aEJhc2VuYW1lLCBqb2luIGFzIHBhdGhKb2luLCByZWxhdGl2ZSBhcyBwYXRoUmVsYXRpdmUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtyaW1yYWZTeW5jfSBmcm9tICdyaW1yYWYnO1xuXG5cbmltcG9ydCB7bG9nfSBmcm9tICcuL2xvZy5qcyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi9MZXhDb25maWcuanMnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmlsZW5hbWVzUHJvcHMge1xuICByZWFkb25seSBjYWxsYmFjaz86IChzdGF0dXM6IG51bWJlcik9PiB2b2lkO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVzZVR5cGVzY3JpcHQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmlsZW5hbWVzUmVzdWx0IHtcbiAgbmFtZUNhcHM6IHN0cmluZztcbiAgdGVtcGxhdGVFeHQ6IHN0cmluZztcbiAgdGVtcGxhdGVQYXRoOiBzdHJpbmc7XG4gIHRlbXBsYXRlUmVhY3Q6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpbGVuYW1lcyA9IChwcm9wczogR2V0RmlsZW5hbWVzUHJvcHMpOiBGaWxlbmFtZXNSZXN1bHQgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB7Y2FsbGJhY2ssIGNsaU5hbWUsIG5hbWUsIHF1aWV0LCB0eXBlLCB1c2VUeXBlc2NyaXB0fSA9IHByb3BzO1xuXG4gIGxldCBuYW1lQ2Fwczogc3RyaW5nO1xuICBjb25zdCBpdGVtVHlwZXM6IHN0cmluZ1tdID0gWydzdG9yZXMnLCAndmlld3MnXTtcblxuICBpZighbmFtZSkge1xuICAgIGlmKGl0ZW1UeXBlcy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke3R5cGV9IG5hbWUgaXMgcmVxdWlyZWQuIFBsZWFzZSB1c2UgJ2xleCAtaCcgZm9yIG9wdGlvbnMuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgY2FsbGJhY2s/LigxKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5hbWVDYXBzID0gYCR7bmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke25hbWUuc3Vic3RyKDEpfWA7XG4gIH1cblxuICBsb2coYCR7Y2xpTmFtZX0gYWRkaW5nICR7bmFtZX0gJHt0eXBlfS4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGxldCB0ZW1wbGF0ZVBhdGg6IHN0cmluZztcbiAgbGV0IHRlbXBsYXRlRXh0OiBzdHJpbmc7XG4gIGxldCB0ZW1wbGF0ZVJlYWN0OiBzdHJpbmc7XG5cbiAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgIHRlbXBsYXRlUGF0aCA9ICcuLi8uLi90ZW1wbGF0ZXMvdHlwZXNjcmlwdCc7XG4gICAgdGVtcGxhdGVFeHQgPSAnLnRzJztcbiAgICB0ZW1wbGF0ZVJlYWN0ID0gJy50c3gnO1xuICB9IGVsc2Uge1xuICAgIHRlbXBsYXRlUGF0aCA9ICcuLi8uLi90ZW1wbGF0ZXMvZmxvdyc7XG4gICAgdGVtcGxhdGVFeHQgPSAnLmpzJztcbiAgICB0ZW1wbGF0ZVJlYWN0ID0gJy5qcyc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWVDYXBzLFxuICAgIHRlbXBsYXRlRXh0LFxuICAgIHRlbXBsYXRlUGF0aCxcbiAgICB0ZW1wbGF0ZVJlYWN0XG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNwaW5uZXIge1xuICBmYWlsOiAodGV4dD86IHN0cmluZyk9PiB2b2lkO1xuICBzdGFydDogKHRleHQ/OiBzdHJpbmcpPT4gdm9pZDtcbiAgc3VjY2VlZDogKHRleHQ/OiBzdHJpbmcpPT4gdm9pZDtcbiAgdGV4dD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNwaW5uZXIgPSAocXVpZXQgPSBmYWxzZSk6IFNwaW5uZXIgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybiB7XG4gICAgICBmYWlsOiAoKSA9PiB7fSxcbiAgICAgIHN0YXJ0OiAoKSA9PiB7fSxcbiAgICAgIHN1Y2NlZWQ6ICgpID0+IHt9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBvcmEoe2NvbG9yOiAneWVsbG93J30pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVByb2dyZXNzQmFyID0gKHBlcmNlbnRhZ2U6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHdpZHRoID0gMjA7XG4gIGNvbnN0IGZpbGxlZCA9IE1hdGgucm91bmQoKHBlcmNlbnRhZ2UgLyAxMDApICogd2lkdGgpO1xuICBjb25zdCBlbXB0eSA9IHdpZHRoIC0gZmlsbGVkO1xuXG4gIGNvbnN0IGZpbGxlZEJhciA9IGNoYWxrLmN5YW4oJ+KWiCcpLnJlcGVhdChmaWxsZWQpO1xuICBjb25zdCBlbXB0eUJhciA9IGNoYWxrLmdyYXkoJ+KWkScpLnJlcGVhdChlbXB0eSk7XG5cbiAgcmV0dXJuIGZpbGxlZEJhciArIGVtcHR5QmFyO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZVdlYnBhY2tQcm9ncmVzcyA9IChcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHNwaW5uZXI6IFNwaW5uZXIsXG4gIHF1aWV0OiBib29sZWFuLFxuICBlbW9qaTogc3RyaW5nLFxuICBhY3Rpb246IHN0cmluZ1xuKTogdm9pZCA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcHJvZ3Jlc3NNYXRjaCA9IG91dHB1dC5tYXRjaCgvXFxbd2VicGFja1xcLlByb2dyZXNzXFxdIChcXGQrKSUvKTtcbiAgaWYocHJvZ3Jlc3NNYXRjaCkge1xuICAgIGNvbnN0IHByb2dyZXNzID0gcGFyc2VJbnQocHJvZ3Jlc3NNYXRjaFsxXSk7XG4gICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzcyk7XG4gICAgc3Bpbm5lci50ZXh0ID0gYCR7ZW1vaml9ICR7YWN0aW9ufTogJHtwcm9ncmVzc0Jhcn0gJHtwcm9ncmVzc30lYDtcbiAgfSBlbHNlIGlmKG91dHB1dC5pbmNsdWRlcygnW3dlYnBhY2suUHJvZ3Jlc3NdJykpIHtcbiAgICBjb25zdCBnZW5lcmFsUHJvZ3Jlc3NNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspJS8pO1xuICAgIGlmKGdlbmVyYWxQcm9ncmVzc01hdGNoKSB7XG4gICAgICBjb25zdCBwcm9ncmVzcyA9IHBhcnNlSW50KGdlbmVyYWxQcm9ncmVzc01hdGNoWzFdKTtcbiAgICAgIGNvbnN0IHByb2dyZXNzQmFyID0gY3JlYXRlUHJvZ3Jlc3NCYXIocHJvZ3Jlc3MpO1xuICAgICAgc3Bpbm5lci50ZXh0ID0gYCR7ZW1vaml9ICR7YWN0aW9ufTogJHtwcm9ncmVzc0Jhcn0gJHtwcm9ncmVzc30lYDtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb3B5RmlsZXMgPSBhc3luYyAoZmlsZXM6IHN0cmluZ1tdLCB0eXBlTmFtZTogc3RyaW5nLCBzcGlubmVyLCBjb25maWc6IExleENvbmZpZ1R5cGUpID0+IHtcbiAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCBzb3VyY2VGdWxsUGF0aH0gPSBjb25maWc7XG4gIGNvbnN0IGl0ZW1zID0gZmlsZXMubWFwKChmaWxlTmFtZTogc3RyaW5nKSA9PiAoe1xuICAgIGZyb206IGZpbGVOYW1lLFxuICAgIHRvOiBwYXRoUmVzb2x2ZShvdXRwdXRGdWxsUGF0aCwgcGF0aFJlbGF0aXZlKHNvdXJjZUZ1bGxQYXRoLCBmaWxlTmFtZSkpXG4gIH0pKTtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoYENvcHlpbmcgJHt0eXBlTmFtZX0gZmlsZXMuLi5gKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChpdGVtcy5tYXAoKHtmcm9tLCB0b30pID0+IG5ldyBQcm9taXNlKFxuICAgICAgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBta2RpclN5bmMocGF0aFJlc29sdmUodG8sICcuLicpLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICAgIHJldHVybiBjb3B5RmlsZShmcm9tLCB0bywgKGNvcHlFcnJvcikgPT4ge1xuICAgICAgICAgIGlmKGNvcHlFcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApKSk7XG4gICAgc3Bpbm5lci5zdWNjZWVkKGBTdWNjZXNzZnVsbHkgY29waWVkICR7ZmlsZXMubGVuZ3RofSAke3R5cGVOYW1lfSBmaWxlcyFgKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbChgQ29weWluZyBvZiAke3R5cGVOYW1lfSBmaWxlcyBmYWlsZWQuYCk7XG4gICAgbG9nKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgIGxvZyhlcnJvciwgJ2Vycm9yJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb3B5Q29uZmlndXJlZEZpbGVzID0gYXN5bmMgKHNwaW5uZXIsIGNvbmZpZzogTGV4Q29uZmlnVHlwZSwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgY29uc3Qge2NvcHlGaWxlczogY29weUZpbGVzQ29uZmlnLCBvdXRwdXRGdWxsUGF0aCwgc291cmNlRnVsbFBhdGgsIHNvdXJjZVBhdGh9ID0gY29uZmlnO1xuICBpZighY29weUZpbGVzQ29uZmlnIHx8IGNvcHlGaWxlc0NvbmZpZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0NvcHlpbmcgY29uZmlndXJlZCBmaWxlcy4uLicpO1xuICAgIGxldCB0b3RhbENvcGllZCA9IDA7XG5cbiAgICBjb25zdCBiYXNlRGlyID0gc291cmNlRnVsbFBhdGggfHwgKHNvdXJjZVBhdGggPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBzb3VyY2VQYXRoKSA6IHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGFsbENvcHlQcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG5cbiAgICBmb3IoY29uc3QgcGF0dGVybiBvZiBjb3B5RmlsZXNDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0dGVybiA9IHBhdGhSZXNvbHZlKGJhc2VEaXIsIHBhdHRlcm4pO1xuICAgICAgY29uc3QgbWF0Y2hpbmdGaWxlcyA9IGdsb2JTeW5jKHJlc29sdmVkUGF0dGVybiwge1xuICAgICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgbm9kaXI6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBpZihtYXRjaGluZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgICBsb2coYFdhcm5pbmc6IE5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nIHBhdHRlcm46ICR7cGF0dGVybn1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29weVByb21pc2VzID0gbWF0Y2hpbmdGaWxlcy5tYXAoKHNvdXJjZUZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aFJlbGF0aXZlKGJhc2VEaXIsIHNvdXJjZUZpbGUpO1xuICAgICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dEZ1bGxQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBkZXN0RGlyID0gcGF0aFJlc29sdmUoZGVzdFBhdGgsICcuLicpO1xuICAgICAgICBta2RpclN5bmMoZGVzdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29weUZpbGUoc291cmNlRmlsZSwgZGVzdFBhdGgsIChjb3B5RXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmKGNvcHlFcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoY29weUVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGFsbENvcHlQcm9taXNlcy5wdXNoKC4uLmNvcHlQcm9taXNlcyk7XG4gICAgICB0b3RhbENvcGllZCArPSBtYXRjaGluZ0ZpbGVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChhbGxDb3B5UHJvbWlzZXMpO1xuXG4gICAgaWYodG90YWxDb3BpZWQgPiAwKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoYFN1Y2Nlc3NmdWxseSBjb3BpZWQgJHt0b3RhbENvcGllZH0gY29uZmlndXJlZCBmaWxlcyFgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdObyBjb25maWd1cmVkIGZpbGVzIHRvIGNvcHknKTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBjb3B5IGNvbmZpZ3VyZWQgZmlsZXMnKTtcbiAgICBsb2coYEVycm9yIGNvcHlpbmcgY29uZmlndXJlZCBmaWxlczogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvcHlGaWxlU3luYyA9IChzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpID0+IHtcbiAgbGV0IHRhcmdldEZpbGU6IHN0cmluZyA9IHRhcmdldDtcblxuICBpZihleGlzdHNTeW5jKHRhcmdldCkpIHtcbiAgICBpZihsc3RhdFN5bmModGFyZ2V0KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0YXJnZXRGaWxlID0gcGF0aEpvaW4odGFyZ2V0LCBwYXRoQmFzZW5hbWUoc291cmNlKSk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVGaWxlU3luYyh0YXJnZXRGaWxlLCByZWFkRmlsZVN5bmMoc291cmNlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29weUZvbGRlclJlY3Vyc2l2ZVN5bmMgPSAoc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCB0YXJnZXRGb2xkZXI6IHN0cmluZyA9IHBhdGhKb2luKHRhcmdldCwgcGF0aEJhc2VuYW1lKHNvdXJjZSkpO1xuXG4gIGlmKCFleGlzdHNTeW5jKHRhcmdldEZvbGRlcikpIHtcbiAgICBta2RpclN5bmModGFyZ2V0Rm9sZGVyKTtcbiAgfVxuXG4gIGlmKGxzdGF0U3luYyhzb3VyY2UpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICBmaWxlcyA9IHJlYWRkaXJTeW5jKHNvdXJjZSk7XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBjdXJTb3VyY2U6IHN0cmluZyA9IHBhdGhKb2luKHNvdXJjZSwgZmlsZSk7XG5cbiAgICAgIGlmKGxzdGF0U3luYyhjdXJTb3VyY2UpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29weUZvbGRlclJlY3Vyc2l2ZVN5bmMoY3VyU291cmNlLCB0YXJnZXRGb2xkZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29weUZpbGVTeW5jKGN1clNvdXJjZSwgdGFyZ2V0Rm9sZGVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFBhY2thZ2VKc29uID0gKHBhY2thZ2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGZvcm1hdFBhdGg6IHN0cmluZyA9IHBhY2thZ2VQYXRoIHx8IGAke3Byb2Nlc3MuY3dkKCl9L3BhY2thZ2UuanNvbmA7XG4gIGNvbnN0IHBhY2thZ2VEYXRhOiBzdHJpbmcgPSByZWFkRmlsZVN5bmMoZm9ybWF0UGF0aCkudG9TdHJpbmcoKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShwYWNrYWdlRGF0YSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsZXNCeUV4dCA9IChleHQ6IHN0cmluZywgY29uZmlnOiBMZXhDb25maWdUeXBlKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCB7c291cmNlRnVsbFBhdGh9ID0gY29uZmlnO1xuICByZXR1cm4gZ2xvYlN5bmMoYCoqLyoqJHtleHR9YCwge1xuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIGN3ZDogc291cmNlRnVsbFBhdGgsXG4gICAgbm9kaXI6IHRydWVcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ29uZmxpY3RNb2R1bGVzID0gKG1vZHVsZUxpc3Q6IG9iamVjdCkgPT4ge1xuICBjb25zdCB1cGRhdGVkTGlzdDogb2JqZWN0ID0gey4uLm1vZHVsZUxpc3R9O1xuXG4gIE9iamVjdC5rZXlzKHVwZGF0ZWRMaXN0KS5mb3JFYWNoKChtb2R1bGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXig/IUB0eXBlcy8pLio/KGplc3R8d2VicGFjaykuKiQnLCAnZ2knKTtcbiAgICBpZihyZWdleC50ZXN0KG1vZHVsZU5hbWUpKSB7XG4gICAgICBkZWxldGUgdXBkYXRlZExpc3RbbW9kdWxlTmFtZV07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdXBkYXRlZExpc3Q7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlRmlsZXMgPSAoZmlsZU5hbWU6IHN0cmluZywgaXNSZWxhdGl2ZTogYm9vbGVhbiA9IGZhbHNlKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBpc1JlbGF0aXZlID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZU5hbWUpIDogZmlsZU5hbWU7XG5cbiAgdHJ5IHtcbiAgICByaW1yYWZTeW5jKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZU1vZHVsZXMgPSAoKSA9PiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4vbm9kZV9tb2R1bGVzJywgdHJ1ZSk7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4veWFybi5sb2NrJywgdHJ1ZSk7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4vcGFja2FnZS1sb2NrLmpzb24nLCB0cnVlKTtcblxuICAgIHJlc29sdmUobnVsbCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHNldFBhY2thZ2VKc29uID0gKGpzb24sIHBhY2thZ2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gIGlmKCFqc29uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0UGF0aDogc3RyaW5nID0gcGFja2FnZVBhdGggfHwgYCR7cHJvY2Vzcy5jd2QoKX0vcGFja2FnZS5qc29uYDtcblxuICB3cml0ZUZpbGVTeW5jKGZvcm1hdFBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIDIpKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua2VkTW9kdWxlVHlwZSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgbGlua2VkTW9kdWxlcyA9IChzdGFydFBhdGg/OiBzdHJpbmcpOiBMaW5rZWRNb2R1bGVUeXBlW10gPT4ge1xuICBjb25zdCB3b3JraW5nUGF0aDogc3RyaW5nID0gc3RhcnRQYXRoIHx8IHByb2Nlc3MuY3dkKCk7XG4gIGxldCBtb2R1bGVQYXRoOiBzdHJpbmc7XG4gIGxldCBwcmVmaXg6IHN0cmluZztcblxuICBpZih3b3JraW5nUGF0aC5pbmNsdWRlcygnQCcpKSB7XG4gICAgcHJlZml4ID0gYEAke3dvcmtpbmdQYXRoLnNwbGl0KCdAJykucG9wKCl9YDtcbiAgICBtb2R1bGVQYXRoID0gd29ya2luZ1BhdGg7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlUGF0aCA9IHBhdGhKb2luKHdvcmtpbmdQYXRoLCAnbm9kZV9tb2R1bGVzJyk7XG4gIH1cblxuICBjb25zdCBmb3VuZFBhdGhzOiBzdHJpbmdbXSA9IGdsb2JTeW5jKCcqJywge1xuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIGN3ZDogbW9kdWxlUGF0aCxcbiAgICBub2RpcjogZmFsc2VcbiAgfSk7XG5cbiAgcmV0dXJuIGZvdW5kUGF0aHMucmVkdWNlKChsaXN0OiBMaW5rZWRNb2R1bGVUeXBlW10sIGZvdW5kUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gbHN0YXRTeW5jKGZvdW5kUGF0aCk7XG5cbiAgICAgIGlmKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc3QgZGVlcExpc3Q6IExpbmtlZE1vZHVsZVR5cGVbXSA9IGxpbmtlZE1vZHVsZXMoZm91bmRQYXRoKTtcbiAgICAgICAgbGlzdC5wdXNoKC4uLmRlZXBMaXN0KTtcbiAgICAgIH0gZWxzZSBpZihzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWVzOiBzdHJpbmdbXSA9IChbcHJlZml4LCBwYXRoQmFzZW5hbWUoZm91bmRQYXRoKV0pLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiAhaXNFbXB0eShpdGVtKSk7XG4gICAgICAgIGxpc3QucHVzaCh7bmFtZTogYCR7bW9kdWxlTmFtZXMuam9pbignLycpfWAsIHBhdGg6IGZvdW5kUGF0aH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9IGNhdGNoe1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9LCBbXSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tMaW5rZWRNb2R1bGVzID0gKCkgPT4ge1xuICBjb25zdCBsaW5rZWQgPSBsaW5rZWRNb2R1bGVzKCk7XG5cbiAgaWYobGlua2VkLmxlbmd0aCkge1xuICAgIGNvbnN0IG1zZ01vZHVsZTogc3RyaW5nID0gbGlua2VkLmxlbmd0aCA+IDEgPyAnTW9kdWxlcycgOiAnTW9kdWxlJztcbiAgICBjb25zdCBsaW5rZWRNc2c6IHN0cmluZyA9IGxpbmtlZC5yZWR1Y2UoXG4gICAgICAobXNnOiBzdHJpbmcsIGxpbmtlZE1vZHVsZTogTGlua2VkTW9kdWxlVHlwZSkgPT5cbiAgICAgICAgYCR7bXNnfVxcbiAqICR7bGlua2VkTW9kdWxlLm5hbWV9YCxcbiAgICAgIGBMaW5rZWQgJHttc2dNb2R1bGV9OmBcbiAgICApO1xuXG4gICAgbG9nKGJveGVuKGxpbmtlZE1zZywge2RpbUJvcmRlcjogdHJ1ZSwgcGFkZGluZzogMX0pLCAnd2FybicpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVGVtcGxhdGVOYW1lID0gKGZpbGVQYXRoOiBzdHJpbmcsIHJlcGxhY2U6IHN0cmluZywgcmVwbGFjZUNhcHM6IHN0cmluZykgPT4ge1xuICBsZXQgZGF0YTogc3RyaW5nID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICBkYXRhID0gZGF0YS5yZXBsYWNlKC9zYW1wbGUvZywgcmVwbGFjZSk7XG4gIGRhdGEgPSBkYXRhLnJlcGxhY2UoL1NhbXBsZS9nLCByZXBsYWNlQ2Fwcyk7XG4gIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGRhdGEsICd1dGY4Jyk7XG59OyJdLCJuYW1lcyI6WyJib3hlbiIsImNoYWxrIiwiY29weUZpbGUiLCJleGlzdHNTeW5jIiwibHN0YXRTeW5jIiwibWtkaXJTeW5jIiwicmVhZGRpclN5bmMiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwic3luYyIsImdsb2JTeW5jIiwiaXNFbXB0eSIsIm9yYSIsImJhc2VuYW1lIiwicGF0aEJhc2VuYW1lIiwiam9pbiIsInBhdGhKb2luIiwicmVsYXRpdmUiLCJwYXRoUmVsYXRpdmUiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJyaW1yYWZTeW5jIiwibG9nIiwiZ2V0RmlsZW5hbWVzIiwicHJvcHMiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJuYW1lIiwicXVpZXQiLCJ0eXBlIiwidXNlVHlwZXNjcmlwdCIsIm5hbWVDYXBzIiwiaXRlbVR5cGVzIiwiaW5jbHVkZXMiLCJ1bmRlZmluZWQiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsInRlbXBsYXRlUGF0aCIsInRlbXBsYXRlRXh0IiwidGVtcGxhdGVSZWFjdCIsImNyZWF0ZVNwaW5uZXIiLCJmYWlsIiwic3RhcnQiLCJzdWNjZWVkIiwiY29sb3IiLCJjcmVhdGVQcm9ncmVzc0JhciIsInBlcmNlbnRhZ2UiLCJ3aWR0aCIsImZpbGxlZCIsIk1hdGgiLCJyb3VuZCIsImVtcHR5IiwiZmlsbGVkQmFyIiwiY3lhbiIsInJlcGVhdCIsImVtcHR5QmFyIiwiZ3JheSIsImhhbmRsZVdlYnBhY2tQcm9ncmVzcyIsIm91dHB1dCIsInNwaW5uZXIiLCJlbW9qaSIsImFjdGlvbiIsInByb2dyZXNzTWF0Y2giLCJtYXRjaCIsInByb2dyZXNzIiwicGFyc2VJbnQiLCJwcm9ncmVzc0JhciIsInRleHQiLCJnZW5lcmFsUHJvZ3Jlc3NNYXRjaCIsImNvcHlGaWxlcyIsImZpbGVzIiwidHlwZU5hbWUiLCJjb25maWciLCJvdXRwdXRGdWxsUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwiaXRlbXMiLCJtYXAiLCJmaWxlTmFtZSIsImZyb20iLCJ0byIsIlByb21pc2UiLCJhbGwiLCJyZWplY3QiLCJyZWN1cnNpdmUiLCJjb3B5RXJyb3IiLCJsZW5ndGgiLCJlcnJvciIsIm1lc3NhZ2UiLCJjb3B5Q29uZmlndXJlZEZpbGVzIiwiY29weUZpbGVzQ29uZmlnIiwic291cmNlUGF0aCIsInRvdGFsQ29waWVkIiwiYmFzZURpciIsInByb2Nlc3MiLCJjd2QiLCJhbGxDb3B5UHJvbWlzZXMiLCJwYXR0ZXJuIiwicmVzb2x2ZWRQYXR0ZXJuIiwibWF0Y2hpbmdGaWxlcyIsImFic29sdXRlIiwibm9kaXIiLCJjb3B5UHJvbWlzZXMiLCJzb3VyY2VGaWxlIiwicmVsYXRpdmVQYXRoIiwiZGVzdFBhdGgiLCJkZXN0RGlyIiwicHVzaCIsImNvcHlGaWxlU3luYyIsInNvdXJjZSIsInRhcmdldCIsInRhcmdldEZpbGUiLCJpc0RpcmVjdG9yeSIsImNvcHlGb2xkZXJSZWN1cnNpdmVTeW5jIiwidGFyZ2V0Rm9sZGVyIiwiZm9yRWFjaCIsImZpbGUiLCJjdXJTb3VyY2UiLCJnZXRQYWNrYWdlSnNvbiIsInBhY2thZ2VQYXRoIiwiZm9ybWF0UGF0aCIsInBhY2thZ2VEYXRhIiwidG9TdHJpbmciLCJKU09OIiwicGFyc2UiLCJnZXRGaWxlc0J5RXh0IiwiZXh0IiwicmVtb3ZlQ29uZmxpY3RNb2R1bGVzIiwibW9kdWxlTGlzdCIsInVwZGF0ZWRMaXN0IiwiT2JqZWN0Iiwia2V5cyIsIm1vZHVsZU5hbWUiLCJyZWdleCIsIlJlZ0V4cCIsInRlc3QiLCJyZW1vdmVGaWxlcyIsImlzUmVsYXRpdmUiLCJmaWxlUGF0aCIsInJlbW92ZU1vZHVsZXMiLCJzZXRQYWNrYWdlSnNvbiIsImpzb24iLCJzdHJpbmdpZnkiLCJsaW5rZWRNb2R1bGVzIiwic3RhcnRQYXRoIiwid29ya2luZ1BhdGgiLCJtb2R1bGVQYXRoIiwicHJlZml4Iiwic3BsaXQiLCJwb3AiLCJmb3VuZFBhdGhzIiwicmVkdWNlIiwibGlzdCIsImZvdW5kUGF0aCIsInN0YXRzIiwiZGVlcExpc3QiLCJpc1N5bWJvbGljTGluayIsIm1vZHVsZU5hbWVzIiwiZmlsdGVyIiwiaXRlbSIsInBhdGgiLCJjaGVja0xpbmtlZE1vZHVsZXMiLCJsaW5rZWQiLCJtc2dNb2R1bGUiLCJsaW5rZWRNc2ciLCJtc2ciLCJsaW5rZWRNb2R1bGUiLCJkaW1Cb3JkZXIiLCJwYWRkaW5nIiwidXBkYXRlVGVtcGxhdGVOYW1lIiwicmVwbGFjZSIsInJlcGxhY2VDYXBzIiwiZGF0YSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBRUQsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFRQyxRQUFRLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLFdBQVcsRUFBRUMsWUFBWSxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUN4RyxTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxPQUFPQyxhQUFhLG9CQUFvQjtBQUN4QyxPQUFPQyxTQUFTLE1BQU07QUFDdEIsU0FBUUMsWUFBWUMsWUFBWSxFQUFF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
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hcHAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuaW1wb3J0IGJveGVuIGZyb20gJ2JveGVuJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2NvcHlGaWxlLCBleGlzdHNTeW5jLCBsc3RhdFN5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5LmpzJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCB7YmFzZW5hbWUgYXMgcGF0aEJhc2VuYW1lLCBqb2luIGFzIHBhdGhKb2luLCByZWxhdGl2ZSBhcyBwYXRoUmVsYXRpdmUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtyaW1yYWZTeW5jfSBmcm9tICdyaW1yYWYnO1xuXG5pbXBvcnQge2xvZ30gZnJvbSAnLi9sb2cuanMnO1xuXG5pbXBvcnQgdHlwZSB7TGV4Q29uZmlnVHlwZX0gZnJvbSAnLi4vTGV4Q29uZmlnLmpzJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEZpbGVuYW1lc1Byb3BzIHtcbiAgcmVhZG9ubHkgY2FsbGJhY2s/OiAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHlwZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlVHlwZXNjcmlwdD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBGaWxlbmFtZXNSZXN1bHQge1xuICBuYW1lQ2Fwczogc3RyaW5nO1xuICB0ZW1wbGF0ZUV4dDogc3RyaW5nO1xuICB0ZW1wbGF0ZVBhdGg6IHN0cmluZztcbiAgdGVtcGxhdGVSZWFjdDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RmlsZW5hbWVzID0gKHByb3BzOiBHZXRGaWxlbmFtZXNQcm9wcyk6IEZpbGVuYW1lc1Jlc3VsdCB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHtjYWxsYmFjaywgY2xpTmFtZSwgbmFtZSwgcXVpZXQsIHR5cGUsIHVzZVR5cGVzY3JpcHR9ID0gcHJvcHM7XG5cbiAgbGV0IG5hbWVDYXBzOiBzdHJpbmc7XG4gIGNvbnN0IGl0ZW1UeXBlczogc3RyaW5nW10gPSBbJ3N0b3JlcycsICd2aWV3cyddO1xuXG4gIGlmKCFuYW1lKSB7XG4gICAgaWYoaXRlbVR5cGVzLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7dHlwZX0gbmFtZSBpcyByZXF1aXJlZC4gUGxlYXNlIHVzZSAnbGV4IC1oJyBmb3Igb3B0aW9ucy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaz8uKDEpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmFtZUNhcHMgPSBgJHtuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7bmFtZS5zdWJzdHIoMSl9YDtcbiAgfVxuXG4gIGxvZyhgJHtjbGlOYW1lfSBhZGRpbmcgJHtuYW1lfSAke3R5cGV9Li4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgbGV0IHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuICBsZXQgdGVtcGxhdGVFeHQ6IHN0cmluZztcbiAgbGV0IHRlbXBsYXRlUmVhY3Q6IHN0cmluZztcblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy90eXBlc2NyaXB0JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcudHMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLnRzeCc7XG4gIH0gZWxzZSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy9mbG93JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcuanMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLmpzJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZUNhcHMsXG4gICAgdGVtcGxhdGVFeHQsXG4gICAgdGVtcGxhdGVQYXRoLFxuICAgIHRlbXBsYXRlUmVhY3RcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Bpbm5lciB7XG4gIGZhaWw6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICBzdGFydDogKHRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlU3Bpbm5lciA9IChxdWlldCA9IGZhbHNlKTogU3Bpbm5lciA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZhaWw6ICgpID0+IHt9LFxuICAgICAgc3RhcnQ6ICgpID0+IHt9LFxuICAgICAgc3VjY2VlZDogKCkgPT4ge31cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG9yYSh7Y29sb3I6ICd5ZWxsb3cnfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvZ3Jlc3NCYXIgPSAocGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgd2lkdGggPSAyMDtcbiAgY29uc3QgZmlsbGVkID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZSAvIDEwMCkgKiB3aWR0aCk7XG4gIGNvbnN0IGVtcHR5ID0gd2lkdGggLSBmaWxsZWQ7XG5cbiAgY29uc3QgZmlsbGVkQmFyID0gY2hhbGsuY3lhbign4paIJykucmVwZWF0KGZpbGxlZCk7XG4gIGNvbnN0IGVtcHR5QmFyID0gY2hhbGsuZ3JheSgn4paRJykucmVwZWF0KGVtcHR5KTtcblxuICByZXR1cm4gZmlsbGVkQmFyICsgZW1wdHlCYXI7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlV2VicGFja1Byb2dyZXNzID0gKFxuICBvdXRwdXQ6IHN0cmluZyxcbiAgc3Bpbm5lcjogU3Bpbm5lcixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGVtb2ppOiBzdHJpbmcsXG4gIGFjdGlvbjogc3RyaW5nXG4pOiB2b2lkID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwcm9ncmVzc01hdGNoID0gb3V0cHV0Lm1hdGNoKC9cXFt3ZWJwYWNrXFwuUHJvZ3Jlc3NcXF0gKFxcZCspJS8pO1xuICBpZihwcm9ncmVzc01hdGNoKSB7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBwYXJzZUludChwcm9ncmVzc01hdGNoWzFdKTtcbiAgICBjb25zdCBwcm9ncmVzc0JhciA9IGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKTtcbiAgICBzcGlubmVyLnRleHQgPSBgJHtlbW9qaX0gJHthY3Rpb259OiAke3Byb2dyZXNzQmFyfSAke3Byb2dyZXNzfSVgO1xuICB9IGVsc2UgaWYob3V0cHV0LmluY2x1ZGVzKCdbd2VicGFjay5Qcm9ncmVzc10nKSkge1xuICAgIGNvbnN0IGdlbmVyYWxQcm9ncmVzc01hdGNoID0gb3V0cHV0Lm1hdGNoKC8oXFxkKyklLyk7XG4gICAgaWYoZ2VuZXJhbFByb2dyZXNzTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gcGFyc2VJbnQoZ2VuZXJhbFByb2dyZXNzTWF0Y2hbMV0pO1xuICAgICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzcyk7XG4gICAgICBzcGlubmVyLnRleHQgPSBgJHtlbW9qaX0gJHthY3Rpb259OiAke3Byb2dyZXNzQmFyfSAke3Byb2dyZXNzfSVgO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvcHlGaWxlcyA9IGFzeW5jIChmaWxlczogc3RyaW5nW10sIHR5cGVOYW1lOiBzdHJpbmcsIHNwaW5uZXIsIGNvbmZpZzogTGV4Q29uZmlnVHlwZSkgPT4ge1xuICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIHNvdXJjZUZ1bGxQYXRofSA9IGNvbmZpZztcbiAgY29uc3QgaXRlbXMgPSBmaWxlcy5tYXAoKGZpbGVOYW1lOiBzdHJpbmcpID0+ICh7XG4gICAgZnJvbTogZmlsZU5hbWUsXG4gICAgdG86IHBhdGhSZXNvbHZlKG91dHB1dEZ1bGxQYXRoLCBwYXRoUmVsYXRpdmUoc291cmNlRnVsbFBhdGgsIGZpbGVOYW1lKSlcbiAgfSkpO1xuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydChgQ29weWluZyAke3R5cGVOYW1lfSBmaWxlcy4uLmApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGl0ZW1zLm1hcCgoe2Zyb20sIHRvfSkgPT4gbmV3IFByb21pc2UoXG4gICAgICAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIG1rZGlyU3luYyhwYXRoUmVzb2x2ZSh0bywgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgICAgcmV0dXJuIGNvcHlGaWxlKGZyb20sIHRvLCAoY29weUVycm9yKSA9PiB7XG4gICAgICAgICAgaWYoY29weUVycm9yKSB7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICkpKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoYFN1Y2Nlc3NmdWxseSBjb3BpZWQgJHtmaWxlcy5sZW5ndGh9ICR7dHlwZU5hbWV9IGZpbGVzIWApO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKGBDb3B5aW5nIG9mICR7dHlwZU5hbWV9IGZpbGVzIGZhaWxlZC5gKTtcbiAgICBsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgbG9nKGVycm9yLCAnZXJyb3InKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvcHlDb25maWd1cmVkRmlsZXMgPSBhc3luYyAoc3Bpbm5lciwgY29uZmlnOiBMZXhDb25maWdUeXBlLCBxdWlldDogYm9vbGVhbikgPT4ge1xuICBjb25zdCB7Y29weUZpbGVzOiBjb3B5RmlsZXNDb25maWcsIG91dHB1dEZ1bGxQYXRoLCBzb3VyY2VGdWxsUGF0aCwgc291cmNlUGF0aH0gPSBjb25maWc7XG4gIGlmKCFjb3B5RmlsZXNDb25maWcgfHwgY29weUZpbGVzQ29uZmlnLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ29weWluZyBjb25maWd1cmVkIGZpbGVzLi4uJyk7XG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcblxuICAgIGNvbnN0IGJhc2VEaXIgPSBzb3VyY2VGdWxsUGF0aCB8fCAoc291cmNlUGF0aCA/IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIHNvdXJjZVBhdGgpIDogcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgYWxsQ29weVByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblxuICAgIGZvcihjb25zdCBwYXR0ZXJuIG9mIGNvcHlGaWxlc0NvbmZpZykge1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXR0ZXJuID0gcGF0aFJlc29sdmUoYmFzZURpciwgcGF0dGVybik7XG4gICAgICBjb25zdCBtYXRjaGluZ0ZpbGVzID0gZ2xvYlN5bmMocmVzb2x2ZWRQYXR0ZXJuLCB7XG4gICAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgICBub2RpcjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmKG1hdGNoaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIGxvZyhgV2FybmluZzogTm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgcGF0dGVybjogJHtwYXR0ZXJufWAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb3B5UHJvbWlzZXMgPSBtYXRjaGluZ0ZpbGVzLm1hcCgoc291cmNlRmlsZSkgPT4ge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoUmVsYXRpdmUoYmFzZURpciwgc291cmNlRmlsZSk7XG4gICAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aFJlc29sdmUob3V0cHV0RnVsbFBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoUmVzb2x2ZShkZXN0UGF0aCwgJy4uJyk7XG4gICAgICAgIG1rZGlyU3luYyhkZXN0RGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb3B5RmlsZShzb3VyY2VGaWxlLCBkZXN0UGF0aCwgKGNvcHlFcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYoY29weUVycm9yKSB7XG4gICAgICAgICAgICAgIHJlamVjdChjb3B5RXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgYWxsQ29weVByb21pc2VzLnB1c2goLi4uY29weVByb21pc2VzKTtcbiAgICAgIHRvdGFsQ29waWVkICs9IG1hdGNoaW5nRmlsZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGFsbENvcHlQcm9taXNlcyk7XG5cbiAgICBpZih0b3RhbENvcGllZCA+IDApIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IGNvcGllZCAke3RvdGFsQ29waWVkfSBjb25maWd1cmVkIGZpbGVzIWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ05vIGNvbmZpZ3VyZWQgZmlsZXMgdG8gY29weScpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGNvcHkgY29uZmlndXJlZCBmaWxlcycpO1xuICAgIGxvZyhgRXJyb3IgY29weWluZyBjb25maWd1cmVkIGZpbGVzOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29weUZpbGVTeW5jID0gKHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykgPT4ge1xuICBsZXQgdGFyZ2V0RmlsZTogc3RyaW5nID0gdGFyZ2V0O1xuXG4gIGlmKGV4aXN0c1N5bmModGFyZ2V0KSkge1xuICAgIGlmKGxzdGF0U3luYyh0YXJnZXQpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRhcmdldEZpbGUgPSBwYXRoSm9pbih0YXJnZXQsIHBhdGhCYXNlbmFtZShzb3VyY2UpKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZUZpbGVTeW5jKHRhcmdldEZpbGUsIHJlYWRGaWxlU3luYyhzb3VyY2UpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb3B5Rm9sZGVyUmVjdXJzaXZlU3luYyA9IChzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IHRhcmdldEZvbGRlcjogc3RyaW5nID0gcGF0aEpvaW4odGFyZ2V0LCBwYXRoQmFzZW5hbWUoc291cmNlKSk7XG5cbiAgaWYoIWV4aXN0c1N5bmModGFyZ2V0Rm9sZGVyKSkge1xuICAgIG1rZGlyU3luYyh0YXJnZXRGb2xkZXIpO1xuICB9XG5cbiAgaWYobHN0YXRTeW5jKHNvdXJjZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIGZpbGVzID0gcmVhZGRpclN5bmMoc291cmNlKTtcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGN1clNvdXJjZTogc3RyaW5nID0gcGF0aEpvaW4oc291cmNlLCBmaWxlKTtcblxuICAgICAgaWYobHN0YXRTeW5jKGN1clNvdXJjZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb3B5Rm9sZGVyUmVjdXJzaXZlU3luYyhjdXJTb3VyY2UsIHRhcmdldEZvbGRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3B5RmlsZVN5bmMoY3VyU291cmNlLCB0YXJnZXRGb2xkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UGFja2FnZUpzb24gPSAocGFja2FnZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZm9ybWF0UGF0aDogc3RyaW5nID0gcGFja2FnZVBhdGggfHwgYCR7cHJvY2Vzcy5jd2QoKX0vcGFja2FnZS5qc29uYDtcbiAgY29uc3QgcGFja2FnZURhdGE6IHN0cmluZyA9IHJlYWRGaWxlU3luYyhmb3JtYXRQYXRoKS50b1N0cmluZygpO1xuXG4gIHJldHVybiBKU09OLnBhcnNlKHBhY2thZ2VEYXRhKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlc0J5RXh0ID0gKGV4dDogc3RyaW5nLCBjb25maWc6IExleENvbmZpZ1R5cGUpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHtzb3VyY2VGdWxsUGF0aH0gPSBjb25maWc7XG4gIHJldHVybiBnbG9iU3luYyhgKiovKioke2V4dH1gLCB7XG4gICAgYWJzb2x1dGU6IHRydWUsXG4gICAgY3dkOiBzb3VyY2VGdWxsUGF0aCxcbiAgICBub2RpcjogdHJ1ZVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDb25mbGljdE1vZHVsZXMgPSAobW9kdWxlTGlzdDogb2JqZWN0KSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWRMaXN0OiBvYmplY3QgPSB7Li4ubW9kdWxlTGlzdH07XG5cbiAgT2JqZWN0LmtleXModXBkYXRlZExpc3QpLmZvckVhY2goKG1vZHVsZU5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlZ2V4OiBSZWdFeHAgPSBuZXcgUmVnRXhwKCdeKD8hQHR5cGVzLykuKj8odml0ZXN0fHdlYnBhY2spLiokJywgJ2dpJyk7XG4gICAgaWYocmVnZXgudGVzdChtb2R1bGVOYW1lKSkge1xuICAgICAgZGVsZXRlIHVwZGF0ZWRMaXN0W21vZHVsZU5hbWVdO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHVwZGF0ZWRMaXN0O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUZpbGVzID0gKGZpbGVOYW1lOiBzdHJpbmcsIGlzUmVsYXRpdmU6IGJvb2xlYW4gPSBmYWxzZSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gaXNSZWxhdGl2ZSA/IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIGZpbGVOYW1lKSA6IGZpbGVOYW1lO1xuXG4gIHRyeSB7XG4gICAgcmltcmFmU3luYyhmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCByZW1vdmVNb2R1bGVzID0gKCkgPT4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICB0cnkge1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKCcuL25vZGVfbW9kdWxlcycsIHRydWUpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKCcuL3lhcm4ubG9jaycsIHRydWUpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKCcuL3BhY2thZ2UtbG9jay5qc29uJywgdHJ1ZSk7XG5cbiAgICByZXNvbHZlKG51bGwpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCBzZXRQYWNrYWdlSnNvbiA9IChqc29uLCBwYWNrYWdlUGF0aD86IHN0cmluZykgPT4ge1xuICBpZighanNvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdFBhdGg6IHN0cmluZyA9IHBhY2thZ2VQYXRoIHx8IGAke3Byb2Nlc3MuY3dkKCl9L3BhY2thZ2UuanNvbmA7XG5cbiAgd3JpdGVGaWxlU3luYyhmb3JtYXRQYXRoLCBKU09OLnN0cmluZ2lmeShqc29uLCBudWxsLCAyKSk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtlZE1vZHVsZVR5cGUge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGxpbmtlZE1vZHVsZXMgPSAoc3RhcnRQYXRoPzogc3RyaW5nKTogTGlua2VkTW9kdWxlVHlwZVtdID0+IHtcbiAgY29uc3Qgd29ya2luZ1BhdGg6IHN0cmluZyA9IHN0YXJ0UGF0aCB8fCBwcm9jZXNzLmN3ZCgpO1xuICBsZXQgbW9kdWxlUGF0aDogc3RyaW5nO1xuICBsZXQgcHJlZml4OiBzdHJpbmc7XG5cbiAgaWYod29ya2luZ1BhdGguaW5jbHVkZXMoJ0AnKSkge1xuICAgIHByZWZpeCA9IGBAJHt3b3JraW5nUGF0aC5zcGxpdCgnQCcpLnBvcCgpfWA7XG4gICAgbW9kdWxlUGF0aCA9IHdvcmtpbmdQYXRoO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZVBhdGggPSBwYXRoSm9pbih3b3JraW5nUGF0aCwgJ25vZGVfbW9kdWxlcycpO1xuICB9XG5cbiAgY29uc3QgZm91bmRQYXRoczogc3RyaW5nW10gPSBnbG9iU3luYygnKicsIHtcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICBjd2Q6IG1vZHVsZVBhdGgsXG4gICAgbm9kaXI6IGZhbHNlXG4gIH0pO1xuXG4gIHJldHVybiBmb3VuZFBhdGhzLnJlZHVjZSgobGlzdDogTGlua2VkTW9kdWxlVHlwZVtdLCBmb3VuZFBhdGg6IHN0cmluZykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGxzdGF0U3luYyhmb3VuZFBhdGgpO1xuXG4gICAgICBpZihzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGNvbnN0IGRlZXBMaXN0OiBMaW5rZWRNb2R1bGVUeXBlW10gPSBsaW5rZWRNb2R1bGVzKGZvdW5kUGF0aCk7XG4gICAgICAgIGxpc3QucHVzaCguLi5kZWVwTGlzdCk7XG4gICAgICB9IGVsc2UgaWYoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICBjb25zdCBtb2R1bGVOYW1lczogc3RyaW5nW10gPSAoW3ByZWZpeCwgcGF0aEJhc2VuYW1lKGZvdW5kUGF0aCldKS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gIWlzRW1wdHkoaXRlbSkpO1xuICAgICAgICBsaXN0LnB1c2goe25hbWU6IGAke21vZHVsZU5hbWVzLmpvaW4oJy8nKX1gLCBwYXRoOiBmb3VuZFBhdGh9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgfSwgW10pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTGlua2VkTW9kdWxlcyA9ICgpID0+IHtcbiAgY29uc3QgbGlua2VkID0gbGlua2VkTW9kdWxlcygpO1xuXG4gIGlmKGxpbmtlZC5sZW5ndGgpIHtcbiAgICBjb25zdCBtc2dNb2R1bGU6IHN0cmluZyA9IGxpbmtlZC5sZW5ndGggPiAxID8gJ01vZHVsZXMnIDogJ01vZHVsZSc7XG4gICAgY29uc3QgbGlua2VkTXNnOiBzdHJpbmcgPSBsaW5rZWQucmVkdWNlKFxuICAgICAgKG1zZzogc3RyaW5nLCBsaW5rZWRNb2R1bGU6IExpbmtlZE1vZHVsZVR5cGUpID0+XG4gICAgICAgIGAke21zZ31cXG4gKiAke2xpbmtlZE1vZHVsZS5uYW1lfWAsXG4gICAgICBgTGlua2VkICR7bXNnTW9kdWxlfTpgXG4gICAgKTtcblxuICAgIGxvZyhib3hlbihsaW5rZWRNc2csIHtkaW1Cb3JkZXI6IHRydWUsIHBhZGRpbmc6IDF9KSwgJ3dhcm4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRlbXBsYXRlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCByZXBsYWNlOiBzdHJpbmcsIHJlcGxhY2VDYXBzOiBzdHJpbmcpID0+IHtcbiAgbGV0IGRhdGE6IHN0cmluZyA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvc2FtcGxlL2csIHJlcGxhY2UpO1xuICBkYXRhID0gZGF0YS5yZXBsYWNlKC9TYW1wbGUvZywgcmVwbGFjZUNhcHMpO1xuICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBkYXRhLCAndXRmOCcpO1xufTtcbiJdLCJuYW1lcyI6WyJib3hlbiIsImNoYWxrIiwiY29weUZpbGUiLCJleGlzdHNTeW5jIiwibHN0YXRTeW5jIiwibWtkaXJTeW5jIiwicmVhZGRpclN5bmMiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwic3luYyIsImdsb2JTeW5jIiwiaXNFbXB0eSIsIm9yYSIsImJhc2VuYW1lIiwicGF0aEJhc2VuYW1lIiwiam9pbiIsInBhdGhKb2luIiwicmVsYXRpdmUiLCJwYXRoUmVsYXRpdmUiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJyaW1yYWZTeW5jIiwibG9nIiwiZ2V0RmlsZW5hbWVzIiwicHJvcHMiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJuYW1lIiwicXVpZXQiLCJ0eXBlIiwidXNlVHlwZXNjcmlwdCIsIm5hbWVDYXBzIiwiaXRlbVR5cGVzIiwiaW5jbHVkZXMiLCJ1bmRlZmluZWQiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsInRlbXBsYXRlUGF0aCIsInRlbXBsYXRlRXh0IiwidGVtcGxhdGVSZWFjdCIsImNyZWF0ZVNwaW5uZXIiLCJmYWlsIiwic3RhcnQiLCJzdWNjZWVkIiwiY29sb3IiLCJjcmVhdGVQcm9ncmVzc0JhciIsInBlcmNlbnRhZ2UiLCJ3aWR0aCIsImZpbGxlZCIsIk1hdGgiLCJyb3VuZCIsImVtcHR5IiwiZmlsbGVkQmFyIiwiY3lhbiIsInJlcGVhdCIsImVtcHR5QmFyIiwiZ3JheSIsImhhbmRsZVdlYnBhY2tQcm9ncmVzcyIsIm91dHB1dCIsInNwaW5uZXIiLCJlbW9qaSIsImFjdGlvbiIsInByb2dyZXNzTWF0Y2giLCJtYXRjaCIsInByb2dyZXNzIiwicGFyc2VJbnQiLCJwcm9ncmVzc0JhciIsInRleHQiLCJnZW5lcmFsUHJvZ3Jlc3NNYXRjaCIsImNvcHlGaWxlcyIsImZpbGVzIiwidHlwZU5hbWUiLCJjb25maWciLCJvdXRwdXRGdWxsUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwiaXRlbXMiLCJtYXAiLCJmaWxlTmFtZSIsImZyb20iLCJ0byIsIlByb21pc2UiLCJhbGwiLCJyZWplY3QiLCJyZWN1cnNpdmUiLCJjb3B5RXJyb3IiLCJsZW5ndGgiLCJlcnJvciIsIm1lc3NhZ2UiLCJjb3B5Q29uZmlndXJlZEZpbGVzIiwiY29weUZpbGVzQ29uZmlnIiwic291cmNlUGF0aCIsInRvdGFsQ29waWVkIiwiYmFzZURpciIsInByb2Nlc3MiLCJjd2QiLCJhbGxDb3B5UHJvbWlzZXMiLCJwYXR0ZXJuIiwicmVzb2x2ZWRQYXR0ZXJuIiwibWF0Y2hpbmdGaWxlcyIsImFic29sdXRlIiwibm9kaXIiLCJjb3B5UHJvbWlzZXMiLCJzb3VyY2VGaWxlIiwicmVsYXRpdmVQYXRoIiwiZGVzdFBhdGgiLCJkZXN0RGlyIiwicHVzaCIsImNvcHlGaWxlU3luYyIsInNvdXJjZSIsInRhcmdldCIsInRhcmdldEZpbGUiLCJpc0RpcmVjdG9yeSIsImNvcHlGb2xkZXJSZWN1cnNpdmVTeW5jIiwidGFyZ2V0Rm9sZGVyIiwiZm9yRWFjaCIsImZpbGUiLCJjdXJTb3VyY2UiLCJnZXRQYWNrYWdlSnNvbiIsInBhY2thZ2VQYXRoIiwiZm9ybWF0UGF0aCIsInBhY2thZ2VEYXRhIiwidG9TdHJpbmciLCJKU09OIiwicGFyc2UiLCJnZXRGaWxlc0J5RXh0IiwiZXh0IiwicmVtb3ZlQ29uZmxpY3RNb2R1bGVzIiwibW9kdWxlTGlzdCIsInVwZGF0ZWRMaXN0IiwiT2JqZWN0Iiwia2V5cyIsIm1vZHVsZU5hbWUiLCJyZWdleCIsIlJlZ0V4cCIsInRlc3QiLCJyZW1vdmVGaWxlcyIsImlzUmVsYXRpdmUiLCJmaWxlUGF0aCIsInJlbW92ZU1vZHVsZXMiLCJzZXRQYWNrYWdlSnNvbiIsImpzb24iLCJzdHJpbmdpZnkiLCJsaW5rZWRNb2R1bGVzIiwic3RhcnRQYXRoIiwid29ya2luZ1BhdGgiLCJtb2R1bGVQYXRoIiwicHJlZml4Iiwic3BsaXQiLCJwb3AiLCJmb3VuZFBhdGhzIiwicmVkdWNlIiwibGlzdCIsImZvdW5kUGF0aCIsInN0YXRzIiwiZGVlcExpc3QiLCJpc1N5bWJvbGljTGluayIsIm1vZHVsZU5hbWVzIiwiZmlsdGVyIiwiaXRlbSIsInBhdGgiLCJjaGVja0xpbmtlZE1vZHVsZXMiLCJsaW5rZWQiLCJtc2dNb2R1bGUiLCJsaW5rZWRNc2ciLCJtc2ciLCJsaW5rZWRNb2R1bGUiLCJkaW1Cb3JkZXIiLCJwYWRkaW5nIiwidXBkYXRlVGVtcGxhdGVOYW1lIiwicmVwbGFjZSIsInJlcGxhY2VDYXBzIiwiZGF0YSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBRUQsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFRQyxRQUFRLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLFdBQVcsRUFBRUMsWUFBWSxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUN4RyxTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxPQUFPQyxhQUFhLG9CQUFvQjtBQUN4QyxPQUFPQyxTQUFTLE1BQU07QUFDdEIsU0FBUUMsWUFBWUMsWUFB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
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXRlc3QuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge307XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdHlwZSBNb2NrID0gaW1wb3J0KCd2aXRlc3QnKS5Nb2NrO1xuICB0eXBlIE1vY2tlZEZ1bmN0aW9uPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4gPSBpbXBvcnQoJ3ZpdGVzdCcpLk1vY2tlZEZ1bmN0aW9uPFQ+O1xuICB0eXBlIE1vY2tlZENsYXNzPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+ID0gaW1wb3J0KCd2aXRlc3QnKS5Nb2NrZWRDbGFzczxUPjtcbiAgdHlwZSBTcHlJbnN0YW5jZSA9IGltcG9ydCgndml0ZXN0JykuU3B5SW5zdGFuY2U7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVSJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlabs/lex",
3
- "version": "1.54.2",
3
+ "version": "1.55.0",
4
4
  "description": "Lex",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -62,11 +62,11 @@
62
62
  "publish:minor": "npm version minor && npm publish",
63
63
  "publish:patch": "npm version patch && npm publish",
64
64
  "test": "NODE_ENV=test && (npm run lint || true) && npm run test:unit",
65
- "test:unit": "NODE_ENV=test && npm run env && npx jest",
66
- "test:integration": "NODE_ENV=test && npx jest --testPathPattern=integration",
67
- "test:cli": "NODE_ENV=test && npx jest --testPathPattern=cli",
65
+ "test:unit": "NODE_ENV=test && npm run env && npx vitest run",
66
+ "test:integration": "NODE_ENV=test && npx vitest run \"src/**/*.integration.*\"",
67
+ "test:cli": "NODE_ENV=test && npx vitest run \"src/**/*.cli.*\"",
68
68
  "test:commands": "NODE_ENV=test && npm run test:cli && npm run test:integration",
69
- "test:coverage": "NODE_ENV=test && npx jest --coverage --coverageDirectory=coverage --coverageReporters=text --coverageReporters=lcov --coverageReporters=html",
69
+ "test:coverage": "NODE_ENV=test && npx vitest run --coverage",
70
70
  "test:coverage:upload": "codecov",
71
71
  "test:webpack": "node scripts/test-webpack.js",
72
72
  "type-check": "tsc --noEmit --project tsconfig.lint.json",
@@ -83,81 +83,77 @@
83
83
  "dependencies": {
84
84
  "@mdx-js/loader": "^3.1.1",
85
85
  "@nlabs/webpack-plugin-static-site": "*",
86
- "@storybook/addon-docs": "^10.2.1",
87
- "@storybook/addon-links": "^10.2.1",
86
+ "@storybook/addon-docs": "^10.2.12",
87
+ "@storybook/addon-links": "^10.2.12",
88
88
  "@storybook/addon-postcss": "^2.0.0",
89
89
  "@storybook/addon-styling-webpack": "^3.0.0",
90
- "@storybook/addon-themes": "^10.2.1",
91
- "@storybook/cli": "^10.2.1",
92
- "@storybook/react": "^10.2.1",
93
- "@storybook/react-webpack5": "^10.2.1",
94
- "@swc/cli": "^0.7.10",
95
- "@swc/core": "^1.15.11",
96
- "@swc/jest": "^0.2.39",
90
+ "@storybook/addon-themes": "^10.2.12",
91
+ "@storybook/cli": "^10.2.12",
92
+ "@storybook/react": "^10.2.12",
93
+ "@storybook/react-webpack5": "^10.2.12",
94
+ "@swc/cli": "^0.8.0",
95
+ "@swc/core": "^1.15.13",
96
+ "@tailwindcss/forms": "^0.5.11",
97
97
  "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e",
98
- "@tailwindcss/postcss": "4.1.18",
98
+ "@tailwindcss/postcss": "4.2.1",
99
99
  "@testing-library/jest-dom": "^6.9.1",
100
100
  "@testing-library/react": "^16.3.2",
101
+ "@vitest/coverage-v8": "^4.0.18",
101
102
  "assert": "^2.1.0",
102
- "autoprefixer": "^10.4.23",
103
+ "autoprefixer": "^10.4.27",
103
104
  "boxen": "8.0.1",
104
105
  "buffer": "^6.0.3",
105
- "caniuse-lite": "1.0.30001766",
106
+ "caniuse-lite": "1.0.30001774",
106
107
  "chalk": "^5.6.2",
107
- "commander": "^14.0.2",
108
+ "commander": "^14.0.3",
108
109
  "compare-versions": "^6.1.1",
109
110
  "compression-webpack-plugin": "^11.1.0",
110
111
  "copy-webpack-plugin": "^13.0.1",
111
112
  "core-js": "^3.48.0",
112
113
  "crypto-js": "^4.2.0",
113
- "css-loader": "^7.1.3",
114
+ "css-loader": "^7.1.4",
114
115
  "css-minimizer-webpack-plugin": "^7.0.4",
115
116
  "cssnano": "^7.1.2",
116
117
  "dotenv-webpack": "^8.1.1",
117
118
  "download-npm-package": "^3.1.12",
118
- "eslint": "^9.39.2",
119
- "eslint-config-styleguidejs": "^4.3.1",
119
+ "eslint": "^10.0.2",
120
+ "eslint-config-styleguidejs": "^5.0.2",
120
121
  "execa": "9.6.1",
121
122
  "expect": "^30.2.0",
122
123
  "express": "^5.2.1",
123
124
  "favicons-webpack-plugin": "^6.0.1",
124
125
  "find-file-up": "^2.0.1",
125
- "glob": "^13.0.0",
126
+ "glob": "^13.0.6",
126
127
  "global": "^4.4.0",
127
- "graphql": "^16.12.0",
128
+ "graphql": "^16.13.0",
128
129
  "graphql-tag": "^2.12.6",
129
130
  "html-loader": "^5.1.0",
130
131
  "html-webpack-plugin": "^5.6.6",
131
132
  "https-browserify": "^1.0.0",
132
133
  "image-webpack-loader": "^8.1.0",
133
- "jest": "^30.2.0",
134
- "jest-circus": "^30.2.0",
135
- "jest-cli": "^30.2.0",
136
- "jest-environment-jsdom": "^30.2.0",
137
- "jest-transform-graphql": "2.1.0",
138
- "jest-util": "^30.2.0",
134
+ "jsdom": "^28.1.0",
139
135
  "latest-version": "9.0.0",
140
136
  "lodash": "^4.17.23",
141
137
  "luxon": "^3.7.2",
142
138
  "math-expression-evaluator": "^2.0.7",
143
139
  "mini-css-extract-plugin": "^2.10.0",
144
- "npm-check-updates": "^19.3.2",
145
- "openai": "^6.16.0",
146
- "ora": "9.1.0",
140
+ "npm-check-updates": "^19.5.0",
141
+ "openai": "^6.25.0",
142
+ "ora": "9.3.0",
147
143
  "os-browserify": "^0.3.0",
148
144
  "path-browserify": "^1.0.1",
149
145
  "postcss": "^8.5.6",
150
146
  "postcss-browser-reporter": "^0.7.0",
151
147
  "postcss-cli": "^11.0.1",
152
- "postcss-custom-properties": "^15.0.0",
148
+ "postcss-custom-properties": "^15.0.1",
153
149
  "postcss-flexbugs-fixes": "^5.0.2",
154
150
  "postcss-for": "^2.1.1",
155
151
  "postcss-hash": "^3.0.0",
156
152
  "postcss-import": "16.1.1",
157
- "postcss-loader": "^8.2.0",
153
+ "postcss-loader": "^8.2.1",
158
154
  "postcss-nesting": "^14.0.0",
159
155
  "postcss-percentage": "^0.0.0",
160
- "postcss-preset-env": "^11.1.2",
156
+ "postcss-preset-env": "^11.2.0",
161
157
  "postcss-simple-vars": "^7.0.1",
162
158
  "postcss-svgo": "7.1.0",
163
159
  "postcss-url": "10.1.3",
@@ -168,23 +164,24 @@
168
164
  "react-dom": "^19.2.4",
169
165
  "regenerator-runtime": "^0.14.1",
170
166
  "resolve": "^1.22.11",
171
- "rimraf": "^6.1.2",
172
- "semver": "^7.7.3",
167
+ "rimraf": "^6.1.3",
168
+ "semver": "^7.7.4",
173
169
  "source-map-loader": "^5.0.0",
174
- "storybook": "^10.2.1",
170
+ "storybook": "^10.2.12",
175
171
  "stream-browserify": "^3.0.0",
176
172
  "stream-http": "^3.2.0",
177
173
  "style-loader": "^4.0.0",
178
174
  "svg-spritemap-webpack-plugin": "^5.1.0",
179
175
  "svgo": "4.0.0",
180
176
  "swc-loader": "^0.2.7",
181
- "tailwindcss": "^4.1.18",
177
+ "tailwindcss": "^4.2.1",
182
178
  "ts-node": "^10.9.2",
183
179
  "tsconfig-paths-webpack-plugin": "^4.2.0",
184
180
  "typescript": "5.9.3",
185
181
  "util": "^0.12.5",
182
+ "vitest": "^4.0.18",
186
183
  "vm-browserify": "^1.1.2",
187
- "webpack": "5.104.1",
184
+ "webpack": "5.105.2",
188
185
  "webpack-bundle-analyzer": "^5.2.0",
189
186
  "webpack-cli": "^6.0.1",
190
187
  "webpack-merge": "^6.0.1",
@@ -193,29 +190,20 @@
193
190
  },
194
191
  "devDependencies": {
195
192
  "@types/express": "^5.0.6",
196
- "@types/jest": "^30.0.0",
197
193
  "@types/luxon": "^3.7.1",
198
- "@types/node": "^25.1.0",
194
+ "@types/node": "^25.3.1",
199
195
  "@types/ora": "^3.2.0",
200
- "@types/react": "^19.2.10",
196
+ "@types/react": "^19.2.14",
201
197
  "@types/webpack": "^5.28.5"
202
198
  },
203
199
  "overrides": {
204
- "cheerio": "^1.1.2",
205
200
  "cross-spawn": "^7.0.6",
206
- "css-select": "^6.0.0",
207
- "diff": "8.0.3",
201
+ "fast-xml-parser": ">=5.4.1",
208
202
  "got": "^14.6.6",
209
203
  "http-cache-semantics": "^4.2.0",
210
204
  "http-proxy-middleware": "^3.0.5",
211
- "lodash.pick": "^4.4.0",
212
- "querystring": false,
213
- "gm": false,
214
- "lodash-es": "^4.17.23",
215
- "node-domexception": false,
216
- "nth-check": "^2.1.1",
205
+ "minimatch": ">=10.2.4",
217
206
  "postcss": "^8.5.6",
218
- "qs": "^6.14.1",
219
207
  "semver-regex": "^4.0.5",
220
208
  "tmp": "^0.2.5"
221
209
  },
package/resolver.cjs CHANGED
@@ -15,9 +15,9 @@ module.exports = (value, options) => {
15
15
  return null;
16
16
  }
17
17
 
18
- const isSequencer = fileName.startsWith('jest-sequencer-');
18
+ const isSequencer = fileName.startsWith('vitest-sequencer-');
19
19
  if(isSequencer) {
20
- fileName = fileName.replace('jest-sequencer-', '');
20
+ fileName = fileName.replace('vitest-sequencer-', '');
21
21
  }
22
22
 
23
23
  const {basedir, extensions = ['.js', '.ts', '.tsx', '.cjs']} = options;
@@ -25,15 +25,17 @@ module.exports = (value, options) => {
25
25
  const hasExtension = existingExt !== '' && extensions.includes(existingExt);
26
26
  const isAbsolute = fileName.indexOf('/') === 0;
27
27
 
28
- // For Jest's internal modules and transformers, use lex node_modules
29
- if(fileName.includes('ts-jest') ||
30
- fileName.includes('jest-transform-graphql') ||
31
- fileName.includes('@swc/jest') ||
28
+ // For Vitest's internal modules and transformers, use lex node_modules
29
+ const isVitestModule = fileName === 'vitest' ||
30
+ fileName.startsWith('vitest/') ||
31
+ fileName.startsWith('@vitest/') ||
32
+ fileName === 'vite-node' ||
33
+ fileName.startsWith('vite-node/');
34
+
35
+ if(isVitestModule ||
32
36
  fileName.includes('core-js') ||
33
37
  fileName.includes('regenerator-runtime') ||
34
- fileName.includes('jest-circus') ||
35
- fileName.includes('@jest/') ||
36
- fileName.includes('jest-sequencer-')) {
38
+ fileName.includes('vitest-sequencer-')) {
37
39
  try {
38
40
  const result = resolveSync(fileName, {basedir: pathResolve(__dirname, '../'), extensions});
39
41
  return result;
@@ -23,8 +23,9 @@
23
23
  "skipLibCheck": true,
24
24
  "target": "esnext",
25
25
  "types": [
26
- "jest",
26
+ "vitest/globals",
27
+ "@testing-library/jest-dom",
27
28
  "react-native"
28
29
  ]
29
30
  }
30
- }
31
+ }
@@ -26,7 +26,6 @@
26
26
  "skipLibCheck": true,
27
27
  "target": "ESNext",
28
28
  "types": [
29
- "jest",
30
29
  "node"
31
30
  ]
32
31
  },
@@ -39,8 +38,9 @@
39
38
  "**/*.integration.*",
40
39
  "**/__tests__/**",
41
40
  "**/__mocks__/**",
41
+ "src/vitest.d.ts",
42
42
  "lib",
43
43
  "node_modules",
44
- "jest.config.mjs"
44
+ "vitest.config.mjs"
45
45
  ]
46
- }
46
+ }
package/tsconfig.json CHANGED
@@ -23,7 +23,8 @@
23
23
  "skipLibCheck": true,
24
24
  "target": "ESNext",
25
25
  "types": [
26
- "jest",
26
+ "vitest/globals",
27
+ "@testing-library/jest-dom",
27
28
  "node"
28
29
  ]
29
30
  },
@@ -35,7 +36,7 @@
35
36
  ],
36
37
  "include": [
37
38
  "./src",
38
- "./jest.setup.ts",
39
+ "./vitest.setup.ts",
39
40
  "./.storybook"
40
41
  ]
41
- }
42
+ }
@@ -31,7 +31,8 @@
31
31
  "target": "ESNext",
32
32
  "types": [
33
33
  "node",
34
- "jest"
34
+ "vitest/globals",
35
+ "@testing-library/jest-dom"
35
36
  ]
36
37
  },
37
38
  "include": [
@@ -42,4 +43,4 @@
42
43
  "node_modules",
43
44
  "**/*.md"
44
45
  ]
45
- }
46
+ }
@@ -21,7 +21,8 @@
21
21
  "skipLibCheck": true,
22
22
  "target": "ESNext",
23
23
  "types": [
24
- "jest",
24
+ "vitest/globals",
25
+ "@testing-library/jest-dom",
25
26
  "node"
26
27
  ]
27
28
  },
@@ -32,4 +33,4 @@
32
33
  "./lib",
33
34
  "./node_modules"
34
35
  ]
35
- }
36
+ }
@@ -29,7 +29,8 @@
29
29
  "strict": false,
30
30
  "target": "ESNext",
31
31
  "types": [
32
- "jest",
32
+ "vitest/globals",
33
+ "@testing-library/jest-dom",
33
34
  "node"
34
35
  ]
35
36
  },
@@ -39,10 +40,10 @@
39
40
  "**/*.spec.*",
40
41
  "**/*.integration.*",
41
42
  "**/__tests__/*",
42
- "jest.setup.ts"
43
+ "vitest.setup.ts"
43
44
  ],
44
45
  "exclude": [
45
46
  "lib",
46
47
  "node_modules"
47
48
  ]
48
- }
49
+ }
@@ -0,0 +1,2 @@
1
+ export default finalConfig;
2
+ declare const finalConfig: any;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ import {existsSync} from 'fs';
6
+ import merge from 'lodash/merge.js';
7
+ import {resolve} from 'path';
8
+ import {defineConfig} from 'vitest/config';
9
+
10
+ let projectVitestConfig = null;
11
+
12
+ if(process.env.LEX_CONFIG) {
13
+ try {
14
+ const lexConfig = JSON.parse(process.env.LEX_CONFIG);
15
+ projectVitestConfig = lexConfig.vitest;
16
+ } catch(error) {
17
+ // eslint-disable-next-line no-console
18
+ console.warn('Failed to parse LEX_CONFIG:', error.message);
19
+ }
20
+ }
21
+
22
+ const setupOverride = process.env.LEX_VITEST_SETUP;
23
+ const defaultSetupFile = resolve(process.cwd(), 'vitest.setup.js');
24
+ const setupFile = setupOverride || defaultSetupFile;
25
+ const setupFiles = setupFile && existsSync(setupFile) ? [setupFile] : [];
26
+
27
+ const baseConfig = defineConfig({
28
+ resolve: {
29
+ alias: [
30
+ {
31
+ find: /^(\.{1,2}\/.*)\.js$/,
32
+ replacement: '$1'
33
+ }
34
+ ]
35
+ },
36
+ test: {
37
+ globals: true,
38
+ environment: 'node',
39
+ include: ['**/*.{test,spec,integration}.{ts,tsx,js,jsx}'],
40
+ exclude: ['**/node_modules/**', '**/dist/**', '**/lib/**'],
41
+ setupFiles,
42
+ coverage: {
43
+ provider: 'v8',
44
+ reportsDirectory: 'coverage',
45
+ reporter: ['html', 'text'],
46
+ exclude: [
47
+ '**/node_modules/**',
48
+ '**/dist/**',
49
+ '**/lib/**',
50
+ '**/__snapshots__/**',
51
+ '**/*.d.ts'
52
+ ]
53
+ }
54
+ }
55
+ });
56
+
57
+ const finalConfig = projectVitestConfig && Object.keys(projectVitestConfig).length > 0
58
+ ? merge(baseConfig, {test: projectVitestConfig})
59
+ : baseConfig;
60
+
61
+ export default finalConfig;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+
6
+ // Read Vitest config from LEX_CONFIG environment variable if available
7
+ let lexConfig = null;
8
+ if(process.env.LEX_CONFIG) {
9
+ try {
10
+ lexConfig = JSON.parse(process.env.LEX_CONFIG);
11
+ } catch(error) {
12
+ console.warn('Failed to parse LEX_CONFIG:', error.message);
13
+ }
14
+ }
15
+
16
+ const setupFile = process.env.LEX_VITEST_SETUP || '<rootDir>/vitest.setup.js';
17
+
18
+ const baseConfig = {
19
+ resolve: {
20
+ alias: [
21
+ {
22
+ find: /^(\.{1,2}\/.*)\.js$/,
23
+ replacement: '$1'
24
+ },
25
+ {
26
+ find: /\.(css|less|scss|sass)$/,
27
+ replacement: 'identity-obj-proxy'
28
+ },
29
+ {
30
+ find: /\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$/,
31
+ replacement: '<rootDir>/__mocks__/fileMock.js'
32
+ }
33
+ ]
34
+ },
35
+ test: {
36
+ globals: true,
37
+ environment: 'jsdom',
38
+ include: ['**/*.{test,spec,integration}.{ts,tsx,js,jsx}'],
39
+ setupFiles: [setupFile],
40
+ coverage: {
41
+ provider: 'v8',
42
+ reportsDirectory: '<rootDir>/coverage',
43
+ reporter: ['html', 'text'],
44
+ exclude: [
45
+ '**/node_modules/**',
46
+ '**/dist/**',
47
+ '**/lib/**',
48
+ '**/__snapshots__/**',
49
+ '**/*.d.ts'
50
+ ]
51
+ }
52
+ }
53
+ };
54
+
55
+ // Merge with Lex config if available
56
+ if(lexConfig && lexConfig.vitest) {
57
+ module.exports = {
58
+ ...baseConfig,
59
+ test: {
60
+ ...baseConfig.test,
61
+ ...lexConfig.vitest
62
+ }
63
+ };
64
+ } else {
65
+ module.exports = baseConfig;
66
+ }
@@ -0,0 +1,19 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ import {vi} from 'vitest';
3
+
4
+ globalThis.ResizeObserver = vi.fn().mockImplementation(() => ({
5
+ observe: vi.fn(),
6
+ unobserve: vi.fn(),
7
+ disconnect: vi.fn()
8
+ }));
9
+
10
+ globalThis.matchMedia = vi.fn().mockImplementation((query) => ({
11
+ matches: false,
12
+ media: query,
13
+ onchange: null,
14
+ addListener: vi.fn(),
15
+ removeListener: vi.fn(),
16
+ addEventListener: vi.fn(),
17
+ removeEventListener: vi.fn(),
18
+ dispatchEvent: vi.fn()
19
+ }));