incomplete work on new i18n
/ build_x64 (push) Successful in 3m46s Details
/ build_arm64 (push) Successful in 10m10s Details

This commit is contained in:
core 2023-10-06 22:27:04 -04:00
parent 1da76da1a0
commit be14179c2d
Signed by: core
GPG Key ID: FDBF740DADDCEECF
41 changed files with 678 additions and 474 deletions

View File

@ -31,6 +31,6 @@
"bootstrap": "^5.3.2",
"bootswatch": "^5.3.2",
"qrcode": "^1.5.3",
"svelte-i18n": "^3.6.0"
"sveltekit-i18n": "^2.4.2"
}
}

View File

@ -1,6 +1,6 @@
<script lang="ts">
import {logDeltaReset, Logger, logSetup} from "$lib/logger";
import {t} from "svelte-i18n";
import {t} from "$lib/i18n/translations";
export let isLoading;
export let isError;

View File

@ -1,9 +0,0 @@
import { locale } from 'svelte-i18n';
export const handle = async ({ event, resolve }) => {
const lang = event.request.headers.get('accept-language')?.split(',')[0];
if (lang) {
locale.set(lang);
}
return resolve(event);
};
//# sourceMappingURL=hooks.server.js.map

View File

@ -1 +0,0 @@
{"version":3,"file":"hooks.server.js","sourceRoot":"","sources":["hooks.server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,MAAM,MAAM,GAAW,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACxE,IAAI,IAAI,EAAE;QACN,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;KACnB;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAA;AACzB,CAAC,CAAA"}

View File

@ -1,10 +0,0 @@
import type { Handle } from '@sveltejs/kit'
import { locale } from 'svelte-i18n'
export const handle: Handle = async ({ event, resolve }) => {
const lang = event.request.headers.get('accept-language')?.split(',')[0]
if (lang) {
locale.set(lang)
}
return resolve(event)
}

View File

@ -1,10 +0,0 @@
import { browser } from '$app/environment';
import { init, register } from 'svelte-i18n';
const defaultLocale = 'en';
register('en', () => import('./locales/en.json'));
//register('de', () => import('./locales/de.json'))
init({
fallbackLocale: defaultLocale,
initialLocale: browser ? window.navigator.language : defaultLocale,
});
//# sourceMappingURL=index.js.map

View File

@ -1 +0,0 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,aAAa,GAAG,IAAI,CAAA;AAE1B,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAA;AACjD,mDAAmD;AAEnD,IAAI,CAAC;IACD,cAAc,EAAE,aAAa;IAC7B,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa;CACrE,CAAC,CAAA"}

View File

@ -1,12 +0,0 @@
import { browser } from '$app/environment'
import { init, register } from 'svelte-i18n'
const defaultLocale = 'en'
register('en', () => import('./locales/en.json'))
//register('de', () => import('./locales/de.json'))
init({
fallbackLocale: defaultLocale,
initialLocale: browser ? window.navigator.language : defaultLocale,
})

View File

@ -1,215 +1,32 @@
{
"itworks": {
"header": "It works!",
"body": "If you're seeing this page, tfweb is installed and (probably) correctly configured.",
"linkbody": "Perhaps you meant to visit the {link0} or {link1}?",
"linkbody.link0": "admin panel",
"linkbody.link1": "create an account"
},
"login": {
"title": "Log in to your account",
"subtitle": "We'll send you an email with a \"magic link\".",
"label": "What is your email?",
"button": "Log in",
"email": "Check your email",
"emailbody": "We sent you an email with a link to complete logging in.",
"emailbody2": "Didn't work? Check your junk inbox or click {link0} to try again.",
"emailbody2.link0": "here",
"error": {
"invalidEmail": "That email address isn't valid. Try again.",
"generic": "There was an error logging you in. Try again or contact support with the error code {err}",
"usermissing": "That user does not exist."
},
"need": "Don't have an account? {link0}",
"need.link0": "Signup"
},
"signup": {
"title": "Create an account",
"subtitle": "We'll send you an email with a \"magic link\"",
"label": "What is your email?",
"button": "Create account",
"email": "Check your email",
"emailbody": "We sent you an email with a link to complete signing up.",
"emailbody2": "Didn't work? Check your junk inbox or click {link0} to try again.",
"emailbody2.link0": "here",
"error": {
"invalidEmail": "That email address isn't valid. Try again.",
"generic": "There was an error logging you in. Try again or contact support with the error code {err}",
"userexists": "That user already exists. Try {link0}?",
"userexists.link0": "logging in"
},
"already": "Already have an account? {link0}",
"already.link0": "Login"
},
"ml": {
"header": "Authenticated!",
"body": "Redirecting to admin page...",
"error": {
"notoken": "magic link token missing",
"badtoken": "token is invalid or has expired"
}
},
"2fasetup": {
"title": "Configure two-factor authentication",
"body": "Trifid requires all accounts to use TOTP two-factor authentication to help ensure the security of your network.",
"scan": "Scan this QR code with an authenticator app, like Authy or Google Authenticator.",
"code": "Or, enter the TOTP secret below into an authenticator app.",
"verify": "Verify by entering the 6-digit code shown in your authenticator into the box below.",
"button": "Enable 2FA",
"error": {
"generic": "Unable to enable 2fa: {err}",
"api": "Unable to contact the server. Try again later.",
"ERR_UNAUTHORIZED": "Incorrect 2FA code"
}
},
"2fa": {
"title": "Authenticate with TOTP",
"subtitle": "Enter the 6-digit code displayed in your authenticator app",
"label": "TOTP Code",
"button": "Verify",
"error": {
"ERR_UNAUTHORIZED": "Invalid 2FA code"
}
},
"networkcreate": {
"title": "Create your network",
"explain": "This defines what IP addresses will be assigned to your devices. The range you enter below must fall within either the RFC 1918 Private Address Space or the RFC 6598 Shared Address Space. Enter your network via CIDR notation.",
"label": "Network range",
"button": "Create network",
"valid": "Valid - {numIps} addresses ({start} to {end})",
"invalid": "Invalid",
"error": {
"generic": "Unable to create network: {err}",
"api": "Unable to contact the server. Try again later."
}
},
"hosts": {
"name": "Name",
"role": "Role",
"lastseen": "Last Seen",
"actions": "Actions",
"ipaddr": "IP Address",
"edit": "Edit",
"enroll": "Enroll",
"deletehost": "Delete",
"config": "Configuration",
"add": "Add",
"create": {
"name": "Host name",
"btn": "Add host",
"cancel": "Cancel",
"role": "Role",
"ip": "IP Address",
"error": {
"needsname": "Host name is required.",
"needsrole": "Role is required.",
"invalidip": "Invalid IP address"
}
},
"delete": {
"title": "Are you sure you want to delete the host {host}?",
"explainer": "This action cannot be undone. This host will still be able to connect to the network unless you block it first.",
"confirm": "I'm sure",
"cancel": "Nevermind",
"error": {
"ERR_DB_ERROR": "Removal failed"
}
}
},
"roles": {
"delete": {
"title": "Are you sure you want to delete the role {rule}?",
"explainer": "This action cannot be undone. This role must be removed from all hosts, lighthouses, and relays prior to deleting it.",
"confirm": "I'm sure",
"cancel": "Nevermind",
"error": {
"ERR_DB_ERROR": "Removal failed (role was probably still attached to a host)"
}
},
"create": "Add",
"explain": "Roles control how hosts, lighthouses, and relays communicate through firewall rules.",
"noroles": "You don't have any roles. You'll need to add at least one before you can add any hosts.",
"name": "Name",
"rules": "Rule count",
"description": "Description",
"actions": "Actions",
"add": {
"title": "Create Role",
"any": "Any",
"name": "Role name",
"desc": "Role description",
"button": "Create role",
"cancel": "Cancel",
"rules": "Inbound firewall rules",
"rulesexplainer": "Inbound traffic is denied by default. Add rules to allow traffic from hosts belonging to specific roles.",
"rulescols": {
"description": "Description",
"protocol": "Protocol",
"portrange": "Port range",
"allowedrole": "Allowed role",
"actions": "Actions"
},
"rulesadd": "Add rule",
"editrule": {
"protocol": "Protocol",
"range": "Port or port range",
"role": "Allowed role",
"desc": "Description",
"add": "Add rule",
"edit": "Save edit",
"cancel": "Cancel"
},
"error": {
"needsname": "Role Name is required"
}
},
"edit": {
"title": "Editing role {rule}",
"any": "Any",
"name": "Role name",
"desc": "Role description",
"button": "Save",
"cancel": "Cancel",
"rules": "Inbound firewall rules",
"rulesexplainer": "Inbound traffic is denied by default. Add rules to allow traffic from hosts belonging to specific roles.",
"rulescols": {
"description": "Description",
"protocol": "Protocol",
"portrange": "Port range",
"allowedrole": "Allowed role",
"actions": "Actions"
},
"ruleremove": "Remove rule",
"ruleedit": "Edit rule",
"rulesadd": "Add rule",
"editrule": {
"protocol": "Protocol",
"range": "Port or port range",
"role": "Allowed role",
"desc": "Description",
"add": "Add rule",
"edit": "Save edit",
"cancel": "Cancel"
}
}
},
"common": {
"title": "{title} | Trifid Web UI",
"page": {
"itworks": "It Works!",
"admin": "Admin Panel",
"login": "Login",
"ml": "Verify Magic Link",
"2fasetup": "Configure TOTP",
"2fa": "2-Factor Authentication",
"networkcreate": "Create Network",
"hosts": "Hosts",
"roles": "Roles",
"lighthouses": "Lighthouses",
"relays": "Relays",
"addhost": "Add Host"
},
"logout": "Log out",
"loading": "Dashboard is loading"
}
}

View File

@ -0,0 +1,9 @@
{
"title": "Authenticate with TOTP",
"subtitle": "Enter the 6-digit code displayed in your authenticator app",
"label": "TOTP Code",
"button": "Verify",
"error": {
"ERR_UNAUTHORIZED": "Invalid 2FA code"
}
}

View File

@ -0,0 +1,13 @@
{
"title": "Configure two-factor authentication",
"body": "Trifid requires all accounts to use TOTP two-factor authentication to help ensure the security of your network.",
"scan": "Scan this QR code with an authenticator app, like Authy or Google Authenticator.",
"code": "Or, enter the TOTP secret below into an authenticator app.",
"verify": "Verify by entering the 6-digit code shown in your authenticator into the box below.",
"button": "Enable 2FA",
"error": {
"generic": "Unable to enable 2fa: {err}",
"api": "Unable to contact the server. Try again later.",
"ERR_UNAUTHORIZED": "Incorrect 2FA code"
}
}

View File

@ -0,0 +1,19 @@
{
"title": "{title} | Trifid Web UI",
"page": {
"itworks": "It Works!",
"admin": "Admin Panel",
"login": "Login",
"ml": "Verify Magic Link",
"2fasetup": "Configure TOTP",
"2fa": "2-Factor Authentication",
"networkcreate": "Create Network",
"hosts": "Hosts",
"roles": "Roles",
"lighthouses": "Lighthouses",
"relays": "Relays",
"addhost": "Add Host"
},
"logout": "Log out",
"loading": "Dashboard is loading"
}

View File

@ -0,0 +1,41 @@
{
"name": "Name",
"role": "Role",
"lastseen": "Last Seen",
"actions": "Actions",
"ipaddr": "IP Address",
"edit": "Edit",
"enrollbtn": "Enroll",
"deletehost": "Delete",
"config": "Configuration",
"add": "Add",
"create": {
"name": "Host name",
"btn": "Add host",
"cancel": "Cancel",
"role": "Role",
"ip": "IP Address",
"error": {
"needsname": "Host name is required.",
"needsrole": "Role is required.",
"invalidip": "Invalid IP address",
"ERR_DUPLICATE_VALUE": "IP address already in use"
}
},
"enroll": {
"title": "Enrolling host {host}",
"explainer": "Enrolling this host will allow it to communicate on your network. You'll need to have compatible client software installed first.",
"done": "Done, return me to the hosts page",
"cancel": "Nevermind",
"code": "Input {code} as your enrollment code into any trifid-compatible client software to enroll. It will expire in {expires} minutes."
},
"delete": {
"title": "Are you sure you want to delete the host {host}?",
"explainer": "This action cannot be undone. This host will still be able to connect to the network unless you block it first.",
"confirm": "I'm sure",
"cancel": "Nevermind",
"error": {
"ERR_DB_ERROR": "Removal failed"
}
}
}

View File

@ -0,0 +1,7 @@
{
"header": "It works!",
"body": "If you're seeing this page, tfweb is installed and (probably) correctly configured.",
"linkbody": "Perhaps you meant to visit the {link0} or {link1}?",
"linkbody.link0": "admin panel",
"linkbody.link1": "create an account"
}

View File

@ -0,0 +1,17 @@
{
"title": "Log in to your account",
"subtitle": "We'll send you an email with a \"magic link\".",
"label": "What is your email?",
"button": "Log in",
"email": "Check your email",
"emailbody": "We sent you an email with a link to complete logging in.",
"emailbody2": "Didn't work? Check your junk inbox or click {link0} to try again.",
"emailbody2.link0": "here",
"error": {
"invalidEmail": "That email address isn't valid. Try again.",
"generic": "There was an error logging you in. Try again or contact support with the error code {err}",
"usermissing": "That user does not exist."
},
"need": "Don't have an account? {link0}",
"need.link0": "Signup"
}

View File

@ -0,0 +1,8 @@
{
"header": "Authenticated!",
"body": "Redirecting to admin page...",
"error": {
"notoken": "magic link token missing",
"badtoken": "token is invalid or has expired"
}
}

View File

@ -0,0 +1,12 @@
{
"title": "Create your network",
"explain": "This defines what IP addresses will be assigned to your devices. The range you enter below must fall within either the RFC 1918 Private Address Space or the RFC 6598 Shared Address Space. Enter your network via CIDR notation.",
"label": "Network range",
"button": "Create network",
"valid": "Valid - {numIps} addresses ({start} to {end})",
"invalid": "Invalid",
"error": {
"generic": "Unable to create network: {err}",
"api": "Unable to contact the server. Try again later."
}
}

View File

@ -0,0 +1,77 @@
{
"delete": {
"title": "Are you sure you want to delete the role {rule}?",
"explainer": "This action cannot be undone. This role must be removed from all hosts, lighthouses, and relays prior to deleting it.",
"confirm": "I'm sure",
"cancel": "Nevermind",
"error": {
"ERR_DB_ERROR": "Removal failed (role was probably still attached to a host)"
}
},
"create": "Add",
"explain": "Roles control how hosts, lighthouses, and relays communicate through firewall rules.",
"noroles": "You don't have any roles. You'll need to add at least one before you can add any hosts.",
"name": "Name",
"rules": "Rule count",
"description": "Description",
"actions": "Actions",
"add": {
"title": "Create Role",
"any": "Any",
"name": "Role name",
"desc": "Role description",
"button": "Create role",
"cancel": "Cancel",
"rules": "Inbound firewall rules",
"rulesexplainer": "Inbound traffic is denied by default. Add rules to allow traffic from hosts belonging to specific roles.",
"rulescols": {
"description": "Description",
"protocol": "Protocol",
"portrange": "Port range",
"allowedrole": "Allowed role",
"actions": "Actions"
},
"rulesadd": "Add rule",
"editrule": {
"protocol": "Protocol",
"range": "Port or port range",
"role": "Allowed role",
"desc": "Description",
"add": "Add rule",
"edit": "Save edit",
"cancel": "Cancel"
},
"error": {
"needsname": "Role Name is required"
}
},
"edit": {
"title": "Editing role {rule}",
"any": "Any",
"name": "Role name",
"desc": "Role description",
"button": "Save",
"cancel": "Cancel",
"rules": "Inbound firewall rules",
"rulesexplainer": "Inbound traffic is denied by default. Add rules to allow traffic from hosts belonging to specific roles.",
"rulescols": {
"description": "Description",
"protocol": "Protocol",
"portrange": "Port range",
"allowedrole": "Allowed role",
"actions": "Actions"
},
"ruleremove": "Remove rule",
"ruleedit": "Edit rule",
"rulesadd": "Add rule",
"editrule": {
"protocol": "Protocol",
"range": "Port or port range",
"role": "Allowed role",
"desc": "Description",
"add": "Add rule",
"edit": "Save edit",
"cancel": "Cancel"
}
}
}

View File

@ -0,0 +1,18 @@
{
"title": "Create an account",
"subtitle": "We'll send you an email with a \"magic link\"",
"label": "What is your email?",
"button": "Create account",
"email": "Check your email",
"emailbody": "We sent you an email with a link to complete signing up.",
"emailbody2": "Didn't work? Check your junk inbox or click {link0} to try again.",
"emailbody2.link0": "here",
"error": {
"invalidEmail": "That email address isn't valid. Try again.",
"generic": "There was an error logging you in. Try again or contact support with the error code {err}",
"userexists": "That user already exists. Try {link0}?",
"userexists.link0": "logging in"
},
"already": "Already have an account? {link0}",
"already.link0": "Login"
}

View File

@ -0,0 +1,223 @@
{
"itworks": {
"header": "Het werkt!",
"body": "Als u deze pagina ziet, is tfweb geïnstalleerd en (waarschijnlijk) correct geconfigureerd.",
"linkbody": "Misschien wilde je het {link0} of {link1}?",
"linkbody.link0": "beheerdersdashboard bezoeken",
"linkbody.link1": "een account aanmaken"
},
"login": {
"title": "Log in to your account",
"subtitle": "We'll send you an email with a \"magic link\".",
"label": "What is your email?",
"button": "Log in",
"email": "Check your email",
"emailbody": "We sent you an email with a link to complete logging in.",
"emailbody2": "Didn't work? Check your junk inbox or click {link0} to try again.",
"emailbody2.link0": "here",
"error": {
"invalidEmail": "That email address isn't valid. Try again.",
"generic": "There was an error logging you in. Try again or contact support with the error code {err}",
"usermissing": "That user does not exist."
},
"need": "Don't have an account? {link0}",
"need.link0": "Signup"
},
"signup": {
"title": "Create an account",
"subtitle": "We'll send you an email with a \"magic link\"",
"label": "What is your email?",
"button": "Create account",
"email": "Check your email",
"emailbody": "We sent you an email with a link to complete signing up.",
"emailbody2": "Didn't work? Check your junk inbox or click {link0} to try again.",
"emailbody2.link0": "here",
"error": {
"invalidEmail": "That email address isn't valid. Try again.",
"generic": "There was an error logging you in. Try again or contact support with the error code {err}",
"userexists": "That user already exists. Try {link0}?",
"userexists.link0": "logging in"
},
"already": "Already have an account? {link0}",
"already.link0": "Login"
},
"ml": {
"header": "Authenticated!",
"body": "Redirecting to admin page...",
"error": {
"notoken": "magic link token missing",
"badtoken": "token is invalid or has expired"
}
},
"2fasetup": {
"title": "Configure two-factor authentication",
"body": "Trifid requires all accounts to use TOTP two-factor authentication to help ensure the security of your network.",
"scan": "Scan this QR code with an authenticator app, like Authy or Google Authenticator.",
"code": "Or, enter the TOTP secret below into an authenticator app.",
"verify": "Verify by entering the 6-digit code shown in your authenticator into the box below.",
"button": "Enable 2FA",
"error": {
"generic": "Unable to enable 2fa: {err}",
"api": "Unable to contact the server. Try again later.",
"ERR_UNAUTHORIZED": "Incorrect 2FA code"
}
},
"2fa": {
"title": "Authenticate with TOTP",
"subtitle": "Enter the 6-digit code displayed in your authenticator app",
"label": "TOTP Code",
"button": "Verify",
"error": {
"ERR_UNAUTHORIZED": "Invalid 2FA code"
}
},
"networkcreate": {
"title": "Create your network",
"explain": "This defines what IP addresses will be assigned to your devices. The range you enter below must fall within either the RFC 1918 Private Address Space or the RFC 6598 Shared Address Space. Enter your network via CIDR notation.",
"label": "Network range",
"button": "Create network",
"valid": "Valid - {numIps} addresses ({start} to {end})",
"invalid": "Invalid",
"error": {
"generic": "Unable to create network: {err}",
"api": "Unable to contact the server. Try again later."
}
},
"hosts": {
"name": "Name",
"role": "Role",
"lastseen": "Last Seen",
"actions": "Actions",
"ipaddr": "IP Address",
"edit": "Edit",
"enrollbtn": "Enroll",
"deletehost": "Delete",
"config": "Configuration",
"add": "Add",
"create": {
"name": "Host name",
"btn": "Add host",
"cancel": "Cancel",
"role": "Role",
"ip": "IP Address",
"error": {
"needsname": "Host name is required.",
"needsrole": "Role is required.",
"invalidip": "Invalid IP address",
"ERR_DUPLICATE_VALUE": "IP address already in use"
}
},
"enroll": {
"title": "Enrolling host {host}",
"explainer": "Enrolling this host will allow it to communicate on your network. You'll need to have compatible client software installed first.",
"done": "Done, return me to the hosts page",
"cancel": "Nevermind",
"code": "Input {code} as your enrollment code into any trifid-compatible client software to enroll. It will expire in {expires} minutes."
},
"delete": {
"title": "Are you sure you want to delete the host {host}?",
"explainer": "This action cannot be undone. This host will still be able to connect to the network unless you block it first.",
"confirm": "I'm sure",
"cancel": "Nevermind",
"error": {
"ERR_DB_ERROR": "Removal failed"
}
}
},
"roles": {
"delete": {
"title": "Are you sure you want to delete the role {rule}?",
"explainer": "This action cannot be undone. This role must be removed from all hosts, lighthouses, and relays prior to deleting it.",
"confirm": "I'm sure",
"cancel": "Nevermind",
"error": {
"ERR_DB_ERROR": "Removal failed (role was probably still attached to a host)"
}
},
"create": "Add",
"explain": "Roles control how hosts, lighthouses, and relays communicate through firewall rules.",
"noroles": "You don't have any roles. You'll need to add at least one before you can add any hosts.",
"name": "Name",
"rules": "Rule count",
"description": "Description",
"actions": "Actions",
"add": {
"title": "Create Role",
"any": "Any",
"name": "Role name",
"desc": "Role description",
"button": "Create role",
"cancel": "Cancel",
"rules": "Inbound firewall rules",
"rulesexplainer": "Inbound traffic is denied by default. Add rules to allow traffic from hosts belonging to specific roles.",
"rulescols": {
"description": "Description",
"protocol": "Protocol",
"portrange": "Port range",
"allowedrole": "Allowed role",
"actions": "Actions"
},
"rulesadd": "Add rule",
"editrule": {
"protocol": "Protocol",
"range": "Port or port range",
"role": "Allowed role",
"desc": "Description",
"add": "Add rule",
"edit": "Save edit",
"cancel": "Cancel"
},
"error": {
"needsname": "Role Name is required"
}
},
"edit": {
"title": "Editing role {rule}",
"any": "Any",
"name": "Role name",
"desc": "Role description",
"button": "Save",
"cancel": "Cancel",
"rules": "Inbound firewall rules",
"rulesexplainer": "Inbound traffic is denied by default. Add rules to allow traffic from hosts belonging to specific roles.",
"rulescols": {
"description": "Description",
"protocol": "Protocol",
"portrange": "Port range",
"allowedrole": "Allowed role",
"actions": "Actions"
},
"ruleremove": "Remove rule",
"ruleedit": "Edit rule",
"rulesadd": "Add rule",
"editrule": {
"protocol": "Protocol",
"range": "Port or port range",
"role": "Allowed role",
"desc": "Description",
"add": "Add rule",
"edit": "Save edit",
"cancel": "Cancel"
}
}
},
"common": {
"title": "{title} | Trifid Web UI",
"page": {
"itworks": "It Works!",
"admin": "Admin Panel",
"login": "Login",
"ml": "Verify Magic Link",
"2fasetup": "Configure TOTP",
"2fa": "2-Factor Authentication",
"networkcreate": "Create Network",
"hosts": "Hosts",
"roles": "Roles",
"lighthouses": "Lighthouses",
"relays": "Relays",
"addhost": "Add Host"
},
"logout": "Log out",
"loading": "Dashboard is loading"
}
}

View File

@ -0,0 +1,27 @@
import i18n from 'sveltekit-i18n';
import type {Config} from 'sveltekit-i18n';
function buildLoader(locale: string, key: string, file: string) {
return {
locale: locale,
key: key,
loader: async () => ( await import (file)).default
}
}
const config: Config = ({
loaders: [
buildLoader('en', '2fa', './locales/en/2fa.json'),
buildLoader('en', '2fasetup', './locales/en/2fasetup.json'),
buildLoader('en', 'common', './locales/en/common.json'),
buildLoader('en', 'hosts', './locales/en/hosts.json'),
buildLoader('en', 'itworks', './locales/en/itworks.json'),
buildLoader('en', 'login', './locales/en/login.json'),
buildLoader('en', 'ml', './locales/en/ml.json'),
buildLoader('en', 'networkcreate', './locales/en/networkcreate.json'),
buildLoader('en', 'roles', './locales/en/roles.json'),
buildLoader('en', 'signup', './locales/en/signup.json'),
]
})
export const { t, locale, locales, loading, loadTranslations } = new i18n(config);

View File

@ -1,11 +1,9 @@
import { browser } from '$app/environment'
import '$lib/i18n'
import { locale, waitLocale } from 'svelte-i18n'
import type { LayoutLoad } from './$types'
import {loadTranslations} from "$lib/i18n/translations";
export const load: LayoutLoad = async () => {
if (browser) {
locale.set(window.navigator.language)
}
await waitLocale()
export const load: LayoutLoad = async ({url}) => {
const { pathname } = url;
const initLocale = 'en';
await loadTranslations(initLocale, pathname);
return {};
}

View File

@ -1,12 +1,12 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
onMount(() => {
setTimeout(() => loading = false, 1000);

View File

@ -1,16 +1,16 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, authSession, authTotp, isAuthedSession, verifyTotp} from "$lib/auth.ts";
import type {SessionInfo} from "$lib/auth.ts";
import type {APIError} from "$lib/auth.ts";
import {Logger, logSetup} from "$lib/logger";
import {loading as tLoading, t} from "$lib/i18n/translations";
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading;
$: currentlyLoading = $tLoading;
logSetup();
let logger = new Logger("2fa/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, authSession, createTotp, isAuthedSession, verifyTotp} from "$lib/auth.ts";
@ -13,7 +13,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading;
$: currentlyLoading = $tLoading;
logSetup();
let logger = new Logger("2fasetup/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -11,7 +11,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
logSetup();
let logger = new Logger("admin/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -14,7 +14,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
let hosts: Host[] = [];
let roles: Role[] = [];
@ -69,12 +69,15 @@
}
const hostsApi = new HostsApi(configuration);
hosts = (await hostsApi.hostsList({
filterIsLighthouse: false,
filterIsRelay: false
})).data!;
let resp = await hostsApi.hostsList({
//filterIsLighthouse: true,
//filterIsRelay: false
pageSize: 1000
});
console.log(hosts);
console.log(resp);
hosts = resp.data!;
const rolesApi = new RolesApi(configuration);
roles = (await rolesApi.rolesList()).data!;
@ -121,7 +124,7 @@
<td><a href="/roles/{host.roleID}/edit">{getRoleName(host.roleID)}</a></td>
<td>
<div class="btn-group">
<a href="/hosts/{host.id}/enroll" title="{$t('hosts.enroll')}" class="btn btn-success"><i class="fas fa-arrows-rotate fa-fw"></i></a>
<a href="/hosts/{host.id}/enroll" title="{$t('hosts.enrollbtn')}" class="btn btn-success"><i class="fas fa-arrows-rotate fa-fw"></i></a>
<a href="/hosts/{host.id}/edit" title="{$t('hosts.edit')}" class="btn btn-primary"><i class="fas fa-pencil fa-fw"></i></a>
<a href="/hosts/{host.id}/edit/config" title="{$t('hosts.config')}" class="btn btn-info"><i class="fas fa-gear fa-fw"></i></a>
<a href="/hosts/{host.id}/delete" title="{$t('hosts.deletehost')}" class="btn btn-danger"><i class="fas fa-trash fa-fw"></i></a>

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -18,10 +18,10 @@
let fullPageLoading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || fullPageLoading;
$: currentlyLoading = $tLoading || fullPageLoading;
logSetup();
let logger = new Logger("hosts/edit/+page.svelte");
let logger = new Logger("hosts/delete/+page.svelte");
let hosts;
let host: HostGet200Response = {

View File

@ -0,0 +1,122 @@
<script lang="ts">
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
import {Logger, logSetup} from "$lib/logger";
import type {APIError} from "$lib/auth.ts";
import {PUBLIC_BASE_URL} from "$env/static/public";
import {Configuration, NetworksApi, HostsApi, FirewallRuleProtocolEnum, ResponseError} from "$lib/api";
import type {FirewallRule} from "$lib/api";
import AdminBar from "$components/AdminLayout.svelte";
import {page} from "$app/stores";
import AdminLayout from "$components/AdminLayout.svelte";
import {load} from "../../../+layout";
import type {HostGet200Response} from "$lib/api";
let loading = true;
let fullPageLoading = true;
let isError = false;
let error = '';
$: currentlyLoading = $tLoading || fullPageLoading;
logSetup();
let logger = new Logger("hosts/enroll/+page.svelte");
let hosts;
let host: HostGet200Response = {
data: {
name: 'Loading'
}
};
let formErr = '';
let hasFormErr = false;
let code = {};
onMount(async () => {
let session_load_info = await isAuthedSession();
if (session_load_info[0] == APIResult.Failed) {
let err = session_load_info[1] as APIError;
logger.error(`session load failed: ${err.code} ${err.message}`);
window.location.href = '/login';
return;
}
let mfa_load_info = await isAuthedMFA();
if (mfa_load_info[0] == APIResult.Failed) {
let err = mfa_load_info[1] as APIError;
logger.error(`mfa load failed: ${err.code} ${err.message}`);
window.location.href = '/2fa';
return;
}
// pull networks
const configuration = new Configuration({
basePath: PUBLIC_BASE_URL,
accessToken: window.localStorage.getItem("session") + " " + window.localStorage.getItem("mfa")
});
const networksApi = new NetworksApi(configuration);
let networks;
try {
networks = await networksApi.networksList();
} catch (e) {
let resp_json = await e.response.json();
if (resp_json.errors[0].code == "ERR_NO_ORG") {
window.location.href = "/networkcreate";
return;
} else {
isError = true;
error = $t("networkcreate.error.generic", {values:{err:resp_json.errors[0].code}});
loading = false;
return;
}
}
console.log(networks);
if (networks.data?.length == 0) {
window.location.href = '/networkcreate';
return;
}
const hostsApi = new HostsApi(configuration);
hosts = await hostsApi.hostsList();
// pull our role
host = await hostsApi.hostGet({
hostID: $page.params.host_id
});
// pull enrollment code
code = (await hostsApi.hostEnrollCodeCreate({
hostID: $page.params.host_id
}))?.data?.enrollmentCode!;
console.log(code);
fullPageLoading = false;
loading = false;
});
</script>
<svelte:head>
<title>{$t("common.title", {values: {title: $t("common.page.hosts")}})}</title>
</svelte:head>
<LoadingWrapper isLoading={currentlyLoading} isError={isError} error={error}>
<AdminLayout selected="hosts">
<h3>{$t("hosts.enroll.title", {values: {host: host.data.name}})}</h3>
<p>{$t("hosts.enroll.explainer")}</p>
{#if loading}
<button disabled class="btn btn-success"><i class="fas fa-gear fa-spin"></i></button>
{:else}
<p>{$t("hosts.enroll.code", {values:{code: code.code, expires: code.lifetimeSeconds / 60}})}</p>
<button on:click={window.location.href = "/hosts"} class="btn btn-success">{$t("hosts.enroll.done")}</button>
{/if}
<button on:click={() => {window.location.href = "/hosts"}} class="btn btn-outline-info">{$t("hosts.enroll.cancel")}</button>
{#if hasFormErr}
<p class="text-danger">{formErr}</p>
{/if}
</AdminLayout>
</LoadingWrapper>

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -15,7 +15,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading;
$: currentlyLoading = $tLoading;
let hosts: Host[] = [];
let roles: Role[] = [];
@ -142,7 +142,10 @@
name: hostName,
networkID: network,
ipAddress: ipAddr,
roleID: roleId
roleID: roleId,
listenPort: 4242,
isLighthouse: false,
isRelay: false
}
})
} catch (e) {

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -12,7 +12,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
logSetup();
let logger = new Logger("lighthouses/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, authSession, isAuthedSession} from "$lib/auth.ts";
@ -9,7 +9,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading;
$: currentlyLoading = $tLoading;
logSetup();
let logger = new Logger("login/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, verifyLink} from "$lib/auth.ts";
@ -9,7 +9,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
logSetup();
let logger = new Logger("magic-link/+page.svelte");

View File

@ -12,7 +12,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading;
$: currentlyLoading = $tLoading;
logSetup();
let logger = new Logger("networkcreate/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -12,7 +12,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
logSetup();
let logger = new Logger("relays/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -12,7 +12,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
logSetup();
let logger = new Logger("roles/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -17,7 +17,7 @@
let fullPageLoading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || fullPageLoading;
$: currentlyLoading = $tLoading || fullPageLoading;
logSetup();
let logger = new Logger("roles/edit/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -15,7 +15,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading || loading;
$: currentlyLoading = $tLoading || loading;
logSetup();
let logger = new Logger("roles/edit/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, isAuthedMFA, isAuthedSession} from "$lib/auth.ts";
@ -14,7 +14,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading;
$: currentlyLoading = $tLoading;
logSetup();
let logger = new Logger("roles/add/+page.svelte");

View File

@ -1,5 +1,5 @@
<script lang="ts">
import {isLoading, t} from "svelte-i18n";
import {loading as tLoading, t} from "$lib/i18n/translations";
import LoadingWrapper from "$components/LoadingWrapper.svelte";
import {onMount} from "svelte";
import {APIResult, authSession, isAuthedSession, signup} from "$lib/auth.ts";
@ -9,7 +9,7 @@
let loading = true;
let isError = false;
let error = '';
$: currentlyLoading = $isLoading;
$: currentlyLoading = $tLoading;
logSetup();
let logger = new Logger("signup/+page.svelte");

View File

@ -144,45 +144,6 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3"
integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==
"@formatjs/ecma402-abstract@1.11.4":
version "1.11.4"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz#b962dfc4ae84361f9f08fbce411b4e4340930eda"
integrity sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==
dependencies:
"@formatjs/intl-localematcher" "0.2.25"
tslib "^2.1.0"
"@formatjs/fast-memoize@1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz#e6f5aee2e4fd0ca5edba6eba7668e2d855e0fc21"
integrity sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==
dependencies:
tslib "^2.1.0"
"@formatjs/icu-messageformat-parser@2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz#a54293dd7f098d6a6f6a084ab08b6d54a3e8c12d"
integrity sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==
dependencies:
"@formatjs/ecma402-abstract" "1.11.4"
"@formatjs/icu-skeleton-parser" "1.3.6"
tslib "^2.1.0"
"@formatjs/icu-skeleton-parser@1.3.6":
version "1.3.6"
resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz#4ce8c0737d6f07b735288177049e97acbf2e8964"
integrity sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==
dependencies:
"@formatjs/ecma402-abstract" "1.11.4"
tslib "^2.1.0"
"@formatjs/intl-localematcher@0.2.25":
version "0.2.25"
resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz#60892fe1b271ec35ba07a2eb018a2dd7bca6ea3a"
integrity sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==
dependencies:
tslib "^2.1.0"
"@fortawesome/fontawesome-free@^6.4.2":
version "6.4.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.2.tgz#36b6a9cb5ffbecdf89815c94d0c0ffa489ac5ecb"
@ -307,6 +268,16 @@
svelte-hmr "^0.15.1"
vitefu "^0.2.4"
"@sveltekit-i18n/base@~1.3.0":
version "1.3.6"
resolved "https://registry.yarnpkg.com/@sveltekit-i18n/base/-/base-1.3.6.tgz#5e6cc199d2df6ec4cbda74bfe76f153c1f38cf47"
integrity sha512-zg0VBny0RIMuNcsNV4ESuXvMNIGlUvD+3b9ZCHRZHnzxwuIY+7wWVCyhTPsHvIQeXStLVVxaxPbNZ3LJUPE2EA==
"@sveltekit-i18n/parser-default@~1.1.0":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@sveltekit-i18n/parser-default/-/parser-default-1.1.1.tgz#9443f5546bfea4c6d201ab07e98b66f76e5b4fe6"
integrity sha512-/gtzLlqm/sox7EoPKD56BxGZktK/syGc79EbJAPWY5KVitQD9SM0TP8yJCqDxTVPk7Lk0WJhrBGUE2Nn0f5M1w==
"@types/cookie@^0.5.1":
version "0.5.1"
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.5.1.tgz#b29aa1f91a59f35e29ff8f7cb24faf1a3a750554"
@ -553,17 +524,6 @@ chokidar@^3.4.1:
optionalDependencies:
fsevents "~2.3.2"
cli-color@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.3.tgz#73769ba969080629670f3f2ef69a4bf4e7cc1879"
integrity sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==
dependencies:
d "^1.0.1"
es5-ext "^0.10.61"
es6-iterator "^2.0.3"
memoizee "^0.4.15"
timers-ext "^0.1.7"
cliui@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
@ -604,14 +564,6 @@ cross-spawn@^7.0.2:
shebang-command "^2.0.0"
which "^2.0.1"
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
dependencies:
es5-ext "^0.10.50"
type "^1.0.1"
debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
@ -629,7 +581,7 @@ deep-is@^0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@^4.2.2, deepmerge@^4.3.1:
deepmerge@^4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
@ -673,47 +625,11 @@ encode-utf8@^1.0.3:
resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
version "0.10.62"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
dependencies:
es6-iterator "^2.0.3"
es6-symbol "^3.1.3"
next-tick "^1.1.0"
es6-iterator@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
dependencies:
d "1"
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-promise@^3.1.2:
version "3.3.1"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==
es6-symbol@^3.1.1, es6-symbol@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
dependencies:
d "^1.0.1"
ext "^1.1.2"
es6-weak-map@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
dependencies:
d "1"
es5-ext "^0.10.46"
es6-iterator "^2.0.3"
es6-symbol "^3.1.1"
esbuild@^0.17.5:
version "0.17.19"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955"
@ -866,31 +782,11 @@ estraverse@^5.1.0, estraverse@^5.2.0:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
estree-walker@^2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
esutils@^2.0.2, esutils@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
dependencies:
d "1"
es5-ext "~0.10.14"
ext@^1.1.2:
version "1.7.0"
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
dependencies:
type "^2.7.2"
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@ -1093,16 +989,6 @@ inherits@2:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
intl-messageformat@^9.13.0:
version "9.13.0"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.13.0.tgz#97360b73bd82212e4f6005c712a4a16053165468"
integrity sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==
dependencies:
"@formatjs/ecma402-abstract" "1.11.4"
"@formatjs/fast-memoize" "1.2.1"
"@formatjs/icu-messageformat-parser" "2.1.0"
tslib "^2.1.0"
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@ -1137,11 +1023,6 @@ is-path-inside@^3.0.3:
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
is-promise@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@ -1213,13 +1094,6 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
lru-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==
dependencies:
es5-ext "~0.10.2"
magic-string@^0.27.0:
version "0.27.0"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3"
@ -1234,20 +1108,6 @@ magic-string@^0.30.0:
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.13"
memoizee@^0.4.15:
version "0.4.15"
resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72"
integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
dependencies:
d "^1.0.1"
es5-ext "^0.10.53"
es6-weak-map "^2.0.3"
event-emitter "^0.3.5"
is-promise "^2.2.2"
lru-queue "^0.1.0"
next-tick "^1.1.0"
timers-ext "^0.1.7"
merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
@ -1320,11 +1180,6 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
next-tick@1, next-tick@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@ -1669,18 +1524,6 @@ svelte-hmr@^0.15.1:
resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.15.2.tgz#d2f6fc82e040f2734abd54cea5cbef46828f2538"
integrity sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==
svelte-i18n@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/svelte-i18n/-/svelte-i18n-3.6.0.tgz#0f345d066662dd8f46efefc0e867fb05b71c9dbd"
integrity sha512-qvvcMqHVCXJ5pHoQR5uGzWAW5vS3qB9mBq+W6veLZ6jkrzZGOziR+wyOUJsc59BupMh+Ae30qjOndFrRU6v5jA==
dependencies:
cli-color "^2.0.3"
deepmerge "^4.2.2"
estree-walker "^2"
intl-messageformat "^9.13.0"
sade "^1.8.1"
tiny-glob "^0.2.9"
svelte-preprocess@^5.0.3:
version "5.0.4"
resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz#2123898e079a074f7f4ef1799e10e037f5bcc55b"
@ -1697,19 +1540,19 @@ svelte@^3.54.0:
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.59.1.tgz#3de3d56b9165748f32f3131589b8d183cabe7449"
integrity sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==
sveltekit-i18n@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/sveltekit-i18n/-/sveltekit-i18n-2.4.2.tgz#9bba204630b098425d5b87838c13213596d75a6d"
integrity sha512-hjRWn4V4DBL8JQKJoJa3MRvn6d32Zo+rWkoSP5bsQ/XIAguPdQUZJ8LMe6Nc1rST8WEVdu9+vZI3aFdKYGR3+Q==
dependencies:
"@sveltekit-i18n/base" "~1.3.0"
"@sveltekit-i18n/parser-default" "~1.1.0"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
timers-ext@^0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
dependencies:
es5-ext "~0.10.46"
next-tick "1"
tiny-glob@^0.2.9:
version "0.2.9"
resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2"
@ -1735,7 +1578,7 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.1.0, tslib@^2.4.1:
tslib@^2.4.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338"
integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==
@ -1759,16 +1602,6 @@ type-fest@^0.20.2:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
type@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.7.2:
version "2.7.2"
resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
typescript@^5.0.0, typescript@^5.0.3:
version "5.0.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"