diff --git a/implementations/javascript/packages/schema/package.json b/implementations/javascript/packages/schema/package.json index 7e619bf..ba8a8a4 100644 --- a/implementations/javascript/packages/schema/package.json +++ b/implementations/javascript/packages/schema/package.json @@ -15,7 +15,7 @@ "scripts": { "regenerate": "rm -rf ./src/gen && yarn copy-schema && ../schema-cli/bin/preserves-schema-ts.js --output ./src/gen ./dist:*.prs", "clean": "rm -rf lib dist", - "prepare": "yarn compile && yarn rollup && yarn copy-schema", + "prepare": "yarn compile && yarn rollup && yarn copy-schema && cp preserves-schema-browser.js dist/", "compile": "tsc", "compile:watch": "yarn compile -w", "rollup": "rollup -c", diff --git a/implementations/javascript/packages/schema/preserves-schema-browser.js b/implementations/javascript/packages/schema/preserves-schema-browser.js new file mode 100644 index 0000000..756bb1d --- /dev/null +++ b/implementations/javascript/packages/schema/preserves-schema-browser.js @@ -0,0 +1,100 @@ +(() => { + const I = new PreservesSchema.SchemaInterpreter(); + + globalThis.Schema = { __interpreter: I }; + let schemaReady; + globalThis.SchemaReady = new Promise(res => schemaReady = res); + + async function translateScripts() { + + const schemaScripts = + Array.from(document.getElementsByTagName('script')) + .filter(s => (s.type === 'text/preserves+schema' || + s.type === 'schema')); + + for (const script of schemaScripts) { + function complain(message, detail) { + const e = new Error(message); + e.script = script; + e.detail = detail; + console.error(e); + } + + let sourceCodeBlob; + const sourceUrl = script.src || script.getAttribute('data-src') || false; + if (sourceUrl) { + const res = await fetch(sourceUrl); + if (res.ok) { + sourceCodeBlob = new Uint8Array(await res.arrayBuffer()); + } else { + complain(`Failed to retrieve schema from ${sourceUrl}`, { res }); + continue; + } + } else { + sourceCodeBlob = new TextEncoder().encode(script.innerHTML); + } + + const schemaName = () => { + const n = script.getAttribute('name'); + if (n === null) complain(`