From 1f2084d55c939f2c338e307ed9de79e1adb90164 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Mon, 16 Oct 2023 19:00:00 +0200 Subject: [PATCH] Remove unused "fastboot" code Ember.js "fastboot" allows us to server-render the app and send HTML over the wire. While this sounds good in theory, using it in practice has shown that it requires significantly more server-side resources and causes a lot of additional complexity. This part of the codebase hasn't been used for years and if we would move to server-side rendering then it probably would be combined with moving to a different framework/architecture. Thus it is time for the fastboot code and complexity to be removed from the codebase. --- .eslintrc.js | 1 - app/adapters/application.js | 11 - app/app.js | 8 +- app/controllers/index.js | 5 +- app/initializers/hashchange.js | 4 - app/routes/index.js | 8 +- app/services/design.js | 4 +- app/services/fetcher.js | 31 --- app/services/redirector.js | 12 +- config/environment.js | 4 - config/nginx.conf.erb | 31 +-- fastboot.js | 70 ----- package.json | 10 +- pnpm-lock.yaml | 480 +++++---------------------------- script/ember.sh | 12 - script/start-web.sh | 10 +- src/app.rs | 9 - src/bin/server.rs | 6 +- src/config/server.rs | 3 - src/middleware/ember_html.rs | 90 ++----- src/tests/util/test_app.rs | 1 - 21 files changed, 112 insertions(+), 698 deletions(-) delete mode 100644 app/services/fetcher.js delete mode 100644 fastboot.js delete mode 100755 script/ember.sh diff --git a/.eslintrc.js b/.eslintrc.js index 0e999aaf664..171138c10ef 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -114,7 +114,6 @@ module.exports = { '.eslintrc.js', '.template-lintrc.js', 'ember-cli-build.js', - 'fastboot.js', 'testem.js', 'blueprints/*/index.js', 'config/**/*.js', diff --git a/app/adapters/application.js b/app/adapters/application.js index 0988865e0f1..508db496b46 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -1,19 +1,8 @@ import RESTAdapter from '@ember-data/adapter/rest'; -import { inject as service } from '@ember/service'; export default class ApplicationAdapter extends RESTAdapter { - @service fastboot; - namespace = 'api/v1'; - get headers() { - if (this.fastboot.isFastBoot) { - return { 'User-Agent': this.fastboot.request.headers.get('User-Agent') }; - } - - return {}; - } - handleResponse(status, headers, payload, requestData) { if (typeof payload === 'string') { try { diff --git a/app/app.js b/app/app.js index e45e8400e94..f38b750bc48 100644 --- a/app/app.js +++ b/app/app.js @@ -6,11 +6,9 @@ import Resolver from 'ember-resolver'; import config from './config/environment'; import * as Sentry from './sentry'; -if (typeof FastBoot === 'undefined') { - // eslint-disable-next-line unicorn/prefer-add-event-listener - window.onerror = undefined; - Sentry.init(); -} +// eslint-disable-next-line unicorn/prefer-add-event-listener +window.onerror = undefined; +Sentry.init(); export default class App extends Application { modulePrefix = config.modulePrefix; diff --git a/app/controllers/index.js b/app/controllers/index.js index b7553fbf128..3fe3864eb46 100644 --- a/app/controllers/index.js +++ b/app/controllers/index.js @@ -5,8 +5,9 @@ import { inject as service } from '@ember/service'; import { dropTask } from 'ember-concurrency'; import { reads } from 'macro-decorators'; +import ajax from '../utils/ajax'; + export default class IndexController extends Controller { - @service fetcher; @service store; @reads('dataTask.lastSuccessful.value') model; @@ -22,7 +23,7 @@ export default class IndexController extends Controller { } dataTask = dropTask(async () => { - let data = await this.fetcher.ajax('/api/v1/summary'); + let data = await ajax('/api/v1/summary'); addCrates(this.store, data.new_crates); addCrates(this.store, data.most_downloaded); diff --git a/app/initializers/hashchange.js b/app/initializers/hashchange.js index dc378302cef..d59f6946fd8 100644 --- a/app/initializers/hashchange.js +++ b/app/initializers/hashchange.js @@ -32,10 +32,6 @@ function hashchange() { } export function initialize() { - if (typeof window === 'undefined' || window.addEventListener === undefined) { - // Don't run this initializer under FastBoot - return; - } window.addEventListener('hashchange', hashchange); // If clicking on a link to the same fragment as currently in the address bar, diff --git a/app/routes/index.js b/app/routes/index.js index 91a76fe4d23..886aec744f6 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -1,15 +1,9 @@ import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; export default class IndexRoute extends Route { - @service fastboot; - setupController(controller) { if (!controller.hasData) { - let promise = controller.fetchData(); - if (this.fastboot.isFastBoot) { - this.fastboot.deferRendering(promise); - } + controller.fetchData(); } } } diff --git a/app/services/design.js b/app/services/design.js index ca9df2a51e9..633cffd06cb 100644 --- a/app/services/design.js +++ b/app/services/design.js @@ -1,4 +1,4 @@ -import Service, { inject as service } from '@ember/service'; +import Service from '@ember/service'; import { tracked } from '@glimmer/tracking'; import config from '../config/environment'; @@ -7,8 +7,6 @@ import * as localStorage from '../utils/local-storage'; const KNOWN_THEMES = new Set(['classic', 'new-design']); export default class DesignService extends Service { - @service fastboot; - @tracked _theme = localStorage.getItem('theme'); @tracked showToggleButton = config.environment === 'development' || config.environment === 'test'; diff --git a/app/services/fetcher.js b/app/services/fetcher.js deleted file mode 100644 index cf472ab11d4..00000000000 --- a/app/services/fetcher.js +++ /dev/null @@ -1,31 +0,0 @@ -import Service, { inject as service } from '@ember/service'; - -import ajax from '../utils/ajax'; - -export default class FetcherService extends Service { - @service fastboot; - - async ajax(url) { - let fastboot = this.fastboot; - let shoebox = this.fastboot.shoebox; - let cache = shoebox.retrieve('ajax-cache'); - if (!cache) { - cache = {}; - } - - if (cache[url]) { - return cache[url]; - } - - let resp = await ajax(url); - if (shoebox && fastboot.isFastBoot) { - cache[url] = deepCopy(resp); - shoebox.put('ajax-cache', cache); - } - return resp; - } -} - -function deepCopy(obj) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/app/services/redirector.js b/app/services/redirector.js index d351ff5bdbf..94cbbfc84d9 100644 --- a/app/services/redirector.js +++ b/app/services/redirector.js @@ -1,17 +1,9 @@ -import Service, { inject as service } from '@ember/service'; +import Service from '@ember/service'; import window from 'ember-window-mock'; export default class RedirectorService extends Service { - @service fastboot; - redirectTo(url) { - if (this.fastboot.isFastBoot) { - let headers = this.fastboot.response.headers; - headers.set('location', url); - this.set('fastboot.response.statusCode', 301); - } else { - window.location = url; - } + window.location = url; } } diff --git a/config/environment.js b/config/environment.js index c3e5d5d1377..a23de3df4d8 100644 --- a/config/environment.js +++ b/config/environment.js @@ -23,10 +23,6 @@ module.exports = function (environment) { // when it is created }, - fastboot: { - hostWhitelist: ['crates.io', /^localhost:\d+$/, /\.herokuapp\.com$/], - }, - 'ember-cli-notifications': { autoClear: true, clearDuration: 10_000, diff --git a/config/nginx.conf.erb b/config/nginx.conf.erb index 3f169d2b362..dc84e098f9b 100644 --- a/config/nginx.conf.erb +++ b/config/nginx.conf.erb @@ -232,33 +232,8 @@ http { rewrite ^ https://$host$request_uri? permanent; } - <% if ENV['USE_FASTBOOT'] == "staging-experimental" %> - # Experimentally send all non-backend requests to FastBoot - - location /api/ { - proxy_pass http://app_server; - } - - # FastBoot - location / { - proxy_pass http://localhost:9000; - } - <% elsif ENV['USE_FASTBOOT'] && !ENV['USE_FASTBOOT'].empty? %> - # Fastboot is enabled only for allowed paths - - location = /policies { - proxy_pass http://localhost:9000; - } - - location / { - proxy_pass http://app_server; - } - <% else %> - # FastBoot is disabled, backend sends the static Ember index HTML for non-backend paths - - location / { - proxy_pass http://app_server; - } - <% end %> + location / { + proxy_pass http://app_server; + } } } diff --git a/fastboot.js b/fastboot.js deleted file mode 100644 index 3fa515fbab3..00000000000 --- a/fastboot.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -// because fastboot-app-server uses cluster, but it might change in future -const FastBootAppServer = require('fastboot-app-server'); -const morgan = require('morgan'); -const cluster = require('node:cluster'); -const fs = require('node:fs'); -const os = require('node:os'); - -class LoggerWithoutTimestamp { - constructor() { - this.prefix = cluster.isMaster ? 'master' : 'worker'; - } - - writeLine(...args) { - this._write('info', args); - } - - writeError(...args) { - this._write('error', args); - } - - _write(level, args) { - args[0] = `[${level}][${this.prefix}] ${args[0]}`; - console.log(...args); - } -} - -function writeAppInitializedWhenReady(logger) { - let timeout; - - timeout = setInterval(function () { - logger.writeLine('waiting backend'); - if (fs.existsSync('/tmp/backend-initialized')) { - logger.writeLine('backend is up. let heroku know the app is ready'); - fs.writeFileSync('/tmp/app-initialized', 'hello'); - clearInterval(timeout); - } else { - logger.writeLine('backend is still not up'); - } - }, 1000); -} - -var logger = new LoggerWithoutTimestamp(); -logger.writeLine(`${os.cpus().length} cores available`); - -let workerCount = process.env.WEB_CONCURRENCY || 1; -let logRequests = morgan( - 'at=info method=:method path=":url" ' + - 'request_id=:req[x-request-id] ' + - 'fwd=":req[x-real-ip]" ' + - 'user_agent=":req[user-agent]"', -); - -let server = new FastBootAppServer({ - distPath: 'dist', - port: 9000, - ui: logger, - workerCount: workerCount, - - // afterMiddleware won't be called since Fastboot's middleware - // doesn't call next(). - beforeMiddleware: app => app.use(logRequests), -}); - -if (!cluster.isWorker) { - writeAppInitializedWhenReady(logger); -} - -server.start(); diff --git a/package.json b/package.json index 2245cd72cd6..ddeab0eb9a0 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,10 @@ "lint:hbs": "ember-template-lint app", "lint:js": "eslint . --cache", "prettier": "prettier --write package.json '**/*.js'", - "start": "./script/ember.sh serve", - "start:live": "PROXY_BACKEND=https://crates.io ./script/ember.sh serve", - "start:local": "PROXY_BACKEND=http://127.0.0.1:8888 ./script/ember.sh serve", - "start:staging": "PROXY_BACKEND=https://staging-crates-io.herokuapp.com ./script/ember.sh serve", + "start": "ember serve", + "start:live": "PROXY_BACKEND=https://crates.io ember serve", + "start:local": "PROXY_BACKEND=http://127.0.0.1:8888 ember serve", + "start:staging": "PROXY_BACKEND=https://staging-crates-io.herokuapp.com ember serve", "test": "ember exam --split=2 --parallel", "test-coverage": "COVERAGE=true npm run test && ember coverage-merge && rm -rf coverage_* coverage/coverage-summary.json && nyc report" }, @@ -43,7 +43,6 @@ "chart.js": "4.4.0", "copy-text-to-clipboard": "3.2.0", "date-fns": "2.30.0", - "fastboot-app-server": "4.1.1", "highlight.js": "11.9.0", "macro-decorators": "0.1.2", "mermaid": "10.5.0", @@ -82,7 +81,6 @@ "ember-cli-dependency-checker": "3.3.2", "ember-cli-dependency-lint": "2.0.1", "ember-cli-deprecation-workflow": "2.1.0", - "ember-cli-fastboot": "4.1.1", "ember-cli-head": "2.0.0", "ember-cli-htmlbars": "6.3.0", "ember-cli-inject-live-reload": "2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2da2970749..4a1a96ba0bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,9 +30,6 @@ dependencies: date-fns: specifier: 2.30.0 version: 2.30.0 - fastboot-app-server: - specifier: 4.1.1 - version: 4.1.1 highlight.js: specifier: 11.9.0 version: 11.9.0 @@ -143,9 +140,6 @@ devDependencies: ember-cli-deprecation-workflow: specifier: 2.1.0 version: 2.1.0 - ember-cli-fastboot: - specifier: 4.1.1 - version: 4.1.1 ember-cli-head: specifier: 2.0.0 version: 2.0.0 @@ -3640,19 +3634,6 @@ packages: /@simple-dom/interface@1.4.0: resolution: {integrity: sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA==} - /@simple-dom/parser@1.4.0: - resolution: {integrity: sha512-TNjDkOehueRIKr1df416qk9ELj+qWuVVJNIT25y1aZg3pQvxv4UPGrgaDFte7dsWBTbF3V8NYPNQ5FDUZQ8Wlg==} - dependencies: - '@simple-dom/interface': 1.4.0 - - /@simple-dom/serializer@1.4.0: - resolution: {integrity: sha512-mI1yRahsVs8atXLiQksineDsFEFqeG7RHwnnBTDOK6inbzl4tZQgjR+Z7edjgIJq5j5RhZvwPI6EuCji9B3eQw==} - dependencies: - '@simple-dom/interface': 1.4.0 - - /@simple-dom/void-map@1.4.0: - resolution: {integrity: sha512-VDhLEyVCbuhOBBgHol9ShzIv9O8UCzdXeH4FoXu2DOcu/nnvTjLTck+BgXsCLv5ynDiUdoqsREEVFnoyPpFKVw==} - /@sinonjs/commons@3.0.0: resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} dependencies: @@ -3674,10 +3655,6 @@ packages: engines: {node: '>= 6'} dev: true - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: @@ -4297,6 +4274,7 @@ packages: /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -4312,6 +4290,7 @@ packages: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 + dev: true /acorn-dynamic-import@3.0.0: resolution: {integrity: sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==} @@ -4325,6 +4304,7 @@ packages: dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 + dev: true /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} @@ -4344,6 +4324,7 @@ packages: /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} + dev: true /acorn@5.7.4: resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} @@ -4361,6 +4342,7 @@ packages: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} @@ -4374,6 +4356,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color + dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -4595,15 +4578,6 @@ packages: /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - /array-to-error@1.1.1: - resolution: {integrity: sha512-kqcQ8s7uQfg3UViYON3kCMcck3A9exxgq+riVuKy08Mx00VN4EJhK30L2VpjE58LQHKhcE/GRpvbVUhqTvqzGQ==} - dependencies: - array-to-sentence: 1.1.0 - dev: true - - /array-to-sentence@1.1.0: - resolution: {integrity: sha512-YkwkMmPA2+GSGvXj1s9NZ6cc2LBtR+uSeWTy2IGi5MR1Wag4DdrcjTxA/YV/Fw+qKlBeXomneZgThEbm/wvZbw==} dev: true /array-union@2.1.0: @@ -4724,6 +4698,7 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -5582,10 +5557,6 @@ packages: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - dev: true - /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} dev: true @@ -5612,6 +5583,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: true /body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} @@ -5789,17 +5761,6 @@ packages: - supports-color dev: true - /broccoli-clean-css@1.1.0: - resolution: {integrity: sha512-S7/RWWX+lL42aGc5+fXVLnwDdMtS0QEWUFalDp03gJ9Na7zj1rWa351N2HZ687E2crM9g+eDWXKzD17cbcTepg==} - dependencies: - broccoli-persistent-filter: 1.4.6 - clean-css-promise: 0.1.1 - inline-source-map-comment: 1.0.5 - json-stable-stringify: 1.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /broccoli-concat@4.2.5: resolution: {integrity: sha512-dFB5ATPwOyV8S2I7a07HxCoutoq23oY//LhM6Mou86cWUTB174rND5aQLR7Fu8FjFFLxoTbkk7y0VPITJ1IQrw==} engines: {node: 10.* || >= 12.*} @@ -5940,15 +5901,6 @@ packages: glob: 5.0.15 mkdirp: 0.5.6 - /broccoli-merge-trees@2.0.1: - resolution: {integrity: sha512-WjaexJ+I8BxP5V5RNn6um/qDRSmKoiBC/QkRi79FT9ClHfldxRyCDs9mcV7mmoaPlsshmmPaUz5jdtcKA6DClQ==} - dependencies: - broccoli-plugin: 1.3.1 - merge-trees: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /broccoli-merge-trees@3.0.2: resolution: {integrity: sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A==} engines: {node: '>=6.0.0'} @@ -6156,28 +6108,6 @@ packages: dependencies: broccoli-node-api: 1.7.0 - /broccoli-stew@1.6.0: - resolution: {integrity: sha512-sUwCJNnYH4Na690By5xcEMAZqKgquUQnMAEuIiL3Z2k63mSw9Xg+7Ew4wCrFrMmXMcLpWjZDOm6Yqnq268N+ZQ==} - engines: {node: ^4.5 || 6.* || >= 7.*} - dependencies: - broccoli-debug: 0.6.5 - broccoli-funnel: 2.0.2 - broccoli-merge-trees: 2.0.1 - broccoli-persistent-filter: 1.4.6 - broccoli-plugin: 1.3.1 - chalk: 2.4.2 - debug: 3.2.7 - ensure-posix-path: 1.1.1 - fs-extra: 5.0.0 - minimatch: 3.1.2 - resolve: 1.22.8 - rsvp: 4.8.5 - symlink-or-copy: 1.3.1 - walk-sync: 0.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /broccoli-stew@3.0.0: resolution: {integrity: sha512-NXfi+Vas24n3Ivo21GvENTI55qxKu7OwKRnCLWXld8MiLiQKQlWIq28eoARaFj0lTUFwUa4jKZeA7fW9PiWQeg==} engines: {node: 8.* || >= 10.*} @@ -6271,6 +6201,7 @@ packages: /browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true /browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} @@ -6412,10 +6343,12 @@ packages: /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} + dev: true /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + dev: true /cacache@12.0.4: resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} @@ -6671,23 +6604,6 @@ packages: resolution: {integrity: sha512-9q6ZvUAhbKOSRFY7A/irCQ/rF0KIpa3uXpx6izm8+fp7b2H4hLeUJ+F1YYk9+gDQ/X8Q0MEyYs+tG3cht//HTg==} dev: true - /clean-css-promise@0.1.1: - resolution: {integrity: sha512-tzWkANXMD70ETa/wAu2TXAAxYWS0ZjVUFM2dVik8RQBoAbGMFJv4iVluz3RpcoEbo++fX4RV/BXfgGoOjp8o3Q==} - dependencies: - array-to-error: 1.1.1 - clean-css: 3.4.28 - pinkie-promise: 2.0.1 - dev: true - - /clean-css@3.4.28: - resolution: {integrity: sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - commander: 2.8.1 - source-map: 0.4.4 - dev: true - /clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -6840,17 +6756,11 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 + dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander@2.8.1: - resolution: {integrity: sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==} - engines: {node: '>= 0.6.x'} - dependencies: - graceful-readlink: 1.0.1 - dev: true - /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -6886,6 +6796,7 @@ packages: engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + dev: true /compression@1.7.4: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} @@ -6900,6 +6811,7 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color + dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -7136,10 +7048,12 @@ packages: engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 + dev: true /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + dev: true /continuable-cache@0.3.1: resolution: {integrity: sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==} @@ -7154,14 +7068,17 @@ packages: /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} + dev: true /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + dev: true /copy-concurrently@1.0.5: resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} @@ -7455,19 +7372,18 @@ packages: /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true /cssom@0.4.4: resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} dev: true - /cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 + dev: true /cyclist@1.0.2: resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} @@ -7790,14 +7706,6 @@ packages: whatwg-url: 8.7.0 dev: true - /data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - /date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -7856,6 +7764,7 @@ packages: /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -7955,6 +7864,7 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dev: true /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -7983,6 +7893,7 @@ packages: /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true /detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} @@ -8075,12 +7986,6 @@ packages: webidl-conversions: 5.0.0 dev: true - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - dependencies: - webidl-conversions: 7.0.0 - /domhandler@3.3.0: resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} engines: {node: '>= 4'} @@ -8524,35 +8429,6 @@ packages: - supports-color dev: true - /ember-cli-fastboot@4.1.1: - resolution: {integrity: sha512-9B/qJUfDVqRmZlXxP23V2AZ3hiez99DKT2cPJ0MWkjwRom/kmVJHvv5X4fxvT7MCokjOVFvzas79D5toV4GLIA==} - engines: {node: 14.* || 16.* || >=18} - dependencies: - broccoli-concat: 4.2.5 - broccoli-file-creator: 2.1.1 - broccoli-funnel: 3.0.8 - broccoli-merge-trees: 4.2.0 - broccoli-plugin: 4.0.7 - chalk: 4.1.2 - ember-cli-babel: 7.26.11 - ember-cli-lodash-subset: 2.0.1 - ember-cli-preprocess-registry: 3.3.0 - ember-cli-version-checker: 5.1.2 - fastboot: 4.1.1 - fastboot-express-middleware: 4.1.1 - fastboot-transform: 0.1.3 - fs-extra: 10.1.0 - json-stable-stringify: 1.0.2 - md5-hex: 3.0.1 - recast: 0.19.1 - silent-error: 1.1.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - /ember-cli-get-component-path-option@1.0.0: resolution: {integrity: sha512-k47TDwcJ2zPideBCZE8sCiShSxQSpebY2BHcX2DdipMmBox5gsfyVrbKJWIHeSTTKyEUgmBIvQkqTOozEziCZA==} @@ -8701,17 +8577,6 @@ packages: /ember-cli-path-utils@1.0.0: resolution: {integrity: sha512-Qq0vvquzf4cFHoDZavzkOy3Izc893r/5spspWgyzLCPTaG78fM3HsrjZm7UWEltbXUqwHHYrqZd/R0jS08NqSA==} - /ember-cli-preprocess-registry@3.3.0: - resolution: {integrity: sha512-60GYpw7VPeB7TvzTLZTuLTlHdOXvayxjAQ+IxM2T04Xkfyu75O2ItbWlftQW7NZVGkaCsXSRAmn22PG03VpLMA==} - dependencies: - broccoli-clean-css: 1.1.0 - broccoli-funnel: 2.0.2 - debug: 3.2.7 - process-relative-require: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /ember-cli-preprocess-registry@5.0.1: resolution: {integrity: sha512-Jb2zbE5Kfe56Nf4IpdaQ10zZ72p/RyLdgE5j5/lKG3I94QHlq+7AkAd18nPpb5OUeRUT13yQTAYpU+MbjpKTtg==} engines: {node: 16.* || >= 18} @@ -9657,6 +9522,7 @@ packages: /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -9829,6 +9695,7 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -9854,6 +9721,7 @@ packages: esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 + dev: true /eslint-config-prettier@9.0.0(eslint@8.51.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} @@ -10118,6 +9986,7 @@ packages: /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + dev: true /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -10278,6 +10147,7 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color + dev: true /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} @@ -10416,61 +10286,6 @@ packages: transitivePeerDependencies: - supports-color - /fastboot-app-server@4.1.1: - resolution: {integrity: sha512-v7esODTxtPCZYXdW3B7at2otKHg7q5bR2YjkBISShqR5O2Ua4TrNslGQlI0VQIdSHG979g9g6bwr5EBCL2wtKw==} - engines: {node: 12.* || 14.* || >=16} - dependencies: - basic-auth: 2.0.1 - chalk: 4.1.2 - compression: 1.7.4 - express: 4.18.2 - fastboot: 4.1.1 - fastboot-express-middleware: 4.1.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: false - - /fastboot-express-middleware@4.1.1: - resolution: {integrity: sha512-RzobJdJXtFLOp+QtQlRSEm4RjepprLDITyYxPzd7M8LTH9jo2COhG0NFz2LFcv9Jtqlp8IzKh/0w2+hOt7JZow==} - engines: {node: 12.* || 14.* || >=16} - dependencies: - chalk: 4.1.2 - fastboot: 4.1.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - /fastboot-transform@0.1.3: - resolution: {integrity: sha512-6otygPIJw1ARp1jJb+6KVO56iKBjhO+5x59RSC9qiZTbZRrv+HZAuP00KD3s+nWMvcFDemtdkugki9DNFTTwCQ==} - dependencies: - broccoli-stew: 1.6.0 - convert-source-map: 1.9.0 - transitivePeerDependencies: - - supports-color - dev: true - - /fastboot@4.1.1: - resolution: {integrity: sha512-XG7YprsAuAGZrUDhmJ0NFuEP0gpWg9LZwGWSS1I5+f0ETHKPWqb4x59sN2rU1nvCEETBK70z68tLsWsl9daomg==} - engines: {node: 12.* || 14.* || >=16} - dependencies: - chalk: 4.1.2 - cookie: 0.4.2 - debug: 4.3.4(supports-color@8.1.1) - jsdom: 19.0.0 - resolve: 1.22.8 - simple-dom: 1.4.0 - source-map-support: 0.5.21 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -10596,6 +10411,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: true /find-babel-config@1.2.0: resolution: {integrity: sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==} @@ -10804,17 +10620,10 @@ packages: mime-types: 2.1.35 dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + dev: true /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -10830,6 +10639,7 @@ packages: /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + dev: true /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} @@ -11049,11 +10859,6 @@ packages: engines: {node: '>=8.0.0'} dev: true - /get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - dev: true - /get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} @@ -11261,10 +11066,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /graceful-readlink@1.0.1: - resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} - dev: true - /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true @@ -11495,12 +11296,6 @@ packages: whatwg-encoding: 1.0.5 dev: true - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - dependencies: - whatwg-encoding: 2.0.0 - /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true @@ -11542,6 +11337,7 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 + dev: true /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} @@ -11558,16 +11354,6 @@ packages: - supports-color dev: true - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2(supports-color@8.1.1) - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - /http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -11591,6 +11377,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color + dev: true /https@1.0.0: resolution: {integrity: sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==} @@ -11616,12 +11403,14 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: true /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false /icss-replace-symbols@1.1.0: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} @@ -11706,17 +11495,6 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true - /inline-source-map-comment@1.0.5: - resolution: {integrity: sha512-a3/m6XgooVCXkZCduOb7pkuvUtNKt4DaqaggKKJrMQHQsqt6JcJXEreExeZiiK4vWL/cM/uF6+chH05pz2/TdQ==} - hasBin: true - dependencies: - chalk: 1.1.3 - get-stdin: 4.0.1 - minimist: 1.2.8 - sum-up: 1.0.3 - xtend: 4.0.2 - dev: true - /inquirer@6.5.2: resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} engines: {node: '>=6.0.0'} @@ -11813,6 +11591,7 @@ packages: /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + dev: true /is-accessor-descriptor@0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} @@ -12059,6 +11838,7 @@ packages: /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -12361,47 +12141,6 @@ packages: - utf-8-validate dev: true - /jsdom@19.0.0: - resolution: {integrity: sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==} - engines: {node: '>=12'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - acorn: 8.10.0 - acorn-globals: 6.0.0 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.4.3 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1(supports-color@8.1.1) - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 3.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 10.0.0 - ws: 8.14.2 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - /jsesc@0.3.0: resolution: {integrity: sha512-UHQmAeTXV+iwEk0aHheJRqo6Or90eDxI6KIYpHSjKLXKuKlPt1CQ7tGBerFcFA8uKU5mYxiPMlckmFptd5XZzA==} hasBin: true @@ -13067,13 +12806,6 @@ packages: '@types/minimatch': 3.0.5 minimatch: 3.1.2 - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - dev: true - /md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: @@ -13130,6 +12862,7 @@ packages: /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + dev: true /mem@5.1.1: resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} @@ -13162,23 +12895,11 @@ packages: /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - /merge-trees@1.0.1: - resolution: {integrity: sha512-O7TWwipLHhc9tErjq3WBvNP7I1g7Wgudl1ZkLqpT7F2MZy1yEdgnI9cpZZxBaqk+wJZu+2b9FE7D3ubUmGFHFA==} - dependencies: - can-symlink: 1.0.0 - fs-tree-diff: 0.5.9 - heimdalljs: 0.2.6 - heimdalljs-logger: 0.1.10 - rimraf: 2.7.1 - symlink-or-copy: 1.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /merge-trees@2.0.0: resolution: {integrity: sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw==} dependencies: @@ -13222,6 +12943,7 @@ packages: /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + dev: true /micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -13449,6 +13171,7 @@ packages: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true + dev: true /mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} @@ -13640,6 +13363,7 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} @@ -13696,6 +13420,7 @@ packages: /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + dev: true /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -13821,6 +13546,7 @@ packages: /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: remove-trailing-separator: 1.1.0 dev: true @@ -13904,6 +13630,7 @@ packages: /nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true /nyc@15.1.0: resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} @@ -14019,6 +13746,7 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 + dev: true /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} @@ -14305,6 +14033,7 @@ packages: /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + dev: true /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} @@ -14376,6 +14105,7 @@ packages: /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} @@ -14419,18 +14149,6 @@ packages: engines: {node: '>=6'} dev: true - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true - /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -15028,12 +14746,6 @@ packages: fromentries: 1.3.2 dev: true - /process-relative-require@1.0.0: - resolution: {integrity: sha512-r8G5WJPozMJAiv8sDdVWKgJ4In/zBXqwJdMCGAXQt2Kd3HdbAuJVzWYM4JW150hWoaI9DjhtbjcsCCHIMxm8RA==} - dependencies: - node-modules-path: 1.0.2 - dev: true - /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -15078,6 +14790,7 @@ packages: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + dev: true /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -15085,6 +14798,7 @@ packages: /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true /public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} @@ -15136,6 +14850,7 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 + dev: true /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} @@ -15151,6 +14866,7 @@ packages: /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -15207,6 +14923,7 @@ packages: /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + dev: true /raw-body@1.1.7: resolution: {integrity: sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==} @@ -15224,6 +14941,7 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: true /raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} @@ -15320,16 +15038,6 @@ packages: private: 0.1.8 source-map: 0.6.1 - /recast@0.19.1: - resolution: {integrity: sha512-8FCjrBxjeEU2O6I+2hyHyBFH1siJbMBLwIRvVr1T3FD2cL754sOaJDsJ/8h3xYltasbJ8jqWRIhMuDGBSiSbjw==} - engines: {node: '>= 4'} - dependencies: - ast-types: 0.13.3 - esprima: 4.0.1 - private: 0.1.8 - source-map: 0.6.1 - dev: true - /redeyed@1.0.1: resolution: {integrity: sha512-8eEWsNCkV2rvwKLS1Cvp5agNjMhwRe2um+y32B2+3LqOzg4C9BBPs6vzAfV16Ivb8B9HPNKIqd8OrdBws8kNlQ==} dependencies: @@ -15441,6 +15149,7 @@ packages: /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + requiresBuild: true dev: true /remove-types@1.0.0: @@ -15494,6 +15203,7 @@ packages: /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true /reselect@3.0.1: resolution: {integrity: sha512-b/6tFZCmRhtBMa4xGqiiRp9jh9Aqi2A687Lo265cN0/QohJQEBPiQ52f4QB6i0eF3yp3hmLL21LSGBcML2dlxA==} @@ -15821,6 +15531,7 @@ packages: engines: {node: '>=10'} dependencies: xmlchars: 2.2.0 + dev: true /schema-utils@1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} @@ -15890,6 +15601,7 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color + dev: true /serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} @@ -15912,6 +15624,7 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color + dev: true /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -15945,6 +15658,7 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true /sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} @@ -15997,15 +15711,6 @@ packages: transitivePeerDependencies: - supports-color - /simple-dom@1.4.0: - resolution: {integrity: sha512-TnBPkmOyjdaOqyBMb4ick+n8c0Xv9Iwg1PykFV7hz9Se3UCiacTbRb+25cPmvozFNJLBUNvUzX/KsPfXF14ivA==} - dependencies: - '@simple-dom/document': 1.4.0 - '@simple-dom/interface': 1.4.0 - '@simple-dom/parser': 1.4.0 - '@simple-dom/serializer': 1.4.0 - '@simple-dom/void-map': 1.4.0 - /simple-html-tokenizer@0.5.11: resolution: {integrity: sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==} @@ -16302,6 +16007,7 @@ packages: /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + dev: true /stream-browserify@2.0.2: resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} @@ -16479,12 +16185,6 @@ packages: resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} dev: false - /sum-up@1.0.3: - resolution: {integrity: sha512-zw5P8gnhiqokJUWRdR6F4kIIIke0+ubQSGyYUY506GCbJWtV7F6Xuy0j6S125eSX2oF+a8KdivsZ8PlVEH0Mcw==} - dependencies: - chalk: 1.1.3 - dev: true - /supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -16535,6 +16235,7 @@ packages: /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true /symlink-or-copy@1.3.1: resolution: {integrity: sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==} @@ -16916,6 +16617,7 @@ packages: /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + dev: true /tooltip.js@1.3.3: resolution: {integrity: sha512-XWWuy/dBdF/F/YpRE955yqBZ4VdLfiTAUdOqoU+wJm6phJlMpEzl/iYHZ+qJswbeT9VG822bNfsETF9wzmoy5A==} @@ -16936,6 +16638,7 @@ packages: punycode: 2.3.0 universalify: 0.2.0 url-parse: 1.5.10 + dev: true /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -16948,12 +16651,6 @@ packages: punycode: 2.3.0 dev: true - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - dependencies: - punycode: 2.3.0 - /tracked-built-ins@3.3.0: resolution: {integrity: sha512-ewKFrW/AQs05oLPM5isOUb/1aOwBRfHfmF408CCzTk21FLAhKrKVOP5Q5ebX+zCT4kvg81PGBGwrBiEGND1nWA==} dependencies: @@ -17068,6 +16765,7 @@ packages: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + dev: true /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} @@ -17209,6 +16907,7 @@ packages: /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} + dev: true /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} @@ -17217,6 +16916,7 @@ packages: /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + dev: true /unquote@1.1.1: resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} @@ -17272,6 +16972,7 @@ packages: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 + dev: true /url@0.11.3: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} @@ -17315,6 +17016,7 @@ packages: /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + dev: true /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} @@ -17372,6 +17074,7 @@ packages: /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + dev: true /vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} @@ -17382,6 +17085,7 @@ packages: deprecated: Use your platform's native performance.now() and performance.timeOrigin. dependencies: browser-process-hrtime: 1.0.0 + dev: true /w3c-xmlserializer@2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} @@ -17390,12 +17094,6 @@ packages: xml-name-validator: 3.0.0 dev: true - /w3c-xmlserializer@3.0.0: - resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} - engines: {node: '>=12'} - dependencies: - xml-name-validator: 4.0.0 - /walk-sync@0.3.4: resolution: {integrity: sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig==} dependencies: @@ -17503,10 +17201,6 @@ packages: engines: {node: '>=10.4'} dev: true - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - /webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: @@ -17617,12 +17311,6 @@ packages: iconv-lite: 0.4.24 dev: true - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - dependencies: - iconv-lite: 0.6.3 - /whatwg-fetch@3.6.19: resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} dev: true @@ -17631,24 +17319,6 @@ packages: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - - /whatwg-url@10.0.0: - resolution: {integrity: sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==} - engines: {node: '>=12'} - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -17806,6 +17476,7 @@ packages: optional: true utf-8-validate: optional: true + dev: true /xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} @@ -17816,10 +17487,6 @@ packages: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} dev: true - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - /xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} @@ -17827,6 +17494,7 @@ packages: /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} diff --git a/script/ember.sh b/script/ember.sh deleted file mode 100755 index fb2dad71308..00000000000 --- a/script/ember.sh +++ /dev/null @@ -1,12 +0,0 @@ -#! /bin/sh -set -ue - -export FASTBOOT_DISABLED - -if [ -z "${USE_FASTBOOT-}" ]; then - FASTBOOT_DISABLED=1 -else - unset FASTBOOT_DISABLED -fi - -./node_modules/.bin/ember "$@" diff --git a/script/start-web.sh b/script/start-web.sh index adee94fb935..507fbe523c3 100755 --- a/script/start-web.sh +++ b/script/start-web.sh @@ -4,12 +4,4 @@ set -ue # Since this script is launched from our app, we tell the nginx # buildpack (`bin/start-nginx`) that `cat` is our server. -if [[ -z "${USE_FASTBOOT-}" ]]; then - unset USE_FASTBOOT - bin/start-nginx cat -else - export USE_FASTBOOT - node --optimize_for_size --max_old_space_size=200 fastboot.js & - bin/start-nginx cat & - wait -n -fi +bin/start-nginx cat diff --git a/src/app.rs b/src/app.rs index f039fdc7f0f..1e26026b25d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -65,9 +65,6 @@ pub struct App { /// will panic) or a `Client` configured with a per-test replay proxy. pub(crate) http_client: Option, - /// A client for HTTP requests to the Ember.js fastboot server - pub fastboot_client: Option, - /// In-flight request counters for the `balance_capacity` middleware. pub balance_capacity: BalanceCapacityState, @@ -164,11 +161,6 @@ impl App { .time_to_live(config.version_id_cache_ttl) .build(); - let fastboot_client = match config.use_fastboot.as_deref() { - Some("staging-experimental") => Some(reqwest::Client::new()), - _ => None, - }; - App { primary_database, read_only_replica_database: replica_database, @@ -181,7 +173,6 @@ impl App { service_metrics: ServiceMetrics::new().expect("could not initialize service metrics"), instance_metrics, http_client, - fastboot_client, balance_capacity: Default::default(), rate_limiter: RateLimiter::new(config.rate_limiter.clone()), config, diff --git a/src/bin/server.rs b/src/bin/server.rs index a050880a225..fa6b62752a2 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -83,11 +83,7 @@ fn main() -> Result<(), Box> { // Creating this file tells heroku to tell nginx that the application is ready // to receive traffic. if app.config.use_nginx_wrapper { - let path = if app.config.use_fastboot.is_some() { - "/tmp/backend-initialized" - } else { - "/tmp/app-initialized" - }; + let path = "/tmp/app-initialized"; info!("Writing to {path}"); File::create(path).unwrap(); diff --git a/src/config/server.rs b/src/config/server.rs index d903687f2f4..8c845744a69 100644 --- a/src/config/server.rs +++ b/src/config/server.rs @@ -62,8 +62,6 @@ pub struct Server { /// Should the server serve the frontend `index.html` for all /// non-API requests? pub serve_html: bool, - - pub use_fastboot: Option, } impl Default for Server { @@ -211,7 +209,6 @@ impl Default for Server { balance_capacity: BalanceCapacityConfig::from_environment(), serve_dist: true, serve_html: true, - use_fastboot: dotenvy::var("USE_FASTBOOT").ok(), } } } diff --git a/src/middleware/ember_html.rs b/src/middleware/ember_html.rs index 41e9f00b6ff..c9411a2b58a 100644 --- a/src/middleware/ember_html.rs +++ b/src/middleware/ember_html.rs @@ -2,92 +2,40 @@ //! //! Paths intended for the inner `api_handler` are passed along to the remaining middleware layers //! as normal. Requests not intended for the backend will be served HTML to boot the Ember.js -//! frontend. During local development, if so configured, these requests will instead be proxied to -//! Ember FastBoot (`node ./fastboot.js`). +//! frontend. //! //! For now, there is an additional check to see if the `Accept` header contains "html". This is //! likely to be removed in the future. -use crate::app::AppState; -use anyhow::ensure; use axum::middleware::Next; use axum::response::{IntoResponse, Response}; use http::{header, Request, StatusCode}; -use reqwest::Client; -use std::fmt::Write; use tower::ServiceExt; use tower_http::services::ServeFile; -pub async fn serve_html( - state: AppState, - request: Request, - next: Next, -) -> Response { +pub async fn serve_html(request: Request, next: Next) -> Response { let path = &request.uri().path(); // The "/git/" prefix is only used in development (when within a docker container) if path.starts_with("/api/") || path.starts_with("/git/") { next.run(request).await + } else if request + .headers() + .get_all(header::ACCEPT) + .iter() + .any(|val| val.to_str().unwrap_or_default().contains("html")) + { + // Serve static Ember page to bootstrap the frontend + ServeFile::new("dist/index.html") + .oneshot(request) + .await + .map(|response| response.map(axum::body::boxed)) + .unwrap_or_else(|_| StatusCode::INTERNAL_SERVER_ERROR.into_response()) } else { - if let Some(client) = &state.fastboot_client { - // During local fastboot development, forward requests to the local fastboot server. - // In prodution, including when running with fastboot, nginx proxies the requests - // to the correct endpoint and requests should never make it here. - return proxy_to_fastboot(client, request) - .await - .unwrap_or_else(|_| StatusCode::INTERNAL_SERVER_ERROR.into_response()); - } - - if request - .headers() - .get_all(header::ACCEPT) - .iter() - .any(|val| val.to_str().unwrap_or_default().contains("html")) - { - // Serve static Ember page to bootstrap the frontend - ServeFile::new("dist/index.html") - .oneshot(request) - .await - .map(|response| response.map(axum::body::boxed)) - .unwrap_or_else(|_| StatusCode::INTERNAL_SERVER_ERROR.into_response()) - } else { - // Return a 404 to crawlers that don't send `Accept: text/hml`. - // This is to preserve legacy behavior and will likely change. - // Most of these crawlers probably won't execute our frontend JS anyway, but - // it would be nice to bootstrap the app for crawlers that do execute JS. - StatusCode::NOT_FOUND.into_response() - } - } -} - -/// Proxy to the fastboot server in development mode -/// -/// This handler is somewhat hacky, and is not intended for usage in production. -/// -/// # Panics -/// -/// This function can panic and should only be used in development mode. -async fn proxy_to_fastboot(client: &Client, req: Request) -> anyhow::Result { - ensure!( - req.method() == http::Method::GET, - "Only support GET but request method was {}", - req.method() - ); - - let mut url = format!("http://127.0.0.1:9000{}", req.uri().path()); - if let Some(query) = req.uri().query() { - write!(url, "?{query}")?; + // Return a 404 to crawlers that don't send `Accept: text/hml`. + // This is to preserve legacy behavior and will likely change. + // Most of these crawlers probably won't execute our frontend JS anyway, but + // it would be nice to bootstrap the app for crawlers that do execute JS. + StatusCode::NOT_FOUND.into_response() } - - let fastboot_response = client - .request(req.method().into(), &*url) - .headers(req.headers().clone()) - .send() - .await?; - - let status = fastboot_response.status(); - let headers = fastboot_response.headers().clone(); - let bytes = fastboot_response.bytes().await?; - - Ok((status, headers, bytes).into_response()) } diff --git a/src/tests/util/test_app.rs b/src/tests/util/test_app.rs index 47db6172dcd..7b618089b26 100644 --- a/src/tests/util/test_app.rs +++ b/src/tests/util/test_app.rs @@ -417,7 +417,6 @@ fn simple_config() -> config::Server { // The frontend code is not needed for the backend tests. serve_dist: false, serve_html: false, - use_fastboot: None, } }