aboutsummaryrefslogtreecommitdiffstats
path: root/code/app/src
diff options
context:
space:
mode:
authoriv-ar <i@oiee.no>2023-03-04 16:54:16 +0100
committeriv-ar <i@oiee.no>2023-03-04 16:54:16 +0100
commitcf546fd4b9a1fbf77bccf5f0b713e688d29a66ad (patch)
tree8103d953afec0618a55dc957ba8a3222dac0e842 /code/app/src
parentb85164718d3bd6a4ad5fc06d04a3ce2dc028b1db (diff)
downloadgreatoffice-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.ts3
-rw-r--r--code/app/src/configuration/index.ts26
-rw-r--r--code/app/src/configuration/test.ts21
-rw-r--r--code/app/src/hooks.server.ts21
-rw-r--r--code/app/src/i18n/i18n-util.ts3
-rw-r--r--code/app/src/routes/(main)/(public)/sign-in/index.spec.js2
-rw-r--r--code/app/src/routes/(main)/+layout.server.ts17
-rw-r--r--code/app/src/services/account-service.ts25
-rw-r--r--code/app/src/utilities/_fetch.ts22
-rw-r--r--code/app/src/utilities/cache.ts11
-rw-r--r--code/app/src/utilities/logger.ts118
-rw-r--r--code/app/src/utilities/persistent-store.ts17
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);