Compare commits

..

No commits in common. "efbb7c0b11e6fe56d286546768ac8c4823466612" and "93a76115542cd479870842985b56694f7fe90a95" have entirely different histories.

10 changed files with 18 additions and 125 deletions

View file

@ -7,8 +7,7 @@
"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",
@ -27,10 +26,5 @@
"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"
}
} }
} }

View file

@ -8,12 +8,6 @@
<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>

View file

@ -52,7 +52,6 @@ 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)

View file

@ -1,4 +1,3 @@
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'
@ -11,50 +10,21 @@ 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 = `
@ -70,18 +40,11 @@ async function waitForElement(selector, container, waitForShadowRoot = false) {
} }
function hideBySelector(root, selector) { function hideBySelector(root, selector) {
const el = root.querySelector(selector); const el = root.shadowRoot.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);
@ -91,17 +54,16 @@ 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);
tabbedPane.shadowRoot.appendChild(document.querySelector('#inject-css-tab-pane')); hideBySelector(tabbedPane, '.tabbed-pane-header');
const consoleToolbar = await waitForElement('.console-main-toolbar', document.body); const consoleToolbar = await waitForElement('.console-main-toolbar', document.body);
hideBySelector(consoleToolbar.shadowRoot, 'devtools-issue-counter'); hideBySelector(consoleToolbar, '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(document.querySelector('#inject-css')); rootView.appendChild(injectCss);
// forward some keyboard shortcuts to the parent window // forward some keyboard shortcuts to the parent window
document.addEventListener('keydown', (e) => { document.addEventListener('keydown', (e) => {
@ -126,8 +88,6 @@ 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))
@ -141,7 +101,6 @@ 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)
@ -151,7 +110,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)}&dark=${colorMode() === 'dark'}`} src={`${url}#?embedded=${encodeURIComponent(location.origin)}`}
title="Devtools" title="Devtools"
class="absolute inset-0 block size-full" class="absolute inset-0 block size-full"
onLoad={handleLoad} onLoad={handleLoad}

View file

@ -13,9 +13,6 @@ 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'],

View file

@ -9,6 +9,10 @@ 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)

View file

@ -12,9 +12,6 @@ export default defineConfig((env): UserConfig => {
server: { server: {
port: 3001, port: 3001,
}, },
preview: {
port: 3001,
},
optimizeDeps: { optimizeDeps: {
exclude: ['@mtcute/wasm'], exclude: ['@mtcute/wasm'],
}, },

View file

@ -1,26 +0,0 @@
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(

View file

@ -4,11 +4,6 @@ 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:
.: .:
@ -105,13 +100,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(patch_hash=etwqtd55ssq6d52kxjt3dxlzre) version: 0.52.0
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(patch_hash=etwqtd55ssq6d52kxjt3dxlzre))(monaco-textmate@3.0.1(onigasm@2.2.5)) version: 4.0.0(monaco-editor@0.52.0)(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)
@ -5107,12 +5102,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(patch_hash=etwqtd55ssq6d52kxjt3dxlzre))(monaco-textmate@3.0.1(onigasm@2.2.5)): monaco-editor-textmate@4.0.0(monaco-editor@0.52.0)(monaco-textmate@3.0.1(onigasm@2.2.5)):
dependencies: dependencies:
monaco-editor: 0.52.0(patch_hash=etwqtd55ssq6d52kxjt3dxlzre) monaco-editor: 0.52.0
monaco-textmate: 3.0.1(onigasm@2.2.5) monaco-textmate: 3.0.1(onigasm@2.2.5)
monaco-editor@0.52.0(patch_hash=etwqtd55ssq6d52kxjt3dxlzre): {} monaco-editor@0.52.0: {}
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
View file

@ -36,35 +36,17 @@ 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..b8f41ae 100644 index 0732a13..f0abcce 100644
--- a/src/lib/evaluate.ts --- a/src/lib/evaluate.ts
+++ b/src/lib/evaluate.ts +++ b/src/lib/evaluate.ts
@@ -44,15 +44,34 @@ export function setGlobal(name: string, val: any) { @@ -44,14 +44,14 @@ 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})`)
@ -73,10 +55,8 @@ index 0732a13..b8f41ae 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