diff --git a/src/lib/deps.js b/src/lib/deps.ts similarity index 73% rename from src/lib/deps.js rename to src/lib/deps.ts index db61036..99e92fa 100644 --- a/src/lib/deps.js +++ b/src/lib/deps.ts @@ -1,10 +1,10 @@ export { create, insert, remove, search } from "jsr:@orama/orama@2"; export { persist, restore } from "npm:@orama/plugin-data-persistence@latest"; -import "./error.js"; -import { db, get_kv } from "./persistence.js"; +import "./error.ts"; +import { db, get_kv } from "./persistence.ts"; //import push from "./middleware/push.js"; -import logger from "./logger.js"; +import logger from "./logger.ts"; /** * @class Oomph diff --git a/src/lib/error.js b/src/lib/error.ts similarity index 85% rename from src/lib/error.js rename to src/lib/error.ts index cdc6134..4843530 100644 --- a/src/lib/error.js +++ b/src/lib/error.ts @@ -1,4 +1,4 @@ -import logger from "./logger.js"; +import logger from "./logger.ts"; Error.prototype.log = async function () { // console.log(this) diff --git a/src/lib/index.js b/src/lib/index.js deleted file mode 100644 index ef8faa1..0000000 --- a/src/lib/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import "./error.js"; -export { db, get_kv } from "./persistence.js"; - -console.log("observabilty loaded into app"); diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..5768b38 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1,4 @@ +import "./error.ts"; +export { db, get_kv } from "./persistence.ts"; + +console.log("observabilty loaded into app"); diff --git a/src/lib/logger.js b/src/lib/logger.ts similarity index 53% rename from src/lib/logger.js rename to src/lib/logger.ts index 32fbc19..697ff29 100644 --- a/src/lib/logger.js +++ b/src/lib/logger.ts @@ -1,8 +1,8 @@ -const logger = async (type, ...body) => { +const logger = async (type, ...body) : Promise=> { try { - const kv = await Deno.openKv(); - const id = Date.now(); - const key = ["Log", id]; + const kv: Deno.Kv = await Deno.openKv(); + const id:number = Date.now(); + const key: (string | number)[] = ["Log", id]; let value; if (typeof body[0] === "object") { @@ -24,27 +24,27 @@ const logger = async (type, ...body) => { } }; -const file_logger = async (msg) => { - const kv = await Deno.openKv(`${import.meta.dirname}/observability/logs`); +const file_logger = async (msg:string) => { + const kv:Deno.Kv = await Deno.openKv(`${import.meta.dirname}/observability/logs`); - const logs = await kv.get(["logs"]); + const logs:Deno.KvEntryMaybe = await kv.get(["logs"]); const log = { ...logs.value, [Date.now()]: msg, }; - const result = await kv.set(["logs"], log); + const result:Deno.KvCommitResult = await kv.set(["logs"], log); }; const readLogs = async () => { - const kv = await Deno.openKv(`${import.meta.dirname}/observability/logs`); + const kv:Deno.Kv = await Deno.openKv(`${import.meta.dirname}/observability/logs`); // // const result = await kv.get(["logs"]); - const stream = kv.watch([["logs"]]).getReader(); + const stream: ReadableStreamDefaultReader<[Deno.KvEntryMaybe]> = kv.watch([["logs"]]).getReader(); while (true) { - const value = await stream.read(); + const value: ReadableStreamDefaultReadResult<[Deno.KvEntryMaybe]> = await stream.read(); if (value.done) { break; diff --git a/src/lib/persistence.js b/src/lib/persistence.ts similarity index 96% rename from src/lib/persistence.js rename to src/lib/persistence.ts index ec5b102..2373da7 100644 --- a/src/lib/persistence.js +++ b/src/lib/persistence.ts @@ -1,6 +1,6 @@ //https://docs.oramasearch.com/ -import logger from "./logger.js"; -import { create, insert, persist, remove, restore, search } from "./deps.js"; +import logger from "./logger.ts"; +import { create, insert, persist, remove, restore, search } from "./deps.ts"; //import { persist, restore } from "npm:@orama/plugin-data-persistence"; /** @@ -14,9 +14,9 @@ import { create, insert, persist, remove, restore, search } from "./deps.js"; */ const get_kv = async () => { const app_root = window._cwd; - const db_path = window.isQARequest ? "qa-db" : "db"; + const db_path:string = window.isQARequest ? "qa-db" : "db"; - const kv_path = app_root && Deno.build.os !== "windows" + const kv_path: string | undefined = app_root && Deno.build.os !== "windows" ? `${app_root}/${db_path}/` : undefined; return await Deno.openKv(`${kv_path}`); @@ -51,7 +51,7 @@ const db = (name) => { class DB { schema = {}; - dbName; + dbName:string; oramaDB; // for now search everything @@ -59,7 +59,7 @@ class DB { this.dbName = this.constructor.name; } - async search(term) { + async search(term:string):Promise<[]> { const kv = await get_kv(); const res = await kv.get(["orama", this.dbName]); diff --git a/src/middleware/api.js b/src/middleware/api.ts similarity index 81% rename from src/middleware/api.js rename to src/middleware/api.ts index 6d9cf8e..2746600 100644 --- a/src/middleware/api.js +++ b/src/middleware/api.ts @@ -1,28 +1,32 @@ -import html from "./html.js"; +import html from "./html.ts"; -const valid_domain = (referer) => { + +const valid_domain = (referer: string): boolean => { // need to handle valid domain better as a person could just read the code and figure out what refer to use return ["sauveur.xyz", "http://localhost:8080/", "mmereko.co.za"].includes( referer, ); }; -const is_authenticated = (auth) => { +const is_authenticated = (auth:string): boolean => { return [Deno.env.get("SERVER_KEY")].includes(auth); }; - -const get_data = async (request) => { +type get_data_response = { + result: {}, + type:string +} +const get_data = async (request:Request) : Promise=> { let _data = {}; let type = "json"; - const referer = request.headers.get("referer"); - const isFormReq = request.headers.get("content-type") === + const referer: string | null = request.headers.get("referer"); + const isFormReq : boolean = request.headers.get("content-type") === "application/x-www-form-urlencoded"; - const isBlob = + const isBlob : boolean = request.headers.get("content-type") === "application/octet-stream"; if (isFormReq && referer) { let referer = new URL(request.headers.get("referer")); - let data = new URLSearchParams(await request.text()); + let data: URLSearchParams = new URLSearchParams(await request.text()); for (const key of data.keys()) { const value = data.get(key); @@ -48,18 +52,18 @@ const get_data = async (request) => { return { result: _data, type }; }; -const api_middleware = async (request) => { +const api_middleware = async (request: Request) : Promise => { const app_path = window._app; const { pathname } = new URL(request.url); let response; try { let data = {}; - const auth = request.headers.get("authorization"); - const host = request.headers.get("host"); + const auth: string | null = request.headers.get("authorization"); + const host : string | null = request.headers.get("host"); const { protocol } = new URL(request.url); const referer = request.headers.get("referer"); - const paths = pathname.split("/"); + const paths : string[] = pathname.split("/"); let subPath = ""; if (paths.length > 3) { paths.pop(); diff --git a/src/middleware/asset.js b/src/middleware/asset.ts similarity index 95% rename from src/middleware/asset.js rename to src/middleware/asset.ts index f9ad8fc..0819c17 100644 --- a/src/middleware/asset.js +++ b/src/middleware/asset.ts @@ -6,7 +6,7 @@ import tailwindcss from "npm:tailwindcss@latest"; // https://lightningcss.dev/docs.html import { transform } from "npm:lightningcss@latest"; -const asset_middlware = async (request, type) => { +const asset_middlware = async (request:Request, type:string) :Promise => { const _cwd = window._cwd; const { pathname } = new URL(request.url); // const isServiceWorker = pathname.includes("sw.js"); diff --git a/src/middleware/auth.js b/src/middleware/auth.ts similarity index 88% rename from src/middleware/auth.js rename to src/middleware/auth.ts index 32bdce5..460b4e6 100644 --- a/src/middleware/auth.js +++ b/src/middleware/auth.ts @@ -1,17 +1,17 @@ import { getCookies } from "jsr:@std/http@0.216/cookie"; -const getAuthToken = (req) => { +const getAuthToken = (req:Request) => { const { id } = getCookies(req.headers); return id ? id : req.headers.get("authorization"); }; -const isAuthenticated = (req) => { +const isAuthenticated = (req:Request) => { const id = getAuthToken(req); return id ? true : false; }; -const authenticate = async (pathname, request) => { +const authenticate = async (pathname:string, request:Request) => { if (!isAuthenticated(request)) { const { pathname } = new URL(request.url); diff --git a/src/middleware/hmr.js b/src/middleware/hmr.ts similarity index 71% rename from src/middleware/hmr.js rename to src/middleware/hmr.ts index aa98f0f..f90c191 100644 --- a/src/middleware/hmr.js +++ b/src/middleware/hmr.ts @@ -1,14 +1,14 @@ -const hmr = (pathname, request) => { +const hmr = (pathname:string, request:Request): Response | void => { if (request.headers.get("upgrade") === "websocket" && pathname === "/hmr") { const { socket: ws, response } = Deno.upgradeWebSocket(request); - const handleConnected = () => console.log("Connection established"); + const handleConnected = ()=> console.log("Connection established"); ws.onopen = () => handleConnected(); const handleDisconnected = () => console.log("Connection closed"); ws.onclose = () => handleDisconnected(); - const handleMessage = (ws, msg) => { + const handleMessage = (ws:WebSocket, msg:any) => { console.log(msg); }; diff --git a/src/middleware/html.js b/src/middleware/html.ts similarity index 90% rename from src/middleware/html.js rename to src/middleware/html.ts index de82a86..c4d6298 100644 --- a/src/middleware/html.js +++ b/src/middleware/html.ts @@ -2,11 +2,11 @@ import{exists}from "jsr:@std/fs@0.216/exists"; import { compileDoc, getComponents } from "./utls/components/index.js"; let isError = false; -let errorPath; +let errorPath:any; -const html_middleware = async (req, isProd) => { +const html_middleware = async (req:Request, isProd:boolean): Promise => { const app_path = window._app; - const paths = new URL(req.url).pathname.replace(/\/$/, ""); + const paths : string = new URL(req.url).pathname.replace(/\/$/, ""); let src; const pathArrays = paths .replace("/", "") @@ -22,7 +22,7 @@ const html_middleware = async (req, isProd) => { tempSrc = `${app_path}/index.html`; } - const paramArray = pathArrays; + const paramArray: string[] = pathArrays; paramArray.pop(); const paramPage = `${app_path}/${paramArray.join("/")}/@.html`; @@ -46,7 +46,7 @@ const html_middleware = async (req, isProd) => { return html_response(src); }; -const getManifest = async (isProd) => { +const getManifest = async (isProd: boolean) => { const app_path = window._app; let manifest_path = `file:///${app_path}/src/public/manifest.json`; diff --git a/src/middleware/index.js b/src/middleware/index.js deleted file mode 100644 index 9861346..0000000 --- a/src/middleware/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import script_middleware from "./script.js"; -import asset_middlware from "./asset.js"; -import api_middleware from "./api.js"; -import html_middleware from "./html.js"; - -export { api_middleware, asset_middlware, html_middleware, script_middleware }; diff --git a/src/middleware/index.ts b/src/middleware/index.ts new file mode 100644 index 0000000..3ac4810 --- /dev/null +++ b/src/middleware/index.ts @@ -0,0 +1,6 @@ +import script_middleware from "./script.ts"; +import asset_middlware from "./asset.ts"; +import api_middleware from "./api.ts"; +import html_middleware from "./html.ts"; + +export { api_middleware, asset_middlware, html_middleware, script_middleware }; diff --git a/src/middleware/push.js b/src/middleware/push.ts similarity index 93% rename from src/middleware/push.js rename to src/middleware/push.ts index 4f26b51..80753fd 100644 --- a/src/middleware/push.js +++ b/src/middleware/push.ts @@ -10,12 +10,13 @@ // https://datatracker.ietf.org/doc/html/draft-ietf-webpush-vapid-02#section-4 // https://datatracker.ietf.org/doc/html/rfc8030#section-8 // https://blog.mozilla.org/services/2016/04/04/using-vapid-with-webpush/ + import { generateKeys, getHeaders, getRawKey } from "../lib/vapid/index.js"; -const push = async (request) => { +const push = async (request:Request): Promise => { const { pathname, searchParams } = oomph.req(request); - const publicKey = Deno.env.get("PUSH_PUBLIC_KEY"); + const publicKey:string | undefined = Deno.env.get("PUSH_PUBLIC_KEY"); if (pathname === "/push/vapidPublicKey" && request.method === "GET") { return new Response(await getRawKey()); diff --git a/src/middleware/script.js b/src/middleware/script.ts similarity index 90% rename from src/middleware/script.js rename to src/middleware/script.ts index bffba2a..15fa391 100644 --- a/src/middleware/script.js +++ b/src/middleware/script.ts @@ -1,4 +1,4 @@ -const script_middleware = async (req) => { +const script_middleware = async (req:Request) : Promise => { const app_path = window._app; const { pathname: _pathname } = new URL(req.url); console.log(_pathname); diff --git a/src/middleware/sse.js b/src/middleware/sse.ts similarity index 100% rename from src/middleware/sse.js rename to src/middleware/sse.ts diff --git a/src/middleware/websocket.js b/src/middleware/websocket.ts similarity index 100% rename from src/middleware/websocket.js rename to src/middleware/websocket.ts diff --git a/src/mod.js b/src/mod.ts similarity index 63% rename from src/mod.js rename to src/mod.ts index bbb3c2d..453e071 100644 --- a/src/mod.js +++ b/src/mod.ts @@ -3,9 +3,9 @@ export { asset_middlware, html_middleware, script_middleware, - } from "./middleware/index.js"; + } from "./middleware/index.ts"; - import oomph from "./lib/deps.js"; + import oomph from "./lib/deps.ts"; export { oomph }; \ No newline at end of file diff --git a/src/views/logger.js b/src/views/logger.ts similarity index 69% rename from src/views/logger.js rename to src/views/logger.ts index 5b45dfe..67bd7ef 100644 --- a/src/views/logger.js +++ b/src/views/logger.ts @@ -1,14 +1,14 @@ -const logView = async (request) => { +const logView = async (request:Request) :Promise => { const { pathname } = oomph.req(request); if (pathname === "/logs" && request.method === "GET") { - const kv = await Deno.openKv(); - const log = await kv.list({ prefix: ["Log"] }); + const kv: Deno.Kv = await Deno.openKv(); + const log: Deno.KvListIterator = await kv.list({ prefix: ["Log"] }); // for await (const entry of log) { // kv.delete(entry.key) // } - const logs = []; + const logs: Array> = []; for await (const res of log) logs.push(res); logs.sort().reverse(); diff --git a/tests/lib/deps.test.ts b/tests/lib/deps.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/lib/error.test.ts b/tests/lib/error.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/lib/index.test.ts b/tests/lib/index.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/lib/logger.test.ts b/tests/lib/logger.test.ts new file mode 100644 index 0000000..298ea5c --- /dev/null +++ b/tests/lib/logger.test.ts @@ -0,0 +1 @@ +import {assertEquals} from "https://deno.land/std@0.216.0/assert/mod.ts" \ No newline at end of file diff --git a/tests/lib/persistence.test.ts b/tests/lib/persistence.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/lib/vapid/common.test.ts b/tests/lib/vapid/common.test.ts new file mode 100644 index 0000000..cbcaf36 --- /dev/null +++ b/tests/lib/vapid/common.test.ts @@ -0,0 +1 @@ +import { assert } from "https://deno.land/std@0.216.0/assert/assert.ts"; \ No newline at end of file diff --git a/tests/lib/vapid/der.test.ts b/tests/lib/vapid/der.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/lib/vapid/index.test.ts b/tests/lib/vapid/index.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/lib/vapid/vapid.test.ts b/tests/lib/vapid/vapid.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/middleware/api.test.ts b/tests/middleware/api.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/middleware/asset.test.ts b/tests/middleware/asset.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/middleware/auth.test.ts b/tests/middleware/auth.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/middleware/hmr.test.ts b/tests/middleware/hmr.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/middleware/html.test.ts b/tests/middleware/html.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/middleware/push.test.ts b/tests/middleware/push.test.ts new file mode 100644 index 0000000..dda196c --- /dev/null +++ b/tests/middleware/push.test.ts @@ -0,0 +1,54 @@ +import { assertEquals } from "https://deno.land/std@0.216.0/assert/mod.ts" +import push from "../../src/middleware/push.ts"; + +Deno.test("Test /push endpoint for POST request", async () => { + const request = new Request("/push", { + method: "POST", + body: JSON.stringify({ + subscription: { + endpoint: "https://example.com/endpoint", + }, + ttl: 3600, + }), + }); + + const response = await push(request); + + assertEquals(response, new Response("Pushed Attempted", { status: 201 })); +}); + + +Deno.test("Test /push/vapidPublicKey endpoint for GET request", async () => { + const request = new Request("/push/vapidPublicKey", { + method: "GET", + body: JSON.stringify({ + subscription: { + endpoint: "https://example.com/endpoint", + }, + ttl: 3600, + }), + }); + + const response = await push(request); + + assertEquals(response?.status, 200); + }); + + + Deno.test("Test /push/register endpoint for POST request", async () => { + const request = new Request("/push/register", { + method: "POST", + body: JSON.stringify({ + subscription: { + endpoint: "https://example.com/endpoint", + }, + ttl: 3600, + }), + }); + + const response = await push(request); + + assertEquals(response, new Response("Registered", { status: 201 })); + }); + + \ No newline at end of file diff --git a/tests/middleware/script.test.ts b/tests/middleware/script.test.ts new file mode 100644 index 0000000..69b6677 --- /dev/null +++ b/tests/middleware/script.test.ts @@ -0,0 +1,14 @@ +import { assertEquals} from "https://deno.land/std@0.216.0/assert/mod.ts"; +import script_middleware from "../../src/middleware/script.ts"; + +Deno.test("Test script middleware", async () => { + // Simulate a request object + const request = new Request("https://example.com/some/path"); + + // Call the middleware function + const response = await script_middleware(request); + + assertEquals(response instanceof Response, true); + assertEquals(response.status,200) + +}); diff --git a/tests/middleware/utils/components/index.test.js b/tests/middleware/utils/components/index.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/middleware/websocket.test.ts b/tests/middleware/websocket.test.ts new file mode 100644 index 0000000..474d563 --- /dev/null +++ b/tests/middleware/websocket.test.ts @@ -0,0 +1,18 @@ +import { assert, assertEquals } from "https://deno.land/std@0.217.0/assert/mod.ts"; +import webSocket_middleware from "../../src/middleware/websocket.ts" + +Deno.test("Test WebSocket middleware", async () => { + // Simulate a WebSocket upgrade request to /socket + const headers = new Headers(); + headers.set("upgrade", "websocket"); + const request = new Request("https://example.com/socket", { + headers, + }); + + // Call the WebSocket middleware function + const response = await webSocket_middleware("/socket", request); + + // Check if the response is a Response object + assertEquals(response instanceof Response, true); + +}); diff --git a/tests/views/logger.test.ts b/tests/views/logger.test.ts new file mode 100644 index 0000000..08b5b64 --- /dev/null +++ b/tests/views/logger.test.ts @@ -0,0 +1,15 @@ +import {assertEquals} from "https://deno.land/std@0.216.0/assert/mod.ts" +import logView from "../../src/views/logger.ts" + +Deno.test(async function test_logView(){ + const request : Request = new Request("/logs",{ + method: "GET", + }) + + const response:Response | undefined= await logView(request) + + assertEquals(response != undefined, true) + + assertEquals(response?.status,200) + +}) \ No newline at end of file