htmv 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.lock ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "workspaces": {
4
+ "": {
5
+ "name": "htmv",
6
+ "dependencies": {
7
+ "@elysiajs/static": "^1.4.6",
8
+ "elysia": "^1.4.15",
9
+ },
10
+ "devDependencies": {
11
+ "@biomejs/biome": "2.3.3",
12
+ "@types/bun": "latest",
13
+ },
14
+ "peerDependencies": {
15
+ "typescript": "^5",
16
+ },
17
+ },
18
+ },
19
+ "packages": {
20
+ "@biomejs/biome": ["@biomejs/biome@2.3.3", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.3", "@biomejs/cli-darwin-x64": "2.3.3", "@biomejs/cli-linux-arm64": "2.3.3", "@biomejs/cli-linux-arm64-musl": "2.3.3", "@biomejs/cli-linux-x64": "2.3.3", "@biomejs/cli-linux-x64-musl": "2.3.3", "@biomejs/cli-win32-arm64": "2.3.3", "@biomejs/cli-win32-x64": "2.3.3" }, "bin": { "biome": "bin/biome" } }, "sha512-zn/P1pRBCpDdhi+VNSMnpczOz9DnqzOA2c48K8xgxjDODvi5O8gs3a2H233rck/5HXpkFj6TmyoqVvxirZUnvg=="],
21
+
22
+ "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5+JtW6RKmjqL9un0UtHV0ezOslAyYBzyl5ZhYiu7GHesX2x8NCDl6tXYrenv9m7e1RLbkO5E5Kh04kseMtz6lw=="],
23
+
24
+ "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-UPmKRalkHicvIpeccuKqq+/gA2HYV8FUnAEDJnqYBlGlycKqe6xrovWqvWTE4TTNpIFf4UQyuaDzLkN6Kz6tbA=="],
25
+
26
+ "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-zeiKwALNB/hax7+LLhCYqhqzlWdTfgE9BGkX2Z8S4VmCYnGFrf2fON/ec6KCos7mra5MDm6fYICsEWN2+HKZhw=="],
27
+
28
+ "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-KhCDMV+V7Yu72v40ssGJTHuv/j0n7JQ6l0s/c+EMcX5zPYLMLr4XpmI+WXhp4Vfkz0T5Xnh5wbrTBI3f2UTpjQ=="],
29
+
30
+ "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-05CjPLbvVVU8J6eaO6iSEoA0FXKy2l6ddL+1h/VpiosCmIp3HxRKLOa1hhC1n+D13Z8g9b1DtnglGtM5U3sTag=="],
31
+
32
+ "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-IyqQ+jYzU5MVy9CK5NV0U+NnUMPUAhYMrB/x4QgL/Dl1MqzBVc61bHeyhLnKM6DSEk73/TQYrk/8/QmVHudLdQ=="],
33
+
34
+ "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-NtlLs3pdFqFAQYZjlEHKOwJEn3GEaz7rtR2oCrzaLT2Xt3Cfd55/VvodQ5V+X+KepLa956QJagckJrNL+DmumQ=="],
35
+
36
+ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-klJKPPQvUk9Rlp0Dd56gQw/+Wt6uUprHdHWtbDC93f3Iv+knA2tLWpcYoOZJgPV+9s+RBmYv0DGy4mUlr20esg=="],
37
+
38
+ "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="],
39
+
40
+ "@elysiajs/static": ["@elysiajs/static@1.4.6", "", { "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-cd61aY/DHOVhlnBjzTBX8E1XANIrsCH8MwEGHeLMaZzNrz0gD4Q8Qsde2dFMzu81I7ZDaaZ2Rim9blSLtUrYBg=="],
41
+
42
+ "@sinclair/typebox": ["@sinclair/typebox@0.34.41", "", {}, "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g=="],
43
+
44
+ "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="],
45
+
46
+ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
47
+
48
+ "@types/bun": ["@types/bun@1.3.1", "", { "dependencies": { "bun-types": "1.3.1" } }, "sha512-4jNMk2/K9YJtfqwoAa28c8wK+T7nvJFOjxI4h/7sORWcypRNxBpr+TPNaCfVWq70tLCJsqoFwcf0oI0JU/fvMQ=="],
49
+
50
+ "@types/node": ["@types/node@24.10.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A=="],
51
+
52
+ "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],
53
+
54
+ "bun-types": ["bun-types@1.3.1", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw=="],
55
+
56
+ "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="],
57
+
58
+ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
59
+
60
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
61
+
62
+ "elysia": ["elysia@1.4.15", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.2.2", "fast-decode-uri-component": "^1.0.1", "memoirist": "^0.4.0" }, "peerDependencies": { "@sinclair/typebox": ">= 0.34.0 < 1", "@types/bun": ">= 1.2.0", "file-type": ">= 20.0.0", "openapi-types": ">= 12.0.0", "typescript": ">= 5.0.0" }, "optionalPeers": ["@types/bun", "typescript"] }, "sha512-RaDqqZdLuC4UJetfVRQ4Z5aVpGgEtQ+pZnsbI4ZzEaf3l/MzuHcqSVoL/Fue3d6qE4RV9HMB2rAZaHyPIxkyzg=="],
63
+
64
+ "exact-mirror": ["exact-mirror@0.2.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-CrGe+4QzHZlnrXZVlo/WbUZ4qQZq8C0uATQVGVgXIrNXgHDBBNFD1VRfssRA2C9t3RYvh3MadZSdg2Wy7HBoQA=="],
65
+
66
+ "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
67
+
68
+ "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="],
69
+
70
+ "file-type": ["file-type@21.0.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.7", "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg=="],
71
+
72
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
73
+
74
+ "memoirist": ["memoirist@0.4.0", "", {}, "sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg=="],
75
+
76
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
77
+
78
+ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
79
+
80
+ "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="],
81
+
82
+ "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="],
83
+
84
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
85
+
86
+ "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
87
+
88
+ "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
89
+ }
90
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import help from "./commands/help";
3
+ import newCommand from "./commands/new";
4
+ import { AVAILABLE_COMMANDS } from "./messages.json";
5
+ const args = process.argv.slice(2);
6
+ const command = args[0];
7
+ if (command === undefined) {
8
+ console.error("No command specified. Available commands are:");
9
+ console.error(AVAILABLE_COMMANDS);
10
+ process.exit(1);
11
+ }
12
+ const commandArgs = args.slice(1);
13
+ const commands = {
14
+ help,
15
+ new: () => newCommand(commandArgs),
16
+ };
17
+ if (command in commands) {
18
+ commands[command]();
19
+ process.exit(0);
20
+ }
21
+ console.error("Unknown command. Available commands are:");
22
+ console.error(AVAILABLE_COMMANDS);
23
+ process.exit(1);
@@ -0,0 +1,2 @@
1
+ declare const _default: () => void;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import { AVAILABLE_COMMANDS } from "../messages.json";
2
+ export default () => {
3
+ console.log(AVAILABLE_COMMANDS);
4
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: (args: string[]) => void;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ export default (args) => {
2
+ const name = args[0];
3
+ console.log(`Project ${name} created.`);
4
+ };
@@ -0,0 +1,3 @@
1
+ {
2
+ "AVAILABLE_COMMANDS": "1. htmv new {project_name} (creates a new HTMV project)\n2. htmv help (prints this page)"
3
+ }
@@ -0,0 +1,14 @@
1
+ export declare function view(view: string, props: Record<string, unknown>): Promise<Response>;
2
+ export type RouteParams = {
3
+ query: Record<string, string>;
4
+ request: Request;
5
+ params: Record<string, string>;
6
+ };
7
+ type Paths = {
8
+ routes: string;
9
+ views: string;
10
+ public: string;
11
+ port: number;
12
+ };
13
+ export declare function setup(paths: Paths): Promise<void>;
14
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,63 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import staticPlugin from "@elysiajs/static";
4
+ import { Elysia } from "elysia";
5
+ let viewsPath = "";
6
+ export async function view(view, props) {
7
+ if (viewsPath === "")
8
+ throw new Error("Views folder path not yet configured. Use `Htmv.setup` before rendering a view.");
9
+ const file = Bun.file(path.join(viewsPath, `${view}.html`));
10
+ const code = await file.text();
11
+ const replacedCode = code.replace(/{(.+)}/g, (_, propName) => {
12
+ return props[propName];
13
+ });
14
+ return new Response(replacedCode, {
15
+ headers: { "Content-Type": "text/html; charset=utf-8" },
16
+ });
17
+ }
18
+ export async function setup(paths) {
19
+ viewsPath = paths.views;
20
+ const app = new Elysia().use(staticPlugin({
21
+ assets: paths.public,
22
+ }));
23
+ await registerRoutes(app, paths.routes);
24
+ app.listen(paths.port);
25
+ console.log("");
26
+ console.log(`HTMV running on port ${paths.port}! 🎉`);
27
+ console.log(`http://localhost:${paths.port}`);
28
+ }
29
+ async function registerRoutes(app, baseDir, prefix = "/") {
30
+ const entries = await fs.readdir(baseDir, { withFileTypes: true });
31
+ for (const entry of entries) {
32
+ const fullPath = path.join(baseDir, entry.name);
33
+ if (entry.isDirectory()) {
34
+ await registerRoutes(app, fullPath, path.join(prefix, entry.name));
35
+ continue;
36
+ }
37
+ if (entry.name !== "index.ts" && entry.name !== "index.tsx")
38
+ continue;
39
+ const module = (await import(fullPath));
40
+ const defaultFn = module.default;
41
+ if (defaultFn && typeof defaultFn === "function") {
42
+ app.all(prefix, async ({ request, query, params }) => {
43
+ const result = await defaultFn({ request, query, params });
44
+ return result;
45
+ });
46
+ console.log(`Registered ${fullPath} on ${prefix} route with method all`);
47
+ }
48
+ for (const propName in module) {
49
+ const prop = module[propName];
50
+ if (typeof prop !== "function")
51
+ continue;
52
+ const fn = prop;
53
+ const name = fn.name.toLowerCase();
54
+ if (!["get", "post", "put", "patch", "delete"].includes(name))
55
+ continue;
56
+ app[name](prefix, async ({ request, query, params }) => {
57
+ const result = await fn({ request, query, params });
58
+ return result;
59
+ });
60
+ console.log(`Registered ${fullPath} on ${prefix} route with method ${name}`);
61
+ }
62
+ }
63
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "htmv",
3
- "module": "index.ts",
3
+ "main": "dist/index.js",
4
4
  "type": "module",
5
- "version": "0.0.1",
5
+ "version": "0.0.3",
6
6
  "devDependencies": {
7
7
  "@biomejs/biome": "2.3.3",
8
8
  "@types/bun": "latest"
@@ -15,6 +15,6 @@
15
15
  "elysia": "^1.4.15"
16
16
  },
17
17
  "bin": {
18
- "htmv": "./cli.ts"
18
+ "htmv": "dist/cli/cli.js"
19
19
  }
20
20
  }
package/src/cli/cli.ts ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import help from "./commands/help";
3
+ import newCommand from "./commands/new";
4
+ import { AVAILABLE_COMMANDS } from "./messages.json";
5
+
6
+ const args = process.argv.slice(2);
7
+ const command = args[0];
8
+ if (command === undefined) {
9
+ console.error("No command specified. Available commands are:");
10
+ console.error(AVAILABLE_COMMANDS);
11
+ process.exit(1);
12
+ }
13
+
14
+ const commandArgs = args.slice(1);
15
+ const commands = {
16
+ help,
17
+ new: () => newCommand(commandArgs),
18
+ };
19
+
20
+ if (command in commands) {
21
+ commands[command as keyof typeof commands]();
22
+ process.exit(0);
23
+ }
24
+ console.error("Unknown command. Available commands are:");
25
+ console.error(AVAILABLE_COMMANDS);
26
+ process.exit(1);
@@ -0,0 +1,5 @@
1
+ import { AVAILABLE_COMMANDS } from "../messages.json";
2
+
3
+ export default () => {
4
+ console.log(AVAILABLE_COMMANDS);
5
+ };
@@ -0,0 +1,4 @@
1
+ export default (args: string[]) => {
2
+ const name = args[0];
3
+ console.log(`Project ${name} created.`);
4
+ };
@@ -0,0 +1,3 @@
1
+ {
2
+ "AVAILABLE_COMMANDS": "1. htmv new {project_name} (creates a new HTMV project)\n2. htmv help (prints this page)"
3
+ }
package/tsconfig.json CHANGED
@@ -10,9 +10,7 @@
10
10
 
11
11
  // Bundler mode
12
12
  "moduleResolution": "bundler",
13
- "allowImportingTsExtensions": true,
14
13
  "verbatimModuleSyntax": true,
15
- "noEmit": true,
16
14
 
17
15
  // Best practices
18
16
  "strict": true,
@@ -24,6 +22,12 @@
24
22
  // Some stricter flags (disabled by default)
25
23
  "noUnusedLocals": false,
26
24
  "noUnusedParameters": false,
27
- "noPropertyAccessFromIndexSignature": false
28
- }
25
+ "noPropertyAccessFromIndexSignature": false,
26
+
27
+ // Config for npm
28
+ "noEmit": false, // Changed to false to allow it to compile
29
+ "outDir": "./dist",
30
+ "declaration": true //generates .d.ts
31
+ },
32
+ "include": ["src"]
29
33
  }
package/cli.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env bun
2
- console.log("WIP");
File without changes