add: groundwork

This commit is contained in:
2026-09-04 14:16:55 -04:00
commit bd0b1c6ff4
6 changed files with 206 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
use flake
+8
View File
@@ -0,0 +1,8 @@
{
"tasks": {
"dev": "deno run --watch --allow-net main.ts"
},
"imports": {
"@std/assert": "jsr:@std/assert@1"
}
}
Generated
+42
View File
@@ -0,0 +1,42 @@
{
"nodes": {
"flake-schemas": {
"locked": {
"lastModified": 1780327564,
"narHash": "sha256-HiRPtA0spK+Dkgbhz/1zW9glXxNVB+L4Rj2VYmdawb8=",
"rev": "6cc9bd98891b1fc6bb2b8cb3277df8bc72799ca6",
"revCount": 149,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.5.0/019e83cf-9af3-78b1-ac5b-70e68ad1efe1/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%2A.tar.gz"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1788404924,
"narHash": "sha256-lhEhY8X5EgkQ/eg6IFz4cc8jRuSYSvnxx1al7d1dvZ0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "0968519e14f7aa7d3e9b389682bd74d2b51c8ce8",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-schemas": "flake-schemas",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
+111
View File
@@ -0,0 +1,111 @@
{
description = "levin - storage conversion tool";
inputs = {
flake-schemas.url = "https://flakehub.com/f/DeterminateSystems/flake-schemas/*.tar.gz";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs =
{ self
, flake-schemas
, nixpkgs
}:
let
supportedSystems = [ "x86_64-linux" "aarch64-darwin" "x86_64-darwin" "aarch64-linux" ];
forEachSupportedSystem = f:
nixpkgs.lib.genAttrs supportedSystems (system:
f {
pkgs = import nixpkgs { inherit system; };
});
in
{
schemas = flake-schemas.schemas;
devShells = forEachSupportedSystem ({ pkgs }: {
default = pkgs.mkShell {
packages = with pkgs; [
curl
git
jq
wget
nixpkgs-fmt
openssl
openssl.dev
patchelf
deno
pkg-config-unwrapped
ripgrep
];
env = {
PKG_CONFIG_PATH = "${pkgs.openssl.dev}/lib/pkgconfig";
# ZELLIJ_CONFIG_FILE = "config.kdl";
};
};
});
packages = forEachSupportedSystem ({ pkgs }:
let
levinVersion = "0.0.1";
denoDeps = pkgs.stdenvNoCC.mkDerivation {
pname = "levin-deno-deps";
version = levinVersion;
src = ./.;
nativeBuildInputs = [ pkgs.deno pkgs.cacert ];
dontConfigure = true;
buildPhase = ''
runHook preBuild
export HOME="$TMPDIR"
export DENO_DIR="$TMPDIR/deno-dir"
deno cache --vendor=false --frozen --lock=deno.lock main.ts
deno compile \
--vendor=false \
--frozen \
--lock=deno.lock \
--output "$TMPDIR/levin-cache-primer" \
main.ts
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p "$out"
cp -R "$DENO_DIR"/. "$out"
runHook postInstall
'';
outputHashAlgo = "sha256";
outputHashMode = "recursive";
outputHash = "sha256-ndPlYrPgqHE4iE08JnKWPxAZfjWGd0Ez76aY4R1eITs=";
};
in
{
levin = pkgs.stdenvNoCC.mkDerivation {
pname = "levin";
version = levinVersion;
src = ./.;
nativeBuildInputs = [ pkgs.deno ];
dontConfigure = true;
dontFixup = true;
buildPhase = ''
runHook preBuild
export HOME="$TMPDIR"
export DENO_DIR="$TMPDIR/deno-dir"
cp -R ${denoDeps}/. "$DENO_DIR"
chmod -R u+w "$DENO_DIR"
deno compile \
--vendor=false \
--cached-only \
--frozen \
--lock=deno.lock \
--allow-all \
--output levin \
main.ts
runHook postBuild
'';
installPhase = ''
runHook preInstall
install -Dm755 levin "$out/bin/levin"
runHook postInstall
'';
};
});
};
}
+28
View File
@@ -0,0 +1,28 @@
const units = {
B: 1,
kB: 1000 ** 1,
KiB: 1024 ** 1,
MB: 1000 ** 2,
MiB: 1024 ** 2,
GB: 1000 ** 3,
GiB: 1024 ** 3,
TB: 1000 ** 4,
TiB: 1024 ** 4,
PB: 1000 ** 5,
PiB: 1024 ** 5,
} as const;
type Unit = keyof typeof units;
function convert(value: number, from: Unit, to: Unit): number {
return value * units[from] / units[to];
}
if (import.meta.main) {
console.log(convert(1, "MiB", "kB"));
}
+16
View File
@@ -0,0 +1,16 @@
import { assertEquals } from "@std/assert";
import { handler } from "./main.ts";
Deno.test("returns html on /", async () => {
const res = handler(new Request("http://localhost/"));
assertEquals(res.headers.get("content-type"), "text/html");
const body = await res.text();
assertEquals(body.includes("Welcome to Deno"), true);
});
Deno.test("returns json on /api", async () => {
const res = handler(new Request("http://localhost/api"));
const data = await res.json();
assertEquals(data.message, "Hello, world!");
assertEquals(typeof data.time, "string");
});