From 1de23b11ab8f42b75d4ad89c8736a536260dfe58 Mon Sep 17 00:00:00 2001 From: Samuel Imolorhe Date: Sat, 13 Apr 2024 22:59:11 +0200 Subject: [PATCH 1/3] Refactored request script evaluator engine Added iframe script evaluator --- .github/workflows/pr-master.yml | 5 + packages/altair-api-utils/src/config.ts | 8 +- .../post-request-editor.component.ts | 2 +- .../pre-request-editor.component.ts | 2 +- .../components/x-input/x-input.component.ts | 6 +- .../modules/altair/effects/query.effect.ts | 2 +- .../environment/environment.service.ts | 28 +- .../altair/services/gql/gql.service.ts | 23 +- .../pre-request/evaluator-client.factory.ts | 105 +++++++ .../altair/services/pre-request/evaluator.ts | 110 ------- .../services/pre-request/evaluator.worker.ts | 127 ++------ .../altair/services/pre-request/events.ts | 38 --- .../pre-request/pre-request.service.ts | 13 +- .../altair/services/query/query.service.ts | 8 +- packages/altair-core/package.json | 1 + packages/altair-core/src/origins.ts | 9 + .../src/script/context.ts} | 89 +----- packages/altair-core/src/script/errors.ts | 10 + .../src/script/evaluator-client-engine.ts | 95 ++++++ .../src/script/evaluator-engine.ts | 1 + .../src/script/evaluator-worker-engine.ts | 115 +++++++ packages/altair-core/src/script/events.ts | 8 + packages/altair-core/src/script/types.ts | 161 ++++++++++ .../types/state/environments.interfaces.ts | 4 + packages/altair-core/src/utils/logger.ts | 10 +- .../altair-electron-settings/package.json | 2 +- packages/altair-iframe-sandbox/.gitignore | 24 ++ packages/altair-iframe-sandbox/index.html | 13 + packages/altair-iframe-sandbox/package.json | 18 ++ .../altair-iframe-sandbox/public/vite.svg | 1 + .../src/evaluator.frame.ts | 40 +++ packages/altair-iframe-sandbox/src/main.ts | 5 + packages/altair-iframe-sandbox/src/style.css | 96 ++++++ .../altair-iframe-sandbox/src/vite-env.d.ts | 1 + packages/altair-iframe-sandbox/tsconfig.json | 23 ++ packages/login-redirect/package.json | 7 +- packages/login-redirect/src/script.ts | 11 +- yarn.lock | 282 ++++++++++++++++-- 38 files changed, 1087 insertions(+), 416 deletions(-) create mode 100644 packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts delete mode 100644 packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts delete mode 100644 packages/altair-app/src/app/modules/altair/services/pre-request/events.ts create mode 100644 packages/altair-core/src/origins.ts rename packages/{altair-app/src/app/modules/altair/services/pre-request/helpers.ts => altair-core/src/script/context.ts} (51%) create mode 100644 packages/altair-core/src/script/errors.ts create mode 100644 packages/altair-core/src/script/evaluator-client-engine.ts create mode 100644 packages/altair-core/src/script/evaluator-engine.ts create mode 100644 packages/altair-core/src/script/evaluator-worker-engine.ts create mode 100644 packages/altair-core/src/script/events.ts create mode 100644 packages/altair-core/src/script/types.ts create mode 100644 packages/altair-iframe-sandbox/.gitignore create mode 100644 packages/altair-iframe-sandbox/index.html create mode 100644 packages/altair-iframe-sandbox/package.json create mode 100644 packages/altair-iframe-sandbox/public/vite.svg create mode 100644 packages/altair-iframe-sandbox/src/evaluator.frame.ts create mode 100644 packages/altair-iframe-sandbox/src/main.ts create mode 100644 packages/altair-iframe-sandbox/src/style.css create mode 100644 packages/altair-iframe-sandbox/src/vite-env.d.ts create mode 100644 packages/altair-iframe-sandbox/tsconfig.json diff --git a/.github/workflows/pr-master.yml b/.github/workflows/pr-master.yml index 803c4fb133..729a037269 100644 --- a/.github/workflows/pr-master.yml +++ b/.github/workflows/pr-master.yml @@ -38,6 +38,11 @@ jobs: export CLOUDFLARE_ACCOUNT_ID="${{ secrets.CLOUDFLARE_ACCOUNT_ID }}" cd packages/login-redirect npx wrangler@2 pages publish "dist" --project-name="altair-login-redirect" + - run: | + export CLOUDFLARE_API_TOKEN="${{ secrets.CLOUDFLARE_API_TOKEN }}" + export CLOUDFLARE_ACCOUNT_ID="${{ secrets.CLOUDFLARE_ACCOUNT_ID }}" + cd packages/altair-iframe-sandbox + npx wrangler@2 pages publish "dist" --project-name="altair-iframe-sandbox" test: strategy: matrix: diff --git a/packages/altair-api-utils/src/config.ts b/packages/altair-api-utils/src/config.ts index 2bf3c415c5..c10e01d7ce 100644 --- a/packages/altair-api-utils/src/config.ts +++ b/packages/altair-api-utils/src/config.ts @@ -2,6 +2,7 @@ export type ClientEnvironment = 'development' | 'production' | 'testing'; export interface APIClientOptions { apiBaseUrl: string; loginClientUrl: string; + sandboxUrl: string; } export const getClientConfig = ( env: ClientEnvironment = 'development' @@ -10,16 +11,19 @@ export const getClientConfig = ( case 'production': return { apiBaseUrl: - process.env.ALTAIR_API_CLIENT_BASE_URL ?? - 'https://api.altairgraphql.dev', + process.env.ALTAIR_API_CLIENT_BASE_URL ?? 'https://api.altairgraphql.dev', loginClientUrl: process.env.ALTAIR_API_CLIENT_LOGIN_CLIENT_URL ?? 'https://redir.altairgraphql.dev', + sandboxUrl: + process.env.ALTAIR_API_CLIENT_SANDBOX_URL ?? + 'https://sandbox.altairgraphql.dev', }; } return { apiBaseUrl: 'http://localhost:3000', loginClientUrl: 'http://localhost:1234', + sandboxUrl: 'http://localhost:5123', }; }; diff --git a/packages/altair-app/src/app/modules/altair/components/post-request-editor/post-request-editor.component.ts b/packages/altair-app/src/app/modules/altair/components/post-request-editor/post-request-editor.component.ts index f2b2412646..3746486500 100644 --- a/packages/altair-app/src/app/modules/altair/components/post-request-editor/post-request-editor.component.ts +++ b/packages/altair-app/src/app/modules/altair/components/post-request-editor/post-request-editor.component.ts @@ -2,8 +2,8 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { PostrequestState } from 'altair-graphql-core/build/types/state/postrequest.interfaces'; import { PreRequestService } from '../../services'; -import { getGlobalContext } from '../../services/pre-request/helpers'; import { getRequestScriptExtensions } from '../../utils/editor/extensions'; +import { getGlobalContext } from 'altair-graphql-core/build/script/context'; const AUTOCOMPLETE_CHARS = /^[a-zA-Z0-9_]$/; diff --git a/packages/altair-app/src/app/modules/altair/components/pre-request-editor/pre-request-editor.component.ts b/packages/altair-app/src/app/modules/altair/components/pre-request-editor/pre-request-editor.component.ts index 41f08d99f9..525bdeed0c 100644 --- a/packages/altair-app/src/app/modules/altair/components/pre-request-editor/pre-request-editor.component.ts +++ b/packages/altair-app/src/app/modules/altair/components/pre-request-editor/pre-request-editor.component.ts @@ -3,7 +3,7 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { PrerequestState } from 'altair-graphql-core/build/types/state/prerequest.interfaces'; import { getRequestScriptExtensions } from '../../utils/editor/extensions'; import { PreRequestService } from '../../services'; -import { getGlobalContext } from '../../services/pre-request/helpers'; +import { getGlobalContext } from 'altair-graphql-core/build/script/context'; const AUTOCOMPLETE_CHARS = /^[a-zA-Z0-9_]$/; diff --git a/packages/altair-app/src/app/modules/altair/components/x-input/x-input.component.ts b/packages/altair-app/src/app/modules/altair/components/x-input/x-input.component.ts index f6c6f3654c..917c83d1c6 100644 --- a/packages/altair-app/src/app/modules/altair/components/x-input/x-input.component.ts +++ b/packages/altair-app/src/app/modules/altair/components/x-input/x-input.component.ts @@ -28,10 +28,8 @@ import { import { Store } from '@ngrx/store'; import { RootState } from 'altair-graphql-core/build/types/state/state.interfaces'; import { Subscription } from 'rxjs'; -import { - EnvironmentService, - IEnvironment, -} from '../../services/environment/environment.service'; +import { EnvironmentService } from '../../services/environment/environment.service'; +import { IEnvironment } from 'altair-graphql-core/build/types/state/environments.interfaces'; const VariableRegex = /{{\s*([\w.]+)\s*}}/g; diff --git a/packages/altair-app/src/app/modules/altair/effects/query.effect.ts b/packages/altair-app/src/app/modules/altair/effects/query.effect.ts index 4289217f6e..e18e2db5da 100644 --- a/packages/altair-app/src/app/modules/altair/effects/query.effect.ts +++ b/packages/altair-app/src/app/modules/altair/effects/query.effect.ts @@ -55,8 +55,8 @@ import { WEBSOCKET_PROVIDER_ID } from 'altair-graphql-core/build/subscriptions'; import { SubscriptionProvider } from 'altair-graphql-core/build/subscriptions/subscription-provider'; import { RequestScriptError } from '../services/pre-request/errors'; import { headerListToMap } from '../utils/headers'; -import { RequestType } from '../services/pre-request/helpers'; import { BATCHED_REQUESTS_OPERATION } from '../services/gql/gql.service'; +import { RequestType } from 'altair-graphql-core/build/script/types'; function notNullOrUndefined(x: T | null | undefined): x is T { return x !== null && x !== undefined; diff --git a/packages/altair-app/src/app/modules/altair/services/environment/environment.service.ts b/packages/altair-app/src/app/modules/altair/services/environment/environment.service.ts index 53fb5a4642..b818a13670 100644 --- a/packages/altair-app/src/app/modules/altair/services/environment/environment.service.ts +++ b/packages/altair-app/src/app/modules/altair/services/environment/environment.service.ts @@ -12,6 +12,7 @@ import { EnvironmentState, EnvironmentsState, ExportEnvironmentState, + IEnvironment, } from 'altair-graphql-core/build/types/state/environments.interfaces'; import { RootState } from 'altair-graphql-core/build/types/state/state.interfaces'; import { HeaderState } from 'altair-graphql-core/build/types/state/header.interfaces'; @@ -22,11 +23,8 @@ import { NotifyService } from '../notify/notify.service'; // Unfortunately, Safari doesn't support lookbehind in regex: https://caniuse.com/js-regexp-lookbehind // So have to go with an alternative approach using lookahead instead // export const VARIABLE_REGEX = /(? { - headers?: IDictionary; -} +export const VARIABLE_REGEX = /(^{{\s*[\w.]+\s*}})|((?!\\)(.){{\s*[\w.]+\s*}})/g; + interface HydrateEnvironmentOptions { activeEnvironment?: IEnvironment; } @@ -158,15 +156,13 @@ export class EnvironmentService { const environmentHeadersMap = activeEnvironment.headers; if (environmentHeadersMap) { - const environmentHeaders = Object.keys(environmentHeadersMap).map( - (key) => { - return { - key: this.hydrate(key, options), - value: this.hydrate(environmentHeadersMap[key] || '', options), - enabled: true, - }; - } - ); + const environmentHeaders = Object.keys(environmentHeadersMap).map((key) => { + return { + key: this.hydrate(key, options), + value: this.hydrate(environmentHeadersMap[key] || '', options), + enabled: true, + }; + }); return [...environmentHeaders, ...hydratedHeaders]; } @@ -201,9 +197,7 @@ export class EnvironmentService { ); } - getExportEnvironmentData( - environment: EnvironmentState - ): ExportEnvironmentState { + getExportEnvironmentData(environment: EnvironmentState): ExportEnvironmentState { const exportCollectionData: ExportEnvironmentState = { version: 1, type: 'environment', diff --git a/packages/altair-app/src/app/modules/altair/services/gql/gql.service.ts b/packages/altair-app/src/app/modules/altair/services/gql/gql.service.ts index 3ff0a2d263..0fb758bb50 100644 --- a/packages/altair-app/src/app/modules/altair/services/gql/gql.service.ts +++ b/packages/altair-app/src/app/modules/altair/services/gql/gql.service.ts @@ -51,6 +51,7 @@ import { prettify } from './prettifier'; import { Position } from '../../utils/editor/helpers'; import { ElectronAppService } from '../electron-app/electron-app.service'; import { ELECTRON_ALLOWED_FORBIDDEN_HEADERS } from '@altairgraphql/electron-interop/build/constants'; +import { SendRequestResponse } from 'altair-graphql-core/build/script/types'; interface SendRequestOptions { url: string; @@ -66,16 +67,6 @@ interface SendRequestOptions { export const BATCHED_REQUESTS_OPERATION = 'BatchedRequests'; -export interface SendRequestResponse { - response: HttpResponse; - meta: { - requestStartTime: number; - requestEndTime: number; - responseTime: number; - headers: IDictionary; - }; -} - interface ResolvedFileVariable { name: string; data: File; @@ -150,9 +141,7 @@ export class GqlService { headers.forEach((header) => { if ( - !ELECTRON_ALLOWED_FORBIDDEN_HEADERS.includes( - header.key.toLowerCase() - ) && + !ELECTRON_ALLOWED_FORBIDDEN_HEADERS.includes(header.key.toLowerCase()) && header.enabled && header.key && header.value @@ -219,9 +208,7 @@ export class GqlService { ); } - getIntrospectionSchema( - introspection?: IntrospectionQuery - ): GraphQLSchema | null { + getIntrospectionSchema(introspection?: IntrospectionQuery): GraphQLSchema | null { if (!introspection?.__schema) { return null; } @@ -340,9 +327,7 @@ export class GqlService { getOperationAtIndex(query: string, index: number) { return this.getOperations(query).find((operation) => { return Boolean( - operation.loc && - operation.loc.start <= index && - operation.loc.end >= index + operation.loc && operation.loc.start <= index && operation.loc.end >= index ); }); } diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts new file mode 100644 index 0000000000..ec405ba85d --- /dev/null +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts @@ -0,0 +1,105 @@ +import { + ScriptEvaluatorClient, + ScriptEvaluatorClientFactory, + ScriptEvent, + ScriptEventData, +} from 'altair-graphql-core/build/script/types'; +import { getClientConfig } from '@altairgraphql/api-utils'; +import { debug } from '../../utils/logger'; +import { environment } from 'environments/environment'; + +export class EvaluatorWorkerClient extends ScriptEvaluatorClient { + private worker = new Worker(new URL('./evaluator.worker', import.meta.url), { + type: 'module', + }); + subscribe( + type: T, + handler: (k: T, e: ScriptEventData) => void + ) { + this.worker.addEventListener( + 'message', + (e: MessageEvent>) => { + const event = e.data; + + // Handle script events + if (event.type === type) { + debug.log(event.type, event); + handler(type, event); + } + } + ); + } + send(type: string, payload: any): void { + this.worker.postMessage({ + type, + payload, + }); + } + onError(handler: (err: any) => void): void { + this.worker.addEventListener('error', handler); + } + destroy(): void { + this.worker.terminate(); + } +} + +export class EvaluatorFrameClient extends ScriptEvaluatorClient { + private config = getClientConfig( + environment.production ? 'production' : 'development' + ); + private iframe = this.createIframe(); + + createIframe() { + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + const sandboxUrl = new URL(this.config.sandboxUrl); + sandboxUrl.searchParams.set('sc', window.location.origin); + sandboxUrl.searchParams.set('action', 'evaluator'); + iframe.src = sandboxUrl.toString(); + + iframe.sandbox.add('allow-scripts'); + iframe.sandbox.add('allow-same-origin'); + iframe.referrerPolicy = 'no-referrer'; + document.body.appendChild(iframe); + return iframe; + } + subscribe( + type: T, + handler: (type: T, e: ScriptEventData) => void + ): void { + window.addEventListener('message', (e: MessageEvent>) => { + if (e.origin !== new URL(this.config.sandboxUrl).origin) { + return; + } + const event = e.data; + + // Handle script events + if (event.type === type) { + debug.log(event.type, event); + handler(type, event); + } + }); + } + send(type: string, payload: any): void { + this.iframe.addEventListener('load', () => { + this.iframe.contentWindow?.postMessage( + { type, payload }, + this.config.sandboxUrl + ); + }); + } + onError(handler: (err: any) => void): void { + this.iframe.addEventListener('error', handler); + } + destroy(): void { + this.iframe.remove(); + } +} +export class EvaluatorClientFactory implements ScriptEvaluatorClientFactory { + create() { + if (document.baseURI && new URL(document.baseURI).origin === window.origin) { + return new EvaluatorWorkerClient(); + } + return new EvaluatorFrameClient(); + } +} diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts deleted file mode 100644 index b8c19983de..0000000000 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { debug } from '../../utils/logger'; -import { ScriptEvaluatorWorkerFactory } from './evaluator-worker.factory'; -import { - AllScriptEventHandlers, - getErrorEvent, - getResponseEvent, - ScriptEvent, - ScriptEventData, - ScriptEventHandlers, - SCRIPT_INIT_EXECUTE, -} from './events'; -import { ScriptContextData, ScriptTranformResult } from './helpers'; - -export class ScriptEvaluator { - timeout = 1000 * 60 * 5; // 5 minutes - private worker?: Worker; - - private async getWorker() { - if (!this.worker) { - this.worker = await new ScriptEvaluatorWorkerFactory().create(); - } - return this.worker; - } - - async executeScript( - script: string, - data: ScriptContextData, - userAvailableHandlers: ScriptEventHandlers - ): Promise { - try { - const worker = await this.getWorker(); - const result = await new Promise((resolve, reject) => { - // Handle timeout - const handle = setTimeout(() => { - this.killWorker(); - reject(new Error('script timeout')); - }, this.timeout); - - const allHandlers: AllScriptEventHandlers = { - ...userAvailableHandlers, - executeComplete: (data: ScriptContextData) => { - clearTimeout(handle); - resolve({ - environment: data.environment, - requestScriptLogs: data.requestScriptLogs || [], - additionalHeaders: [], - }); - }, - scriptError: (err: Error) => { - clearTimeout(handle); - reject(err); - }, - } as const; - - // loop over all the script event handlers and create a listener for each - // TODO: fn is of any type here. Figure out the typing - Object.entries(allHandlers).forEach(([key, fn]) => { - worker.addEventListener( - 'message', - (e: MessageEvent>) => { - const event = e.data; - - // Handle script events - if (event.type === key) { - debug.log(event.type, event); - // TODO: handle cancelling requests - const { id, args } = event.payload; - (async () => { - try { - const res = await fn(...args); - worker.postMessage({ - type: getResponseEvent(key), - payload: { id, response: res }, - }); - } catch (err) { - worker.postMessage({ - type: getErrorEvent(key), - payload: { - id, - error: `${(err as any).message ?? err}`, - }, - }); - } - })(); - } - } - ); - }); - - worker.onerror = (e) => { - clearTimeout(handle); - reject(e); - }; - worker.postMessage({ - type: SCRIPT_INIT_EXECUTE, - payload: [script, data], - }); - }); - - return result; - } finally { - this.killWorker(); - } - } - - private killWorker() { - this.worker?.terminate(); - this.worker = undefined; - } -} diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts index 3b7db82ff0..c4e35d9652 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts @@ -1,114 +1,29 @@ -import { v4 as uuid } from 'uuid'; -import { ScriptEvaluator } from './evaluator'; import { - AllScriptEventHandlers, - ScriptEvent, - ScriptEventParameters, - SCRIPT_INIT_EXECUTE, -} from './events'; -import { getGlobalContext, ScriptContextData } from './helpers'; - -onmessage = async (e) => { - switch (e.data.type) { - case SCRIPT_INIT_EXECUTE: - try { - await initExecute(e.data.payload); - } catch (err) { - makeCall('scriptError', err as Error); + ScriptEvaluatorWorker, + ScriptWorkerMessageData, +} from 'altair-graphql-core/build/script/types'; +import { ScriptEvaluatorWorkerEngine } from 'altair-graphql-core/build/script/evaluator-worker-engine'; +import { validOrigins } from 'altair-graphql-core/build/origins'; + +class EvaluatorWebWorker extends ScriptEvaluatorWorker { + onMessage(handler: (e: ScriptWorkerMessageData) => void): void { + self.addEventListener('message', (e) => { + if (e.origin && !validOrigins.includes(e.origin)) { + return; } - break; + handler(e.data); + }); } -}; - -const workerHandlerNames = [ - 'setCookie', - 'request', - 'getStorageItem', - 'setStorageItem', -] as const; -export type WorkerHandlerNames = (typeof workerHandlerNames)[number]; - -const initExecute = async ( - payload: Parameters -) => { - const [script, data] = payload; - const res = await new Promise((resolve, reject) => { + send(type: string, payload: any): void { + self.postMessage({ type, payload }); + } + onError(handler: (err: any) => void): void { + self.addEventListener('error', handler); self.addEventListener('unhandledrejection', (e) => { e.preventDefault(); - return reject(e.reason); + handler(e.reason); }); - - const clonedMutableData: ScriptContextData = JSON.parse(JSON.stringify(data)); - - // build handlers - const handlers = workerHandlerNames.reduce( - ( - acc: Pick, - key: T - ) => { - acc[key] = ((...args: ScriptEventParameters) => { - return makeCall(key, ...args); - }) as unknown as AllScriptEventHandlers[T]; // TODO: Look into this typing issue. - return acc; - }, - {} as Pick - ); - - const context = { - altair: getGlobalContext(clonedMutableData, handlers), - alert, - }; - - const contextEntries = Object.entries(context); - try { - const res = function () { - return eval(` - (async(${contextEntries.map((e) => e[0]).join(',')}) => { - ${script}; - return altair.data; - })(...this.__ctxE.map(e => e[1])); - `); - }.call({ __ctxE: contextEntries }); - return resolve(res); - } catch (e) { - return reject(e); - } - }); - - if (res.__toSetActiveEnvironment) { - // update active environment - makeCall('updateActiveEnvironment', res.__toSetActiveEnvironment); } - makeCall('executeComplete', res); -}; +} -const alert = (msg: string) => makeCall('alert', msg); - -const makeCall = ( - type: T, - ...args: Parameters -) => { - return new Promise>((resolve, reject) => { - const id = uuid(); - const event = { - type, - payload: { id, args }, - }; - // TODO: cleanup listener - addEventListener('message', (e) => { - switch (e.data.type) { - case `${type}_response`: - if (e.data.payload.id !== id) { - return; - } - return resolve(e.data.payload.response); - case `${type}_error`: - if (e.data.payload.id !== id) { - return; - } - return reject(e.data.payload.error); - } - }); - self.postMessage(event); - }); -}; +new ScriptEvaluatorWorkerEngine(new EvaluatorWebWorker()).start(); diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/events.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/events.ts deleted file mode 100644 index 52db0b77fa..0000000000 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/events.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CookieOptions, ScriptContextData } from './helpers'; - -export const SCRIPT_INIT_EXECUTE = 'init_execute'; - -export const getResponseEvent = (type: string) => `${type}_response`; -export const getErrorEvent = (type: string) => `${type}_error`; - -export interface ScriptEventHandlers { - alert: (msg: string) => Promise; - log: (d: unknown) => Promise; - request: (arg1: any, arg2: any, arg3: any) => Promise; - setCookie: ( - key: string, - value: string, - options?: CookieOptions - ) => Promise; - getStorageItem: (key: string) => Promise; - setStorageItem: (key: string, value: unknown) => Promise; - updateActiveEnvironment: (environmentData: Record) => Promise; -} - -// Extended event handler interface to include internal native events like scriptError as well -export interface AllScriptEventHandlers extends ScriptEventHandlers { - executeComplete: (data: ScriptContextData) => void; - scriptError: (err: Error) => void; -} - -export type ScriptEvent = keyof AllScriptEventHandlers; -export type ScriptEventParameters = Parameters< - AllScriptEventHandlers[T] ->; -export interface ScriptEventDataPayload { - id: string; - args: ScriptEventParameters; -} -export type ScriptEventData = T extends ScriptEvent - ? { type: T; payload: ScriptEventDataPayload } - : never; diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts index ff3cde88f7..1674b43bcc 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts @@ -9,15 +9,16 @@ import { getActiveSubEnvironmentState } from '../../store/environments/selectors import { NotifyService } from '../notify/notify.service'; import { take } from 'rxjs/operators'; import { RootState } from 'altair-graphql-core/build/types/state/state.interfaces'; -import { RequestScriptError } from './errors'; import { CookieOptions, - getGlobalContext, ScriptContextData, ScriptTranformResult, -} from './helpers'; -import { ScriptEvaluator } from './evaluator'; +} from 'altair-graphql-core/build/script/types'; +import { RequestScriptError } from './errors'; import { DbService } from '../db.service'; +import { ScriptEvaluatorClientEngine } from 'altair-graphql-core/build/script/evaluator-client-engine'; +import { getGlobalContext } from 'altair-graphql-core/build/script/context'; +import { EvaluatorClientFactory } from './evaluator-client.factory'; const storageNamespace = 'request-script'; @@ -71,7 +72,9 @@ export class PreRequestService { ); data.__cookieJar = cookies; - const res = await new ScriptEvaluator().executeScript(script, data, { + const res = await new ScriptEvaluatorClientEngine( + new EvaluatorClientFactory() + ).executeScript(script, data, { alert: async (msg: string) => this.notifyService.info(`Alert: ${msg}`, 'Request script'), log: async (d: unknown) => { diff --git a/packages/altair-app/src/app/modules/altair/services/query/query.service.ts b/packages/altair-app/src/app/modules/altair/services/query/query.service.ts index dc1d170cda..d8c569dfb8 100644 --- a/packages/altair-app/src/app/modules/altair/services/query/query.service.ts +++ b/packages/altair-app/src/app/modules/altair/services/query/query.service.ts @@ -4,14 +4,18 @@ import * as fromRoot from '../../store'; import { RootState } from 'altair-graphql-core/build/types/state/state.interfaces'; import { debug } from '../../utils/logger'; import { EnvironmentService } from '../environment/environment.service'; -import { GqlService, SendRequestResponse } from '../gql/gql.service'; +import { GqlService } from '../gql/gql.service'; import { NotifyService } from '../notify/notify.service'; -import { RequestType, ScriptTranformResult } from '../pre-request/helpers'; import { take } from 'rxjs/operators'; import { QueryCollectionService } from '../query-collection/query-collection.service'; import { PerWindowState } from 'altair-graphql-core/build/types/state/per-window.interfaces'; import { PreRequestService } from '../pre-request/pre-request.service'; import { AUTHORIZATION_MAPPING } from '../../components/authorization/authorizations'; +import { + RequestType, + ScriptTranformResult, + SendRequestResponse, +} from 'altair-graphql-core/build/script/types'; @Injectable({ providedIn: 'root', diff --git a/packages/altair-core/package.json b/packages/altair-core/package.json index 881d40b26c..90d65e41d1 100644 --- a/packages/altair-core/package.json +++ b/packages/altair-core/package.json @@ -26,6 +26,7 @@ "uuid": "9.0.1" }, "devDependencies": { + "@angular/common": "17.0.8", "@jest/globals": "^29.7.0", "@types/actioncable": "^5.2.5", "@types/jest": "^29.5.12", diff --git a/packages/altair-core/src/origins.ts b/packages/altair-core/src/origins.ts new file mode 100644 index 0000000000..566aa2adb0 --- /dev/null +++ b/packages/altair-core/src/origins.ts @@ -0,0 +1,9 @@ +export const validOrigins = [ + 'chrome-extension://flnheeellpciglgpaodhkhmapeljopja', // chrome extension + 'chrome-extension://aiopipphfnlndegenpkclffgaiillbdd', // unpacked chrome extension + 'moz-extension://567d7e27-43b8-994e-ab50-e770fa7eab4b', // firefox extension + 'http://localhost:4200', // local altair app + 'https://dash.altairgraphql.dev', + 'https://altair-gql.sirmuel.design', + 'https://web.altairgraphql.dev', +]; diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/helpers.ts b/packages/altair-core/src/script/context.ts similarity index 51% rename from packages/altair-app/src/app/modules/altair/services/pre-request/helpers.ts rename to packages/altair-core/src/script/context.ts index 6f66948f18..ddd3ac182f 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/helpers.ts +++ b/packages/altair-core/src/script/context.ts @@ -1,81 +1,12 @@ -import type { IDictionary } from 'altair-graphql-core/build/types/shared'; -import type { HeaderState } from 'altair-graphql-core/build/types/state/header.interfaces'; -import type { LogLine } from 'altair-graphql-core/build/types/state/query.interfaces'; -import type { SendRequestResponse } from '../gql/gql.service'; -import { ScriptEventHandlers } from './events'; -import { IEnvironment } from '../environment/environment.service'; - -export enum RequestType { - INTROSPECTION = 'introspection', - QUERY = 'query', - SUBSCRIPTION = 'subscription', -} -export interface ScriptContextHelpers { - getEnvironment: (key: string) => any; - setEnvironment: (key: string, value: any) => void; - getCookie: (key: string) => string; - setCookie: (key: string, value: string) => void; - request: (arg1: any, arg2: any, arg3: any) => Promise; -} -export interface ScriptContextStorage { - get: (key: string) => Promise; - set: (key: string, value: unknown) => Promise; -} - -export interface ScriptContextData { - headers: HeaderState; - variables: string; - operationName: string; - query: string; - environment: IDictionary; - requestScriptLogs?: LogLine[]; - response?: SendRequestResponse; - requestType?: RequestType; - __toSetActiveEnvironment?: IDictionary; - __cookieJar?: IDictionary; -} - -export interface ScriptContextResponse { - requestType: RequestType; - responseTime: number; - statusCode: number; - body: unknown; - headers: IDictionary; -} -export interface GlobalHelperContext { - data: ScriptContextData; - helpers: ScriptContextHelpers; - storage: ScriptContextStorage; - importModule: (moduleName: string) => any; - log: (d: unknown) => void; - response?: ScriptContextResponse; -} - -export interface ScriptTranformResult { - requestScriptLogs: LogLine[]; - additionalHeaders: HeaderState; - environment?: IEnvironment; -} - -export type SameSite = 'Lax' | 'None' | 'Strict'; -export interface CookieOptions { - expires?: number | Date; - path?: string; - domain?: string; - secure?: boolean; - sameSite?: SameSite; -} - -export interface GlobalContextBuilderHandlers { - setCookie: ScriptEventHandlers['setCookie']; - request: ScriptEventHandlers['request']; - getStorageItem: ScriptEventHandlers['getStorageItem']; - setStorageItem: ScriptEventHandlers['setStorageItem']; -} - -export interface ModuleImportsMap { - [name: string]: { exec: () => Promise }; -} +import { + CookieOptions, + GlobalContextBuilderHandlers, + GlobalHelperContext, + ModuleImportsMap, + RequestType, + ScriptContextData, + ScriptContextResponse, +} from './types'; export const ModuleImports: ModuleImportsMap = { atob: { @@ -101,7 +32,7 @@ export const buildContextResponse = ( if (data.response) { return { body: data.response.response.body, - requestType: data.requestType || RequestType.QUERY, + requestType: data.requestType ?? RequestType.QUERY, responseTime: data.response.meta.responseTime, statusCode: data.response.response.status, headers: data.response.meta.headers, diff --git a/packages/altair-core/src/script/errors.ts b/packages/altair-core/src/script/errors.ts new file mode 100644 index 0000000000..3667aa8495 --- /dev/null +++ b/packages/altair-core/src/script/errors.ts @@ -0,0 +1,10 @@ +export class RequestScriptError extends Error { + cause: Error; + + constructor(error: unknown) { + const message = error instanceof Error ? error.message : String(error); + super(message); + this.name = 'RequestScriptError'; + this.cause = error instanceof Error ? error : new Error(String(error)); + } +} diff --git a/packages/altair-core/src/script/evaluator-client-engine.ts b/packages/altair-core/src/script/evaluator-client-engine.ts new file mode 100644 index 0000000000..d50a800301 --- /dev/null +++ b/packages/altair-core/src/script/evaluator-client-engine.ts @@ -0,0 +1,95 @@ +import { SCRIPT_INIT_EXECUTE } from './events'; +import { + AllScriptEventHandlers, + ScriptContextData, + ScriptEvaluatorClient, + ScriptEvaluatorClientFactory, + ScriptEvent, + ScriptEventHandlers, + ScriptTranformResult, +} from './types'; + +const DEFAULT_TIMEOUT = 1000 * 60 * 5; // 5 minutes + +export class ScriptEvaluatorClientEngine { + private client?: ScriptEvaluatorClient; + + constructor( + private engineFactory: ScriptEvaluatorClientFactory, + private timeout = DEFAULT_TIMEOUT + ) {} + + private async getClient() { + const client = this.client ?? this.engineFactory.create(); + this.client = client; + return client; + } + + async executeScript( + script: string, + data: ScriptContextData, + userAvailableHandlers: ScriptEventHandlers + ): Promise { + try { + const engine = await this.getClient(); + const result = await new Promise((resolve, reject) => { + // Handle timeout + const handle = setTimeout(() => { + this.killClient(); + reject(new Error('script timeout')); + }, this.timeout); + + const allHandlers: AllScriptEventHandlers = { + ...userAvailableHandlers, + executeComplete: (data: ScriptContextData) => { + clearTimeout(handle); + resolve({ + environment: data.environment, + requestScriptLogs: data.requestScriptLogs || [], + additionalHeaders: [], + }); + }, + scriptError: (err: Error) => { + clearTimeout(handle); + reject(err); + }, + } as const; + + // loop over all the script event handlers and create a listener for each + // TODO: fn is of any type here. Figure out the typing + Object.entries(allHandlers).forEach(([k, fn]) => { + engine.subscribe(k as ScriptEvent, (key, event) => { + // TODO: handle cancelling requests + const { id, args } = event.payload; + (async () => { + try { + const res = await fn(...args); + engine.sendResponse(key, { id, response: res }); + } catch (err) { + engine.sendError(key, { + id, + error: `${(err as any).message ?? err}`, + }); + } + })(); + }); + }); + + engine.onError((e) => { + clearTimeout(handle); + reject(e); + }); + engine.send(SCRIPT_INIT_EXECUTE, [script, data]); + }); + + return result; + } finally { + this.killClient(); + } + } + + private killClient() { + this.client?.destroy(); + this.client = undefined; + } +} diff --git a/packages/altair-core/src/script/evaluator-engine.ts b/packages/altair-core/src/script/evaluator-engine.ts new file mode 100644 index 0000000000..90869ffe33 --- /dev/null +++ b/packages/altair-core/src/script/evaluator-engine.ts @@ -0,0 +1 @@ +export class EvaluatorEngine {} diff --git a/packages/altair-core/src/script/evaluator-worker-engine.ts b/packages/altair-core/src/script/evaluator-worker-engine.ts new file mode 100644 index 0000000000..54e6fcbd07 --- /dev/null +++ b/packages/altair-core/src/script/evaluator-worker-engine.ts @@ -0,0 +1,115 @@ +import { v4 as uuid } from 'uuid'; +import { ScriptEvaluatorClientEngine } from './evaluator-client-engine'; +import { SCRIPT_INIT_EXECUTE } from './events'; +import { + AllScriptEventHandlers, + ScriptContextData, + ScriptEvaluatorWorker, + ScriptEvent, + ScriptEventParameters, +} from './types'; +import { getGlobalContext } from './context'; + +const workerHandlerNames = [ + 'setCookie', + 'request', + 'getStorageItem', + 'setStorageItem', +] as const; +export type WorkerHandlerNames = (typeof workerHandlerNames)[number]; + +export class ScriptEvaluatorWorkerEngine { + constructor(private worker: ScriptEvaluatorWorker) {} + + start() { + this.worker.onMessage(async (e) => { + switch (e.type) { + case SCRIPT_INIT_EXECUTE: + try { + await this.initExecute(e.payload); + } catch (err) { + await this.makeCall('scriptError', err as Error); + } + break; + } + }); + } + + private async initExecute( + payload: Parameters + ) { + const [script, data] = payload; + const res = await new Promise((resolve, reject) => { + this.worker.onError((err) => { + reject(err); + }); + + const clonedMutableData: ScriptContextData = JSON.parse(JSON.stringify(data)); + + // build handlers + const handlers = workerHandlerNames.reduce( + ( + acc: Pick, + key: T + ) => { + acc[key] = ((...args: ScriptEventParameters) => { + return this.makeCall(key, ...args); + }) as unknown as AllScriptEventHandlers[T]; // TODO: Look into this typing issue. + return acc; + }, + {} as Pick + ); + + const context = { + altair: getGlobalContext(clonedMutableData, handlers), + alert: (msg: string) => this.makeCall('alert', msg), + }; + + const contextEntries = Object.entries(context); + try { + const res = function () { + return eval(` + (async(${contextEntries.map((e) => e[0]).join(',')}) => { + ${script}; + return altair.data; + })(...this.__ctxE.map(e => e[1])); + `); + }.call({ __ctxE: contextEntries }); + return resolve(res); + } catch (e) { + return reject(e); + } + }); + + if (res.__toSetActiveEnvironment) { + // update active environment + this.makeCall('updateActiveEnvironment', res.__toSetActiveEnvironment); + } + this.makeCall('executeComplete', res); + } + + private makeCall( + type: T, + ...args: Parameters + ) { + return new Promise>((resolve, reject) => { + const id = uuid(); + // TODO: cleanup listener + this.worker.onMessage((e) => { + switch (e.type) { + case `${type}_response`: + if (e.payload.id !== id) { + return; + } + return resolve(e.payload.response); + case `${type}_error`: + if (e.payload.id !== id) { + return; + } + return reject(e.payload.error); + } + }); + this.worker.send(type, { id, args }); + }); + } +} diff --git a/packages/altair-core/src/script/events.ts b/packages/altair-core/src/script/events.ts new file mode 100644 index 0000000000..e05bff30f4 --- /dev/null +++ b/packages/altair-core/src/script/events.ts @@ -0,0 +1,8 @@ +import { ScriptEvent, ScriptResponseEvent } from './types'; + +export const SCRIPT_INIT_EXECUTE = 'init_execute'; + +export const getResponseEvent = ( + type: T +): ScriptResponseEvent => `${type}_response`; +export const getErrorEvent = (type: string) => `${type}_error`; diff --git a/packages/altair-core/src/script/types.ts b/packages/altair-core/src/script/types.ts new file mode 100644 index 0000000000..fe647ca3cf --- /dev/null +++ b/packages/altair-core/src/script/types.ts @@ -0,0 +1,161 @@ +import type { HttpResponse } from '@angular/common/http'; +import { IDictionary } from '../types/shared'; +import { IEnvironment } from '../types/state/environments.interfaces'; +import { HeaderState } from '../types/state/header.interfaces'; +import { LogLine } from '../types/state/query.interfaces'; +import { getErrorEvent, getResponseEvent } from './events'; + +export interface SendRequestResponse { + response: HttpResponse; + meta: { + requestStartTime: number; + requestEndTime: number; + responseTime: number; + headers: IDictionary; + }; +} + +export enum RequestType { + INTROSPECTION = 'introspection', + QUERY = 'query', + SUBSCRIPTION = 'subscription', +} + +export interface ScriptContextHelpers { + getEnvironment: (key: string) => any; + setEnvironment: (key: string, value: any) => void; + getCookie: (key: string) => string; + setCookie: (key: string, value: string) => void; + request: (arg1: any, arg2: any, arg3: any) => Promise; +} + +export interface ScriptContextStorage { + get: (key: string) => Promise; + set: (key: string, value: unknown) => Promise; +} + +export interface ScriptContextData { + headers: HeaderState; + variables: string; + operationName: string; + query: string; + environment: IDictionary; + requestScriptLogs?: LogLine[]; + response?: SendRequestResponse; + requestType?: RequestType; + __toSetActiveEnvironment?: IDictionary; + __cookieJar?: IDictionary; +} + +export interface ScriptContextResponse { + requestType: RequestType; + responseTime: number; + statusCode: number; + body: unknown; + headers: IDictionary; +} +export interface GlobalHelperContext { + data: ScriptContextData; + helpers: ScriptContextHelpers; + storage: ScriptContextStorage; + importModule: (moduleName: string) => any; + log: (d: unknown) => void; + response?: ScriptContextResponse; +} + +export interface ScriptTranformResult { + requestScriptLogs: LogLine[]; + additionalHeaders: HeaderState; + environment?: IEnvironment; +} + +export type SameSite = 'Lax' | 'None' | 'Strict'; +export interface CookieOptions { + expires?: number | Date; + path?: string; + domain?: string; + secure?: boolean; + sameSite?: SameSite; +} + +export interface GlobalContextBuilderHandlers { + setCookie: ScriptEventHandlers['setCookie']; + request: ScriptEventHandlers['request']; + getStorageItem: ScriptEventHandlers['getStorageItem']; + setStorageItem: ScriptEventHandlers['setStorageItem']; +} + +export interface ModuleImportsMap { + [name: string]: { exec: () => Promise }; +} + +export interface ScriptEventHandlers { + alert: (msg: string) => Promise; + log: (d: unknown) => Promise; + request: (arg1: any, arg2: any, arg3: any) => Promise; + setCookie: (key: string, value: string, options?: CookieOptions) => Promise; + getStorageItem: (key: string) => Promise; + setStorageItem: (key: string, value: unknown) => Promise; + updateActiveEnvironment: ( + environmentData: Record + ) => Promise; +} + +// Extended event handler interface to include internal native events like scriptError as well +export interface AllScriptEventHandlers extends ScriptEventHandlers { + executeComplete: (data: ScriptContextData) => void; + scriptError: (err: Error) => void; +} + +export type ScriptEvent = keyof AllScriptEventHandlers; +export type ScriptResponseEvent = `${T}_response`; +export type ScriptEventParameters = Parameters< + AllScriptEventHandlers[T] +>; +export interface ScriptEventDataPayload { + id: string; + args: ScriptEventParameters; +} +export interface ScriptEventResponsePayload { + id: string; + response: any; // TODO: Define the response type from the AllScriptEventHandlers +} +export interface ScriptEventErrorPayload { + id: string; + error: string; +} +export type ScriptEventData = T extends ScriptEvent + ? { type: T; payload: ScriptEventDataPayload } + : never; + +export interface ScriptWorkerMessageData { + type: string; + payload: any; +} + +export interface ScriptEvaluatorClientFactory { + create: () => ScriptEvaluatorClient; +} +export abstract class ScriptEvaluatorClient { + abstract subscribe( + type: T, + handler: (type: T, e: ScriptEventData) => void + ): void; + abstract send(type: string, payload: any): void; + abstract onError(handler: (err: any) => void): void; + abstract destroy(): void; + + sendResponse(type: T, payload: ScriptEventResponsePayload) { + this.send(getResponseEvent(type), payload); + } + + sendError(type: T, payload: ScriptEventErrorPayload) { + this.send(getErrorEvent(type), payload); + } +} + +export abstract class ScriptEvaluatorWorker { + abstract onMessage(handler: (e: ScriptWorkerMessageData) => void): void; + abstract send(type: string, payload: any): void; + abstract onError(handler: (err: any) => void): void; +} diff --git a/packages/altair-core/src/types/state/environments.interfaces.ts b/packages/altair-core/src/types/state/environments.interfaces.ts index 85ee96950d..8b547436d5 100644 --- a/packages/altair-core/src/types/state/environments.interfaces.ts +++ b/packages/altair-core/src/types/state/environments.interfaces.ts @@ -28,3 +28,7 @@ export interface EnvironmentsState { // Adding undefined for backward compatibility activeSubEnvironment?: string; } + +export interface IEnvironment extends IDictionary { + headers?: IDictionary; +} diff --git a/packages/altair-core/src/utils/logger.ts b/packages/altair-core/src/utils/logger.ts index 4c5f345787..c291c816e7 100644 --- a/packages/altair-core/src/utils/logger.ts +++ b/packages/altair-core/src/utils/logger.ts @@ -1,11 +1,19 @@ import loglevel from 'loglevel'; import prefix from 'loglevel-plugin-prefix'; +export interface ILogger { + log(...args: any[]): void; + debug(...args: any[]): void; + info(...args: any[]): void; + warn(...args: any[]): void; + error(...args: any[]): void; +} + prefix.reg(loglevel); export const createLogger = (environment: { production: boolean; version: string; -}) => { +}): ILogger => { if (!environment.production) { loglevel.setLevel('TRACE'); } diff --git a/packages/altair-electron-settings/package.json b/packages/altair-electron-settings/package.json index 6c3a3b963c..b2e20e1d3d 100644 --- a/packages/altair-electron-settings/package.json +++ b/packages/altair-electron-settings/package.json @@ -34,6 +34,6 @@ "postcss": "^8.4.33", "tailwindcss": "^3.4.1", "typescript": "^5.2.2", - "vite": "^5.0.12" + "vite": "^5.2.0" } } diff --git a/packages/altair-iframe-sandbox/.gitignore b/packages/altair-iframe-sandbox/.gitignore new file mode 100644 index 0000000000..a547bf36d8 --- /dev/null +++ b/packages/altair-iframe-sandbox/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/altair-iframe-sandbox/index.html b/packages/altair-iframe-sandbox/index.html new file mode 100644 index 0000000000..44a933506f --- /dev/null +++ b/packages/altair-iframe-sandbox/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/packages/altair-iframe-sandbox/package.json b/packages/altair-iframe-sandbox/package.json new file mode 100644 index 0000000000..a27eda39c2 --- /dev/null +++ b/packages/altair-iframe-sandbox/package.json @@ -0,0 +1,18 @@ +{ + "name": "@altairgraphql/iframe-sandbox", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port 5123", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "altair-graphql-core": "^6.4.1" + }, + "devDependencies": { + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/packages/altair-iframe-sandbox/public/vite.svg b/packages/altair-iframe-sandbox/public/vite.svg new file mode 100644 index 0000000000..e7b8dfb1b2 --- /dev/null +++ b/packages/altair-iframe-sandbox/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/altair-iframe-sandbox/src/evaluator.frame.ts b/packages/altair-iframe-sandbox/src/evaluator.frame.ts new file mode 100644 index 0000000000..733264de1e --- /dev/null +++ b/packages/altair-iframe-sandbox/src/evaluator.frame.ts @@ -0,0 +1,40 @@ +import { + ScriptEvaluatorWorker, + ScriptWorkerMessageData, +} from 'altair-graphql-core/build/script/types'; +import { validOrigins } from 'altair-graphql-core/build/origins'; + +export class EvaluatorFrameWorker extends ScriptEvaluatorWorker { + origin = ''; + + constructor() { + super(); + const params = new URLSearchParams(window.location.search); + // Get the source origin that embeds the iframe from the URL query parameter + const source = params.get('sc'); + + if (!source || !validOrigins.includes(source)) { + throw new Error('Invalid source provided!'); + } + this.origin = source; + } + + onMessage(handler: (e: ScriptWorkerMessageData) => void): void { + window.addEventListener('message', (e) => { + if (e.origin && !validOrigins.includes(e.origin)) { + return; + } + handler(e.data); + }); + } + send(type: string, payload: any): void { + window.parent.postMessage({ type, payload }, this.origin); + } + onError(handler: (err: any) => void): void { + window.addEventListener('error', handler); + window.addEventListener('unhandledrejection', (e) => { + e.preventDefault(); + handler(e.reason); + }); + } +} diff --git a/packages/altair-iframe-sandbox/src/main.ts b/packages/altair-iframe-sandbox/src/main.ts new file mode 100644 index 0000000000..c122f855db --- /dev/null +++ b/packages/altair-iframe-sandbox/src/main.ts @@ -0,0 +1,5 @@ +import './style.css'; +import { ScriptEvaluatorWorkerEngine } from 'altair-graphql-core/build/script/evaluator-worker-engine'; +import { EvaluatorFrameWorker } from './evaluator.frame'; + +new ScriptEvaluatorWorkerEngine(new EvaluatorFrameWorker()).start(); diff --git a/packages/altair-iframe-sandbox/src/style.css b/packages/altair-iframe-sandbox/src/style.css new file mode 100644 index 0000000000..f9c7350248 --- /dev/null +++ b/packages/altair-iframe-sandbox/src/style.css @@ -0,0 +1,96 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/packages/altair-iframe-sandbox/src/vite-env.d.ts b/packages/altair-iframe-sandbox/src/vite-env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/packages/altair-iframe-sandbox/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/altair-iframe-sandbox/tsconfig.json b/packages/altair-iframe-sandbox/tsconfig.json new file mode 100644 index 0000000000..75abdef265 --- /dev/null +++ b/packages/altair-iframe-sandbox/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/packages/login-redirect/package.json b/packages/login-redirect/package.json index d8cdd5365f..b7eba9e995 100644 --- a/packages/login-redirect/package.json +++ b/packages/login-redirect/package.json @@ -2,12 +2,17 @@ "name": "@altairgraphql/login-redirect", "version": "6.4.2", "dependencies": { +<<<<<<< HEAD "@altairgraphql/api-utils": "^6.4.2" +======= + "@altairgraphql/api-utils": "^6.4.1", + "altair-graphql-core": "^6.4.1" +>>>>>>> 1d01a63b (Refactored request script evaluator engine) }, "devDependencies": { "rimraf": "^5.0.5", "typescript": "5.2.2", - "vite": "^4.0.4" + "vite": "^5.2.0" }, "license": "MIT", "main": "index.js", diff --git a/packages/login-redirect/src/script.ts b/packages/login-redirect/src/script.ts index 0d666bf115..890cc35e91 100644 --- a/packages/login-redirect/src/script.ts +++ b/packages/login-redirect/src/script.ts @@ -1,16 +1,7 @@ import { initializeClient } from '@altairgraphql/api-utils'; +import { validOrigins } from 'altair-graphql-core/build/origins'; import { OAUTH_POPUP_CALLBACK_MESSAGE_TYPE } from '@altairgraphql/api-utils/build/constants'; -const validOrigins = [ - 'chrome-extension://flnheeellpciglgpaodhkhmapeljopja', // chrome extension - 'chrome-extension://aiopipphfnlndegenpkclffgaiillbdd', // unpacked chrome extension - 'moz-extension://567d7e27-43b8-994e-ab50-e770fa7eab4b', // firefox extension - 'http://localhost:4200', // local altair app - 'https://dash.altairgraphql.dev', - 'https://altair-gql.sirmuel.design', - 'https://web.altairgraphql.dev', -]; - const OAUTH_NONCE_KEY = 'altairgql:oauth:nonce:key'; const getRedirectResult = () => { diff --git a/yarn.lock b/yarn.lock index db2d6b7b92..afa74da123 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3230,6 +3230,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + "@esbuild/android-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" @@ -3245,6 +3250,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" integrity sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ== +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + "@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" @@ -3260,6 +3270,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" integrity sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA== +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + "@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" @@ -3275,6 +3290,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" integrity sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA== +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + "@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" @@ -3290,6 +3310,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" integrity sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw== +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + "@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" @@ -3305,6 +3330,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" integrity sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA== +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + "@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" @@ -3320,6 +3350,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" integrity sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + "@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" @@ -3335,6 +3370,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" integrity sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ== +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + "@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" @@ -3350,6 +3390,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" integrity sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA== +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + "@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" @@ -3365,6 +3410,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" integrity sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ== +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + "@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" @@ -3380,6 +3430,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" integrity sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ== +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + "@esbuild/linux-loong64@0.14.53": version "0.14.53" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz#251b4cd6760fadb4d68a05815e6dc5e432d69cd6" @@ -3400,6 +3455,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" integrity sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw== +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + "@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" @@ -3415,6 +3475,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" integrity sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg== +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + "@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" @@ -3430,6 +3495,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" integrity sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q== +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + "@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" @@ -3445,6 +3515,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" integrity sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag== +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + "@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" @@ -3460,6 +3535,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" integrity sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw== +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + "@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" @@ -3475,6 +3555,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" integrity sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A== +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + "@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" @@ -3490,6 +3575,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" integrity sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g== +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + "@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" @@ -3505,6 +3595,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" integrity sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA== +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + "@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" @@ -3520,6 +3615,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" integrity sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg== +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + "@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" @@ -3535,6 +3635,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" integrity sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg== +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + "@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" @@ -3550,6 +3655,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" integrity sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw== +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + "@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" @@ -3565,6 +3675,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz#faad84c41ba12e3a0acb52571df9bff37bee75f6" integrity sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw== +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + "@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" @@ -6810,66 +6925,141 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/rollup-android-arm-eabi@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.2.tgz#9047b5b1ec19f58c0fdf3a072bd977bcec056576" + integrity sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ== + "@rollup/rollup-android-arm-eabi@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz#b752b6c88a14ccfcbdf3f48c577ccc3a7f0e66b9" integrity sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA== +"@rollup/rollup-android-arm64@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.2.tgz#08a2d2705193ebb3054941994e152808beb5254e" + integrity sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw== + "@rollup/rollup-android-arm64@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz#33757c3a448b9ef77b6f6292d8b0ec45c87e9c1a" integrity sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg== +"@rollup/rollup-darwin-arm64@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.2.tgz#bf746c610f337b104408ec001549d825a91eca57" + integrity sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q== + "@rollup/rollup-darwin-arm64@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz#5234ba62665a3f443143bc8bcea9df2cc58f55fb" integrity sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w== +"@rollup/rollup-darwin-x64@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.2.tgz#59ebe3b858a44680d5f87546ea2df1c7e3135f6a" + integrity sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA== + "@rollup/rollup-darwin-x64@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz#981256c054d3247b83313724938d606798a919d1" integrity sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA== +"@rollup/rollup-linux-arm-gnueabihf@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.2.tgz#44cffc07d04d659cb635aec11bef530d5757ee6a" + integrity sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g== + "@rollup/rollup-linux-arm-gnueabihf@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz#120678a5a2b3a283a548dbb4d337f9187a793560" integrity sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g== +"@rollup/rollup-linux-arm64-gnu@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz#9901e2288fb192b74a2f8428c507d43cc2739ceb" + integrity sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ== + "@rollup/rollup-linux-arm64-gnu@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz#c99d857e2372ece544b6f60b85058ad259f64114" integrity sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA== +"@rollup/rollup-linux-arm64-musl@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.2.tgz#8a2c55a72e0c716a15d830fee3bf5a1a756f13ec" + integrity sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA== + "@rollup/rollup-linux-arm64-musl@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz#3064060f568a5718c2a06858cd6e6d24f2ff8632" integrity sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ== +"@rollup/rollup-linux-powerpc64le-gnu@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.2.tgz#71bf99c8017476ac85b09d21b3fa2eacbad96100" + integrity sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw== + +"@rollup/rollup-linux-riscv64-gnu@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.2.tgz#48ee7fe5fee7b6d0028b6dda4fab95238208a0cd" + integrity sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w== + "@rollup/rollup-linux-riscv64-gnu@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz#987d30b5d2b992fff07d055015991a57ff55fbad" integrity sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA== +"@rollup/rollup-linux-s390x-gnu@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.2.tgz#65ad6f82729ef9d8634847189214e3205892f42f" + integrity sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ== + +"@rollup/rollup-linux-x64-gnu@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.2.tgz#2ab802ce25c0d0d44a0ea55b0068f79e462d22cd" + integrity sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q== + "@rollup/rollup-linux-x64-gnu@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz#85946ee4d068bd12197aeeec2c6f679c94978a49" integrity sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA== +"@rollup/rollup-linux-x64-musl@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.2.tgz#85dcd3f549c2fdbcf1cb1f1b5f501933ed590880" + integrity sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw== + "@rollup/rollup-linux-x64-musl@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz#fe0b20f9749a60eb1df43d20effa96c756ddcbd4" integrity sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg== +"@rollup/rollup-win32-arm64-msvc@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.2.tgz#10f608dfc1e5bb96aca18c7784cc4a94d890c03c" + integrity sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA== + "@rollup/rollup-win32-arm64-msvc@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz#422661ef0e16699a234465d15b2c1089ef963b2a" integrity sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ== +"@rollup/rollup-win32-ia32-msvc@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.2.tgz#f27f9fb64b7e10b04121e0054d9145ee21589267" + integrity sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw== + "@rollup/rollup-win32-ia32-msvc@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz#7b73a145891c202fbcc08759248983667a035d85" integrity sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA== +"@rollup/rollup-win32-x64-msvc@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.2.tgz#5d2d9dc96b436469dc74ef93de069b14fb12aace" + integrity sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q== + "@rollup/rollup-win32-x64-msvc@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz#10491ccf4f63c814d4149e0316541476ea603602" @@ -16738,6 +16928,35 @@ esbuild@^0.19.3: "@esbuild/win32-ia32" "0.19.11" "@esbuild/win32-x64" "0.19.11" +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -28257,6 +28476,15 @@ postcss@^8.4.32, postcss@^8.4.33: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + preact@^10.0.0: version "10.19.3" resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" @@ -29977,6 +30205,30 @@ rollup@^3.27.1: optionalDependencies: fsevents "~2.3.2" +rollup@^4.13.0: + version "4.14.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.14.2.tgz#992df3c3bb4ca84ce6b00d51aacb1e5a62d0a14c" + integrity sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.14.2" + "@rollup/rollup-android-arm64" "4.14.2" + "@rollup/rollup-darwin-arm64" "4.14.2" + "@rollup/rollup-darwin-x64" "4.14.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.14.2" + "@rollup/rollup-linux-arm64-gnu" "4.14.2" + "@rollup/rollup-linux-arm64-musl" "4.14.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.14.2" + "@rollup/rollup-linux-riscv64-gnu" "4.14.2" + "@rollup/rollup-linux-s390x-gnu" "4.14.2" + "@rollup/rollup-linux-x64-gnu" "4.14.2" + "@rollup/rollup-linux-x64-musl" "4.14.2" + "@rollup/rollup-win32-arm64-msvc" "4.14.2" + "@rollup/rollup-win32-ia32-msvc" "4.14.2" + "@rollup/rollup-win32-x64-msvc" "4.14.2" + fsevents "~2.3.2" + rollup@^4.2.0: version "4.9.5" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.5.tgz#62999462c90f4c8b5d7c38fc7161e63b29101b05" @@ -31055,6 +31307,11 @@ source-map-js@^0.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map-loader@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" @@ -33756,17 +34013,6 @@ vite@4.5.1: optionalDependencies: fsevents "~2.3.2" -vite@^4.0.4: - version "4.5.0" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" - integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== - dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" - optionalDependencies: - fsevents "~2.3.2" - vite@^5.0.11: version "5.0.11" resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.11.tgz#31562e41e004cb68e1d51f5d2c641ab313b289e4" @@ -33778,14 +34024,14 @@ vite@^5.0.11: optionalDependencies: fsevents "~2.3.3" -vite@^5.0.12: - version "5.0.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47" - integrity sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w== +vite@^5.2.0: + version "5.2.8" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.8.tgz#a99e09939f1a502992381395ce93efa40a2844aa" + integrity sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA== dependencies: - esbuild "^0.19.3" - postcss "^8.4.32" - rollup "^4.2.0" + esbuild "^0.20.1" + postcss "^8.4.38" + rollup "^4.13.0" optionalDependencies: fsevents "~2.3.3" From fcb98f4178b972b5e6a41409e6191f04c2adda2a Mon Sep 17 00:00:00 2001 From: Samuel Imolorhe Date: Sat, 13 Apr 2024 23:48:06 +0200 Subject: [PATCH 2/3] test --- .../services/pre-request/cors-worker.ts | 22 ---------- .../pre-request/evaluator-client.factory.ts | 36 +--------------- .../pre-request/evaluator-worker-client.ts | 41 +++++++++++++++++++ .../pre-request/evaluator-worker.factory.ts | 16 -------- packages/altair-app/src/setup-jest.ts | 2 +- 5 files changed, 43 insertions(+), 74 deletions(-) delete mode 100644 packages/altair-app/src/app/modules/altair/services/pre-request/cors-worker.ts create mode 100644 packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker-client.ts delete mode 100644 packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker.factory.ts diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/cors-worker.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/cors-worker.ts deleted file mode 100644 index 65b9e6501e..0000000000 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/cors-worker.ts +++ /dev/null @@ -1,22 +0,0 @@ -export class CorsWorker { - private readonly url: string | URL; - private readonly options?: WorkerOptions; - - // Have this only to trick Webpack into properly transpiling - // the url address from the component which uses it - constructor(url: string | URL, options?: WorkerOptions) { - this.url = url; - this.options = options; - } - - async createWorker(): Promise { - const f = await fetch(this.url); - const t = await f.text(); - const b = new Blob([t], { - type: 'application/javascript', - }); - const url = URL.createObjectURL(b); - const worker = new Worker(url, this.options); - return worker; - } -} diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts index ec405ba85d..d74d25b273 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-client.factory.ts @@ -7,41 +7,7 @@ import { import { getClientConfig } from '@altairgraphql/api-utils'; import { debug } from '../../utils/logger'; import { environment } from 'environments/environment'; - -export class EvaluatorWorkerClient extends ScriptEvaluatorClient { - private worker = new Worker(new URL('./evaluator.worker', import.meta.url), { - type: 'module', - }); - subscribe( - type: T, - handler: (k: T, e: ScriptEventData) => void - ) { - this.worker.addEventListener( - 'message', - (e: MessageEvent>) => { - const event = e.data; - - // Handle script events - if (event.type === type) { - debug.log(event.type, event); - handler(type, event); - } - } - ); - } - send(type: string, payload: any): void { - this.worker.postMessage({ - type, - payload, - }); - } - onError(handler: (err: any) => void): void { - this.worker.addEventListener('error', handler); - } - destroy(): void { - this.worker.terminate(); - } -} +import { EvaluatorWorkerClient } from './evaluator-worker-client'; export class EvaluatorFrameClient extends ScriptEvaluatorClient { private config = getClientConfig( diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker-client.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker-client.ts new file mode 100644 index 0000000000..e8ec80c76d --- /dev/null +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker-client.ts @@ -0,0 +1,41 @@ +import { + ScriptEvaluatorClient, + ScriptEvent, + ScriptEventData, +} from 'altair-graphql-core/build/script/types'; +import { debug } from '../../utils/logger'; + +export class EvaluatorWorkerClient extends ScriptEvaluatorClient { + private worker = new Worker(new URL('./evaluator.worker', import.meta.url), { + type: 'module', + }); + subscribe( + type: T, + handler: (k: T, e: ScriptEventData) => void + ) { + this.worker.addEventListener( + 'message', + (e: MessageEvent>) => { + const event = e.data; + + // Handle script events + if (event.type === type) { + debug.log(event.type, event); + handler(type, event); + } + } + ); + } + send(type: string, payload: any): void { + this.worker.postMessage({ + type, + payload, + }); + } + onError(handler: (err: any) => void): void { + this.worker.addEventListener('error', handler); + } + destroy(): void { + this.worker.terminate(); + } +} diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker.factory.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker.factory.ts deleted file mode 100644 index 5fda069c2e..0000000000 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator-worker.factory.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CorsWorker } from './cors-worker'; - -export class ScriptEvaluatorWorkerFactory { - async create() { - try { - return new Worker(new URL('./evaluator.worker', import.meta.url), { - type: 'module', - }); - } catch { - // Try to use CORS worker if using the worker directly fails - return new CorsWorker(new URL('./evaluator.worker', import.meta.url), { - type: 'module', - }).createWorker(); - } - } -} diff --git a/packages/altair-app/src/setup-jest.ts b/packages/altair-app/src/setup-jest.ts index 13610f34e5..30f9471ff8 100644 --- a/packages/altair-app/src/setup-jest.ts +++ b/packages/altair-app/src/setup-jest.ts @@ -19,7 +19,7 @@ jest.mock( }) ); jest.mock( - './app/modules/altair/services/pre-request/evaluator-worker.factory', + './app/modules/altair/services/pre-request/evaluator-client.factory', () => ({ ScriptEvaluatorWorkerFactory: function () { return { From fd3c8302aaf44be387f07f07c1d0661e83876b4b Mon Sep 17 00:00:00 2001 From: Samuel Imolorhe Date: Sat, 13 Apr 2024 23:50:55 +0200 Subject: [PATCH 3/3] added prepare --- packages/altair-iframe-sandbox/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/altair-iframe-sandbox/package.json b/packages/altair-iframe-sandbox/package.json index a27eda39c2..572bab140b 100644 --- a/packages/altair-iframe-sandbox/package.json +++ b/packages/altair-iframe-sandbox/package.json @@ -6,7 +6,9 @@ "scripts": { "dev": "vite --port 5123", "build": "tsc && vite build", - "preview": "vite preview" + "preview": "vite preview", + "prepare": "yarn build", + "test": "echo \"Error: no test specified\" && exit 0" }, "dependencies": { "altair-graphql-core": "^6.4.1"