Merge branch 'master' into prettier

This commit is contained in:
2024-02-22 21:23:39 +01:00
2479 changed files with 4362 additions and 549539 deletions

View File

@ -12,7 +12,7 @@ let gOriginalInput;
let kErrorColor = '#dc322f';
let kStatusColor = '#fff';
/* Functions that server-side app code can call through the app object. */
// Functions that server-side app code can call through the app object.
const k_api = {
setDocument: {args: ['content'], func: api_setDocument},
postMessage: {args: ['message'], func: api_postMessage},
@ -24,6 +24,7 @@ const k_api = {
setHash: {args: ['hash'], func: api_setHash},
};
// TODO(tasiaiso): this is only used once, move it down ?
const k_global_style = css`
a:link {
color: #268bd2;
@ -42,6 +43,9 @@ const k_global_style = css`
}
`;
/**
* Class that represents the top bar
*/
class TfNavigationElement extends LitElement {
static get properties() {
return {
@ -63,6 +67,10 @@ class TfNavigationElement extends LitElement {
this.spark_lines = {};
}
/**
* TODOC
* @param {*} event
*/
toggle_edit(event) {
event.preventDefault();
if (editing()) {
@ -72,10 +80,20 @@ class TfNavigationElement extends LitElement {
}
}
/**
* TODOC
* @param {*} key
*/
reset_permission(key) {
send({action: 'resetPermission', permission: key});
}
/**
* TODOC
* @param {*} key
* @param {*} options
* @returns
*/
get_spark_line(key, options) {
if (!this.spark_lines[key]) {
let spark_line = document.createElement('tf-sparkline');
@ -94,6 +112,10 @@ class TfNavigationElement extends LitElement {
return this.spark_lines[key];
}
/**
* TODOC
* @returns
*/
render_login() {
if (this?.credentials?.session?.name) {
return html`<a id="login" href="/login/logout?return=${url() + hash()}"
@ -106,6 +128,10 @@ class TfNavigationElement extends LitElement {
}
}
/**
* TODOC
* @returns
*/
render_permissions() {
if (this.show_permissions) {
return html`
@ -137,6 +163,10 @@ class TfNavigationElement extends LitElement {
}
}
/**
* TODOC
* @returns
*/
render() {
let self = this;
return html`
@ -230,8 +260,12 @@ class TfNavigationElement extends LitElement {
`;
}
}
customElements.define('tf-navigation', TfNavigationElement);
/**
* TODOC
*/
class TfFilesElement extends LitElement {
static get properties() {
return {
@ -247,6 +281,10 @@ class TfFilesElement extends LitElement {
this.dropping = 0;
}
/**
* TODOC
* @param {*} file
*/
file_click(file) {
this.dispatchEvent(
new CustomEvent('file_click', {
@ -259,6 +297,11 @@ class TfFilesElement extends LitElement {
);
}
/**
* TODOC
* @param {*} file
* @returns
*/
render_file(file) {
let classes = ['file'];
if (file == this.current) {
@ -275,6 +318,10 @@ class TfFilesElement extends LitElement {
</div>`;
}
/**
* TODOC
* @param {*} event
*/
async drop(event) {
event.preventDefault();
event.stopPropagation();
@ -296,15 +343,27 @@ class TfFilesElement extends LitElement {
updateFiles();
}
/**
* TODOC
* @param {*} event
*/
drag_enter(event) {
this.dropping++;
event.preventDefault();
}
/**
* TODOC
* @param {*} event
*/
drag_leave(event) {
this.dropping--;
}
/**
* TODOC
* @returns
*/
render() {
let self = this;
return html`
@ -350,8 +409,12 @@ class TfFilesElement extends LitElement {
`;
}
}
customElements.define('tf-files', TfFilesElement);
/**
* TODOC
*/
class TfFilesPaneElement extends LitElement {
static get properties() {
return {
@ -367,11 +430,19 @@ class TfFilesPaneElement extends LitElement {
this.files = {};
}
/**
* TODOC
* @param {*} expanded
*/
set_expanded(expanded) {
this.expanded = expanded;
window.localStorage.setItem('files', expanded ? '1' : '0');
}
/**
* TODOC
* @returns
*/
render() {
let self = this;
let expander = this.expanded
@ -425,8 +496,12 @@ class TfFilesPaneElement extends LitElement {
`;
}
}
customElements.define('tf-files-pane', TfFilesPaneElement);
/**
* TODOC
*/
class TfSparkLineElement extends LitElement {
static get properties() {
return {
@ -444,6 +519,11 @@ class TfSparkLineElement extends LitElement {
this.k_values_max = 100;
}
/**
* TODOC
* @param {*} key
* @param {*} value
*/
append(key, value) {
let line = null;
for (let it of this.lines) {
@ -468,6 +548,11 @@ class TfSparkLineElement extends LitElement {
this.requestUpdate();
}
/**
* TODOC
* @param {*} line
* @returns
*/
render_line(line) {
if (line?.values?.length >= 2) {
let max = Math.max(this.max, ...line.values);
@ -481,6 +566,10 @@ class TfSparkLineElement extends LitElement {
}
}
/**
* TODOC
* @returns
*/
render() {
let max =
Math.round(
@ -503,8 +592,10 @@ class TfSparkLineElement extends LitElement {
`;
}
}
customElements.define('tf-sparkline', TfSparkLineElement);
// TODOC
window.addEventListener('keydown', function (event) {
if (event.keyCode == 83 && (event.altKey || event.ctrlKey)) {
if (editing()) {
@ -519,6 +610,12 @@ window.addEventListener('keydown', function (event) {
}
});
/**
* TODOC
* @param {*} nodes
* @param {*} callback
* @returns
*/
function ensureLoaded(nodes, callback) {
if (!nodes.length) {
callback();
@ -559,14 +656,26 @@ function ensureLoaded(nodes, callback) {
}
}
/**
* TODOC
* @returns
*/
function editing() {
return document.getElementById('editPane').style.display != 'none';
}
/**
* TODOC
* @returns
*/
function is_edit_only() {
return window.location.search == '?editonly=1' || window.innerWidth < 1024;
}
/**
* TODOC
* @returns
*/
async function edit() {
if (editing()) {
return;
@ -591,10 +700,18 @@ async function edit() {
}
}
/**
* TODOC
*/
function trace() {
window.open(`/speedscope/#profileURL=${encodeURIComponent('/trace')}`);
}
/**
* TODOC
* @param {*} name
* @returns
*/
function guessMode(name) {
return name.endsWith('.js')
? 'javascript'
@ -603,6 +720,12 @@ function guessMode(name) {
: null;
}
/**
* TODOC
* @param {*} name
* @param {*} id
* @returns
*/
function loadFile(name, id) {
return fetch('/' + id + '/view')
.then(function (response) {
@ -626,6 +749,11 @@ function loadFile(name, id) {
});
}
/**
* TODOC
* @param {*} path
* @returns
*/
async function load(path) {
let response = await fetch((path || url()) + 'view');
let json;
@ -663,16 +791,28 @@ async function load(path) {
return Promise.all(promises);
}
/**
* TODOC
*/
function closeEditor() {
window.localStorage.setItem('editing', '0');
document.getElementById('editPane').style.display = 'none';
document.getElementById('viewPane').style.display = 'flex';
}
/**
* TODOC
* @returns
*/
function explodePath() {
return /^\/~([^\/]+)\/([^\/]+)(.*)/.exec(window.location.pathname);
}
/**
* TODOC
* @param {*} save_to
* @returns
*/
function save(save_to) {
document.getElementById('save').disabled = true;
if (gCurrentFile) {
@ -778,6 +918,9 @@ function save(save_to) {
});
}
/**
* TODOC
*/
function changeIcon() {
let value = prompt('Enter a new app icon emoji:');
if (value !== undefined) {
@ -786,6 +929,9 @@ function changeIcon() {
}
}
/**
* TODOC
*/
function deleteApp() {
let name = document.getElementById('name');
let path = name && name.value ? name.value : url();
@ -804,6 +950,10 @@ function deleteApp() {
}
}
/**
* TODOC
* @returns
*/
function url() {
let hash = window.location.href.indexOf('#');
let question = window.location.href.indexOf('?');
@ -819,20 +969,36 @@ function url() {
: window.location.href;
}
/**
* TODOC
* @returns
*/
function hash() {
return window.location.hash != '#' ? window.location.hash : '';
}
/**
* TODOC
* @param {*} content
*/
function api_setDocument(content) {
let iframe = document.getElementById('document');
iframe.srcdoc = content;
}
/**
* TODOC
* @param {*} message
*/
function api_postMessage(message) {
let iframe = document.getElementById('document');
iframe.contentWindow.postMessage(message, '*');
}
/**
* TODOC
* @param {*} error
*/
function api_error(error) {
if (error) {
if (typeof error == 'string') {
@ -844,14 +1010,30 @@ function api_error(error) {
console.log('error', error);
}
/**
* TODOC
* @param {*} key
* @param {*} value
*/
function api_localStorageSet(key, value) {
window.localStorage.setItem('app:' + key, value);
}
/**
* TODOC
* @param {*} key
* @returns
*/
function api_localStorageGet(key) {
return window.localStorage.getItem('app:' + key);
}
/**
* TODOC
* @param {*} permission
* @param {*} id
* @returns
*/
function api_requestPermission(permission, id) {
let outer = document.createElement('div');
outer.classList.add('permissions');
@ -917,14 +1099,25 @@ function api_requestPermission(permission, id) {
});
}
/**
* TODOC
*/
function api_print() {
console.log('app>', ...arguments);
}
/**
* TODOC
* @param {*} hash
*/
function api_setHash(hash) {
window.location.hash = hash;
}
/**
* TODOC
* @param {*} message
*/
function _receive_websocket_message(message) {
if (message && message.action == 'session') {
setStatusMessage('🟢 Executing...', kStatusColor);
@ -1011,6 +1204,11 @@ function _receive_websocket_message(message) {
}
}
/**
* TODOC
* @param {*} message
* @param {*} color
*/
function setStatusMessage(message, color) {
document.getElementsByTagName('tf-navigation')[0].status = {
message: message,
@ -1018,6 +1216,10 @@ function setStatusMessage(message, color) {
};
}
/**
* TODOC
* @param {*} value
*/
function send(value) {
try {
if (gSocket && gSocket.readyState == gSocket.OPEN) {
@ -1028,6 +1230,13 @@ function send(value) {
}
}
/**
* TODOC
* @param {*} sourceData
* @param {*} maxWidth
* @param {*} maxHeight
* @param {*} callback
*/
function fixImage(sourceData, maxWidth, maxHeight, callback) {
let result = sourceData;
let image = new Image();
@ -1054,16 +1263,26 @@ function fixImage(sourceData, maxWidth, maxHeight, callback) {
image.src = sourceData;
}
/**
* TODOC
* @param {*} image
*/
function sendImage(image) {
fixImage(image, 320, 240, function (result) {
send({image: result});
});
}
/**
* TODOC
*/
function hashChange() {
send({event: 'hashChange', hash: window.location.hash});
}
/**
* TODOC
*/
function focus() {
if (gSocket && gSocket.readyState == gSocket.CLOSED) {
connectSocket();
@ -1072,12 +1291,19 @@ function focus() {
}
}
/**
* TODOC
*/
function blur() {
if (gSocket && gSocket.readyState == gSocket.OPEN) {
send({event: 'blur'});
}
}
/**
* TODOC
* @param {*} event
*/
function message(event) {
if (
event.data &&
@ -1123,6 +1349,10 @@ function message(event) {
}
}
/**
* TODOC
* @param {*} path
*/
function reconnect(path) {
let oldSocket = gSocket;
gSocket = null;
@ -1135,6 +1365,10 @@ function reconnect(path) {
connectSocket(path);
}
/**
* TODOC
* @param {*} path
*/
function connectSocket(path) {
if (!gSocket || gSocket.readyState != gSocket.OPEN) {
if (gSocket) {
@ -1194,6 +1428,10 @@ function connectSocket(path) {
}
}
/**
* TODOC
* @param {*} name
*/
function openFile(name) {
let newDoc =
name && gFiles[name]
@ -1216,6 +1454,9 @@ function openFile(name) {
gEditor.focus();
}
/**
* TODOC
*/
function updateFiles() {
let files = document.getElementsByTagName('tf-files-pane')[0];
if (files) {
@ -1235,6 +1476,10 @@ function updateFiles() {
gEditor.focus();
}
/**
* TODOC
* @param {*} name
*/
function makeNewFile(name) {
gFiles[name] = {
doc: cm6.EditorState.create({extensions: cm6.extensions}),
@ -1242,6 +1487,9 @@ function makeNewFile(name) {
openFile(name);
}
/**
* TODOC
*/
function newFile() {
let name = prompt('Name of new file:', 'file.js');
if (name && !gFiles[name]) {
@ -1249,6 +1497,9 @@ function newFile() {
}
}
/**
* TODOC
*/
function removeFile() {
if (confirm('Remove ' + gCurrentFile + '?')) {
delete gFiles[gCurrentFile];
@ -1256,6 +1507,9 @@ function removeFile() {
}
}
/**
* TODOC
*/
async function appExport() {
let JsZip = (await import('/static/jszip.min.js')).default;
let owner = window.location.pathname.split('/')[1].replace('~', '');
@ -1284,6 +1538,12 @@ async function appExport() {
a.click();
}
/**
* TODOC
* @param {*} name
* @param {*} file
* @returns
*/
async function save_file_to_blob_id(name, file) {
console.log(`Saving ${name}.`);
let response = await fetch('/save', {
@ -1305,6 +1565,9 @@ async function save_file_to_blob_id(name, file) {
return blob_id;
}
/**
* TODOC
*/
async function appImport() {
let JsZip = (await import('/static/jszip.min.js')).default;
let input = document.createElement('input');
@ -1373,6 +1636,9 @@ async function appImport() {
};
}
/**
*
*/
async function sourcePretty() {
let prettier = (await import('/prettier/standalone.mjs')).default;
let babel = (await import('/prettier/babel.mjs')).default;
@ -1394,6 +1660,7 @@ async function sourcePretty() {
}
}
// TODOC
window.addEventListener('load', function () {
window.addEventListener('hashchange', hashChange);
window.addEventListener('focus', focus);