diff options
| author | iv-ar <i@oiee.no> | 2023-03-04 16:54:16 +0100 |
|---|---|---|
| committer | iv-ar <i@oiee.no> | 2023-03-04 16:54:16 +0100 |
| commit | cf546fd4b9a1fbf77bccf5f0b713e688d29a66ad (patch) | |
| tree | 8103d953afec0618a55dc957ba8a3222dac0e842 /code/app/src | |
| parent | b85164718d3bd6a4ad5fc06d04a3ce2dc028b1db (diff) | |
| download | greatoffice-cf546fd4b9a1fbf77bccf5f0b713e688d29a66ad.tar.xz greatoffice-cf546fd4b9a1fbf77bccf5f0b713e688d29a66ad.zip | |
feat: Use console to log
Diffstat (limited to 'code/app/src')
| -rw-r--r-- | code/app/src/actions/pwKey.ts | 3 | ||||
| -rw-r--r-- | code/app/src/configuration/index.ts | 26 | ||||
| -rw-r--r-- | code/app/src/configuration/test.ts | 21 | ||||
| -rw-r--r-- | code/app/src/hooks.server.ts | 21 | ||||
| -rw-r--r-- | code/app/src/i18n/i18n-util.ts | 3 | ||||
| -rw-r--r-- | code/app/src/routes/(main)/(public)/sign-in/index.spec.js | 2 | ||||
| -rw-r--r-- | code/app/src/routes/(main)/+layout.server.ts | 17 | ||||
| -rw-r--r-- | code/app/src/services/account-service.ts | 25 | ||||
| -rw-r--r-- | code/app/src/utilities/_fetch.ts | 22 | ||||
| -rw-r--r-- | code/app/src/utilities/cache.ts | 11 | ||||
| -rw-r--r-- | code/app/src/utilities/logger.ts | 118 | ||||
| -rw-r--r-- | code/app/src/utilities/persistent-store.ts | 17 |
12 files changed, 77 insertions, 209 deletions
diff --git a/code/app/src/actions/pwKey.ts b/code/app/src/actions/pwKey.ts index cf85685..e8f615c 100644 --- a/code/app/src/actions/pwKey.ts +++ b/code/app/src/actions/pwKey.ts @@ -1,7 +1,4 @@ -import { is_testing } from "$configuration"; - export default function pwKey(node: HTMLElement, value: string | undefined) { if (!value) return; - if (!is_testing()) return; node.setAttribute("pw-key", value); }
\ No newline at end of file diff --git a/code/app/src/configuration/index.ts b/code/app/src/configuration/index.ts index abf6ac5..1ffd67f 100644 --- a/code/app/src/configuration/index.ts +++ b/code/app/src/configuration/index.ts @@ -1,5 +1,3 @@ -import { env } from "$env/dynamic/private"; - export const APP_ADDRESS = "https://stage.greatoffice.app"; export const API_ADDRESS = "https://stage-api.greatoffice.app"; export const DEV_APP_ADDRESS = "http://localhost"; @@ -14,36 +12,12 @@ export function is_development(): boolean { return import.meta.env.DEV; } -export function is_testing(): boolean { - return env.TESTING == "true"; -} - -export function is_debug(): boolean { - return localStorage.getItem(StorageKeys.debug) !== "true"; -} - export const CookieNames = { theme: "go_theme", locale: "go_locale", session: "go_session", }; -export function get_test_context(): TestContext { - return { - user: { - username: env.TEST_USERNAME, - password: env.TEST_PASSWORD, - }, - }; -} - -export interface TestContext { - user: { - username: string, - password: string - }; -} - export const QueryKeys = { labels: "labels", categories: "categories", diff --git a/code/app/src/configuration/test.ts b/code/app/src/configuration/test.ts new file mode 100644 index 0000000..12392de --- /dev/null +++ b/code/app/src/configuration/test.ts @@ -0,0 +1,21 @@ +import {env} from "$env/dynamic/private"; + +export function get_test_context(): TestContext { + return { + user: { + username: env.TEST_USERNAME, + password: env.TEST_PASSWORD, + }, + }; +} + +export function is_testing(): boolean { + return env.TESTING == "true"; +} + +export interface TestContext { + user: { + username: string, + password: string + }; +} diff --git a/code/app/src/hooks.server.ts b/code/app/src/hooks.server.ts index 2720480..b636e31 100644 --- a/code/app/src/hooks.server.ts +++ b/code/app/src/hooks.server.ts @@ -1,21 +1,20 @@ -import { CookieNames } from "$configuration"; -import { detectLocale, i18n, isLocale, locales } from "$i18n/i18n-util"; -import { log_debug } from "$utilities/logger"; -import type { Handle, RequestEvent } from "@sveltejs/kit"; -import { initAcceptLanguageHeaderDetector } from "typesafe-i18n/detectors"; -import type { Locales } from "$i18n/i18n-types"; -import { loadAllLocales } from "$i18n/i18n-util.sync"; +import {CookieNames} from "$configuration"; +import {detectLocale, i18n, isLocale, locales} from "$i18n/i18n-util"; +import type {Handle, RequestEvent} from "@sveltejs/kit"; +import {initAcceptLanguageHeaderDetector} from "typesafe-i18n/detectors"; +import type {Locales} from "$i18n/i18n-types"; +import {loadAllLocales} from "$i18n/i18n-util.sync"; loadAllLocales(); const L = i18n(); -export const handle: Handle = async ({ event, resolve }) => { +export const handle: Handle = async ({event, resolve}) => { const localeCookie = event.cookies.get(CookieNames.locale); const preferredLocale = getPreferredLocale(event); let finalLocale = localeCookie ?? preferredLocale; let forceCookieSet = false; - log_debug("Handling locale", { + console.debug("Handling locale", { locales, localeCookie, preferredLocale, @@ -23,7 +22,7 @@ export const handle: Handle = async ({ event, resolve }) => { }); if (!isLocale(finalLocale)) { - log_debug(finalLocale + " is not a valid locale or it does not exist, switching to default: en"); + console.debug(finalLocale + " is not a valid locale or it does not exist, switching to default: en"); finalLocale = "en"; forceCookieSet = true; } @@ -40,7 +39,7 @@ export const handle: Handle = async ({ event, resolve }) => { event.locals.locale = finalLocale as Locales; event.locals.LL = L[finalLocale as Locales]; - return resolve(event, { transformPageChunk: ({ html }) => html.replace("%lang%", finalLocale) }); + return resolve(event, {transformPageChunk: ({html}) => html.replace("%lang%", finalLocale)}); }; function getPreferredLocale(event: RequestEvent) { diff --git a/code/app/src/i18n/i18n-util.ts b/code/app/src/i18n/i18n-util.ts index 5b7b6ed..55b52bd 100644 --- a/code/app/src/i18n/i18n-util.ts +++ b/code/app/src/i18n/i18n-util.ts @@ -21,8 +21,7 @@ export const namespaces: Namespaces[] = [ export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales) - - export const isNamespace = (namespace: string): namespace is Namespaces => namespaces.includes(namespace as Namespaces) +export const isNamespace = (namespace: string): namespace is Namespaces => namespaces.includes(namespace as Namespaces) export const loadedLocales: Record<Locales, Translations> = {} as Record<Locales, Translations> diff --git a/code/app/src/routes/(main)/(public)/sign-in/index.spec.js b/code/app/src/routes/(main)/(public)/sign-in/index.spec.js index 9d0122d..a83cfe9 100644 --- a/code/app/src/routes/(main)/(public)/sign-in/index.spec.js +++ b/code/app/src/routes/(main)/(public)/sign-in/index.spec.js @@ -1,6 +1,6 @@ import { test, expect } from "@playwright/test"; import { signInPageTestKeys } from "./index.js"; -import { get_test_context } from "$configuration"; +import { get_test_context } from "$configuration/test"; import { get_pw_key_selector } from "$utilities/testing-helpers"; const context = get_test_context(); diff --git a/code/app/src/routes/(main)/+layout.server.ts b/code/app/src/routes/(main)/+layout.server.ts index 25043aa..0670dd6 100644 --- a/code/app/src/routes/(main)/+layout.server.ts +++ b/code/app/src/routes/(main)/+layout.server.ts @@ -1,11 +1,10 @@ -import { api_base, CookieNames } from "$configuration"; -import { cached_result_async, CacheKeys } from "$utilities/cache"; -import { log_debug, log_error } from "$utilities/logger"; -import { get_md5_hash } from "$utilities/crypto-helpers"; -import { error, redirect } from "@sveltejs/kit"; -import type { LayoutServerLoad } from "./$types"; +import {api_base, CookieNames} from "$configuration"; +import {cached_result_async, CacheKeys} from "$utilities/cache"; +import {get_md5_hash} from "$utilities/crypto-helpers"; +import {error, redirect} from "@sveltejs/kit"; +import type {LayoutServerLoad} from "./$types"; -export const load: LayoutServerLoad = async ({ route, cookies, locals, fetch }) => { +export const load: LayoutServerLoad = async ({route, cookies, locals, fetch}) => { const isBaseRoute = route.id === "/(main)"; const isPortalRoute = route.id === "/(main)/(public)/portal"; const isPublicRoute = (isBaseRoute || (route.id?.startsWith("/(main)/(public)") ?? false)) ?? true; @@ -18,14 +17,14 @@ export const load: LayoutServerLoad = async ({ route, cookies, locals, fetch }) Cookie: CookieNames.session + "=" + sessionCookieValue, }, }).catch((e) => { - log_error(e); + console.error(e); throw error(503, { message: "We are experiencing a service disruption! Have patience while we resolve the issue.", }); }))).ok; } - log_debug("Base Layout loaded", { + console.debug("Base Layout loaded", { sessionIsValid, isPublicRoute, isBaseRoute, diff --git a/code/app/src/services/account-service.ts b/code/app/src/services/account-service.ts index b2bb375..0e92a47 100644 --- a/code/app/src/services/account-service.ts +++ b/code/app/src/services/account-service.ts @@ -1,12 +1,11 @@ -import { http_delete_async, http_get_async, http_post_async } from "$utilities/_fetch"; -import { browser } from "$app/environment"; -import { api_base, CookieNames, StorageKeys } from "$configuration"; -import { is_known_problem } from "$models/internal/KnownProblem"; -import { log_debug } from "$utilities/logger"; -import { StoreType, create_writable_persistent } from "$utilities/persistent-store"; -import { get } from "svelte/store"; -import type { Writable } from "svelte/store"; -import { Temporal } from "temporal-polyfill"; +import {http_delete_async, http_get_async, http_post_async} from "$utilities/_fetch"; +import {browser} from "$app/environment"; +import {api_base, CookieNames, StorageKeys} from "$configuration"; +import {is_known_problem} from "$models/internal/KnownProblem"; +import {StoreType, create_writable_persistent} from "$utilities/persistent-store"; +import {get} from "svelte/store"; +import type {Writable} from "svelte/store"; +import {Temporal} from "temporal-polyfill"; import type { CreateAccountPayload, CreateAccountResponse, @@ -47,7 +46,7 @@ export class AccountService implements IAccountService { const currentValue = get(this.session); const currentEpoch = Temporal.Now.instant().epochSeconds; if (!forceRefresh && ((currentValue?._lastUpdated ?? 0) + this.sessionCooldown) > currentEpoch) { - log_debug("Session is not stale yet", { + console.debug("Session is not stale yet", { currentEpoch, staleEpoch: currentValue?._lastUpdated + this.sessionCooldown, }); @@ -70,7 +69,7 @@ export class AccountService implements IAccountService { async login_async(payload: LoginPayload): Promise<LoginResponse> { const response = await http_post_async(api_base("_/account/login"), payload); - if (response.ok) return { isLoggedIn: true }; + if (response.ok) return {isLoggedIn: true}; if (is_known_problem(response)) return { isLoggedIn: false, knownProblem: await response.json(), @@ -93,7 +92,7 @@ export class AccountService implements IAccountService { async create_account_async(payload: CreateAccountPayload): Promise<CreateAccountResponse> { const response = await http_post_async(api_base("_/account/create"), payload); - if (response.ok) return { isCreated: true }; + if (response.ok) return {isCreated: true}; if (is_known_problem(response)) return { isCreated: false, knownProblem: await response.json(), @@ -112,7 +111,7 @@ export class AccountService implements IAccountService { async update_current_async(payload: UpdateAccountPayload): Promise<UpdateAccountResponse> { const response = await http_post_async(api_base("_/account/update"), payload); - if (response.ok) return { isUpdated: true }; + if (response.ok) return {isUpdated: true}; if (is_known_problem(response)) return { isUpdated: false, knownProblem: await response.json(), diff --git a/code/app/src/utilities/_fetch.ts b/code/app/src/utilities/_fetch.ts index 992c7f5..415e1c2 100644 --- a/code/app/src/utilities/_fetch.ts +++ b/code/app/src/utilities/_fetch.ts @@ -1,28 +1,28 @@ -import { Temporal } from "temporal-polyfill"; -import { redirect } from "@sveltejs/kit"; -import { browser } from "$app/environment"; -import { goto } from "$app/navigation"; -import { SignInPageMessage, signInPageMessageQueryKey } from "$routes/(main)/(public)/sign-in"; -import { log_error } from "$utilities/logger"; -import { AccountService } from "$services/account-service"; +import {Temporal} from "temporal-polyfill"; +import {redirect} from "@sveltejs/kit"; +import {browser} from "$app/environment"; +import {goto} from "$app/navigation"; +import {SignInPageMessage, signInPageMessageQueryKey} from "$routes/(main)/(public)/sign-in"; +import {AccountService} from "$services/account-service"; + export async function http_post_async(url: string, body?: object | string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<Response> { const init = make_request_init("post", body, abort_signal); - const response = await internal_fetch_async({ url, init, timeout }); + const response = await internal_fetch_async({url, init, timeout}); if (!skip_401_check && await redirect_if_401_async(response)) throw new Error("Server returned 401"); return response; } export async function http_get_async(url: string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<Response> { const init = make_request_init("get", undefined, abort_signal); - const response = await internal_fetch_async({ url, init, timeout }); + const response = await internal_fetch_async({url, init, timeout}); if (!skip_401_check && await redirect_if_401_async(response)) throw new Error("Server returned 401"); return response; } export async function http_delete_async(url: string, body?: object | string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<Response> { const init = make_request_init("delete", body, abort_signal); - const response = await internal_fetch_async({ url, init, timeout }); + const response = await internal_fetch_async({url, init, timeout}); if (!skip_401_check && await redirect_if_401_async(response)) throw new Error("Server returned 401"); return response; } @@ -42,7 +42,7 @@ async function internal_fetch_async(request: InternalFetchRequest): Promise<Resp response = await fetch(fetch_request); } } catch (error: any) { - log_error(error); + console.error(error); if (error.message === "Timeout") { console.error("Request timed out"); } else if (error.message === "Network request failed") { diff --git a/code/app/src/utilities/cache.ts b/code/app/src/utilities/cache.ts index db9be9a..101f192 100644 --- a/code/app/src/utilities/cache.ts +++ b/code/app/src/utilities/cache.ts @@ -1,11 +1,10 @@ -import { Temporal } from "temporal-polyfill"; -import { log_debug } from "$utilities/logger"; +import {Temporal} from "temporal-polyfill"; let cache = {}; export const CacheKeys = { - isAuthenticated: "isAuthenticated" -} + isAuthenticated: "isAuthenticated", +}; export async function cached_result_async<T>(key: string, staleAfterSeconds: number, get_result: any, forceRefresh: boolean = false) { if (!cache[key]) { @@ -21,7 +20,7 @@ export async function cached_result_async<T>(key: string, staleAfterSeconds: num cache[key].l = Temporal.Now.instant().epochSeconds; } - log_debug("Ran cached_result_async", { + console.debug("Ran cached_result_async", { cacheKey: key, isStale, cache: cache[key], @@ -34,5 +33,5 @@ export async function cached_result_async<T>(key: string, staleAfterSeconds: num export function clear_cache_key(key: string) { if (!key) throw new Error("No key was specified"); cache[key].c = undefined; - log_debug("Cleared cache with key: " + key); + console.debug("Cleared cache with key: " + key); }
\ No newline at end of file diff --git a/code/app/src/utilities/logger.ts b/code/app/src/utilities/logger.ts deleted file mode 100644 index c21bd76..0000000 --- a/code/app/src/utilities/logger.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { browser, dev } from "$app/environment"; -import { env } from '$env/dynamic/private'; -import { StorageKeys } from "$configuration"; -import pino, { type Logger, type LoggerOptions } from "pino"; -import { createStream } from "pino-seq"; -import type { SeqConfig } from "pino-seq"; - -function get_pino_logger(): Logger { - const config = { - name: "greatoffice-app", - level: LogLevel.current().as_string(), - customLevels: { - "INFO": LogLevel.INFO, - "WARNING": LogLevel.WARNING, - "ERROR": LogLevel.ERROR, - "DEBUG": LogLevel.DEBUG, - "SILENT": LogLevel.SILENT, - } - } as LoggerOptions; - - const seq = { - config: { - apiKey: browser ? env.SEQ_API_KEY : "", - serverUrl: browser ? env.SEQ_SERVER_URL : "" - } as SeqConfig, - streams: [{ - level: LogLevel.to_string(LogLevel.DEBUG), - }], - enabled: () => ( - !browser - && !dev - && seq.config.apiKey.length > 0 - && seq.config.serverUrl.length > 0 - ) - }; - - return seq.enabled() ? pino(config, createStream(seq.config)) : pino(config); -} - -type LogLevelString = "DEBUG" | "INFO" | "WARNING" | "ERROR" | "SILENT"; - -export const LogLevel = { - DEBUG: 0, - INFO: 1, - WARNING: 2, - ERROR: 3, - SILENT: 4, - current(): { as_string: Function, as_number: Function } { - const logLevelString = (browser ? window.sessionStorage.getItem(StorageKeys.logLevel) : env.LOG_LEVEL) as LogLevelString; - return { - as_number(): number { - return LogLevel.to_number_or_default(logLevelString, LogLevel.INFO) - }, - as_string(): LogLevelString { - return logLevelString.length > 3 ? logLevelString : LogLevel.to_string(LogLevel.INFO); - } - } - }, - to_string(levelInt: number): LogLevelString { - switch (levelInt) { - case 0: - return "DEBUG"; - case 1: - return "INFO"; - case 2: - return "WARNING"; - case 3: - return "ERROR"; - case 4: - return "SILENT"; - default: - throw new Error("Unknown LogLevel number " + levelInt); - } - }, - to_number_or_default(levelString?: string | null, defaultValue?: number): number { - if (!levelString && defaultValue) return defaultValue; - else if (!levelString && !defaultValue) throw new Error("levelString was empty, and no default value was specified"); - switch (levelString?.toUpperCase()) { - case "DEBUG": - return 0; - case "INFO": - return 1; - case "WARNING": - return 2; - case "ERROR": - return 3; - case "SILENT": - return 4; - default: - if (!defaultValue) throw new Error("Unknown LogLevel string " + levelString + ", and no defaultValue"); - else return defaultValue; - } - }, -}; - -export function log_warning(message: string, ...additional: any[]): void { - if (LogLevel.current().as_number() <= LogLevel.WARNING) { - get_pino_logger().warn(message, additional); - } -} - -export function log_debug(message: string, ...additional: any[]): void { - if (LogLevel.current().as_number() <= LogLevel.DEBUG) { - get_pino_logger().debug(message, additional); - } -} - -export function log_info(message: string, ...additional: any[]): void { - if (LogLevel.current().as_number() <= LogLevel.INFO) { - get_pino_logger().info(message, additional); - } -} - -export function log_error(message: any, ...additional: any[]): void { - if (LogLevel.current().as_number() <= LogLevel.ERROR) { - get_pino_logger().error(message, additional); - } -}
\ No newline at end of file diff --git a/code/app/src/utilities/persistent-store.ts b/code/app/src/utilities/persistent-store.ts index 3f56312..d880464 100644 --- a/code/app/src/utilities/persistent-store.ts +++ b/code/app/src/utilities/persistent-store.ts @@ -1,7 +1,6 @@ -import { browser } from "$app/environment"; -import { writable as _writable, readable as _readable } from "svelte/store"; -import type { Writable, Readable, StartStopNotifier } from "svelte/store"; -import { log_debug, log_info } from "./logger"; +import {browser} from "$app/environment"; +import {writable as _writable, readable as _readable} from "svelte/store"; +import type {Writable, Readable, StartStopNotifier} from "svelte/store"; enum StoreType { SESSION = 0, @@ -53,7 +52,7 @@ function get_store_value<T>(init: WritableStoreInit<T> | ReadableStoreInit<T>): return JSON.parse(value); } catch (e) { console.error(e); - return { __INVALID__: true }; + return {__INVALID__: true}; } } @@ -73,11 +72,11 @@ function subscribe<T>(store: Writable<T> | Readable<T>, init: WritableStoreInit< function create_writable_persistent<T>(init: WritableStoreInit<T>): Writable<T> { if (!browser) { - log_info("WARN: Persistent store is only available in the browser"); + console.warn("Persistent store is only available in the browser"); return; } if (init.options === undefined) throw new Error("init is a required parameter"); - log_debug("creating writable store with options: ", init); + console.debug("Creating writable store with options: ", init); const store = _writable<T>(init.initialState); hydrate(store, init); subscribe(store, init); @@ -86,11 +85,11 @@ function create_writable_persistent<T>(init: WritableStoreInit<T>): Writable<T> function create_readable_persistent<T>(init: ReadableStoreInit<T>): Readable<T> { if (!browser) { - log_info("WARN: Persistent store is only available in the browser"); + console.warning("Persistent store is only available in the browser"); return; } if (init.options === undefined) throw new Error("init is a required parameter"); - log_debug("Creating readable store with options: ", init); + console.debug("Creating readable store with options: ", init); const store = _readable<T>(init.initialState, init.callback); // hydrate(store, options); subscribe(store, init); |
