Merge branch 'main' of raspberrypi.local:~/Projects/dandelion

This commit is contained in:
“bobbydigitales”
2024-03-24 22:58:57 -07:00
12 changed files with 110 additions and 21 deletions

2
db.js

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -99,6 +99,7 @@
#log { #log {
font-family: monospace; font-family: monospace;
text-wrap: nowrap;
} }
.button { .button {

BIN
main

Binary file not shown.

45
main.go
View File

@@ -1,3 +1,45 @@
// TODO
// 1. Convery network messages to flatbuffers so we don't need to parse JSON in Go.
// Use binary WS messages. Generate for Go and JS and use that everywhere. We can
// also use this for WebRTC messages.
// 2. Keep a list of all nodes that bootstrapped in the last N minutes.
// 3. When a node bootstraps, send it a random list of the nodes we know about.
// 4. Do the signalling to connect those nodes.
// 5. Each node will know about N other nodes. To find get the data for a feed,
// a node will need to find another node that has that data. To do that we'll need to
// implement a search message that is sent to all currently connected nodes, and they
// forward to all their nodes, passing back the address of the node that has the data.
// Once we find it, we'll do the signalling to connect to it via Web RTC via our existing connected nodes.
// -----
// Feeds. People can curate feeds which can be any combination of hashtags, serch terms and users.
// Invite-only communities. Just block everyone else even if they post to it.
// Limit to friends and friends of friends
// MVP
// You connect to the person you want to get the post from to get the post
// they give you the post
// If they're offline, you can't get their updates.
// This is very stupid, but it's simplest thing.
// The bootstrap server connects you to them directly via WebRTC
// This will make the thing actually function as a little toy for people to play with.
// This will let us test whether background tabs respond to webrtc requests.
// THEN
// Need to have identity sorted out
// When you read someone's posts, you also cache them locally
// cache priority goes mutuals->people you follow->people who you folllow, follow, so you're always
// caching your mutual's posts
// Posts are samll, so caching per-post will work fine.
// Then the process is for the bootstrap server to remember all nodes and what they're caching
// This will allow distributed content delivery but put a memory and bendwidth strain on the
// bootstrap sever. Look into Web Transport for the raspberry pi overhead. Could buy a few more RPIs
// and make a little cluster
// Domain name so we can get a certificate and serve HTTPS / HTTP3
// Think about compiling Typescript on initial access and caching the JS in a service worker
// so you don't need a build system to change things.
// Think about self-hosting the client so the system can be completely self-hosted
package main package main
import ( import (
@@ -34,6 +76,7 @@ func handleWebSocket(w http.ResponseWriter, r *http.Request) {
break break
} }
log.Printf("recv: %s", message) log.Printf("recv: %s", message)
err = conn.WriteMessage(mt, message) err = conn.WriteMessage(mt, message)
if err != nil { if err != nil {
log.Println("Write error:", err) log.Println("Write error:", err)
@@ -73,7 +116,7 @@ func noDirListing(h http.Handler, root string) http.HandlerFunc {
func main() { func main() {
dir := "./" dir := "./"
port := 80 port := 6789
addr := ":" + strconv.Itoa(port) addr := ":" + strconv.Itoa(port)
log.Printf("Starting server on %s", addr) log.Printf("Starting server on %s", addr)

31
main.js

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{ {
"devDependencies": { "devDependencies": {
"typescript": "^5.2.2" "typescript": "^5.4.3"
} }
} }

View File

@@ -40,6 +40,21 @@ class Post {
} }
} }
window.addEventListener('scroll', () => {
// Total height of the document
const totalPageHeight = document.body.scrollHeight;
// Current scroll position
const scrollPoint = window.scrollY + window.innerHeight;
// Check if scrolled to bottom
if (scrollPoint >= totalPageHeight) {
console.log('Scrolled to the bottom!');
console.log(scrollPoint, totalPageHeight);
// You can perform your action here
}
});
function initMarkdown() { function initMarkdown() {
const renderer = new marked.Renderer(); const renderer = new marked.Renderer();
@@ -254,6 +269,8 @@ function connectWebsocket(userID: string) {
websocket.onopen = function (evt) { websocket.onopen = function (evt) {
log("Websocket: CONNECTED"); log("Websocket: CONNECTED");
websocket.send(`{"messageType":"connect", "id": "${userID}"}`); websocket.send(`{"messageType":"connect", "id": "${userID}"}`);
let websocketPingInterval = window.setInterval(()=>{websocket.send(`{"messageType":"ping", "id": "${userID}"}`);}, 5000)
}; };
websocket.onclose = function (evt) { websocket.onclose = function (evt) {
@@ -271,15 +288,24 @@ function connectWebsocket(userID: string) {
return websocket; return websocket;
} }
function setFont(fontName: string) { function setFont(fontName: string, fontSize: string) {
let content = document.getElementById('content');
if (!content) {
return;
}
content.style.fontFamily = fontName;
content.style.fontSize = fontSize;
document.body.style.fontFamily = fontName;
let textArea = document.getElementById('textarea_post'); let textArea = document.getElementById('textarea_post');
if (!textArea) { if (!textArea) {
return; return;
} }
textArea.style.fontFamily = fontName; textArea.style.fontFamily = fontName;
textArea.style.fontSize = fontSize;
} }
function initOffline() { function initOffline() {
@@ -297,8 +323,8 @@ function initButtons(userID: string, posts: Post[]) {
let font1Button = document.getElementById("button_font1") as HTMLButtonElement; let font1Button = document.getElementById("button_font1") as HTMLButtonElement;
let font2Button = document.getElementById("button_font2") as HTMLButtonElement; let font2Button = document.getElementById("button_font2") as HTMLButtonElement;
font1Button.addEventListener('click', () => { setFont('Bookerly'); }); font1Button.addEventListener('click', () => { setFont('Bookerly', '16px') });
font2Button.addEventListener('click', () => { setFont('Virgil') }); font2Button.addEventListener('click', () => { setFont('Virgil', '24px') });
let postButton = document.getElementById("button_post") as HTMLButtonElement; let postButton = document.getElementById("button_post") as HTMLButtonElement;
@@ -351,7 +377,7 @@ async function main() {
log(`Persisted storage granted: ${isPersisted}`); log(`Persisted storage granted: ${isPersisted}`);
} }
log(`Persisted: ${(await navigator.storage.persisted()).toString()}`); log(`Persisted: ${(await navigator?.storage?.persisted())?.toString()}`);
initMarkdown(); initMarkdown();

2
sw.js
View File

@@ -51,4 +51,4 @@ addEventListener("message", async (e) => {
break; break;
} }
}); });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvc3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlCQUF5QjtBQUN6QixNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztBQUV2QyxNQUFNLGNBQWMsR0FBRztJQUN2QixhQUFhO0lBQ2IsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixjQUFjO0NBQ2IsQ0FBQztBQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFLLEVBQUUsRUFBRTtJQUN6QyxDQUFDLENBQUMsU0FBUyxDQUNULENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDVixNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCxxREFBcUQsRUFDckQsY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBSyxFQUFFLEVBQUU7SUFDdkMsQ0FBQyxDQUFDLFdBQVcsQ0FDWCxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ1YsTUFBTSxDQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sQ0FBQyxHQUFHLENBQ1QsNENBQTRDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQzVELENBQUM7WUFDRixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCw4REFBOEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDOUUsQ0FBQztZQUVGLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakI7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCw4Q0FBOEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDOUQsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7U0FDOUQ7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkMsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUM7QUFFSCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDbkIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUM5RCxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdEMsTUFBTTtLQUNUO0FBQ0gsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFc3RhYmxpc2ggYSBjYWNoZSBuYW1lXG5jb25zdCBjYWNoZU5hbWUgPSBcImRhbmRlbGlvbl9jYWNoZV92MVwiO1xuXG5jb25zdCBjb250ZW50VG9DYWNoZSA9IFtcblwiL2luZGV4Lmh0bWxcIixcblwiL21haW4uanNcIixcblwiL21hcmtlZC5taW4uanNcIixcblwiL2RiLmpzXCIsXG5cIi9ib29rZXJseS53b2ZmMlwiLFxuXCIvdmlyZ2lsLndvZmYyXCIsXG5cIi9mYXZpY29uLmljb1wiXG5dO1xuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnN0YWxsXCIsIChlOmFueSkgPT4ge1xuICBlLndhaXRVbnRpbChcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBjYWNoZXMub3BlbihjYWNoZU5hbWUpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiW1NlcnZpY2UgV29ya2VyXSBDYWNoaW5nIGFsbDogYXBwIHNoZWxsIGFuZCBjb250ZW50XCIsXG4gICAgICAgIGNvbnRlbnRUb0NhY2hlXG4gICAgICApO1xuICAgICAgYXdhaXQgY2FjaGUuYWRkQWxsKGNvbnRlbnRUb0NhY2hlKTtcbiAgICB9KSgpXG4gICk7XG59KTtcblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKFwiZmV0Y2hcIiwgKGU6YW55KSA9PiB7XG4gIGUucmVzcG9uZFdpdGgoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBjYWNoZXMubWF0Y2goZS5yZXF1ZXN0KTtcbiAgICAgIGlmIChyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBbU2VydmljZSBXb3JrZXJdIENhY2hlIGhpdCBmb3IgcmVzb3VyY2U6ICR7ZS5yZXF1ZXN0LnVybH1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgW1NlcnZpY2UgV29ya2VyXSBDYWNoZSBtaXNzLCBhdHRlbXB0aW5nIHRvIGZldGNoIHJlc291cmNlOiAke2UucmVxdWVzdC51cmx9YFxuICAgICAgICApO1xuXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZS5yZXF1ZXN0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBjYWNoZXMub3BlbihjYWNoZU5hbWUpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbU2VydmljZSBXb3JrZXJdIEFkZGluZyByZXNvdXJjZSB0byBjYWNoZTogJHtlLnJlcXVlc3QudXJsfWBcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcmVzb3VyY2U6ICR7ZS5yZXF1ZXN0LnVybH1gKVxuICAgICAgfVxuICAgICAgY2FjaGUucHV0KGUucmVxdWVzdCwgcmVzcG9uc2UuY2xvbmUoKSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSkoKVxuICApO1xufSk7XG5cbmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jIChlKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBNZXNzYWdlIHJlY2VpdmVkOiAke2UuZGF0YX1gKTtcblxuICBzd2l0Y2ggKGUuZGF0YS50eXBlKSB7XG4gICAgY2FzZSBcInVwZGF0ZU1haW5cIjpcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oY2FjaGVOYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmljZSBXb3JrZXJdIENhY2hpbmcgbmV3IHJlc291cmNlOiBtYWluLmpzYCk7XG4gICAgICBjYWNoZS5wdXQoXCIvbWFpbi5qc1wiLCBuZXcgUmVzcG9uc2UoKSk7XG4gICAgICBicmVhaztcbiAgfVxufSk7XG4iXX0= //# sourceMappingURL=sw.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"sw.js","sourceRoot":"","sources":["src/sw.ts"],"names":[],"mappings":";AAAA,yBAAyB;AACzB,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAEvC,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAEnE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAK,EAAE,EAAE;IACzC,CAAC,CAAC,SAAS,CACT,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CACT,qDAAqD,EACrD,cAAc,CACf,CAAC;QACF,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC,EAAE,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAK,EAAE,EAAE;IACvC,CAAC,CAAC,WAAW,CACX,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE;YACL,OAAO,CAAC,GAAG,CACT,4CAA4C,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC5D,CAAC;YACF,OAAO,CAAC,CAAC;SACV;QAED,IAAI,QAAQ,CAAC;QACb,IAAI;YACF,OAAO,CAAC,GAAG,CACT,8DAA8D,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC9E,CAAC;YAEF,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACnC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;QACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CACT,8CAA8C,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC9D,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;SAC9D;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,EAAE,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3C,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;QACnB,KAAK,YAAY;YACf,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;YACtC,MAAM;KACT;AACH,CAAC,CAAC,CAAC"} {"version":3,"file":"sw.js","sourceRoot":"","sources":["src/sw.ts"],"names":[],"mappings":";AAAA,yBAAyB;AACzB,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAEvC,MAAM,cAAc,GAAG;IACvB,aAAa;IACb,UAAU;IACV,gBAAgB;IAChB,QAAQ;IACR,iBAAiB;IACjB,eAAe;IACf,cAAc;CACb,CAAC;AAEF,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAK,EAAE,EAAE;IACzC,CAAC,CAAC,SAAS,CACT,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CACT,qDAAqD,EACrD,cAAc,CACf,CAAC;QACF,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC,EAAE,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAK,EAAE,EAAE;IACvC,CAAC,CAAC,WAAW,CACX,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC;YACN,OAAO,CAAC,GAAG,CACT,4CAA4C,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC5D,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CACT,8DAA8D,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC9E,CAAC;YAEF,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CACT,8CAA8C,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC9D,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC/D,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,EAAE,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3C,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY;YACf,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;YACtC,MAAM;IACV,CAAC;AACH,CAAC,CAAC,CAAC"}

View File

@@ -12,7 +12,7 @@
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */ // "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./", /* Redirect output structure to the directory. */ "outDir": "./", /* Redirect output structure to the directory. */
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
@@ -58,8 +58,8 @@
/* Source Map Options */ /* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
"inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
"inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */ /* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */