diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 048e097c15c..7e82376dc95 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -5,6 +5,11 @@ inputs: description: 'Whether to use the lockfile vs latest floating dependencies' required: false default: true + + node-version: + description: 'The node version to use' + required: false + default: 18 runs: using: 'composite' steps: @@ -15,7 +20,7 @@ runs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: '${{ inputs.node-version }}' registry-url: 'https://registry.npmjs.org' cache: pnpm - uses: actions/cache@v4 diff --git a/.github/workflows/size-comment.yml b/.github/workflows/size-comment.yml index 43a8fcea5dd..e6f47d61c56 100644 --- a/.github/workflows/size-comment.yml +++ b/.github/workflows/size-comment.yml @@ -27,9 +27,6 @@ jobs: runs-on: 'ubuntu-latest' steps: - # better `du` - - run: sudo snap install dust - - uses: dawidd6/action-download-artifact@v9 with: run_id: ${{ inputs.RUN_ID || github.event.workflow_run.id }} @@ -67,7 +64,7 @@ jobs: echo $contents echo "prNumber=$contents" >> $GITHUB_OUTPUT - - name: "[PR] Get sizes for development outputs" + - name: "[PR] Get sizes" id: dev run: | cat ${{ steps.find-pr-txt.outputs.txtPath }} @@ -77,7 +74,7 @@ jobs: done <<< $(cat ${{ steps.find-pr-txt.outputs.txtPath }}) echo 'EOF' >> $GITHUB_OUTPUT - - name: "[Main] Get sizes for development outputs" + - name: "[Main] Get sizes" id: main-dev run: | cd main/ @@ -89,13 +86,13 @@ jobs: done <<< $(cat out.txt) echo 'EOF' >> $GITHUB_OUTPUT - - name: "[Dev] calculate diff" + - name: "calculate diff" run: | # diff exits with status 1 if there is a diff diff -u main/out.txt ${{ steps.find-pr-txt.outputs.txtPath }} > dev-diff.txt || echo "Differences exist" cat dev-diff.txt - - name: "[Dev] store diff in GITHUB_OUTPUT" + - name: "store diff in GITHUB_OUTPUT" id: dev-diff run: | echo 'diffText<> $GITHUB_OUTPUT @@ -106,7 +103,7 @@ jobs: - - name: "[Debug] collected data from artifacts" + - name: "collected data from artifacts" run: | echo "PR number" echo -e "${{ steps.find-pr-number.outputs.prNumber }}" @@ -124,20 +121,16 @@ jobs: ######################### # Intended Layout: # - # | | This PR | Main | - # | Dev | x1 | y1 | - # | Prod | x2 | y2 | - # - # NOTE: we we don't have a prod build for this library - # because we currently expect non-compiler usage - # (so consumers should have terser or similar properly configured for DCE) + # | This PR | Main | + # | x1 | y1 | + # | x2 | y2 | # ######################### - uses: mshick/add-pr-comment@v2 with: issue: ${{ steps.find-pr-number.outputs.prNumber }} message: | -
Development Assets +
Estimated Asset Sizes Diff @@ -147,9 +140,9 @@ jobs: Details - +
This PRmain
-
This PRmain
Dev +
``` ${{ steps.dev.outputs.sizes }} diff --git a/.github/workflows/size-main.yml b/.github/workflows/size-main.yml index b0279709489..0f41588a8ba 100644 --- a/.github/workflows/size-main.yml +++ b/.github/workflows/size-main.yml @@ -13,22 +13,15 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup - - run: sudo snap install dust + with: + node-version: 22 - run: pnpm build - - name: "Get sizes for development outputs" + - name: "Get estimated sizes for production outputs" id: main-dev run: | mkdir -p main - cd dist/packages - dust --ignore_hidden \ - --reverse --apparent-size \ - --no-percent-bars \ - --only-dir \ - --depth 20 \ - > out.txt - cp out.txt ../../main/ - + node ./bin/minify-assets.mjs > ./main/out.txt - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/size-pr.yml b/.github/workflows/size-pr.yml index 20f6da2af2d..c193fd28f1a 100644 --- a/.github/workflows/size-pr.yml +++ b/.github/workflows/size-pr.yml @@ -18,25 +18,18 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup + with: + node-version: 22 - run: pnpm build - - run: sudo snap install dust - name: Save PR number run: | mkdir -p ./pr echo "${{ github.event.number }}" > ./pr/NR - - name: "Get sizes for development outputs" + - name: "Get estimated sizes for production outputs" id: dev - run: | - cd dist/packages - dust --ignore_hidden \ - --reverse --apparent-size \ - --no-percent-bars \ - --only-dir \ - --depth 20 \ - > out.txt - cp out.txt ../../pr/ + run: node ./bin/minify-assets.mjs > ./pr/out.txt - uses: actions/upload-artifact@v4 diff --git a/bin/minify-assets.mjs b/bin/minify-assets.mjs new file mode 100644 index 00000000000..988856932b9 --- /dev/null +++ b/bin/minify-assets.mjs @@ -0,0 +1,219 @@ +const packages = [ + '@ember/-internals', + '@ember/application', + '@ember/array', + '@ember/canary-features', + '@ember/component', + '@ember/controller', + '@ember/debug', + '@ember/deprecated-features', + '@ember/destroyable', + '@ember/enumerable', + '@ember/helper', + '@ember/instrumentation', + '@ember/modifier', + '@ember/object', + '@ember/owner', + '@ember/renderer', + '@ember/routing', + '@ember/runloop', + '@ember/service', + '@ember/template', + '@ember/template-compilation', + '@ember/template-compiler', + '@ember/template-factory', + '@ember/test', + '@ember/utils', + '@ember/version', + '@glimmer/destroyable', + '@glimmer/encoder', + '@glimmer/env', + '@glimmer/global-context', + '@glimmer/manager', + '@glimmer/node', + '@glimmer/opcode-compiler', + '@glimmer/owner', + '@glimmer/program', + '@glimmer/reference', + '@glimmer/runtime', + '@glimmer/tracking', + '@glimmer/util', + '@glimmer/validator', + '@glimmer/vm', + '@glimmer/wire-format', +]; +import glob from 'glob'; +import nodeGzip from 'node-gzip'; + +import { join } from 'node:path'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { minify } from 'terser'; +import { transformSync } from '@babel/core'; +import * as brotli from 'brotli'; +import { partial } from 'filesize'; +const size = partial({ standard: 'jedec' }); + +const root = join(process.cwd(), 'dist/packages'); + +let min = {}; +let br = {}; +let gzip = {}; + +let packageData = { + ember: [ + /* pkg, min, gz, br */ + ], + glimmer: [], +}; + +function totalMin(dataset) { + return dataset.reduce((a, b) => a + b[1], 0); +} + +function totalGz(dataset) { + return dataset.reduce((a, b) => a + b[2], 0); +} + +function totalBr(dataset) { + return dataset.reduce((a, b) => a + b[3], 0); +} + +import { buildMacros } from '@embroider/macros/babel'; + +process.env.NODE_ENV = 'production'; +process.env.EMBER_ENV = 'production'; + +const macros = buildMacros(); +let babelOptions = { + cwd: process.cwd(), + plugins: [...macros.babelMacros], +}; + +for (const pkg of packages) { + let jsFiles = glob.sync(`${root}/${pkg}/**/*.js`); + + for (let file of jsFiles) { + let source = readFileSync(file, 'utf8'); + let transformed = transformSync(source, { + ...babelOptions, + filename: file, + }).code; + let result = await minify(transformed, { + module: true, + mangle: false, + ecma: 2021, + compress: { + ecma: 2021, + passes: 3, + defaults: true, + keep_fargs: false, + keep_fnames: false, + /** + * Required for {{debugger}} to work + */ + drop_debugger: false, + }, + }); + + let minFileName = file + '.min'; + writeFileSync(minFileName, result.code); + + let compressed = brotli.compress(result.code, { + // mode: 1, // 0 = generic, 1 = text, 2 = font (WOFF2) + quality: 11, // 0 - 11 + // lgwin: 22, // window size + }); + + // console.log(brotli.decompress(brotli.compress(result.code)).length, result.code.length); + + let compressedFileName = minFileName + '.br'; + writeFileSync(compressedFileName, compressed); + + let gzipFileName = minFileName + '.gz'; + let gzipCompressed = (await nodeGzip.gzip(result.code)).toString(); + writeFileSync(gzipFileName, gzipCompressed); + + let minSize = new Blob([result.code]).size; + let brSize = new Blob([compressed.toString()]).size; + let gzSize = new Blob([gzipCompressed]).size; + + min[pkg] = min[pkg] || 0; + min[pkg] += minSize; + + br[pkg] = br[pkg] || 0; + br[pkg] += brSize; + + gzip[pkg] = gzip[pkg] || 0; + gzip[pkg] += gzSize; + } +} + +import { table } from 'table'; + +function printTable(data) { + // eslint-disable-next-line no-console + console.info( + table(data, { + drawHorizontalLine: (lineIndex, rowCount) => { + return lineIndex === 0 || lineIndex === 1 || lineIndex === 2 || lineIndex === rowCount; + }, + }) + ); +} + +printTable([ + ['', 'Min', 'Gzip' /* 'Brotli' */], + [ + 'Total', + size(Object.values(min).reduce((a, b) => a + b, 0)), + size(Object.values(gzip).reduce((a, b) => a + b, 0)), + // size(Object.values(br).reduce((a, b) => a + b, 0)), + ], +]); + +for (const pkg of packages.filter((p) => p.startsWith('@ember'))) { + let minSize = min[pkg]; + let brSize = br[pkg]; + let gzSize = gzip[pkg]; + + packageData.ember.push([pkg, minSize, gzSize, brSize]); +} +for (const pkg of packages.filter((p) => p.startsWith('@glimmer'))) { + let minSize = min[pkg]; + let brSize = br[pkg]; + let gzSize = gzip[pkg]; + + packageData.glimmer.push([pkg, minSize, gzSize, brSize]); +} + +printTable([ + ['@ember/*', 'Min', 'Gzip' /* 'Brotli' */], + [ + 'Total', + size(totalMin(packageData.ember)), + size(totalGz(packageData.ember)), + // size(totalBr(packageData.ember)), + ], + ...packageData.ember.map((x) => [ + x[0].replace('@ember/', ''), + size(x[1]), + size(x[2]), + // size(x[3]), + ]), +]); + +printTable([ + ['@glimmer/*', 'Min', 'Gzip' /* 'Brotli' */], + [ + 'Total', + size(totalMin(packageData.glimmer)), + size(totalGz(packageData.glimmer)), + // size(totalBr(packageData.glimmer)), + ], + ...packageData.glimmer.map((x) => [ + x[0].replace('@glimmer/', ''), + size(x[1]), + size(x[2]), + // size(x[3]), + ]), +]); diff --git a/package.json b/package.json index 85399423207..17dea3a38a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-source", - "version": "6.7.0-alpha.1", + "version": "6.7.0-alpha.1.nvp-asset-sizes+ad603139", "description": "A JavaScript framework for creating ambitious web applications", "keywords": [ "ember-addon" @@ -111,6 +111,7 @@ "@babel/plugin-transform-typescript": "^7.22.9", "@babel/preset-env": "^7.16.11", "@babel/types": "^7.22.5", + "@embroider/macros": "^1.18.0", "@embroider/shared-internals": "^2.5.0", "@eslint/js": "^9.21.0", "@glimmer/component": "workspace:^", @@ -125,6 +126,7 @@ "auto-dist-tag": "^2.1.1", "babel-plugin-debug-macros": "1.0.0", "babel-plugin-ember-template-compilation": "^2.1.1", + "brotli": "^1.3.3", "dag-map": "^2.0.2", "decorator-transforms": "2.0.0", "ember-cli": "^6.3.0", @@ -141,6 +143,7 @@ "eslint-plugin-qunit": "^8.1.2", "execa": "^5.1.1", "expect-type": "^0.15.0", + "filesize": "^10.1.6", "finalhandler": "^1.1.2", "fs-extra": "^11.1.1", "git-repo-info": "^2.1.1", @@ -149,6 +152,7 @@ "globals": "^16.0.0", "html-differ": "^1.4.0", "mocha": "^10.2.0", + "node-gzip": "^1.1.2", "npm-run-all2": "^6.0.6", "prettier": "^3.5.3", "puppeteer": "^24.2.0", @@ -159,6 +163,8 @@ "rsvp": "^4.8.5", "serve-static": "^1.14.2", "simple-dom": "^1.4.0", + "table": "^6.9.0", + "terser": "^5.42.0", "testem": "^3.10.1", "testem-failure-only-reporter": "^1.0.0", "typescript": "5.1", @@ -395,5 +401,10 @@ ] } }, - "packageManager": "pnpm@10.5.0" + "packageManager": "pnpm@10.5.0", + "_originalVersion": "6.7.0-alpha.1", + "_versionPreviouslyCalculated": true, + "publishConfig": { + "tag": "alpha" + } } \ No newline at end of file diff --git a/packages/@ember/object/index.ts b/packages/@ember/object/index.ts index 58325bcf278..bffe3cd74e4 100644 --- a/packages/@ember/object/index.ts +++ b/packages/@ember/object/index.ts @@ -39,12 +39,7 @@ export { */ // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface EmberObject extends Observable {} -class EmberObject extends CoreObject.extend(Observable) { - get _debugContainerKey() { - let factory = getFactoryFor(this); - return factory !== undefined && factory.fullName; - } -} +class EmberObject extends CoreObject.extend(Observable) {} export default EmberObject; @@ -266,46 +261,4 @@ export function observer( ...args: | [propertyName: string, ...additionalPropertyNames: string[], func: T] | [ObserverDefinition] -): T { - let funcOrDef = args.pop(); - - assert( - 'observer must be provided a function or an observer definition', - typeof funcOrDef === 'function' || (typeof funcOrDef === 'object' && funcOrDef !== null) - ); - - let func: T; - let dependentKeys: string[]; - let sync: boolean; - - if (typeof funcOrDef === 'function') { - func = funcOrDef; - dependentKeys = args as string[]; - sync = !ENV._DEFAULT_ASYNC_OBSERVERS; - } else { - func = funcOrDef.fn; - dependentKeys = funcOrDef.dependentKeys; - sync = funcOrDef.sync; - } - - assert('observer called without a function', typeof func === 'function'); - assert( - 'observer called without valid path', - Array.isArray(dependentKeys) && - dependentKeys.length > 0 && - dependentKeys.every((p) => typeof p === 'string' && Boolean(p.length)) - ); - assert('observer called without sync', typeof sync === 'boolean'); - - let paths: string[] = []; - - for (let dependentKey of dependentKeys) { - expandProperties(dependentKey, (path: string) => paths.push(path)); - } - - setObservers(func as Function, { - paths, - sync, - }); - return func; -} +): T {} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21e3f3e0e18..64d5a708e7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -145,6 +145,9 @@ importers: '@babel/types': specifier: ^7.22.5 version: 7.26.9 + '@embroider/macros': + specifier: ^1.18.0 + version: 1.18.0 '@embroider/shared-internals': specifier: ^2.5.0 version: 2.9.0(supports-color@8.1.1) @@ -187,6 +190,9 @@ importers: babel-plugin-ember-template-compilation: specifier: ^2.1.1 version: 2.3.0 + brotli: + specifier: ^1.3.3 + version: 1.3.3 dag-map: specifier: ^2.0.2 version: 2.0.2 @@ -235,6 +241,9 @@ importers: expect-type: specifier: ^0.15.0 version: 0.15.0 + filesize: + specifier: ^10.1.6 + version: 10.1.6 finalhandler: specifier: ^1.1.2 version: 1.3.1 @@ -259,6 +268,9 @@ importers: mocha: specifier: ^10.2.0 version: 10.8.2 + node-gzip: + specifier: ^1.1.2 + version: 1.1.2 npm-run-all2: specifier: ^6.0.6 version: 6.2.6 @@ -289,6 +301,12 @@ importers: simple-dom: specifier: ^1.4.0 version: 1.4.0 + table: + specifier: ^6.9.0 + version: 6.9.0 + terser: + specifier: ^5.42.0 + version: 5.42.0 testem: specifier: ^3.10.1 version: 3.15.2(handlebars@4.7.8)(underscore@1.13.7) @@ -303,7 +321,7 @@ importers: version: 8.26.0(eslint@9.21.0)(typescript@5.1.6) vite: specifier: ^5.4.12 - version: 5.4.14(@types/node@20.17.19)(terser@5.39.0) + version: 5.4.14(@types/node@20.17.19)(terser@5.42.0) packages/@ember/-internals: dependencies: @@ -2808,8 +2826,8 @@ packages: '@embroider/core': ^3.4.0 webpack: ^5 - '@embroider/macros@1.16.11': - resolution: {integrity: sha512-TUm/74oBr+tWto0IPAht1g6zjpP7UK0aQdnFHHqGvDPc+tAROQb9jKI/ePEuKAdBCV3L7XvvC4Rlf0DNvT4qmw==} + '@embroider/macros@1.16.13': + resolution: {integrity: sha512-2oGZh0m1byBYQFWEa8b2cvHJB2LzaF3DdMCLCqcRAccABMROt1G3sultnNCT30NhfdGWMEsJOT3Jm4nFxXmTRw==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: '@glint/template': ^1.0.0 @@ -2817,8 +2835,8 @@ packages: '@glint/template': optional: true - '@embroider/macros@1.16.13': - resolution: {integrity: sha512-2oGZh0m1byBYQFWEa8b2cvHJB2LzaF3DdMCLCqcRAccABMROt1G3sultnNCT30NhfdGWMEsJOT3Jm4nFxXmTRw==} + '@embroider/macros@1.18.0': + resolution: {integrity: sha512-KanP80XxNK4bmQ1HKTcUjy/cdCt9n7knPMLK1vzHdOFymACHo+GbhgUjXjYdOCuBTv+ZwcjL2P2XDmBcYS9r8g==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: '@glint/template': ^1.0.0 @@ -2830,6 +2848,10 @@ packages: resolution: {integrity: sha512-8untWEvGy6av/oYibqZWMz/yB+LHsKxEOoUZiLvcpFwWj2Sipc0DcXeTJQZQZ++otNkLCWyDrDhOLrOkgjOPSg==} engines: {node: 12.* || 14.* || >= 16} + '@embroider/shared-internals@3.0.0': + resolution: {integrity: sha512-5J5ipUMCAinQS38WW7wedruq5Z4VnHvNo+ZgOduw0PtI9w0CQWx7/HE+98PBDW8jclikeF+aHwF317vc1hwuzg==} + engines: {node: 12.* || 14.* || >= 16} + '@embroider/test-setup@4.0.0': resolution: {integrity: sha512-1S3Ebk0CEh3XDqD93AWSwQZBCk+oGv03gtkaGgdgyXGIR7jrVyDgEnEuslN/hJ0cuU8TqhiXrzHMw7bJwIGhWw==} engines: {node: 12.* || 14.* || >= 16} @@ -4509,6 +4531,10 @@ packages: resolution: {integrity: sha512-4YNPkuVsxAW5lnSTa6cn4Wk49RX6GAB6vX+M6LqEtN0YePqoFczv1/x0EyLK/o+4E1j9jEuYj5Su7IEPab5JHQ==} engines: {node: '>= 12.*'} + babel-import-util@3.0.1: + resolution: {integrity: sha512-2copPaWQFUrzooJVIVZA/Oppx/S/KOoZ4Uhr+XWEQDMZ8Rvq/0SNQpbdIyMBJ8IELWt10dewuJw+tX4XjOo7Rg==} + engines: {node: '>= 12.*'} + babel-loader@8.4.1: resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} engines: {node: '>= 8.9'} @@ -4855,6 +4881,9 @@ packages: resolution: {integrity: sha512-sWi3b3fTUSVPDsz5KsQ5eCQNVAtLgkIE/HYFkEZXR/07clqmd4E/gFiuwSaqa9b+QTXc1Uemfb7TVWbEIURWDg==} engines: {node: 8.* || >= 10.*} + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -7622,6 +7651,9 @@ packages: lodash.templatesettings@4.2.0: resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -7974,6 +8006,9 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-gzip@1.1.2: + resolution: {integrity: sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==} + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -9125,6 +9160,10 @@ packages: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -9435,6 +9474,10 @@ packages: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + tap-parser@7.0.0: resolution: {integrity: sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==} hasBin: true @@ -9478,6 +9521,11 @@ packages: engines: {node: '>=10'} hasBin: true + terser@5.42.0: + resolution: {integrity: sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==} + engines: {node: '>=10'} + hasBin: true + testdouble@3.20.2: resolution: {integrity: sha512-790e9vJKdfddWNOaxW1/V9FcMk48cPEl3eJSj2i8Hh1fX89qArEJ6cp3DBnaECpGXc3xKJVWbc1jeNlWYWgiMg==} engines: {node: '>= 16'} @@ -11446,7 +11494,7 @@ snapshots: '@ember-data/request-utils': 5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-cli-path-utils: 1.0.0 @@ -11463,7 +11511,7 @@ snapshots: '@ember-data/request-utils': 5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-source: 'link:' @@ -11474,7 +11522,7 @@ snapshots: '@ember-data/graph@5.3.11(@ember-data/store@5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@)': dependencies: '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-source: 'link:' @@ -11487,7 +11535,7 @@ snapshots: '@ember-data/graph': 5.3.11(@ember-data/store@5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/request-utils': 5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 transitivePeerDependencies: @@ -11500,7 +11548,7 @@ snapshots: '@ember-data/request-utils': 5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-source: 'link:' @@ -11518,7 +11566,7 @@ snapshots: '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/tracking': 5.3.11(@warp-drive/core-types@0.0.1)(ember-source@) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-cli-string-utils: 1.1.0 @@ -11534,7 +11582,7 @@ snapshots: '@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@)': dependencies: - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-source: 'link:' @@ -11547,7 +11595,7 @@ snapshots: '@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1)': dependencies: '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 transitivePeerDependencies: @@ -11562,7 +11610,7 @@ snapshots: '@ember-data/request-utils': 5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-cli-path-utils: 1.0.0 @@ -11578,7 +11626,7 @@ snapshots: '@ember-data/request': 5.3.11(@warp-drive/core-types@0.0.1) '@ember-data/request-utils': 5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/tracking': 5.3.11(@warp-drive/core-types@0.0.1)(ember-source@) - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-source: 'link:' @@ -11588,7 +11636,7 @@ snapshots: '@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@)': dependencies: - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-source: 'link:' @@ -11618,7 +11666,7 @@ snapshots: '@ember/test-helpers@3.3.1(@babel/core@7.26.9)(ember-source@)(webpack@5.98.0)': dependencies: '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@simple-dom/interface': 1.4.0 broccoli-debug: 0.6.5 broccoli-funnel: 3.0.8 @@ -11768,7 +11816,7 @@ snapshots: webpack: 5.98.0 optional: true - '@embroider/macros@1.16.11': + '@embroider/macros@1.16.13': dependencies: '@embroider/shared-internals': 2.9.0(supports-color@8.1.1) assert-never: 1.4.0 @@ -11781,11 +11829,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/macros@1.16.13': + '@embroider/macros@1.18.0': dependencies: - '@embroider/shared-internals': 2.9.0(supports-color@8.1.1) + '@embroider/shared-internals': 3.0.0 assert-never: 1.4.0 - babel-import-util: 2.1.1 + babel-import-util: 3.0.1 ember-cli-babel: 7.26.11 find-up: 5.0.0 lodash: 4.17.21 @@ -11811,6 +11859,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@embroider/shared-internals@3.0.0': + dependencies: + babel-import-util: 3.0.1 + debug: 4.4.0(supports-color@8.1.1) + ember-rfc176-data: 0.3.18 + fs-extra: 9.1.0 + is-subdir: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + minimatch: 3.1.2 + pkg-entry-points: 1.1.1 + resolve-package-path: 4.0.3 + resolve.exports: 2.0.3 + semver: 7.7.1 + typescript-memoize: 1.1.1 + transitivePeerDependencies: + - supports-color + '@embroider/test-setup@4.0.0(@embroider/compat@3.9.0(@embroider/core@3.5.6))(@embroider/core@3.5.6)(@embroider/webpack@4.1.0(@embroider/core@3.5.6)(webpack@5.98.0))': dependencies: lodash: 4.17.21 @@ -13437,7 +13503,7 @@ snapshots: '@warp-drive/build-config@0.0.1': dependencies: '@embroider/addon-shim': 1.9.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 babel-import-util: 2.1.1 broccoli-funnel: 3.0.8 semver: 7.7.1 @@ -13447,7 +13513,7 @@ snapshots: '@warp-drive/core-types@0.0.1': dependencies: - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 transitivePeerDependencies: - '@glint/template' @@ -13855,6 +13921,8 @@ snapshots: babel-import-util@3.0.0: {} + babel-import-util@3.0.1: {} + babel-loader@8.4.1(@babel/core@7.26.9)(webpack@5.98.0(@swc/core@1.11.1)): dependencies: '@babel/core': 7.26.9(supports-color@8.1.1) @@ -14557,6 +14625,10 @@ snapshots: transitivePeerDependencies: - supports-color + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + browser-stdout@1.3.1: {} browserslist@4.24.4: @@ -15289,7 +15361,7 @@ snapshots: '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.9) '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.9)(supports-color@8.1.1) '@babel/preset-env': 7.26.9(@babel/core@7.26.9)(supports-color@8.1.1) - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@embroider/shared-internals': 2.9.0(supports-color@8.1.1) babel-loader: 8.4.1(@babel/core@7.26.9)(webpack@5.98.0) babel-plugin-ember-modules-api-polyfill: 3.5.0 @@ -15883,7 +15955,7 @@ snapshots: '@ember-data/store': 5.3.11(@ember-data/request-utils@5.3.11(@ember/string@3.1.1)(@warp-drive/core-types@0.0.1)(ember-source@))(@ember-data/request@5.3.11(@warp-drive/core-types@0.0.1))(@ember-data/tracking@5.3.11(@warp-drive/core-types@0.0.1)(ember-source@))(@warp-drive/core-types@0.0.1)(ember-source@) '@ember-data/tracking': 5.3.11(@warp-drive/core-types@0.0.1)(ember-source@) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 '@warp-drive/build-config': 0.0.1 '@warp-drive/core-types': 0.0.1 ember-source: 'link:' @@ -15932,7 +16004,7 @@ snapshots: dependencies: '@ember/test-helpers': 3.3.1(@babel/core@7.26.9)(ember-source@)(webpack@5.98.0) '@embroider/addon-shim': 1.9.0 - '@embroider/macros': 1.16.11 + '@embroider/macros': 1.16.13 ember-cli-test-loader: 3.1.0 ember-source: 'link:' qunit: 2.24.1 @@ -18129,6 +18201,8 @@ snapshots: dependencies: lodash._reinterpolate: 3.0.0 + lodash.truncate@4.4.2: {} + lodash.uniq@4.5.0: {} lodash@4.17.21: {} @@ -18515,6 +18589,8 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-gzip@1.1.2: {} + node-int64@0.4.0: {} node-notifier@10.0.1: @@ -19770,6 +19846,12 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + smart-buffer@4.2.0: {} snake-case@3.0.4: @@ -20149,6 +20231,14 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.8.1 + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tap-parser@7.0.0: dependencies: events-to-array: 1.1.2 @@ -20209,6 +20299,13 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + terser@5.42.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + testdouble@3.20.2: dependencies: lodash: 4.17.21 @@ -20728,7 +20825,7 @@ snapshots: vary@1.1.2: {} - vite@5.4.14(@types/node@20.17.19)(terser@5.39.0): + vite@5.4.14(@types/node@20.17.19)(terser@5.42.0): dependencies: esbuild: 0.21.5 postcss: 8.5.3 @@ -20736,7 +20833,7 @@ snapshots: optionalDependencies: '@types/node': 20.17.19 fsevents: 2.3.3 - terser: 5.39.0 + terser: 5.42.0 vow-fs@0.3.6: dependencies: