diff --git a/package-lock.json b/package-lock.json index e85d669..bdf4ebd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-refresh": "^0.4.7", "gh-pages": "^5.0.0", + "ts-node": "^10.9.2", "typescript": "^5.4.5", "typescript-eslint": "^7.8.0", "web-vitals": "^4.0.1" @@ -513,6 +514,28 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", @@ -1800,6 +1823,30 @@ "tslib": "^2.6.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -2130,6 +2177,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2171,6 +2227,12 @@ "node": ">=4" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -2565,6 +2627,12 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2692,6 +2760,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4575,6 +4652,12 @@ "semver": "bin/semver" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/markdown-to-jsx": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz", @@ -5788,6 +5871,49 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", @@ -5985,6 +6111,12 @@ "punycode": "^2.1.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/vite": { "version": "5.2.12", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", @@ -6205,6 +6337,15 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 74c4f2c..5ce2899 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,9 @@ "start": "vite --port 3000 --host", "build": "tsc && vite build", "serve": "vite preview", - "predeploy": "npm run build", - "deploy": "sh deploy.sh" + "predeploy": "npm run sitemap && npm run build", + "deploy": "sh deploy.sh", + "sitemap": "node --experimental-specifier-resolution=node --loader ts-node/esm ./src/tools/sitemapGenerator.js" }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.4.0", @@ -50,6 +51,7 @@ "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-refresh": "^0.4.7", "gh-pages": "^5.0.0", + "ts-node": "^10.9.2", "typescript": "^5.4.5", "typescript-eslint": "^7.8.0", "web-vitals": "^4.0.1" diff --git a/public/sitemap.xml b/public/sitemap.xml index 4252be3..1aa9836 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -4,38 +4,67 @@ xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"> https://os.prozilla.dev/ + 2024-6-9 + - https://os.prozilla.dev/assets/banner-logo-title.png - - - https://os.prozilla.dev/assets/screenshots/screenshot-files-info-taskbar-desktop.png + https://os.prozilla.dev/assets/wallpapers/vibrant-wallpaper-blue-purple-red.png https://os.prozilla.dev/assets/wallpapers/abstract-mesh-gradient-orange-red-purple.png + + https://os.prozilla.dev/assets/wallpapers/vibrant-wallpaper-purple-yellow.png + https://os.prozilla.dev/assets/wallpapers/abstract-wallpaper-mesh-gradient-cyan.png https://os.prozilla.dev/assets/wallpapers/colorful-abstract-wallpaper-blue-red-green.png - - https://os.prozilla.dev/assets/wallpapers/colorful-mesh-gradient-red-green.png - https://os.prozilla.dev/assets/wallpapers/mesh-gradient-wallpaper-red-purple.png - https://os.prozilla.dev/assets/wallpapers/vibrant-wallpaper-blue-purple-red.png - - - https://os.prozilla.dev/assets/wallpapers/vibrant-wallpaper-purple-yellow.png - - - https://os.prozilla.dev/assets/wallpapers/wave-abstract-wallpaper-teal.png + https://os.prozilla.dev/assets/wallpapers/colorful-mesh-gradient-red-green.png https://os.prozilla.dev/assets/wallpapers/flame-abstract-wallpaper-orange.png + + https://os.prozilla.dev/assets/wallpapers/wave-abstract-wallpaper-teal.png + + + + + https://os.prozilla.dev/terminal + 2024-6-9 + + + https://os.prozilla.dev/settings + 2024-6-9 + + + https://os.prozilla.dev/media-viewer + 2024-6-9 + + + https://os.prozilla.dev/text-editor + 2024-6-9 + + + https://os.prozilla.dev/file-explorer + 2024-6-9 + + + https://os.prozilla.dev/calculator + 2024-6-9 + + + https://os.prozilla.dev/browser + 2024-6-9 + + + https://os.prozilla.dev/logic-sim + 2024-6-9 \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index f243646..e938a9c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,4 @@ import styles from "./App.module.css"; -import { Taskbar } from "./components/taskbar/Taskbar"; -import { WindowsView } from "./components/windows/WindowsView"; -import { Desktop } from "./components/desktop/Desktop"; -import { ModalsView } from "./components/modals/ModalsView"; import { ReactElement, useEffect } from "react"; import { ZIndexManagerProvider } from "./hooks/z-index/zIndexManagerProvider"; import { ThemeProvider } from "./hooks/themes/themes"; @@ -10,6 +6,7 @@ import { VirtualRootProvider } from "./hooks/virtual-drive/virtualRootProvider"; import { WindowsManagerProvider } from "./hooks/windows/windowsManagerProvider"; import { ModalsManagerProvider } from "./hooks/modals/modalsManagerProvider"; import { SettingsManagerProvider } from "./hooks/settings/settingsManagerProvider"; +import { Router } from "./components/router/Router"; export default function App(): ReactElement { useEffect(() => { @@ -31,10 +28,7 @@ export default function App(): ReactElement {
- - - - +
diff --git a/src/components/_utils/button/Button.tsx b/src/components/_utils/button/Button.tsx index bc91c50..c5bb499 100644 --- a/src/components/_utils/button/Button.tsx +++ b/src/components/_utils/button/Button.tsx @@ -1,18 +1,21 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import styles from "./Button.module.css"; import { faExternalLink } from "@fortawesome/free-solid-svg-icons"; -import { ReactNode } from "react"; +import { HTMLAttributeAnchorTarget, ReactNode } from "react"; +import { IconProp } from "@fortawesome/fontawesome-svg-core"; interface ButtonProps { className?: string; href?: string; + icon?: IconProp; + target?: HTMLAttributeAnchorTarget; children?: ReactNode; - [key: string]: any; + [key: string]: unknown; } export function Button(props: ButtonProps) { let { className = "" } = props; - const { href, children } = props; + const { href, children, icon, target } = props; className = `${styles.Button} ${className}`; @@ -21,14 +24,14 @@ export function Button(props: ButtonProps) { return ( {children} - + ); } else { return ( + ; +} \ No newline at end of file diff --git a/src/config/branding.config.ts b/src/config/branding.config.ts index 351c411..f5ad4b5 100644 --- a/src/config/branding.config.ts +++ b/src/config/branding.config.ts @@ -2,6 +2,7 @@ import { ANSI } from "./apps/terminal.config"; export const NAME = "ProzillaOS"; export const TAG_LINE = "Web-based Operating System"; +export const BASE_URL = "https://os.prozilla.dev/"; export const ASCII_LOGO = ` :. diff --git a/src/features/_utils/browser.utils.ts b/src/features/_utils/browser.utils.ts index d6039cd..4b99aa4 100644 --- a/src/features/_utils/browser.utils.ts +++ b/src/features/_utils/browser.utils.ts @@ -29,6 +29,10 @@ export function isValidUrl(string: string): boolean { export function setViewportTitle(title: string) { document.title = title; + + document.querySelectorAll("meta[property='og:title'], meta[name='twitter:title']")?.forEach((element) => { + element.setAttribute("content", title); + }); } export function setViewportIcon(url: string) { diff --git a/src/features/apps/appsManager.ts b/src/features/apps/appsManager.ts index be97a45..a1c341b 100644 --- a/src/features/apps/appsManager.ts +++ b/src/features/apps/appsManager.ts @@ -36,7 +36,7 @@ export default class AppsManager { new App(APP_NAMES.BROWSER, APPS.BROWSER, Browser, { size: new Vector2(700, 500) }), - new App("Logic Sim (WIP)", "logic-sim", LogicSim), + new App("Logic Sim (WIP)", APPS.LOGIC_SIM, LogicSim), ]; static getAppById(id: string): App | null { diff --git a/src/features/apps/terminal/command.ts b/src/features/apps/terminal/command.ts index 3f391be..a5694e5 100644 --- a/src/features/apps/terminal/command.ts +++ b/src/features/apps/terminal/command.ts @@ -78,7 +78,7 @@ export default class Command { } getOption(key: string): Option { - let matchingOption = null; + let matchingOption: Option = null; this.options.forEach((option) => { if (option.short === key || option.long === key) diff --git a/src/features/apps/terminal/commands/cat.ts b/src/features/apps/terminal/commands/cat.ts index 7d9ef67..71b3755 100644 --- a/src/features/apps/terminal/commands/cat.ts +++ b/src/features/apps/terminal/commands/cat.ts @@ -1,4 +1,4 @@ -import { VirtualFile } from "../../../virtual-drive/file/virtualFile"; +import { VirtualFile } from "../../../virtual-drive/file"; import { formatError } from "../_utils/terminal.utils"; import Command from "../command"; @@ -14,7 +14,7 @@ export const cat = new Command() const file = currentDirectory.findFile(name, extension); if (!file) - return formatError(this.name, `${args[0]}: No such file`); + return formatError((this as Command).name, `${args[0]}: No such file`); if (file.content) { if (!options.includes("e")) { diff --git a/src/features/apps/terminal/commands/rm.ts b/src/features/apps/terminal/commands/rm.ts index e20a0a0..6116594 100644 --- a/src/features/apps/terminal/commands/rm.ts +++ b/src/features/apps/terminal/commands/rm.ts @@ -1,4 +1,4 @@ -import { VirtualFile } from "../../../virtual-drive/file/virtualFile"; +import { VirtualFile } from "../../../virtual-drive/file"; import { formatError } from "../_utils/terminal.utils"; import Command from "../command"; @@ -12,7 +12,7 @@ export const rm = new Command() const file = currentDirectory.findFile(name, extension); if (!file) - return formatError(this.name, `${args[0]}: No such file`); + return formatError((this as Command).name, `${args[0]}: No such file`); file.delete(); return { blank: true }; diff --git a/src/features/apps/terminal/commands/touch.ts b/src/features/apps/terminal/commands/touch.ts index aed077e..87ab64a 100644 --- a/src/features/apps/terminal/commands/touch.ts +++ b/src/features/apps/terminal/commands/touch.ts @@ -1,4 +1,4 @@ -import { VirtualFile } from "../../../virtual-drive/file/virtualFile"; +import { VirtualFile } from "../../../virtual-drive/file"; import { formatError } from "../_utils/terminal.utils"; import Command from "../command"; @@ -12,7 +12,7 @@ export const touch = new Command() }) .setExecute(function(args, { currentDirectory }) { if (args[0] === "girls\\" && args[1] === "boo**") - return formatError(this.name, "Cannot touch 'girls boo**': Permission denied"); + return formatError((this as Command).name, "Cannot touch 'girls boo**': Permission denied"); const { name, extension } = VirtualFile.convertId(args[0]); diff --git a/src/features/settings/settings.ts b/src/features/settings/settings.ts index 750728b..85d8eb8 100644 --- a/src/features/settings/settings.ts +++ b/src/features/settings/settings.ts @@ -1,4 +1,4 @@ -import { VirtualFile } from "../virtual-drive/file/virtualFile"; +import { VirtualFile } from "../virtual-drive/file"; import { VirtualRoot } from "../virtual-drive/root/virtualRoot"; const PARENT_NODE = "options"; diff --git a/src/features/virtual-drive/file/index.ts b/src/features/virtual-drive/file/index.ts new file mode 100644 index 0000000..bf7c5e4 --- /dev/null +++ b/src/features/virtual-drive/file/index.ts @@ -0,0 +1,2 @@ +export { VirtualFile } from "./virtualFile"; +export { VirtualFileLink } from "./virtualFileLink"; \ No newline at end of file diff --git a/src/features/virtual-drive/file/virtualFileLink.ts b/src/features/virtual-drive/file/virtualFileLink.ts index d348401..e03c411 100644 --- a/src/features/virtual-drive/file/virtualFileLink.ts +++ b/src/features/virtual-drive/file/virtualFileLink.ts @@ -1,4 +1,5 @@ -import { VirtualFile, VirtualFileJson } from "./virtualFile"; +import { VirtualFile } from "."; +import { VirtualFileJson } from "./virtualFile"; export interface VirtualFileLinkJson extends VirtualFileJson { lnk: string; diff --git a/src/features/virtual-drive/folder/index.ts b/src/features/virtual-drive/folder/index.ts index d55454a..d28fd13 100644 --- a/src/features/virtual-drive/folder/index.ts +++ b/src/features/virtual-drive/folder/index.ts @@ -1,2 +1,2 @@ export { VirtualFolder } from "./virtualFolder"; -export { VirtualFolderLink } from "./virtualFolderLink"; \ No newline at end of file +export { VirtualFolderLink } from "./virtualFolderLink"; \ No newline at end of file diff --git a/src/features/virtual-drive/folder/virtualFolder.ts b/src/features/virtual-drive/folder/virtualFolder.ts index ecbc4a3..387feb8 100644 --- a/src/features/virtual-drive/folder/virtualFolder.ts +++ b/src/features/virtual-drive/folder/virtualFolder.ts @@ -2,10 +2,10 @@ import { APPS } from "../../../config/apps.config"; import AppsManager from "../../apps/appsManager"; import { removeFromArray } from "../../_utils/array.utils"; import WindowsManager from "../../windows/windowsManager"; -import { VirtualFileLink } from "../file/virtualFileLink"; +import { VirtualFileJson } from "../file/virtualFile"; import { VirtualBase, VirtualBaseJson } from "../virtualBase"; -import { VirtualFile, VirtualFileJson } from "../file/virtualFile"; import { VirtualFolderLink } from "."; +import { VirtualFile, VirtualFileLink } from "../file"; export interface VirtualFolderJson extends VirtualBaseJson { fls?: VirtualFileJson[]; diff --git a/src/features/virtual-drive/root/defaultData.ts b/src/features/virtual-drive/root/defaultData.ts index a148cc5..ce6b804 100644 --- a/src/features/virtual-drive/root/defaultData.ts +++ b/src/features/virtual-drive/root/defaultData.ts @@ -1,7 +1,7 @@ import { APPS } from "../../../config/apps.config"; import { WALLPAPERS } from "../../../config/desktop.config"; import AppsManager from "../../apps/appsManager"; -import { VirtualFileLink } from "../file/virtualFileLink"; +import { VirtualFileLink } from "../file"; import { VirtualFolderLink } from "../folder"; import { VirtualRoot } from "./virtualRoot"; diff --git a/src/features/virtual-drive/root/virtualRoot.ts b/src/features/virtual-drive/root/virtualRoot.ts index a5a6733..2842c23 100644 --- a/src/features/virtual-drive/root/virtualRoot.ts +++ b/src/features/virtual-drive/root/virtualRoot.ts @@ -1,10 +1,11 @@ import { StorageManager } from "../../storage/storageManager"; import { VirtualFolderLink, VirtualFolderLinkJson } from "../folder/virtualFolderLink"; import { loadDefaultData } from "./defaultData"; -import { VirtualFile, VirtualFileJson } from "../file/virtualFile"; +import { VirtualFileJson } from "../file/virtualFile"; import { VirtualFolder } from "../folder"; -import { VirtualFileLink, VirtualFileLinkJson } from "../file/virtualFileLink"; +import { VirtualFileLinkJson } from "../file/virtualFileLink"; import { VirtualFolderJson } from "../folder/virtualFolder"; +import { VirtualFile, VirtualFileLink } from "../file"; export interface VirtualRootJson extends VirtualFolderJson { scs: Record; diff --git a/src/features/virtual-drive/virtualBase.ts b/src/features/virtual-drive/virtualBase.ts index e0d4a3f..cc94e93 100644 --- a/src/features/virtual-drive/virtualBase.ts +++ b/src/features/virtual-drive/virtualBase.ts @@ -2,7 +2,7 @@ import { APPS } from "../../config/apps.config"; import AppsManager from "../apps/appsManager"; import { EventEmitter, EventNamesMap } from "../_utils/event.utils"; import { VirtualRoot } from "./root/virtualRoot"; -import { VirtualFile } from "./file/virtualFile"; +import { VirtualFile } from "./file"; import { VirtualFolder } from "./folder"; export interface VirtualBaseJson { diff --git a/src/features/windows/windowsManager.ts b/src/features/windows/windowsManager.ts index c35e8b9..e948f08 100644 --- a/src/features/windows/windowsManager.ts +++ b/src/features/windows/windowsManager.ts @@ -5,7 +5,7 @@ import AppsManager from "../apps/appsManager"; import { randomRange } from "../math/random"; import Vector2 from "../math/vector2"; import { TrackingManager } from "../tracking/trackingManager"; -import { VirtualFile } from "../virtual-drive/file/virtualFile"; +import { VirtualFile } from "../virtual-drive/file"; export interface WindowOptions { id?: string; diff --git a/src/tools/sitemapGenerator.ts b/src/tools/sitemapGenerator.ts new file mode 100644 index 0000000..4300297 --- /dev/null +++ b/src/tools/sitemapGenerator.ts @@ -0,0 +1,46 @@ +import { APPS } from "../config/apps.config"; +import { BASE_URL } from "../config/branding.config"; +import { WALLPAPERS } from "../config/desktop.config"; +import fs from "node:fs"; + +const PATH_TO_SITEMAP = "public/sitemap.xml"; + +function generateSitemap() { + const date = new Date(); + const lastModified = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; + + const images = WALLPAPERS.map((path) => ` + + ${BASE_URL.slice(0, -1) + path} + ` + ); + + const pages = Object.values(APPS).map((appId) => ` + + ${BASE_URL + appId} + ${lastModified} + ` + ); + + const sitemap = ` + + + + + ${BASE_URL} + ${lastModified} + ${images.join("")} + + ${pages.join("")} +`; + + return sitemap.trim(); +} + +try { + fs.writeFileSync(PATH_TO_SITEMAP, generateSitemap()); + console.log("Succesfully updated sitemap.xml"); +} catch (error) { + console.error(error); +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index c5cdd31..3e60bc4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,5 +35,10 @@ "./build", "./dist", "./.vscode" - ] + ], + "ts-node": { + "experimentalSpecifierResolution": "node", + "transpileOnly": true, + "esm": true, + } } \ No newline at end of file