From b362b0293638e7dde989cdb1c45bb09a99de6719 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:43:00 +0000 Subject: [PATCH 01/11] Initial plan From a5a9a6c545a20508542fef930d60048cfbd75801 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:55:09 +0000 Subject: [PATCH 02/11] Convert codebase from CJS to ESM and replace local implementations with ember-estree imports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add ember-estree as a dependency - Add "type": "module" to package.json - Rename .eslintrc.js → .eslintrc.cjs and .prettierrc.js → .prettierrc.cjs - Convert all source files from CJS require/module.exports to ESM import/export - Replace local buildGlimmerVisitorKeys() with import from ember-estree - Replace local DocumentLines class with import from ember-estree - Remove local implementations of buildGlimmerVisitorKeys and DocumentLines Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- .eslintrc.js => .eslintrc.cjs | 13 +- .prettierrc.js => .prettierrc.cjs | 0 package.json | 2 + pnpm-lock.yaml | 934 +++++++++++++++++++++++++++++- src/parser/gjs-gts-parser.js | 176 +++--- src/parser/hbs-parser.js | 130 +++-- src/parser/transforms.js | 55 +- src/parser/ts-patch.js | 18 +- src/preprocessor/noop.js | 45 +- src/utils/document.js | 105 +--- 10 files changed, 1144 insertions(+), 334 deletions(-) rename .eslintrc.js => .eslintrc.cjs (66%) rename .prettierrc.js => .prettierrc.cjs (100%) diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 66% rename from .eslintrc.js rename to .eslintrc.cjs index a51ab03..a385c67 100644 --- a/.eslintrc.js +++ b/.eslintrc.cjs @@ -1,7 +1,6 @@ module.exports = { env: { browser: true, - commonjs: true, es2021: true, }, extends: ['standard', 'plugin:prettier/recommended', 'plugin:n/recommended'], @@ -10,24 +9,16 @@ module.exports = { env: { node: true, }, - files: ['.eslintrc.{js,cjs}'], + files: ['.eslintrc.cjs', '.prettierrc.cjs'], parserOptions: { sourceType: 'script', }, }, - { - env: { - node: true, - }, - files: ['tests/**/*.js'], - parserOptions: { - sourceType: 'module', - }, - }, ], ignorePatterns: ['tests/fixtures/**/*.js'], parserOptions: { ecmaVersion: 'latest', + sourceType: 'module', }, rules: {}, }; diff --git a/.prettierrc.js b/.prettierrc.cjs similarity index 100% rename from .prettierrc.js rename to .prettierrc.cjs diff --git a/package.json b/package.json index e8a9553..f278dd4 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ }, "license": "ISC", "author": "", + "type": "module", "exports": { ".": "./src/parser/gjs-gts-parser.js", "./hbs": "./src/parser/hbs-parser.js", @@ -33,6 +34,7 @@ "@glimmer/syntax": ">= 0.92.0", "@typescript-eslint/tsconfig-utils": "^8.38.0", "content-tag": "^4.1.0", + "ember-estree": "^0.1.1", "eslint-scope": "^9.1.1", "html-tags": "^5.1.0", "mathml-tag-names": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22714f1..98240ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: content-tag: specifier: ^4.1.0 version: 4.1.0 + ember-estree: + specifier: ^0.1.1 + version: 0.1.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)) eslint-scope: specifier: ^9.1.1 version: 9.1.1 @@ -383,6 +386,10 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.3': resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} @@ -410,10 +417,18 @@ packages: resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.9': resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} @@ -428,6 +443,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.26.3': resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} engines: {node: '>=6.9.0'} @@ -447,6 +468,10 @@ packages: resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} @@ -455,16 +480,30 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.25.9': resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.25.9': resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} @@ -473,6 +512,10 @@ packages: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.25.9': resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} @@ -485,10 +528,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -531,6 +584,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -600,6 +658,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-flow@7.28.6': + resolution: {integrity: sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.26.0': resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} @@ -612,6 +676,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -624,6 +694,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -726,6 +802,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-for-of@7.25.9': resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} @@ -774,6 +856,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-systemjs@7.25.9': resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} @@ -918,6 +1006,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.28.6': + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.5.5': resolution: {integrity: sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==} peerDependencies: @@ -957,11 +1051,29 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/preset-typescript@7.28.5': + resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.28.6': + resolution: {integrity: sha512-pgcbbEl/dWQYb6L6Yew6F94rdwygfuv+vJ/tXfwIOYAfPB6TNWpXUMEtEq3YuTeHRdvMIhvz13bkT9CNaS+wqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.12.18': resolution: {integrity: sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==} @@ -977,6 +1089,10 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} @@ -985,6 +1101,10 @@ packages: resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} @@ -993,6 +1113,10 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@ember-data/rfc395-data@0.0.4': resolution: {integrity: sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==} @@ -1028,6 +1152,15 @@ packages: resolution: {integrity: sha512-/SusdG+zgosc3t+9sPFVKSFOYyiSgLfXOT6lYNWoG1YtnhWDxlK4S8leZ0jhcVjemdaHln5rTyxCnq8oFLxqpQ==} engines: {node: 12.* || 14.* || >= 16} + '@emnapi/core@1.9.0': + resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + + '@emnapi/runtime@1.9.0': + resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1250,6 +1383,9 @@ packages: '@glimmer/env@0.1.7': resolution: {integrity: sha512-JKF/a9I9jw6fGoz8kA7LEQslrwJ5jms5CXhu/aqkBWk+PmZ6pTl8mlb/eJ/5ujBGTiQzBhy5AIWF712iA+4/mw==} + '@glimmer/global-context@0.84.3': + resolution: {integrity: sha512-8Oy9Wg5IZxMEeAnVmzD2NkObf89BeHoFSzJgJROE/deutd3rxg83mvlOez4zBBGYwnTb+VGU2LYRpet92egJjA==} + '@glimmer/global-context@0.92.3': resolution: {integrity: sha512-tvlK5pt6oSe3furJ1KsO9vG/KmF9S98HLrcR48XbfwXlkuxvUeS94cdQId4GCN5naeX4OC4xm6eEjZWdc2s+jw==} @@ -1277,6 +1413,9 @@ packages: '@glimmer/program@0.92.4': resolution: {integrity: sha512-fkquujQ11lsGCWl/+XpZW2E7bjHj/g6/Ht292A7pSoANBD8Bz/gPYiPM+XuMwes9MApEsTEMjV4EXlyk2/Cirg==} + '@glimmer/reference@0.84.3': + resolution: {integrity: sha512-lV+p/aWPVC8vUjmlvYVU7WQJsLh319SdXuAWoX/SE3pq340BJlAJiEcAc6q52y9JNhT57gMwtjMX96W5Xcx/qw==} + '@glimmer/reference@0.92.3': resolution: {integrity: sha512-Ud4LE689mEXL6BJnJx0ZPt2dt/A540C+TAnBFXHpcAjROz5gT337RN+tgajwudEUqpufExhcPSMGzs1pvWYCJg==} @@ -1310,6 +1449,9 @@ packages: '@glimmer/validator@0.44.0': resolution: {integrity: sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw==} + '@glimmer/validator@0.84.3': + resolution: {integrity: sha512-RTBV4TokUB0vI31UC7ikpV7lOYpWUlyqaKV//pRC4pexYMlmqnVhkFrdiimB/R1XyNdUOQUmnIAcdic39NkbhQ==} + '@glimmer/validator@0.92.3': resolution: {integrity: sha512-HKrMYeW0YhiksSeKYqX2chUR/rz82j12DcY7p2dORQlTV3qlAfiE5zRTJH1KRA1X3ZMf7DI2/GOzkXwYp0o+3Q==} @@ -1412,6 +1554,9 @@ packages: resolution: {integrity: sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==} engines: {node: '>=14.18.0'} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -1505,6 +1650,128 @@ packages: '@octokit/types@14.1.0': resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@oxc-parser/binding-android-arm-eabi@0.119.0': + resolution: {integrity: sha512-e0ii/Tqwk5pAHZRY+ZyXOdKHNRNmE+dvTGQZ7xQ5XPH2Am59aktD30QvfcfwItGhNTLCj/5TYGH5RHvmvqaILQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.119.0': + resolution: {integrity: sha512-ha0xQpiStuoBv7HGazNKQWa6IRxri2+PpeojdAyBGnHGzfioA1GcStNGEGOyXvF+OxDfWvPuw5QiRYRUMtmgbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.119.0': + resolution: {integrity: sha512-h/AIi5jfQz9WQUJJkkkHeXNYMhPtR72qnYZt0ZpM/LvlH/wpI5QkCPi7MWjjyY+m0JDorIXJyfOfccn8SbNSxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.119.0': + resolution: {integrity: sha512-15RwS/AawrgognvWsonI2eLKI5BqO0FzrpYXnzROysSR0x5RYsCc3UMFBwB1ph0UFFQzJy3ZbHHxfxp8RGr5Xg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.119.0': + resolution: {integrity: sha512-iKaayTIDqEj0yyNPL+0t/spNAxMv7O32uY4eu/ir8BvFNgavoRmN8uqxRj8sxQDle89N/1Iw0dgRjS3tiWrqlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.119.0': + resolution: {integrity: sha512-PDoOaOx8YWoxy19WNeMs6kOE0uFSb5EtA64Ye0wSp6sQpe+l8Gd+yjX2L+yNwd5MpDOvOy8KToa2bqCV4pf6iQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.119.0': + resolution: {integrity: sha512-AVxZ5Eo5squsUhpjnkCYuH20t5FCGV3HAP9UOKLxJQkmZW3kJvBGbfpH75ABxRrE2kGqmJW5FmS980u8v9Cepw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.119.0': + resolution: {integrity: sha512-9vfdyT9gczSeSwsEkBHVjigI8SWo3iB9zxEzL+YMBUrN0ftCUkKQr27DaDZK4/cQ80t6KRB+g9sUmT2T2AGnOQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.119.0': + resolution: {integrity: sha512-7BOq/tjSrtnp/ihw615uGcxMY3iya2qvVtwm15h2NvBZ6Jje+PC1GSUBOLfqGKJbUr9riSVV//a4iNhHI48Qdw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-ppc64-gnu@0.119.0': + resolution: {integrity: sha512-PQIrLJwoAaNyNSWBF+2SSgv44Jp+xpKVUA+8+PuoMhyBQ6lFSbQdaxewdn11i3heTFMYd2xF339HWax4S6MPVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.119.0': + resolution: {integrity: sha512-spNh4YhT9K+Ya5hr6NmI1MazKSKORD8u5/06hFbzTslLnmmxiGaLqJXhNKIYUH39ne/JD5rkoRkUcOB2/LpC3A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.119.0': + resolution: {integrity: sha512-hFoCTRxSJAcrNBYVlgNDDQq6LyJLYyhnJDlPtK/mWrPYS3x5/fUR9jc6wo5VyxKIL/0dDJBBWp19v81q9heU/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.119.0': + resolution: {integrity: sha512-bl7jHJZq3W5tYEvKG3yWZTUKTNb0/BtyYSnfMIrQ7t8hajCH4i1g0q+14s0KmQQl1UHxIX/Gx/Ps6e92qJQJmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.119.0': + resolution: {integrity: sha512-m+DE7NhJIEGp4efSJnNfRf3swT25rbZ1FTIihV+pOLTI+k5yNguxvqT338mNu61OVSx0BfpV8QlO2nz43GR/Zg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.119.0': + resolution: {integrity: sha512-pHhnXZHUfd5pYzFLQfvx1DH2HY+L8DPZeh6SsQrsmoaODm1+j8VPeWLwGSrXQSz5f1kfT/mnzm1iNLVOGIeuaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.119.0': + resolution: {integrity: sha512-8Fthv9nOec0hQLX16yjYyYIU+u8ZFuQojdQ3vNgXN+PcqI/bDohGgCATrxO69gLf0IzkyOmKmurXOQCYK8BYpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.119.0': + resolution: {integrity: sha512-KpOU6fLqevFDP6ndkgE4BPoceELM4bOsEsAXjpe+FKYuUyEzHssYPBmxouGpXDQeAeWTBIjosw5yElLMRPuccw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.119.0': + resolution: {integrity: sha512-omtTgAKIl6GQ40nG+wAWN8xMJLNtfmTdd0+wMIcrw1shX9y5TntAVIuiay3Du0wvUK9sgMpL07HYNphgHeZS0A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.119.0': + resolution: {integrity: sha512-+0kqoCfv4WFP3e4BqcVEtf1moUuG9Zv5lo1aKcw1JakqJo008TGG+C2LnVM4QucGSZVQ/Ii/H5XCvrRbkeLQfA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.119.0': + resolution: {integrity: sha512-5kaKmBHD+OQjZzGAQQ9n8jWNvCRxu3MjElAjkCqsS3i2wiN3hqHlOPKwGDydYiB1gKdeYGlTjRYtuF4gBLDSxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.119.0': + resolution: {integrity: sha512-9SCGhodOxEicD2kblitu34fGHcpmqgI3beYw/E22ehVLHzccHRFH91NmKt0MhZEaAwLpei6OOA9aB6Vuks9qAg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1646,6 +1913,9 @@ packages: '@tsconfig/ember@3.0.8': resolution: {integrity: sha512-OVnIsZIt/8q0VEtcdz3rRryNrm6gdJTxXlxefkGIrkZnME0wqslmwHlUEZ7mvh377df9FqBhNKrYNarhCW8zJA==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -2054,6 +2324,10 @@ packages: resolution: {integrity: sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==} engines: {node: '>=4'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + async-disk-cache@1.3.5: resolution: {integrity: sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ==} @@ -2166,6 +2440,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.0: resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} engines: {node: '>=6.0.0'} @@ -2189,6 +2466,9 @@ packages: resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==} engines: {node: '>=0.8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blank-object@1.0.2: resolution: {integrity: sha512-kXQ19Xhoghiyw66CUiGypnuRpWlbHAzY/+NyvqTEdTfhfQGH1/dbEMYiXju7fYKIFePpzp/y9dsu5Cu/PkmawQ==} @@ -2293,6 +2573,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -2378,11 +2661,19 @@ packages: clean-up-path@1.0.0: resolution: {integrity: sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -2390,6 +2681,14 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} @@ -2401,9 +2700,17 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -2424,6 +2731,13 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + content-tag-utils@0.5.1: + resolution: {integrity: sha512-N7fPTATy5P5CN2lmtbtfhfTP9CQ2lEHZnc5gL0w4m9sl8STwiVUeJzzFZ3ZApeEveEPwvZKEy8twz4UMNdIOwA==} + engines: {node: '>= 18'} + + content-tag@3.1.3: + resolution: {integrity: sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g==} + content-tag@4.1.0: resolution: {integrity: sha512-On6gUuvI1l5MScHO+Xbwjeq1Pk9H6HOipDWkzqGGUGmKpq6K5TRmQuCl1LGSHbdIo2l+lSsgLKrLgCl5kKYA+A==} @@ -2532,6 +2846,9 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-data-property@1.1.1: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} @@ -2643,6 +2960,9 @@ packages: resolution: {integrity: sha512-BtkjulweiXo9c3yVWrtexw2dTmBrvavD/xixNC6TKOBdrixUwU+6nuOO9dufDWsMxoid7MvtmDpzc9+mE8PdaA==} engines: {node: 10.* || >= 12.*} + ember-estree@0.1.1: + resolution: {integrity: sha512-tVmeFl3/4jMNsiVsL/97dEjsd8l3T3NSLZTXZmOZoe/gIfpqUzveNmFUuswZ5QYda6Wr3t4d0BCCCo/ozf4JNQ==} + ember-rfc176-data@0.3.18: resolution: {integrity: sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==} @@ -2662,6 +2982,11 @@ packages: peerDependencies: '@glimmer/component': '>= 1.1.2' + ember-template-recast@6.1.5: + resolution: {integrity: sha512-VnRN8FzEHQnw/5rCv6Wnq8MVYXbGQbFY+rEufvWV+FO/IsxMahGEud4MYWtTA2q8iG+qJFrDQefNvQ//7MI7Qw==} + engines: {node: 12.* || 14.* || >= 16.*} + hasBin: true + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3033,6 +3358,10 @@ packages: find-babel-config@2.1.2: resolution: {integrity: sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==} + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -3071,6 +3400,10 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flow-parser@0.305.0: + resolution: {integrity: sha512-4Ws+q7nNQZRIpVGGlNTqkQCs3E3aXLnWWWvxo4WGRZTCXzZAq3ucZeckZ8h+c4hM3z+vtpJkzFyGGEMUqun1Zw==} + engines: {node: '>=0.4.0'} + for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -3219,20 +3552,21 @@ packages: glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -3392,6 +3726,9 @@ packages: peerDependencies: postcss: ^8.1.0 + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-walk@5.0.1: resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3536,6 +3873,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} @@ -3571,6 +3912,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3638,6 +3983,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -3678,6 +4027,10 @@ packages: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + istextorbinary@2.1.0: resolution: {integrity: sha512-kT1g2zxZ5Tdabtpp9VSdOzW9lb6LXImyWbzbQeTxoRtHhurC9Ej9Wckngr2+uepPL09ky/mJHmN9jeJPML5t6A==} engines: {node: '>=0.12'} @@ -3715,6 +4068,16 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jscodeshift@17.3.0: + resolution: {integrity: sha512-LjFrGOIORqXBU+jwfC9nbkjmQfFldtMIoS6d9z2LG/lkmyNXsJAySPT+2SWXJEoE68/bCWcxKpXH37npftgmow==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + peerDependenciesMeta: + '@babel/preset-env': + optional: true + jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -3769,6 +4132,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + ky@1.7.2: resolution: {integrity: sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==} engines: {node: '>=18'} @@ -3830,6 +4197,10 @@ packages: lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} @@ -3852,6 +4223,10 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -4126,6 +4501,10 @@ packages: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -4134,6 +4513,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxc-parser@0.119.0: + resolution: {integrity: sha512-fNiKvO0ZHSUmINQlVY2It+vGbHxCvhpqJi0rZYFFOESoOy3fs5E4erKYGZtB/J1aULkjtY06aWNil4JxMsKXGg==} + engines: {node: ^20.19.0 || >=22.12.0} + p-finally@2.0.1: resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} engines: {node: '>=8'} @@ -4272,6 +4655,14 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -4421,10 +4812,18 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + recast@0.18.10: resolution: {integrity: sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ==} engines: {node: '>= 4'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -4536,6 +4935,10 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -4677,6 +5080,10 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4831,6 +5238,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4949,6 +5359,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4968,6 +5381,10 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5252,6 +5669,9 @@ packages: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + webpack-sources@3.3.4: resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} engines: {node: '>=10.13.0'} @@ -5328,6 +5748,10 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5366,6 +5790,9 @@ packages: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -5387,6 +5814,12 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.26.3': {} '@babel/compat-data@7.28.5': {} @@ -5443,10 +5876,22 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.25.9': dependencies: '@babel/types': 7.26.3 + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + '@babel/helper-compilation-targets@7.25.9': dependencies: '@babel/compat-data': 7.26.3 @@ -5476,6 +5921,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5503,6 +5961,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.26.4 @@ -5517,6 +5982,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5526,14 +5998,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.26.3 + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + '@babel/helper-plugin-utils@7.25.9': {} '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5552,6 +6039,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: '@babel/traverse': 7.26.4 @@ -5559,6 +6055,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.25.9': {} '@babel/helper-string-parser@7.27.1': {} @@ -5592,6 +6095,10 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5671,6 +6178,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5681,6 +6193,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5691,6 +6208,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5801,6 +6323,12 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.26.0) + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5854,6 +6382,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6016,6 +6552,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-typescript@7.5.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6128,6 +6675,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-flow@7.27.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.26.0) + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6135,6 +6689,26 @@ snapshots: '@babel/types': 7.26.3 esutils: 2.0.3 + '@babel/preset-typescript@7.28.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.28.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.7 + source-map-support: 0.5.21 + '@babel/runtime@7.12.18': dependencies: regenerator-runtime: 0.13.11 @@ -6155,6 +6729,12 @@ snapshots: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 @@ -6179,6 +6759,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -6189,6 +6781,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@ember-data/rfc395-data@0.0.4': {} '@ember/edition-utils@1.2.0': {} @@ -6270,6 +6867,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@emnapi/core@1.9.0': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -6470,6 +7083,10 @@ snapshots: '@glimmer/env@0.1.7': {} + '@glimmer/global-context@0.84.3': + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/global-context@0.92.3': {} '@glimmer/interfaces@0.84.3': @@ -6532,6 +7149,14 @@ snapshots: '@glimmer/vm': 0.92.3 '@glimmer/wire-format': 0.92.3 + '@glimmer/reference@0.84.3': + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/global-context': 0.84.3 + '@glimmer/interfaces': 0.84.3 + '@glimmer/util': 0.84.3 + '@glimmer/validator': 0.84.3 + '@glimmer/reference@0.92.3': dependencies: '@glimmer/env': 0.1.7 @@ -6602,6 +7227,11 @@ snapshots: '@glimmer/validator@0.44.0': {} + '@glimmer/validator@0.84.3': + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/global-context': 0.84.3 + '@glimmer/validator@0.92.3': dependencies: '@glimmer/env': 0.1.7 @@ -6721,6 +7351,13 @@ snapshots: jju: 1.4.0 read-yaml-file: 1.1.0 + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.9.0 + '@emnapi/runtime': 1.9.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -6840,6 +7477,70 @@ snapshots: dependencies: '@octokit/openapi-types': 25.1.0 + '@oxc-parser/binding-android-arm-eabi@0.119.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.119.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.119.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.119.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.119.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.119.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.119.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.119.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.119.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.119.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.119.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.119.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.119.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.119.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.119.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.119.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.119.0': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.119.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.119.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.119.0': + optional: true + + '@oxc-project/types@0.119.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -6932,6 +7633,11 @@ snapshots: '@tsconfig/ember@3.0.8': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.6': {} @@ -7537,6 +8243,10 @@ snapshots: ast-types@0.13.3: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + async-disk-cache@1.3.5: dependencies: debug: 2.6.9 @@ -7570,7 +8280,7 @@ snapshots: async@2.6.4: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 at-least-node@1.0.0: {} @@ -7686,6 +8396,8 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + baseline-browser-mapping@2.10.0: {} baseline-browser-mapping@2.8.27: {} @@ -7700,6 +8412,12 @@ snapshots: binaryextensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blank-object@1.0.2: {} brace-expansion@1.1.11: @@ -7913,6 +8631,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} builtins@5.0.1: @@ -8020,6 +8743,10 @@ snapshots: clean-up-path@1.0.0: {} + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + cli-highlight@2.1.11: dependencies: chalk: 4.1.2 @@ -8029,6 +8756,8 @@ snapshots: parse5-htmlparser2-tree-adapter: 6.0.1 yargs: 16.2.0 + cli-spinners@2.9.2: {} + cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -8041,6 +8770,14 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone@1.0.4: {} + clone@2.1.2: {} color-convert@2.0.1: @@ -8049,8 +8786,12 @@ snapshots: color-name@1.1.4: {} + colors@1.4.0: {} + commander@2.20.3: {} + commander@8.3.0: {} + common-ancestor-path@1.0.1: {} commondir@1.0.1: {} @@ -8076,6 +8817,16 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 + content-tag-utils@0.5.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)): + dependencies: + content-tag: 3.1.3 + jscodeshift: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + + content-tag@3.1.3: {} + content-tag@4.1.0: {} convert-source-map@2.0.0: {} @@ -8174,6 +8925,10 @@ snapshots: deep-is@0.1.4: {} + defaults@1.0.4: + dependencies: + clone: 1.0.4 + define-data-property@1.1.1: dependencies: get-intrinsic: 1.2.2 @@ -8415,6 +9170,17 @@ snapshots: - '@babel/core' - supports-color + ember-estree@0.1.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)): + dependencies: + '@glimmer/syntax': 0.95.0 + content-tag-utils: 0.5.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + ember-template-recast: 6.1.5 + oxc-parser: 0.119.0 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + ember-rfc176-data@0.3.18: {} ember-router-generator@2.0.0: @@ -8526,6 +9292,22 @@ snapshots: - supports-color - webpack + ember-template-recast@6.1.5: + dependencies: + '@glimmer/reference': 0.84.3 + '@glimmer/syntax': 0.84.3 + '@glimmer/validator': 0.84.3 + async-promise-queue: 1.0.5 + colors: 1.4.0 + commander: 8.3.0 + globby: 11.1.0 + ora: 5.4.1 + slash: 3.0.0 + tmp: 0.2.5 + workerpool: 6.5.1 + transitivePeerDependencies: + - supports-color + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -9276,6 +10058,12 @@ snapshots: dependencies: json5: 2.2.3 + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -9326,6 +10114,8 @@ snapshots: flatted@3.3.1: {} + flow-parser@0.305.0: {} + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -9731,6 +10521,8 @@ snapshots: dependencies: postcss: 8.4.49 + ieee754@1.2.1: {} + ignore-walk@5.0.1: dependencies: minimatch: 5.1.6 @@ -9877,6 +10669,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-interactive@1.0.0: {} + is-lambda@1.0.1: {} is-map@2.0.3: {} @@ -9900,6 +10694,10 @@ snapshots: is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -9967,6 +10765,8 @@ snapshots: dependencies: which-typed-array: 1.1.18 + is-unicode-supported@0.1.0: {} + is-unicode-supported@2.1.0: {} is-weakmap@2.0.2: {} @@ -9998,6 +10798,8 @@ snapshots: dependencies: isarray: 1.0.0 + isobject@3.0.1: {} + istextorbinary@2.1.0: dependencies: binaryextensions: 2.3.0 @@ -10039,6 +10841,31 @@ snapshots: dependencies: argparse: 2.0.1 + jscodeshift@17.3.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)): + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.28.5 + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.26.0) + '@babel/preset-typescript': 7.28.5(@babel/core@7.26.0) + '@babel/register': 7.28.6(@babel/core@7.26.0) + flow-parser: 0.305.0 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + neo-async: 2.6.2 + picocolors: 1.1.1 + recast: 0.23.11 + tmp: 0.2.5 + write-file-atomic: 5.0.1 + optionalDependencies: + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + jsesc@3.0.2: {} jsesc@3.1.0: {} @@ -10085,6 +10912,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kind-of@6.0.3: {} + ky@1.7.2: {} latest-version@9.0.0: @@ -10144,13 +10973,18 @@ snapshots: lodash@4.17.23: {} + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + loupe@2.3.7: dependencies: get-func-name: 2.0.2 lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 lru-cache@10.4.3: {} @@ -10170,6 +11004,11 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -10465,6 +11304,18 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + os-tmpdir@1.0.2: {} own-keys@1.0.1: @@ -10473,6 +11324,31 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-parser@0.119.0: + dependencies: + '@oxc-project/types': 0.119.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.119.0 + '@oxc-parser/binding-android-arm64': 0.119.0 + '@oxc-parser/binding-darwin-arm64': 0.119.0 + '@oxc-parser/binding-darwin-x64': 0.119.0 + '@oxc-parser/binding-freebsd-x64': 0.119.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.119.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.119.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.119.0 + '@oxc-parser/binding-linux-arm64-musl': 0.119.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.119.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.119.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.119.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.119.0 + '@oxc-parser/binding-linux-x64-gnu': 0.119.0 + '@oxc-parser/binding-linux-x64-musl': 0.119.0 + '@oxc-parser/binding-openharmony-arm64': 0.119.0 + '@oxc-parser/binding-wasm32-wasi': 0.119.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.119.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.119.0 + '@oxc-parser/binding-win32-x64-msvc': 0.119.0 + p-finally@2.0.1: {} p-limit@1.3.0: @@ -10581,6 +11457,12 @@ snapshots: pify@4.0.1: {} + pirates@4.0.7: {} + + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -10719,6 +11601,12 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + recast@0.18.10: dependencies: ast-types: 0.13.3 @@ -10726,6 +11614,14 @@ snapshots: private: 0.1.8 source-map: 0.6.1 + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -10872,6 +11768,11 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + retry@0.12.0: {} reusify@1.0.4: {} @@ -11053,6 +11954,10 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -11248,6 +12153,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -11358,6 +12267,8 @@ snapshots: dependencies: any-promise: 1.3.0 + tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinypool@0.8.4: {} @@ -11372,6 +12283,8 @@ snapshots: dependencies: os-tmpdir: 1.0.2 + tmp@0.2.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -11713,6 +12626,10 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + webpack-sources@3.3.4: {} webpack@5.94.0: @@ -11848,6 +12765,11 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + y18n@5.0.8: {} yallist@3.1.1: {} @@ -11883,3 +12805,5 @@ snapshots: yocto-queue@1.1.1: {} yoctocolors@2.1.1: {} + + zimmerframe@1.1.4: {} diff --git a/src/parser/gjs-gts-parser.js b/src/parser/gjs-gts-parser.js index cdc16e2..f39780c 100644 --- a/src/parser/gjs-gts-parser.js +++ b/src/parser/gjs-gts-parser.js @@ -1,13 +1,28 @@ -const tsconfigUtils = require('@typescript-eslint/tsconfig-utils'); -const babelParser = require('@babel/eslint-parser/experimental-worker'); -const { registerParsedFile } = require('../preprocessor/noop'); -const { +import { createRequire } from 'node:module'; +import { registerParsedFile } from '../preprocessor/noop.js'; +import { patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser, -} = require('./ts-patch'); -const { transformForLint, preprocessGlimmerTemplates, convertAst } = require('./transforms'); +} from './ts-patch.js'; +import { transformForLint, preprocessGlimmerTemplates, convertAst } from './transforms.js'; + +const require = createRequire(import.meta.url); + +let tsconfigUtils; +try { + tsconfigUtils = require('@typescript-eslint/tsconfig-utils'); +} catch { + // not available +} + +let babelParser; +try { + babelParser = require('@babel/eslint-parser/experimental-worker'); +} catch { + // not available +} /** * implements https://eslint.org/docs/latest/extend/custom-parsers @@ -25,7 +40,6 @@ const { transformForLint, preprocessGlimmerTemplates, convertAst } = require('./ function parseAllowJsFromTsconfig(tsconfigPath, rootDir) { try { const parserPath = require.resolve('@typescript-eslint/parser'); - // eslint-disable-next-line n/no-unpublished-require const tsPath = require.resolve('typescript', { paths: [parserPath] }); const ts = require(tsPath); const parsed = tsconfigUtils.getParsedConfigFile(ts, tsconfigPath, rootDir); @@ -131,86 +145,88 @@ function getAllowJs(options) { /** * @type {import('eslint').ParserModule} */ -module.exports = { - meta: { - name: 'ember-eslint-parser', - version: '*', - }, - parseForESLint(code, options) { - const allowGjsWasSet = options.allowGjs !== undefined; - const allowGjs = allowGjsWasSet ? options.allowGjs : getAllowJs(options); - let actualAllowGjs; - // Only patch TypeScript if we actually need it. - if (options.programs || options.projectService || options.project) { - ({ allowGjs: actualAllowGjs } = patchTs({ allowGjs })); - } - registerParsedFile(options.filePath); - let jsCode = code; - const info = transformForLint(code, options.filePath); - jsCode = info.output; +export function parseForESLint(code, options) { + const allowGjsWasSet = options.allowGjs !== undefined; + const allowGjs = allowGjsWasSet ? options.allowGjs : getAllowJs(options); + let actualAllowGjs; + // Only patch TypeScript if we actually need it. + if (options.programs || options.projectService || options.project) { + ({ allowGjs: actualAllowGjs } = patchTs({ allowGjs })); + } + registerParsedFile(options.filePath); + let jsCode = code; + const info = transformForLint(code, options.filePath); + jsCode = info.output; - const isTypescript = options.filePath.endsWith('.gts') || options.filePath.endsWith('.ts'); - let useTypescript = true; + const isTypescript = options.filePath.endsWith('.gts') || options.filePath.endsWith('.ts'); + let useTypescript = true; - if (options.useBabel || !typescriptParser) { - useTypescript = false; - } + if (options.useBabel || !typescriptParser) { + useTypescript = false; + } - let result = null; - const filePath = options.filePath; - if (options.project || options.projectService) { - jsCode = replaceExtensions(jsCode); - } + let result = null; + const filePath = options.filePath; + if (options.project || options.projectService) { + jsCode = replaceExtensions(jsCode); + } - if (isTypescript && !typescriptParser) { - throw new Error('Please install typescript to process gts'); - } + if (isTypescript && !typescriptParser) { + throw new Error('Please install typescript to process gts'); + } - try { - result = - isTypescript || useTypescript - ? typescriptParser.parseForESLint(jsCode, { - ...options, - ranges: true, - extraFileExtensions: ['.gts', '.gjs'], - filePath, - }) - : babelParser.parseForESLint(jsCode, { - ...options, - requireConfigFile: false, - ranges: true, - }); - if (!info.templateInfos?.length) { - return result; - } - const preprocessedResult = preprocessGlimmerTemplates(info, code); - preprocessedResult.code = code; - const { templateVisitorKeys } = preprocessedResult; - const visitorKeys = { ...result.visitorKeys, ...templateVisitorKeys }; - result.isTypescript = isTypescript || useTypescript; - convertAst(result, preprocessedResult, visitorKeys); - if (result.services?.program) { - // Compare allowJs with the actual program's compiler options - const programAllowJs = result.services.program.getCompilerOptions?.()?.allowJs; - if ( - !allowGjsWasSet && - programAllowJs !== undefined && - actualAllowGjs !== undefined && - actualAllowGjs !== programAllowJs - ) { - // eslint-disable-next-line no-console - console.warn( - '[ember-eslint-parser] allowJs does not match the actual program. Consider setting allowGjs explicitly.\n' + - ` Current: ${allowGjs}, Program: ${programAllowJs}` - ); - } - syncMtsGtsSourceFiles(result.services.program); + try { + result = + isTypescript || useTypescript + ? typescriptParser.parseForESLint(jsCode, { + ...options, + ranges: true, + extraFileExtensions: ['.gts', '.gjs'], + filePath, + }) + : babelParser.parseForESLint(jsCode, { + ...options, + requireConfigFile: false, + ranges: true, + }); + if (!info.templateInfos?.length) { + return result; + } + const preprocessedResult = preprocessGlimmerTemplates(info, code); + preprocessedResult.code = code; + const { templateVisitorKeys } = preprocessedResult; + const visitorKeys = { ...result.visitorKeys, ...templateVisitorKeys }; + result.isTypescript = isTypescript || useTypescript; + convertAst(result, preprocessedResult, visitorKeys); + if (result.services?.program) { + // Compare allowJs with the actual program's compiler options + const programAllowJs = result.services.program.getCompilerOptions?.()?.allowJs; + if ( + !allowGjsWasSet && + programAllowJs !== undefined && + actualAllowGjs !== undefined && + actualAllowGjs !== programAllowJs + ) { + // eslint-disable-next-line no-console + console.warn( + '[ember-eslint-parser] allowJs does not match the actual program. Consider setting allowGjs explicitly.\n' + + ` Current: ${allowGjs}, Program: ${programAllowJs}` + ); } - return { ...result, visitorKeys }; - } catch (e) { - console.error(e); - throw e; + syncMtsGtsSourceFiles(result.services.program); } + return { ...result, visitorKeys }; + } catch (e) { + console.error(e); + throw e; + } +} + +export default { + meta: { + name: 'ember-eslint-parser', + version: '*', }, + parseForESLint, }; diff --git a/src/parser/hbs-parser.js b/src/parser/hbs-parser.js index 8bd2b39..e57d23f 100644 --- a/src/parser/hbs-parser.js +++ b/src/parser/hbs-parser.js @@ -1,6 +1,6 @@ -const eslintScope = require('eslint-scope'); -const DocumentLines = require('../utils/document'); -const { processGlimmerTemplate, buildGlimmerVisitorKeys } = require('./transforms'); +import { analyze as eslintScopeAnalyze } from 'eslint-scope'; +import { DocumentLines } from 'ember-estree'; +import { processGlimmerTemplate, buildGlimmerVisitorKeys } from './transforms.js'; // Constant: Program + all Glimmer node types. Computed once at module load. const hbsVisitorKeys = { Program: ['body'], ...buildGlimmerVisitorKeys() }; @@ -17,76 +17,78 @@ const hbsVisitorKeys = { Program: ['body'], ...buildGlimmerVisitorKeys() }; /** * @type {import('eslint').ParserModule} */ -module.exports = { - meta: { - name: 'ember-eslint-parser/hbs', - version: '*', - }, - parseForESLint(code, options) { - const filePath = (options && options.filePath) || ''; - const codeLines = new DocumentLines(code); +export function parseForESLint(code, options) { + const filePath = (options && options.filePath) || ''; + const codeLines = new DocumentLines(code); - let result; - try { - result = processGlimmerTemplate({ - templateContent: code, - codeLines, - templateRange: [0, code.length], + let result; + try { + result = processGlimmerTemplate({ + templateContent: code, + codeLines, + templateRange: [0, code.length], + }); + } catch (e) { + // Transform glimmer parse error to ESLint-compatible error + const loc = e.location || (e.hash && e.hash.loc); + if (loc && loc.start) { + const err = Object.assign(new SyntaxError(e.message), { + lineNumber: loc.start.line, + column: loc.start.column, + index: codeLines.positionToOffset(loc.start), + fileName: filePath, }); - } catch (e) { - // Transform glimmer parse error to ESLint-compatible error - const loc = e.location || (e.hash && e.hash.loc); - if (loc && loc.start) { - const err = Object.assign(new SyntaxError(e.message), { - lineNumber: loc.start.line, - column: loc.start.column, - index: codeLines.positionToOffset(loc.start), - fileName: filePath, - }); - throw err; - } - throw e; + throw err; } + throw e; + } + + const { ast: templateNode, comments } = result; - const { ast: templateNode, comments } = result; + // Wrap in a synthetic Program node (required by ESLint) + const program = { + type: 'Program', + body: [templateNode], + tokens: templateNode.tokens, + comments, + range: [0, code.length], + start: 0, + end: code.length, + loc: { + start: { line: 1, column: 0 }, + end: codeLines.offsetToPosition(code.length), + }, + }; - // Wrap in a synthetic Program node (required by ESLint) - const program = { + // Build visitor keys: Program + all Glimmer node types + const visitorKeys = hbsVisitorKeys; + + // Create an empty scope manager. + // For HBS, all locals are assumed to be defined at runtime, + // so we don't track variable references (no no-undef errors). + const scopeManager = eslintScopeAnalyze( + { type: 'Program', - body: [templateNode], - tokens: templateNode.tokens, - comments, + body: [], range: [0, code.length], - start: 0, - end: code.length, - loc: { - start: { line: 1, column: 0 }, - end: codeLines.offsetToPosition(code.length), - }, - }; - - // Build visitor keys: Program + all Glimmer node types - const visitorKeys = hbsVisitorKeys; + loc: program.loc, + }, + { range: true } + ); - // Create an empty scope manager. - // For HBS, all locals are assumed to be defined at runtime, - // so we don't track variable references (no no-undef errors). - const scopeManager = eslintScope.analyze( - { - type: 'Program', - body: [], - range: [0, code.length], - loc: program.loc, - }, - { range: true } - ); + return { + ast: program, + scopeManager, + visitorKeys, + services: {}, + }; +} - return { - ast: program, - scopeManager, - visitorKeys, - services: {}, - }; +export default { + meta: { + name: 'ember-eslint-parser/hbs', + version: '*', }, + parseForESLint, }; diff --git a/src/parser/transforms.js b/src/parser/transforms.js index d20f0d9..e45f663 100644 --- a/src/parser/transforms.js +++ b/src/parser/transforms.js @@ -1,8 +1,10 @@ -const ContentTag = require('content-tag'); -const glimmer = require('@glimmer/syntax'); -const { visitorKeys: glimmerVisitorKeys } = glimmer; -const DocumentLines = require('../utils/document'); -const { Reference, Scope, Variable, Definition } = require('eslint-scope'); +import ContentTag from 'content-tag'; +import * as glimmer from '@glimmer/syntax'; +import { buildGlimmerVisitorKeys, DocumentLines } from 'ember-estree'; +import { Reference, Scope, Variable, Definition } from 'eslint-scope'; +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); const htmlTagsSet = new Set(require('html-tags').default); const svgTagsSet = new Set(require('svg-tags')); const mathMLTagsSet = new Set(require('mathml-tag-names').mathmlTagNames); @@ -10,7 +12,6 @@ const mathMLTagsSet = new Set(require('mathml-tag-names').mathmlTagNames); let TypescriptScope = null; try { const parserPath = require.resolve('@typescript-eslint/parser'); - // eslint-disable-next-line n/no-unpublished-require const scopeManagerPath = require.resolve('@typescript-eslint/scope-manager', { paths: [parserPath], }); @@ -93,28 +94,6 @@ function registerNodeInScope(node, scope, variable) { scope.references.push(ref); } -/** - * Builds the complete Glimmer visitor keys map with "Glimmer" prefix and - * additional keys needed for traversal (blockParamNodes, parts, etc). - * Result is cached since glimmerVisitorKeys is a constant. - * @return {object} - */ -let _cachedGlimmerVisitorKeys = null; -function buildGlimmerVisitorKeys() { - if (_cachedGlimmerVisitorKeys) return _cachedGlimmerVisitorKeys; - const keys = {}; - for (const [k, v] of Object.entries(glimmerVisitorKeys)) { - keys[`Glimmer${k}`] = [...v]; - } - if (!keys.GlimmerElementNode.includes('blockParamNodes')) { - keys.GlimmerElementNode.push('blockParamNodes', 'parts'); - } - keys.GlimmerProgram = ['body', 'blockParamNodes']; - keys.GlimmerTemplate = ['body']; - _cachedGlimmerVisitorKeys = keys; - return keys; -} - /** * traverses all nodes using the {visitorKeys} calling the callback function, visitor * @param visitorKeys @@ -463,7 +442,7 @@ function processGlimmerTemplate({ templateContent, codeLines, templateRange, tok * @param code * @return {{templateVisitorKeys: {}, comments: *[], templateInfos: {templateRange: *, range: *, replacedRange: *}[]}} */ -module.exports.preprocessGlimmerTemplates = function preprocessGlimmerTemplates(info, code) { +export function preprocessGlimmerTemplates(info, code) { const templateInfos = info.templateInfos.map((r) => ({ utf16Range: [r.range.startUtf16Codepoint, r.range.endUtf16Codepoint], })); @@ -489,7 +468,7 @@ module.exports.preprocessGlimmerTemplates = function preprocessGlimmerTemplates( templateInfos, comments: allComments, }; -}; +} /** * traverses the AST and replaces the transformed template parts with the Glimmer @@ -502,7 +481,7 @@ module.exports.preprocessGlimmerTemplates = function preprocessGlimmerTemplates( * @param preprocessedResult * @param visitorKeys */ -module.exports.convertAst = function convertAst(result, preprocessedResult, visitorKeys) { +export function convertAst(result, preprocessedResult, visitorKeys) { const templateInfos = preprocessedResult.templateInfos; let counter = 0; result.ast.comments.push(...preprocessedResult.comments); @@ -635,12 +614,11 @@ module.exports.convertAst = function convertAst(result, preprocessedResult, visi if (counter !== templateInfos.length) { throw new Error('failed to process all templates'); } -}; +} -const replaceRange = function replaceRange(s, start, end, substitute) { +export const replaceRange = function replaceRange(s, start, end, substitute) { return s.slice(0, start) + substitute + s.slice(end); }; -module.exports.replaceRange = replaceRange; const processor = new ContentTag.Preprocessor(); @@ -676,7 +654,7 @@ function createError(code, message, fileName, start, end = start) { return new EmberParserError(message, fileName, { end, start }); } -module.exports.transformForLint = function transformForLint(code, fileName) { +export function transformForLint(code, fileName) { let jsCode = code; /** * @@ -772,9 +750,6 @@ module.exports.transformForLint = function transformForLint(code, fileName) { templateInfos: result, output: jsCode, }; -}; +} -module.exports.traverse = traverse; -module.exports.tokenize = tokenize; -module.exports.processGlimmerTemplate = processGlimmerTemplate; -module.exports.buildGlimmerVisitorKeys = buildGlimmerVisitorKeys; +export { traverse, tokenize, processGlimmerTemplate, buildGlimmerVisitorKeys }; diff --git a/src/parser/ts-patch.js b/src/parser/ts-patch.js index 4076ff3..6426d90 100644 --- a/src/parser/ts-patch.js +++ b/src/parser/ts-patch.js @@ -1,15 +1,16 @@ -const fs = require('node:fs'); -const { transformForLint } = require('./transforms'); -const { replaceRange } = require('./transforms'); +import fs from 'node:fs'; +import { createRequire } from 'node:module'; +import { transformForLint, replaceRange } from './transforms.js'; + +const require = createRequire(import.meta.url); let patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser, isPatched, allowGjs; try { const parserPath = require.resolve('@typescript-eslint/parser'); - // eslint-disable-next-line n/no-unpublished-require const tsPath = require.resolve('typescript', { paths: [parserPath] }); const ts = require(tsPath); - typescriptParser = require('@typescript-eslint/parser'); + typescriptParser = await import('@typescript-eslint/parser'); patchTs = function patchTs(options = {}) { if (isPatched) return { allowGjs }; isPatched = true; @@ -162,9 +163,4 @@ try { syncMtsGtsSourceFiles = () => null; } -module.exports = { - patchTs, - replaceExtensions, - syncMtsGtsSourceFiles, - typescriptParser, -}; +export { patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser }; diff --git a/src/preprocessor/noop.js b/src/preprocessor/noop.js index b173262..4ef69fd 100644 --- a/src/preprocessor/noop.js +++ b/src/preprocessor/noop.js @@ -9,24 +9,27 @@ const parsedFiles = new Set(); -module.exports = { - registerParsedFile(f) { - parsedFiles.add(f); - }, - preprocess: undefined, - postprocess: (messages, fileName) => { - const msgs = messages.flat(); - if (!parsedFiles.has(fileName)) { - msgs[0] = msgs[0] || { - message: '', - }; - msgs[0].message += '\n'; - msgs[0].message += - 'To lint Gjs/Gts files please follow the setup guide at https://github.com/ember-cli/eslint-plugin-ember#gtsgjs' + - '\nNote that this error can also happen if you have multiple versions of eslint-plugin-ember in your node_modules'; - } - parsedFiles.delete(fileName); // required for tests - return msgs; - }, - supportsAutofix: true, -}; +export function registerParsedFile(f) { + parsedFiles.add(f); +} + +export const preprocess = undefined; + +export function postprocess(messages, fileName) { + const msgs = messages.flat(); + if (!parsedFiles.has(fileName)) { + msgs[0] = msgs[0] || { + message: '', + }; + msgs[0].message += '\n'; + msgs[0].message += + 'To lint Gjs/Gts files please follow the setup guide at https://github.com/ember-cli/eslint-plugin-ember#gtsgjs' + + '\nNote that this error can also happen if you have multiple versions of eslint-plugin-ember in your node_modules'; + } + parsedFiles.delete(fileName); // required for tests + return msgs; +} + +export const supportsAutofix = true; + +export default { registerParsedFile, preprocess, postprocess, supportsAutofix }; diff --git a/src/utils/document.js b/src/utils/document.js index fb97990..8d4f5ef 100644 --- a/src/utils/document.js +++ b/src/utils/document.js @@ -1,102 +1,3 @@ -/** - * @typedef {{ line: number; column: number }} Position - */ - -// Helper class to convert line/column from and to offset -// taken and adapt from https://github.com/typed-ember/glint/blob/main/packages/core/src/language-server/util/position.ts -class DocumentLines { - /** - * @param {string} contents - */ - constructor(contents) { - this.lineStarts = computeLineStarts(contents); - } - - /** - * @param {Position} position - * @return {number} - */ - positionToOffset(position) { - const { line, column } = position; - return this.lineStarts[line - 1] + column; - } - - /** - * - * @param {number} position - * @return {Position} - */ - offsetToPosition(position) { - const lineStarts = this.lineStarts; - let lo = 0; - let hi = lineStarts.length - 1; - // Upper-biased midpoint is required here: we want the *rightmost* line whose - // start is ≤ position. With a lower-biased mid, when lo + 1 === hi and the - // condition is true, mid === lo and lo never advances, causing an infinite loop. - while (lo < hi) { - const mid = (lo + hi + 1) >> 1; - if (lineStarts[mid] <= position) { - lo = mid; - } else { - hi = mid - 1; - } - } - return { line: lo + 1, column: position - lineStarts[lo] }; - } -} - -/** - * @returns {number[]} - * @param {string} text - */ -function computeLineStarts(text) { - const result = []; - let pos = 0; - let lineStart = 0; - while (pos < text.length) { - const ch = text.charCodeAt(pos++); - if (ch === 13 /* carriageReturn */) { - if (text.charCodeAt(pos) === 10 /* lineFeed */) { - pos++; - } - result.push(lineStart); - lineStart = pos; - } else if ( - ch === 10 /* lineFeed */ || - ch === 8232 /* lineSeparator */ || - ch === 8233 /* paragraphSeparator */ - ) { - result.push(lineStart); - lineStart = pos; - } - } - result.push(lineStart); - return result; -} - -/* istanbul ignore next */ -/** - * @param {number} ch - * @return {boolean} - */ -function isLineBreak(ch) { - // ES5 7.3: - // The ECMAScript line terminator characters are listed in Table 3. - // Table 3: Line Terminator Characters - // Code Unit Value Name Formal Name - // \u000A Line Feed - // \u000D Carriage Return - // \u2028 Line separator - // \u2029 Paragraph separator - // Only the characters in Table 3 are treated as line terminators. Other new line or line - // breaking characters are treated as white space but not as line terminators. - return ( - ch === 10 /* lineFeed */ || - ch === 13 /* carriageReturn */ || - ch === 8232 /* lineSeparator */ || - ch === 8233 /* paragraphSeparator */ - ); -} - -module.exports = DocumentLines; -module.exports.isLineBreak = isLineBreak; +// Re-export DocumentLines from ember-estree. +// The class converts between line/column positions and character offsets. +export { DocumentLines, DocumentLines as default } from 'ember-estree'; From 2a95d89a5d5aa4fd2d5e219928f70aad1a2c17a5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:57:06 +0000 Subject: [PATCH 03/11] Address code review: remove top-level await, use direct imports for always-available deps Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- src/parser/gjs-gts-parser.js | 16 ++-------------- src/parser/ts-patch.js | 2 +- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/parser/gjs-gts-parser.js b/src/parser/gjs-gts-parser.js index f39780c..932c91c 100644 --- a/src/parser/gjs-gts-parser.js +++ b/src/parser/gjs-gts-parser.js @@ -9,20 +9,8 @@ import { import { transformForLint, preprocessGlimmerTemplates, convertAst } from './transforms.js'; const require = createRequire(import.meta.url); - -let tsconfigUtils; -try { - tsconfigUtils = require('@typescript-eslint/tsconfig-utils'); -} catch { - // not available -} - -let babelParser; -try { - babelParser = require('@babel/eslint-parser/experimental-worker'); -} catch { - // not available -} +const tsconfigUtils = require('@typescript-eslint/tsconfig-utils'); +const babelParser = require('@babel/eslint-parser/experimental-worker'); /** * implements https://eslint.org/docs/latest/extend/custom-parsers diff --git a/src/parser/ts-patch.js b/src/parser/ts-patch.js index 6426d90..d0617a8 100644 --- a/src/parser/ts-patch.js +++ b/src/parser/ts-patch.js @@ -10,7 +10,7 @@ try { const parserPath = require.resolve('@typescript-eslint/parser'); const tsPath = require.resolve('typescript', { paths: [parserPath] }); const ts = require(tsPath); - typescriptParser = await import('@typescript-eslint/parser'); + typescriptParser = require('@typescript-eslint/parser'); patchTs = function patchTs(options = {}) { if (isPatched) return { allowGjs }; isPatched = true; From f5f8b680aca99faeb32a53723299bddddbcc2559 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 13:43:03 +0000 Subject: [PATCH 04/11] Upgrade ember-estree from ^0.1.1 to ^0.2.0 Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 467 +------------------------------------------------ 2 files changed, 7 insertions(+), 462 deletions(-) diff --git a/package.json b/package.json index f278dd4..7367db4 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@glimmer/syntax": ">= 0.92.0", "@typescript-eslint/tsconfig-utils": "^8.38.0", "content-tag": "^4.1.0", - "ember-estree": "^0.1.1", + "ember-estree": "^0.2.0", "eslint-scope": "^9.1.1", "html-tags": "^5.1.0", "mathml-tag-names": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98240ba..b256abb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 ember-estree: - specifier: ^0.1.1 - version: 0.1.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + specifier: ^0.2.0 + version: 0.2.0 eslint-scope: specifier: ^9.1.1 version: 9.1.1 @@ -386,10 +386,6 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.3': resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} @@ -417,18 +413,10 @@ packages: resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.9': resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} @@ -443,12 +431,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-class-features-plugin@7.28.6': - resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.26.3': resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} engines: {node: '>=6.9.0'} @@ -468,10 +450,6 @@ packages: resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} @@ -480,30 +458,16 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.25.9': resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} @@ -512,10 +476,6 @@ packages: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} @@ -528,20 +488,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -584,11 +534,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -658,12 +603,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.28.6': - resolution: {integrity: sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} @@ -676,12 +615,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -694,12 +627,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -802,12 +729,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.27.1': - resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.25.9': resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} @@ -856,12 +777,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} @@ -1006,12 +921,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.6': - resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.5.5': resolution: {integrity: sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==} peerDependencies: @@ -1051,29 +960,11 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.27.1': - resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/register@7.28.6': - resolution: {integrity: sha512-pgcbbEl/dWQYb6L6Yew6F94rdwygfuv+vJ/tXfwIOYAfPB6TNWpXUMEtEq3YuTeHRdvMIhvz13bkT9CNaS+wqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/runtime@7.12.18': resolution: {integrity: sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==} @@ -1089,10 +980,6 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} @@ -1101,10 +988,6 @@ packages: resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} @@ -1113,10 +996,6 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - '@ember-data/rfc395-data@0.0.4': resolution: {integrity: sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==} @@ -2324,10 +2203,6 @@ packages: resolution: {integrity: sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==} engines: {node: '>=4'} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - async-disk-cache@1.3.5: resolution: {integrity: sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ==} @@ -2681,10 +2556,6 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -2731,13 +2602,6 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - content-tag-utils@0.5.1: - resolution: {integrity: sha512-N7fPTATy5P5CN2lmtbtfhfTP9CQ2lEHZnc5gL0w4m9sl8STwiVUeJzzFZ3ZApeEveEPwvZKEy8twz4UMNdIOwA==} - engines: {node: '>= 18'} - - content-tag@3.1.3: - resolution: {integrity: sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g==} - content-tag@4.1.0: resolution: {integrity: sha512-On6gUuvI1l5MScHO+Xbwjeq1Pk9H6HOipDWkzqGGUGmKpq6K5TRmQuCl1LGSHbdIo2l+lSsgLKrLgCl5kKYA+A==} @@ -2960,8 +2824,8 @@ packages: resolution: {integrity: sha512-BtkjulweiXo9c3yVWrtexw2dTmBrvavD/xixNC6TKOBdrixUwU+6nuOO9dufDWsMxoid7MvtmDpzc9+mE8PdaA==} engines: {node: 10.* || >= 12.*} - ember-estree@0.1.1: - resolution: {integrity: sha512-tVmeFl3/4jMNsiVsL/97dEjsd8l3T3NSLZTXZmOZoe/gIfpqUzveNmFUuswZ5QYda6Wr3t4d0BCCCo/ozf4JNQ==} + ember-estree@0.2.0: + resolution: {integrity: sha512-nwdPZDtySOQL0eItl9bE/0Y9cOcOzvzMnZA8jxuRnp8ox8cIlsMr3gCsIVBG+Px/18BFjAAsZS1/9cIjGTueNw==} ember-rfc176-data@0.3.18: resolution: {integrity: sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==} @@ -3358,10 +3222,6 @@ packages: find-babel-config@2.1.2: resolution: {integrity: sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==} - find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -3400,10 +3260,6 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - flow-parser@0.305.0: - resolution: {integrity: sha512-4Ws+q7nNQZRIpVGGlNTqkQCs3E3aXLnWWWvxo4WGRZTCXzZAq3ucZeckZ8h+c4hM3z+vtpJkzFyGGEMUqun1Zw==} - engines: {node: '>=0.4.0'} - for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -3912,10 +3768,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -4027,10 +3879,6 @@ packages: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - istextorbinary@2.1.0: resolution: {integrity: sha512-kT1g2zxZ5Tdabtpp9VSdOzW9lb6LXImyWbzbQeTxoRtHhurC9Ej9Wckngr2+uepPL09ky/mJHmN9jeJPML5t6A==} engines: {node: '>=0.12'} @@ -4068,16 +3916,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jscodeshift@17.3.0: - resolution: {integrity: sha512-LjFrGOIORqXBU+jwfC9nbkjmQfFldtMIoS6d9z2LG/lkmyNXsJAySPT+2SWXJEoE68/bCWcxKpXH37npftgmow==} - engines: {node: '>=16'} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - peerDependenciesMeta: - '@babel/preset-env': - optional: true - jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -4132,10 +3970,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - ky@1.7.2: resolution: {integrity: sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==} engines: {node: '>=18'} @@ -4223,10 +4057,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -4655,14 +4485,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - - pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -4820,10 +4642,6 @@ packages: resolution: {integrity: sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ==} engines: {node: '>= 4'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -5080,10 +4898,6 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5359,9 +5173,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -5748,10 +5559,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5814,12 +5621,6 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/compat-data@7.26.3': {} '@babel/compat-data@7.28.5': {} @@ -5876,22 +5677,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': dependencies: '@babel/types': 7.26.3 - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.28.5 - '@babel/helper-compilation-targets@7.25.9': dependencies: '@babel/compat-data': 7.26.3 @@ -5921,19 +5710,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5961,13 +5737,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.26.4 @@ -5982,13 +5751,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5998,29 +5760,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.26.3 - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.28.5 - '@babel/helper-plugin-utils@7.25.9': {} '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6039,15 +5786,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: '@babel/traverse': 7.26.4 @@ -6055,13 +5793,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.25.9': {} '@babel/helper-string-parser@7.27.1': {} @@ -6095,10 +5826,6 @@ snapshots: dependencies: '@babel/types': 7.28.5 - '@babel/parser@7.29.0': - dependencies: - '@babel/types': 7.29.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6178,11 +5905,6 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6193,11 +5915,6 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6208,11 +5925,6 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6323,12 +6035,6 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.26.0) - '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6382,14 +6088,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6552,17 +6250,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-typescript@7.5.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6675,13 +6362,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.27.1(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.26.0) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6689,26 +6369,6 @@ snapshots: '@babel/types': 7.26.3 esutils: 2.0.3 - '@babel/preset-typescript@7.28.5(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/register@7.28.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.7 - source-map-support: 0.5.21 - '@babel/runtime@7.12.18': dependencies: regenerator-runtime: 0.13.11 @@ -6729,12 +6389,6 @@ snapshots: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 @@ -6759,18 +6413,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -6781,11 +6423,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@ember-data/rfc395-data@0.0.4': {} '@ember/edition-utils@1.2.0': {} @@ -8243,10 +7880,6 @@ snapshots: ast-types@0.13.3: {} - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - async-disk-cache@1.3.5: dependencies: debug: 2.6.9 @@ -8770,12 +8403,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - clone@1.0.4: {} clone@2.1.2: {} @@ -8817,16 +8444,6 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - content-tag-utils@0.5.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)): - dependencies: - content-tag: 3.1.3 - jscodeshift: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)) - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - - content-tag@3.1.3: {} - content-tag@4.1.0: {} convert-source-map@2.0.0: {} @@ -9170,15 +8787,14 @@ snapshots: - '@babel/core' - supports-color - ember-estree@0.1.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)): + ember-estree@0.2.0: dependencies: '@glimmer/syntax': 0.95.0 - content-tag-utils: 0.5.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + content-tag: 4.1.0 ember-template-recast: 6.1.5 oxc-parser: 0.119.0 zimmerframe: 1.1.4 transitivePeerDependencies: - - '@babel/preset-env' - supports-color ember-rfc176-data@0.3.18: {} @@ -10058,12 +9674,6 @@ snapshots: dependencies: json5: 2.2.3 - find-cache-dir@2.1.0: - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -10114,8 +9724,6 @@ snapshots: flatted@3.3.1: {} - flow-parser@0.305.0: {} - for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -10694,10 +10302,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -10798,8 +10402,6 @@ snapshots: dependencies: isarray: 1.0.0 - isobject@3.0.1: {} - istextorbinary@2.1.0: dependencies: binaryextensions: 2.3.0 @@ -10841,31 +10443,6 @@ snapshots: dependencies: argparse: 2.0.1 - jscodeshift@17.3.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)): - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.28.5 - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) - '@babel/preset-flow': 7.27.1(@babel/core@7.26.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.26.0) - '@babel/register': 7.28.6(@babel/core@7.26.0) - flow-parser: 0.305.0 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - neo-async: 2.6.2 - picocolors: 1.1.1 - recast: 0.23.11 - tmp: 0.2.5 - write-file-atomic: 5.0.1 - optionalDependencies: - '@babel/preset-env': 7.26.0(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - jsesc@3.0.2: {} jsesc@3.1.0: {} @@ -10912,8 +10489,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@6.0.3: {} - ky@1.7.2: {} latest-version@9.0.0: @@ -11004,11 +10579,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 - make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -11457,12 +11027,6 @@ snapshots: pify@4.0.1: {} - pirates@4.0.7: {} - - pkg-dir@3.0.0: - dependencies: - find-up: 3.0.0 - pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -11614,14 +11178,6 @@ snapshots: private: 0.1.8 source-map: 0.6.1 - recast@0.23.11: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -11954,10 +11510,6 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -12267,8 +11819,6 @@ snapshots: dependencies: any-promise: 1.3.0 - tiny-invariant@1.3.3: {} - tinybench@2.9.0: {} tinypool@0.8.4: {} @@ -12765,11 +12315,6 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@5.0.1: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - y18n@5.0.8: {} yallist@3.1.1: {} From 1530bce444e92eab0ba3f78936b07326ad507a8b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 13:57:11 +0000 Subject: [PATCH 05/11] Fix CI: fix prettier lint, update bench to mitata (matching main) Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- package.json | 3 +- pnpm-lock.yaml | 8 ++ scripts/bench-compare.mjs | 233 +++++++++++-------------------- scripts/format-bench-comment.mjs | 178 ++++++++++++----------- src/parser/gjs-gts-parser.js | 7 +- tests/parser.bench.js | 129 ----------------- tests/parser.bench.mjs | 141 +++++++++++++++++++ 7 files changed, 324 insertions(+), 375 deletions(-) delete mode 100644 tests/parser.bench.js create mode 100644 tests/parser.bench.mjs diff --git a/package.json b/package.json index 7367db4..dcdb3cd 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "lint:js": "eslint . --max-warnings=0", "lint:js:fix": "eslint . --fix --max-warnings=0", "lint:package": "pnpm publint", - "bench": "vitest bench", + "bench": "node --expose-gc tests/parser.bench.mjs", "bench:compare": "node scripts/bench-compare.mjs", "test": "vitest run" }, @@ -55,6 +55,7 @@ "eslint-plugin-promise": "^6.0.0", "execa": "^8.0.1", "fs-extra": "^11.2.0", + "mitata": "1.0.34", "prettier": "^3.2.5", "publint": "^0.2.6", "release-plan": "^0.17.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b256abb..b7ad736 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,6 +81,9 @@ importers: fs-extra: specifier: ^11.2.0 version: 11.2.0 + mitata: + specifier: 1.0.34 + version: 1.0.34 prettier: specifier: ^3.2.5 version: 3.4.2 @@ -4179,6 +4182,9 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + mitata@1.0.34: + resolution: {integrity: sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -10713,6 +10719,8 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + mitata@1.0.34: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 diff --git a/scripts/bench-compare.mjs b/scripts/bench-compare.mjs index ffd2e54..2d8339f 100644 --- a/scripts/bench-compare.mjs +++ b/scripts/bench-compare.mjs @@ -1,9 +1,12 @@ /* eslint-disable n/no-process-exit */ /** - * Benchmark comparison script. + * Benchmark comparison script using mitata. * - * Runs `pnpm bench` on the current branch and on `main`, then prints a - * side-by-side table showing the hz delta for every benchmark. + * Copies the base branch's source to a temp directory, installs its + * dependencies, then runs the mitata bench script with --control-dir so that + * both control (base) and experiment (current) parsers are benchmarked in the + * same process — giving mitata a fair, head-to-head comparison with built-in + * summary tables and boxplots. * * Usage: * node scripts/bench-compare.mjs [--base ] @@ -13,10 +16,9 @@ */ import { execSync, spawnSync } from 'node:child_process'; -import { readFileSync, writeFileSync, unlinkSync, existsSync } from 'node:fs'; +import { existsSync, mkdirSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -import { styleText } from 'node:util'; // --------------------------------------------------------------------------- // CLI args @@ -34,83 +36,41 @@ function run(cmd, opts = {}) { return execSync(cmd, { stdio: 'inherit', ...opts }); } -function currentBranch() { - return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8' }).trim(); -} - -function hasUncommittedChanges() { - const result = execSync('git status --porcelain', { encoding: 'utf8' }); - return result.trim().length > 0; -} - -function runBench(outputFile) { - const result = spawnSync('pnpm', ['vitest', 'bench', '--outputJson', outputFile, '--run'], { - stdio: 'inherit', - }); - if (result.status !== 0) { - console.error('\n❌ Benchmark run failed.'); - process.exit(1); - } -} - -function loadResults(file) { - const raw = JSON.parse(readFileSync(file, 'utf8')); - // Build a map of "Suite > name" → benchmark entry. - // fullName is e.g. "tests/parser.bench.js > gts parser"; strip the file prefix. - const map = new Map(); - for (const suite of raw.files ?? []) { - for (const group of suite.groups ?? []) { - const suiteName = (group.fullName ?? '').replace(/^.*?>\s*/, ''); - for (const bench of group.benchmarks ?? []) { - const key = `${suiteName} > ${bench.name}`; - map.set(key, bench); - } - } +/** + * Resolve a branch name to a commit SHA. Tries `origin/` first (for CI + * where only the PR branch is checked out locally), then falls back to ``. + */ +function resolveRef(branch) { + for (const candidate of [`origin/${branch}`, branch]) { + const result = spawnSync('git', ['rev-parse', '--verify', candidate], { + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'pipe'], + }); + if (result.status === 0) return result.stdout.trim(); } - return map; -} - -function fmt(n) { - return n.toLocaleString('en-US', { maximumFractionDigits: 2 }); -} - -function delta(current, base) { - const pct = ((current - base) / base) * 100; - const sign = pct >= 0 ? '+' : ''; - return `${sign}${pct.toFixed(1)}%`; -} - -function colorize(pct) { - const num = Number.parseFloat(pct); - if (num >= 5) return styleText('green', pct); - if (num <= -5) return styleText('red', pct); - return styleText('yellow', pct); + throw new Error(`Could not resolve ref for branch "${branch}". Is it fetched?`); } // --------------------------------------------------------------------------- // Main // --------------------------------------------------------------------------- -const CURRENT_BRANCH = currentBranch(); - -if (CURRENT_BRANCH === BASE_BRANCH) { - console.error(`❌ Already on '${BASE_BRANCH}'. Check out your feature branch first.`); - process.exit(1); -} +const ROOT = process.cwd(); +const CONTROL_DIR = join(tmpdir(), `bench-control-${BASE_BRANCH}-${Date.now()}`); -const stashed = hasUncommittedChanges(); -if (stashed) { - console.log('📦 Stashing uncommitted changes…'); - run('git stash --include-untracked'); -} +console.error(`\n🔧 Setting up control (${BASE_BRANCH}) in ${CONTROL_DIR}\n`); -const tmpCurrent = join(tmpdir(), 'bench-current.json'); -const tmpBase = join(tmpdir(), `bench-${BASE_BRANCH}.json`); +const BASE_REF = resolveRef(BASE_BRANCH); +console.error(` Resolved ${BASE_BRANCH} → ${BASE_REF.slice(0, 10)}\n`); -// Clean up temp files on exit +// Clean up temp dir on exit function cleanup() { - for (const f of [tmpCurrent, tmpBase]) { - if (existsSync(f)) unlinkSync(f); + if (existsSync(CONTROL_DIR)) { + try { + rmSync(CONTROL_DIR, { recursive: true, force: true }); + } catch { + // best-effort cleanup + } } } process.on('exit', cleanup); @@ -118,96 +78,59 @@ process.on('SIGINT', () => process.exit(130)); process.on('SIGTERM', () => process.exit(143)); try { - // ── 1. Benchmark current branch ────────────────────────────────────────── - console.log(`\n🔧 Benchmarking current branch: \x1b[36m${CURRENT_BRANCH}\x1b[0m\n`); - runBench(tmpCurrent); - - // ── 2. Switch to base branch ────────────────────────────────────────────── - console.log(`\n🔀 Switching to base branch: \x1b[36m${BASE_BRANCH}\x1b[0m\n`); - run(`git checkout ${BASE_BRANCH}`); - run('pnpm install --frozen-lockfile'); - - // ── 3. Benchmark base branch ────────────────────────────────────────────── - console.log(`\n🔧 Benchmarking base branch: \x1b[36m${BASE_BRANCH}\x1b[0m\n`); - runBench(tmpBase); -} finally { - // ── 4. Restore original branch ──────────────────────────────────────────── - console.log(`\n🔀 Restoring branch: \x1b[36m${CURRENT_BRANCH}\x1b[0m\n`); - run(`git checkout ${CURRENT_BRANCH}`); - run('pnpm install --frozen-lockfile'); - - if (stashed) { - console.log('📦 Restoring stash…'); - run('git stash pop'); - } -} - -// ── 5. Compare ─────────────────────────────────────────────────────────────── - -const currentResults = loadResults(tmpCurrent); -const baseResults = loadResults(tmpBase); - -const allKeys = new Set([...currentResults.keys(), ...baseResults.keys()]); - -const COL = { name: 44, base: 18, current: 18, delta: 12 }; -const line = (name, base, cur, diff) => - name.padEnd(COL.name) + - base.padStart(COL.base) + - cur.padStart(COL.current) + - diff.padStart(COL.delta); - -const ruler = '─'.repeat(COL.name + COL.base + COL.current + COL.delta); + // ── 1. Export base branch source to temp dir ───────────────────────────── + mkdirSync(CONTROL_DIR, { recursive: true }); -console.log(`\n${'─'.repeat(ruler.length)}`); -console.log( - ` Benchmark comparison: ${styleText('cyan', CURRENT_BRANCH)} vs ${styleText('cyan', BASE_BRANCH)}` -); -console.log(`${'─'.repeat(ruler.length)}`); -console.log( - styleText('bold', line('Benchmark', `${BASE_BRANCH} (hz)`, `${CURRENT_BRANCH} (hz)`, 'Δ')) -); -console.log(ruler); + // Copy package manifests and source (use resolved SHA for reliability) + run( + `git archive ${BASE_REF} -- package.json pnpm-lock.yaml pnpm-workspace.yaml src/ | tar -x -C "${CONTROL_DIR}"` + ); -const benchResults = []; + // ── 2. Install dependencies in control dir ─────────────────────────────── + console.error(`\n📦 Installing dependencies for control (${BASE_BRANCH})…\n`); + run('pnpm install --frozen-lockfile', { + cwd: CONTROL_DIR, + stdio: ['inherit', 'pipe', 'inherit'], + }); -let lastSuite = ''; -for (const key of [...allKeys].sort()) { - const [suite] = key.split(' > '); - if (suite !== lastSuite) { - if (lastSuite) console.log(''); - lastSuite = suite; + // ── 3. Run mitata bench with --control-dir ─────────────────────────────── + console.error(`\n🏎️ Running benchmarks (experiment vs control)…\n`); + + const benchScript = join(ROOT, 'tests/parser.bench.mjs'); + const benchArgs = [ + '--expose-gc', + '--max-old-space-size=4096', + benchScript, + '--control-dir', + CONTROL_DIR, + ]; + + // CPU pinning on Linux to reduce cross-core migration variance + const IS_LINUX = process.platform === 'linux'; + const HAS_TASKSET = IS_LINUX && spawnSync('which', ['taskset'], { stdio: 'pipe' }).status === 0; + + let cmd = 'node'; + let fullArgs = benchArgs; + + if (HAS_TASKSET) { + cmd = 'taskset'; + fullArgs = ['-c', '0', 'node', ...benchArgs]; + console.error('📌 CPU pinning enabled (taskset -c 0)\n'); } - const b = baseResults.get(key); - const c = currentResults.get(key); + const result = spawnSync(cmd, fullArgs, { + stdio: 'inherit', + cwd: ROOT, + env: { ...process.env }, + }); - if (!b || !c) { - const note = !b ? '(missing in base)' : '(missing in current)'; - console.log(line(` ${key}`, '-', '-', note)); - benchResults.push({ key, baseHz: null, currentHz: null, delta: null, note }); - continue; + if (result.status !== 0) { + console.error('\n❌ Benchmark run failed.'); + process.exit(1); } - const pct = delta(c.hz, b.hz); - console.log(line(` ${key}`, fmt(b.hz), fmt(c.hz), colorize(pct))); - benchResults.push({ key, baseHz: b.hz, currentHz: c.hz, delta: pct, note: null }); -} - -console.log(ruler); -console.log( - '\n ' + - styleText('green', '■') + - ' ≥ +5% faster ' + - styleText('red', '■') + - ' ≤ −5% slower ' + - styleText('yellow', '■') + - ' within ±5% similar\n' -); - -const jsonOutputPath = process.env.BENCH_JSON_OUTPUT; -if (jsonOutputPath) { - writeFileSync( - jsonOutputPath, - JSON.stringify({ branch: CURRENT_BRANCH, base: BASE_BRANCH, results: benchResults }, null, 2) - ); + console.error('\n✅ Benchmark comparison complete.\n'); +} catch (e) { + console.error('❌ Error:', e.message); + process.exit(1); } diff --git a/scripts/format-bench-comment.mjs b/scripts/format-bench-comment.mjs index d811753..cf5f490 100644 --- a/scripts/format-bench-comment.mjs +++ b/scripts/format-bench-comment.mjs @@ -1,12 +1,14 @@ /** * Format benchmark comparison results into a GitHub PR comment. * - * Reads bench output and JSON results from the paths specified by environment - * variables and writes the formatted comment body to stdout. + * Reads the plain-text mitata output and (optionally) the JSON results from + * the bench run, then produces a GitHub-flavored markdown comment with: + * 1. A summary table (when comparison data is available) + * 2. Full mitata output in a collapsible
section * * Environment variables: - * BENCH_OUTPUT_FILE - Path to the plain-text bench output (optional) - * BENCH_JSON_OUTPUT - Path to the JSON results file written by bench-compare.mjs + * BENCH_OUTPUT_FILE - Path to the plain-text bench output + * BENCH_JSON_OUTPUT - Path to the JSON bench results (optional) * BENCH_JOB_SUCCESS - Set to "true" if the benchmark job succeeded */ @@ -14,6 +16,10 @@ import { readFileSync } from 'node:fs'; const marker = ''; +// --------------------------------------------------------------------------- +// Read raw mitata output +// --------------------------------------------------------------------------- + let rawOutput; try { rawOutput = readFileSync(process.env.BENCH_OUTPUT_FILE, 'utf8').trim(); @@ -22,103 +28,107 @@ try { rawOutput = '(no output — benchmark may have failed to start)'; } -let benchData = null; -try { - benchData = JSON.parse(readFileSync(process.env.BENCH_JSON_OUTPUT, 'utf8')); -} catch { - console.warn('Warning: could not read BENCH_JSON_OUTPUT; falling back to raw output.'); +// Strip any lines before the mitata header (safety net for leaked setup messages) +const benchStart = rawOutput.search(/^(clk:|benchmark\b)/m); +if (benchStart > 0) { + rawOutput = rawOutput.slice(benchStart); } -const success = process.env.BENCH_JOB_SUCCESS === 'true'; -const heading = success ? '## 🏎️ Benchmark Comparison' : '## ❌ Benchmark Comparison (failed)'; +// --------------------------------------------------------------------------- +// Read JSON results (if available) and build summary +// --------------------------------------------------------------------------- -let body; -if (benchData) { - const { branch, base, results } = benchData; +let summarySection = ''; +const jsonPath = process.env.BENCH_JSON_OUTPUT; - function fmtHz(n) { - return n.toLocaleString('en-US', { maximumFractionDigits: 2 }); +if (jsonPath) { + try { + const json = JSON.parse(readFileSync(jsonPath, 'utf8')); + summarySection = buildSummary(json); + } catch { + // JSON not available or malformed — skip summary } +} - function fmtDelta(r) { - if (r.note) return r.note; - const num = parseFloat(r.delta); - const emoji = num >= 5 ? '🟢 ' : num <= -5 ? '🔴 ' : '🟡 '; - return emoji + r.delta; - } +function formatTime(ns) { + if (ns >= 1e6) return `${(ns / 1e6).toFixed(2)} ms`; + if (ns >= 1e3) return `${(ns / 1e3).toFixed(2)} µs`; + return `${ns.toFixed(2)} ns`; +} - function deltaSymbol(r) { - if (r.note) return '❓'; - const num = parseFloat(r.delta); - return num >= 5 ? '🟢' : num <= -5 ? '🔴' : '🟡'; - } +function deltaEmoji(pct) { + const abs = Math.abs(pct); + // negative pct means experiment is faster (lower time = better) + if (abs < 1) return '⚪'; + if (pct <= -5) return '🟢'; + if (pct >= 5) return '🔴'; + return '🟡'; +} - function parseKey(key) { - // key format: " parser > file" - const separatorIndex = key.indexOf(' > '); - if (separatorIndex === -1) { - return { fileType: key, fileSize: '' }; +function buildSummary(json) { + const benchmarks = json.benchmarks || []; + + // In comparison mode, benchmarks come in pairs inside summary groups. + // Each benchmark alias is like "gts small (control)" / "gts small (experiment)". + // Group them by stripping the suffix. + const pairs = new Map(); + + for (const trial of benchmarks) { + for (const r of trial.runs || []) { + if (!r.stats) continue; + const m = r.name.match(/^(.+)\s+\((control|experiment)\)$/); + if (!m) continue; + const [, key, role] = m; + if (!pairs.has(key)) pairs.set(key, {}); + pairs.get(key)[role] = r.stats; } - const fileType = key - .slice(0, separatorIndex) - .replace(/ parser$/, '') - .trim(); - const fileSize = key - .slice(separatorIndex + 3) - .replace(/ file$/, '') - .trim(); - return { fileType, fileSize }; } - // Group results by file type for separate tables - const byFileType = new Map(); - for (const r of results) { - const { fileType, fileSize } = parseKey(r.key); - if (!byFileType.has(fileType)) byFileType.set(fileType, []); - byFileType.get(fileType).push({ r, fileSize }); + if (pairs.size === 0) return ''; + + const rows = []; + for (const [name, { control, experiment }] of pairs) { + if (!control || !experiment) continue; + const delta = ((experiment.avg - control.avg) / control.avg) * 100; + const emoji = deltaEmoji(delta); + const sign = delta > 0 ? '+' : ''; + rows.push( + `| ${emoji} | ${name} | ${formatTime(control.avg)} | ${formatTime(experiment.avg)} | ${sign}${delta.toFixed(1)}% |` + ); } - // One 2-column table per file type (shown in main comment): file size | Δ - const summaryTables = [...byFileType.entries()].flatMap(([fileType, entries]) => [ - `**${fileType}**`, - '', - `| File Size | Δ |`, - `|-----------|---|`, - ...entries.map(({ r, fileSize }) => `| ${fileSize} | ${deltaSymbol(r)} |`), - '', - ]); - - // Full table (hidden in
) - const fullHeader = `| Benchmark | ${base} (hz) | ${branch} (hz) | Δ |`; - const fullSep = `|-----------|-------------|----------------|---|`; - const fullRows = results - .map((r) => { - const b = r.baseHz !== null ? fmtHz(r.baseHz) : '-'; - const c = r.currentHz !== null ? fmtHz(r.currentHz) : '-'; - return `| ${r.key} | ${b} | ${c} | ${fmtDelta(r)} |`; - }) - .join('\n'); - - const legend = '🟢 ≥ +5% faster   🔴 ≤ −5% slower   🟡 within ±5% similar'; - - body = [ - marker, - heading, - '', - ...summaryTables, - legend, + if (rows.length === 0) return ''; + + return [ '', - '
', - `Full results (${base} vs ${branch})`, + '| | Benchmark | Control (avg) | Experiment (avg) | Δ |', + '|---|---|---:|---:|---:|', + ...rows, '', - fullHeader, - fullSep, - fullRows, + '> 🟢 faster · 🔴 slower · 🟡 within 5% · ⚪ within 1%', '', - '
', ].join('\n'); -} else { - body = `${marker}\n${heading}\n\n\`\`\`\n${rawOutput}\n\`\`\``; } +// --------------------------------------------------------------------------- +// Assemble comment +// --------------------------------------------------------------------------- + +const success = process.env.BENCH_JOB_SUCCESS === 'true'; +const heading = success ? '## 🏎️ Benchmark Comparison' : '## ❌ Benchmark Comparison (failed)'; + +const body = [ + marker, + heading, + summarySection, + '
', + 'Full mitata output', + '', + '```', + rawOutput, + '```', + '', + '
', +].join('\n'); + process.stdout.write(body + '\n'); diff --git a/src/parser/gjs-gts-parser.js b/src/parser/gjs-gts-parser.js index 932c91c..07696bc 100644 --- a/src/parser/gjs-gts-parser.js +++ b/src/parser/gjs-gts-parser.js @@ -1,11 +1,6 @@ import { createRequire } from 'node:module'; import { registerParsedFile } from '../preprocessor/noop.js'; -import { - patchTs, - replaceExtensions, - syncMtsGtsSourceFiles, - typescriptParser, -} from './ts-patch.js'; +import { patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser } from './ts-patch.js'; import { transformForLint, preprocessGlimmerTemplates, convertAst } from './transforms.js'; const require = createRequire(import.meta.url); diff --git a/tests/parser.bench.js b/tests/parser.bench.js deleted file mode 100644 index 8f8db29..0000000 --- a/tests/parser.bench.js +++ /dev/null @@ -1,129 +0,0 @@ -import { readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { bench, describe } from 'vitest'; -import { parseForESLint as parseGjsGts } from '../src/parser/gjs-gts-parser.js'; -import { parseForESLint as parseHbs } from '../src/parser/hbs-parser.js'; - -// --------------------------------------------------------------------------- -// Fixture content – representative Glimmer / Ember source at three sizes, -// loaded from tests/bench/ so editors apply proper GTS/GJS/HBS highlighting. -// --------------------------------------------------------------------------- - -function fixture(name) { - return readFileSync(fileURLToPath(new URL(`./bench/${name}`, import.meta.url)), 'utf8'); -} - -const SMALL_GTS = fixture('small.gts'); -const MEDIUM_GTS = fixture('medium.gts'); -const LARGE_GTS = fixture('large.gts'); - -const SMALL_GJS = fixture('small.gjs'); -const MEDIUM_GJS = fixture('medium.gjs'); -const LARGE_GJS = fixture('large.gjs'); - -const SMALL_HBS = fixture('small.hbs'); -const MEDIUM_HBS = fixture('medium.hbs'); -const LARGE_HBS = fixture('large.hbs'); - -// --------------------------------------------------------------------------- -// Parse options (mirrors what ESLint passes at runtime) -// --------------------------------------------------------------------------- - -const PARSE_OPTIONS = { - comment: true, - loc: true, - range: true, - tokens: true, -}; - -// --------------------------------------------------------------------------- -// Benchmark options – longer runs and more warmup for stable results -// --------------------------------------------------------------------------- - -const BENCH_OPTIONS = { - time: 5000, // run each benchmark for at least 5 s (default: 500 ms) - warmupTime: 1000, // warmup for 1 s before measuring (default: 100 ms) - warmupIterations: 10, // warmup iteration count (default: 5) -}; - -// --------------------------------------------------------------------------- -// Benchmarks -// --------------------------------------------------------------------------- - -describe('gts parser', () => { - bench( - 'small file', - () => { - parseGjsGts(SMALL_GTS, { ...PARSE_OPTIONS, filePath: 'small.gts' }); - }, - BENCH_OPTIONS - ); - - bench( - 'medium file', - () => { - parseGjsGts(MEDIUM_GTS, { ...PARSE_OPTIONS, filePath: 'medium.gts' }); - }, - BENCH_OPTIONS - ); - - bench( - 'large file', - () => { - parseGjsGts(LARGE_GTS, { ...PARSE_OPTIONS, filePath: 'large.gts' }); - }, - BENCH_OPTIONS - ); -}); - -describe('gjs parser', () => { - bench( - 'small file', - () => { - parseGjsGts(SMALL_GJS, { ...PARSE_OPTIONS, filePath: 'small.gjs' }); - }, - BENCH_OPTIONS - ); - - bench( - 'medium file', - () => { - parseGjsGts(MEDIUM_GJS, { ...PARSE_OPTIONS, filePath: 'medium.gjs' }); - }, - BENCH_OPTIONS - ); - - bench( - 'large file', - () => { - parseGjsGts(LARGE_GJS, { ...PARSE_OPTIONS, filePath: 'large.gjs' }); - }, - BENCH_OPTIONS - ); -}); - -describe('hbs parser', () => { - bench( - 'small file', - () => { - parseHbs(SMALL_HBS, { ...PARSE_OPTIONS, filePath: 'small.hbs' }); - }, - BENCH_OPTIONS - ); - - bench( - 'medium file', - () => { - parseHbs(MEDIUM_HBS, { ...PARSE_OPTIONS, filePath: 'medium.hbs' }); - }, - BENCH_OPTIONS - ); - - bench( - 'large file', - () => { - parseHbs(LARGE_HBS, { ...PARSE_OPTIONS, filePath: 'large.hbs' }); - }, - BENCH_OPTIONS - ); -}); diff --git a/tests/parser.bench.mjs b/tests/parser.bench.mjs new file mode 100644 index 0000000..759f54c --- /dev/null +++ b/tests/parser.bench.mjs @@ -0,0 +1,141 @@ +/** + * Benchmark script using mitata. + * + * When run standalone (`node --expose-gc tests/parser.bench.mjs`), it benchmarks + * the local parsers only. When `bench-compare.mjs` passes `--control-dir `, + * it also loads the control (base-branch) parsers from that directory and wraps + * each size in a `summary()` so mitata shows a side-by-side comparison with + * boxplots. + * + * Usage: + * node --expose-gc tests/parser.bench.mjs [--control-dir ] + */ + +import { createRequire } from 'node:module'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { resolve } from 'node:path'; +import { run, bench, boxplot, summary } from 'mitata'; +import * as experimentGJS from '../src/parser/gjs-gts-parser.js'; +import * as experimentHBS from '../src/parser/hbs-parser.js'; + +// --------------------------------------------------------------------------- +// CLI args +// --------------------------------------------------------------------------- + +const args = process.argv.slice(2); +const ctrlIdx = args.indexOf('--control-dir'); +const CONTROL_DIR = ctrlIdx !== -1 ? resolve(args[ctrlIdx + 1]) : null; + +// --------------------------------------------------------------------------- +// (Optionally) load control (base branch) parsers from tmp dir +// --------------------------------------------------------------------------- + +let controlGJS = null; +let controlHBS = null; + +if (CONTROL_DIR) { + const controlRequire = createRequire(resolve(CONTROL_DIR, 'index.js')); + controlGJS = controlRequire('./src/parser/gjs-gts-parser.js'); + controlHBS = controlRequire('./src/parser/hbs-parser.js'); +} + +// --------------------------------------------------------------------------- +// Fixture content +// --------------------------------------------------------------------------- + +function fixture(name) { + return readFileSync(fileURLToPath(new URL(`./bench/${name}`, import.meta.url)), 'utf8'); +} + +const FIXTURES = { + gts: { small: fixture('small.gts'), medium: fixture('medium.gts'), large: fixture('large.gts') }, + gjs: { small: fixture('small.gjs'), medium: fixture('medium.gjs'), large: fixture('large.gjs') }, + hbs: { small: fixture('small.hbs'), medium: fixture('medium.hbs'), large: fixture('large.hbs') }, +}; + +const PARSE_OPTIONS = { comment: true, loc: true, range: true, tokens: true }; + +// --------------------------------------------------------------------------- +// Register benchmarks +// --------------------------------------------------------------------------- + +const PARSERS = [ + { + type: 'gts', + ext: '.gts', + experimentParse: experimentGJS.parseForESLint, + controlParse: controlGJS?.parseForESLint, + }, + { + type: 'gjs', + ext: '.gjs', + experimentParse: experimentGJS.parseForESLint, + controlParse: controlGJS?.parseForESLint, + }, + { + type: 'hbs', + ext: '.hbs', + experimentParse: experimentHBS.parseForESLint, + controlParse: controlHBS?.parseForESLint, + }, +]; + +const SIZES = ['small', 'medium', 'large']; + +for (const { type, ext, experimentParse, controlParse } of PARSERS) { + for (const size of SIZES) { + const code = FIXTURES[type][size]; + const opts = { ...PARSE_OPTIONS, filePath: `${size}${ext}` }; + + // Force a full GC before each benchmark group to reduce GC-triggered variance + globalThis.gc?.(); + + if (controlParse) { + // Side-by-side comparison with boxplots + boxplot(() => { + summary(() => { + bench(`${type} ${size} (control)`, () => controlParse(code, opts)); + bench(`${type} ${size} (experiment)`, () => experimentParse(code, opts)); + }); + }); + } else { + // Standalone mode — just benchmark the local parsers + bench(`${type} ${size}`, () => experimentParse(code, opts)); + } + } +} + +// --------------------------------------------------------------------------- +// Run +// --------------------------------------------------------------------------- + +const result = await run({ colors: false, throw: true }); + +// Write JSON output if requested +const jsonPath = process.env.BENCH_JSON_OUTPUT; +if (jsonPath) { + const { writeFileSync } = await import('node:fs'); + + const benchmarks = result.benchmarks.map((trial) => ({ + alias: trial.alias, + runs: trial.runs.map((r) => ({ + name: r.name, + args: r.args, + error: r.error ? { message: r.error.message || String(r.error) } : undefined, + stats: r.stats + ? { + avg: r.stats.avg, + min: r.stats.min, + max: r.stats.max, + p50: r.stats.p50, + p75: r.stats.p75, + p99: r.stats.p99, + samples: r.stats.samples, + } + : undefined, + })), + })); + + writeFileSync(jsonPath, JSON.stringify({ context: result.context, benchmarks }, null, 2)); +} From bf60a8117ab313edfa52db159512beee109c294f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 14:43:44 +0000 Subject: [PATCH 06/11] Delete unused document.js re-export, use direct exports in ts-patch.js Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- src/parser/ts-patch.js | 5 ++--- src/utils/document.js | 3 --- 2 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 src/utils/document.js diff --git a/src/parser/ts-patch.js b/src/parser/ts-patch.js index d0617a8..ca06fa4 100644 --- a/src/parser/ts-patch.js +++ b/src/parser/ts-patch.js @@ -4,7 +4,8 @@ import { transformForLint, replaceRange } from './transforms.js'; const require = createRequire(import.meta.url); -let patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser, isPatched, allowGjs; +export let patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser; +let isPatched, allowGjs; try { const parserPath = require.resolve('@typescript-eslint/parser'); @@ -162,5 +163,3 @@ try { replaceExtensions = (code) => code; syncMtsGtsSourceFiles = () => null; } - -export { patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser }; diff --git a/src/utils/document.js b/src/utils/document.js deleted file mode 100644 index 8d4f5ef..0000000 --- a/src/utils/document.js +++ /dev/null @@ -1,3 +0,0 @@ -// Re-export DocumentLines from ember-estree. -// The class converts between line/column positions and character offsets. -export { DocumentLines, DocumentLines as default } from 'ember-estree'; From b72318eacfdce3536c7c642f7b311fa98d4e5fd6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 23:13:28 +0000 Subject: [PATCH 07/11] Merge main (ESM conversion from PR #176) and resolve conflicts Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- .gitignore | 4 ++ package.json | 3 +- scripts/format-bench-cli.mjs | 126 +++++++++++++++++++++++++++++++++ scripts/local-bench-summary.sh | 39 ++++++++++ tests/parser.bench.mjs | 22 ++++++ 5 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 scripts/format-bench-cli.mjs create mode 100755 scripts/local-bench-summary.sh diff --git a/.gitignore b/.gitignore index 504afef..83c2818 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ node_modules/ package-lock.json + +bench-output.txt +bench-comment.md +bench-results.json diff --git a/package.json b/package.json index dcdb3cd..39cc300 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,10 @@ "lint:fix": "concurrently \"npm:lint:*:fix\" --names \"fix:\"", "lint:js": "eslint . --max-warnings=0", "lint:js:fix": "eslint . --fix --max-warnings=0", - "lint:package": "pnpm publint", + "lint:package": "publint", "bench": "node --expose-gc tests/parser.bench.mjs", "bench:compare": "node scripts/bench-compare.mjs", + "bench:summary": "./scripts/local-bench-summary.sh", "test": "vitest run" }, "dependencies": { diff --git a/scripts/format-bench-cli.mjs b/scripts/format-bench-cli.mjs new file mode 100644 index 0000000..54b6c2e --- /dev/null +++ b/scripts/format-bench-cli.mjs @@ -0,0 +1,126 @@ +/* eslint-disable n/no-process-exit */ +/** + * Format benchmark JSON results as a CLI-friendly summary table. + * + * Environment variables: + * BENCH_JSON_OUTPUT - Path to the JSON bench results + */ + +import { readFileSync } from 'node:fs'; + +const jsonPath = process.env.BENCH_JSON_OUTPUT; + +if (!jsonPath) { + console.error('BENCH_JSON_OUTPUT not set'); + process.exit(1); +} + +let json; + +try { + json = JSON.parse(readFileSync(jsonPath, 'utf8')); +} catch (e) { + console.error(`Could not read ${jsonPath}: ${e.message}`); + process.exit(1); +} + +function formatTime(ns) { + if (ns >= 1e6) return `${(ns / 1e6).toFixed(2)} ms`; + if (ns >= 1e3) return `${(ns / 1e3).toFixed(2)} µs`; + + return `${ns.toFixed(2)} ns`; +} + +function deltaEmoji(pct) { + const abs = Math.abs(pct); + + if (abs < 1) return '⚪'; + if (pct <= -5) return '🟢'; + if (pct >= 5) return '🔴'; + + return '🟡'; +} + +// Group control/experiment pairs +const pairs = new Map(); + +for (const trial of json.benchmarks || []) { + for (const r of trial.runs || []) { + if (!r.stats) continue; + + const m = r.name.match(/^(.+)\s+\((control|experiment)\)$/); + + if (!m) continue; + + const [, key, role] = m; + + if (!pairs.has(key)) pairs.set(key, {}); + + pairs.get(key)[role] = r.stats; + } +} + +if (pairs.size === 0) { + console.log('No comparison data found.'); + process.exit(0); +} + +// Build rows — use median (p50) which is far more robust to outliers from +// CPU frequency scaling, GC pauses, and other system noise than the mean. +const rows = []; + +for (const [name, { control, experiment }] of pairs) { + if (!control || !experiment) continue; + + const ctrlVal = control.p50 ?? control.avg; + const expVal = experiment.p50 ?? experiment.avg; + const delta = ((expVal - ctrlVal) / ctrlVal) * 100; + + rows.push({ name, control: ctrlVal, experiment: expVal, delta }); +} + +if (rows.length === 0) { + console.log('No comparison data found.'); + process.exit(0); +} + +// Calculate column widths +const nameW = Math.max('Benchmark'.length, ...rows.map((r) => r.name.length)); +const ctrlW = Math.max('Control (p50)'.length, ...rows.map((r) => formatTime(r.control).length)); +const expW = Math.max( + 'Experiment (p50)'.length, + ...rows.map((r) => formatTime(r.experiment).length) +); +const deltaW = Math.max( + 'Δ'.length, + ...rows.map((r) => { + const sign = r.delta > 0 ? '+' : ''; + + return `${sign}${r.delta.toFixed(1)}%`.length; + }) +); + +// Print table +const pad = (s, w, right) => (right ? s.padStart(w) : s.padEnd(w)); + +console.log(); +console.log( + ` ${pad('Benchmark', nameW)} ${pad('Control (p50)', ctrlW, true)} ${pad('Experiment (p50)', expW, true)} ${pad('Δ', deltaW, true)}` +); +console.log( + ` ${'─'.repeat(nameW)} ${'─'.repeat(ctrlW)} ${'─'.repeat(expW)} ${'─'.repeat(deltaW)}` +); + +for (const row of rows) { + const emoji = deltaEmoji(row.delta); + const sign = row.delta > 0 ? '+' : ''; + const deltaStr = `${sign}${row.delta.toFixed(1)}%`; + + console.log( + `${emoji} ${pad(row.name, nameW)} ${pad(formatTime(row.control), ctrlW, true)} ${pad(formatTime(row.experiment), expW, true)} ${pad(deltaStr, deltaW, true)}` + ); +} + +console.log(); +console.log('🟢 faster · 🔴 slower · 🟡 within 5% · ⚪ within 1%'); +console.log(); diff --git a/scripts/local-bench-summary.sh b/scripts/local-bench-summary.sh new file mode 100755 index 0000000..2fc4d7f --- /dev/null +++ b/scripts/local-bench-summary.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# Check CPU tuning on Linux — poor settings cause massive variance +hw_warnings="" + +if [ -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ]; then + gov=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor) + if [ "$gov" != "performance" ]; then + hw_warnings+="⚠️ CPU governor is '$gov' — benchmark results will be noisy. + Fix with: sudo cpupower frequency-set -g performance +" + fi +fi + +if [ -f /sys/devices/system/cpu/cpufreq/boost ]; then + boost=$(cat /sys/devices/system/cpu/cpufreq/boost) + if [ "$boost" = "1" ]; then + hw_warnings+="⚠️ CPU boost is enabled — frequency varies with thermals. + Fix with: echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boost +" + fi +fi + +if [ -n "$hw_warnings" ]; then + echo "" + echo "$hw_warnings" +fi + +export BENCH_JSON_OUTPUT=./bench-results.json + +pnpm bench:compare + +echo "" +echo "━━━ Summary ━━━" +node scripts/format-bench-cli.mjs + +if [ -n "$hw_warnings" ]; then + echo "$hw_warnings" +fi diff --git a/tests/parser.bench.mjs b/tests/parser.bench.mjs index 759f54c..2ab7d61 100644 --- a/tests/parser.bench.mjs +++ b/tests/parser.bench.mjs @@ -83,6 +83,28 @@ const PARSERS = [ const SIZES = ['small', 'medium', 'large']; +// --------------------------------------------------------------------------- +// JIT warm-up — parse every fixture with both parsers so V8 compiles and +// optimises the hot paths before any measurement begins. Without this, the +// first-to-run parser pays the JIT compilation cost, creating order bias. +// --------------------------------------------------------------------------- + +const WARMUP_ROUNDS = 5; + +for (const { type, ext, experimentParse, controlParse } of PARSERS) { + for (const size of SIZES) { + const code = FIXTURES[type][size]; + const opts = { ...PARSE_OPTIONS, filePath: `${size}${ext}` }; + + for (let i = 0; i < WARMUP_ROUNDS; i++) { + experimentParse(code, opts); + controlParse?.(code, opts); + } + } +} + +globalThis.gc?.(); + for (const { type, ext, experimentParse, controlParse } of PARSERS) { for (const size of SIZES) { const code = FIXTURES[type][size]; From c685df778e5ae24883f226e3048f0f196d1316b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 00:14:02 +0000 Subject: [PATCH 08/11] Reorder imports in transforms.js (node:module first) Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- README.md | 1 + src/parser/transforms.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 028383f..c7e6e96 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,4 @@ export default [ ## Support eslint-plugin-ember is the primary consumer of this parser library, so SemVer _may_ not be respected for other consumers. + diff --git a/src/parser/transforms.js b/src/parser/transforms.js index e45f663..8b46753 100644 --- a/src/parser/transforms.js +++ b/src/parser/transforms.js @@ -1,8 +1,8 @@ +import { createRequire } from 'node:module'; import ContentTag from 'content-tag'; import * as glimmer from '@glimmer/syntax'; import { buildGlimmerVisitorKeys, DocumentLines } from 'ember-estree'; import { Reference, Scope, Variable, Definition } from 'eslint-scope'; -import { createRequire } from 'node:module'; const require = createRequire(import.meta.url); const htmlTagsSet = new Set(require('html-tags').default); From fb679c5d337ce2d7083acc58f6396828ad36ffdd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 00:18:01 +0000 Subject: [PATCH 09/11] Revert accidental README change Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index c7e6e96..028383f 100644 --- a/README.md +++ b/README.md @@ -54,4 +54,3 @@ export default [ ## Support eslint-plugin-ember is the primary consumer of this parser library, so SemVer _may_ not be respected for other consumers. - From 9d221e40061765bf35fa5f739867389c30a28f39 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 00:51:03 +0000 Subject: [PATCH 10/11] Clean up PR: focus on ember-estree, remove babel deps, revert unrelated changes Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- package.json | 8 ------ pnpm-lock.yaml | 6 ----- src/parser/gjs-gts-parser.js | 50 +++++++++++++----------------------- src/parser/hbs-parser.js | 16 +++++------- src/parser/transforms.js | 29 +++++++++++++-------- src/parser/ts-patch.js | 6 +++-- src/preprocessor/noop.js | 4 +-- tests/parser.bench.mjs | 10 ++++++-- 8 files changed, 58 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index 39cc300..dafde8e 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "test": "vitest run" }, "dependencies": { - "@babel/eslint-parser": "^7.28.6", "@glimmer/syntax": ">= 0.92.0", "@typescript-eslint/tsconfig-utils": "^8.38.0", "content-tag": "^4.1.0", @@ -42,7 +41,6 @@ "svg-tags": "^1.0.0" }, "devDependencies": { - "@babel/core": "^7.23.6", "@typescript-eslint/parser": "^7.1.0", "@typescript-eslint/scope-manager": "^7.1.0", "@typescript-eslint/visitor-keys": "^7.1.0", @@ -65,14 +63,8 @@ "vitest": "^1.2.2" }, "peerDependencies": { - "@babel/core": "^7.23.6", "@typescript-eslint/parser": "*" }, - "peerDependenciesMeta": { - "@typescript-eslint/parser": { - "optional": true - } - }, "packageManager": "pnpm@10.21.0", "engines": { "node": ">=16.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7ad736..4295c15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: .: dependencies: - '@babel/eslint-parser': - specifier: ^7.28.6 - version: 7.28.6(@babel/core@7.26.0)(eslint@8.57.1) '@glimmer/syntax': specifier: '>= 0.92.0' version: 0.92.3 @@ -39,9 +36,6 @@ importers: specifier: ^1.0.0 version: 1.0.0 devDependencies: - '@babel/core': - specifier: ^7.23.6 - version: 7.26.0 '@typescript-eslint/parser': specifier: ^7.1.0 version: 7.18.0(eslint@8.57.1)(typescript@5.7.2) diff --git a/src/parser/gjs-gts-parser.js b/src/parser/gjs-gts-parser.js index 07696bc..c036c00 100644 --- a/src/parser/gjs-gts-parser.js +++ b/src/parser/gjs-gts-parser.js @@ -1,11 +1,10 @@ import { createRequire } from 'node:module'; +import tsconfigUtils from '@typescript-eslint/tsconfig-utils'; import { registerParsedFile } from '../preprocessor/noop.js'; import { patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser } from './ts-patch.js'; import { transformForLint, preprocessGlimmerTemplates, convertAst } from './transforms.js'; const require = createRequire(import.meta.url); -const tsconfigUtils = require('@typescript-eslint/tsconfig-utils'); -const babelParser = require('@babel/eslint-parser/experimental-worker'); /** * implements https://eslint.org/docs/latest/extend/custom-parsers @@ -23,6 +22,7 @@ const babelParser = require('@babel/eslint-parser/experimental-worker'); function parseAllowJsFromTsconfig(tsconfigPath, rootDir) { try { const parserPath = require.resolve('@typescript-eslint/parser'); + // eslint-disable-next-line n/no-unpublished-require const tsPath = require.resolve('typescript', { paths: [parserPath] }); const ts = require(tsPath); const parsed = tsconfigUtils.getParsedConfigFile(ts, tsconfigPath, rootDir); @@ -128,6 +128,10 @@ function getAllowJs(options) { /** * @type {import('eslint').ParserModule} */ +export const meta = { + name: 'ember-eslint-parser', + version: '*', +}; export function parseForESLint(code, options) { const allowGjsWasSet = options.allowGjs !== undefined; @@ -142,11 +146,10 @@ export function parseForESLint(code, options) { const info = transformForLint(code, options.filePath); jsCode = info.output; - const isTypescript = options.filePath.endsWith('.gts') || options.filePath.endsWith('.ts'); - let useTypescript = true; - - if (options.useBabel || !typescriptParser) { - useTypescript = false; + if (!typescriptParser) { + throw new Error( + 'Please install @typescript-eslint/parser and typescript to process gjs/gts files' + ); } let result = null; @@ -155,24 +158,13 @@ export function parseForESLint(code, options) { jsCode = replaceExtensions(jsCode); } - if (isTypescript && !typescriptParser) { - throw new Error('Please install typescript to process gts'); - } - try { - result = - isTypescript || useTypescript - ? typescriptParser.parseForESLint(jsCode, { - ...options, - ranges: true, - extraFileExtensions: ['.gts', '.gjs'], - filePath, - }) - : babelParser.parseForESLint(jsCode, { - ...options, - requireConfigFile: false, - ranges: true, - }); + result = typescriptParser.parseForESLint(jsCode, { + ...options, + ranges: true, + extraFileExtensions: ['.gts', '.gjs'], + filePath, + }); if (!info.templateInfos?.length) { return result; } @@ -180,7 +172,7 @@ export function parseForESLint(code, options) { preprocessedResult.code = code; const { templateVisitorKeys } = preprocessedResult; const visitorKeys = { ...result.visitorKeys, ...templateVisitorKeys }; - result.isTypescript = isTypescript || useTypescript; + result.isTypescript = true; convertAst(result, preprocessedResult, visitorKeys); if (result.services?.program) { // Compare allowJs with the actual program's compiler options @@ -206,10 +198,4 @@ export function parseForESLint(code, options) { } } -export default { - meta: { - name: 'ember-eslint-parser', - version: '*', - }, - parseForESLint, -}; +export default { meta, parseForESLint }; diff --git a/src/parser/hbs-parser.js b/src/parser/hbs-parser.js index e57d23f..2241a4c 100644 --- a/src/parser/hbs-parser.js +++ b/src/parser/hbs-parser.js @@ -1,4 +1,4 @@ -import { analyze as eslintScopeAnalyze } from 'eslint-scope'; +import * as eslintScope from 'eslint-scope'; import { DocumentLines } from 'ember-estree'; import { processGlimmerTemplate, buildGlimmerVisitorKeys } from './transforms.js'; @@ -17,6 +17,10 @@ const hbsVisitorKeys = { Program: ['body'], ...buildGlimmerVisitorKeys() }; /** * @type {import('eslint').ParserModule} */ +export const meta = { + name: 'ember-eslint-parser/hbs', + version: '*', +}; export function parseForESLint(code, options) { const filePath = (options && options.filePath) || ''; @@ -67,7 +71,7 @@ export function parseForESLint(code, options) { // Create an empty scope manager. // For HBS, all locals are assumed to be defined at runtime, // so we don't track variable references (no no-undef errors). - const scopeManager = eslintScopeAnalyze( + const scopeManager = eslintScope.analyze( { type: 'Program', body: [], @@ -85,10 +89,4 @@ export function parseForESLint(code, options) { }; } -export default { - meta: { - name: 'ember-eslint-parser/hbs', - version: '*', - }, - parseForESLint, -}; +export default { meta, parseForESLint }; diff --git a/src/parser/transforms.js b/src/parser/transforms.js index 8b46753..3392eb5 100644 --- a/src/parser/transforms.js +++ b/src/parser/transforms.js @@ -1,17 +1,26 @@ import { createRequire } from 'node:module'; import ContentTag from 'content-tag'; -import * as glimmer from '@glimmer/syntax'; +import { + traverse as glimmerTraverse, + preprocess as glimmerPreprocess, + isKeyword as glimmerIsKeyword, +} from '@glimmer/syntax'; import { buildGlimmerVisitorKeys, DocumentLines } from 'ember-estree'; import { Reference, Scope, Variable, Definition } from 'eslint-scope'; +import htmlTags from 'html-tags'; +import svgTags from 'svg-tags'; +import { mathmlTagNames } from 'mathml-tag-names'; + +const htmlTagsSet = new Set(htmlTags); +const svgTagsSet = new Set(svgTags); +const mathMLTagsSet = new Set(mathmlTagNames); const require = createRequire(import.meta.url); -const htmlTagsSet = new Set(require('html-tags').default); -const svgTagsSet = new Set(require('svg-tags')); -const mathMLTagsSet = new Set(require('mathml-tag-names').mathmlTagNames); let TypescriptScope = null; try { const parserPath = require.resolve('@typescript-eslint/parser'); + // eslint-disable-next-line n/no-unpublished-require const scopeManagerPath = require.resolve('@typescript-eslint/scope-manager', { paths: [parserPath], }); @@ -119,12 +128,12 @@ function traverse(visitorKeys, node, visitor) { if (!currentPath.node) continue; - const visitorKeys = allVisitorKeys[currentPath.node.type]; - if (!visitorKeys) { + const keys = allVisitorKeys[currentPath.node.type]; + if (!keys) { continue; } - for (const visitorKey of visitorKeys) { + for (const visitorKey of keys) { const child = currentPath.node[visitorKey]; if (!child) { @@ -234,7 +243,7 @@ function collectNodes(ast) { const textNodes = []; const emptyTextNodes = []; - glimmer.traverse(ast, { + glimmerTraverse(ast, { All(node, path) { node.parent = path.parentNode; allNodes.push(node); @@ -356,7 +365,7 @@ function processGlimmerTemplate({ templateContent, codeLines, templateRange, tok end: codeLines.offsetToPosition(range[1]), }); - const ast = glimmer.preprocess(templateContent, { mode: 'codemod' }); + const ast = glimmerPreprocess(templateContent, { mode: 'codemod' }); const { allNodes, comments, textNodes, emptyTextNodes } = collectNodes(ast); // Fix ranges, locs, and prefix types with "Glimmer" @@ -525,7 +534,7 @@ export function convertAst(result, preprocessedResult, visitorKeys) { if (node.type === 'GlimmerPathExpression' && node.head.type === 'VarHead') { const name = node.head.name; - if (glimmer.isKeyword(name)) { + if (glimmerIsKeyword(name)) { return null; } const { scope, variable } = findVarInParentScopes(result.scopeManager, path, name) || {}; diff --git a/src/parser/ts-patch.js b/src/parser/ts-patch.js index ca06fa4..ebbec98 100644 --- a/src/parser/ts-patch.js +++ b/src/parser/ts-patch.js @@ -4,11 +4,11 @@ import { transformForLint, replaceRange } from './transforms.js'; const require = createRequire(import.meta.url); -export let patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser; -let isPatched, allowGjs; +let patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser, isPatched, allowGjs; try { const parserPath = require.resolve('@typescript-eslint/parser'); + // eslint-disable-next-line n/no-unpublished-require const tsPath = require.resolve('typescript', { paths: [parserPath] }); const ts = require(tsPath); typescriptParser = require('@typescript-eslint/parser'); @@ -163,3 +163,5 @@ try { replaceExtensions = (code) => code; syncMtsGtsSourceFiles = () => null; } + +export { patchTs, replaceExtensions, syncMtsGtsSourceFiles, typescriptParser }; diff --git a/src/preprocessor/noop.js b/src/preprocessor/noop.js index 4ef69fd..94d188a 100644 --- a/src/preprocessor/noop.js +++ b/src/preprocessor/noop.js @@ -15,7 +15,7 @@ export function registerParsedFile(f) { export const preprocess = undefined; -export function postprocess(messages, fileName) { +export const postprocess = (messages, fileName) => { const msgs = messages.flat(); if (!parsedFiles.has(fileName)) { msgs[0] = msgs[0] || { @@ -28,7 +28,7 @@ export function postprocess(messages, fileName) { } parsedFiles.delete(fileName); // required for tests return msgs; -} +}; export const supportsAutofix = true; diff --git a/tests/parser.bench.mjs b/tests/parser.bench.mjs index 2ab7d61..c1d4520 100644 --- a/tests/parser.bench.mjs +++ b/tests/parser.bench.mjs @@ -16,8 +16,6 @@ import { readFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { resolve } from 'node:path'; import { run, bench, boxplot, summary } from 'mitata'; -import * as experimentGJS from '../src/parser/gjs-gts-parser.js'; -import * as experimentHBS from '../src/parser/hbs-parser.js'; // --------------------------------------------------------------------------- // CLI args @@ -27,6 +25,14 @@ const args = process.argv.slice(2); const ctrlIdx = args.indexOf('--control-dir'); const CONTROL_DIR = ctrlIdx !== -1 ? resolve(args[ctrlIdx + 1]) : null; +// --------------------------------------------------------------------------- +// Load experiment (current branch) parsers +// --------------------------------------------------------------------------- + +const require_ = createRequire(import.meta.url); +const experimentGJS = require_('../src/parser/gjs-gts-parser.js'); +const experimentHBS = require_('../src/parser/hbs-parser.js'); + // --------------------------------------------------------------------------- // (Optionally) load control (base branch) parsers from tmp dir // --------------------------------------------------------------------------- From b9d7dc157b41aa2aab378be8794a6ed6e2171627 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 01:05:27 +0000 Subject: [PATCH 11/11] Fix isTypescript: use file extension check instead of unconditional true Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- src/parser/gjs-gts-parser.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/parser/gjs-gts-parser.js b/src/parser/gjs-gts-parser.js index c036c00..25462c8 100644 --- a/src/parser/gjs-gts-parser.js +++ b/src/parser/gjs-gts-parser.js @@ -146,6 +146,8 @@ export function parseForESLint(code, options) { const info = transformForLint(code, options.filePath); jsCode = info.output; + const isTypescript = options.filePath.endsWith('.gts') || options.filePath.endsWith('.ts'); + if (!typescriptParser) { throw new Error( 'Please install @typescript-eslint/parser and typescript to process gjs/gts files' @@ -172,7 +174,7 @@ export function parseForESLint(code, options) { preprocessedResult.code = code; const { templateVisitorKeys } = preprocessedResult; const visitorKeys = { ...result.visitorKeys, ...templateVisitorKeys }; - result.isTypescript = true; + result.isTypescript = isTypescript; convertAst(result, preprocessedResult, visitorKeys); if (result.services?.program) { // Compare allowJs with the actual program's compiler options