build: ENG-06 support TS entries and preserve AMD globals

This commit is contained in:
Harvey Zhao committed 2026-09-10 21:47:10 +08:00
1 parent 771482426f
commit b53461da1c
23 files changed
+1046 -65

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Build compatibility probes</title>
</head>
<body>
<button id="worker">Run TypeScript worker probe</button>
<button id="amd">Run library AMD probes</button>
<pre id="result">Ready</pre>
<script src="/uncompiled/artplayer-plugin-build-probe/index.js"></script>
<script>
const result = document.querySelector('#result');
document.querySelector('#worker').onclick = async () => {
let worker;
try {
const probe = artplayerPluginBuildProbe({ label: 'browser' });
worker = probe.createWorker();
const reply = await new Promise((resolve, reject) => {
const timeout = setTimeout(() => reject(new Error('Worker response timed out')), 5000);
worker.onmessage = event => { clearTimeout(timeout); resolve(event.data); };
worker.onerror = event => { clearTimeout(timeout); reject(new Error(event.message)); };
worker.postMessage(41);
});
if (reply !== 42 || !probe.css.includes('#123abc') || !probe.svg.includes('<svg')) throw new Error('Resource result mismatch');
result.textContent = JSON.stringify({ status: 'passed', userAgent: navigator.userAgent, value: probe.value, label: probe.label, workerReply: reply, css: true, svg: true }, null, 2);
} catch (error) { result.textContent = JSON.stringify({ status: 'failed', error: String(error) }); }
finally { if (worker) worker.terminate(); }
};
document.querySelector('#amd').onclick = async () => {
const reports = [];
try {
const packages = await (await fetch('/build-packages.json')).json();
if (packages.length !== 21 || new Set(packages).size !== 21 || !packages.includes('artplayer')) throw new Error('Incomplete library inventory');
for (const name of packages) {
for (const extension of ['.js', '.legacy.js']) {
const frame = document.createElement('iframe');
frame.hidden = true;
document.body.append(frame);
try {
const scope = frame.contentWindow;
let exported;
let calls = 0;
scope.define = Object.assign(factory => { calls++; exported = factory(); }, { amd: true });
const script = frame.contentDocument.createElement('script');
const file = `/compiled/${name}${extension}`;
await new Promise((resolve, reject) => {
const timeout = setTimeout(() => reject(new Error(`Load timeout: ${file}`)), 10000);
script.onload = () => { clearTimeout(timeout); resolve(); };
script.onerror = () => { clearTimeout(timeout); reject(new Error(`Load failed: ${file}`)); };
script.src = file;
frame.contentDocument.body.append(script);
});
const global = name === 'artplayer' || name.startsWith('artplayer-tool-')
? name.replace(/(^|-)([a-z])/g, (_, prefix, letter) => letter.toUpperCase())
: name.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
reports.push({ name, extension, passed: calls === 1 && exported !== undefined && exported === scope[global] });
} finally { frame.remove(); }
}
}
result.textContent = JSON.stringify({ status: reports.every(item => item.passed) ? 'passed' : 'failed', userAgent: navigator.userAgent, reports }, null, 2);
} catch (error) { result.textContent = JSON.stringify({ status: 'failed', reports, error: String(error) }); }
};
</script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"><path d="M0 0h10v10H0z"/></svg>

After

Width:  |  Height:  |  Size: 92 B

+18
View File
@@ -0,0 +1,18 @@
import css from './style.less?inline'
import svg from './icon.svg?raw'
import InlineWorker from './worker.ts?worker&inline'
import { add } from './shared.js'
interface Options {
label?: string
}
export default function buildProbe(options: Options = {}) {
return {
label: options.label ?? 'default',
value: add(20, 22),
css,
svg,
createWorker: () => new InlineWorker(),
}
}
+1
View File
@@ -0,0 +1 @@
export const add = (left, right) => left + right
+2
View File
@@ -0,0 +1,2 @@
@accent: #123abc;
.build-probe { color: @accent; }
+3
View File
@@ -0,0 +1,3 @@
self.onmessage = (event: MessageEvent<number>) => {
self.postMessage(event.data + 1)
}