From 1b441c9d0ac3a3364cee34e741ecbb66cf6871c3 Mon Sep 17 00:00:00 2001 From: Kevin Paxton Date: Fri, 29 Sep 2023 08:44:02 +0100 Subject: [PATCH] Support for custom systems (#74) --- .changeset/sour-trees-build.md | 5 + .gitignore | 3 + README.md | 17 ++- docs/customizing.md | 107 +++++++++++++ envy-custom-system.png | Bin 0 -> 140194 bytes examples/apollo-client/package.json | 7 +- examples/apollo-client/src/index.html | 2 +- .../src/viewer/systems/CatFacts.tsx | 19 +++ .../src/viewer/systems/CocktailDb.tsx | 32 ++++ examples/apollo-client/src/viewer/viewer.html | 11 ++ examples/apollo-client/src/viewer/viewer.js | 10 ++ jest.config.ts | 18 --- package.json | 4 +- packages/webui/package.json | 23 ++- .../src/components/ui/FiltersAndActions.tsx | 2 +- .../src/components/ui/TraceDetail.test.tsx | 12 +- .../webui/src/components/ui/TraceDetail.tsx | 12 +- packages/webui/src/integration.tsx | 29 ++++ .../webui/src/scripts/buildIntegration.cjs | 30 ++++ packages/webui/src/scripts/start.cjs | 5 +- packages/webui/src/systems/Default.test.tsx | 2 +- packages/webui/src/systems/Default.tsx | 6 +- packages/webui/src/systems/GraphQL.test.tsx | 2 +- packages/webui/src/systems/GraphQL.tsx | 6 +- packages/webui/src/systems/Sanity.test.tsx | 2 +- packages/webui/src/systems/Sanity.tsx | 6 +- packages/webui/src/systems/index.tsx | 10 +- packages/webui/src/systems/systems.test.tsx | 48 +++--- packages/webui/src/testing/mockSystems.ts | 14 +- packages/webui/src/types/index.ts | 2 +- packages/webui/tsconfig.types.json | 16 ++ yarn.lock | 143 ++++++++++++++++++ 32 files changed, 506 insertions(+), 99 deletions(-) create mode 100644 .changeset/sour-trees-build.md create mode 100644 docs/customizing.md create mode 100644 envy-custom-system.png create mode 100644 examples/apollo-client/src/viewer/systems/CatFacts.tsx create mode 100644 examples/apollo-client/src/viewer/systems/CocktailDb.tsx create mode 100644 examples/apollo-client/src/viewer/viewer.html create mode 100644 examples/apollo-client/src/viewer/viewer.js create mode 100644 packages/webui/src/integration.tsx create mode 100644 packages/webui/src/scripts/buildIntegration.cjs create mode 100644 packages/webui/tsconfig.types.json diff --git a/.changeset/sour-trees-build.md b/.changeset/sour-trees-build.md new file mode 100644 index 0000000..4d3846f --- /dev/null +++ b/.changeset/sour-trees-build.md @@ -0,0 +1,5 @@ +--- +'@envyjs/webui': minor +--- + +Added support for self-hosting and customization of the Envy viewer diff --git a/.gitignore b/.gitignore index fb051db..5246998 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ bin # examples/next.js **/.next/ **/next-env.d.ts + +# other +.DS_Store diff --git a/README.md b/README.md index 637bc00..95869f4 100644 --- a/README.md +++ b/README.md @@ -28,12 +28,13 @@ Envy will trace the network calls from every application in your stack and allow _Note: Envy is intended for development usage only, and is not a replacement for optimized production telemetry_
- Envy + Envy
## Contents - [Getting Started](#getting-started) +- [Customizing](#customizing) - [Production Bundles](#production-bundles) - [Contributing](#contributing) @@ -125,11 +126,17 @@ enableTracing({ serviceName: 'your-website-name' }).then(() => { _Browsers prevent full timing data from being accessed from cross-origin requests unless the server responds with the [Timing-Allow-Origin](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Timing-Allow-Origin) header_. -### Production Bundles +## Customizing + +Whilst Envy will run as a zero-config standalone viewer, it is also possible to run the Envy viewer locally from your application and to define your own systems to customize how traces are presented. + +See the [customization docs](docs/customizing.md) for more information. + +## Production Bundles Envy is designed to enhance your developer experience and is not intended for production usage. Depending on your application, there are various ways to exclude it from your bundle in production. -#### Dynamic Imports (Typescript) +### Dynamic Imports (Typescript) ```ts if (process.env.NODE_ENV !== 'production') { @@ -139,7 +146,7 @@ if (process.env.NODE_ENV !== 'production') { } ``` -#### Dynamic Require (Javascript) +### Dynamic Require (Javascript) ```ts if (process.env.NODE_ENV !== 'production') { @@ -148,7 +155,7 @@ if (process.env.NODE_ENV !== 'production') { } ``` -#### Disabling Tracing +### Disabling Tracing This option is the simplest, but will leave the code in your output bundle. Depending on your application and its deployment and packaging method, this may be acceptable in your usage. diff --git a/docs/customizing.md b/docs/customizing.md new file mode 100644 index 0000000..184e390 --- /dev/null +++ b/docs/customizing.md @@ -0,0 +1,107 @@ +# Customizing Envy + +## Creating your own systems + +A system is a `class` which defines the following: + +- What identifies the trace as belonging to the system, e.g., the hostname, path, etc. +- What icon to display for the system +- What data to show in the list view for the trace +- What data to show in the detail for the trace + +**Let's start by example:** + +In the application you are sending traces from, you can create a new `class` like the following: + +```tsx +// ./src/systems/CatFactsSystem.tsx + +import { System, Trace } from '@envyjs/webui'; + +export default class CatFactsSystem implements System { + name = 'Cat Facts API'; + + isMatch(trace: Trace) { + // this system applies to all traces which are requests to the `cat-fact.herokuapp.com` host + return trace.http?.host === 'cat-fact.herokuapp.com'; + } + + getIconUri() { + // to avoid the need for external resources, icons can be defined as base64 data + return ''; + } + + getTraceRowData() { + // this is the text which will be displayed below the host and path in the list view + return { + data: 'This is a cat fact', + }; + } +} +``` + +Once you have that system, we need to register it with the Envy viewer. The only way to do this currently is to host the envy viewer yourself as a react component, and pass the systems to register in the props. + +For example: + +```tsx +// ./src/MyEnvyViewer.tsx + +import EnvyViewer from '@envyjs/webui'; +import { createRoot } from 'react-dom/client'; + +import CatFactsSystem from './systems/CatFactsSystem'; + +function MyEnvyViewer() { + return ; +} +``` + +Then, you would serve this component up either on a new route in your application, or as a separate application. For example, using parcel you might have the following: + +```tsx +// src/myEnvyViewer.html + + + + + My custome Envy viewer + + +
+ + + + + +// src/myEnvyViewer.js +import EnvyViewer from '@envyjs/webui'; +import { createRoot } from 'react-dom/client'; + +import MyEnvyViewer from './MyEnvyViewer'; + +const container = document.getElementById('root'); +const root = createRoot(container); + +root.render(); +``` + +Finally, in your `package.json`, you would have to start the `@envyjs/webui` collector, opting out of launching the default viewer UI, and load your UI instead: + +``` +// package.json + +{ + "scripts": { + "start:envy": "concurrently \"yarn start:collector\" \"yarn start:viewer\"", + "start:collector": "npx @envyjs/webui --noUi", + "start:viewer": "parcel ./src/myEnvyViewer.html --port 4002 --no-cache" + } +} +``` + +Then, running `yarn start:envy` in your application would start the collector process and launch your customized viewer: + +
+ An example of a custom system defining the presentation of a trace +
diff --git a/envy-custom-system.png b/envy-custom-system.png new file mode 100644 index 0000000000000000000000000000000000000000..cbaf541dc25ec02911aaf7c1fb6ce877f02f44fb GIT binary patch literal 140194 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�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 AX#fBK literal 0 HcmV?d00001 diff --git a/examples/apollo-client/package.json b/examples/apollo-client/package.json index f677006..9c8fcd8 100644 --- a/examples/apollo-client/package.json +++ b/examples/apollo-client/package.json @@ -5,10 +5,15 @@ "license": "MIT", "private": true, "scripts": { - "start": "parcel ./src/index.html --port 4001 --no-cache" + "start": "yarn start:web", + "start:custom-viewer": "concurrently \"yarn start:envy\" \"yarn start:web\" \"yarn start:viewer\"", + "start:web": "parcel ./src/index.html --port 4001 --no-cache", + "start:envy": "npx @envyjs/webui --noUi", + "start:viewer": "parcel ./src/viewer/viewer.html --port 4002 --no-cache" }, "dependencies": { "@envyjs/web": "*", + "@envyjs/webui": "*", "react": "^18.2.0", "react-dom": "^18.2.0", "urql": "^4.0.5" diff --git a/examples/apollo-client/src/index.html b/examples/apollo-client/src/index.html index 88b8027..22e9301 100644 --- a/examples/apollo-client/src/index.html +++ b/examples/apollo-client/src/index.html @@ -6,7 +6,7 @@ -
+
diff --git a/examples/apollo-client/src/viewer/systems/CatFacts.tsx b/examples/apollo-client/src/viewer/systems/CatFacts.tsx new file mode 100644 index 0000000..3f992b3 --- /dev/null +++ b/examples/apollo-client/src/viewer/systems/CatFacts.tsx @@ -0,0 +1,19 @@ +import { System, Trace } from '@envyjs/webui'; + +export default class CatFactsSystem implements System { + name = 'Cat Facts API'; + + isMatch(trace: Trace) { + return trace.http?.host === 'cat-fact.herokuapp.com'; + } + + getIconUri() { + return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pjxzdmcgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IkJsYWNrX2NhdCI+PHBhdGggZD0iTTM3MC4wOTE4LDUyLjE0NmMtNS4xMzEyLTUuMTAzNS0xMy40NS00LjczLTE4LjU2MzguMzg1Ni0yMi44NzQ4LDIyLjg1NzYtNDIuNDkzOSw1MC4zNTYzLTU3LjkwNDcsODEuMThhMjYyLjg1NDQsMjYyLjg1NDQsMCwwLDAtNzUuMzM2MywwLDMxMi45NTEyLDMxMi45NTEyLDAsMCwwLTU3LjgyMzUtODEuMTYwN2MtNS4xMS01LjEyMzgtMTMuNDMyNi01LjUwNTEtMTguNTY4MS0uNDAyN0M4My4zOTI2LDExMC4yODE0LDQ2LDE5OC4zMzc4LDQ2LDI5Ny4yNDg1YzAsOTEuODc1LDkzLjk3NzEsMTY2LjI1LDIxMCwxNjYuMjUsMTE1LjkzNzUsMCwyMTAtNzQuMzc1LDIxMC0xNjYuMjVDNDY2LDE5OC4zMzY4LDQyOC41MjYyLDExMC4yNzgxLDM3MC4wOTE4LDUyLjE0NlpNMTQ2LjYyNSwzMzAuODQ5M2MtMjQuMzI3NC00LjcyNTQtNDQuOTc2Mi0yMi4zMTI5LTU2Ljg3NS00Ni43MjU4LDExLjg5ODgtMjQuNDEyOCwzMi41NDc2LTQyLDU2Ljg3NS00Ni43MjQ3Wm0yNi4yNSwwVjIzNy4zOTg4YzI0LjIzNzcsNC43MjQzLDQ0Ljk3NjIsMjIuMzExOSw1Ni44NzUsNDYuNzI0N0MyMTcuODUxMiwzMDguNTM2NCwxOTcuMTEyNywzMjYuMTIzOSwxNzIuODc1LDMzMC44NDkzWm0xNjYuMjUsMGMtMjQuMzI3NC00LjcyNTQtNDQuOTc2Mi0yMi4zMTI5LTU2Ljg3NS00Ni43MjU4LDExLjg5ODgtMjQuNDEyOCwzMi41NDc2LTQyLDU2Ljg3NS00Ni43MjQ3Wm0yNi4yNSwwVjIzNy4zOTg4YzI0LjIzNzcsNC43MjQzLDQ0Ljk3NjIsMjIuMzExOSw1Ni44NzUsNDYuNzI0N0M0MTAuMzUxMiwzMDguNTM2NCwzODkuNjEyNywzMjYuMTIzOSwzNjUuMzc1LDMzMC44NDkzWiIvPjwvZz48L3N2Zz4='; + } + + getTraceRowData() { + return { + data: 'Cat fact', + }; + } +} diff --git a/examples/apollo-client/src/viewer/systems/CocktailDb.tsx b/examples/apollo-client/src/viewer/systems/CocktailDb.tsx new file mode 100644 index 0000000..ae89533 --- /dev/null +++ b/examples/apollo-client/src/viewer/systems/CocktailDb.tsx @@ -0,0 +1,32 @@ +import { System, Trace } from '@envyjs/webui'; + +type CocktailDbData = { + name: string; +}; + +export default class CocktailDbSystem implements System { + name = 'Cocktail Database'; + + isMatch(trace: Trace) { + return trace.http?.host === 'www.thecocktaildb.com'; + } + + getData(trace: Trace) { + const data = trace.http?.responseBody ? JSON.parse(trace.http?.responseBody) : null; + + return { + name: data?.drinks[0].strDrink ?? '', + }; + } + + getIconUri() { + return 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplUXVhbGl0eSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCA1MDUgNTEyLjQ0Ij48cGF0aCBmaWxsPSIjRkRDNDU0IiBkPSJNNDU5LjIzNSAxNDUuNDQ1YzIwLjU3NCA4MS45NDggMTcuMDU0IDE1OS43MjItNTAuMTI0IDE4MS41ODctMzcuNTcyIDEyLjE0OS02Ny45NzkgNy43MDItOTEuNjI5LTEyLjM4OS0zMi44NzQtMjcuOTI5LTQ2LjYzOC03Ny41ODUtNTIuNTk2LTEzMC4xMDUgOTMuNzg4LTQyLjAzOSAxOTYuMDc2LTkyLjU3IDE5NC4zNDktMzkuMDkzeiIvPjxwYXRoIGZpbGw9IiM2ODM4MDAiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTM1Mi45NTEgNTA0LjE4M2MtNy41NTMgMS40NDMtMTQuODUyLTMuNTEyLTE2LjI5Ni0xMS4wNjQtMS40NDMtNy41NTMgMy41MTEtMTQuODUzIDExLjA2NC0xNi4yOTZsNTguNjc0LTExLjM0NS0yNS43MTUtMTI1Ljc2OWMtMS41MzMtNy41MjQgMy4zMjQtMTQuODczIDEwLjg0OS0xNi40MDYgNy41MjUtMS41MzQgMTQuODczIDMuMzIzIDE2LjQwNiAxMC44NDlsMjUuNzc1IDEyNi4wNDIgNTQuNzQ2LTEwLjU4NWM3LjU1My0xLjQ0MyAxNC44NTMgMy41MTEgMTYuMjk2IDExLjA2NCAxLjQ0MyA3LjU1My0zLjUxMSAxNC44NTItMTEuMDY0IDE2LjI5NmwtMTQwLjczNSAyNy4yMTR6Ii8+PHBhdGggZmlsbD0iI0ZEQzQ1NCIgZD0iTTQ5Ljc2OCAxNDUuNDQ1Yy0yMC41NzQgODEuOTQ4LTE3LjA1NCAxNTkuNzIyIDUwLjEyNCAxODEuNTg3IDM3LjU3MiAxMi4xNDkgNjcuOTc5IDcuNzAyIDkxLjYyOS0xMi4zODkgMzIuODc0LTI3LjkyOSA0Ni42MzgtNzcuNTg1IDUyLjU5Ni0xMzAuMTA1LTQ2Ljc2OS01NS40MTUtMTI5LjU2Ni0yNi4wNjItMTk0LjM0OS0zOS4wOTN6Ii8+PHBhdGggZmlsbD0iIzY4MzgwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMjM5Ljk2NyA1NS44MzhjLS42NDktMy44NjItMS45NDYtNi45ODQtMy45MzQtOS4yOTgtMS45NzEtMi4yOTctNC44NjQtNC4wMTEtOC43MTktNS4wOTdsLTc2Ljk3NS0xNS4xNzhjLTQuODc0LS45NjEtOS42OTctMS45OTktMTMuOTQ3LTIuOTExLTIzLjEwMi00Ljk2NS0yMy4yMDctNC45ODUtMzUuNjQxIDI1Ljk0NC0yNy41NjggNjguNTc2LTUwLjE0NiAxMzAuMDAxLTUzLjQ3MyAxNzcuNTg3LTMuMDk1IDQ0LjIzOCAxMS4xNzEgNzYuNDA2IDU1LjYyOCA5MC44NzRsLjQwNi4xNDJjMTcuMTg3IDUuNTAzIDMyLjYwNSA3LjI1NCA0Ni4yODEgNS4zN2wuMjc4LS4wMzRjMTMuMjM5LTEuODY3IDI1LjAxNC03LjI0OCAzNS4zNTMtMTYuMDM2IDUxLjk2Ny00NC4xNTEgNTMuMTMtMTM5LjU1MiA1NC4wNDItMjE0LjYyMi4xNi0xMy4wMjguMzEyLTI1LjQ3OS43MDEtMzYuNzQxek0xMjcuNjY2IDM0Mi45NDNMMTAwLjg4IDQ3My45MjJsNTYuNDAxIDEwLjkwOGM3LjU1MyAxLjQ0NCAxMi41MDcgOC43NDMgMTEuMDY0IDE2LjI5Ni0xLjQ0MyA3LjU1My04Ljc0MyAxMi41MDctMTYuMjk2IDExLjA2NEwxMS4zMTQgNDg0Ljk3NkMzLjc2MSA0ODMuNTMzLTEuMTkzIDQ3Ni4yMzMuMjUgNDY4LjY4YzEuNDQ0LTcuNTUzIDguNzQzLTEyLjUwNyAxNi4yOTYtMTEuMDYzbDU3LjAyMiAxMS4wMjUgMjYuODQtMTMxLjI0N2MtMS4wMS0uMzAyLTIuMDE5LS42MTctMy4wMzYtLjk0M2wtLjQ5Ni0uMTQ2Yy01NS4wOS0xNy45MjYtNzIuODEyLTU3LjA3MS02OS4wNjItMTEwLjcxOCAzLjUxOC01MC4yOTYgMjYuNjM1LTExMy4zNjYgNTQuODQ4LTE4My41NDFDMTAxLjIzMy00LjE1NSAxMDEuNC00LjExNiAxNDAuNDM4IDQuMjcyYzMuODE5LjgxOSA4LjE0MiAxLjc1MyAxMy42NDEgMi44MzVsNzcuNzY5IDE1LjM2OWM4LjAyNSAyLjEyIDE0LjMyMiA1Ljk2NCAxOC45OTIgMTEuMzk0IDQuNjA4IDUuMzU2IDcuNDE0IDEyLjAzOSA4LjU0OCAxOS45MzUuMDY3LjU2Mi4wOTggMS4xMzQuMDc3IDEuNzE3LS40MjMgMTEuNzY1LS41NzYgMjQuMjI3LS43MzUgMzcuMjg1LS45NTggNzguOTk4LTIuMTgzIDE3OS4zODUtNjAuOTEyIDIyOS4yNzgtMTMuMTQzIDExLjE2OC0yOC4yMDMgMTguMDMxLTQ1LjIxMyAyMC40NDJsLS4zNC4wNTVjLTcuODIgMS4wNzktMTYuMDE5IDEuMjA0LTI0LjU5OS4zNjF6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMjAyLjk5NyAyMjMuMTI4YTUuNTcyIDUuNTcyIDAgMDExMS4wMzMgMS41NjhjLTMuMTE2IDIxLjQ0NC0xMC41MyAzOC41NjItMjEuNzA4IDUxLjg2NC0xMS4yMTMgMTMuMzQzLTI2LjA5MyAyMi43MjEtNDQuMTI0IDI4LjY2NGE1LjU4IDUuNTggMCAwMS03LjA0Mi0zLjU1MyA1LjU4IDUuNTggMCAwMTMuNTUyLTcuMDQzYzE2LjExNi01LjMxMSAyOS4zMTMtMTMuNTY5IDM5LjEwNy0yNS4yMjIgOS44MjUtMTEuNjkyIDE2LjM3Ni0yNi45NjEgMTkuMTgyLTQ2LjI3OHpNMzA5LjAxMSAyNDguMjY0YTUuNTczIDUuNTczIDAgMDExMC4zOC00LjA2YzcuMTQ3IDE4LjE0MiAxNy4wMjUgMzEuNTAyIDI5LjI4OSA0MC42NDggMTIuMjA5IDkuMTA3IDI2LjkzNiAxNC4xMjQgNDMuODE4IDE1LjYwMmE1LjU4MiA1LjU4MiAwIDAxLS45NTcgMTEuMTIyYy0xOC45MzktMS42NTUtMzUuNTgyLTcuMzc2LTQ5LjUzNi0xNy43ODctMTMuOTEyLTEwLjM3Ny0yNS4wNDItMjUuMzQ0LTMyLjk5NC00NS41MjV6Ii8+PHBhdGggZmlsbD0iIzY4MzgwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMjQ5LjYyMiA1My44MDVjMS4xMjQtNy44OTYgMy45MzUtMTQuNTc1IDguNTM5LTE5LjkzNSA0LjY2OS01LjQzIDEwLjk2Ni05LjI3NCAxOC45OTQtMTEuMzk0bDc3Ljc3LTE1LjM2OWM1LjUwNi0xLjA4NiA5LjgxOC0yLjAxNiAxMy42NDEtMi44MzUgMzkuMDM1LTguMzg4IDM5LjIwNC04LjQyMyA1Ny43NzYgMzcuNzc1IDI4LjIxMyA3MC4xNzUgNTEuMzI5IDEzMy4yNDUgNTQuODQ3IDE4My41NDEgMy43NTEgNTMuNjQ3LTEzLjk3NCA5Mi43OTItNjkuMDY1IDExMC43MThsLS40OTYuMTQ2Yy0yMC4wMjEgNi40MTQtMzguMzA1IDguNDE2LTU0Ljg4OCA2LjEzbC0uMzQxLS4wNTVjLTE3LjAxLTIuNDExLTMyLjA3MS05LjI3NC00NS4yMTItMjAuNDQyLTU4LjczNy00OS44OTctNTkuOTU4LTE1MC4yOTQtNjAuOTE2LTIyOS4yOTUtLjE1Ni0xMy4wNTUtLjMwOS0yNS41MTctLjczMi0zNy4yNjgtLjAyMS0uNTgzLjAxLTEuMTU1LjA4My0xLjcxN3ptMjMuMzQ2LTcuMjY1Yy0xLjk4NSAyLjMxLTMuMjg2IDUuNDMzLTMuOTMxIDkuMjk0LjM4OCAxMS4yNjIuNTQxIDIzLjcwNi42OTcgMzYuNzI3LjkxMyA3NS4wNzggMi4wNzUgMTcwLjQ4OSA1NC4wNDYgMjE0LjY0IDEwLjMzOSA4Ljc4OCAyMi4xMTQgMTQuMTY5IDM1LjM1MyAxNi4wMzZsLjI3OC4wMzRjMTMuNjggMS44ODggMjkuMDk0LjEzMyA0Ni4yNzgtNS4zN2wuNDA2LS4xNDJjNDQuNDU2LTE0LjQ2OCA1OC43MjYtNDYuNjM2IDU1LjYzMS05MC44NzQtMy4zMjctNDcuNTg2LTI1LjkwNi0xMDkuMDExLTUzLjQ3My0xNzcuNTg3LTEyLjQzMS0zMC45MjYtMTIuNTM4LTMwLjkwOS0zNS42NDEtMjUuOTQ0LTQuMjU0LjkxMi05LjA4MyAxLjk1My0xMy45NDcgMi45MTFMMjgxLjY5IDQxLjQ0N2MtMy44NTggMS4wODItNi43NDggMi43OTktOC43MjIgNS4wOTN6Ii8+PC9zdmc+'; + } + + getTraceRowData(trace: Trace) { + const data = this.getData(trace); + return { + data: data.name, + }; + } +} diff --git a/examples/apollo-client/src/viewer/viewer.html b/examples/apollo-client/src/viewer/viewer.html new file mode 100644 index 0000000..ef179e1 --- /dev/null +++ b/examples/apollo-client/src/viewer/viewer.html @@ -0,0 +1,11 @@ + + + + + Envy - Custom viewer + + +
+ + + diff --git a/examples/apollo-client/src/viewer/viewer.js b/examples/apollo-client/src/viewer/viewer.js new file mode 100644 index 0000000..85c2e54 --- /dev/null +++ b/examples/apollo-client/src/viewer/viewer.js @@ -0,0 +1,10 @@ +import EnvyViewer from '@envyjs/webui'; +import { createRoot } from 'react-dom/client'; + +import CatFactsSystem from './systems/CatFacts'; +import CocktailDbSystem from './systems/CocktailDb'; + +const container = document.getElementById('root'); +const root = createRoot(container); + +root.render(); diff --git a/jest.config.ts b/jest.config.ts index d5b83db..e2e5eb7 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,22 +1,4 @@ export default { preset: 'ts-jest', - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - diagnostics: { - ignoreCodes: [1343], - }, - astTransformers: { - before: [ - { - path: 'ts-jest-mock-import-meta', - options: { metaObjectReplacement: { url: 'https://www.url.com/' } }, - }, - ], - }, - }, - ], - }, testMatch: ['**/__tests__/**/*.[jt]s?(x)', '**/src/**/?(*.)+(spec|test).[jt]s?(x)'], }; diff --git a/package.json b/package.json index 6770982..5b759b0 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "build": "turbo run build", "lint": "turbo run lint", "test": "turbo run test", - "example:apollo": "concurrently \"cd examples/apollo && yarn start\" \"wait-on tcp:4000 && (cd examples/apollo-client && yarn start)\"", - "example:express": "concurrently \"cd examples/express && yarn start\" \"wait-on tcp:4000 && (cd examples/express-client && yarn dev)\"", + "example:apollo": "concurrently \"cd examples/apollo && yarn start\" \"cd examples/apollo-client && yarn start:custom-viewer\"", + "example:express": "concurrently \"cd examples/express && yarn start\" \"cd examples/express-client && yarn dev\"", "example:next": "cd examples/next && yarn && yarn dev", "changeset": "changeset" }, diff --git a/packages/webui/package.json b/packages/webui/package.json index 9bb6856..452e308 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -2,9 +2,16 @@ "name": "@envyjs/webui", "version": "0.3.2", "description": "Envy Web UI", - "source": [ - "src/index.html" - ], + "targets": { + "main": false, + "viewer": { + "source": "src/index.html", + "distDir": "dist" + } + }, + "main": "dist/integration.cjs.js", + "module": "dist/integration.esm.js", + "types": "dist/integration.d.ts", "bin": { "envy": "bin/start.cjs" }, @@ -25,9 +32,11 @@ "test:watch": "jest --watch --coverage", "test:coverage": "jest --coverage && open ./coverage/lcov-report/index.html", "prebuild": "rimraf dist && rimraf bin", - "build": "yarn build:parcel && yarn build:scripts", - "build:parcel": "cross-env NODE_ENV=production parcel build --no-cache", - "build:scripts": "copyfiles --flat ./src/scripts/start.cjs ./src/scripts/startCollector.cjs ./src/scripts/startViewer.cjs ./bin", + "build": "yarn build:app && yarn build:integration && yarn build:typedefs && yarn build:bin", + "build:app": "cross-env NODE_ENV=production parcel build --no-cache", + "build:integration": "tailwindcss -i ./src/styles/base.css -o ./dist/viewer.css && node ./src/scripts/buildIntegration.cjs", + "build:typedefs": "tsc --project ./tsconfig.types.json", + "build:bin": "copyfiles --flat ./src/scripts/start.cjs ./src/scripts/startCollector.cjs ./src/scripts/startViewer.cjs ./bin", "lint": "tsc --noEmit && eslint ./src --ext .ts,.tsx" }, "dependencies": { @@ -59,6 +68,8 @@ "copyfiles": "^2.4.1", "cross-env": "^7.0.3", "crypto-browserify": "^3.12.0", + "esbuild": "^0.19.3", + "esbuild-plugin-inline-import": "^1.0.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "events": "^3.1.0", diff --git a/packages/webui/src/components/ui/FiltersAndActions.tsx b/packages/webui/src/components/ui/FiltersAndActions.tsx index b879581..38841d1 100644 --- a/packages/webui/src/components/ui/FiltersAndActions.tsx +++ b/packages/webui/src/components/ui/FiltersAndActions.tsx @@ -40,7 +40,7 @@ export default function FiltersAndActions() { label="Systems:" multiSelect items={systems.map(x => ({ - icon: x.getIconPath?.(null) ?? defaultSystem.getIconPath(), + icon: x.getIconUri?.(null) ?? defaultSystem.getIconUri(), value: x.name, }))} onChange={handleSystemsChange} diff --git a/packages/webui/src/components/ui/TraceDetail.test.tsx b/packages/webui/src/components/ui/TraceDetail.test.tsx index 939d386..1753b55 100644 --- a/packages/webui/src/components/ui/TraceDetail.test.tsx +++ b/packages/webui/src/components/ui/TraceDetail.test.tsx @@ -2,9 +2,9 @@ import { act, cleanup, render, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { - SystemRequestDetailsComponent, - SystemResponseDetailsComponent, - getIconPath, + RequestDetailsComponent, + ResponseDetailsComponent, + getIconUri, getRequestBody, getResponseBody, } from '@/systems'; @@ -88,15 +88,15 @@ describe('TraceDetail', () => { clearSelectedTraceFn = jest.fn(); // having to do this here, like this, so that we can override some of the mock return values later - jest.mocked(SystemRequestDetailsComponent).mockImplementation(({ trace, ...props }: any) => { + jest.mocked(RequestDetailsComponent).mockImplementation(({ trace, ...props }: any) => { return
Mock SystemRequestDetailsComponent component: {trace.id}
; }); - jest.mocked(SystemResponseDetailsComponent).mockImplementation(({ trace, ...props }: any) => { + jest.mocked(ResponseDetailsComponent).mockImplementation(({ trace, ...props }: any) => { return
Mock SystemResponseDetailsComponent component: {trace.id}
; }); jest.mocked(getRequestBody).mockReturnValue('mock_request_body'); jest.mocked(getResponseBody).mockReturnValue('mock_response_body'); - jest.mocked(getIconPath).mockReturnValue('mock_icon.jpg'); + jest.mocked(getIconUri).mockReturnValue('mock_icon.jpg'); setUseApplicationData({ getSelectedTrace: getSelectedTraceFn as () => Trace, diff --git a/packages/webui/src/components/ui/TraceDetail.tsx b/packages/webui/src/components/ui/TraceDetail.tsx index 476791b..8442a18 100644 --- a/packages/webui/src/components/ui/TraceDetail.tsx +++ b/packages/webui/src/components/ui/TraceDetail.tsx @@ -3,9 +3,9 @@ import { useCallback, useEffect, useRef } from 'react'; import { Code, DateTime, Field, Fields, JsonDisplay, Loading, Section, XmlDisplay } from '@/components'; import useApplication from '@/hooks/useApplication'; import { - SystemRequestDetailsComponent, - SystemResponseDetailsComponent, - getIconPath, + RequestDetailsComponent, + ResponseDetailsComponent, + getIconUri, getRequestBody, getResponseBody, } from '@/systems'; @@ -103,7 +103,7 @@ export default function TraceDetail({ className }: DetailProps) {
- +
@@ -146,7 +146,7 @@ export default function TraceDetail({ className }: DetailProps) { - +
@@ -181,7 +181,7 @@ export default function TraceDetail({ className }: DetailProps) { )} - + ) : ( diff --git a/packages/webui/src/integration.tsx b/packages/webui/src/integration.tsx new file mode 100644 index 0000000..1aaf983 --- /dev/null +++ b/packages/webui/src/integration.tsx @@ -0,0 +1,29 @@ +/* istanbul ignore file */ + +/* eslint-disable import/no-unresolved */ +// @ts-expect-error +import css from 'inline:../dist/viewer.css'; + +import App from './App'; +import { registerSystem } from './systems/registration'; +import { System } from './types'; + +export type { System, TraceRowData, Trace } from './types'; +export * from './components'; + +export type EnvyViewerProps = { + systems?: System[]; +}; + +export default function EnvyViewer({ systems }: EnvyViewerProps) { + for (const system of systems ?? []) { + registerSystem(system); + } + + return ( + <> + + + + ); +} diff --git a/packages/webui/src/scripts/buildIntegration.cjs b/packages/webui/src/scripts/buildIntegration.cjs new file mode 100644 index 0000000..e1ce528 --- /dev/null +++ b/packages/webui/src/scripts/buildIntegration.cjs @@ -0,0 +1,30 @@ +const { build } = require('esbuild'); +const inlineImportPlugin = require('esbuild-plugin-inline-import'); + +const { dependencies } = require('../../package.json'); + +const integrationFile = 'src/integration.tsx'; + +const shared = { + bundle: true, + entryPoints: [integrationFile], + external: Object.keys(dependencies), + logLevel: 'info', + plugins: [inlineImportPlugin()], + minify: true, + sourcemap: true, +}; + +build({ + ...shared, + format: 'esm', + outfile: './dist/integration.esm.js', + target: ['es2022', 'node16'], +}); + +build({ + ...shared, + format: 'cjs', + outfile: './dist/integration.cjs.js', + target: ['es2022', 'node16'], +}); diff --git a/packages/webui/src/scripts/start.cjs b/packages/webui/src/scripts/start.cjs index 1b4e9ef..e041612 100644 --- a/packages/webui/src/scripts/start.cjs +++ b/packages/webui/src/scripts/start.cjs @@ -2,9 +2,12 @@ const argv = require('yargs-parser')(process.argv.slice(2)); const devMode = argv.dev ?? false; +const noUi = argv.noUi ?? argv.noui ?? false; require('./startCollector.cjs'); global.collectorStarted = () => { - require(devMode ? './startViewerDev.cjs' : './startViewer.cjs'); + if (noUi === false) { + require(devMode ? './startViewerDev.cjs' : './startViewer.cjs'); + } }; diff --git a/packages/webui/src/systems/Default.test.tsx b/packages/webui/src/systems/Default.test.tsx index 4115b24..cba54e4 100644 --- a/packages/webui/src/systems/Default.test.tsx +++ b/packages/webui/src/systems/Default.test.tsx @@ -15,7 +15,7 @@ describe('DefaultSystem', () => { it('should return the expected icon', () => { const instance = new DefaultSystem(); - expect(instance.getIconPath()).toEqual('/Default.svg'); + expect(instance.getIconUri()).toEqual(expect.any(String)); }); it('should return `null` for `getData`', () => { diff --git a/packages/webui/src/systems/Default.tsx b/packages/webui/src/systems/Default.tsx index fb7f6a2..3bda142 100644 --- a/packages/webui/src/systems/Default.tsx +++ b/packages/webui/src/systems/Default.tsx @@ -1,7 +1,5 @@ import { System, Trace } from '@/types'; -const icon = new URL('Default.svg', import.meta.url); - export default class DefaultSystem implements System { name = 'Default'; @@ -9,8 +7,8 @@ export default class DefaultSystem implements System { return true; } - getIconPath() { - return icon.pathname; + getIconUri() { + return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MjAiCmhlaWdodD0iNDIwIiBzdHJva2U9IiMyMjIyMjIiIGZpbGw9Im5vbmUiPgo8cGF0aCBzdHJva2Utd2lkdGg9IjI2IgpkPSJNMjA5LDE1YTE5NSwxOTUgMCAxLDAgMiwweiIvPgo8cGF0aCBzdHJva2Utd2lkdGg9IjE4IgpkPSJtMjEwLDE1djM5MG0xOTUtMTk1SDE1TTU5LDkwYTI2MCwyNjAgMCAwLDAgMzAyLDAgbTAsMjQwIGEyNjAsMjYwIDAgMCwwLTMwMiwwTTE5NSwyMGEyNTAsMjUwIDAgMCwwIDAsMzgyIG0zMCwwIGEyNTAsMjUwIDAgMCwwIDAtMzgyIi8+Cjwvc3ZnPg=='; } getData() { diff --git a/packages/webui/src/systems/GraphQL.test.tsx b/packages/webui/src/systems/GraphQL.test.tsx index fb1011b..a6407e0 100644 --- a/packages/webui/src/systems/GraphQL.test.tsx +++ b/packages/webui/src/systems/GraphQL.test.tsx @@ -90,7 +90,7 @@ describe('GraphQLSystem', () => { it('should return the expected icon', () => { const instance = new GraphQLSystem(); - expect(instance.getIconPath()).toEqual('/GraphQL.svg'); + expect(instance.getIconUri()).toEqual(expect.any(String)); }); it('should expected data for `getData` when trace represents a query', () => { diff --git a/packages/webui/src/systems/GraphQL.tsx b/packages/webui/src/systems/GraphQL.tsx index 259541c..9f95b9e 100644 --- a/packages/webui/src/systems/GraphQL.tsx +++ b/packages/webui/src/systems/GraphQL.tsx @@ -16,8 +16,6 @@ type GraphQLData = { response: string | null; }; -const icon = new URL('GraphQL.svg', import.meta.url); - export default class GraphQLSystem implements System { name = 'GraphQL'; @@ -25,8 +23,8 @@ export default class GraphQLSystem implements System { return trace.http?.path?.endsWith('/graphql') ?? false; } - getIconPath() { - return icon.pathname; + getIconUri() { + return 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiBmaWxsPSIjZTEwMDk4Ij4KICA8c3R5bGU+CiAgICBzdmcgewogICAgICBmaWxsOiAjRkZGRkZGOwogICAgfQogIDwvc3R5bGU+CiAgPGRlZnM+CiAgICA8ZyBpZD0ibG9nbyI+CiAgICAgIDxwYXRoCiAgICAgICAgZmlsbC1ydWxlPSJldmVub2RkIgogICAgICAgIGNsaXAtcnVsZT0iZXZlbm9kZCIKICAgICAgICBkPSJNNTAgNi45MDMwOEw4Ny4zMjMgMjguNDUxNVY3MS41NDg0TDUwIDkzLjA5NjhMMTIuNjc3IDcxLjU0ODRWMjguNDUxNUw1MCA2LjkwMzA4Wk0xNi44NjQ3IDMwLjg2OTNWNjIuNTI1MUw0NC4yNzk1IDE1LjA0MTRMMTYuODY0NyAzMC44NjkzWk01MCAxMy41MDg2TDE4LjM5NzUgNjguMjQ1N0g4MS42MDI1TDUwIDEzLjUwODZaTTc3LjQxNDggNzIuNDMzNEgyMi41ODUyTDUwIDg4LjI2MTNMNzcuNDE0OCA3Mi40MzM0Wk04My4xMzUzIDYyLjUyNTFMNTUuNzIwNSAxNS4wNDE0TDgzLjEzNTMgMzAuODY5M1Y2Mi41MjUxWiIKICAgICAgLz4KICAgICAgPGNpcmNsZSBjeD0iNTAiIGN5PSI5LjMyMDkiIHI9IjguODIiIC8+CiAgICAgIDxjaXJjbGUgY3g9Ijg1LjIyOTIiIGN5PSIyOS42NjA1IiByPSI4LjgyIiAvPgogICAgICA8Y2lyY2xlIGN4PSI4NS4yMjkyIiBjeT0iNzAuMzM5NiIgcj0iOC44MiIgLz4KICAgICAgPGNpcmNsZSBjeD0iNTAiIGN5PSI5MC42NzkxIiByPSI4LjgyIiAvPgogICAgICA8Y2lyY2xlIGN4PSIxNC43NjU5IiBjeT0iNzAuMzM5NiIgcj0iOC44MiIgLz4KICAgICAgPGNpcmNsZSBjeD0iMTQuNzY1OSIgY3k9IjI5LjY2MDUiIHI9IjguODIiIC8+CiAgICA8L2c+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiByeD0iMjAiIGZpbGw9IiNFMTAwOTgiIC8+CiAgPHVzZSBocmVmPSIjbG9nbyIgeD0iMTAiIHk9IjEwIiAvPgo8L3N2Zz4K'; } getData(trace: Trace) { diff --git a/packages/webui/src/systems/Sanity.test.tsx b/packages/webui/src/systems/Sanity.test.tsx index f974c46..2d18c7d 100644 --- a/packages/webui/src/systems/Sanity.test.tsx +++ b/packages/webui/src/systems/Sanity.test.tsx @@ -51,7 +51,7 @@ describe('SanitySystem', () => { it('should return the expected icon', () => { const instance = new SanitySystem(); - expect(instance.getIconPath()).toEqual('/Sanity.svg'); + expect(instance.getIconUri()).toEqual(expect.any(String)); }); it('should expected data for `getData`', () => { diff --git a/packages/webui/src/systems/Sanity.tsx b/packages/webui/src/systems/Sanity.tsx index f35175f..72306a8 100644 --- a/packages/webui/src/systems/Sanity.tsx +++ b/packages/webui/src/systems/Sanity.tsx @@ -11,8 +11,6 @@ type SanityData = { query?: string | null; }; -const icon = new URL('Sanity.svg', import.meta.url); - export default class SanitySystem implements System { name = 'Sanity'; @@ -20,8 +18,8 @@ export default class SanitySystem implements System { return !!trace.sanity; } - getIconPath() { - return icon.pathname; + getIconUri() { + return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjggMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiByeD0iNiIgZmlsbD0iI0YwM0UyRiI+PC9yZWN0PgogIDxwYXRoCiAgICBkPSJNOC42MiA3LjI1YzAgMi40MSAxLjUyIDMuODQgNC41NCA0LjZsMy4yMS43M2MyLjg3LjY0IDQuNjEgMi4yNSA0LjYxIDQuODdhNC45MSA0LjkxIDAgMDEtMS4wNyAzLjE1YzAtMi42MS0xLjM3LTQuMDItNC42OS00Ljg3bC0zLjE1LS43Yy0yLjUyLS41Ny00LjQ3LTEuODktNC40Ny00LjczYTQuODkgNC44OSAwIDAxMS4wMi0zLjA1eiIKICAgIGZpbGw9IiNmZmYiCiAgPjwvcGF0aD4KICA8cGF0aAogICAgZD0iTTE3Ljk0IDE2LjhjMS4zNy44NyAxLjk3IDIuMDcgMS45NyAzLjgtMS4xMyAxLjQyLTMuMTIgMi4yMi01LjQ2IDIuMjItMy45NCAwLTYuNy0xLjktNy4zLTUuMjFoMy43OGMuNDggMS41MiAxLjc3IDIuMjIgMy41IDIuMjIgMi4xIDAgMy40OS0xLjEgMy41Mi0zLjAzIgogICAgZmlsbD0iI0Y5QjFBQiIKICA+PC9wYXRoPgogIDxwYXRoCiAgICBkPSJNMTAuNTkgMTAuODJhMy45OSAzLjk5IDAgMDEtMS45Ny0zLjU3YzEuMS0xLjQgMy0yLjI3IDUuMzItMi4yNyA0IDAgNi4zMyAyLjA4IDYuOSA1SDE3LjJjLS40LTEuMTUtMS40LTIuMDUtMy4yMy0yLjA1LTEuOTYgMC0zLjMgMS4xMi0zLjM3IDIuOSIKICAgIGZpbGw9IiNGOUIxQUIiCiAgPjwvcGF0aD4KPC9zdmc+Cg=='; } getData(trace: Trace) { diff --git a/packages/webui/src/systems/index.tsx b/packages/webui/src/systems/index.tsx index ffecaf5..ba37dd6 100644 --- a/packages/webui/src/systems/index.tsx +++ b/packages/webui/src/systems/index.tsx @@ -19,8 +19,8 @@ type SystemDetailProps = { trace: Trace; }; -export function getIconPath(trace: Trace | null): string { - return callOrFallback(trace as Trace, 'getIconPath'); +export function getIconUri(trace: Trace | null): string { + return callOrFallback(trace as Trace, 'getIconUri'); } export function getRequestBody(trace: Trace): any { @@ -37,7 +37,7 @@ export function ListDataComponent({ trace }: SystemDetailProps): React.ReactNode const [path, qs] = pathAndQuery(trace); return ( (trace, 'requestDetailComponent'); return Component ? ( <> @@ -55,7 +55,7 @@ export function SystemRequestDetailsComponent({ trace }: SystemDetailProps): Rea ) : null; } -export function SystemResponseDetailsComponent({ trace }: SystemDetailProps): React.ReactNode { +export function ResponseDetailsComponent({ trace }: SystemDetailProps): React.ReactNode { const Component = callOrFallback(trace, 'responseDetailComponent'); return Component ? ( <> diff --git a/packages/webui/src/systems/systems.test.tsx b/packages/webui/src/systems/systems.test.tsx index 9090eeb..e51e28c 100644 --- a/packages/webui/src/systems/systems.test.tsx +++ b/packages/webui/src/systems/systems.test.tsx @@ -8,9 +8,9 @@ import { Trace } from '@/types'; import { ListDataComponent, - SystemRequestDetailsComponent, - SystemResponseDetailsComponent, - getIconPath, + RequestDetailsComponent, + ResponseDetailsComponent, + getIconUri, getRequestBody, getResponseBody, } from '.'; @@ -54,8 +54,8 @@ describe('Systems', () => { } as Trace; it('should return correct value for `getSystemIconPath`', () => { - const result = getIconPath(trace); - expect(result).toEqual('foo_foo_id.jpg'); + const result = getIconUri(trace); + expect(result).toEqual('foo_foo_id_base64'); }); it('should return correct value for `getRequestBody`', () => { @@ -71,17 +71,17 @@ describe('Systems', () => { it('should return correct data in the `ListDataComponent`', () => { const component = ListDataComponent({ trace }); const { container } = render(component as ReactElement); - expect(container).toHaveTextContent('foo_foo_id.jpg | www.foo.com | /foo | Foo data: foo_id'); + expect(container).toHaveTextContent('foo_foo_id_base64 | www.foo.com | /foo | Foo data: foo_id'); }); it('should return correct `SystemRequestDetailsComponent`', () => { - const component = SystemRequestDetailsComponent({ trace }); + const component = RequestDetailsComponent({ trace }); const { container } = render(component as ReactElement); expect(container).toHaveTextContent('SystemRequestDetailsComponent: Foo foo_id'); }); it('should return correct `SystemResponseDetailsComponent`', () => { - const component = SystemResponseDetailsComponent({ trace }); + const component = ResponseDetailsComponent({ trace }); const { container } = render(component as ReactElement); expect(container).toHaveTextContent('SystemResponseDetailsComponent: Foo foo_id'); }); @@ -101,9 +101,9 @@ describe('Systems', () => { }, } as Trace; - it('should return correct value for `getSystemIconPath`', () => { - const result = getIconPath(trace); - expect(result).toEqual('bar_bar_id.jpg'); + it('should return correct value for `getIconUri`', () => { + const result = getIconUri(trace); + expect(result).toEqual('bar_bar_id_base64'); }); it('should return correct value for `getRequestBody`', () => { @@ -119,17 +119,17 @@ describe('Systems', () => { it('should return correct data in the `ListDataComponent`', () => { const component = ListDataComponent({ trace }); const { container } = render(component as ReactElement); - expect(container).toHaveTextContent('bar_bar_id.jpg | www.bar.com | /bar | Bar data: bar_id'); + expect(container).toHaveTextContent('bar_bar_id_base64 | www.bar.com | /bar | Bar data: bar_id'); }); it('should return correct `SystemRequestDetailsComponent`', () => { - const component = SystemRequestDetailsComponent({ trace }); + const component = RequestDetailsComponent({ trace }); const { container } = render(component as ReactElement); expect(container).toHaveTextContent('SystemRequestDetailsComponent: Bar bar_id'); }); it('should return correct `SystemResponseDetailsComponent`', () => { - const component = SystemResponseDetailsComponent({ trace }); + const component = ResponseDetailsComponent({ trace }); const { container } = render(component as ReactElement); expect(container).toHaveTextContent('SystemResponseDetailsComponent: Bar bar_id'); }); @@ -150,8 +150,8 @@ describe('Systems', () => { } as Trace; it('should return correct value for `getSystemIconPath`', () => { - const result = getIconPath(trace); - expect(result).toEqual('default.jpg'); + const result = getIconUri(trace); + expect(result).toEqual('default_base64'); }); it('should return correct value for `getRequestBody`', () => { @@ -167,16 +167,16 @@ describe('Systems', () => { it('should return correct data in the `ListDataComponent`', () => { const component = ListDataComponent({ trace }); const { container } = render(component as ReactElement); - expect(container).toHaveTextContent('default.jpg | www.fallback.com | /fallback | query=fallback'); + expect(container).toHaveTextContent('default_base64 | www.fallback.com | /fallback | query=fallback'); }); it('should return correct `SystemRequestDetailsComponent`', () => { - const component = SystemRequestDetailsComponent({ trace }); + const component = RequestDetailsComponent({ trace }); expect(component).toBeNull(); }); it('should return correct `SystemResponseDetailsComponent`', () => { - const component = SystemResponseDetailsComponent({ trace }); + const component = ResponseDetailsComponent({ trace }); expect(component).toBeNull(); }); }); @@ -196,8 +196,8 @@ describe('Systems', () => { } as Trace; it('should return correct value for `getSystemIconPath`', () => { - const result = getIconPath(trace); - expect(result).toEqual('default.jpg'); + const result = getIconUri(trace); + expect(result).toEqual('default_base64'); }); it('should return correct value for `getRequestBody`', () => { @@ -213,16 +213,16 @@ describe('Systems', () => { it('should return correct data in the `ListDataComponent`', () => { const component = ListDataComponent({ trace }); const { container } = render(component as ReactElement); - expect(container).toHaveTextContent('default.jpg | www.other.com | /other | query=other'); + expect(container).toHaveTextContent('default_base64 | www.other.com | /other | query=other'); }); it('should return correct `SystemRequestDetailsComponent`', () => { - const component = SystemRequestDetailsComponent({ trace }); + const component = RequestDetailsComponent({ trace }); expect(component).toBeNull(); }); it('should return correct `SystemResponseDetailsComponent`', () => { - const component = SystemResponseDetailsComponent({ trace }); + const component = ResponseDetailsComponent({ trace }); expect(component).toBeNull(); }); }); diff --git a/packages/webui/src/testing/mockSystems.ts b/packages/webui/src/testing/mockSystems.ts index e487bcd..1db5b1d 100644 --- a/packages/webui/src/testing/mockSystems.ts +++ b/packages/webui/src/testing/mockSystems.ts @@ -11,8 +11,8 @@ const mockSystems: System[] = [ isMatch(trace: Trace) { return trace.http?.host === 'www.foo.com'; } - getIconPath(trace: Trace | null) { - return `foo_${trace?.id}.jpg`; + getIconUri(trace: Trace | null) { + return `foo_${trace?.id}_base64`; } getData(trace: Trace) { return { @@ -43,8 +43,8 @@ const mockSystems: System[] = [ isMatch(trace: Trace) { return trace.http?.host === 'www.bar.com'; } - getIconPath(trace: Trace | null) { - return `bar_${trace?.id}.jpg`; + getIconUri(trace: Trace | null) { + return `bar_${trace?.id}_base64`; } getData(trace: Trace) { return { @@ -75,7 +75,7 @@ const mockSystems: System[] = [ isMatch(trace: Trace) { return trace.http?.host === 'www.fallback.com'; } - getIconPath() { + getIconUri() { return null; } getData() { @@ -110,8 +110,8 @@ const mockDefaultSystem = new (class implements System { isMatch() { return true; } - getIconPath() { - return 'default.jpg'; + getIconUri() { + return 'default_base64'; } getData() { return null; diff --git a/packages/webui/src/types/index.ts b/packages/webui/src/types/index.ts index 1e5a8f4..68dd1aa 100644 --- a/packages/webui/src/types/index.ts +++ b/packages/webui/src/types/index.ts @@ -10,7 +10,7 @@ export type TraceRowData = { export interface System { name: string; isMatch(trace: Trace): boolean; - getIconPath?(trace: Trace | null): string | null; + getIconUri?(trace: Trace | null): string | null; getData?(trace: Trace): T; getTraceRowData?(trace: Trace): TraceRowData | null; requestDetailComponent?(trace: Trace): React.ReactNode; diff --git a/packages/webui/tsconfig.types.json b/packages/webui/tsconfig.types.json new file mode 100644 index 0000000..a4032d3 --- /dev/null +++ b/packages/webui/tsconfig.types.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "declaration": true, + "downlevelIteration": true, + "emitDeclarationOnly": true, + "esModuleInterop": true, + "module": "ES2022", + "moduleResolution": "node", + "jsx": "react-jsx", + "outDir": "dist", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src/integration.tsx", "src/types/css.d.ts"] +} diff --git a/yarn.lock b/yarn.lock index f12711f..64cd53b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -759,111 +759,221 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== +"@esbuild/android-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz#91a3b1b4a68c01ffdd5d8ffffb0a83178a366ae0" + integrity sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw== + "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== +"@esbuild/android-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.3.tgz#08bd09f2ebc312422f4e94ae954821f9cf37b39e" + integrity sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA== + "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== +"@esbuild/android-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.3.tgz#b1dffec99ed5505fc57561e8758b449dba4924fe" + integrity sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ== + "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== +"@esbuild/darwin-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz#2e0db5ad26313c7f420f2cd76d9d263fc49cb549" + integrity sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw== + "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== +"@esbuild/darwin-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz#ebe99f35049180023bb37999bddbe306b076a484" + integrity sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw== + "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== +"@esbuild/freebsd-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz#cf8b58ba5173440ea6124a3d0278bfe4ce181c20" + integrity sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg== + "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== +"@esbuild/freebsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz#3f283099810ef1b8468cd1a9400c042e3f12e2a7" + integrity sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA== + "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== +"@esbuild/linux-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz#a8b3aa69653ac504a51aa73739fb06de3a04d1ff" + integrity sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ== + "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== +"@esbuild/linux-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz#ff6a2f68d4fc3ab46f614bca667a1a81ed6eea26" + integrity sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ== + "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== +"@esbuild/linux-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz#5813baf70e406304e8931b200e39d0293b488073" + integrity sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA== + "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== +"@esbuild/linux-loong64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz#21110f29b5e31dc865c7253fde8a2003f7e8b6fd" + integrity sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A== + "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== +"@esbuild/linux-mips64el@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz#4530fc416651eadeb1acc27003c00eac769eb8fd" + integrity sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A== + "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== +"@esbuild/linux-ppc64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz#facf910b0d397e391b37b01a1b4f6e363b04e56b" + integrity sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g== + "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== +"@esbuild/linux-riscv64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz#4a67abe97a495430d5867340982f5424a64f2aac" + integrity sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA== + "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== +"@esbuild/linux-s390x@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz#c5fb47474b9f816d81876c119dbccadf671cc5f6" + integrity sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA== + "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== +"@esbuild/linux-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz#f22d659969ab78dc422f1df8d9a79bc1e7b12ee3" + integrity sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ== + "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== +"@esbuild/netbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz#e9b046934996991f46b8c1cadac815aa45f84fd4" + integrity sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw== + "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== +"@esbuild/openbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz#b287ef4841fc1067bbbd9a60549e8f9cf1b7ee3a" + integrity sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q== + "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== +"@esbuild/sunos-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz#b2b8ba7d27907c7245f6e57dc62f3b88693f84b0" + integrity sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw== + "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== +"@esbuild/win32-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz#1974c8c180c9add4962235662c569fcc4c8f43dd" + integrity sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A== + "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== +"@esbuild/win32-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz#b02cc2dd8b6aed042069680f01f45fdfd3de5bc4" + integrity sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q== + "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/win32-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz#e5036be529f757e58d9a7771f2f1b14782986a74" + integrity sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -4495,6 +4605,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild-plugin-inline-import@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esbuild-plugin-inline-import/-/esbuild-plugin-inline-import-1.0.1.tgz#6f1c73a4a6606d74861e6e5342485e6b32917249" + integrity sha512-QcBbsf7nJnD1GW2SOxgE0lLJ2GgqhGZCoPujxFaWatooNXpYwDCYuOadThKPLWcB9Sx6a7i3GU7RNBEB1dcYOQ== + esbuild@^0.18.10: version "0.18.20" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" @@ -4523,6 +4638,34 @@ esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +esbuild@^0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.3.tgz#d9268cd23358eef9d76146f184e0c55ff8da7bb6" + integrity sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw== + optionalDependencies: + "@esbuild/android-arm" "0.19.3" + "@esbuild/android-arm64" "0.19.3" + "@esbuild/android-x64" "0.19.3" + "@esbuild/darwin-arm64" "0.19.3" + "@esbuild/darwin-x64" "0.19.3" + "@esbuild/freebsd-arm64" "0.19.3" + "@esbuild/freebsd-x64" "0.19.3" + "@esbuild/linux-arm" "0.19.3" + "@esbuild/linux-arm64" "0.19.3" + "@esbuild/linux-ia32" "0.19.3" + "@esbuild/linux-loong64" "0.19.3" + "@esbuild/linux-mips64el" "0.19.3" + "@esbuild/linux-ppc64" "0.19.3" + "@esbuild/linux-riscv64" "0.19.3" + "@esbuild/linux-s390x" "0.19.3" + "@esbuild/linux-x64" "0.19.3" + "@esbuild/netbsd-x64" "0.19.3" + "@esbuild/openbsd-x64" "0.19.3" + "@esbuild/sunos-x64" "0.19.3" + "@esbuild/win32-arm64" "0.19.3" + "@esbuild/win32-ia32" "0.19.3" + "@esbuild/win32-x64" "0.19.3" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"