mirror of
https://github.com/ItsVipra/ProToots
synced 2024-11-13 23:47:12 +00:00
Add type definitions based on JSDoc types
This commit is contained in:
parent
65d808b59b
commit
bc1a6a72f5
7 changed files with 39 additions and 26 deletions
|
@ -10,7 +10,7 @@ const cacheMaxAge = 24 * 60 * 60 * 1000; // time after which cached pronouns sho
|
||||||
* @param {string} account The account ID
|
* @param {string} account The account ID
|
||||||
* @param {string} pronouns The pronouns to cache.
|
* @param {string} pronouns The pronouns to cache.
|
||||||
*/
|
*/
|
||||||
export async function cachePronouns(account, pronouns) {
|
export async function cachePronouns(account: string, pronouns: string) {
|
||||||
let cache = {};
|
let cache = {};
|
||||||
try {
|
try {
|
||||||
cache = await storage.local.get();
|
cache = await storage.local.get();
|
||||||
|
@ -38,7 +38,7 @@ export async function cachePronouns(account, pronouns) {
|
||||||
* @param {string} accountName
|
* @param {string} accountName
|
||||||
* @returns {Promise<string>} Account's cached pronouns, or null if not saved or stale
|
* @returns {Promise<string>} Account's cached pronouns, or null if not saved or stale
|
||||||
*/
|
*/
|
||||||
export async function getPronouns(accountName) {
|
export async function getPronouns(accountName: string): Promise<string> {
|
||||||
const fallback = { pronounsCache: {} };
|
const fallback = { pronounsCache: {} };
|
||||||
let cacheResult;
|
let cacheResult;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* @param {Node} node
|
* @param {Node} node
|
||||||
* @return {Node[]} Array containing the root node and all its descendants
|
* @return {Node[]} Array containing the root node and all its descendants
|
||||||
*/
|
*/
|
||||||
export function findAllDescendants(node) {
|
export function findAllDescendants(node: Node): Node[] {
|
||||||
return [node, ...node.childNodes, ...[...node.childNodes].flatMap((n) => findAllDescendants(n))];
|
return [node, ...node.childNodes, ...[...node.childNodes].flatMap((n) => findAllDescendants(n))];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ export function findAllDescendants(node) {
|
||||||
* @param {string[]} cl The class(es) to check for.
|
* @param {string[]} cl The class(es) to check for.
|
||||||
* @returns Whether the classList contains the class.
|
* @returns Whether the classList contains the class.
|
||||||
*/
|
*/
|
||||||
export function hasClasses(element, ...cl) {
|
export function hasClasses(element: HTMLElement, ...cl: string[]) {
|
||||||
const classList = element.classList;
|
const classList = element.classList;
|
||||||
if (!classList || !cl) return false;
|
if (!classList || !cl) return false;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ export function hasClasses(element, ...cl) {
|
||||||
* @param {(el: Element) => void} callback
|
* @param {(el: Element) => void} callback
|
||||||
* @copyright CC-BY-SA 4.0 wOxxoM https://stackoverflow.com/a/71488320
|
* @copyright CC-BY-SA 4.0 wOxxoM https://stackoverflow.com/a/71488320
|
||||||
*/
|
*/
|
||||||
export function waitForElement(node, selector, callback) {
|
export function waitForElement(node: Element, selector: string, callback: (el: Element) => void) {
|
||||||
let el = node.querySelector(selector);
|
let el = node.querySelector(selector);
|
||||||
if (el) {
|
if (el) {
|
||||||
callback(el);
|
callback(el);
|
||||||
|
@ -60,7 +60,11 @@ export function waitForElement(node, selector, callback) {
|
||||||
* @param {(el: Element) => void} callback
|
* @param {(el: Element) => void} callback
|
||||||
* @copyright CC-BY-SA 4.0 wOxxoM https://stackoverflow.com/a/71488320
|
* @copyright CC-BY-SA 4.0 wOxxoM https://stackoverflow.com/a/71488320
|
||||||
*/
|
*/
|
||||||
export function waitForElementRemoved(node, selector, callback) {
|
export function waitForElementRemoved(
|
||||||
|
node: Element,
|
||||||
|
selector: string,
|
||||||
|
callback: (el: Element) => void,
|
||||||
|
) {
|
||||||
let el = node.querySelector(selector);
|
let el = node.querySelector(selector);
|
||||||
if (!el) {
|
if (!el) {
|
||||||
callback(el);
|
callback(el);
|
||||||
|
@ -81,7 +85,7 @@ export function waitForElementRemoved(node, selector, callback) {
|
||||||
* @param {HTMLElement} insertion Element to insert
|
* @param {HTMLElement} insertion Element to insert
|
||||||
* @param {HTMLElement} target Element, which insertion is placed after
|
* @param {HTMLElement} target Element, which insertion is placed after
|
||||||
*/
|
*/
|
||||||
export function insertAfter(insertion, target) {
|
export function insertAfter(insertion: HTMLElement, target: HTMLElement) {
|
||||||
//docs: https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore#example_2
|
//docs: https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore#example_2
|
||||||
target.parentElement.insertBefore(insertion, target.nextSibling);
|
target.parentElement.insertBefore(insertion, target.nextSibling);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,11 @@ let conversationsCache;
|
||||||
* @param {string} type Type of data-id
|
* @param {string} type Type of data-id
|
||||||
* @returns {string} The pronouns if we have any, otherwise "null".
|
* @returns {string} The pronouns if we have any, otherwise "null".
|
||||||
*/
|
*/
|
||||||
export async function fetchPronouns(dataID, accountName, type) {
|
export async function fetchPronouns(
|
||||||
|
dataID: string | undefined,
|
||||||
|
accountName: string,
|
||||||
|
type: string,
|
||||||
|
): Promise<string> {
|
||||||
// log(`searching for ${account_name}`);
|
// log(`searching for ${account_name}`);
|
||||||
const cacheResult = await getPronouns(accountName);
|
const cacheResult = await getPronouns(accountName);
|
||||||
debug(cacheResult);
|
debug(cacheResult);
|
||||||
|
@ -65,7 +69,7 @@ export async function fetchPronouns(dataID, accountName, type) {
|
||||||
* @param {string} statusID ID of status being requested.
|
* @param {string} statusID ID of status being requested.
|
||||||
* @returns {Promise<object>} Contents of the status in json form.
|
* @returns {Promise<object>} Contents of the status in json form.
|
||||||
*/
|
*/
|
||||||
async function fetchStatus(statusID) {
|
async function fetchStatus(statusID: string): Promise<object> {
|
||||||
const accessToken = await getActiveAccessToken();
|
const accessToken = await getActiveAccessToken();
|
||||||
//fetch status from home server with access token
|
//fetch status from home server with access token
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
|
@ -90,7 +94,7 @@ async function fetchStatus(statusID) {
|
||||||
* @param {string} notificationID ID of notification being requested.
|
* @param {string} notificationID ID of notification being requested.
|
||||||
* @returns {Promise<object>} Contents of notification in json form.
|
* @returns {Promise<object>} Contents of notification in json form.
|
||||||
*/
|
*/
|
||||||
async function fetchNotification(notificationID) {
|
async function fetchNotification(notificationID: string): Promise<object> {
|
||||||
const accessToken = await getActiveAccessToken();
|
const accessToken = await getActiveAccessToken();
|
||||||
|
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
|
@ -111,7 +115,7 @@ async function fetchNotification(notificationID) {
|
||||||
* @param {string} accountID ID of account being requested.
|
* @param {string} accountID ID of account being requested.
|
||||||
* @returns {Promise<object>} Contents of account in json form.
|
* @returns {Promise<object>} Contents of account in json form.
|
||||||
*/
|
*/
|
||||||
async function fetchAccount(accountID) {
|
async function fetchAccount(accountID: string): Promise<object> {
|
||||||
const accessToken = await getActiveAccessToken();
|
const accessToken = await getActiveAccessToken();
|
||||||
|
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
|
@ -134,7 +138,7 @@ async function fetchAccount(accountID) {
|
||||||
*
|
*
|
||||||
* DOCS: https://docs.joinmastodon.org/methods/conversations/#response
|
* DOCS: https://docs.joinmastodon.org/methods/conversations/#response
|
||||||
*/
|
*/
|
||||||
async function fetchConversations() {
|
async function fetchConversations(): Promise<Array<any>> {
|
||||||
if (conversationsCache) return conversationsCache;
|
if (conversationsCache) return conversationsCache;
|
||||||
//the api wants status IDs, not conversation IDs
|
//the api wants status IDs, not conversation IDs
|
||||||
//as a result we can only get pronouns for the first 40 conversations max
|
//as a result we can only get pronouns for the first 40 conversations max
|
||||||
|
@ -158,7 +162,7 @@ async function fetchConversations() {
|
||||||
* Fetches the current access token for the user.
|
* Fetches the current access token for the user.
|
||||||
* @returns {Promise<string>} The accessToken for the current user if we are logged in.
|
* @returns {Promise<string>} The accessToken for the current user if we are logged in.
|
||||||
*/
|
*/
|
||||||
async function getActiveAccessToken() {
|
async function getActiveAccessToken(): Promise<string> {
|
||||||
// Fortunately, Mastodon provides the initial state in a <script> element at the beginning of the page.
|
// Fortunately, Mastodon provides the initial state in a <script> element at the beginning of the page.
|
||||||
// Besides a lot of other information, it contains the access token for the current user.
|
// Besides a lot of other information, it contains the access token for the current user.
|
||||||
const initialStateEl = document.getElementById("initial-state");
|
const initialStateEl = document.getElementById("initial-state");
|
||||||
|
|
|
@ -3,26 +3,26 @@
|
||||||
import { isLogging } from "./settings";
|
import { isLogging } from "./settings";
|
||||||
|
|
||||||
/** @param {any[]} args */
|
/** @param {any[]} args */
|
||||||
export function error(...args) {
|
export function error(...args: any[]) {
|
||||||
if (isLogging()) console.error(...args);
|
if (isLogging()) console.error(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {any[]} args */
|
/** @param {any[]} args */
|
||||||
export function warn(...args) {
|
export function warn(...args: any[]) {
|
||||||
if (isLogging()) console.warn(...args);
|
if (isLogging()) console.warn(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {any[]} args */
|
/** @param {any[]} args */
|
||||||
export function log(...args) {
|
export function log(...args: any[]) {
|
||||||
if (isLogging()) console.log(...args);
|
if (isLogging()) console.log(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {any[]} args */
|
/** @param {any[]} args */
|
||||||
export function info(...args) {
|
export function info(...args: any[]) {
|
||||||
if (isLogging()) console.info(...args);
|
if (isLogging()) console.info(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {any[]} args */
|
/** @param {any[]} args */
|
||||||
export function debug(...args) {
|
export function debug(...args: any[]) {
|
||||||
if (isLogging()) console.debug(...args);
|
if (isLogging()) console.debug(...args);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ const knownPronounUrls = [
|
||||||
* @param {any} status
|
* @param {any} status
|
||||||
* @returns {Promise<string|null>} Author pronouns if found. Otherwise returns null.
|
* @returns {Promise<string|null>} Author pronouns if found. Otherwise returns null.
|
||||||
*/
|
*/
|
||||||
export async function extractFromStatus(status) {
|
export async function extractFromStatus(status: any): Promise<string | null> {
|
||||||
// get account from status and pull out fields
|
// get account from status and pull out fields
|
||||||
const account = status.account;
|
const account = status.account;
|
||||||
const { fields, note } = account;
|
const { fields, note } = account;
|
||||||
|
@ -42,7 +42,7 @@ export async function extractFromStatus(status) {
|
||||||
* @param {{name: string, value: string}} field The field value
|
* @param {{name: string, value: string}} field The field value
|
||||||
* @returns {Promise<string|null>} The pronouns or null.
|
* @returns {Promise<string|null>} The pronouns or null.
|
||||||
*/
|
*/
|
||||||
async function extractFromField(field) {
|
async function extractFromField(field: { name: string; value: string }): Promise<string | null> {
|
||||||
let pronounsRaw;
|
let pronounsRaw;
|
||||||
for (const matcher of fieldMatchers) {
|
for (const matcher of fieldMatchers) {
|
||||||
if (field.name.match(matcher)) {
|
if (field.name.match(matcher)) {
|
||||||
|
@ -82,7 +82,7 @@ async function extractFromField(field) {
|
||||||
* @param {string} username The username of the person, without the leading "@".
|
* @param {string} username The username of the person, without the leading "@".
|
||||||
* @returns {Promise<string|null>} The pronouns that have set the "yes" or "meh" opinion.
|
* @returns {Promise<string|null>} The pronouns that have set the "yes" or "meh" opinion.
|
||||||
*/
|
*/
|
||||||
async function queryUserFromPronounsPage(username) {
|
async function queryUserFromPronounsPage(username: string): Promise<string | null> {
|
||||||
// Example page: https://en.pronouns.page/api/profile/get/andrea?version=2
|
// Example page: https://en.pronouns.page/api/profile/get/andrea?version=2
|
||||||
const resp = await fetch(`https://en.pronouns.page/api/profile/get/${username}?version=2`);
|
const resp = await fetch(`https://en.pronouns.page/api/profile/get/${username}?version=2`);
|
||||||
if (resp.status >= 400) {
|
if (resp.status >= 400) {
|
||||||
|
@ -120,7 +120,7 @@ async function queryUserFromPronounsPage(username) {
|
||||||
* @param {string} val
|
* @param {string} val
|
||||||
* @returns {Promise<string>}
|
* @returns {Promise<string>}
|
||||||
*/
|
*/
|
||||||
async function normalizePronounPagePronouns(val) {
|
async function normalizePronounPagePronouns(val: string): Promise<string> {
|
||||||
const match = val.match(/pronouns\.page\/(.+)/);
|
const match = val.match(/pronouns\.page\/(.+)/);
|
||||||
if (match) val = match[1];
|
if (match) val = match[1];
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ async function normalizePronounPagePronouns(val) {
|
||||||
* @param {string} str The input string.
|
* @param {string} str The input string.
|
||||||
* @returns {string|null} The sanitized string.
|
* @returns {string|null} The sanitized string.
|
||||||
*/
|
*/
|
||||||
function sanitizePronouns(str) {
|
function sanitizePronouns(str: string): string | null {
|
||||||
if (!str) return null;
|
if (!str) return null;
|
||||||
|
|
||||||
// Remove all custom emojis with the :shortcode: format.
|
// Remove all custom emojis with the :shortcode: format.
|
||||||
|
@ -285,7 +285,7 @@ const knownPronouns = [
|
||||||
* @param {string} bio The bio
|
* @param {string} bio The bio
|
||||||
* @returns {string|null} The result or null
|
* @returns {string|null} The result or null
|
||||||
*/
|
*/
|
||||||
function extractFromBio(bio) {
|
function extractFromBio(bio: string): string | null {
|
||||||
const exactMatches = bio.matchAll(/(\w+) ?\/ ?(\w+)/gi);
|
const exactMatches = bio.matchAll(/(\w+) ?\/ ?(\w+)/gi);
|
||||||
for (const [match, subjective, objective] of exactMatches) {
|
for (const [match, subjective, objective] of exactMatches) {
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -24,8 +24,14 @@ export function normaliseAccountName(name) {
|
||||||
* @param {string|null} url URL to an account on their own instance
|
* @param {string|null} url URL to an account on their own instance
|
||||||
* @returns {string} username (not normalised)
|
* @returns {string} username (not normalised)
|
||||||
*/
|
*/
|
||||||
|
<<<<<<< HEAD
|
||||||
export function accountNameFromURL(url) {
|
export function accountNameFromURL(url) {
|
||||||
if (!url) return null;
|
if (!url) return null;
|
||||||
|
||||||| parent of 7061ebc (Add type definitions based on JSDoc types)
|
||||||
|
export function accountNameFromURL(url) {
|
||||||
|
=======
|
||||||
|
export function accountNameFromURL(url: string): string {
|
||||||
|
>>>>>>> 7061ebc (Add type definitions based on JSDoc types)
|
||||||
const splitURL = url.split("/");
|
const splitURL = url.split("/");
|
||||||
|
|
||||||
const username = [splitURL.pop(), splitURL.pop()].join("@");
|
const username = [splitURL.pop(), splitURL.pop()].join("@");
|
||||||
|
@ -37,7 +43,7 @@ export function accountNameFromURL(url) {
|
||||||
* Checks which type an element is and adds the according protoots-type attribute
|
* Checks which type an element is and adds the according protoots-type attribute
|
||||||
* @param {HTMLElement} ActionElement
|
* @param {HTMLElement} ActionElement
|
||||||
*/
|
*/
|
||||||
export function addTypeAttribute(ActionElement) {
|
export function addTypeAttribute(ActionElement: HTMLElement) {
|
||||||
if (hasClasses(ActionElement, "status") && !hasClasses(ActionElement, "notification__message")) {
|
if (hasClasses(ActionElement, "status") && !hasClasses(ActionElement, "notification__message")) {
|
||||||
ActionElement.setAttribute("protoots-type", "status");
|
ActionElement.setAttribute("protoots-type", "status");
|
||||||
} else if (hasClasses(ActionElement, "detailed-status")) {
|
} else if (hasClasses(ActionElement, "detailed-status")) {
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
// @ts-nocheck
|
|
||||||
import { storage } from "webextension-polyfill";
|
import { storage } from "webextension-polyfill";
|
||||||
import { error } from "../libs/logging";
|
import { error } from "../libs/logging";
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue