-
-
Software Extremist
+
Jet Pham
+
+
Software Extremist
diff --git a/package-lock.json b/package-lock.json
index e76196b..eb9f1ce 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,6 +22,7 @@
"typescript": "^5.9.3",
"typescript-eslint": "^8.56.1",
"vite": "^7.3.1",
+ "vite-plugin-singlefile": "^2.3.0",
"vite-plugin-top-level-await": "^1.6.0",
"vite-plugin-wasm": "^3.5.0"
}
@@ -1899,6 +1900,19 @@
"node": "18 || 20 || >=22"
}
},
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/cgol": {
"resolved": "cgol/pkg",
"link": true
@@ -2234,6 +2248,19 @@
"node": ">=16.0.0"
}
},
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -2350,6 +2377,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -2699,6 +2736,33 @@
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/minimatch": {
"version": "10.2.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
@@ -3114,6 +3178,19 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
@@ -3294,6 +3371,23 @@
}
}
},
+ "node_modules/vite-plugin-singlefile": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.0.tgz",
+ "integrity": "sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">18.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^4.44.1",
+ "vite": "^5.4.11 || ^6.0.0 || ^7.0.0"
+ }
+ },
"node_modules/vite-plugin-top-level-await": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.6.0.tgz",
diff --git a/package.json b/package.json
index 462d9db..b3819be 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"typescript": "^5.9.3",
"typescript-eslint": "^8.56.1",
"vite": "^7.3.1",
+ "vite-plugin-singlefile": "^2.3.0",
"vite-plugin-top-level-await": "^1.6.0",
"vite-plugin-wasm": "^3.5.0"
},
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..b19a3ea
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://jetpham.com/sitemap.xml
diff --git a/public/sitemap.xml b/public/sitemap.xml
new file mode 100644
index 0000000..8e86b77
--- /dev/null
+++ b/public/sitemap.xml
@@ -0,0 +1,8 @@
+
+
+
+ https://jetpham.com/
+ monthly
+ 1.0
+
+
diff --git a/src/main.ts b/src/main.ts
index 1983b92..d810ae1 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,17 +1,8 @@
import "~/styles/globals.css";
import Jet from "~/assets/Jet.txt?ansi";
+import init, { start } from "cgol";
document.getElementById("ansi-art")!.innerHTML = Jet;
-import("cgol")
- .then(async (cgolModule) => {
- if (typeof cgolModule.default === "function") {
- await cgolModule.default();
- }
- if (typeof cgolModule.start === "function") {
- cgolModule.start();
- }
- })
- .catch((error: unknown) => {
- console.error("Failed to initialize CGOL WebAssembly module:", error);
- });
+await init();
+start();
diff --git a/vite.config.ts b/vite.config.ts
index b1983ef..ef3f64c 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -2,10 +2,17 @@ import { defineConfig } from "vite";
import tailwindcss from "@tailwindcss/vite";
import wasm from "vite-plugin-wasm";
import topLevelAwait from "vite-plugin-top-level-await";
+import { viteSingleFile } from "vite-plugin-singlefile";
import ansi from "./vite-plugin-ansi";
export default defineConfig({
- plugins: [ansi(), tailwindcss(), wasm(), topLevelAwait()],
+ plugins: [
+ ansi(),
+ tailwindcss(),
+ wasm(),
+ topLevelAwait(),
+ viteSingleFile({ useRecommendedBuildConfig: false }),
+ ],
resolve: {
alias: {
"~": "/src",
@@ -25,5 +32,7 @@ export default defineConfig({
},
build: {
target: "esnext",
+ assetsInlineLimit: 0,
+ cssCodeSplit: false,
},
});