diff --git a/.babelrc b/.babelrc index 9790bf8..0b2a13d 100644 --- a/.babelrc +++ b/.babelrc @@ -1,23 +1,7 @@ { "plugins": [ - "@babel/plugin-syntax-dynamic-import" ], - "env": { - "test": { - "plugins": [ - "dynamic-import-node" - ], - "presets": [ - [ - "@babel/preset-env", - { - "modules": "commonjs", - "targets": { - "node": "current" - } - } - ] - ] - } - } -} \ No newline at end of file + "presets" : [ + "@babel/preset-env" + ] +} diff --git a/test-harness/.cfconfig.json b/.cfconfig.json similarity index 96% rename from test-harness/.cfconfig.json rename to .cfconfig.json index 3bddab6..dd96ea7 100644 --- a/test-harness/.cfconfig.json +++ b/.cfconfig.json @@ -4,7 +4,7 @@ "debuggingReportExecutionTimes":false, "disableInternalCFJavaComponents":false, "inspectTemplate":"always", - "requestTimeout":"0,0,0,90", + "requestTimeout":"0,0,5,0", "robustExceptionEnabled":true, "datasources": { "coolblog": { @@ -23,4 +23,4 @@ "validate":"false" } } -} \ No newline at end of file +} diff --git a/.cfformat.json b/.cfformat.json index 4125a2b..443ef67 100644 --- a/.cfformat.json +++ b/.cfformat.json @@ -1,13 +1,14 @@ { "array.empty_padding": false, "array.padding": true, - "array.multiline.min_length": 40, + "array.multiline.min_length": 50, "array.multiline.element_count": 2, "array.multiline.leading_comma.padding": true, "array.multiline.leading_comma": false, "alignment.consecutive.assignments": true, "alignment.consecutive.properties": true, "alignment.consecutive.params": true, + "alignment.doc_comments" : true, "brackets.padding": true, "comment.asterisks": "align", "binary_operators.padding": true, @@ -17,22 +18,22 @@ "function_call.multiline.leading_comma.padding": true, "function_call.casing.builtin": "cfdocs", "function_call.casing.userdefined": "camel", - "function_call.multiline.element_count": 2, + "function_call.multiline.element_count": 3, "function_call.multiline.leading_comma": false, - "function_call.multiline.min_length": 40, + "function_call.multiline.min_length": 50, "function_declaration.padding": true, "function_declaration.empty_padding": false, "function_declaration.multiline.leading_comma": false, "function_declaration.multiline.leading_comma.padding": true, - "function_declaration.multiline.element_count": 2, - "function_declaration.multiline.min_length": 40, + "function_declaration.multiline.element_count": 3, + "function_declaration.multiline.min_length": 50, "function_declaration.group_to_block_spacing": "compact", "function_anonymous.empty_padding": false, "function_anonymous.group_to_block_spacing": "compact", - "function_anonymous.multiline.element_count": 2, + "function_anonymous.multiline.element_count": 3, "function_anonymous.multiline.leading_comma": false, "function_anonymous.multiline.leading_comma.padding": true, - "function_anonymous.multiline.min_length": 40, + "function_anonymous.multiline.min_length": 50, "function_anonymous.padding": true, "indent_size": 4, "keywords.block_to_keyword_spacing": "spaced", @@ -41,13 +42,13 @@ "keywords.spacing_to_block": "spaced", "keywords.spacing_to_group": true, "keywords.empty_group_spacing": false, - "max_columns": 120, + "max_columns": 115, "metadata.multiline.element_count": 3, - "metadata.multiline.min_length": 40, - "method_call.chain.multiline": 3, - "newline": "\n", + "metadata.multiline.min_length": 50, + "method_call.chain.multiline" : 3, + "newline":"\n", "property.multiline.element_count": 3, - "property.multiline.min_length": 40, + "property.multiline.min_length": 30, "parentheses.padding": true, "strings.quote": "double", "strings.attributes.quote": "double", @@ -57,6 +58,6 @@ "struct.multiline.leading_comma": false, "struct.multiline.leading_comma.padding": true, "struct.multiline.element_count": 2, - "struct.multiline.min_length": 40, + "struct.multiline.min_length": 60, "tab_indent": true -} \ No newline at end of file +} diff --git a/test-harness/.env.template b/.env.template similarity index 100% rename from test-harness/.env.template rename to .env.template diff --git a/.github/FUNDING.YML b/.github/FUNDING.YML new file mode 100644 index 0000000..7e59d13 --- /dev/null +++ b/.github/FUNDING.YML @@ -0,0 +1 @@ +patreon: ortussolutions diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82736d0..be4c335 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: cbDebugger CI +name: cbdebugger CI # Only on Development we build snapshots on: @@ -15,121 +15,9 @@ jobs: # Tests First baby! We fail, no build :( ############################################# tests: - name: Tests - runs-on: ubuntu-20.04 - env: - DB_USER: root - DB_PASSWORD: root - strategy: - fail-fast: false - matrix: - cfengine: [ "lucee@5", "adobe@2016", "adobe@2018", "adobe@2021" ] - steps: - - name: Checkout Repository - uses: actions/checkout@v2 - - - name: Setup Java - uses: actions/setup-java@v2 - with: - distribution: "adopt" - java-version: "11" - - - name: Setup Database and Fixtures - run: | - sudo /etc/init.d/mysql start - # Create Database - mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} -e 'CREATE DATABASE coolblog;' - # Import Database - mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} < test-harness/tests/resources/coolblog.sql - - - name: Setup Environment For Testing Process - working-directory: ./test-harness - run: | - # Setup .env - touch .env - # ENV - printf "DB_HOST=localhost\n" >> .env - printf "DB_USER=${{ env.DB_USER }}\n" >> .env - printf "DB_PASSWORD=${{ env.DB_PASSWORD }}\n" >> .env - printf "DB_CLASS=com.mysql.cj.jdbc.Driver\n" >> .env - printf "DB_BUNDLEVERSION=8.0.19\n" >> .env - printf "DB_BUNDLENAME=com.mysql.cj\n" >> .env - - - name: Cache CommandBox Dependencies - uses: actions/cache@v1 - if: ${{ true }} - with: - path: ~/.CommandBox/artifacts - key: ${{ runner.OS }}-commandbox-cache-${{ hashFiles( 'box.json' ) }}-${{ hashFiles( 'test-harness/box.json' ) }} - restore-keys: | - ${{ runner.OS }}-commandbox-cache-${{ hashFiles( 'box.json' ) }}-${{ hashFiles( 'test-harness/box.json' ) }} - - - name: Setup CommandBox - uses: elpete/setup-commandbox@v1.0.0 - - - name: Install Test Harness Dependencies - working-directory: ./test-harness - run: | - box install - - - name: Start ${{ matrix.cfengine }} Server - working-directory: ./test-harness - run: | - box server start serverConfigFile="server-${{ matrix.cfengine }}.json" --noSaveSettings --debug - # Install Adobe 2021 cfpm modules - if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then - box run-script install:2021 - fi - curl http://127.0.0.1:60299 - - - name: Run Tests - working-directory: ./test-harness - run: | - mkdir tests/results - box package set testbox.runner="http://localhost:60299/tests/runner.cfm" - box testbox run --verbose outputFile=tests/results/test-results outputFormats=json,antjunit - - - name: Publish Test Results - uses: EnricoMi/publish-unit-test-result-action@v1 - if: always() - with: - files: test-harness/tests/results/**/*.xml - check_name: "${{ matrix.cfengine }} Test Results" - - - name: Upload Test Results Artifacts - if: always() - uses: actions/upload-artifact@v2 - with: - name: test-results-${{ matrix.cfengine }} - path: | - test-harness/tests/results/**/* - - - name: Slack Notification - if: failure() - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_CHANNEL: coding - SLACK_COLOR: ${{ job.status }} # or a specific color like 'green' or '#ff00ff' - SLACK_ICON_EMOJI: ":bell:" - SLACK_MESSAGE: '${{ env.MODULE_ID }} tests failed :cry:' - SLACK_TITLE: ${{ env.MODULE_ID }} Tests For ${{ matrix.cfengine }} failed - SLACK_USERNAME: CI - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} - - - name: Failure Debugging Info - if: ${{ failure() }} - working-directory: ./test-harness - run: | - box server log serverConfigFile="server-${{ matrix.cfengine }}.json" - - - name: Upload Debugging Info To Artifacts - if: ${{ failure() }} - uses: actions/upload-artifact@v2 - with: - name: Failure Debugging Info - ${{ matrix.cfengine }} - path: | - test-harness/.engine/**/logs/* - test-harness/.engine/**/WEB-INF/cfusion/logs/* + uses: ./.github/workflows/tests.yml + secrets: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} ############################################# # Build Module @@ -155,17 +43,8 @@ jobs: with: node-version: 12.x - - name: Cache CommandBox Dependencies - uses: actions/cache@v1 - if: ${{ true }} - with: - path: ~/.CommandBox/artifacts - key: ${{ runner.OS }}-commandbox-cache-${{ hashFiles( 'box.json' ) }}-${{ hashFiles( 'test-harness/box.json' ) }} - restore-keys: | - ${{ runner.OS }}-commandbox-cache-${{ hashFiles( 'box.json' ) }}-${{ hashFiles( 'test-harness/box.json' ) }} - - name: Setup CommandBox - uses: elpete/setup-commandbox@v1.0.0 + uses: Ortus-Solutions/setup-commandbox@main with: forgeboxAPIKey: ${{ secrets.FORGEBOX_TOKEN }} diff --git a/.github/workflows/gh-release.yml b/.github/workflows/gh-release.yml new file mode 100644 index 0000000..5193ae5 --- /dev/null +++ b/.github/workflows/gh-release.yml @@ -0,0 +1,19 @@ +# Publish Github Release +name: Github Release + +on: + push: + tags: + - v[0-9]+.* + +jobs: + create-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: taiki-e/create-gh-release-action@v1.5.0 + with: + # Produced by the build/Build.cfc + changelog: changelog.md + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index b29ac1f..6d8f876 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,89 +1,15 @@ name: Pull Requests on: - push: - branches-ignore: - - "main" - - "master" - - "development" pull_request: branches: - development jobs: tests: - name: Tests - runs-on: ubuntu-20.04 - env: - DB_USER: root - DB_PASSWORD: root - strategy: - fail-fast: true - matrix: - cfengine: [ "lucee@5", "adobe@2016", "adobe@2018", "adobe@2021" ] - steps: - - name: Checkout Repository - uses: actions/checkout@v2 - - - name: Setup Database and Fixtures - run: | - sudo /etc/init.d/mysql start - mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} -e 'CREATE DATABASE coolblog;' - mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} < test-harness/tests/resources/coolblog.sql - - - name: Setup Java - uses: actions/setup-java@v2 - with: - distribution: "adopt" - java-version: "11" - - - name: Setup CommandBox - uses: elpete/setup-commandbox@v1.0.0 - - - name: Setup Environment For Testing Process - working-directory: ./test-harness - run: | - # Setup .env - touch .env - # ENV - printf "DB_HOST=localhost\n" >> .env - printf "DB_USER=${{ env.DB_USER }}\n" >> .env - printf "DB_PASSWORD=${{ env.DB_PASSWORD }}\n" >> .env - printf "DB_CLASS=com.mysql.cj.jdbc.Driver\n" >> .env - printf "DB_BUNDLEVERSION=8.0.19\n" >> .env - printf "DB_BUNDLENAME=com.mysql.cj\n" >> .env - - - name: Install Test Harness Dependencies - working-directory: ./test-harness - run: | - box install - - - name: Start ${{ matrix.cfengine }} Server - working-directory: ./test-harness - run: | - box server start serverConfigFile="server-${{ matrix.cfengine }}.json" --noSaveSettings --debug - curl http://127.0.0.1:60299 - - - name: Run Tests - working-directory: ./test-harness - run: | - mkdir tests/results - box package set testbox.runner="http://localhost:60299/tests/runner.cfm" - box testbox run --verbose outputFile=tests/results/test-results outputFormats=json,antjunit - - - name: Publish PR Test Reports - uses: mikepenz/action-junit-report@v2 - with: - report_paths: 'test-harness/tests/results/**/*.xml' - check_name: "${{ matrix.cfengine }} Test Results" - summary: true - - - name: Failure Debugging Info - if: ${{ failure() }} - working-directory: ./test-harness - run: | - box server log serverConfigFile="server-${{ matrix.cfengine }}.json" + uses: coldbox-modules/cbdebugger/.github/workflows/tests.yml@development + # Format PR format: name: Format runs-on: ubuntu-20.04 @@ -91,22 +17,11 @@ jobs: - name: Checkout Repository uses: actions/checkout@v2 - - name: Setup Java - uses: actions/setup-java@v2 + - uses: Ortus-Solutions/commandbox-action@v1.0.2 with: - distribution: "adopt" - java-version: "11" - - - name: Set Up CommandBox - uses: elpete/setup-commandbox@v1.0.0 - - - name: Install CFFormat - run: box install commandbox-cfformat - - - name: Run CFFormat - run: box run-script format + cmd: run-script format - name: Commit Format Changes uses: stefanzweifel/git-auto-commit-action@v4 with: - commit_message: Apply cfformat changes \ No newline at end of file + commit_message: Apply cfformat changes diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..599c22d --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,115 @@ +name: Test Suites + +# We are a reusable Workflow only +on: + workflow_call: + secrets: + SLACK_WEBHOOK_URL: + required: true + +jobs: + tests: + name: Tests + runs-on: ubuntu-20.04 + env: + DB_USER: root + DB_PASSWORD: root + strategy: + fail-fast: false + matrix: + cfengine: [ "lucee@5", "adobe@2016", "adobe@2018", "adobe@2021" ] + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: Setup Java + uses: actions/setup-java@v2 + with: + distribution: "adopt" + java-version: "11" + + - name: Setup Database and Fixtures + run: | + sudo systemctl start mysql.service + # Create Database + mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} -e 'CREATE DATABASE coolblog;' + # Import Database + mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} < test-harness/tests/resources/coolblog.sql + + - name: Setup Environment For Testing Process + run: | + # Setup .env + touch .env + # ENV + printf "ENVIRONMENT=development\n" >> .env + printf "DB_HOST=localhost\n" >> .env + printf "DB_USER=${{ env.DB_USER }}\n" >> .env + printf "DB_PASSWORD=${{ env.DB_PASSWORD }}\n" >> .env + printf "DB_CLASS=com.mysql.cj.jdbc.Driver\n" >> .env + printf "DB_BUNDLEVERSION=8.0.19\n" >> .env + printf "DB_BUNDLENAME=com.mysql.cj\n" >> .env + + - name: Setup CommandBox CLI + uses: Ortus-Solutions/setup-commandbox@main + + - name: Install Dependencies + run: | + box install + cd test-harness && box install + + - name: Start ${{ matrix.cfengine }} Server + run: | + box server start serverConfigFile="server-${{ matrix.cfengine }}.json" --noSaveSettings --debug + # Install Adobe 2021 cfpm modules + if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then + box run-script install:2021 + fi + curl http://127.0.0.1:60299 + + - name: Run Tests + run: | + mkdir -p test-harness/tests/results + box testbox run --verbose outputFile=test-harness/tests/results/test-results outputFormats=json,antjunit + ls -lR test-harness/tests + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v1 + if: always() + with: + files: test-harness/tests/results/**/*.xml + check_name: "${{ matrix.cfengine }} Test Results" + + - name: Upload Test Results to Artifacts + if: always() + uses: actions/upload-artifact@v2 + with: + name: test-results-${{ matrix.cfengine }} + path: | + test-harness/tests/results/**/* + + - name: Failure Debugging Log + if: ${{ failure() }} + run: | + box server log serverConfigFile="server-${{ matrix.cfengine }}.json" + + - name: Upload Debugging Log To Artifacts + if: ${{ failure() }} + uses: actions/upload-artifact@v2 + with: + name: Failure Debugging Info - ${{ matrix.cfengine }} + path: | + .engine/**/logs/* + .engine/**/WEB-INF/cfusion/logs/* + + - name: Slack Notifications + # Only on failures and NOT in pull requests + if: ${{ failure() && !startsWith( 'pull_request', github.event_name ) }} + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_CHANNEL: coding + SLACK_COLOR: ${{ job.status }} # or a specific color like 'green' or '#ff00ff' + SLACK_ICON_EMOJI: ":bell:" + SLACK_MESSAGE: '${{ github.repository }} tests failed :cry:' + SLACK_TITLE: ${{ github.repository }} Tests For ${{ matrix.cfengine }} failed + SLACK_USERNAME: CI + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.gitignore b/.gitignore index 991ff35..8d11047 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,23 @@ -# Ide -.vscode - -# build artifacts +# Artifacts and temp folders .artifacts/** .tmp/** -# Module Dependencies -modules/** +# Engine + Secrets + databases +.env +.engine/** +.db/** -# Test harness dependencies -test-harness/.engine/** +# Dependencies +modules/** test-harness/coldbox/** test-harness/docbox/** test-harness/testbox/** test-harness/logs/** test-harness/modules/** -test-harness/.env + +# log files +logs/** # UI Build Process includes/** -node_modules/** \ No newline at end of file +node_modules/** diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..af37583 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "cfml.mappings": [ + { + "logicalPath": "/coldbox", + "directoryPath": "./test-harness/coldbox", + "isPhysicalDirectoryPath": false + }, + { + "logicalPath": "/testbox", + "directoryPath": "./test-harness/testbox", + "isPhysicalDirectoryPath": false + }, + { + "logicalPath": "/cbfs", + "directoryPath": "./", + "isPhysicalDirectoryPath": false + } + ] +} diff --git a/ModuleConfig.cfc b/ModuleConfig.cfc index 87ae324..bee0f25 100644 --- a/ModuleConfig.cfc +++ b/ModuleConfig.cfc @@ -34,17 +34,17 @@ component { variables.settings = { // This flag enables/disables the tracking of request data to our storage facilities // To disable all tracking, turn this master key off - enabled : true, + enabled : true, // This setting controls if you will activate the debugger for visualizations ONLY // The debugger will still track requests even in non debug mode. - debugMode : controller.getSetting( - name = "environment", - defaultValue = "production" - ) == "development", + debugMode : controller.getSetting( name = "environment", defaultValue = "production" ) == "development", // The URL password to use to activate it on demand - debugPassword : "cb:null", + debugPassword : "cb:null", + // This flag enables/disables the end of request debugger panel docked to the bottem of the page. + // If you disable i, then the only way to visualize the debugger is via the `/cbdebugger` endpoint + requestPanelDock : true, // Request Tracker Options - requestTracker : { + requestTracker : { // Store the request profilers in heap memory or in cachebox, default is cachebox storage : "cachebox", // Which cache region to store the profilers in @@ -113,8 +113,10 @@ component { // Log the binding parameters logParams : true }, + // Adobe ColdFusion SQL Collector + acfSql : { enabled : false, expanded : false, logParams : true }, // Async Manager Reporting - async : { enabled : true, expanded : false } + async : { enabled : true, expanded : false } }; // Visualizer Route @@ -157,17 +159,6 @@ component { * Load the module */ function onLoad(){ - // default the password to something so we are secure by default - if ( variables.settings.debugPassword eq "cb:null" ) { - variables.settings.debugPassword = hash( getCurrentTemplatePath() ); - } else if ( len( variables.settings.debugPassword ) ) { - // hash the password into memory - variables.settings.debugPassword = hash( variables.settings.debugPassword ); - } - - // Configure the debugging mode from the loaded app settings - wirebox.getInstance( "debuggerService@cbDebugger" ).setDebugMode( variables.settings.debugMode ); - // Only activate interceptions and collectors if master switch is on or in test mode disable it if ( variables.settings.enabled ) { /******************** REQUEST COLLECTOR ************************************/ @@ -186,10 +177,7 @@ component { binder .mapAspect( "ObjectProfiler" ) .to( "#moduleMapping#.aspects.ObjectProfiler" ) - .initArg( - name = "traceResults", - value = variables.settings.requestTracker.traceObjectResults - ); + .initArg( name = "traceResults", value = variables.settings.requestTracker.traceObjectResults ); // Bind Object Aspects to monitor all a-la-carte profilers via method and component annotations binder.bindAspect( @@ -264,6 +252,22 @@ component { interceptorName = "CBOrmCollector@cbdebugger" ); } + + /******************** ACFSQL COLLECTOR ************************************/ + + // Do not load on lucee or ACF 2016 + if ( + variables.settings.acfSql.enabled && !server.keyExists( "lucee" ) && server.coldfusion.productVersion.listFirst() gt "2016" + ) { + controller + .getInterceptorService() + .registerInterceptor( + interceptorClass = "#moduleMapping#.interceptors.ACFSqlCollector", + interceptorName = "ACFSqlCollector@cbdebugger" + ); + } else { + variables.settings.acfSql.enabled = false; + } } // end master switch } @@ -275,15 +279,10 @@ component { // Only if we are enabled if ( variables.settings.enabled ) { controller.getInterceptorService().unregister( "RequestCollector@cbdebugger" ); - if ( variables.settings.qb.enabled && controller.getModuleService().isModuleRegistered( "qb" ) ) { - controller.getInterceptorService().unregister( "QBCollector@cbdebugger" ); - } - if ( variables.settings.qb.enabled && controller.getModuleService().isModuleRegistered( "quick" ) ) { - controller.getInterceptorService().unregister( "QuickCollector@cbdebugger" ); - } - if ( variables.settings.cborm.enabled && controller.getModuleService().isModuleRegistered( "cborm" ) ) { - controller.getInterceptorService().unregister( "CBOrmCollector@cbdebugger" ); - } + controller.getInterceptorService().unregister( "QBCollector@cbdebugger" ); + controller.getInterceptorService().unregister( "QuickCollector@cbdebugger" ); + controller.getInterceptorService().unregister( "CBOrmCollector@cbdebugger" ); + controller.getInterceptorService().unregister( "ACFSqlCollector@cbdebugger" ); } } @@ -293,10 +292,7 @@ component { function afterConfigurationLoad(){ if ( variables.settings.enabled && variables.settings.tracers.enabled ) { var logBox = controller.getLogBox(); - logBox.registerAppender( - "tracer", - "cbdebugger.appenders.TracerAppender" - ); + logBox.registerAppender( "tracer", "cbdebugger.appenders.TracerAppender" ); var appenders = logBox.getAppendersMap( "tracer" ); // Register the appender with the root loggger, and turn the logger on. var root = logBox.getRootLogger(); @@ -310,15 +306,12 @@ component { * Loads the AOP mixer if not loaded in the application */ private function loadAOPMixer(){ - var mixer = new coldbox.system.aop.Mixer(); - // configure it - mixer.configure( wirebox, {} ); // register it controller .getInterceptorService() .registerInterceptor( - interceptorObject = mixer, - interceptorName = "AOPMixer" + interceptorObject: new coldbox.system.aop.Mixer().configure( wirebox, {} ), + interceptorName : "AOPMixer" ); } @@ -326,17 +319,13 @@ component { * Verify if wirebox aop mixer is loaded */ private boolean function isAOPMixerLoaded(){ - var listeners = wirebox.getBinder().getListeners(); - var results = false; - - for ( var thisListener in listeners ) { - if ( thisListener.class eq "coldbox.system.aop.Mixer" ) { - results = true; - break; - } - } - - return results; + return wirebox + .getBinder() + .getListeners() + .filter( function( thisListener ){ + return thisListener.class eq "coldbox.system.aop.Mixer"; + } ) + .len() > 0 ? true : false; } } diff --git a/box.json b/box.json index 9479137..0c0cea9 100644 --- a/box.json +++ b/box.json @@ -2,7 +2,7 @@ "name":"ColdBox Debugger", "author":"Ortus Solutions ", "Luis Majano " ], + "dependencies":{ + "JSONPrettyPrint":"^1.4.1", + "sqlformatter":"^1.0.1" + }, + "devDependencies":{ + "commandbox-cfformat":"*", + "commandbox-docbox":"*", + "commandbox-dotenv":"*", + "commandbox-cfconfig":"*" + }, "ignore":[ "**/.*", "package-lock.json", @@ -32,19 +42,38 @@ "build/**", "node_modules/**", "resources/**", - "test-harness/**", - "*/.md" + "test-harness", + "/server*.json" ], + "testbox":{ + "runner":"http://localhost:60299/tests/runner.cfm" + }, "scripts":{ + "build:module":"task run taskFile=build/Build.cfc :projectName=`package show slug` :version=`package show version`", + "build:docs":"task run taskFile=build/Build.cfc target=docs :projectName=`package show slug` :version=`package show version`", "release":"recipe build/release.boxr", - "format":"cfformat run handlers,helpers,interceptors/,models/,test-harness/tests/,ModuleConfig.cfc --overwrite", - "format:watch":"cfformat watch handlers,helpers,interceptors/,models/,test-harness/tests/,ModuleConfig.cfc ./.cfformat.json", - "format:check":"cfformat check handlers,helpers,interceptors/,models/,test-harness/tests/,ModuleConfig.cfc" - }, - "dependencies":{ - "JSONPrettyPrint":"^1.4.1" + "format":"cfformat run appenders,aspects,handlers,interceptors,models,test-harness/tests/**.cfc,ModuleConfig.cfc --overwrite", + "format:watch":"cfformat watch appenders,aspects,handlers,interceptors,models,test-harness/tests/**.cfc,ModuleConfig.cfc ./.cfformat.json", + "format:check":"cfformat check appenders,aspects,handlers,interceptors,models,test-harness/tests/**.cfc,ModuleConfig.cfc", + "cfpm":"echo '\".engine/adobe2021/WEB-INF/cfusion/bin/cfpm.sh\"' | run", + "cfpm:install":"echo '\".engine/adobe2021/WEB-INF/cfusion/bin/cfpm.sh\" install ${1}' | run", + "install:2021":"run-script cfpm:install zip,debugger,orm,mysql,postgresql,sqlserver,feed", + "install:dependencies":"install && cd test-harness && install", + "start:lucee":"server start serverConfigFile=server-lucee@5.json", + "start:2016":"server start serverConfigFile=server-adobe@2016.json", + "start:2018":"server start serverConfigFile=server-adobe@2018.json", + "start:2021":"server start serverConfigFile=server-adobe@2021.json", + "stop:lucee":"server stop name=cbdebugger-lucee@5", + "stop:2016":"server stop name=cbdebugger-adobe@2016", + "stop:2018":"server stop name=cbdebugger-adobe@2018", + "stop:2021":"server stop name=cbdebugger-adobe@2021", + "logs:lucee":"server log name=cbdebugger-lucee@5 --follow", + "logs:2016":"server log name=cbdebugger-adobe@2016 --follow", + "logs:2018":"server log name=cbdebugger-adobe@2018 --follow", + "logs:2021":"server log name=cbdebugger-adobe@2021 --follow" }, "installPaths":{ - "JSONPrettyPrint":"modules/JSONPrettyPrint/" + "JSONPrettyPrint":"modules/JSONPrettyPrint/", + "sqlformatter":"modules/sqlformatter/" } -} \ No newline at end of file +} diff --git a/build/Build.cfc b/build/Build.cfc index ae94650..926cce1 100644 --- a/build/Build.cfc +++ b/build/Build.cfc @@ -23,6 +23,8 @@ component { "test-harness", "(package|package-lock).json", "webpack.config.js", + "server-.*\.json", + "docker-compose.yml", "^\..*" ]; diff --git a/changelog.md b/changelog.md index f389a04..f4bcf0e 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ---- +## [3.3.0] => 2022 + +### Added + +* Asynchronous saving of storage at end of requests +* Asynchronous size checks of storage +* Free memory diff in the visualizers +* Ability for each profiler to track how much memory they used during the course of the transaction by analyzing free memory +* New setting `requestPanelDock` to show/hide the request panel in the dock +* Migration to use new module template approaches that supports github releases, compilation and more +* Exception bean delegations in debugger service to avoid multi-instantiations `performance` +* Refactoring to increase `performance` and reusability +* Migration to AlpineJS from jquery +* New `sqlformatter` module from @michaelborn +* Updated to faster wasy to get a local ip and local hostname + +### Fixed + +* Actually show a 404 if debug mode is off +* JS Bumps + +### Removed + +* Reload all modules. Makes no sense as you can just reinit. + +---- + ## [3.2.0] => 2021-JUL-21 ### Changed @@ -25,7 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed * Do not render when the request's content type is NOT html - + ---- ## [3.1.0] => 2021-MAy-19 @@ -175,7 +202,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * https://ortussolutions.atlassian.net/browse/CCM-14 Issue with unloading modules * https://ortussolutions.atlassian.net/browse/CCM-25 Lucee support -* https://ortussolutions.atlassian.net/browse/CCM-24 Added names of rendered +* https://ortussolutions.atlassian.net/browse/CCM-24 Added names of rendered * Unloading of helpers on unload views and layouts * Updated production ignore lists @@ -190,4 +217,4 @@ views and layouts ## [1.0.0] -* Create first module version \ No newline at end of file +* Create first module version diff --git a/handlers/Main.cfc b/handlers/Main.cfc index 9b3177b..e4da0be 100644 --- a/handlers/Main.cfc +++ b/handlers/Main.cfc @@ -11,28 +11,23 @@ component extends="coldbox.system.RestHandler" { /** * Executes before all handler actions */ - any function preHandler( - event, - rc, - prc, - action, - eventArguments - ){ + any function preHandler( event, rc, prc, action, eventArguments ){ // Global params event.paramValue( "frequency", 0 ).paramValue( "isVisualizer", false ); // Don't show cf debug on ajax calls if ( event.isAjax() ) { - cfsetting( showdebugoutput = "false" ); + setting showdebugoutput=false; } // If not enabled, just 404 it if ( !variables.debuggerService.getDebugMode() ) { - event.setHTTPHeader( + event.renderData( statusCode = 404, - statusText = "page not found" + statusText = "Not Found", + type = "text", + data = "Page Not Found" ); - return "Page Not Found"; } } @@ -50,26 +45,41 @@ component extends="coldbox.system.RestHandler" { function renderDebugger( event, rc, prc ){ // are we in visualizer mode? var isVisualizer = event.getCurrentEvent() eq "cbdebugger:main.index"; - + setting showdebugoutput=false; // Return the debugger layout+view + // We pass in all the variables needed, to avoid prc/rc conflicts return renderLayout( layout : isVisualizer ? "Monitor" : "Main", module : "cbdebugger", view : "main/debugger", viewModule: "cbdebugger", args : { - isVisualizer : isVisualizer, - pageTitle : "ColdBox Debugger", - debugStartTime : getTickCount(), - refreshFrequency : rc.frequency, - urlBase : event.buildLink( "" ), - moduleSettings : variables.debuggerConfig.modules.enabled ? getSetting( "modules" ) : {}, + // Get the current profiler for the current request. Basically the first in the stack + currentProfiler : variables.debuggerService.getCurrentProfiler(), + // Module Config debuggerConfig : variables.debuggerConfig, + // Service pointer debuggerService : variables.debuggerService, + // When debugging starts + debugStartTime : getTickCount(), + // Env struct environment : variables.debuggerService.getEnvironment(), + // Visualizer mode or panel at bottom mode + isVisualizer : isVisualizer, + // Manifest Root + manifestRoot : event.getModuleRoot( "cbDebugger" ) & "/includes", + // Module Root + moduleRoot : event.getModuleRoot( "cbDebugger" ), + // All Module Settings + moduleSettings : getSetting( "modules" ), + // Rendering page title + pageTitle : "ColdBox Debugger", + // Profilers storage to display profilers : variables.debuggerService.getProfilerStorage(), - currentProfiler : variables.debuggerService.getCurrentProfiler(), - manifestRoot : event.getModuleRoot( "cbDebugger" ) & "/includes" + // Incoming frequency if in visualizer mode + refreshFrequency : rc.frequency, + // Url build base + urlBase : event.buildLink( "" ) } ); } @@ -117,20 +127,13 @@ component extends="coldbox.system.RestHandler" { default: { arraySort( aProfilers, function( e1, e2 ){ if ( rc.sortOrder == "asc" ) { - return dateCompare( - arguments.e1.timestamp, - arguments.e2.timestamp - ); + return dateCompare( arguments.e1.timestamp, arguments.e2.timestamp ); } - return dateCompare( - arguments.e2.timestamp, - arguments.e1.timestamp - ); + return dateCompare( arguments.e2.timestamp, arguments.e1.timestamp ); } ); break; } } - return renderView( view : "main/partials/profilers", module: "cbdebugger", @@ -151,23 +154,16 @@ component extends="coldbox.system.RestHandler" { view : "main/partials/profilerReport", module: "cbdebugger", args : { - environment : variables.debuggerService.getEnvironment(), - profiler : variables.debuggerService.getProfilerById( rc.id ), - debuggerConfig : variables.debuggerConfig, - isVisualizer : rc.isVisualizer + debuggerService : variables.debuggerService, + environment : variables.debuggerService.getEnvironment(), + profiler : variables.debuggerService.getProfilerById( rc.id ), + debuggerConfig : variables.debuggerConfig, + isVisualizer : rc.isVisualizer }, prePostExempt: true ); } - /** - * Reload all modules - */ - function reloadAllModules( event, rc, prc ){ - variables.controller.getModuleService().reloadAll(); - event.getResponse().addMessage( "Modules Reloaded!" ); - } - /** * Unload a modules */ diff --git a/interceptors/ACFSqlCollector.cfc b/interceptors/ACFSqlCollector.cfc new file mode 100644 index 0000000..f07d3b7 --- /dev/null +++ b/interceptors/ACFSqlCollector.cfc @@ -0,0 +1,76 @@ +/** + * Adobe ColdFusion SQL Collector Interecptor + */ +component extends="coldbox.system.Interceptor" { + + // DI + property name="debuggerService" inject="debuggerService@cbdebugger"; + property name="debuggerConfig" inject="coldbox:moduleSettings:cbdebugger"; + + /** + * Ensure the ACF Debugger is online and scoped + */ + private function ensureACFDebugger(){ + variables.acfDebuggingService = createObject( "Java", "coldfusion.server.ServiceFactory" ).getDebuggingService(); + // If disabled, turn it on + if ( !variables.acfDebuggingService.isEnabled() ) { + variables.acfDebuggingService.setEnabled( javacast( "boolean", true ) ); + } + // Get the debugger but verify it, since if it is recently enabled it might be null + variables.acfDebugger = variables.acfDebuggingService.getDebugger(); + if ( isNull( variables.acfDebugger ) ) { + variables.acfDebuggingService.reset( javacast( "int", 1 ) ); + variables.acfDebugger = variables.acfDebuggingService.getDebugger(); + } + } + + /** + * Listen to when the tracker gets created + */ + function onDebuggerRequestTrackerCreation( event, interceptData, rc, prc ){ + // Ensure debugger is on + ensureACFDebugger(); + // prep collector + arguments.interceptData.requestTracker[ "cfQueries" ] = { + "all" : queryNew( "" ), + "grouped" : {}, + "totalQueries" : 0, + "totalExecutionTime" : 0 + }; + } + + /** + * Listen when request tracker is being recorded + */ + function onDebuggerProfilerRecording( event, interceptData, rc, prc ){ + var requestTracker = arguments.interceptData.requestTracker; + // Get the query tracker data + requestTracker.cfQueries.all = variables.acfDebugger + .getData() + // Store only sql query items + .filter( function( row ){ + return arguments.row.type == "SqlQuery"; + } ) + // Remove results, we don't want those stored + .map( function( row ){ + row.delete( "Result" ); + return row; + } ); + // Process grouped sql + requestTracker.cfQueries.all.each( function( row ){ + var sqlHash = hash( row.body ); + if ( !requestTracker.cfQueries.grouped.keyExists( sqlHash ) ) { + requestTracker.cfQueries.grouped[ sqlHash ] = { "sql" : row.body, "count" : 0, "records" : [] }; + } + requestTracker.cfqueries.grouped[ sqlHash ].count++; + requestTracker.cfqueries.grouped[ sqlHash ].records.append( row ); + } ); + + // Store total number of queries executed + requestTracker.cfQueries[ "totalQueries" ] = requestTracker.cfQueries.all.len(); + requestTracker.cfQueries[ "totalExecutionTime" ] = requestTracker.cfQueries.all.reduce( function( total, q ){ + return arguments.total + ( arguments.q.endTime - arguments.q.startTime ); + }, 0 ); + } + +} diff --git a/interceptors/RequestCollector.cfc b/interceptors/RequestCollector.cfc index f27c57c..bf59cf8 100755 --- a/interceptors/RequestCollector.cfc +++ b/interceptors/RequestCollector.cfc @@ -69,13 +69,7 @@ component extends="coldbox.system.Interceptor" { /** * Listen to post processing execution */ - public function postProcess( - event, - interceptData, - rc, - prc, - buffer - ){ + public function postProcess( event, interceptData, rc, prc, buffer ){ // Determine if we are in a debugger call so we can ignore it or not? if ( arguments.event.getCurrentModule() == "cbdebugger" && !variables.debuggerConfig.requestTracker.trackDebuggerEvents @@ -88,33 +82,25 @@ component extends="coldbox.system.Interceptor" { isNull( request.$timerHashes.processHash ) ? "" : request.$timerHashes.processHash ); // Record the profiler with the last tickcount - variables.debuggerService.recordProfiler( - event : arguments.event, - executionTime: getTickCount() - ); - + variables.debuggerService.recordProfiler( event: arguments.event, executionTime: getTickCount() ); // Determine if we can render the debugger at the bottom of the request if ( - // Check content type on request - findNoCase( - "html", - getPageContextResponse().getContentType() - ) AND - // Is the debug mode turned on + // Is the debugger turned on variables.debuggerService.getDebugMode() AND + // Can we show the end of request dock + variables.debuggerConfig.requestPanelDock AND // Has it not been disabled by the user programmatically arguments.event.getPrivateValue( "cbox_debugger_show", true ) AND + // Don't render in ajax calls + !arguments.event.isAjax() AND + // Only show on HTML content types + findNoCase( "html", getPageContextResponse().getContentType() ) AND // We don't have any render data OR the render data is HTML ( structIsEmpty( arguments.event.getRenderData() ) || arguments.event.getRenderData().contentType == "text/html" ) AND - // Don't render in ajax calls - !arguments.event.isAjax() AND - // Don't render in testing mode - !findNoCase( - "MockController", - getMetadata( controller ).name - ) + // Don't render in testing modes + !findNoCase( "MockController", getMetadata( controller ).name ) ) { // render out the debugger to the buffer output arguments.buffer.append( runEvent( "cbdebugger:main.renderDebugger" ) ); @@ -238,10 +224,7 @@ component extends="coldbox.system.Interceptor" { if ( variables.debuggerConfig.requestTracker.profileWireBoxObjectCreation and structKeyExists( request, "cbdebugger" ) - and structKeyExists( - request.$timerHashes, - arguments.interceptData.mapping.getName() - ) + and structKeyExists( request.$timerHashes, arguments.interceptData.mapping.getName() ) ) { variables.timerService.stop( request.$timerHashes[ arguments.interceptData.mapping.getName() ] ); } @@ -302,10 +285,7 @@ component extends="coldbox.system.Interceptor" { // relocate to correct panel if passed if ( event.getValue( "debugPanel", "" ) eq "" ) { - relocate( - URL = "#listLast( cgi.script_name, "/" )#", - addtoken = false - ); + relocate( URL = "#listLast( cgi.script_name, "/" )#", addtoken = false ); } else { relocate( URL = "#listLast( cgi.script_name, "/" )#?debugpanel=#event.getValue( "debugPanel", "" )#", diff --git a/layouts/Main.cfm b/layouts/Main.cfm index 6702fe0..655916a 100644 --- a/layouts/Main.cfm +++ b/layouts/Main.cfm @@ -4,22 +4,26 @@
- #announce( "beforeDebuggerPanel", { - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService } )# - + #renderView()# - + #announce( "afterDebuggerPanel", { - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService } )#
- \ No newline at end of file + diff --git a/layouts/Monitor.cfm b/layouts/Monitor.cfm index 604f6fb..7619b46 100644 --- a/layouts/Monitor.cfm +++ b/layouts/Monitor.cfm @@ -2,7 +2,6 @@ - @@ -16,13 +15,16 @@
- + > #announce( "beforeDebuggerPanel", { - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService } )# @@ -32,7 +34,8 @@ #announce( "afterDebuggerPanel", { - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService } )#
@@ -41,4 +44,4 @@ -
\ No newline at end of file + diff --git a/models/DebuggerService.cfc b/models/DebuggerService.cfc index e8890a0..6e34a19 100755 --- a/models/DebuggerService.cfc +++ b/models/DebuggerService.cfc @@ -8,6 +8,7 @@ component accessors="true" extends ="coldbox.system.web.services.BaseService" singleton + threadsafe { /** @@ -16,8 +17,11 @@ component * -------------------------------------------------------------------------- */ - property name="timerService" inject="Timer@cbdebugger"; + property name="asyncManager" inject="coldbox:asyncManager"; property name="interceptorService" inject="coldbox:interceptorService"; + property name="timerService" inject="provider:Timer@cbdebugger"; + property name="jsonFormatter" inject="provider:JSONPrettyPrint@JSONPrettyPrint"; + property name="sqlFormatter" inject="provider:Formatter@sqlformatter"; /** * -------------------------------------------------------------------------- @@ -53,15 +57,12 @@ component /** * Constructor * - * @controller The ColdBox controller + * @controller The ColdBox controller * @controller.inject coldbox - * @settings Module Settings - * @settings.inject coldbox:modulesettings:cbdebugger + * @settings Module Settings + * @settings.inject coldbox:modulesettings:cbdebugger */ - function init( - required controller, - required settings - ){ + function init( required controller, required settings ){ // setup controller variables.controller = arguments.controller; // config @@ -97,6 +98,14 @@ component "appHash" : variables.controller.getAppHash() }; + // default the password to something so we are secure by default + if ( variables.debugPassword eq "cb:null" ) { + variables.debugPassword = hash( variables.environment.appHash & now() ); + } else if ( len( variables.debugPassword ) ) { + // hash the password into memory + variables.debugPassword = hash( variables.debugPassword ); + } + // Initialize secret key rotateSecretKey(); @@ -120,12 +129,9 @@ component current debugPassword and a random salt. The salt also protects against someone being able to reverse engineer the orignal password from an intercepted cookie value. */ - var salt = createUUID(); + var salt = variables.uuid.randomUUID(); variables.secretKey = - hash( - variables.controller.getAppHash() & variables.debugPassword & salt, - "SHA-256" - ); + hash( variables.controller.getAppHash() & variables.debugPassword & salt, "SHA-256" ); return this; } @@ -137,7 +143,6 @@ component if ( not ( len( variables.secretKey ) ) ) { return false; } - // If Cookie exists, it's value is used. if ( isDebugCookieValid() ) { // Must be equal to the current secret key @@ -164,21 +169,16 @@ component */ DebuggerService function setDebugMode( required boolean mode ){ if ( arguments.mode ) { - cfcookie( - name = getCookieName(), - value = variables.secretKey - ); + cfcookie( name = getCookieName(), value = variables.secretKey ); } else { - cfcookie( - name = getCookieName(), - value = "_disabled_" - ); + cfcookie( name = getCookieName(), value = "_disabled_" ); } return this; } /** - * Create a new request tracking structure + * Create a new request tracking structure. Called by the Request collector when it's ready + * to start tracking * * @event The ColdBox context we will start the tracker on */ @@ -187,26 +187,30 @@ component request.tracers = []; // Init the request debugger tracking request.cbDebugger = { - "id" : variables.uuid.randomUUID(), - "timestamp" : now(), - "ip" : getRealIP(), - "threadInfo" : getCurrentThread().toString(), - "startCount" : getTickCount(), - "executionTime" : 0, - "fullUrl" : arguments.event.getFullUrl(), - "timers" : [], - "tracers" : [], - "requestData" : getHTTPRequestData( variables.debuggerConfig.requestTracker.httpRequest.profileHTTPBody ), - "response" : { "statusCode" : 0, "contentType" : "" }, "coldbox" : {}, "exception" : {}, - "userAgent" : cgi.HTTP_USER_AGENT, - "queryString" : cgi.QUERY_STRING, + "executionTime" : 0, + "endFreeMemory" : 0, + "formData" : ( form ?: {} ), + "fullUrl" : arguments.event.getFullUrl(), "httpHost" : cgi.HTTP_HOST, "httpReferer" : cgi.HTTP_REFERER, - "formData" : serializeJSON( form ?: {} ), + "id" : variables.uuid.randomUUID(), "inetHost" : discoverInetHost(), - "localIp" : ( isNull( cgi.local_addr ) ? "0.0.0.0" : cgi.local_addr ) + "ip" : getRealIP(), + "localIp" : getServerIp(), + "queryString" : cgi.QUERY_STRING, + "requestData" : getHTTPRequestData( + variables.debuggerConfig.requestTracker.httpRequest.profileHTTPBody + ), + "response" : { "statusCode" : 0, "contentType" : "" }, + "startCount" : getTickCount(), + "startFreeMemory" : variables.jvmRuntime.freeMemory(), + "threadInfo" : getCurrentThread().toString(), + "timers" : [], + "timestamp" : now(), + "tracers" : [], + "userAgent" : cgi.HTTP_USER_AGENT }; // Event before recording @@ -280,9 +284,9 @@ component /** * Record a profiler and it's timers internally * - * @event The request context that requested the record + * @event The request context that requested the record * @executionTime The time it took for th request to finish - * @exception If there is an exception in the request, track it + * @exception If there is an exception in the request, track it */ DebuggerService function recordProfiler( required event, @@ -291,33 +295,25 @@ component ){ var targetStorage = getProfilerStorage(); - // size check, if passed, pop one - if ( arrayLen( targetStorage ) gte variables.debuggerConfig.requestTracker.maxProfilers ) { - arrayDeleteAt( - targetStorage, - arrayLen( targetStorage ) - ); - } - // Build out the exception data to trace if any? var exceptionData = {}; if ( isObject( arguments.exception ) || !structIsEmpty( arguments.exception ) ) { exceptionData = { - "stackTrace" : arguments.exception.stacktrace ?: "", - "type" : arguments.exception.type ?: "", "detail" : arguments.exception.detail ?: "", - "tagContext" : arguments.exception.tagContext ?: [], - "nativeErrorCode" : arguments.exception.nativeErrorCode ?: "", - "sqlState" : arguments.exception.sqlState ?: "", - "sql" : arguments.exception.sql ?: "", - "queryError" : arguments.exception.queryError ?: "", - "where" : arguments.exception.where ?: "", "errNumber" : arguments.exception.errNumber ?: "", - "missingFileName" : arguments.exception.missingFileName ?: "", + "errorCode" : arguments.exception.errorCode ?: "", + "extendedInfo" : arguments.exception.extendedInfo ?: "", "lockName" : arguments.exception.lockName ?: "", "lockOperation" : arguments.exception.lockOperation ?: "", - "errorCode" : arguments.exception.errorCode ?: "", - "extendedInfo" : arguments.exception.extendedInfo ?: "" + "missingFileName" : arguments.exception.missingFileName ?: "", + "nativeErrorCode" : arguments.exception.nativeErrorCode ?: "", + "queryError" : arguments.exception.queryError ?: "", + "sql" : arguments.exception.sql ?: "", + "sqlState" : arguments.exception.sqlState ?: "", + "stackTrace" : arguments.exception.stacktrace ?: "", + "tagContext" : arguments.exception.tagContext ?: [], + "type" : arguments.exception.type ?: "", + "where" : arguments.exception.where ?: "" }; } @@ -330,15 +326,10 @@ component param request.cbDebugger.startCount = 0; request.cbDebugger.append( { - "timers" : variables.timerService.getSortedTimers(), - "tracers" : getTracers(), + "endFreeMemory" : variables.jvmRuntime.freeMemory(), "exception" : exceptionData, "executionTime" : arguments.executionTime - request.cbDebugger.startCount, - "response" : { - "statusCode" : ( structIsEmpty( exceptionData ) ? getPageContextResponse().getStatus() : 500 ), - "contentType" : getPageContextResponse().getContentType() - }, - "coldbox" : { + "coldbox" : { "RoutedUrl" : arguments.event.getCurrentRoutedUrl(), "Route" : arguments.event.getCurrentRoute(), "RouteMetadata" : serializeJSON( arguments.event.getCurrentRouteMeta() ), @@ -349,7 +340,13 @@ component "ViewModule" : arguments.event.getCurrentViewModule(), "Layout" : arguments.event.getCurrentLayout(), "LayoutModule" : arguments.event.getCurrentLayoutModule() - } + }, + "response" : { + "statusCode" : ( structIsEmpty( exceptionData ) ? getPageContextResponse().getStatus() : 500 ), + "contentType" : getPageContextResponse().getContentType() + }, + "timers" : variables.timerService.getSortedTimers(), + "tracers" : getTracers() }, true ); @@ -365,13 +362,29 @@ component // Are we using cache storage if ( variables.debuggerConfig.requestTracker.storage eq "cachebox" ) { - // store indefintely using the debugger and app hash - getCacheRegion().set( getStorageKey(), targetStorage, 0, 0 ); + // Store async in case it delays + variables.asyncManager.newFuture( function(){ + // store indefintely using the debugger and app hash + getCacheRegion().set( getStorageKey(), targetStorage, 0, 0 ); + } ); } + // async rotation - size check, if passed, pop one + variables.asyncManager.newFuture( function(){ storageSizeCheck(); } ); + return this; } + /** + * Do a storage size check and pop if necessary + */ + function storageSizeCheck(){ + var targetStorage = getProfilerStorage(); + if ( arrayLen( targetStorage ) gte variables.debuggerConfig.requestTracker.maxProfilers ) { + arrayDeleteAt( targetStorage, arrayLen( targetStorage ) ); + } + } + /** * Retrieve the profiler by incoming id * @@ -394,9 +407,9 @@ component * Push a new tracer into the debugger. This comes from LogBox, so we follow * the same patterns * - * @message The message to trace - * @severity The severity of the message - * @category The tracking category the message came from + * @message The message to trace + * @severity The severity of the message + * @category The tracking category the message came from * @timestamp The timestamp of the message * @extraInfo Extra info to store in the tracer */ @@ -443,12 +456,35 @@ component */ function discoverInetHost(){ try { - return createObject( "java", "java.net.InetAddress" ).getLocalHost().getHostName(); + return getInetAddress().getLocalHost().getHostName(); } catch ( any e ) { return cgi.SERVER_NAME; } } + /** + * Get the server IP Address + */ + string function getServerIp(){ + try { + return getInetAddress().getLocalHost().getHostAddress(); + } catch ( any e ) { + return "0.0.0.0"; + } + } + + /** + * Get the Java InetAddress object + * + * @return java.net.InetAddress + */ + private function getInetAddress(){ + if ( isNull( variables.inetAddress ) ) { + variables.inetAddress = createObject( "java", "java.net.InetAddress" ); + } + return variables.inetAddress; + } + /** * Get Real IP, by looking at clustered, proxy headers and locally. */ @@ -493,11 +529,46 @@ component return getCurrentThread().getName(); } + /** + * Process Stack trace for errors + * + * @str The stacktrace to process + * + * @return The nicer trace + */ + function processStackTrace( required str ){ + return getExceptionBean().processStackTrace( argumentCollection = arguments ); + } + + /** + * Compose a screen for a file to open in an editor + * + * @event The request context + * @instance An instance of a tag context array + * + * @return The string for the IDE + */ + function openInEditorURL( required event, required struct instance ){ + return getExceptionBean().openInEditorURL( argumentCollection = arguments ); + } + + /** + * Get the exception bean helper lazy loaded + * + * @return coldbox.system.web.context.ExceptionBean + */ + function getExceptionBean(){ + if ( isNull( variables.exceptionBean ) ) { + variables.exceptionBean = new coldbox.system.web.context.ExceptionBean(); + } + return variables.exceptionBean; + } + /** * This function tries to discover from where a target method was called from * by investigating the call stack * - * @targetMethod The target method we are trying to pin point + * @targetMethod The target method we are trying to pin point * @templateMatch A string fragment to further narrow down the location, we match this against the template path * * @return Struct of { function, lineNumber, line, template } diff --git a/models/SqlFormatter.cfc b/models/SqlFormatter.cfc deleted file mode 100644 index dc2c113..0000000 --- a/models/SqlFormatter.cfc +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright Since 2005 ColdBox Framework by Luis Majano and Ortus Solutions, Corp - * www.ortussolutions.com - * --- - * This leverages Hibernate for SQL Formatting - */ -component accessors="true" singleton { - - property name="formatter"; - - /** - * Constructor - */ - function init(){ - // get formatter for sql string beautification: ACF vs Lucee - if ( - findNoCase( - "coldfusion", - server.coldfusion.productName - ) - ) { - // Formatter Support - variables.formatter = createObject( - "java", - "org.hibernate.engine.jdbc.internal.BasicFormatterImpl" - ); - } - // Old Lucee Hibernate 3 - else { - variables.formatter = createObject( - "java", - "org.hibernate.jdbc.util.BasicFormatterImpl" - ); - } - - return this; - } - - /** - * Format SQL - * - * @sql The sql to format - * @wrapInPre To wrap or not the sql in
 tags, default is true
-	 */
-	function formatSql(
-		required sql,
-		boolean wrapInPre = true
-	){
-		if ( arguments.wrapInPre ) {
-			return "
#variables.formatter.format( arguments.sql )#
"; - } - - return variables.formatter.format( arguments.sql ); - } - -} diff --git a/models/Timer.cfc b/models/Timer.cfc index 26cab72..d565a8b 100755 --- a/models/Timer.cfc +++ b/models/Timer.cfc @@ -4,7 +4,7 @@ * --- * This component tracks execution times in our internal request facilities. */ -component accessors="true" singleton { +component accessors="true" singleton threadsafe{ /** * Constructor diff --git a/package-lock.json b/package-lock.json index 393409a..029eb54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,19 +2,24 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "@alpinejs/morph": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/@alpinejs/morph/-/morph-3.9.6.tgz", + "integrity": "sha512-JFl2N9wJRhPtfU2pf6fOuKYyZ4zH6Zi8Okp/C/HXaEnO75BOK0pN/hJ/3zri8TPq0lO58UUbhC5hXd/Qe8DrOQ==" + }, "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, "@babel/core": { @@ -50,12 +55,12 @@ } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "dev": true, "requires": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -69,63 +74,65 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", - "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -138,166 +145,165 @@ "semver": "^6.1.2" } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.17.0" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helpers": { @@ -312,166 +318,198 @@ } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", - "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "dev": true }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", - "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { @@ -492,6 +530,15 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -573,353 +620,368 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", - "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.13.8", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -929,52 +991,53 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.12.13", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.12", - "babel-plugin-polyfill-corejs2": "^0.1.4", - "babel-plugin-polyfill-corejs3": "^0.1.3", - "babel-plugin-polyfill-regenerator": "^0.1.2", - "core-js-compat": "^3.9.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -985,50 +1048,50 @@ } }, "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -1223,6 +1286,19 @@ } } }, + "@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "requires": { + "@vue/shared": "3.1.5" + } + }, + "@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==" + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -1499,6 +1575,14 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, + "alpinejs": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.9.6.tgz", + "integrity": "sha512-NRkBWiKLA/juIVh4sJxU1vkKrhEbsKZAvsOTPh1NmLH+CDktg1W5yR5DHlM5LXq5fjntGtzEWTjjPkjT06opeA==", + "requires": { + "@vue/reactivity": "~3.1.1" + } + }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -1775,33 +1859,33 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", - "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.0", - "@babel/helper-define-polyfill-provider": "^0.1.5", + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", - "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "babel-runtime": { @@ -2086,30 +2170,16 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.739", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", - "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", - "dev": true - } + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "buffer": { @@ -2269,9 +2339,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001204", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", - "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", "dev": true }, "caseless": { @@ -2840,12 +2910,12 @@ "dev": true }, "core-js-compat": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", - "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.0.tgz", + "integrity": "sha512-WwA7xbfRGrk8BGaaHlakauVXrlYmAIkk8PNGb1FDQS+Rbrewc3pgFfwJFRw6psmJVAll7Px9UHRYE16oRQnwAQ==", "dev": true, "requires": { - "browserslist": "^4.16.3", + "browserslist": "^4.20.2", "semver": "7.0.0" }, "dependencies": { @@ -3447,6 +3517,12 @@ "safer-buffer": "^2.1.0" } }, + "electron-to-chromium": { + "version": "1.4.111", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.111.tgz", + "integrity": "sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw==", + "dev": true + }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -5487,11 +5563,6 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, "js-base64": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", @@ -5917,9 +5988,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { @@ -6169,9 +6240,9 @@ } }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "node-sass": { @@ -6677,9 +6748,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -6720,6 +6791,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -7632,24 +7709,24 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -7678,29 +7755,29 @@ "dev": true }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", "dev": true }, "regjsparser": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.8.tgz", - "integrity": "sha512-3weFrFQREJhJ2PW+iCGaG6TenyzNSZgsBKZ/oEf6Trme31COSeIWhHw9O6FPkuXktfx+b6Hf/5e6dKPHaROq2g==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -9124,31 +9201,31 @@ } }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, "union-value": { diff --git a/package.json b/package.json index 4453745..51eb075 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "private": true, "devDependencies": { + "@babel/preset-env": "^7.16.11", "autoprefixer": "^9.7.6", "babel-eslint": "^10.0.1", "coldbox-elixir": "^3.0.0", @@ -17,7 +18,8 @@ "style-loader": "^1.2.1" }, "dependencies": { - "jquery": "^3.6.0" + "@alpinejs/morph": "^3.9.6", + "alpinejs": "^3.9.6" }, "scripts": { "dev": "cross-env NODE_ENV=development webpack --env.NODE_ENV=development --hide-modules", diff --git a/readme.md b/readme.md index f86506b..47cfc2c 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1,8 @@ -[![Build Status](https://travis-ci.com/coldbox-modules/cbox-debugger.svg?branch=master)](https://travis-ci.com/coldbox-modules/cbox-debugger) +[![cbdebugger CI](https://github.com/coldbox-modules/cbdebugger/actions/workflows/ci.yml/badge.svg)](https://github.com/coldbox-modules/cbdebugger/actions/workflows/ci.yml) # Welcome To The ColdBox Debugger Module -The ColdBox Debugger module is a light-weigth performance monitor and profiling tool for ColdBox applications. It can generate a nice debugging panel on every rendered page or a dedicated visualizer to make your ColdBox application development nicer, funer and greater! Yes, funer is a word! +The ColdBox Debugger module is a light-weight performance monitor and profiling tool for ColdBox applications. It can generate a nice debugging panel on every rendered page or a dedicated visualizer to make your ColdBox application development nicer, funer and greater! Yes, funer is a word!

@@ -22,13 +22,33 @@ Debugger Request Visualizer Request Tracker Collapsed

+## Capabilities + +The ColdBox debugger is a light-weigth performance monitor and profiler for your ColdBox applications. It tracks your requests, whether Ajax, traditional or REST, it's environment, execution and much more. Here is a listing of some of the capabilities you get with the ColdBox Debugger: + +- Track all incoming requests to your applications in memory or offloaded cache +- Track exceptions and execution environment +- Track incoming http requests, parameters, body and much more +- Track final request collections +- Track Hibernate and `cborm` queries, criteria queries and session stats +- Track `qb` and `quick` queries, entities and stats +- Tap into LogBox via our Tracer messages and discover logging on a per request basis +- Profile execution and results of **ANY** model object +- Profile execution of **ANY** ColdBox interception point +- Custom Timer helpers for adding timing methods and annotations anywhere in -our code +- Profile your production or development apps with ease +- Track ColdBox modules and lifecycles +- Highly configurable +- Highly extensible +- Track Adobe ColdFusion Queries (ColdFusion 2018+) + ## License Apache License, Version 2.0. ## Important Links -- Source: https://github.com/coldbox-modules/cbox-debugger +- Source: https://github.com/coldbox-modules/cbdebugger - ForgeBox: https://www.forgebox.io/view/cbdebugger - Community: https://community.ortussolutions.com/c/box-modules/cbdebugger/38 - Issues: https://ortussolutions.atlassian.net/browse/CBDEBUGGER @@ -37,9 +57,21 @@ Apache License, Version 2.0. ## System Requirements - Lucee 5+ -- ColdFusion 2016+ +- ColdFusion 2018+ - ColdBox 6+ +## Optional Requirements + +### cborm Collector + +- Hibernate extension (on Lucee) +- `orm` package on ACF 2021 + +### Adobe SQL Collector + +- `cbdebugger` package on ACF 2021 + - Check `Database Activity` on the debugger page or cfconfig setting (`debuggingShowDatabase : true`) + # Instructions Just drop into your **modules** folder or use CommandBox to install @@ -48,28 +80,9 @@ Just drop into your **modules** folder or use CommandBox to install This will activate the debugger in your application and render out at the end of a request or by visiting the debugger request tracker visualizer at `/cbdebugger`. -## Capabilities - -The ColdBox debugger is a light-weigth performance monitor and profiler for your ColdBox applications. It tracks your requests, whether Ajax, traditional or REST, it's environment, execution and much more. Here is a listing of some of the capabilities you get with the ColdBox Debugger: - -- Track all incoming requests to your applications in memory or offloaded cache -- Track exceptions and execution environment -- Track incoming http requests, parameters, body and much more -- Track final request collections -- Track Hibernate and `cborm` queries, criteria queries and session stats -- Track `qb` and `quick` queries, entities and stats -- Tap into LogBox via our Tracer messages and discover logging on a per request basis -- Profile execution and results of **ANY** model object -- Profile execution of **ANY** ColdBox interception point -- Custom Timer helpers for adding timing methods and annotations anywhere in -our code -- Profile your production or development apps with ease -- Track ColdBox modules and lifecycles -- Highly configurable -- Highly extensible - ## Settings -The debugger is highly configurable and we have tons of settings to assist you in your development adventures and also in your performance tuning adventures. Please note that the more collectors you active, the slower your application can become. By default we have pre-selected defaults which add neglible performance to your applications. +The debugger is highly configurable and we have tons of settings to assist you in your development adventures and also in your performance tuning adventures. Please note that the more collectors you activate, the **slower** your application can become. By default we have pre-selected defaults which add neglible performance to your applications. Open your `config/coldbox.cfc` configuration object and add into the `moduleSettings` the `cbDebugger` key with the following options: @@ -85,13 +98,16 @@ moduleSettings = { debugMode : true, // The URL password to use to activate it on demand debugPassword : "cb:null", + // This flag enables/disables the end of request debugger panel docked to the bottem of the page. + // If you disable i, then the only way to visualize the debugger is via the `/cbdebugger` endpoint + requestPanelDock : true, // Request Tracker Options requestTracker : { // Track all cbdebugger events, by default this is off, turn on, when actually profiling yourself :) How Meta! trackDebuggerEvents : false, - // Store the request profilers in heap memory or in cachebox, default is cachebox + // Store the request profilers in heap memory or in cachebox, default is cachebox. Options are: local, cachebox storage : "cachebox", - // Which cache region to store the profilers in + // Which cache region to store the profilers in if storage == cachebox cacheName : "template", // Expand by default the tracker panel or not expanded : true, @@ -155,6 +171,13 @@ moduleSettings = { // Log the binding parameters (requires CBORM 3.2.0+) logParams : true }, + // Adobe ColdFusion SQL Collector + acfSql : { + enabled : true, + expanded : false, + // Log the binding parameters + logParams : true + }, // Async Manager Reporting async : { enabled : true, @@ -170,8 +193,9 @@ The module will also register the following model objects for you: - `debuggerService@cbdebugger` - `timer@cbdebugger` - + The `DebuggerService` can be used a-la-carte for your debugging purposes. + The `Timer` object will allow you to time code execution and send the results to the debugger panel. ## Helper Mixins @@ -244,7 +268,7 @@ This module will also register a few methods in all your handlers/interceptors/l ## Debugger Events -The debugger also announces several events that you can listen to and extend the debuging and profiling capabilities: +The debugger also announces several events that you can listen to and extend the debugging and profiling capabilities: ```js // Before the debugger panel is rendered @@ -294,7 +318,7 @@ Profiling objects is great because you can just annotate and forget. Nothing to ## WireBox Object Creation Profiling -There will be cases where you need to test the performance of the creation of certain objects in WireBox. YOu can do so by activating the `profileWireBoxObjectCreation` setting in the `requestTracker`. Once enabled, you will see the profiling of all objects created by WireBox in the debug timers. +There will be cases where you need to test the performance of the creation of certain objects in WireBox. You can do so by activating the `profileWireBoxObjectCreation` setting in the `requestTracker`. Once enabled, you will see the profiling of all objects created by WireBox in the debug timers. ## Profiling Interceptions @@ -415,7 +439,21 @@ qb : { }, ``` -Also remember that you can activate the bidining parameters to the sql calls. +Also remember that you can activate the binding parameters to the sql calls. + +## Adobe ColdFusion SQL Tracking + +We have also created an `ACF Sql` panel which will track all SQL calls made during your request. We offer the same grouped or timeline visualizer for all these sql calls and even the capability to track from where the calls where made from and open them in your favorite editor to the line number. All you have to do is activate it: + +```js +// Adobe ColdFusion SQL Collector +acfSql : { + enabled : true, + expanded : false, + logParams : true +}, +``` +**Note:** This feature works with `ColdFusion 2018+` and requires the `Database Activity` box to be checked in the ACF `Debugging & Logging` page. If using ColdFusion 2021, you will need the `CF debugger` module installed as well. You can use the ACF CLI package manager, or the CommandBox command of `cfpm install debugger`. If it is not installed, install it and then restart the server before using this module. ## Modules Panel @@ -472,13 +510,24 @@ You can execute several commands from this visualizer: You can then select a specific request and open the request report with all the tracked information. -Please note that the request tracker in the debugger has a configurable capacity for requests. By default we track the last 25 requests into the application. You can either increase it or reduce it to your hearts content. Just note that the more you track, the more memory it consumes. +Please note that the request tracker in the debugger has a configurable capacity for requests. By default we track the last 25 requests into the application. You can either increase it or reduce it to your hearts content. Just note that the more you track, the more memory it consumes unless you offload it to an external cache. ```js // How many tracking profilers to keep in stack: Default is to monitor the last 20 requests maxProfilers : 25, ``` +## Storing Profilers Off-Heap + +You can tell the debugger to store the profilers and instrumentation data off-heap by using the `storage` setting and connecting it to a distributed cache like Redis, Couchbase, Mongo, Elastic, etc. All you need to do is change the `storage` to `cachebox` and update the `cacheName` to point to the distributed cache name you have configured in your `config/Cachebox.cfc`. + +```js +storage : "cachebox", +cacheName : "couchbase" +``` + +With that configuration, all the profiler data and instrumentation will be sent to the distributed cache. + ******************************************************************************** Copyright Since 2005 ColdBox Framework by Luis Majano and Ortus Solutions, Corp www.coldbox.org | www.luismajano.com | www.ortussolutions.com diff --git a/resources/assets/js/cbdebugger.js b/resources/assets/js/cbdebugger.js index 4f77df9..9170e83 100644 --- a/resources/assets/js/cbdebugger.js +++ b/resources/assets/js/cbdebugger.js @@ -1,278 +1,89 @@ -import $cb from "jquery"; - -$cb( document ).ready( function(){ - window.cbDebuggerUrl = $cb( "#cbd-debugger" ).data().appurl; - console.log( "ColdBox Debugger Loaded at " + window.cbDebuggerUrl ); -} ); - -/** - * Send an ajax command to clear the profilers - */ -window.cbdClearProfilers = function(){ - $cb( "#cbd-buttonClearProfilers > svg" ).addClass( "cbd-spinner" ); - $cb.getJSON( cbDebuggerUrl + "cbDebugger/clearProfilers", ( data ) => { - if ( data.error ){ - alert( data.messages.toString() ); - } else { - $cb( "#cbd-profilers" ).html( data.messages.toString() ); - } - $cb( "#cbd-buttonClearProfilers > svg" ).removeClass( "cbd-spinner" ); - cbdRefreshProfilers(); - } ); -}; - -/** - * Send an ajax command to render the profilers - */ -window.cbdRefreshProfilers = function(){ - $cb( "#cbd-buttonRefreshProfilers > svg" ).addClass( "cbd-spinner" ); - $cb.get( cbDebuggerUrl + "cbDebugger/renderProfilers", ( response ) => { - $cb( "#cbd-buttonRefreshProfilers > svg" ).removeClass( "cbd-spinner" ); - $cb( "#cbd-profilers" ).html( response ); - } ); -}; - -/** - * Scroll to the top of the profiler report - */ -window.cbdScrollToProfilerReport = function(){ - $cb( document ).scrollTop( $cb( "#cbd-profilers" ).offset().top - 10 ); -}; - -/** - * Send an ajax command to render the profiler report from the visualizer - * @param {*} id The profiler id to load - * @param {*} isVisualizer Are we in visualizer mode or not - */ -window.cbdGetProfilerReport = function( id, isVisualizer ){ - $cb( "#cbd-buttonGetProfilerReport-" + id + " > svg" ).addClass( "cbd-spinner" ); - $cb.get( - cbDebuggerUrl + "cbDebugger/renderProfilerReport", - { id: id, isVisualizer: isVisualizer || false }, - ( response ) => { - $cb( "#cbd-profilers" ).html( response ); - $cb( "#cbd-buttonGetProfilerReport-" + id + " > svg" ).removeClass( "cbd-spinner" ); - cbdScrollToProfilerReport(); - } - ); -}; - -/** - * Reload all modules - * @param {*} btn The caller button - */ -window.cbdReloadAllModules = function( btn ){ - $cb( this ).find( "svg" ).addClass( "cbd-spinner" ); - $cb.getJSON( - cbDebuggerUrl + "cbDebugger/reloadAllModules", - ( data ) => { - if ( data.error ){ - alert( data.messages.toString() ); - } else { - alert( "All modules reloaded!" ); +import Alpine from "alpinejs"; +// Load Plugins +// Using common js due to NOT being on webpack5, the esm was giving us issues +// Once we update to elixir 4, try it again +import morph from "@alpinejs/morph/dist/module.cjs"; +// Load Custom Components +import ModulesPanel from "./components/ModulesPanel"; +import RequestTrackerPanel from "./components/RequestTrackerPanel"; + +// For easy referencing +window.Alpine = Alpine; + +// Register Plugins +Alpine.plugin( morph ); + +// Register Components +Alpine.data( "modulesPanel", ModulesPanel ); +Alpine.data( "requestTrackerPanel", RequestTrackerPanel ); + +// Startup your engines!!!!!!!! +Alpine.start(); + +// Init the coldbox debugger module +window.coldboxDebugger = ( () => { + /** + * Listen to dom load and attach + */ + window.onload = ()=> console.log( "ColdBox Debugger Loaded!" ); + + return { + /** + * Copy a div's code to the clipboard + * + * @param {*} id The id of the element's content to copy to the clipboard + */ + copyToClipboard : function( id ) { + var elm = document.getElementById( id ); + // for Internet Explorer + if ( document.body.createTextRange ) { + var range = document.body.createTextRange(); + range.moveToElementText( elm ); + range.select(); + document.execCommand( "Copy" ); + } else if ( window.getSelection ) { + // other browsers + var selection = window.getSelection(); + var range = document.createRange(); + range.selectNodeContents( elm ); + selection.removeAllRanges(); + selection.addRange( range ); + document.execCommand( "Copy" ); } - $cb( this ).find( "svg" ).removeClass( "cbd-spinner" ); - } - ); -}; - -/** - * Reload a module - * @param {*} module The module to reload - * @param {*} btn The caller button - */ -window.cbdReloadModule = function( module, btn ){ - $cb( this ).find( "svg" ).addClass( "cbd-spinner" ); - $cb.getJSON( - cbDebuggerUrl + "cbDebugger/reloadModule", - { module: module }, - ( data ) => { - if ( data.error ){ - alert( data.messages.toString() ); - } else { - alert( module + " reloaded!" ); - } - $cb( this ).find( "svg" ).removeClass( "cbd-spinner" ); - } - ); -}; - -/** - * Unload a module - * @param {*} module The module to reload - * @param {*} btn The caller button - */ -window.cbdUnloadModule = function( module, btn ){ - $cb( this ).find( "svg" ).addClass( "cbd-spinner" ); - $cb.getJSON( - cbDebuggerUrl + "cbDebugger/unloadModule", - { module: module }, - ( data ) => { - if ( data.error ){ - alert( data.messages.toString() ); - } else { - alert( module + " unloaded!" ); - $cb( "#cbd-modulerow-" + module ).remove(); - } - $cb( this ).find( "svg" ).removeClass( "cbd-spinner" ); - } - ); -}; - -/** - * Activate the request tracker monitor reloading frequency - * @param {*} frequency The frequency in seconds to refresh - */ -window.cbdStartDebuggerMonitor = function( frequency ){ - if ( frequency == 0 ){ - cbdStopDebuggerMonitor(); - return; - } - window.cbdRefreshMonitor = setInterval( cbdRefreshProfilers, frequency * 1000 ); - - // Start it - console.log( "Started ColdBox Debugger Profiler Refresh using " + frequency + " seconds" ); -}; - -/** - * Stop the debugger refresh monitor - */ -window.cbdStopDebuggerMonitor = function(){ - if ( "cbdRefreshMonitor" in window ){ - clearInterval( window.cbdRefreshMonitor ); - console.log( "Stopped ColdBox Debugger Profiler Refresh" ); - } -}; - -/****************** MIGRATE BELOW ****************/ - -/** - * Toggle on/off debug content views - * @param {*} divid The div id to toggle on and off - */ -window.cbdToggle = function( divid ){ - $cb( "#" + divid ).slideToggle(); -}; - -/** - * Open a new window - * @param {*} mypage the target page - * @param {*} myname the target name - * @param {*} w width - * @param {*} h height - * @param {*} features features to add - */ -window.cbdOpenWindow = function( mypage, myname, w, h, features ) { - if ( screen.width ){ - var winl = ( screen.width-w )/2; - var wint = ( screen.height-h )/2; - } - else { - winl = 0;wint =0; - } - if ( winl < 0 ) winl = 0; - if ( wint < 0 ) wint = 0; - - var settings = "height=" + h + ","; - settings += "width=" + w + ","; - settings += "top=" + wint + ","; - settings += "left=" + winl + ","; - settings += features; - win = window.open( mypage,myname,settings ); - win.window.focus(); -}; - -/** - * Reinit ColdBox by submitting the reinit form - * @param {*} usingPassword Are we using a password or not, if we do we ask the user for it - */ -window.cbdReinitFramework = function( usingPassword ){ - var reinitForm = document.getElementById( "cbdReinitColdBox" ); - if ( usingPassword ){ - reinitForm.fwreinit.value = prompt( "Reinit Password?" ); - if ( reinitForm.fwreinit.value.length ){ - reinitForm.submit(); - } - } else { - reinitForm.submit(); - } -}; - -/** - * Show group queries and hide timeline queries - */ -window.cbdShowGroupedQueries = function() { - // Watch out for double toggles - if ( $cb( "#cbdGroupedQueries" ).css( "display" ) == "block" ){ - return; - } - $cb( "#cbdButtonGroupedQueries" ).addClass( "cbd-selected" ); - $cb( "#cbdButtonTimelineQueries" ).removeClass( "cbd-selected" ); - $cb( "#cbdTimelineQueries" ).slideUp(); - $cb( "#cbdGroupedQueries" ).slideDown(); -}; - -/** - * Show timeline queries and hide group queries - */ -window.cbdShowTimelineQueries = function() { - // Watch out for double toggles - if ( $cb( "#cbdTimelineQueries" ).css( "display" ) == "block" ){ - return; - } - $cb( "#cbdButtonTimelineQueries" ).addClass( "cbd-selected" ); - $cb( "#cbdButtonGroupedQueries" ).removeClass( "cbd-selected" ); - $cb( "#cbdTimelineQueries" ).slideDown(); - $cb( "#cbdGroupedQueries" ).slideUp(); -}; - -/** - * Show group queries and hide timeline queries for orm - */ -window.cbdShowGroupedOrmQueries = function() { - // Watch out for double toggles - if ( $cb( "#cbdGroupedOrmQueries" ).css( "display" ) == "block" ){ - return; - } - $cb( "#cbdButtonGroupedOrmQueries" ).addClass( "cbd-selected" ); - $cb( "#cbdButtonTimelineOrmQueries" ).removeClass( "cbd-selected" ); - $cb( "#cbdTimelineOrmQueries" ).slideUp(); - $cb( "#cbdGroupedOrmQueries" ).slideDown(); -}; - -/** - * Show timeline queries and hide group queries for orm - */ -window.cbdShowTimelineOrmQueries = function() { - // Watch out for double toggles - if ( $cb( "#timelineQueries" ).css( "display" ) == "block" ){ - return; - } - $cb( "#cbdButtonTimelineOrmQueries" ).addClass( "cbd-selected" ); - $cb( "#cbdButtonGroupedOrmQueries" ).removeClass( "cbd-selected" ); - $cb( "#cbdTimelineOrmQueries" ).slideDown(); - $cb( "#cbdGroupedOrmQueries" ).slideUp(); -}; - -/** - * Copy a div's code to the clipboard - * @param {*} id The id of the element's content to copy to the clipboard - */ -window.copyToClipboard = function( id ) { - var elm = document.getElementById( id ); - // for Internet Explorer - if ( document.body.createTextRange ) { - var range = document.body.createTextRange(); - range.moveToElementText( elm ); - range.select(); - document.execCommand( "Copy" ); - } else if ( window.getSelection ) { - // other browsers - var selection = window.getSelection(); - var range = document.createRange(); - range.selectNodeContents( elm ); - selection.removeAllRanges(); - selection.addRange( range ); - document.execCommand( "Copy" ); - } -}; \ No newline at end of file + }, + + /** + * Smoot scrolling baby + * @param {*} id Optional dom id to scroll to else to the top. + */ + scrollTo : function( id ){ + let top = id == undefined ? 0 : document.getElementById( id ).offsetTop - 10; + window.scroll( { + top : top, + behavior : "smooth" + } ); + }, + + /** + * Open a new window + * + * @param {*} mypage the target page + * @param {*} myname the target name + * @param {*} w width + * @param {*} h height + * @param {*} features features to add + */ + openWindow : function( mypage, myname, w, h, features ) { + let winl = screen.width ? ( screen.width - w ) / 2 : 0; + let wint = screen.width ? ( screen.height - h ) / 2 : 0; + if ( winl < 0 ) winl = 0; + if ( wint < 0 ) wint = 0; + let win = window.open( + mypage, + myname, + `height=${h},width=${w},top=${wint},left=${winl}+${features}` + ); + win.window.focus(); + } + }; +} )(); diff --git a/resources/assets/js/components/ModulesPanel.js b/resources/assets/js/components/ModulesPanel.js new file mode 100644 index 0000000..e8d0208 --- /dev/null +++ b/resources/assets/js/components/ModulesPanel.js @@ -0,0 +1,38 @@ +export default ( isExpanded ) => { + return { + panelOpen : isExpanded, + isLoading : false, + targetAction : "", + reloadModule( module ){ + this.targetAction = "reload-" + module; + this.isLoading = true; + fetch( `${this.appUrl}cbDebugger/reloadModule/module/${module}` ) + .then( response => response.json() ) + .then( data => { + if ( data.error ){ + alert( data.messages.toString() ); + } else { + alert( module + " reloaded!" ); + } + this.targetAction = ""; + this.isLoading = false; + } ); + }, + unloadModule( module ){ + this.targetAction = "unload-" + module; + this.isLoading = true; + fetch( `${this.appUrl}cbDebugger/unloadModule/module/${module}` ) + .then( response => response.json() ) + .then( data => { + if ( data.error ){ + alert( data.messages.toString() ); + } else { + alert( module + " unloaded!" ); + } + this.targetAction = ""; + this.isLoading = false; + this.$refs[ "module-row-" + module ].remove(); + } ); + } + }; +}; diff --git a/resources/assets/js/components/RequestTrackerPanel.js b/resources/assets/js/components/RequestTrackerPanel.js new file mode 100644 index 0000000..4829ad2 --- /dev/null +++ b/resources/assets/js/components/RequestTrackerPanel.js @@ -0,0 +1,96 @@ +export default ( isExpanded, refreshFrequency, hasReinitPassword, isVisualizer ) => { + return { + panelOpen : isExpanded, + refreshFrequency : refreshFrequency, + usingReinitPassword : hasReinitPassword, + isVisualizer : isVisualizer, + currentProfileId : "", + + reinitFramework(){ + this.$refs.reinitLoader.classList.add( "cbd-spinner" ); + let reinitPass = this.usingReinitPassword ? prompt( "Reinit Password?" ) : "1"; + fetch( `${this.appUrl}?fwreinit=${reinitPass}`, { headers: { "x-Requested-With": "XMLHttpRequest" } } ) + .then( response => { + if ( response.ok ){ + alert( "Framework Reinitted!" ); + this.refreshProfilers(); + } else { + alert( "HTTP Call Error" + response.status ); + } + this.$refs.reinitLoader.classList.remove( "cbd-spinner" ); + } ); + }, + loadProfilerReport( id ){ + fetch( `${this.appUrl}cbDebugger/renderProfilerReport`, { + method : "POST", + headers : { "x-Requested-With": "XMLHttpRequest" }, + body : JSON.stringify( { + id : id, + isVisualizer : this.isVisualizer + } ) + } ) + .then( response => response.text() ) + .then( html => { + history.pushState( { profileId: id }, null, "##" + id ); + this.$refs[ "cbd-profilers" ].innerHTML = html; + coldboxDebugger.scrollTo( "cbd-request-tracker" ); + } ); + }, + clearState(){ + history.pushState( {}, null, "##" ); + this.currentProfileId = ""; + }, + refreshProfilers(){ + this.$refs.refreshLoader.classList.add( "cbd-spinner" ); + fetch( `${this.appUrl}cbDebugger/renderProfilers`, { headers: { "x-Requested-With": "XMLHttpRequest" } } ) + .then( response => response.text() ) + .then( html => { + this.clearState(); + this.$refs[ "cbd-profilers" ].innerHTML = html; + this.$refs.refreshLoader.classList.remove( "cbd-spinner" ); + } ); + }, + clearProfilers(){ + this.$refs.clearLoader.classList.add( "cbd-spinner" ); + fetch( `${this.appUrl}cbDebugger/clearProfilers`, { headers: { "x-Requested-With": "XMLHttpRequest" } } ) + .then( response => response.json() ) + .then( data => { + this.clearState(); + if ( data.error ){ + alert( data.messages.toString() ); + } else { + this.refreshProfilers(); + } + this.$refs.clearLoader.classList.remove( "cbd-spinner" ); + } ); + }, + stopDebuggerMonitor(){ + if ( "cbdRefreshMonitor" in window ){ + clearInterval( window.cbdRefreshMonitor ); + console.log( "Stopped ColdBox Debugger Profiler Refresh" ); + } + }, + startDebuggerMonitor( frequency ){ + if ( frequency == 0 ){ + return this.stopDebuggerMonitor(); + } + window.cbdRefreshMonitor = setInterval( this.refreshProfilers, frequency * 1000 ); + console.log( "Started ColdBox Debugger Profiler Refresh using " + frequency + " seconds" ); + }, + init(){ + window.addEventListener( "popstate", e => { + if ( e.state && e.state.profileId ){ + this.currentProfileId = e.state.profileId; + this.loadProfilerReport( e.state.profileId ); + } else { + this.refreshProfilers(); + } + } ); + // Detect if an incoming profile id hash is detected + if ( location.hash ){ + this.currentProfileId = location.hash.substr( 1 ); + this.loadProfilerReport( this.currentProfileId ); + } + } + }; +}; diff --git a/resources/assets/sass/cbdebugger.scss b/resources/assets/sass/cbdebugger.scss index 6f2767d..a7f696b 100644 --- a/resources/assets/sass/cbdebugger.scss +++ b/resources/assets/sass/cbdebugger.scss @@ -1,3 +1,4 @@ +[x-cloak] { display: none !important; } .cbd-debugger{ font-family: Verdana,Arial,sans-serif; font-size: 11px; diff --git a/test-harness/server-adobe@2016.json b/server-adobe@2016.json similarity index 76% rename from test-harness/server-adobe@2016.json rename to server-adobe@2016.json index 57cdff0..a5cdbf3 100644 --- a/test-harness/server-adobe@2016.json +++ b/server-adobe@2016.json @@ -11,9 +11,13 @@ "rewrites":{ "enable":"true" }, + "webroot":"test-harness", "aliases":{ "/moduleroot/cbdebugger":"../" } }, - "openBrowser":"false" -} \ No newline at end of file + "openBrowser":"false", + "cfconfig":{ + "file":".cfconfig.json" + } +} diff --git a/test-harness/server-adobe@2018.json b/server-adobe@2018.json similarity index 74% rename from test-harness/server-adobe@2018.json rename to server-adobe@2018.json index 3edbc00..90b75d8 100644 --- a/test-harness/server-adobe@2018.json +++ b/server-adobe@2018.json @@ -11,9 +11,13 @@ "rewrites":{ "enable":"true" }, + "webroot":"test-harness", "aliases":{ "/moduleroot/cbdebugger":"../" } }, - "openBrowser":"false" -} \ No newline at end of file + "openBrowser":"false", + "cfconfig":{ + "file":".cfconfig.json" + } +} diff --git a/test-harness/server-adobe@2021.json b/server-adobe@2021.json similarity index 76% rename from test-harness/server-adobe@2021.json rename to server-adobe@2021.json index 757b051..f63dd49 100644 --- a/test-harness/server-adobe@2021.json +++ b/server-adobe@2021.json @@ -11,9 +11,13 @@ "rewrites":{ "enable":"true" }, + "webroot":"test-harness", "aliases":{ "/moduleroot/cbdebugger":"../" } }, - "openBrowser":"false" -} \ No newline at end of file + "openBrowser":"false", + "cfconfig":{ + "file":".cfconfig.json" + } +} diff --git a/test-harness/server-lucee@5.json b/server-lucee@5.json similarity index 74% rename from test-harness/server-lucee@5.json rename to server-lucee@5.json index ab7eccc..752d969 100644 --- a/test-harness/server-lucee@5.json +++ b/server-lucee@5.json @@ -11,9 +11,13 @@ "rewrites":{ "enable":"true" }, + "webroot":"test-harness", "aliases":{ "/moduleroot/cbdebugger":"../" } }, - "openBrowser":"false" -} \ No newline at end of file + "openBrowser":"false", + "cfconfig":{ + "file":".cfconfig.json" + } +} diff --git a/test-harness/Application.cfc b/test-harness/Application.cfc index 7769cf7..3cb7f2b 100644 --- a/test-harness/Application.cfc +++ b/test-harness/Application.cfc @@ -88,6 +88,15 @@ component { // request start public boolean function onRequestStart( String targetPage ){ + if ( !structKeyExists( application, "cbBootstrap" ) ){ + onApplicationStart(); + } + if ( url.keyExists( "fwreinit" ) ) { + if ( server.keyExists( "lucee" ) ) { + pagePoolClear(); + } + ormReload(); + } // Process ColdBox Request application.cbBootstrap.onRequestStart( arguments.targetPage ); @@ -95,7 +104,9 @@ component { } public void function onSessionStart(){ - application.cbBootStrap.onSessionStart(); + if( !isNull( application.cbBootstrap ) ){ + application.cbBootStrap.onSessionStart(); + } } public void function onSessionEnd( struct sessionScope, struct appScope ){ diff --git a/test-harness/box.json b/test-harness/box.json index 73758ca..a6b3001 100644 --- a/test-harness/box.json +++ b/test-harness/box.json @@ -8,24 +8,18 @@ "coldbox":"^6.0.0", "JSONPrettyPrint":"^1.4.1", "quick":"^4.2.4", - "cborm":"^3.0.0+184" + "cborm":"^3.0.0+184", + "sqlformatter":"^1.0.1" }, "devDependencies":{ - "testbox":"^4.0.0" + "testbox":"*" }, "installPaths":{ "coldbox":"coldbox/", "testbox":"testbox/", "JSONPrettyPrint":"modules/JSONPrettyPrint/", "quick":"modules/quick/", - "cborm":"modules/cborm/" - }, - "testbox":{ - "runner":"http://localhost:60299/tests/runner.cfm" - }, - "scripts" : { - "cfpm":"echo '\".engine/adobe2021/WEB-INF/cfusion/bin/cfpm.sh\"' | run", - "cfpm:install":"echo '\".engine/adobe2021/WEB-INF/cfusion/bin/cfpm.sh\" install ${1}' | run", - "install:2021":"run-script cfpm:install zip,orm,mysql,debugger,chart" - } -} \ No newline at end of file + "cborm":"modules/cborm/", + "sqlformatter":"modules/sqlformatter/" + } +} diff --git a/test-harness/config/Coldbox.cfc b/test-harness/config/Coldbox.cfc index 1bf8aca..df77566 100644 --- a/test-harness/config/Coldbox.cfc +++ b/test-harness/config/Coldbox.cfc @@ -48,6 +48,7 @@ logBox = { // Define Appenders appenders : { + myConsole : { class : "ConsoleAppender" }, files : { class : "coldbox.system.logging.appenders.RollingFileAppender", properties : { @@ -139,6 +140,12 @@ expanded : false, // Log the binding parameters logParams : true + }, + // cfquery sql reporting + acfSql : { + enabled : true, + expanded : false, + logParams : true } } }; diff --git a/test-harness/tests/Application.cfc b/test-harness/tests/Application.cfc index 4768b41..34a471d 100644 --- a/test-harness/tests/Application.cfc +++ b/test-harness/tests/Application.cfc @@ -6,8 +6,12 @@ www.ortussolutions.com */ component { + // UPDATE THE NAME OF THE MODULE IN TESTING BELOW + request.MODULE_NAME = "cbdebugger"; + request.MODULE_PATH = "cbdebugger"; + // APPLICATION CFC PROPERTIES - this.name = "ColdBoxTestingSuite" & hash( getCurrentTemplatePath() ); + this.name = "#request.MODULE_NAME# testing suite"; this.sessionManagement = true; this.sessionTimeout = createTimespan( 0, 0, 15, 0 ); this.applicationTimeout = createTimespan( 0, 0, 15, 0 ); @@ -17,20 +21,13 @@ component { this.mappings[ "/tests" ] = getDirectoryFromPath( getCurrentTemplatePath() ); // The application root - rootPath = reReplaceNoCase( - this.mappings[ "/tests" ], - "tests(\\|/)", - "" - ); + rootPath = reReplaceNoCase( this.mappings[ "/tests" ], "tests(\\|/)", "" ); this.mappings[ "/root" ] = rootPath; - // UPDATE THE NAME OF THE MODULE IN TESTING BELOW - request.MODULE_NAME = "cbdebugger"; - // The module root path moduleRootPath = reReplaceNoCase( - this.mappings[ "/root" ], - "#request.module_name#(\\|/)test-harness(\\|/)", + rootPath, + "#request.MODULE_PATH#(\\|/)test-harness(\\|/)", "" ); this.mappings[ "/moduleroot" ] = moduleRootPath; @@ -65,15 +62,17 @@ component { } } - return true; - } - - public function onRequestEnd(){ - // CB 6 graceful shutdown + // Cleanup if ( !isNull( application.cbController ) ) { application.cbController.getLoaderService().processShutdown(); } + structDelete( application, "cbController" ); + structDelete( application, "wirebox" ); + return true; + } + + public function onRequestEnd(){ structDelete( application, "cbController" ); structDelete( application, "wirebox" ); } diff --git a/test-harness/tests/specs/DebuggerTest.cfc b/test-harness/tests/specs/DebuggerTest.cfc index 7e75da6..d81a28f 100644 --- a/test-harness/tests/specs/DebuggerTest.cfc +++ b/test-harness/tests/specs/DebuggerTest.cfc @@ -37,14 +37,12 @@ component extends="coldbox.system.testing.BaseTestCase" appMapping="/root" { event = "main.index", renderResults = true ); - expect( timer.getTimers() ).notToBeEmpty(); - expect( debuggerService.getProfilerStorage() ).notToBeEmpty(); - expect( debuggerService.getTracers() ).notToBeEmpty(); + expect( timer.getTimers() ).notToBeEmpty( "Timers should not be empty" ); + expect( debuggerService.getTracers() ).notToBeEmpty( "Tracers should not be empty" ); + expect( request.cbDebugger ).notToBeEmpty( "request debugger should not be empty" ); } ); - debug( timer.getTimers() ); - debug( debuggerService.getProfilerStorage() ); - debug( debuggerService.getTracers() ); + debug( request.cbDebugger ); } ); } ); } diff --git a/views/main/debugger.cfm b/views/main/debugger.cfm index 0a0c026..dea0cf1 100644 --- a/views/main/debugger.cfm +++ b/views/main/debugger.cfm @@ -2,9 +2,21 @@ This main debugger view collects all the different panels to present to the user We use cfinclude to be fast and sneaky ---> + + + + + + + + + + + + +
- @@ -37,14 +49,14 @@ We use cfinclude to be fast and sneaky - ColdBox Debugger v#getModuleConfig( "cbdebugger" ).version# + ColdBox Debugger v#args.moduleSettings[ "cbdebugger" ].version#
- Debug Rendering Time: #getTickCount() - args.debugStartTime# ms + Debug Rendering Time: #numberFormat( getTickCount() - args.debugStartTime )# ms
-
\ No newline at end of file + diff --git a/views/main/panels/asyncPanel.cfm b/views/main/panels/asyncPanel.cfm index c13bd94..7bbb9e8 100644 --- a/views/main/panels/asyncPanel.cfm +++ b/views/main/panels/asyncPanel.cfm @@ -5,8 +5,25 @@ arraySort( executorKeys, "textnocase" ); +
-
+
  @@ -16,8 +33,10 @@
@@ -71,7 +90,8 @@
- \ No newline at end of file +
+ diff --git a/views/main/panels/coldboxPanel.cfm b/views/main/panels/coldboxPanel.cfm deleted file mode 100644 index cddfc55..0000000 --- a/views/main/panels/coldboxPanel.cfm +++ /dev/null @@ -1,50 +0,0 @@ - - - - - -
-   - - - - ColdBox Event Information -
- -
- - - - - - - -
- #thisItem# : - -
- - - #getInstance( '@JSONPrettyPrint' ).formatJSON( args.profiler.coldbox[ thisItem ] )# - - - #args.profiler.coldbox[ thisItem ]# - - - n/a - - - - - - -
-
-
-
\ No newline at end of file diff --git a/views/main/panels/debugTimersPanel.cfm b/views/main/panels/debugTimersPanel.cfm deleted file mode 100644 index cd3b253..0000000 --- a/views/main/panels/debugTimersPanel.cfm +++ /dev/null @@ -1,65 +0,0 @@ - - -
-   - - - - Execution Timers (#arraylen( args.timers )#) -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Started AtFinished AtExecution TimeFramework Method
- #timeFormat( thisTimer.startedAt, "hh:MM:SS.l tt" )# - - #timeFormat( thisTimer.stoppedAt, "hh:MM:SS.l tt" )# - - - - #numberFormat( thisTimer.executionTime )#ms - - - #numberFormat( thisTimer.executionTime )#ms - - - #thisTimer.method# -
No Timers Found...
-
-
\ No newline at end of file diff --git a/views/main/panels/httpRequestPanel.cfm b/views/main/panels/httpRequestPanel.cfm deleted file mode 100644 index 9d1f063..0000000 --- a/views/main/panels/httpRequestPanel.cfm +++ /dev/null @@ -1,140 +0,0 @@ - - - -
-   - - - - HTTP Request -
- - -
-

Request Information

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP Method:#args.profiler.requestData.method#
HTTP URL:#args.profiler.fullUrl#
HTTP Host:#args.profiler.httpHost#
HTTP Referer: - - #args.profiler.httpReferer# - - n/a - -
User Agent:#args.profiler.userAgent#
HTTP Content: -
- - -
#getInstance( '@JSONPrettyPrint' ).formatJSON( args.profiler.requestData.content )#
- - #args.profiler.requestData.content# - - empty -
- - -
-
-
Form Params: -
- -
#jsonFormatter.formatJSON( args.profiler.formData )#
-
-
-
- - - -

Headers

- - - - - - - -
- #thisHeader# - - -
- - - - - - - - - - - - - - -
- Cookie Name - - Cookie Value -
- - #getToken( thisCookie, 1, "=" )# - - - - #getInstance( '@JSONPrettyPrint' ).formatJSON( getToken( thisCookie, 2, "=" ) )# - - #getToken( thisCookie, 2, "=" )# - -
-
- -
- - #replace( args.profiler.requestData.headers[ thisHeader ], ";", "
", "all" )# -
-
-
-
-
-
\ No newline at end of file diff --git a/views/main/panels/modulesPanel.cfm b/views/main/panels/modulesPanel.cfm index 416fd1b..2bbe084 100755 --- a/views/main/panels/modulesPanel.cfm +++ b/views/main/panels/modulesPanel.cfm @@ -1,6 +1,6 @@ + -allModules = getSetting( "modules" ); -totalTimes = allModules.reduce( function( total, key, thisModuleConfig ){ +totalTimes = args.moduleSettings.reduce( function( total, key, thisModuleConfig ){ if( !isNull( arguments.thisModuleConfig.registrationTime ) ){ arguments.total.registration += arguments.thisModuleConfig.registrationTime; } @@ -12,70 +12,65 @@ totalTimes = allModules.reduce( function( total, key, thisModuleConfig ){ "registration" : 0, "activation" : 0 } ); -rootModules = allModules.filter( function( module, config ){ +rootModules = args.moduleSettings.filter( function( module, config ){ return arguments.config.parent.len() == 0; } ); - -
-   - - - - ColdBox Modules (#structCount( allModules )#) -
- -
- - -
- - + +
+   + + + + ColdBox Modules (#args.moduleSettings.count()#)
-

- Below you can see the registered and activated application modules. -

+ +
+ +

+ Below you can see the registered and activated application modules. +

- -
-
- Total Registration Time: -
- #numberFormat( totalTimes.registration )# ms + +
+
+ Total Registration Time: +
+ #numberFormat( totalTimes.registration )# ms +
-
-
- Total Activation Time: -
- #numberFormat( totalTimes.activation )# ms +
+ Total Activation Time: +
+ #numberFormat( totalTimes.activation )# ms +
-
- #renderView( - view : "main/partials/modules", - module : "cbdebugger", - args : { - modules : rootModules - }, - prePostExempt : true - )# + #renderView( + view : "main/partials/modules", + module : "cbdebugger", + args : { + modules : rootModules + }, + prePostExempt : true + )# +
- \ No newline at end of file + diff --git a/views/main/panels/qbPanel.cfm b/views/main/panels/qbPanel.cfm deleted file mode 100755 index 2aa5159..0000000 --- a/views/main/panels/qbPanel.cfm +++ /dev/null @@ -1,356 +0,0 @@ - - sqlFormatter = getInstance( "SqlFormatter@cbdebugger" ); - jsonFormatter = getInstance( '@JSONPrettyPrint' ); - isQuickInstalled = getController().getModuleService().isModuleRegistered( "quick" ); - isQBInstalled = getController().getModuleService().isModuleRegistered( "qb" ); - totalEntities = args.profiler.keyExists( "quick" ) ? args.profiler.quick.total : 0; - exceptionBean = new coldbox.system.web.context.ExceptionBean(); - appPath = getSetting( "ApplicationPath" ); - - - -
-   - - - - Quick &##47; qb - - - - - - - - - - #args.profiler.qbQueries.totalQueries# - - - - - #numberFormat( args.profiler.qbQueries.totalExecutionTime )# ms -
- - -
-
- - - - - qb is not installed or registered. - - - - -
-
- Total Queries: -
- #args.profiler.qbQueries.totalQueries# -
-
- -
- Total Execution Time: -
- #args.profiler.qbQueries.totalExecutionTime# ms -
-
-
- - -
- - -
- - - -
- No queries executed -
- - - -
- - - - - - - - - - - - - - - - - - - -
CountQuery
-
- #args.profiler.qbQueries.grouped[ sqlHash ].count# -
-
- - - - - #sqlFormatter.formatSql( - args.profiler.qbQueries.grouped[ sqlHash ].sql - )# - -
- - - - - - - - - - - - - - - - - - -
TimestampExecution TimeParams
- #TimeFormat( q.timestamp, "hh:MM:SS.l tt" )# - - #numberFormat( q.executionTime )# ms - - -
- - Called From: - - - - - -
- - #replaceNoCase( q.caller.template, appPath, "" )#:#q.caller.line# - -
-
-
- - - - - - -
#jsonFormatter.formatJSON( json : q.params, spaceAfterColon : true )#
-
-
-
-
-
- - -
- - - - - - - - - - - - - - - - - - - - -
TimestampExecution TimeQuery
- #TimeFormat( q.timestamp,"hh:MM:SS.l tt" )# - - #q.executionTime# ms - - -
- - Called From: - - - - - -
- - #replaceNoCase( q.caller.template, appPath, "" )#:#q.caller.line# - -
-
-
- - - - - - - #sqlFormatter.formatSql( q.sql )# - - - - -
-
- Params: -
- - - - -
#jsonFormatter.formatJSON( json : q.params, spaceAfterColon : true )#
-
-
-
-
-
- -
-
-
- - - - -
- -
-
 Entities - #totalEntities# -
- - - No Quick entities loaded. - - - - - - - - - - - - - - - - - -
CountMapping
#args.profiler.quick.byMapping[ mapping ]##mapping#
-
-
-
-
-
\ No newline at end of file diff --git a/views/main/panels/requestTracker/acfSqlPanel.cfm b/views/main/panels/requestTracker/acfSqlPanel.cfm new file mode 100755 index 0000000..7c331d3 --- /dev/null +++ b/views/main/panels/requestTracker/acfSqlPanel.cfm @@ -0,0 +1,355 @@ + + + + + sqlFormatter = args.debuggerService.getSqlFormatter(); + jsonFormatter = args.debuggerService.getjsonFormatter(); + appPath = getSetting( "ApplicationPath" ); + + + + +
+ +
+   + + + + ACF Sql + + + + + + + + + + #args.profiler.cfQueries.totalQueries# + + + + + #numberFormat( args.profiler.cfQueries.totalExecutionTime )# ms +
+ + +
+ + +
+
+ Total Queries: +
+ #args.profiler.cfQueries.totalQueries# +
+
+ +
+ Total Execution Time: +
+ #args.profiler.cfQueries.totalExecutionTime# ms +
+
+
+ + +
+ + +
+ + + +
+ No queries executed +
+ + +
+ + + + + + + + + + + + + + + + + + + +
CountQuery
+
+ #args.profiler.cfQueries.grouped[ sqlHash ].count# +
+
+ + + + +
#sqlFormatter.format(
+											args.profiler.cfQueries.grouped[ sqlHash ].sql
+										)#
+
+
+ + + + + + + + + + + + + + + + + + + + +
TimestampExecution TimeDatasourceSource/Params
+ #TimeFormat( q.timestamp, "hh:MM:SS.l tt" )# + + #numberFormat( q.endTime - q.startTime )# ms + + #q.datasource# + + +
+ + Called From: + + + + + +
+ + #replaceNoCase( q.template, appPath, "" )#:#q.line# + +
+
+
+ + + + + + +
#jsonFormatter.formatJSON( json : q.attributes, spaceAfterColon : true )#
+
+
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
TimestampExecution TimeDatasourceQuery
+ #TimeFormat( q.timestamp,"hh:MM:SS.l tt" )# + + #numberFormat( ( q.endTime - q.startTime ) )# ms + + #q.datasource# + + +
+ + Called From: + + + + + +
+ + #replaceNoCase( q.template, appPath, "" )#:#q.line# + +
+
+
+ + + + + + +
#sqlFormatter.format( q.body )#
+
+ + + +
+
+ Params: +
+ + + + +
#jsonFormatter.formatJSON( json : q.attributes, spaceAfterColon : true )#
+
+
+
+
+
+
+
+ +
+ +
diff --git a/views/main/panels/cbormPanel.cfm b/views/main/panels/requestTracker/cbormPanel.cfm similarity index 86% rename from views/main/panels/cbormPanel.cfm rename to views/main/panels/requestTracker/cbormPanel.cfm index e8e33af..e2dd839 100644 --- a/views/main/panels/cbormPanel.cfm +++ b/views/main/panels/requestTracker/cbormPanel.cfm @@ -1,10 +1,30 @@ - - - - + + + + + sqlFormatter = args.debuggerService.getSqlFormatter(); + jsonFormatter = args.debuggerService.getjsonFormatter(); + appPath = getSetting( "ApplicationPath" ); + +
-
+
  @@ -29,8 +49,11 @@
@@ -53,9 +76,8 @@ + diff --git a/views/main/panels/requestTracker/coldboxCollectionsPanel.cfm b/views/main/panels/requestTracker/coldboxCollectionsPanel.cfm new file mode 100644 index 0000000..4dd4aa6 --- /dev/null +++ b/views/main/panels/requestTracker/coldboxCollectionsPanel.cfm @@ -0,0 +1,58 @@ + + + + + + +
+ +
+   + + + + ColdBox Request Structures +
+ +
+ + #renderView( + view : "main/partials/collections", + module : "cbdebugger", + args : { + collection : rc, + collectionType : "Public", + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService + }, + prePostExempt : true + )# + + #renderView( + view : "main/partials/collections", + module : "cbdebugger", + args : { + collection : prc, + collectionType : "Private", + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService + }, + prePostExempt : true + )# +
+
+
diff --git a/views/main/panels/requestTracker/coldboxPanel.cfm b/views/main/panels/requestTracker/coldboxPanel.cfm new file mode 100644 index 0000000..40c4bf1 --- /dev/null +++ b/views/main/panels/requestTracker/coldboxPanel.cfm @@ -0,0 +1,69 @@ + + + + + sqlFormatter = args.debuggerService.getSqlFormatter(); + jsonFormatter = args.debuggerService.getjsonFormatter(); + coldboxKeys = args.profiler.coldbox.keyArray(); + coldboxKeys.sort( "textnocase" ); + + +
+ +
+   + + + + ColdBox Event Information +
+ +
+ + + + + + + +
+ #thisItem# : + +
+ + + #jsonFormatter.formatJSON( args.profiler.coldbox[ thisItem ] )# + + + #args.profiler.coldbox[ thisItem ]# + + + n/a + + + + + + +
+
+
+
+
diff --git a/views/main/panels/requestTracker/debugTimersPanel.cfm b/views/main/panels/requestTracker/debugTimersPanel.cfm new file mode 100644 index 0000000..1efd2a9 --- /dev/null +++ b/views/main/panels/requestTracker/debugTimersPanel.cfm @@ -0,0 +1,78 @@ + +
+ +
+   + + + + Execution Timers (#arraylen( args.timers )#) +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Started AtFinished AtExecution TimeFramework Method
+ #timeFormat( thisTimer.startedAt, "hh:MM:SS.l tt" )# + + #timeFormat( thisTimer.stoppedAt, "hh:MM:SS.l tt" )# + + + + #numberFormat( thisTimer.executionTime )#ms + + + #numberFormat( thisTimer.executionTime )#ms + + + #thisTimer.method# +
No Timers Found...
+
+
+
diff --git a/views/main/panels/exceptionPanel.cfm b/views/main/panels/requestTracker/exceptionPanel.cfm similarity index 84% rename from views/main/panels/exceptionPanel.cfm rename to views/main/panels/requestTracker/exceptionPanel.cfm index d1340ff..5f0fdc5 100644 --- a/views/main/panels/exceptionPanel.cfm +++ b/views/main/panels/requestTracker/exceptionPanel.cfm @@ -1,9 +1,17 @@ - +
-
+
  @@ -11,7 +19,13 @@ Exception Data
-
+
@@ -25,7 +39,7 @@ -
#exceptionBean.processStackTrace( args.profiler.exception[ thisItem ] )#
+
#args.debuggerService.processStackTrace( args.profiler.exception[ thisItem ] )#
#args.profiler.exception[ thisItem ]#
@@ -39,14 +53,14 @@
- \ No newline at end of file +
+ diff --git a/views/main/panels/requestTracker/httpRequestPanel.cfm b/views/main/panels/requestTracker/httpRequestPanel.cfm new file mode 100644 index 0000000..1a11096 --- /dev/null +++ b/views/main/panels/requestTracker/httpRequestPanel.cfm @@ -0,0 +1,172 @@ + + + + + sqlFormatter = args.debuggerService.getSqlFormatter(); + jsonFormatter = args.debuggerService.getjsonFormatter(); + + +
+ +
+   + + + + HTTP Request +
+ + +
+

Request Information

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP Method:#args.profiler.requestData.method#
HTTP URL:#args.profiler.fullUrl#
HTTP Host:#args.profiler.httpHost#
HTTP Referer: + + #args.profiler.httpReferer# + + n/a + +
Initial Free Memory: + #numberFormat( args.profiler.startFreeMemory / 1048576 )#MB +
Ending Free Memory: + #numberFormat( args.profiler.endFreeMemory / 1048576 )#MB +
User Agent:#args.profiler.userAgent#
HTTP Content: +
+ + +
#jsonFormatter.formatJSON( args.profiler.requestData.content )#
+ + #args.profiler.requestData.content# + + empty +
+ + +
+
+
Form Params: +
+ +
#jsonFormatter.formatJSON( args.profiler.formData.toString() )#
+
+
+
+ + + +

Headers

+ + + + + + + +
+ #thisHeader# + + +
+ + + + + + + + + + + + + + +
+ Cookie Name + + Cookie Value +
+ + #getToken( thisCookie, 1, "=" )# + + + + #jsonFormatter.formatJSON( getToken( thisCookie, 2, "=" ) )# + + #getToken( thisCookie, 2, "=" )# + +
+
+ +
+ +
#replace( args.profiler.requestData.headers[ thisHeader ], ";", "
", "all" )#
+
+
+
+
+
+
+
diff --git a/views/main/panels/requestTracker/qbPanel.cfm b/views/main/panels/requestTracker/qbPanel.cfm new file mode 100755 index 0000000..40db84b --- /dev/null +++ b/views/main/panels/requestTracker/qbPanel.cfm @@ -0,0 +1,380 @@ + + + + + sqlFormatter = args.debuggerService.getSqlFormatter(); + jsonFormatter = args.debuggerService.getjsonFormatter(); + isQuickInstalled = controller.getModuleService().isModuleRegistered( "quick" ); + isQBInstalled = controller.getModuleService().isModuleRegistered( "qb" ); + totalEntities = args.profiler.keyExists( "quick" ) ? args.profiler.quick.total : 0; + appPath = getSetting( "ApplicationPath" ); + + +
+ +
+   + + + + Quick &##47; qb + + + + + + + + + + #args.profiler.qbQueries.totalQueries# + + + + + #numberFormat( args.profiler.qbQueries.totalExecutionTime )# ms +
+ + +
+ + + + + qb is not installed or registered. + + + +
+
+ Total Queries: +
+ #args.profiler.qbQueries.totalQueries# +
+
+ +
+ Total Execution Time: +
+ #args.profiler.qbQueries.totalExecutionTime# ms +
+
+
+ + +
+ + +
+ + + +
+ No queries executed +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
CountQuery
+
+ #args.profiler.qbQueries.grouped[ sqlHash ].count# +
+
+ + + + +
#sqlFormatter.format(
+												args.profiler.qbQueries.grouped[ sqlHash ].sql
+											)#
+
+
+ + + + + + + + + + + + + + + + + + +
TimestampExecution TimeParams
+ #TimeFormat( q.timestamp, "hh:MM:SS.l tt" )# + + #numberFormat( q.executionTime )# ms + + +
+ + Called From: + + + + + +
+ + #replaceNoCase( q.caller.template, appPath, "" )#:#q.caller.line# + +
+
+
+ + + + + + +
#jsonFormatter.formatJSON( json : q.params, spaceAfterColon : true )#
+
+
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + +
TimestampExecution TimeQuery
+ #TimeFormat( q.timestamp,"hh:MM:SS.l tt" )# + + #q.executionTime# ms + + +
+ + Called From: + + + + + +
+ + #replaceNoCase( q.caller.template, appPath, "" )#:#q.caller.line# + +
+
+
+ + + + + + +
#sqlFormatter.format( q.sql )#
+
+ + + +
+
+ Params: +
+ + + + +
#jsonFormatter.formatJSON( json : q.params, spaceAfterColon : true )#
+
+
+
+
+
+ +
+
+ + + + +
+ +
+
 Entities + #totalEntities# +
+ + + No Quick entities loaded. + + + + + + + + + + + + + + + + + +
CountMapping
#args.profiler.quick.byMapping[ mapping ]##mapping#
+
+
+
+
+
+
diff --git a/views/main/panels/tracersPanel.cfm b/views/main/panels/requestTracker/tracersPanel.cfm similarity index 91% rename from views/main/panels/tracersPanel.cfm rename to views/main/panels/requestTracker/tracersPanel.cfm index 3569b6b..df64970 100755 --- a/views/main/panels/tracersPanel.cfm +++ b/views/main/panels/requestTracker/tracersPanel.cfm @@ -1,3 +1,6 @@ + + + function getSeverityColor( severity ){ switch( arguments.severity ){ @@ -18,8 +21,17 @@ } +
-
+
  @@ -39,8 +51,11 @@
@@ -109,4 +124,6 @@ No tracers found
- \ No newline at end of file + +
+ diff --git a/views/main/panels/requestTrackerPanel.cfm b/views/main/panels/requestTrackerPanel.cfm index 2b3fc62..e2941a2 100755 --- a/views/main/panels/requestTrackerPanel.cfm +++ b/views/main/panels/requestTrackerPanel.cfm @@ -1,75 +1,100 @@ + - -
-
-
- -
- -
- ColdBox Request Tracker - - - - - - +
+ +
+
+
+ +
+ +
+ ColdBox Request Tracker + + + + + + - #args.currentProfiler.requestData.method# + #args.currentProfiler.requestData.method# - - - + + + - #args.currentProfiler.coldbox.event# + #args.currentProfiler.coldbox.event# - - - + + + - #args.currentProfiler.response.statusCode# + #args.currentProfiler.response.statusCode# - - - + + + - #numberFormat( args.currentProfiler.executionTime )# ms - + #numberFormat( args.currentProfiler.executionTime )# ms + +
-
- -
- -
-
- - - + +
- -

- Below you can see the latest ColdBox requests made into the application. - Click on the desired profiler to view its execution report. -

+ +

+ Below you can see the latest ColdBox requests made into the application. + Click on the desired profiler to view its execution report. +

- -
- Framework Info: -
-
- #controller.getColdboxSettings().codename# - #controller.getColdboxSettings().version# - #controller.getColdboxSettings().suffix# -
+ +
+ Framework Info: +
+
+ #controller.getColdboxSettings().codename# + #controller.getColdboxSettings().version# + #controller.getColdboxSettings().suffix# +
- -
- Application Name: -
-
- #controller.getSetting( "AppName" )# - - (environment=#controller.getSetting( "Environment" )#) - -
+ +
+ Application Name: +
+
+ #controller.getSetting( "AppName" )# + + (environment=#controller.getSetting( "Environment" )#) + +
- -
- CFML Engine: -
-
- #args.environment.cfmlEngine# - #args.environment.cfmlVersion# - / - Java #args.environment.javaVersion# -
+ +
+ CFML Engine: +
+
+ #args.environment.cfmlEngine# + #args.environment.cfmlVersion# + / + Java #args.environment.javaVersion# +
- - - -
- - - #renderView( - view : "main/partials/profilers", - module : "cbdebugger", - args : { - environment : args.environment, - profilers : args.profilers, - debuggerConfig : args.debuggerConfig - }, - prePostExempt : true - )# - - - #renderView( - view : "main/partials/profilerReport", - module : "cbdebugger", - args : { - environment : args.environment, - profiler : args.currentProfiler, - debuggerConfig : args.debuggerConfig, - isVisualizer : args.isVisualizer - }, - prePostExempt : true - )# - -
+ + +
+ + + #renderView( + view : "main/partials/profilers", + module : "cbdebugger", + args : { + environment : args.environment, + profilers : args.profilers, + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService + }, + prePostExempt : true + )# + + + #renderView( + view : "main/partials/profilerReport", + module : "cbdebugger", + args : { + debuggerService : args.debuggerService, + environment : args.environment, + profiler : args.currentProfiler, + debuggerConfig : args.debuggerConfig, + isVisualizer : args.isVisualizer + }, + prePostExempt : true + )# + +
+
- \ No newline at end of file + diff --git a/views/main/panels/collectionPanel.cfm b/views/main/partials/collections.cfm old mode 100755 new mode 100644 similarity index 99% rename from views/main/panels/collectionPanel.cfm rename to views/main/partials/collections.cfm index 38e891c..61857b9 --- a/views/main/panels/collectionPanel.cfm +++ b/views/main/partials/collections.cfm @@ -56,4 +56,4 @@ - \ No newline at end of file + diff --git a/views/main/partials/modules.cfm b/views/main/partials/modules.cfm index 25639ae..1ef9fe7 100644 --- a/views/main/partials/modules.cfm +++ b/views/main/partials/modules.cfm @@ -4,18 +4,20 @@ - + - - + + - - + @@ -95,9 +116,15 @@ @@ -105,9 +132,15 @@ @@ -116,4 +149,4 @@
Module / VersionRegistration TimeActivation TimeRegistrationActivation CMDS
+
@@ -28,6 +30,7 @@ #thisModuleConfig.title# + @@ -47,29 +50,47 @@ return arrayContainsNoCase( thisModuleConfig.childModules, moduleKey ); } ); - -
-   - - - - Child Modules (#structCount( childModules )#) -
- - -
+ - #renderView( - view : "main/partials/modules", - module : "cbdebugger", - args : { - modules : childModules - }, - prePostExempt : true - )# -
+
+   + + + + Child Modules (#structCount( childModules )#) +
+ + +
+ #renderView( + view : "main/partials/modules", + module : "cbdebugger", + args : { + modules : childModules + }, + prePostExempt : true + )# +
+
-
\ No newline at end of file + diff --git a/views/main/partials/profilerReport.cfm b/views/main/partials/profilerReport.cfm index 9585987..e162633 100644 --- a/views/main/partials/profilerReport.cfm +++ b/views/main/partials/profilerReport.cfm @@ -1,34 +1,50 @@ + + + + + + -
+
- +
- + + + + -

@@ -141,6 +157,26 @@ #args.profiler.response.contentType.listFirst( ";" )#

+ +
+ + + + + + + #diff#MB + + + + + + + #diff#MB + + +
+
@@ -154,7 +190,8 @@ #announce( "beforeProfilerReportPanels", { profiler : args.profiler, - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService } )# @@ -162,11 +199,12 @@ #renderView( - view : "main/panels/exceptionPanel", + view : "main/panels/requestTracker/exceptionPanel", module : "cbdebugger", args : { debuggerConfig : args.debuggerConfig, - profiler : args.profiler + profiler : args.profiler, + debuggerService : args.debuggerService }, prePostExempt : true )# @@ -177,12 +215,13 @@ #renderView( - view : "main/panels/debugTimersPanel", + view : "main/panels/requestTracker/debugTimersPanel", module : "cbdebugger", args : { timers : args.profiler.timers, debuggerConfig : args.debuggerConfig, - executionTime : args.profiler.executionTime + executionTime : args.profiler.executionTime, + debuggerService : args.debuggerService }, prePostExempt : true )# @@ -191,11 +230,12 @@ #renderView( - view : "main/panels/coldboxPanel", + view : "main/panels/requestTracker/coldboxPanel", module : "cbdebugger", args : { profiler : args.profiler, - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService }, prePostExempt : true )# @@ -204,11 +244,12 @@ #renderView( - view : "main/panels/httpRequestPanel", + view : "main/panels/requestTracker/httpRequestPanel", module : "cbdebugger", args : { profiler : args.profiler, - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService }, prePostExempt : true )# @@ -218,11 +259,13 @@ #renderView( - view : "main/panels/tracersPanel", + view : "main/panels/requestTracker/tracersPanel", module : "cbdebugger", args : { + profiler : args.profiler, tracers : args.profiler.tracers, - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService }, prePostExempt : true )# @@ -233,40 +276,32 @@ -
-   - - - - ColdBox Request Structures -
-
- - #renderView( - view : "main/panels/collectionPanel", - module : "cbdebugger", - args : { - collection : rc, - collectionType : "Public", - debuggerConfig : args.debuggerConfig - }, - prePostExempt : true - )# - - #renderView( - view : "main/panels/collectionPanel", - module : "cbdebugger", - args : { - collection : prc, - collectionType : "Private", - debuggerConfig : args.debuggerConfig - }, - prePostExempt : true - )# -
+ #renderView( + view : "main/panels/requestTracker/coldboxCollectionsPanel", + module : "cbdebugger", + args : { + profiler : args.profiler, + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService + }, + prePostExempt : true + )# +
+ + + + + + #renderView( + view : "main/panels/requestTracker/acfSqlPanel", + module : "cbdebugger", + args : { + profiler : args.profiler, + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService + }, + prePostExempt : true + )# @@ -274,11 +309,12 @@ #renderView( - view : "main/panels/cbormPanel", + view : "main/panels/requestTracker/cbormPanel", module : "cbdebugger", args : { profiler : args.profiler, - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService }, prePostExempt : true )# @@ -289,11 +325,12 @@ #renderView( - view : "main/panels/qbPanel", + view : "main/panels/requestTracker/qbPanel", module : "cbdebugger", args : { profiler : args.profiler, - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService }, prePostExempt : true )# @@ -302,13 +339,14 @@ #announce( "afterProfilerReportPanels", { profiler : args.profiler, - debuggerConfig : args.debuggerConfig + debuggerConfig : args.debuggerConfig, + debuggerService : args.debuggerService } )#
- Profiler with ID: #rc.id# not found! + Profiler with ID: #encodeForHTML( args.profiler.id )# not found!
@@ -318,7 +356,7 @@
- \ No newline at end of file + diff --git a/views/main/partials/profilers.cfm b/views/main/partials/profilers.cfm index d11ed25..33216ca 100644 --- a/views/main/partials/profilers.cfm +++ b/views/main/partials/profilers.cfm @@ -1,137 +1,172 @@ - - - - - - - - - +
+
- Timestamp
- Ip -
- Server Info - - Response - - Request - - Time
- (ms) -
- Actions -
+ + + + + + + + + - - class="cbd-bg-light-red"> + + class="cbd-bg-light-red" + > - - + + + + + -
- #thisProfiler.localIp# -
- + + - - + + + - - - + - - - - - - - -
+ Timestamp
+ Ip +
+ Server Info + + Response + + Request + + Free Memory + + Time
+ (ms) +
+ Actions +
-
- #timeformat( thisProfiler.timestamp, "hh:mm:ss.l tt" )# -
+ +
+
+ #timeformat( thisProfiler.timestamp, "hh:mm:ss.l tt" )# +
-
- #dateformat( thisProfiler.timestamp, "mmm.dd.yyyy" )# -
+
+ #dateformat( thisProfiler.timestamp, "mmm.dd.yyyy" )# +
- -
+
+ #thisProfiler.inetHost# +
- -
-
- #thisProfiler.inetHost# -
+
+ #thisProfiler.threadInfo.replaceNoCase( "Thread", "" )# +
-
- #thisProfiler.threadInfo.replaceNoCase( "Thread", "" )# -
+
+ #thisProfiler.localIp# +
+
+
+ + + #thisProfiler.response.statusCode# + + + + #thisProfiler.response.statusCode# + + + + #thisProfiler.response.statusCode# + + +
+
+ #thisProfiler.response.contentType.listFirst( ";" )# +
+
-
- + +
+
+ #thisProfiler.requestData.method#:#thisProfiler.fullUrl# +
+
+ + Event: + + #thisProfiler.coldbox.event# +
+
+ + - #thisProfiler.response.statusCode# - - - - #thisProfiler.response.statusCode# + + + + #diff#MB - + - #thisProfiler.response.statusCode# + + + + #diff#MB - -
- #thisProfiler.response.contentType.listFirst( ";" )# -
-
-
- #thisProfiler.requestData.method#:#thisProfiler.fullUrl# -
-
- - Event: - - #thisProfiler.coldbox.event# -
-
- - + + + + + #numberFormat( thisProfiler.executionTime )# + + #numberFormat( thisProfiler.executionTime )# - - - #numberFormat( thisProfiler.executionTime )# - - - -
+ + - -
- No profilers found just yet! Go execute your app! -
-
+ + + + + + + -
\ No newline at end of file + +
+ No profilers found just yet! Go execute your app! +
+
+
+ diff --git a/webpack.config.js b/webpack.config.js index 121d9a1..8b66785 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,35 +1,4 @@ const elixir = require( "coldbox-elixir" ); -const webpack = require( "webpack" ); - -elixir.config.mergeConfig( { - plugins : [ - // globally scoped items which need to be available in all templates - new webpack.ProvidePlugin( { - "$" : "jquery", - "jQuery" : "jquery", - "window.jQuery" : "jquery", - "window.$" : "jquery", - "Vue" : [ - "vue/dist/vue.esm.js", - "default" - ], - "window.Vue" : [ - "vue/dist/vue.esm.js", - "default" - ] - } ) - ], - module : { - // The exposing of jquery as a global object by webpack - rules : [ - { - test : require.resolve( "jquery" ), - loader : "expose-loader", - options : { exposes: [ "$cb" ] } - } - ] - } -} ); /* |-------------------------------------------------------------------------- @@ -43,19 +12,10 @@ elixir.config.mergeConfig( { */ module.exports = elixir( mix => { - // Mix App styles mix .js( "cbdebugger.js" ) .sass( "cbdebugger.scss" ) - .js( - [ "node_modules/jquery/dist/jquery.min.js" ], - { - name : "vendor.min", - entryDirectory : "" - } - ) .copy( "resources/assets/images", "includes/images" ) ; - -} ); \ No newline at end of file +} );