diff options
author | 2025-08-28 21:57:35 +0200 | |
---|---|---|
committer | 2025-08-28 21:57:35 +0200 | |
commit | db77f995f6d7cca5b471635a393954e2bd34b65a (patch) | |
tree | 5b8bb8f039d8f51691f8add54036f6dce39f7658 /src | |
parent | d09f12a4c3730d9992f14b89c64ba7b117c1946e (diff) | |
download | evaltool-db77f995f6d7cca5b471635a393954e2bd34b65a.tar.gz evaltool-db77f995f6d7cca5b471635a393954e2bd34b65a.tar.bz2 evaltool-db77f995f6d7cca5b471635a393954e2bd34b65a.tar.lz evaltool-db77f995f6d7cca5b471635a393954e2bd34b65a.zip |
feat: exttool
Diffstat (limited to 'src')
-rw-r--r-- | src/background.ts | 12 | ||||
-rw-r--r-- | src/lib/.gitignore | 1 | ||||
-rw-r--r-- | src/lib/gen-webext-polyfill.ts | 15 | ||||
l--------- | src/lib/tsconfig.jsonc | 1 | ||||
-rw-r--r-- | src/routes/+page.svelte | 11 | ||||
-rw-r--r-- | src/routes/Monaco.svelte | 46 | ||||
-rw-r--r-- | src/routes/userland.d.ts | 10 |
7 files changed, 54 insertions, 42 deletions
diff --git a/src/background.ts b/src/background.ts index 65d7187..6c5843f 100644 --- a/src/background.ts +++ b/src/background.ts @@ -42,11 +42,6 @@ setTimeout(async () => { }); console.debug('Got result', built); const b = browser; - const brow: UserlandBrowser = { - get webRequest() { - return b.webRequest; - }, - }; const f = new Function( 'browser', built.code.includes('await') @@ -56,12 +51,11 @@ setTimeout(async () => { ); console.debug('Environment Information:', { func: f, - browser: brow, - realBrowser: b, + browser: b, }); - (globalThis as any).browser = brow; + (globalThis as any).browser = b; console.debug('Evaluating...'); - await f(brow); + await f(b); console.debug('Function Exited'); } }, 0); diff --git a/src/lib/.gitignore b/src/lib/.gitignore new file mode 100644 index 0000000..6f7de8f --- /dev/null +++ b/src/lib/.gitignore @@ -0,0 +1 @@ +/webext-polyfill.ts diff --git a/src/lib/gen-webext-polyfill.ts b/src/lib/gen-webext-polyfill.ts new file mode 100644 index 0000000..5c09e07 --- /dev/null +++ b/src/lib/gen-webext-polyfill.ts @@ -0,0 +1,15 @@ +import fs from 'node:fs/promises'; +const files = {} as Record<string, string> +const promises = [] as Promise<void>[] +for (const f of await fs.readdir('node_modules/@types/webextension-polyfill', { + recursive: true, +})) + promises.push((async () => { + const fp = 'node_modules/@types/webextension-polyfill/' + f; + const stat = await fs.stat(fp) + if (!stat.isDirectory()) + files[fp] = await fs.readFile(fp, 'utf-8') + })()) +await Promise.all(promises) +await fs.writeFile('src/lib/webext-polyfill.ts', `export const files = ${JSON.stringify(files, null, 2)}; +export default files;`) diff --git a/src/lib/tsconfig.jsonc b/src/lib/tsconfig.jsonc new file mode 120000 index 0000000..fd0e474 --- /dev/null +++ b/src/lib/tsconfig.jsonc @@ -0,0 +1 @@ +../../tsconfig.json
\ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 7320c2a..2ad013f 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,8 +2,10 @@ import { onMount } from 'svelte'; import Monaco from './Monaco.svelte'; let content_script = $state(''); - let default_value = $state(`// Do not put untrusted content here! -// See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Intercept_HTTP_requests and https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest for a tutorial on how to handle things. + let default_value = + $state(`// Do not put untrusted content here! See https://en.wikipedia.org/wiki/Self-XSS! +// The extension authors hold no liability for you stupidly putting things here without knowing any better. +// See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions for a tutorial on how to handle things. // Content saves on every keystroke due to laziness. // Reload (disable & re-enable) extension or restart browser to apply changes. `); @@ -33,10 +35,7 @@ </script> {#if mounted} - <Monaco - defaultValue={default_value} - bind:value={content_script} - /> + <Monaco defaultValue={default_value} bind:value={content_script} /> {:else} Getting Storage {/if} diff --git a/src/routes/Monaco.svelte b/src/routes/Monaco.svelte index 295b432..8d5d2a2 100644 --- a/src/routes/Monaco.svelte +++ b/src/routes/Monaco.svelte @@ -6,11 +6,10 @@ // import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'; // import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'; import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'; - // @ts-ignore - import wrqTypes from '@types/webextension-polyfill/namespaces/webRequest.d.ts?raw'; - // @ts-ignore - import evTypes from '@types/webextension-polyfill/namespaces/events.d.ts?raw'; + import typeFiles from '$lib/webext-polyfill'; import userland from './userland.d.ts?raw'; + // import tsconf from '$lib/tsconfig.jsonc?raw'; + // import j5 from 'json5'; let divEl: HTMLDivElement | null = $state(null); let editor: monaco.editor.IStandaloneCodeEditor = $state(null as any); @@ -20,8 +19,7 @@ typeDefs = `import type { UserlandBrowser } from './userland'; declare global { /** - * The subset of the host extension's browser type available to the extension - * Note: We don't properly sandbox anything. You can likely easily get access to shit outside of here from the browser global. + * The host extension's browser type available to the extension */ declare const browser: UserlandBrowser; } @@ -85,33 +83,35 @@ declare global { }); if (!divEl) while (!divEl) await new Promise((rs) => setTimeout(rs, 100)); for (const [_filename, contents] of Object.entries( - (await import('./filemap.js')).default + (await import('./filemap.js')).default, )) { Monaco.languages.typescript.typescriptDefaults.addExtraLib( - contents + contents, // ,_filename ); } - Monaco.languages.typescript.typescriptDefaults.addExtraLib( - evTypes, - 'node_modules/@types/webextension-polyfill/namespaces/events.d.ts' - ); - Monaco.languages.typescript.typescriptDefaults.addExtraLib( - wrqTypes, - 'node_modules/@types/webextension-polyfill/namespaces/webRequest.d.ts' - ); - Monaco.languages.typescript.typescriptDefaults.addExtraLib( - `export * from './namespaces/webRequest';`, - 'node_modules/@types/webextension-polyfill/index.d.ts' - ); + for (const [file, contents] of Object.entries(typeFiles).filter(([name]) => + name.toLowerCase().endsWith('.ts'), + )) + Monaco.languages.typescript.typescriptDefaults.addExtraLib( + contents, + file, + ); Monaco.languages.typescript.typescriptDefaults.addExtraLib( userland, - 'node_modules/@types/redirext/userland.d.ts' + 'node_modules/@types/redirext/userland.d.ts', ); Monaco.languages.typescript.typescriptDefaults.addExtraLib( typeDefs, - 'node_modules/@types/redirext/index.d.ts' + 'node_modules/@types/redirext/index.d.ts', ); + // try { + // Monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ + // ...j5.parse(tsconf).compilerOptions, + // moduleResolution: undefined, + // allowNonTsExtensions: true, + // }); + // } catch (e) {} editor = Monaco.editor.create(divEl, { value: defaultValue, language: 'typescript', @@ -124,7 +124,7 @@ declare global { const el = document.createElement('div'); el.setAttribute( 'style', - 'display:flex;width:100vw;height:100vh;position:fixed;left:0;top:0;align-items:center;justify-content:center;text-align:center;z-index:9999;background:#23222B;' + 'display:flex;width:100vw;height:100vh;position:fixed;left:0;top:0;align-items:center;justify-content:center;text-align:center;z-index:9999;background:#23222B;', ); el.textContent = 'Popped out'; document.body.appendChild(el); diff --git a/src/routes/userland.d.ts b/src/routes/userland.d.ts index 7b659b8..11275ce 100644 --- a/src/routes/userland.d.ts +++ b/src/routes/userland.d.ts @@ -1,4 +1,6 @@ -import type { WebRequest } from 'webextension-polyfill'; -export type UserlandBrowser = { - get webRequest(): WebRequest.Static; -}; +import type Browser from 'webextension-polyfill'; +// export type UserlandBrowser = { +// get webRequest(): WebRequest.Static; +// }; + +export type UserlandBrowser = Browser.Browser; |