aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-08-28 21:57:35 +0200
committerLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-08-28 21:57:35 +0200
commitdb77f995f6d7cca5b471635a393954e2bd34b65a (patch)
tree5b8bb8f039d8f51691f8add54036f6dce39f7658 /src
parentd09f12a4c3730d9992f14b89c64ba7b117c1946e (diff)
downloadevaltool-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.ts12
-rw-r--r--src/lib/.gitignore1
-rw-r--r--src/lib/gen-webext-polyfill.ts15
l---------src/lib/tsconfig.jsonc1
-rw-r--r--src/routes/+page.svelte11
-rw-r--r--src/routes/Monaco.svelte46
-rw-r--r--src/routes/userland.d.ts10
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;