Site: deduplicate the CodeSandbox JS/TS sandbox define-API payload in index.jsx
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 75/100
- Tipo di issue
- Refactoring
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- node.js, react, typescript
- Ambito
- developer-experience, tooling
Direzione di ricerca
Leggi packages/tdesign-react/site/src/components/codesandbox/index.jsx e la specifica di regressione in packages/tdesign-react/site/test/codesandbox.test.mjs. Estrai il payload condiviso di CodeSandbox e il percorso della richiesta, mantenendo gli insiemi di file JS e TS, incluso il tsconfig.json condizionale. Esegui la specifica di test Node e conferma che la creazione riuscita della sandbox apra ancora l’URL restituito.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
packages/tdesign-react/site/src/components/codesandbox/index.jsx issues the CodeSandbox define request through two fully duplicated fetch blocks — one for TypeScript demos and one for JS demos — that differ only in file extensions (src/main.tsx vs src/main.jsx, src/demo.tsx vs src/demo.jsx, and the extra tsconfig.json for TS). Any future fix to the shared payload (manifest, index.html, styles, entry file) must be edited in two places and can silently drift apart.
Note: this issue is scoped to the index.jsx payload deduplication only; the separate ReactDOM.render -> createRoot template change in content.js is tracked elsewhere and is intentionally out of scope here.
Proposal
Extract a single shared code path that builds the file map (parameterized by the demo language for extensions and the conditional tsconfig.json) and posts it to https://codesandbox.io/api/v1/sandboxes/define?json=1, keeping identical filenames, identical shared files, and identical success behavior (opening https://codesandbox.io/s/<id>?file=/src/demo.<ext>).
Scope
Site only: packages/tdesign-react/site/src/components/codesandbox/index.jsx. No component API, type.ts, defaultProps.ts, or submodule changes.
Validation
Regression tests are pending — a node:test spec at packages/tdesign-react/site/test/codesandbox.test.mjs asserts a single define-API request path while preserving both JS and TS file sets; it currently fails on the duplicated baseline. Manual check: pnpm dev, open a component page, generate a JS and a TS demo sandbox and confirm identical payloads other than the language-specific files.
Executed reproduction
Baseline: 0701c679bd4608c5445ee7ce61d94b916c70e4da
{
"argv": [
"node",
"--test",
"packages/tdesign-react/site/test/codesandbox.test.mjs"
],
"exit_code": 1,
"output": "✖ CodeSandbox define API request is built once and shared for JS and TS demos (3.4059ms)\n✔ sandbox generation still supports both JS and TS demos (0.3662ms)\n✔ successful sandbox creation still opens the returned sandbox URL (0.1314ms)\nℹ tests 3\nℹ suites 0\nℹ pass 2\nℹ fail 1\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 128.971\n\n✖ failing tests:\n\ntest at packages\\tdesign-react\\site\\test\\codesandbox.test.mjs:15:1\n✖ CodeSandbox define API request is built once and shared for JS and TS demos (3.4059ms)\n AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\n \n 2 !== 1\n \n at TestContext.<anonymous> (file:///C:/Users/silver/Documents/github/oss-contributor/workspaces/Tencent--tdesign-react--hunt-2cafd23230c6/packages/tdesign-react/site/test/codesandbox.test.mjs:17:10)\n at Test.runInAsyncScope (node:async_hooks:226:14)\n at Test.run (node:internal/test_runner/test:1397:25)\n at Test.start (node:internal/test_runner/test:1257:17)\n at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {\n generatedMessage: true,\n code: 'ERR_ASSERTION',\n actual: 2,\n expected: 1,\n operator: 'strictEqual',\n diff: 'simple'\n }\n\n"
}
Regression test
New regression file: packages/tdesign-react/site/test/codesandbox.test.mjs
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import test from 'node:test';
const codesandboxDir = join(dirname(fileURLToPath(import.meta.url)), '../src/components/codesandbox');
const indexSource = readFileSync(join(codesandboxDir, 'index.jsx'), 'utf8');
// Regression: the CodeSandbox "define" request must be issued through a single
// shared code path. The baseline builds the whole fetch payload twice (once for
// `.tsx` demos, once for `.jsx` demos), so any template fix has to be edited in
// two places and can drift apart. On the unfixed source this assertion fails
// with `2 !== 1`.
test('CodeSandbox define API request is built once and shared for JS and TS demos', () => {
const occurrences = indexSource.match(/codesandbox\.io\/api\/v1\/sandboxes\/define/g) ?? [];
assert.equal(occurrences.length, 1);
});
// Boundaries of the refactor: deduplicating the payload must not drop support
// for either demo language or change what the action does on success.
test('sandbox generation still supports both JS and TS demos', () => {
// Language detection still drives which file names are posted.
assert.match(indexSource, /currentLangIndex|isTypeScriptDemo/);
assert.match(indexSource, /tsx/);
assert.match(indexSource, /jsx/);
// TS demos keep their tsconfig; JS demos still omit it.
assert.match(indexSource, /tsconfig\.json/);
// Every variant still ships the shared manifest, page and styles.
assert.match(indexSource, /'package\.json'/);
assert.match(indexSource, /'public\/index\.html'/);
assert.match(indexSource, /'src\/index\.css'/);
});
test('successful sandbox creation still opens the returned sandbox URL', () => {
assert.match(indexSource, /window\.open\(`https:\/\/codesandbox\.io\/s\//);
});
AI-assisted contribution.
- Lingua principale
- TypeScript
- Stelle
- 973
- Fork
- 379
- Merge medio
- 4g 7h
- PR unite (30g)
- 15
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di Tencent/tdesign-react
-
[Table] reserveSelectedRowOnPaginate=false 时表头全选包含其他页数据Forse già presa @dvd233 l’ha presa 32 giorni fa. Aperta🐞 bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
Tencent/tdesign-react#4416 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
[Dialog] 支持焦点落点可配置、Enter 键确认与焦点循环(含 DialogPlugin 对齐)Forse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta🐞 bug 💪🏻 enhancement in progress
Difficoltà 5/5 Più di una settimana Idoneità per principianti 18/100
Tencent/tdesign-react#4430 · 3 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
[Chatbot] 似乎不支持ag-ui中的interruptsForse di nuovo libera @LzhengH l’ha presa 52 giorni fa e non c’è nessuna pull request aperta. Aperta💪🏻 enhancement
Tencent/tdesign-react#4400 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
💪🏻 enhancement
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
Tencent/tdesign-react#4253 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
💪🏻 enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
Tencent/tdesign-react#4246 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di Tencent/tdesign-react
Issue simili
-
Add: Shop On TV SDApertacheck:passed streams:add
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
I maintainer di solito rispondono entro 1 giorno
-
bug implicit-state
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
book-layout.spec fails when the similar-books rail holds other projects' booksForse già presa @praetorianer777 l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
praetorianer777/GoTome#373 ·
I maintainer di solito rispondono entro 1 giorno
-
area:cards enhancement ready-for-agent
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
fil-donadoni/tolaria#8883 ·
I maintainer di solito rispondono entro 1 giorno
-
xsd:integer cast from a string rejects negative numbers, a leading + and surrounding whitespaceApertabug 🐛
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
comunica/comunica#1960 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno