From 6ded2c2050c07bd9064789bbd64a5e1aa8907ff6 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 1 Dec 2023 12:32:42 +0100 Subject: [PATCH] syndicate-browser-compiler.js --- packages/compiler/package.json | 2 +- .../compiler/syndicate-browser-compiler.js | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 packages/compiler/syndicate-browser-compiler.js diff --git a/packages/compiler/package.json b/packages/compiler/package.json index 8d62600..2eaa7d6 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -12,7 +12,7 @@ "url": "https://git.syndicate-lang.org/syndicate-lang/syndicate-js" }, "scripts": { - "prepare": "yarn compile && yarn rollup", + "prepare": "yarn compile && yarn rollup && cp syndicate-browser-compiler.js dist/", "compile": "../../node_modules/.bin/tsc", "compile:watch": "../../node_modules/.bin/tsc -w", "rollup": "../../node_modules/.bin/rollup -c", diff --git a/packages/compiler/syndicate-browser-compiler.js b/packages/compiler/syndicate-browser-compiler.js new file mode 100644 index 0000000..fe15ccf --- /dev/null +++ b/packages/compiler/syndicate-browser-compiler.js @@ -0,0 +1,38 @@ +/// SPDX-License-Identifier: GPL-3.0-or-later +/// SPDX-FileCopyrightText: Copyright © 2023 Tony Garnock-Jones + +const __SYNDICATE__ = Syndicate; + +(() => { + async function translateScripts() { + + const syndicateScripts = + Array.from(document.getElementsByTagName('script')) + .filter(s => s.type === 'text/javascript+syndicate'); + + for (const script of syndicateScripts) { + const sourceUrl = script.src || script.getAttribute('data-src') || false; + const sourceCode = sourceUrl ? await (await fetch(sourceUrl)).text() : script.innerHTML; + + const compilationResult = SyndicateCompiler.compile({ + name: sourceUrl || 'anonymous-script-tag', + source: sourceCode, + module: 'none', + runtime: 'Syndicate', + emitError: console.error, + }); + + const sourceMap = { ... compilationResult.map }; + sourceMap.sourcesContent = [sourceCode]; + const formattedSourceMap = '\n//# sourceMappingURL=data:application/json;base64,' + + Syndicate.Bytes.from(JSON.stringify(sourceMap)).toBase64(); + const finalOutput = compilationResult.text + formattedSourceMap; + + const replacement = document.createElement('script'); + replacement.text = finalOutput; + script.parentNode.replaceChild(replacement, script); + } + } + + window.addEventListener('DOMContentLoaded', translateScripts); +})();