Compare commits
5 commits
93a7611554
...
efbb7c0b11
Author | SHA1 | Date | |
---|---|---|---|
efbb7c0b11 | |||
2a3d7f1b7e | |||
163bd11e7d | |||
0dbedc27f3 | |||
5b941bb5a9 |
10 changed files with 125 additions and 18 deletions
|
@ -7,7 +7,8 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "pnpm -r --parallel dev",
|
"dev": "pnpm -r --parallel dev",
|
||||||
"build": "tsc -b && pnpm -r build",
|
"build": "tsc -b && pnpm -r build",
|
||||||
"build:vendor": "cd vendor && bash build-patched-chobitsu.sh"
|
"build:vendor": "cd vendor && bash build-patched-chobitsu.sh",
|
||||||
|
"preview": "pnpm run -r --parallel preview"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@antfu/eslint-config": "^3.13.0",
|
"@antfu/eslint-config": "^3.13.0",
|
||||||
|
@ -26,5 +27,10 @@
|
||||||
"typescript": "^5.7.3",
|
"typescript": "^5.7.3",
|
||||||
"vite": "^5.4.11",
|
"vite": "^5.4.11",
|
||||||
"vite-plugin-solid": "^2.11.0"
|
"vite-plugin-solid": "^2.11.0"
|
||||||
|
},
|
||||||
|
"pnpm": {
|
||||||
|
"patchedDependencies": {
|
||||||
|
"monaco-editor@0.52.0": "patches/monaco-editor@0.52.0.patch"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,12 @@
|
||||||
<script defer src="https://zond.tei.su/script.js" data-website-id="e1726072-b61b-49ab-a4ee-decb8e6740be"></script>
|
<script defer src="https://zond.tei.su/script.js" data-website-id="e1726072-b61b-49ab-a4ee-decb8e6740be"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<script>
|
||||||
|
const theme = localStorage.getItem('kb-color-mode')
|
||||||
|
if (theme === 'dark' || ((!theme || theme === 'system') && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||||
|
document.documentElement.style.colorScheme = 'dark'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<script type="module" src="/src/index.tsx"></script>
|
<script type="module" src="/src/index.tsx"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -52,6 +52,7 @@ const compilerOptions: languages.typescript.CompilerOptions = {
|
||||||
jsx: languages.typescript.JsxEmit.Preserve,
|
jsx: languages.typescript.JsxEmit.Preserve,
|
||||||
allowNonTsExtensions: true,
|
allowNonTsExtensions: true,
|
||||||
allowImportingTsExtensions: true,
|
allowImportingTsExtensions: true,
|
||||||
|
noErrorTruncation: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
languages.typescript.typescriptDefaults.setCompilerOptions(compilerOptions)
|
languages.typescript.typescriptDefaults.setCompilerOptions(compilerOptions)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { useColorMode } from '@kobalte/core'
|
||||||
import { createEffect, createSignal, onCleanup } from 'solid-js'
|
import { createEffect, createSignal, onCleanup } from 'solid-js'
|
||||||
import { cn } from '../../lib/utils.ts'
|
import { cn } from '../../lib/utils.ts'
|
||||||
|
|
||||||
|
@ -10,21 +11,50 @@ const HTML = `
|
||||||
<script src="https://unpkg.com/@ungap/custom-elements/es.js"></script>
|
<script src="https://unpkg.com/@ungap/custom-elements/es.js"></script>
|
||||||
<script type="module" src="https://cdn.jsdelivr.net/npm/chii@1.12.3/public/front_end/entrypoints/chii_app/chii_app.js"></script>
|
<script type="module" src="https://cdn.jsdelivr.net/npm/chii@1.12.3/public/front_end/entrypoints/chii_app/chii_app.js"></script>
|
||||||
<body class="undocked" id="-blink-dev-tools">
|
<body class="undocked" id="-blink-dev-tools">
|
||||||
|
<script>
|
||||||
|
if (window.location.hash.includes('dark=true')) {
|
||||||
|
document.documentElement.style.colorScheme = 'dark'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<style id="inject-css">
|
<style id="inject-css">
|
||||||
:root {
|
:root {
|
||||||
--sys-color-base-container: hsl(0 0% 100%);
|
--sys-color-base-container: hsl(0 0% 100%);
|
||||||
|
--sys-color-cdt-base: hsl(0 0% 100%);
|
||||||
--sys-color-on-base-divider: hsl(240 5.9% 90%);
|
--sys-color-on-base-divider: hsl(240 5.9% 90%);
|
||||||
--sys-color-divider: hsl(240 5.9% 90%);
|
--sys-color-divider: hsl(240 5.9% 90%);
|
||||||
--sys-color-neutral-outline: hsl(240 5.9% 90%);
|
--sys-color-neutral-outline: hsl(240 5.9% 90%);
|
||||||
}
|
}
|
||||||
.-theme-with-dark-background {
|
.-theme-with-dark-background {
|
||||||
--sys-color-base-container: hsl(240 10% 3.9%);
|
--sys-color-base-container: hsl(240 10% 3.9%);
|
||||||
|
--sys-color-cdt-base: hsl(240 10% 3.9%);
|
||||||
--sys-color-on-base-divider: hsl(240 3.7% 15.9%);
|
--sys-color-on-base-divider: hsl(240 3.7% 15.9%);
|
||||||
--sys-color-divider: hsl(240 3.7% 15.9%);
|
--sys-color-divider: hsl(240 3.7% 15.9%);
|
||||||
--sys-color-neutral-outline: hsl(240 3.7% 15.9%);
|
--sys-color-neutral-outline: hsl(240 3.7% 15.9%);
|
||||||
|
--sys-color-on-surface-subtle: hsl(0 0 98%);
|
||||||
--sys-color-state-hover-on-subtle: hsl(0 0% 98% / 0.08);
|
--sys-color-state-hover-on-subtle: hsl(0 0% 98% / 0.08);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<style id="inject-css-tab-pane">
|
||||||
|
.tabbed-pane-header-tab {
|
||||||
|
border-bottom: 2px solid transparent;
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.tabbed-pane-header-tab.selected {
|
||||||
|
color: var(--sys-color-on-surface-subtle);
|
||||||
|
border-bottom: 2px solid var(--sys-color-on-surface-subtle);
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
.tabbed-pane-left-toolbar,
|
||||||
|
.tabbed-pane-right-toolbar,
|
||||||
|
.tabbed-pane-tab-slider,
|
||||||
|
.tabbed-pane-header-tab:not(#tab-console, #tab-sources) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
`
|
`
|
||||||
|
|
||||||
const INJECTED_SCRIPT = `
|
const INJECTED_SCRIPT = `
|
||||||
|
@ -40,10 +70,17 @@ async function waitForElement(selector, container, waitForShadowRoot = false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function hideBySelector(root, selector) {
|
function hideBySelector(root, selector) {
|
||||||
const el = root.shadowRoot.querySelector(selector);
|
const el = root.querySelector(selector);
|
||||||
if (!el) return;
|
if (!el) return;
|
||||||
el.style.display = 'none';
|
el.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hideBySelectorAll(root, selector) {
|
||||||
|
const els = root.querySelectorAll(selector);
|
||||||
|
for (const el of els) {
|
||||||
|
el.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function focusConsole(tabbedPane) {
|
async function focusConsole(tabbedPane) {
|
||||||
const consoleTab = await waitForElement('#tab-console', tabbedPane.shadowRoot);
|
const consoleTab = await waitForElement('#tab-console', tabbedPane.shadowRoot);
|
||||||
|
@ -54,16 +91,17 @@ async function focusConsole(tabbedPane) {
|
||||||
}
|
}
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
|
localStorage.setItem('disableSelfXssWarning', 'true')
|
||||||
|
|
||||||
const tabbedPane = await waitForElement('.tabbed-pane', document.body);
|
const tabbedPane = await waitForElement('.tabbed-pane', document.body);
|
||||||
await focusConsole(tabbedPane);
|
await focusConsole(tabbedPane);
|
||||||
hideBySelector(tabbedPane, '.tabbed-pane-header');
|
tabbedPane.shadowRoot.appendChild(document.querySelector('#inject-css-tab-pane'));
|
||||||
|
|
||||||
const consoleToolbar = await waitForElement('.console-main-toolbar', document.body);
|
const consoleToolbar = await waitForElement('.console-main-toolbar', document.body);
|
||||||
hideBySelector(consoleToolbar, 'devtools-issue-counter');
|
hideBySelector(consoleToolbar.shadowRoot, 'devtools-issue-counter');
|
||||||
|
|
||||||
const injectCss = await waitForElement('#inject-css', document.body);
|
|
||||||
const rootView = await waitForElement('.root-view', document.body);
|
const rootView = await waitForElement('.root-view', document.body);
|
||||||
rootView.appendChild(injectCss);
|
rootView.appendChild(document.querySelector('#inject-css'));
|
||||||
|
|
||||||
// forward some keyboard shortcuts to the parent window
|
// forward some keyboard shortcuts to the parent window
|
||||||
document.addEventListener('keydown', (e) => {
|
document.addEventListener('keydown', (e) => {
|
||||||
|
@ -88,6 +126,8 @@ export function Devtools(props: {
|
||||||
}) {
|
}) {
|
||||||
const [innerRef, setInnerRef] = createSignal<HTMLIFrameElement | undefined>()
|
const [innerRef, setInnerRef] = createSignal<HTMLIFrameElement | undefined>()
|
||||||
|
|
||||||
|
const { colorMode } = useColorMode()
|
||||||
|
|
||||||
const url = URL.createObjectURL(new Blob([HTML], { type: 'text/html' }))
|
const url = URL.createObjectURL(new Blob([HTML], { type: 'text/html' }))
|
||||||
onCleanup(() => URL.revokeObjectURL(url))
|
onCleanup(() => URL.revokeObjectURL(url))
|
||||||
|
|
||||||
|
@ -101,6 +141,7 @@ export function Devtools(props: {
|
||||||
function handleLoad() {
|
function handleLoad() {
|
||||||
const _innerRef = innerRef()
|
const _innerRef = innerRef()
|
||||||
if (!_innerRef) return
|
if (!_innerRef) return
|
||||||
|
|
||||||
const script = document.createElement('script')
|
const script = document.createElement('script')
|
||||||
script.textContent = INJECTED_SCRIPT
|
script.textContent = INJECTED_SCRIPT
|
||||||
_innerRef.contentWindow?.document.body.appendChild(script)
|
_innerRef.contentWindow?.document.body.appendChild(script)
|
||||||
|
@ -110,7 +151,7 @@ export function Devtools(props: {
|
||||||
<div class={cn('relative', props.class)}>
|
<div class={cn('relative', props.class)}>
|
||||||
<iframe
|
<iframe
|
||||||
ref={setInnerRef}
|
ref={setInnerRef}
|
||||||
src={`${url}#?embedded=${encodeURIComponent(location.origin)}`}
|
src={`${url}#?embedded=${encodeURIComponent(location.origin)}&dark=${colorMode() === 'dark'}`}
|
||||||
title="Devtools"
|
title="Devtools"
|
||||||
class="absolute inset-0 block size-full"
|
class="absolute inset-0 block size-full"
|
||||||
onLoad={handleLoad}
|
onLoad={handleLoad}
|
||||||
|
|
|
@ -13,6 +13,9 @@ export default defineConfig((env): UserConfig => {
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
exclude: ['@mtcute/wasm'],
|
exclude: ['@mtcute/wasm'],
|
||||||
},
|
},
|
||||||
|
preview: {
|
||||||
|
port: 3000,
|
||||||
|
},
|
||||||
build: {
|
build: {
|
||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
external: ['node:fs/promises', 'node:crypto'],
|
external: ['node:fs/promises', 'node:crypto'],
|
||||||
|
|
|
@ -9,10 +9,6 @@ if (!window.parent || window.parent === window) {
|
||||||
throw new Error('Not in iframe')
|
throw new Error('Not in iframe')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new URL(document.referrer).origin !== import.meta.env.VITE_HOST_ORIGIN) {
|
|
||||||
throw new Error(`Invalid origin: this page must be loaded in an iframe from ${import.meta.env.VITE_HOST_ORIGIN}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const worker = new ReplWorker()
|
const worker = new ReplWorker()
|
||||||
|
|
||||||
registerWorker(worker)
|
registerWorker(worker)
|
||||||
|
|
|
@ -12,6 +12,9 @@ export default defineConfig((env): UserConfig => {
|
||||||
server: {
|
server: {
|
||||||
port: 3001,
|
port: 3001,
|
||||||
},
|
},
|
||||||
|
preview: {
|
||||||
|
port: 3001,
|
||||||
|
},
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
exclude: ['@mtcute/wasm'],
|
exclude: ['@mtcute/wasm'],
|
||||||
},
|
},
|
||||||
|
|
26
patches/monaco-editor@0.52.0.patch
Normal file
26
patches/monaco-editor@0.52.0.patch
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
diff --git a/dev/vs/language/typescript/tsWorker.js b/dev/vs/language/typescript/tsWorker.js
|
||||||
|
index cb194f17086a8fa0c6c15a125f3403af1a8e106f..7d6042767cc5a09262bd2ad9e313b2f252b28e3e 100644
|
||||||
|
--- a/dev/vs/language/typescript/tsWorker.js
|
||||||
|
+++ b/dev/vs/language/typescript/tsWorker.js
|
||||||
|
@@ -19471,7 +19471,7 @@ ${lanes.join("\n")}
|
||||||
|
init_ts2();
|
||||||
|
resolvingEmptyArray = [];
|
||||||
|
externalHelpersModuleNameText = "tslib";
|
||||||
|
- defaultMaximumTruncationLength = 160;
|
||||||
|
+ defaultMaximumTruncationLength = 1600;
|
||||||
|
noTruncationMaximumTruncationLength = 1e6;
|
||||||
|
stringWriter = createSingleLineStringWriter();
|
||||||
|
getScriptTargetFeatures = /* @__PURE__ */ memoize(
|
||||||
|
diff --git a/esm/vs/language/typescript/ts.worker.js b/esm/vs/language/typescript/ts.worker.js
|
||||||
|
index 2858333c5e9fe2cf3e59848c966be36031afac3d..549429bc362fdb86c4be8c15d77ccc7881d526a0 100644
|
||||||
|
--- a/esm/vs/language/typescript/ts.worker.js
|
||||||
|
+++ b/esm/vs/language/typescript/ts.worker.js
|
||||||
|
@@ -19453,7 +19453,7 @@ ${lanes.join("\n")}
|
||||||
|
init_ts2();
|
||||||
|
resolvingEmptyArray = [];
|
||||||
|
externalHelpersModuleNameText = "tslib";
|
||||||
|
- defaultMaximumTruncationLength = 160;
|
||||||
|
+ defaultMaximumTruncationLength = 1600;
|
||||||
|
noTruncationMaximumTruncationLength = 1e6;
|
||||||
|
stringWriter = createSingleLineStringWriter();
|
||||||
|
getScriptTargetFeatures = /* @__PURE__ */ memoize(
|
|
@ -4,6 +4,11 @@ settings:
|
||||||
autoInstallPeers: true
|
autoInstallPeers: true
|
||||||
excludeLinksFromLockfile: false
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
|
patchedDependencies:
|
||||||
|
monaco-editor@0.52.0:
|
||||||
|
hash: etwqtd55ssq6d52kxjt3dxlzre
|
||||||
|
path: patches/monaco-editor@0.52.0.patch
|
||||||
|
|
||||||
importers:
|
importers:
|
||||||
|
|
||||||
.:
|
.:
|
||||||
|
@ -100,13 +105,13 @@ importers:
|
||||||
version: 2.3.0
|
version: 2.3.0
|
||||||
monaco-editor:
|
monaco-editor:
|
||||||
specifier: 0.52.0
|
specifier: 0.52.0
|
||||||
version: 0.52.0
|
version: 0.52.0(patch_hash=etwqtd55ssq6d52kxjt3dxlzre)
|
||||||
monaco-editor-core:
|
monaco-editor-core:
|
||||||
specifier: 0.52.0
|
specifier: 0.52.0
|
||||||
version: 0.52.0
|
version: 0.52.0
|
||||||
monaco-editor-textmate:
|
monaco-editor-textmate:
|
||||||
specifier: ^4.0.0
|
specifier: ^4.0.0
|
||||||
version: 4.0.0(monaco-editor@0.52.0)(monaco-textmate@3.0.1(onigasm@2.2.5))
|
version: 4.0.0(monaco-editor@0.52.0(patch_hash=etwqtd55ssq6d52kxjt3dxlzre))(monaco-textmate@3.0.1(onigasm@2.2.5))
|
||||||
monaco-textmate:
|
monaco-textmate:
|
||||||
specifier: ^3.0.1
|
specifier: ^3.0.1
|
||||||
version: 3.0.1(onigasm@2.2.5)
|
version: 3.0.1(onigasm@2.2.5)
|
||||||
|
@ -5102,12 +5107,12 @@ snapshots:
|
||||||
|
|
||||||
monaco-editor-core@0.52.0: {}
|
monaco-editor-core@0.52.0: {}
|
||||||
|
|
||||||
monaco-editor-textmate@4.0.0(monaco-editor@0.52.0)(monaco-textmate@3.0.1(onigasm@2.2.5)):
|
monaco-editor-textmate@4.0.0(monaco-editor@0.52.0(patch_hash=etwqtd55ssq6d52kxjt3dxlzre))(monaco-textmate@3.0.1(onigasm@2.2.5)):
|
||||||
dependencies:
|
dependencies:
|
||||||
monaco-editor: 0.52.0
|
monaco-editor: 0.52.0(patch_hash=etwqtd55ssq6d52kxjt3dxlzre)
|
||||||
monaco-textmate: 3.0.1(onigasm@2.2.5)
|
monaco-textmate: 3.0.1(onigasm@2.2.5)
|
||||||
|
|
||||||
monaco-editor@0.52.0: {}
|
monaco-editor@0.52.0(patch_hash=etwqtd55ssq6d52kxjt3dxlzre): {}
|
||||||
|
|
||||||
monaco-textmate@3.0.1(onigasm@2.2.5):
|
monaco-textmate@3.0.1(onigasm@2.2.5):
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
24
vendor/chobitsu.patch
vendored
24
vendor/chobitsu.patch
vendored
|
@ -36,17 +36,35 @@ index 1dd6e97..0ea8300 100644
|
||||||
runIfWaitingForDebugger: noop,
|
runIfWaitingForDebugger: noop,
|
||||||
})
|
})
|
||||||
diff --git a/src/lib/evaluate.ts b/src/lib/evaluate.ts
|
diff --git a/src/lib/evaluate.ts b/src/lib/evaluate.ts
|
||||||
index 0732a13..f0abcce 100644
|
index 0732a13..b8f41ae 100644
|
||||||
--- a/src/lib/evaluate.ts
|
--- a/src/lib/evaluate.ts
|
||||||
+++ b/src/lib/evaluate.ts
|
+++ b/src/lib/evaluate.ts
|
||||||
@@ -44,14 +44,14 @@ export function setGlobal(name: string, val: any) {
|
@@ -44,15 +44,34 @@ export function setGlobal(name: string, val: any) {
|
||||||
global[name] = val
|
global[name] = val
|
||||||
}
|
}
|
||||||
|
|
||||||
-export default function evaluate(expression: string) {
|
-export default function evaluate(expression: string) {
|
||||||
|
+const createdInEvalIdents: Set<string> = new Set()
|
||||||
+export default async function evaluate(expression: string) {
|
+export default async function evaluate(expression: string) {
|
||||||
let ret
|
let ret
|
||||||
|
|
||||||
|
+ // try to find variables that are declared in the expression
|
||||||
|
+ const vars = expression.match(/(?:;|^|\s)(?:const|let|var)\s+([a-zA-Z0-9_$]+)\s*=/g) ?? []
|
||||||
|
+ let varsInjectScript = ''
|
||||||
|
+ for (const var_ of vars) {
|
||||||
|
+ const name = var_.split(' ')[1].split('=')[0]
|
||||||
|
+ if (name in window && !createdInEvalIdents.has(name)) {
|
||||||
|
+ // avoid overriding existing globals
|
||||||
|
+ continue
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ createdInEvalIdents.add(name)
|
||||||
|
+ // todo: we should probably also handle multiple declarations but who even uses that?
|
||||||
|
+ varsInjectScript += `try{window[${JSON.stringify(name)}]=${name}}catch{};`
|
||||||
|
+ }
|
||||||
|
+ if (varsInjectScript) {
|
||||||
|
+ expression += ';' + varsInjectScript
|
||||||
|
+ }
|
||||||
injectGlobal()
|
injectGlobal()
|
||||||
try {
|
try {
|
||||||
- ret = eval.call(window, `(${expression})`)
|
- ret = eval.call(window, `(${expression})`)
|
||||||
|
@ -55,8 +73,10 @@ index 0732a13..f0abcce 100644
|
||||||
- ret = eval.call(window, expression)
|
- ret = eval.call(window, expression)
|
||||||
+ ret = await eval.call(window, `(async () => {${expression}})()`)
|
+ ret = await eval.call(window, `(async () => {${expression}})()`)
|
||||||
}
|
}
|
||||||
|
+
|
||||||
clearGlobal()
|
clearGlobal()
|
||||||
|
|
||||||
|
return ret
|
||||||
diff --git a/src/lib/objManager.ts b/src/lib/objManager.ts
|
diff --git a/src/lib/objManager.ts b/src/lib/objManager.ts
|
||||||
index ff6a9e3..d79cdd6 100644
|
index ff6a9e3..d79cdd6 100644
|
||||||
--- a/src/lib/objManager.ts
|
--- a/src/lib/objManager.ts
|
||||||
|
|
Loading…
Reference in a new issue