beginning annotation with typescript

This commit is contained in:
Jack Case
2025-10-27 19:57:18 +00:00
parent 7effbbc900
commit ca0b79b6c8
5 changed files with 43 additions and 21 deletions

View File

@@ -0,0 +1,6 @@
{
"image": "mcr.microsoft.com/devcontainers/universal:2",
"features": {
"ghcr.io/devcontainers-community/npm-features/typescript:1": {}
}
}

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
scripts/

View File

@@ -1,5 +1,12 @@
class SearchLink { class SearchLink {
constructor(link_node) {
node: Element
target: string
url: URL
checked: boolean
result: any
constructor(link_node: Element) {
this.node = link_node this.node = link_node
this.target = link_node.getAttribute("href") this.target = link_node.getAttribute("href")
this.url = new URL(link_node.getAttribute("href")) this.url = new URL(link_node.getAttribute("href"))
@@ -10,7 +17,7 @@ class SearchLink {
class ResultLinks extends Map { class ResultLinks extends Map {
// map domains to paths and their associated nodes // map domains to paths and their associated nodes
set(domain, path, search_link) { setLink(domain: string, path: string, search_link: SearchLink) {
if(!super.get(domain)) { if(!super.get(domain)) {
const nested_map = new Map() const nested_map = new Map()
nested_map.set(path, search_link) nested_map.set(path, search_link)
@@ -20,27 +27,27 @@ class ResultLinks extends Map {
} }
} }
setNode(link_node) { setNode(link_node: Element) {
const search_link = new SearchLink(link_node) const search_link = new SearchLink(link_node)
this.set(search_link.url.hostname, search_link.url.pathname, search_link) this.setLink(search_link.url.hostname, search_link.url.pathname, search_link)
} }
get(domain, path="/") { get(domain: string, path: string = "/") {
return super.get(domain).get(path) return super.get(domain).get(path)
} }
getDomain(domain) { getDomain(domain: string) {
return super.get(domain) return super.get(domain)
} }
getUrl(url) { getUrl(url: string) {
const urlobj = new URL(url) const urlobj = new URL(url)
return this.get(urlobj.hostname, urlobj.pathname) return this.get(urlobj.hostname, urlobj.pathname)
} }
getSearchLinks() { getSearchLinks() {
// return an iterator over the nested SearchLink objects // return an iterator over the nested SearchLink objects
const domain_value_iterator = super.values() const domain_value_iterator = super.values() as MapIterator<Map<string, SearchLink>>
const search_link_iterator = domain_value_iterator.flatMap((domain_map) => { const search_link_iterator = domain_value_iterator.flatMap((domain_map) => {
return domain_map.values() return domain_map.values()
}) })
@@ -52,12 +59,12 @@ class ResultLinks extends Map {
const ddg_result_selector = "a[data-testid=\"result-title-a\"" const ddg_result_selector = "a[data-testid=\"result-title-a\""
const ddg_result_list_selector = "ol.react-results--main" const ddg_result_list_selector = "ol.react-results--main"
let result_list_node let result_list_node: Element
let result_list_observer let result_list_observer
const page_links = new ResultLinks() const page_links = new ResultLinks()
function check_links(search_links) { function check_links(search_links: SearchLink[]) {
// send a message to background script with a list of URLs to check // send a message to background script with a list of URLs to check
const urls = search_links.map((search_link) => { const urls = search_links.map((search_link) => {
search_link.checked = true search_link.checked = true
@@ -116,7 +123,7 @@ function setup_result_observer() {
} }
async function wait_for_results() { async function wait_for_results() {
results = new Promise(async (resolve) => { let results = new Promise(async (resolve) => {
let node = document.querySelector(ddg_result_list_selector) let node = document.querySelector(ddg_result_list_selector)
while (!node) { while (!node) {
await new Promise((resolve) => {setTimeout(()=>{resolve()}, 100)}) await new Promise((resolve) => {setTimeout(()=>{resolve()}, 100)})

View File

@@ -1,5 +1,5 @@
const API_URL = "https://api.slopfarmer.jack-case.pro" const API_URL: string = "https://api.slopfarmer.jack-case.pro"
let access_token let access_token: string
const login_form = document.getElementById("login-form") const login_form = document.getElementById("login-form")
if(login_form) { if(login_form) {
@@ -44,9 +44,9 @@ function on_install_handler() {
setup_storage_db() setup_storage_db()
} }
async function get_slop_store(readwrite) { async function get_slop_store(readwrite: boolean) {
const slop_store_promise = new Promise((resolve, reject) => { const slop_store_promise: Promise<IDBObjectStore> = new Promise((resolve, reject) => {
const db_request = window.indexedDB.open("SlopDB", 1) const db_request = window.indexedDB.open("SlopDB", 1)
db_request.onsuccess = (event) => { db_request.onsuccess = (event) => {
@@ -63,7 +63,7 @@ async function get_slop_store(readwrite) {
return await slop_store_promise return await slop_store_promise
} }
async function insert_slop(domain, path) { async function insert_slop(domain: string, path: string) {
let db let db
const db_request = window.indexedDB.open("SlopDB", 1) const db_request = window.indexedDB.open("SlopDB", 1)
@@ -90,7 +90,7 @@ async function insert_slop(domain, path) {
// persist to indexeddb // persist to indexeddb
const store_request = slop_store.put(result) const store_request = slop_store.put(result)
store_request.onsuccess = (event) => { store_request.onsuccess = () => {
console.log(domain, path, "stored") console.log(domain, path, "stored")
} }
} }
@@ -109,7 +109,7 @@ async function insert_slop(domain, path) {
fetch(request) fetch(request)
} }
async function check_local_slop(url) { async function check_local_slop(url: string) {
const slop_url = new URL(url) const slop_url = new URL(url)
const slop_store = await get_slop_store(false) const slop_store = await get_slop_store(false)
const known_slop = new Promise((resolve, reject) => { const known_slop = new Promise((resolve, reject) => {
@@ -136,16 +136,16 @@ async function check_local_slop(url) {
return result return result
} }
async function check_remote_slop(urls) { async function check_remote_slop(urls: string[]) {
const check_url = new URL("/check", API_URL) const check_url = new URL("/check", API_URL)
const request = new Request(check_url, {method: "POST", headers: { "Content-Type": "application/json", "Bearer": get_access_token() }, body: JSON.stringify({slop_urls: urls})}) const request = new Request(check_url, {method: "POST", headers: { "Content-Type": "application/json", "Bearer": get_access_token() }, body: JSON.stringify({slop_urls: urls})})
const response = await fetch(request) const response = await fetch(request)
let domain_objects = await response.json() let domain_objects = await response.json()
domain_objects.forEach((domain) => {insert_slop(domain.domain_name, "/")}) domain_objects.forEach((domain: any) => {insert_slop(domain.domain_name, "/")})
return domain_objects return domain_objects
} }
async function on_button_clicked_handler(tab) { async function on_button_clicked_handler(tab: Tab) {
// insert the current tab's page into slop storage // insert the current tab's page into slop storage
const tab_url = new URL(tab.url) const tab_url = new URL(tab.url)

8
tsconfig.json Normal file
View File

@@ -0,0 +1,8 @@
{
"include": ["src/**/*"],
"compilerOptions": {
"outDir": "scripts",
"noImplicitAny": true,
"lib": ["ES2020", "DOM"]
}
}