diff --git a/.bazelignore b/.bazelignore index 264c2374a..d5bb7019e 100644 --- a/.bazelignore +++ b/.bazelignore @@ -6,3 +6,6 @@ bazel/integration/tests/angular-cli/node_modules/ bazel/integration/tests/nested_bazel_workspaces/node_modules bazel/integration/tests/package_mappings/node_modules/ bazel/integration/tests/playwright_chromium/node_modules + +bazel/node_modules +bazel/spec-bundling/test/node_modules \ No newline at end of file diff --git a/WORKSPACE b/WORKSPACE index aad8c8e94..12180220d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -177,3 +177,14 @@ rules_browsers_setup_1() load("@rules_browsers//setup:step_2.bzl", "rules_browsers_setup_2") rules_browsers_setup_2() + +http_archive( + name = "aspect_rules_jasmine", + sha256 = "0d2f9c977842685895020cac721d8cc4f1b37aae15af46128cf619741dc61529", + strip_prefix = "rules_jasmine-2.0.0", + url = "https://github.com/aspect-build/rules_jasmine/releases/download/v2.0.0/rules_jasmine-v2.0.0.tar.gz", +) + +load("@aspect_rules_jasmine//jasmine:dependencies.bzl", "rules_jasmine_dependencies") + +rules_jasmine_dependencies() diff --git a/bazel/pnpm-lock.yaml b/bazel/pnpm-lock.yaml index 10742a3da..b038eb495 100644 --- a/bazel/pnpm-lock.yaml +++ b/bazel/pnpm-lock.yaml @@ -66,8 +66,91 @@ importers: specifier: 18.0.0 version: 18.0.0 + spec-bundling/test: + dependencies: + '@angular/compiler': + specifier: 20.1.4 + version: 20.1.4 + '@angular/core': + specifier: 20.1.4 + version: 20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser-dynamic': + specifier: 20.1.4 + version: 20.1.4(@angular/common@20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.1.4)(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.1.4(@angular/common@20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))) + '@types/jasmine': + specifier: 5.1.8 + version: 5.1.8 + '@types/jsdom': + specifier: 21.1.7 + version: 21.1.7 + '@types/node': + specifier: 24.2.0 + version: 24.2.0 + jasmine: + specifier: 5.9.0 + version: 5.9.0 + jasmine-reporters: + specifier: 2.5.2 + version: 2.5.2 + jsdom: + specifier: 26.1.0 + version: 26.1.0 + tinyglobby: + specifier: 0.2.14 + version: 0.2.14 + zone.js: + specifier: 0.15.1 + version: 0.15.1 + packages: + '@angular/common@20.1.4': + resolution: {integrity: sha512-AL+HdsY5xL2iM1zZ55ce33U+w2LgPJZQwKvHXJJ/Hpk3rpFNamWtRPmJBeq8Z0dQV1lLTMM+2pUatH6p+5pvEg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/core': 20.1.4 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/compiler@20.1.4': + resolution: {integrity: sha512-gQbchh2ziK9QxZuHgEf7BUMCm/ayu6Zr9hst6itSecinUJgUeeSp3Z4vXjIBNBUKMPB135tWw9RGiVbW8saBmg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@angular/core@20.1.4': + resolution: {integrity: sha512-aWDux64a9usuVU2SnF0epqjXAj8JO8jViUzZAJAuFKSCtkeNzqP+Z6DjkqsCKrNvGP7xkX1XhhepUygxgh7/6A==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/compiler': 20.1.4 + rxjs: ^6.5.3 || ^7.4.0 + zone.js: ~0.15.0 + peerDependenciesMeta: + '@angular/compiler': + optional: true + zone.js: + optional: true + + '@angular/platform-browser-dynamic@20.1.4': + resolution: {integrity: sha512-bH4CjZ2O2oqRaKd36Xe/EhZDHx769pPf9oR4oITsZJ10bIhkWcaG9pgaW+W1PGc+nMevVpJ7XfG9m9n6+3bEfw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/common': 20.1.4 + '@angular/compiler': 20.1.4 + '@angular/core': 20.1.4 + '@angular/platform-browser': 20.1.4 + + '@angular/platform-browser@20.1.4': + resolution: {integrity: sha512-z86NsGSwm5pXCACdWBbp7SC1Xn+UGvuoRqTsi0dNUXT/3WrP6MvZT3TfNKwM63GLUqFAICSt7uFXS84D72ukvA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/animations': 20.1.4 + '@angular/common': 20.1.4 + '@angular/core': 20.1.4 + peerDependenciesMeta: + '@angular/animations': + optional: true + + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -88,6 +171,34 @@ packages: '@bazel/runfiles@6.3.1': resolution: {integrity: sha512-1uLNT5NZsUVIGS4syuHwTzZ8HycMPyr6POA3FCE4GbMtc4rhoJk8aZKtNIRthJYfL+iioppi+rTfH3olMPr9nA==} + '@csstools/color-helpers@5.0.2': + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -102,6 +213,10 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@microsoft/api-extractor-model@7.30.7': resolution: {integrity: sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==} @@ -215,6 +330,10 @@ packages: resolution: {integrity: sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw==} engines: {node: '>= 10'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@rushstack/node-core-library@5.14.0': resolution: {integrity: sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==} peerDependencies: @@ -273,6 +392,12 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/jasmine@5.1.8': + resolution: {integrity: sha512-u7/CnvRdh6AaaIzYjCgUuVbREFgulhX05Qtf6ZtW+aOcjCKKVvKgpkPYJBFTZSHtFBYimzU4zP0V2vrEsq9Wcg==} + + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + '@types/micromatch@2.3.35': resolution: {integrity: sha512-J749bHo/Zu56w0G0NI/IGHLQPiSsjx//0zJhfEVAN95K/xM5C8ZDmhkXtU3qns0sBOao7HuQzr8XV1/2o5LbXA==} @@ -282,6 +407,9 @@ packages: '@types/node@22.17.0': resolution: {integrity: sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==} + '@types/node@24.2.0': + resolution: {integrity: sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==} + '@types/parse-glob@3.0.32': resolution: {integrity: sha512-n4xmml2WKR12XeQprN8L/sfiVPa8FHS3k+fxp4kSr/PA2GsGUgFND+bvISJxM0y5QdvzNEGjEVU3eIrcKks/pA==} @@ -300,6 +428,9 @@ packages: '@types/serve-static@1.15.8': resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/wait-on@5.3.4': resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} @@ -312,6 +443,10 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -324,6 +459,10 @@ packages: resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} engines: {node: '>= 4.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -443,6 +582,9 @@ packages: brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -546,10 +688,22 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -588,6 +742,9 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + del@2.2.2: resolution: {integrity: sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==} engines: {node: '>=0.10.0'} @@ -617,6 +774,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + easy-extender@2.3.4: resolution: {integrity: sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==} engines: {node: '>= 4.0.0'} @@ -637,6 +797,9 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -656,6 +819,10 @@ packages: resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} engines: {node: '>=10.2.0'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -742,6 +909,10 @@ packages: debug: optional: true + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} @@ -802,6 +973,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -846,6 +1021,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} @@ -854,6 +1033,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -866,10 +1049,18 @@ packages: resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} engines: {node: '>= 4.5.0'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -933,6 +1124,9 @@ packages: resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -943,16 +1137,32 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jasmine-core@2.8.0: resolution: {integrity: sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==} + jasmine-core@5.9.0: + resolution: {integrity: sha512-OMUvF1iI6+gSRYOhMrH4QYothVLN9C3EJ6wm4g7zLJlnaTl8zbaPOr0bTw70l7QxkoM7sVFOWo83u9B2Fe2Zng==} + + jasmine-reporters@2.5.2: + resolution: {integrity: sha512-qdewRUuFOSiWhiyWZX8Yx3YNQ9JG51ntBEO4ekLQRpktxFTwUHy24a86zD/Oi2BRTKksEdfWQZcQFqzjqIkPig==} + jasmine@2.8.0: resolution: {integrity: sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==} hasBin: true + jasmine@5.9.0: + resolution: {integrity: sha512-SspK51QMnuC92z5zpF4kOkWN+MyZZDOBv8zgzlMAYvMD0UoGwcq5yYaDe1mrpN7wXZ2CFXh5y8Ua2ugwE4OmXQ==} + hasBin: true + jasminewd2@2.2.0: resolution: {integrity: sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==} engines: {node: '>= 6.9.x'} @@ -966,6 +1176,15 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1007,6 +1226,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1047,12 +1269,25 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + mitt@1.2.0: resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -1067,6 +1302,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + nwsapi@2.2.21: + resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} + oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -1105,9 +1343,15 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -1123,9 +1367,17 @@ packages: path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -1236,6 +1488,9 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + rx@4.1.0: resolution: {integrity: sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==} @@ -1257,6 +1512,10 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + selenium-webdriver@3.6.0: resolution: {integrity: sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==} engines: {node: '>= 6.9.0'} @@ -1309,6 +1568,18 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + socket.io-adapter@2.5.5: resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} @@ -1372,6 +1643,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -1411,10 +1686,20 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tmp@0.0.30: resolution: {integrity: sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==} engines: {node: '>=0.4.0'} @@ -1435,6 +1720,14 @@ packages: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + true-case-path@2.2.1: resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} @@ -1464,6 +1757,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -1499,6 +1795,10 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + wait-on@8.0.4: resolution: {integrity: sha512-8f9LugAGo4PSc0aLbpKVCVtzayd36sSCp4WLpVngkYq6PK87H79zt77/tlCU6eKCLqR46iFvcl0PU5f+DmtkwA==} engines: {node: '>=12.0.0'} @@ -1513,9 +1813,30 @@ packages: engines: {node: '>=6.9.x'} hasBin: true + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -1524,6 +1845,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrap-ansi@9.0.0: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} @@ -1555,6 +1880,10 @@ packages: utf-8-validate: optional: true + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + xml2js@0.4.23: resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} engines: {node: '>=4.0.0'} @@ -1563,6 +1892,9 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xmlhttprequest-ssl@2.1.2: resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} @@ -1601,8 +1933,51 @@ packages: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + zone.js@0.15.1: + resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} + snapshots: + '@angular/common@20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + dependencies: + '@angular/core': 20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/compiler@20.1.4': + dependencies: + tslib: 2.8.1 + + '@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1)': + dependencies: + rxjs: 7.8.2 + tslib: 2.8.1 + optionalDependencies: + '@angular/compiler': 20.1.4 + zone.js: 0.15.1 + + '@angular/platform-browser-dynamic@20.1.4(@angular/common@20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.1.4)(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.1.4(@angular/common@20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1)))': + dependencies: + '@angular/common': 20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': 20.1.4 + '@angular/core': 20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 20.1.4(@angular/common@20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1)) + tslib: 2.8.1 + + '@angular/platform-browser@20.1.4(@angular/common@20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))': + dependencies: + '@angular/common': 20.1.4(@angular/core@20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 20.1.4(@angular/compiler@20.1.4)(rxjs@7.8.2)(zone.js@0.15.1) + tslib: 2.8.1 + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.27.1': {} @@ -1618,6 +1993,26 @@ snapshots: '@bazel/runfiles@6.3.1': {} + '@csstools/color-helpers@5.0.2': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.0.2 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -1630,6 +2025,15 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@microsoft/api-extractor-model@7.30.7(@types/node@22.17.0)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -1733,6 +2137,9 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.0.4 optional: true + '@pkgjs/parseargs@0.11.0': + optional: true + '@rushstack/node-core-library@5.14.0(@types/node@22.17.0)': dependencies: ajv: 8.13.0 @@ -1809,10 +2216,18 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 22.17.0 + '@types/node': 24.2.0 '@types/http-errors@2.0.5': {} + '@types/jasmine@5.1.8': {} + + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 24.2.0 + '@types/tough-cookie': 4.0.5 + parse5: 7.3.0 + '@types/micromatch@2.3.35': dependencies: '@types/parse-glob': 3.0.32 @@ -1823,6 +2238,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@24.2.0': + dependencies: + undici-types: 7.10.0 + '@types/parse-glob@3.0.32': {} '@types/q@0.0.32': {} @@ -1842,16 +2261,18 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.17.0 + '@types/node': 24.2.0 '@types/send': 0.17.5 + '@types/tough-cookie@4.0.5': {} + '@types/wait-on@5.3.4': dependencies: '@types/node': 22.17.0 '@types/ws@8.18.1': dependencies: - '@types/node': 22.17.0 + '@types/node': 24.2.0 '@types/yargs-parser@21.0.3': {} @@ -1859,6 +2280,8 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@xmldom/xmldom@0.8.10': {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -1870,6 +2293,8 @@ snapshots: dependencies: es6-promisify: 5.0.0 + agent-base@7.1.4: {} + ajv-draft-04@1.0.0(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -1977,6 +2402,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -2137,10 +2566,26 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + debug@2.6.9: dependencies: ms: 2.0.0 @@ -2159,6 +2604,8 @@ snapshots: decamelize@1.2.0: {} + decimal.js@10.6.0: {} + del@2.2.2: dependencies: globby: 5.0.0 @@ -2185,6 +2632,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + eastasianwidth@0.2.0: {} + easy-extender@2.3.4: dependencies: lodash: 4.17.21 @@ -2204,6 +2653,8 @@ snapshots: emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + encodeurl@1.0.2: {} encodeurl@2.0.0: {} @@ -2225,7 +2676,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 22.17.0 + '@types/node': 24.2.0 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -2238,6 +2689,8 @@ snapshots: - supports-color - utf-8-validate + entities@6.0.1: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -2306,6 +2759,11 @@ snapshots: follow-redirects@1.15.11: {} + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + forever-agent@0.6.1: {} form-data@2.3.3: @@ -2375,6 +2833,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -2420,6 +2887,10 @@ snapshots: dependencies: function-bind: 1.1.2 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + http-errors@1.6.3: dependencies: depd: 1.1.2 @@ -2435,6 +2906,13 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 @@ -2456,10 +2934,21 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + immediate@3.0.6: {} immutable@3.8.2: {} @@ -2509,22 +2998,44 @@ snapshots: dependencies: path-is-inside: 1.0.2 + is-potential-custom-element-name@1.0.1: {} + is-typedarray@1.0.0: {} is-wsl@1.1.0: {} isarray@1.0.0: {} + isexe@2.0.0: {} + isstream@0.1.2: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jasmine-core@2.8.0: {} + jasmine-core@5.9.0: {} + + jasmine-reporters@2.5.2: + dependencies: + '@xmldom/xmldom': 0.8.10 + mkdirp: 1.0.4 + jasmine@2.8.0: dependencies: exit: 0.1.2 glob: 7.2.3 jasmine-core: 2.8.0 + jasmine@5.9.0: + dependencies: + glob: 10.4.5 + jasmine-core: 5.9.0 + jasminewd2@2.2.0: {} jju@1.4.0: {} @@ -2539,6 +3050,33 @@ snapshots: jsbn@0.1.1: {} + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.21 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -2585,6 +3123,8 @@ snapshots: lodash@4.17.21: {} + lru-cache@10.4.3: {} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -2618,10 +3158,18 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} + mitt@1.2.0: {} + mkdirp@1.0.4: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -2630,6 +3178,8 @@ snapshots: normalize-path@3.0.0: {} + nwsapi@2.2.21: {} + oauth-sign@0.9.0: {} object-assign@4.1.1: {} @@ -2662,8 +3212,14 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + pako@1.0.11: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -2672,8 +3228,15 @@ snapshots: path-is-inside@1.0.2: {} + path-key@3.1.1: {} + path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + performance-now@2.1.0: {} picomatch@2.3.1: {} @@ -2802,6 +3365,8 @@ snapshots: dependencies: glob: 7.2.3 + rrweb-cssom@0.8.0: {} + rx@4.1.0: {} rxjs@7.8.2: @@ -2822,6 +3387,10 @@ snapshots: sax@1.4.1: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + selenium-webdriver@3.6.0: dependencies: jszip: 3.10.1 @@ -2928,6 +3497,14 @@ snapshots: setprototypeof@1.2.0: {} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + socket.io-adapter@2.5.5: dependencies: debug: 4.3.7 @@ -3012,6 +3589,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string-width@7.2.0: dependencies: emoji-regex: 10.4.0 @@ -3048,11 +3631,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tmp@0.0.30: dependencies: os-tmpdir: 1.0.2 @@ -3070,6 +3661,14 @@ snapshots: psl: 1.15.0 punycode: 2.3.1 + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + true-case-path@2.2.1: {} tslib@2.8.1: {} @@ -3088,6 +3687,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.10.0: {} + universalify@0.1.2: {} universalify@2.0.1: {} @@ -3112,6 +3713,10 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + wait-on@8.0.4: dependencies: axios: 1.11.0 @@ -3141,8 +3746,25 @@ snapshots: semver: 5.7.2 xml2js: 0.4.23 + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which-module@2.0.1: {} + which@2.0.2: + dependencies: + isexe: 2.0.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -3155,6 +3777,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 @@ -3167,6 +3795,8 @@ snapshots: ws@8.18.3: {} + xml-name-validator@5.0.0: {} + xml2js@0.4.23: dependencies: sax: 1.4.1 @@ -3174,6 +3804,8 @@ snapshots: xmlbuilder@11.0.1: {} + xmlchars@2.2.0: {} + xmlhttprequest-ssl@2.1.2: {} y18n@4.0.3: {} @@ -3223,3 +3855,5 @@ snapshots: string-width: 7.2.0 y18n: 5.0.8 yargs-parser: 22.0.0 + + zone.js@0.15.1: {} diff --git a/bazel/pnpm-workspace.yaml b/bazel/pnpm-workspace.yaml new file mode 100644 index 000000000..d3aea1e8c --- /dev/null +++ b/bazel/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - . + - spec-bundling/test/ diff --git a/bazel/setup_dependencies_1.bzl b/bazel/setup_dependencies_1.bzl index 82f57a5ac..b08aa6579 100644 --- a/bazel/setup_dependencies_1.bzl +++ b/bazel/setup_dependencies_1.bzl @@ -6,6 +6,7 @@ def setup_dependencies_1(): data = [ "@devinfra//bazel:package.json", "@devinfra//bazel:pnpm-workspace.yaml", + "@devinfra//bazel/spec-bundling/test:package.json", ], pnpm_lock = "@devinfra//bazel:pnpm-lock.yaml", ) diff --git a/bazel/spec-bundling/BUILD.bazel b/bazel/spec-bundling/BUILD.bazel index 68bc52cce..7baa46900 100644 --- a/bazel/spec-bundling/BUILD.bazel +++ b/bazel/spec-bundling/BUILD.bazel @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -exports_files(["esbuild.config-tmpl.mjs"]) - # Make source files available for distribution via pkg_npm filegroup( name = "files", diff --git a/bazel/spec-bundling/bundle-config.bzl b/bazel/spec-bundling/bundle-config.bzl deleted file mode 100644 index 4de7c10ae..000000000 --- a/bazel/spec-bundling/bundle-config.bzl +++ /dev/null @@ -1,43 +0,0 @@ -def _spec_bundle_config_file_impl(ctx): - run_angular_linker = ctx.attr.run_angular_linker - downlevel_async_await = ctx.attr.downlevel_async_await - linker_unknown_declaration_handling = ctx.attr.linker_unknown_declaration_handling - - ctx.actions.expand_template( - template = ctx.file._template, - output = ctx.outputs.output_name, - substitutions = { - "TMPL_RUN_LINKER": "true" if run_angular_linker else "false", - "TMPL_DOWNLEVEL_ASYNC_AWAIT": "true" if downlevel_async_await else "false", - "TMPL_LINKER_UNKNOWN_DECLARATION_HANDLING": ("'%s'" % linker_unknown_declaration_handling) if linker_unknown_declaration_handling else "undefined", - }, - ) - -spec_bundle_config_file = rule( - implementation = _spec_bundle_config_file_impl, - doc = "Generates an ESBuild configuration file for bundling specs", - attrs = { - "run_angular_linker": attr.bool( - doc = "Whether the Angular linker should process all files.", - default = False, - ), - "downlevel_async_await": attr.bool( - doc = "Whether to downlevel async/await syntax.", - default = True, - ), - "output_name": attr.output( - mandatory = True, - doc = "Name of the file where the config should be written to.", - ), - "linker_unknown_declaration_handling": attr.string( - values = ["ignore", "warn", "error"], - doc = """Controls how unknown declaration versions should be handled by the Angular linker. - https://github.com/angular/angular/blob/f94c6f433dba3924b79f137cfcc49d2dfd4d679c/packages/compiler-cli/linker/src/file_linker/linker_options.ts#L27-L39. - """, - ), - "_template": attr.label( - allow_single_file = True, - default = "//bazel/spec-bundling:esbuild.config-tmpl.mjs", - ), - }, -) diff --git a/bazel/spec-bundling/index.bzl b/bazel/spec-bundling/index.bzl index 339df427f..c3bf31ec4 100644 --- a/bazel/spec-bundling/index.bzl +++ b/bazel/spec-bundling/index.bzl @@ -1,7 +1,38 @@ -"""Public API for rules related to test bundling.""" +load("@aspect_rules_esbuild//esbuild:defs.bzl", "esbuild") +load("@devinfra//bazel/spec-bundling:spec-entrypoint.bzl", "spec_entrypoint") -load("//bazel/spec-bundling:spec-entrypoint.bzl", _spec_entrypoint = "spec_entrypoint") -load("//bazel/spec-bundling:spec-bundle.bzl", _spec_bundle = "spec_bundle") +def spec_bundle(name, deps, srcs = [], bootstrap = [], testonly = True, config = {}, **kwargs): + spec_entrypoint( + name = "%s_entrypoint" % name, + deps = deps, + bootstrap = bootstrap, + testonly = testonly, + ) -spec_bundle = _spec_bundle -spec_entrypoint = _spec_entrypoint + esbuild( + name = name, + # Note: `deps` are added here to automatically collect transitive NPM + # sources etc. and make them available for bundling. + srcs = srcs + deps + [ + ":%s_entrypoint" % name, + ], + config = dict({ + # Bundling specs may result in classes being aliased to avoid collisions. e.g. when + # everything is bundled into a single AMD bundle. To avoid test failures for assertions + # on symbol names, we instruct ESBuild to keep original names. See: + # https://esbuild.github.io/api/#keep-names. + "keepNames": True, + # Needed for ZoneJS async await + "supported": { + "async-await": False, + }, + }, **config), + testonly = testonly, + bundle = True, + format = "iife", + sourcemap = "linked", + platform = kwargs.pop("platform", "node"), + entry_point = ":%s_entrypoint" % name, + output = "%s.spec.js" % name, + **kwargs + ) diff --git a/bazel/spec-bundling/index_rjs.bzl b/bazel/spec-bundling/index_rjs.bzl deleted file mode 100644 index b9c5cf1aa..000000000 --- a/bazel/spec-bundling/index_rjs.bzl +++ /dev/null @@ -1,51 +0,0 @@ -load("@aspect_rules_esbuild//esbuild:defs.bzl", "esbuild") -load("@devinfra//bazel/spec-bundling:spec-entrypoint.bzl", "spec_entrypoint") - -def spec_bundle(name, deps, srcs = [], bootstrap = [], testonly = True, config = {}, **kwargs): - spec_entrypoint( - name = "%s_entrypoint" % name, - deps = deps, - bootstrap = bootstrap, - testonly = testonly, - ) - - esbuild( - name = name, - # Note: `deps` are added here to automatically collect transitive NPM - # sources etc. and make them available for bundling. - srcs = srcs + deps + [ - ":%s_entrypoint" % name, - ], - config = dict({ - # Bundling specs may result in classes being aliased to avoid collisions. e.g. when - # everything is bundled into a single AMD bundle. To avoid test failures for assertions - # on symbol names, we instruct ESBuild to keep original names. See: - # https://esbuild.github.io/api/#keep-names. - "keepNames": True, - # Needed for ZoneJS async await - "supported": { - "async-await": False, - }, - }, **config), - testonly = testonly, - bundle = True, - format = "iife", - sourcemap = "linked", - platform = kwargs.pop("platform", "node"), - entry_point = ":%s_entrypoint" % name, - output = "%s.spec.js" % name, - **kwargs - ) - -def spec_bundle_amd(name, workspace_name, config = {}, **kwargs): - amd_name = "%s/%s/%s" % (workspace_name, native.package_name(), name + ".spec") - - spec_bundle( - name, - config = dict({ - "globalName": "__exports", - "banner": {"js": "define(\"%s\", [], function() {" % amd_name}, - "footer": {"js": "return __exports;})"}, - }, **config), - **kwargs - ) diff --git a/bazel/spec-bundling/spec-entrypoint.bzl b/bazel/spec-bundling/spec-entrypoint.bzl index f4538fd16..f43110dde 100644 --- a/bazel/spec-bundling/spec-entrypoint.bzl +++ b/bazel/spec-bundling/spec-entrypoint.bzl @@ -1,5 +1,4 @@ load("@aspect_rules_js//js:providers.bzl", "JsInfo", "js_info") -load("@rules_nodejs//nodejs:providers.bzl", "JSModuleInfo") def _is_non_external_file_with_suffix(file, suffix): """Gets whether the given file is a non-external file with the given suffix.""" @@ -46,8 +45,6 @@ def _spec_entrypoint_impl(ctx): if JsInfo in dep: spec_all_deps.append(dep[JsInfo].transitive_sources) spec_all_deps.append(dep[JsInfo].npm_sources) - elif JSModuleInfo in dep: - spec_all_deps.append(dep[JSModuleInfo].sources) else: spec_all_deps.append(dep[DefaultInfo].files) @@ -56,9 +53,6 @@ def _spec_entrypoint_impl(ctx): bootstrap_all_deps.append(dep[JsInfo].transitive_sources) bootstrap_all_deps.append(dep[JsInfo].npm_sources) bootstrap_direct_deps.append(dep[JsInfo].sources) - elif JSModuleInfo in dep: - bootstrap_all_deps.append(dep[JSModuleInfo].sources) - bootstrap_direct_deps.append(dep[JSModuleInfo].direct_sources) else: bootstrap_all_deps.append(dep[DefaultInfo].files) bootstrap_direct_deps.append(dep[DefaultInfo].files) @@ -91,10 +85,6 @@ def _spec_entrypoint_impl(ctx): sources = out_depset, transitive_sources = transitive_deps, ), - JSModuleInfo( - direct_sources = out_depset, - sources = transitive_deps, - ), ] spec_entrypoint = rule( diff --git a/bazel/spec-bundling/test/BUILD.bazel b/bazel/spec-bundling/test/BUILD.bazel index ee0387c06..a3676b728 100644 --- a/bazel/spec-bundling/test/BUILD.bazel +++ b/bazel/spec-bundling/test/BUILD.bazel @@ -1,78 +1,92 @@ -# NOTE: We need to test with the raw jasmine rule here because our default -# repo rule uses spec-bundling as well, with some additional defaults. -load("@npm//@bazel/jasmine:index.bzl", "jasmine_node_test") -load("//bazel/spec-bundling:index.bzl", "spec_bundle", "spec_entrypoint") -load("//tools:defaults.bzl", "ts_library") +load("@aspect_rules_jasmine//jasmine:defs.bzl", "jasmine_test") +load("@aspect_rules_ts//ts:defs.bzl", "ts_config", "ts_project") +load("@devinfra_npm//:defs.bzl", "npm_link_all_packages") +load("//bazel/spec-bundling:index.bzl", "spec_bundle") -ts_library( +npm_link_all_packages() + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + ":node_modules/@types/jasmine", + ":node_modules/@types/node", + ], +) + +ts_project( name = "transitive_should_be_loaded", srcs = ["should_be_picked_up.spec.ts"], + declaration = True, + tsconfig = ":tsconfig", deps = [ - "@npm//@types/jasmine", - "@npm//@types/node", + ":node_modules/@types/jasmine", + ":node_modules/@types/node", ], ) -ts_library( +ts_project( name = "test_async_await_lib", testonly = True, srcs = ["async-await.spec.ts"], + declaration = True, + tsconfig = ":tsconfig", deps = [ - "@npm//@angular/core", - "@npm//@angular/platform-browser-dynamic", - "@npm//@types/jasmine", - "@npm//@types/jsdom", - "@npm//@types/node", - "@npm//jsdom", - "@npm//zone.js", + ":node_modules/@angular/core", + ":node_modules/@angular/platform-browser-dynamic", + ":node_modules/@types/jasmine", + ":node_modules/@types/jsdom", + ":node_modules/@types/node", + ":node_modules/jsdom", + ":node_modules/zone.js", ], ) -ts_library( +ts_project( name = "ensure_transitive_loaded_lib", testonly = True, srcs = ["ensure-transitive-loaded.spec.ts"], + declaration = True, + tsconfig = ":tsconfig", deps = [ + ":node_modules/@types/jasmine", + ":node_modules/@types/node", ":transitive_should_be_loaded", - "@npm//@types/jasmine", - "@npm//@types/node", ], ) -ts_library( +ts_project( name = "test_lib_apf", testonly = True, srcs = ["core_apf_esm_test.ts"], + declaration = True, + tsconfig = ":tsconfig", deps = [ - "@npm//@angular/core", - "@npm//@types/jasmine", + ":node_modules/@angular/compiler", + ":node_modules/@angular/core", + ":node_modules/@types/jasmine", ], ) -ts_library( +ts_project( name = "test_lib_invalid_linker_declaration", testonly = True, srcs = ["core_invalid_linker_decl.spec.ts"], + declaration = True, + tsconfig = ":tsconfig", deps = [ - "@npm//@angular/core", - "@npm//@types/jasmine", - ], -) - -spec_entrypoint( - name = "explicit_file_entrypoint", - testonly = True, - bootstrap = [], - deps = [ - "some_spec.js", - ":test_lib_apf", + ":node_modules/@angular/compiler", + ":node_modules/@angular/core", + ":node_modules/@types/jasmine", ], ) spec_bundle( name = "test_bundle", - platform = "node", - run_angular_linker = True, + bootstrap = [ + # Ensure that the transitive loaded spec is the first in the order loaded + "ensure-transitive-loaded.spec.js", + ], deps = [ ":ensure_transitive_loaded_lib", ":test_lib_apf", @@ -81,52 +95,61 @@ spec_bundle( spec_bundle( name = "test_bundle_legacy_cjs", - platform = "cjs-legacy", - run_angular_linker = True, deps = [":test_lib_apf"], ) spec_bundle( name = "test_bundle_invalid_declaration_linker", - linker_unknown_declaration_handling = "ignore", - platform = "node", - run_angular_linker = True, deps = [":test_lib_invalid_linker_declaration"], ) spec_bundle( name = "test_bundle_async_await", external = ["jsdom"], - platform = "node", - run_angular_linker = True, deps = [":test_async_await_lib"], ) -jasmine_node_test( +jasmine_test( name = "test", - deps = [ + data = [ ":test_bundle", ], + fixed_args = [ + "'**/*+(.|_)spec.js'", + ], + node_modules = ":node_modules", ) -jasmine_node_test( +jasmine_test( name = "test_legacy_cjs", - deps = [ + data = [ ":test_bundle_legacy_cjs", ], + fixed_args = [ + "'**/*+(.|_)spec.js'", + ], + node_modules = ":node_modules", ) -jasmine_node_test( +jasmine_test( name = "test_invalid_declaration_linker", - deps = [ + data = [ ":test_bundle_invalid_declaration_linker", ], + fixed_args = [ + "'**/*+(.|_)spec.js'", + ], + node_modules = ":node_modules", ) -jasmine_node_test( +jasmine_test( name = "test_async_await", - deps = [ + data = [ + ":node_modules/jsdom", ":test_bundle_async_await", - "@npm//jsdom", ], + fixed_args = [ + "'**/*+(.|_)spec.js'", + ], + node_modules = ":node_modules", ) diff --git a/bazel/spec-bundling/test/core_apf_esm_test.ts b/bazel/spec-bundling/test/core_apf_esm_test.ts index 24883432f..51d66a878 100644 --- a/bazel/spec-bundling/test/core_apf_esm_test.ts +++ b/bazel/spec-bundling/test/core_apf_esm_test.ts @@ -2,6 +2,7 @@ // consumes devmode CommonJS sources and `rules_nodejs` does not support ESM well yet. import {VERSION} from '@angular/core'; import * as core from '@angular/core'; +import '@angular/compiler'; describe('@angular/core ESM import', () => { it('should work', () => { diff --git a/bazel/spec-bundling/test/core_invalid_linker_decl.spec.ts b/bazel/spec-bundling/test/core_invalid_linker_decl.spec.ts index 47bcb762c..3297329b6 100644 --- a/bazel/spec-bundling/test/core_invalid_linker_decl.spec.ts +++ b/bazel/spec-bundling/test/core_invalid_linker_decl.spec.ts @@ -2,6 +2,7 @@ // consumes devmode CommonJS sources and `rules_nodejs` does not support ESM well yet. import {VERSION} from '@angular/core'; import * as core from '@angular/core'; +import '@angular/compiler'; describe('@angular/core ESM import', () => { it('should work', () => { diff --git a/bazel/spec-bundling/test/package.json b/bazel/spec-bundling/test/package.json index 3dbc1ca59..fcdc2d10f 100644 --- a/bazel/spec-bundling/test/package.json +++ b/bazel/spec-bundling/test/package.json @@ -1,3 +1,16 @@ { + "dependencies": { + "@angular/compiler": "20.1.4", + "@angular/core": "20.1.4", + "@angular/platform-browser-dynamic": "20.1.4", + "@types/jasmine": "5.1.8", + "@types/jsdom": "21.1.7", + "@types/node": "24.2.0", + "jasmine-reporters": "2.5.2", + "jasmine": "5.9.0", + "jsdom": "26.1.0", + "tinyglobby": "0.2.14", + "zone.js": "0.15.1" + }, "type": "module" } diff --git a/bazel/spec-bundling/test/tsconfig.json b/bazel/spec-bundling/test/tsconfig.json new file mode 100644 index 000000000..31977b415 --- /dev/null +++ b/bazel/spec-bundling/test/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "declaration": true, + "strict": true, + "types": ["node", "jasmine"] + } +} diff --git a/tools/jasmine/jasmine.bzl b/tools/jasmine/jasmine.bzl index dbd2d5a99..780e39ec9 100644 --- a/tools/jasmine/jasmine.bzl +++ b/tools/jasmine/jasmine.bzl @@ -1,5 +1,5 @@ load("@npm//@bazel/jasmine:index.bzl", _jasmine_node_test = "jasmine_node_test") -load("//bazel/spec-bundling:index.bzl", "spec_bundle") +load("//tools/jasmine/old-spec-bundling:spec_bundle.bzl", "spec_bundle") def jasmine_node_test(name, specs = [], external = [], bootstrap = ["//tools/jasmine:bootstrap"], **kwargs): templated_args = kwargs.pop("templated_args", []) + [ diff --git a/tools/jasmine/old-spec-bundling/BUILD.bazel b/tools/jasmine/old-spec-bundling/BUILD.bazel new file mode 100644 index 000000000..b61875431 --- /dev/null +++ b/tools/jasmine/old-spec-bundling/BUILD.bazel @@ -0,0 +1 @@ +exports_files(["esbuild.config-tmpl.mjs"]) diff --git a/bazel/spec-bundling/esbuild.config-tmpl.mjs b/tools/jasmine/old-spec-bundling/esbuild.config-tmpl.mjs similarity index 100% rename from bazel/spec-bundling/esbuild.config-tmpl.mjs rename to tools/jasmine/old-spec-bundling/esbuild.config-tmpl.mjs diff --git a/tools/jasmine/old-spec-bundling/spec-entrypoint.bzl b/tools/jasmine/old-spec-bundling/spec-entrypoint.bzl new file mode 100644 index 000000000..f4538fd16 --- /dev/null +++ b/tools/jasmine/old-spec-bundling/spec-entrypoint.bzl @@ -0,0 +1,106 @@ +load("@aspect_rules_js//js:providers.bzl", "JsInfo", "js_info") +load("@rules_nodejs//nodejs:providers.bzl", "JSModuleInfo") + +def _is_non_external_file_with_suffix(file, suffix): + """Gets whether the given file is a non-external file with the given suffix.""" + basename = file.basename + + # External files (from other workspaces) are always skipped. + if (file.short_path.startswith("../")): + return False + + # `.js` or `.mjs` files will be imported in the entry-point. + return basename.endswith("%s.js" % suffix) or \ + basename.endswith("%s.mjs" % suffix) + +def _filter_files(files, filter_suffixes): + """Filters the given list of files to only contain files with the given suffixes.""" + result = [] + for file in files: + for suffix in filter_suffixes: + if _is_non_external_file_with_suffix(file, suffix): + result.append(file) + break + + return result + +def _create_entrypoint_file(base_package, spec_files, bootstrap_files): + """Creates the contents of the spec entry-point ESM file. + + The file will import all individual bootstrap and spec files so that + these are bundled and loaded by NodeJS or the Karma browser.""" + + output = "" + for file in bootstrap_files + spec_files: + base_dir_segments = "/".join([".."] * len(base_package.split("/"))) + output += """import "%s/%s";\n""" % (base_dir_segments, file.short_path) + return output + +def _spec_entrypoint_impl(ctx): + output = ctx.actions.declare_file("%s.mjs" % ctx.attr.name) + spec_all_deps = [] + bootstrap_direct_deps = [] + bootstrap_all_deps = [] + + for dep in ctx.attr.deps: + if JsInfo in dep: + spec_all_deps.append(dep[JsInfo].transitive_sources) + spec_all_deps.append(dep[JsInfo].npm_sources) + elif JSModuleInfo in dep: + spec_all_deps.append(dep[JSModuleInfo].sources) + else: + spec_all_deps.append(dep[DefaultInfo].files) + + for dep in ctx.attr.bootstrap: + if JsInfo in dep: + bootstrap_all_deps.append(dep[JsInfo].transitive_sources) + bootstrap_all_deps.append(dep[JsInfo].npm_sources) + bootstrap_direct_deps.append(dep[JsInfo].sources) + elif JSModuleInfo in dep: + bootstrap_all_deps.append(dep[JSModuleInfo].sources) + bootstrap_direct_deps.append(dep[JSModuleInfo].direct_sources) + else: + bootstrap_all_deps.append(dep[DefaultInfo].files) + bootstrap_direct_deps.append(dep[DefaultInfo].files) + + # Note: `to_list()` is an expensive operation but we need to do this for every + # dependency here in order to be able to filter out spec files from depsets. + all_spec_files = depset(transitive = spec_all_deps).to_list() + spec_files = _filter_files(all_spec_files, ["spec", "test"]) + + # Note: `to_list()` is an expensive operation but we need to do this for every + # dependency here in order to be able to filter out spec files from depsets. + direct_bootstrap_files = depset(transitive = bootstrap_direct_deps).to_list() + + # Filter to only js and mjs files, we can't always define what the name of the files + # needed for bootstrapping are so we rely on the user to provide the exact list. + bootstrap_files = _filter_files(direct_bootstrap_files, [""]) + + ctx.actions.write( + output = output, + content = _create_entrypoint_file(ctx.label.package, spec_files, bootstrap_files), + ) + + out_depset = depset([output]) + transitive_deps = depset(transitive = [out_depset] + spec_all_deps + bootstrap_all_deps) + + return [ + DefaultInfo(files = out_depset), + js_info( + target = ctx.label, + sources = out_depset, + transitive_sources = transitive_deps, + ), + JSModuleInfo( + direct_sources = out_depset, + sources = transitive_deps, + ), + ] + +spec_entrypoint = rule( + implementation = _spec_entrypoint_impl, + attrs = { + "deps": attr.label_list(allow_files = True, mandatory = True), + "bootstrap": attr.label_list(allow_files = True, mandatory = True), + }, +) diff --git a/bazel/spec-bundling/spec-bundle.bzl b/tools/jasmine/old-spec-bundling/spec_bundle.bzl similarity index 68% rename from bazel/spec-bundling/spec-bundle.bzl rename to tools/jasmine/old-spec-bundling/spec_bundle.bzl index 8b82b3a9b..aac702e9a 100644 --- a/bazel/spec-bundling/spec-bundle.bzl +++ b/tools/jasmine/old-spec-bundling/spec_bundle.bzl @@ -1,7 +1,6 @@ load("@build_bazel_rules_nodejs//:index.bzl", "js_library") load("//bazel/esbuild:index.bzl", "esbuild", "esbuild_amd", "esbuild_config", "esbuild_esm_bundle") -load("//bazel/spec-bundling:bundle-config.bzl", "spec_bundle_config_file") -load("//bazel/spec-bundling:spec-entrypoint.bzl", "spec_entrypoint") +load("//tools/jasmine/old-spec-bundling:spec-entrypoint.bzl", "spec_entrypoint") def spec_bundle( name, @@ -16,11 +15,9 @@ def spec_bundle( external = [], workspace_name = None): """Macro that will bundle all test files with their respective transitive dependencies. - Bundled specs end up in a single bundle file that can be loaded within Karma or NodeJS directly. This is helpful as Angular framework packages do not ship UMD files and to avoid overall complexity with maintaining a runtime loader such as RequireJS or SystemJS. - Args: name: Name of the spec bundle target deps: Targets that contain all spec files. Files ending with `spec.js` @@ -110,3 +107,47 @@ def spec_bundle( testonly = True, named_module_srcs = [":%s_bundle" % name], ) + +def _spec_bundle_config_file_impl(ctx): + run_angular_linker = ctx.attr.run_angular_linker + downlevel_async_await = ctx.attr.downlevel_async_await + linker_unknown_declaration_handling = ctx.attr.linker_unknown_declaration_handling + + ctx.actions.expand_template( + template = ctx.file._template, + output = ctx.outputs.output_name, + substitutions = { + "TMPL_RUN_LINKER": "true" if run_angular_linker else "false", + "TMPL_DOWNLEVEL_ASYNC_AWAIT": "true" if downlevel_async_await else "false", + "TMPL_LINKER_UNKNOWN_DECLARATION_HANDLING": ("'%s'" % linker_unknown_declaration_handling) if linker_unknown_declaration_handling else "undefined", + }, + ) + +spec_bundle_config_file = rule( + implementation = _spec_bundle_config_file_impl, + doc = "Generates an ESBuild configuration file for bundling specs", + attrs = { + "run_angular_linker": attr.bool( + doc = "Whether the Angular linker should process all files.", + default = False, + ), + "downlevel_async_await": attr.bool( + doc = "Whether to downlevel async/await syntax.", + default = True, + ), + "output_name": attr.output( + mandatory = True, + doc = "Name of the file where the config should be written to.", + ), + "linker_unknown_declaration_handling": attr.string( + values = ["ignore", "warn", "error"], + doc = """Controls how unknown declaration versions should be handled by the Angular linker. + https://github.com/angular/angular/blob/f94c6f433dba3924b79f137cfcc49d2dfd4d679c/packages/compiler-cli/linker/src/file_linker/linker_options.ts#L27-L39. + """, + ), + "_template": attr.label( + allow_single_file = True, + default = "//tools/jasmine/old-spec-bundling:esbuild.config-tmpl.mjs", + ), + }, +)