From 9df3f362fedb5a5112fa469e415a95b36fdcb15d Mon Sep 17 00:00:00 2001 From: EatThePooh Date: Sat, 2 Aug 2025 05:10:30 +0700 Subject: [PATCH] proper scrolls --- flake.nix | 46 +++++++---------------- shelf/deno-workspace.nix | 63 ++++++++++++++++++++++++++++++++ shelf/deno/hjq/deno.json | 10 +++++ shelf/deno/hjq/deno.lock | 21 +++++++++++ shelf/{ => deno}/hjq/main.ts | 6 ++- shelf/{ => deno}/hjq/package.nix | 4 +- shelf/deno/hjq/scroll.nix | 3 ++ shelf/deno/uses-hjq/deno.json | 8 ++++ shelf/deno/uses-hjq/deno.lock | 15 ++++++++ shelf/deno/uses-hjq/main.ts | 3 ++ shelf/deno/uses-hjq/scroll.nix | 3 ++ 11 files changed, 146 insertions(+), 36 deletions(-) create mode 100644 shelf/deno-workspace.nix create mode 100644 shelf/deno/hjq/deno.json create mode 100644 shelf/deno/hjq/deno.lock rename shelf/{ => deno}/hjq/main.ts (92%) rename shelf/{ => deno}/hjq/package.nix (87%) create mode 100644 shelf/deno/hjq/scroll.nix create mode 100644 shelf/deno/uses-hjq/deno.json create mode 100644 shelf/deno/uses-hjq/deno.lock create mode 100644 shelf/deno/uses-hjq/main.ts create mode 100644 shelf/deno/uses-hjq/scroll.nix diff --git a/flake.nix b/flake.nix index ca78bc9..aa6f0ec 100644 --- a/flake.nix +++ b/flake.nix @@ -10,39 +10,19 @@ flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; - toDenoTarget = system: - let - arch = builtins.head (builtins.split "-" system); - os = builtins.elemAt (builtins.split "-" system) 1; - vendor = if os == "darwin" then "apple" else "unknown"; - sys = if os == "darwin" then "darwin" else "linux-gnu"; - in "${arch}-${vendor}-${sys}"; - - target = toDenoTarget system; - hjq = import ./shelf/hjq/package.nix { - inherit pkgs; - inherit target; + denoWorkspace = import ./shelf/deno-workspace.nix { + inherit pkgs system; }; in - { - devShells.default = pkgs.mkShell { - buildInputs = with pkgs; [ - deno - hjq - ]; - - shellHook = '' - echo "🦕 Deno development environment loaded!" - echo "Deno version: $(deno --version | head -n1)" - ''; - - DENO_DIR = "./.deno_cache"; - }; - - # unfortunately this derivation is impure because - # managing deno's deps is HARD, so - # nix build --option sanbox relaxed - packages.default = hjq; - - }); + { + devShells.default = pkgs.mkShell { + buildInputs = [ ]; + shellHook = '' + export DENO_DIR=$PWD/.deno_cache + rm -rf $DENO_DIR + cp -r ${denoWorkspace} $DENO_DIR + chmod -R u+w "$DENO_DIR" + ''; + }; + }); } diff --git a/shelf/deno-workspace.nix b/shelf/deno-workspace.nix new file mode 100644 index 0000000..98109d5 --- /dev/null +++ b/shelf/deno-workspace.nix @@ -0,0 +1,63 @@ +{ pkgs, system }: + +let + target = + let + arch = builtins.head (builtins.split "-" system); + os = builtins.elemAt (builtins.split "-" system) 1; + vendor = if os == "darwin" then "apple" else "unknown"; + sys = if os == "darwin" then "darwin" else "linux-gnu"; + in "${arch}-${vendor}-${sys}"; + + # currently unused, needed for deno compile + denort = pkgs.fetchzip { + url = "https://dl.deno.land/release/v${pkgs.deno.version}/denort-${target}.zip"; + hash = "sha256-ukIk8K2CE+N+3eFs++RPiGZlhhRRVk1gjhdt77/s+4o="; + }; + + scrollsDir = ./deno; + lib = pkgs.lib; + packageDirs = builtins.attrNames (builtins.readDir scrollsDir); + + # Separate FOD for cache only + unifiedCache = pkgs.stdenv.mkDerivation { + name = "deno-scrolls-cache"; + src = scrollsDir; + + nativeBuildInputs = [ pkgs.deno pkgs.jq ]; + dontPatchShebangs = true; + + buildPhase = '' + export DENO_DIR=$out + + ${lib.concatStringsSep "\n" (map (pkg: + let config = import (scrollsDir + "/${pkg}/scroll.nix"); + in '' + echo "Caching ${pkg}..." + cd ${pkg} + ${config.cache-command} + cd .. + '' + ) packageDirs)} + + echo 'Go fuck yourself, SQLite!' + find $out -name "*-wal" -delete + find $out -name "*-shm" -delete + + echo 'Go fuck yourself, JSON!' + find $out/npm -name "*.json" -type f 2>/dev/null | while read -r file; do + if ${pkgs.jq}/bin/jq empty "$file" 2>/dev/null; then + ${pkgs.jq}/bin/jq -S . "$file" > "$file.tmp" && mv "$file.tmp" "$file" + fi + done + ''; + + installPhase = "true"; + + outputHashMode = "recursive"; + outputHashAlgo = "sha256"; + outputHash = "sha256-maP/JMY6n95A9FQx72YFwRtnprGXc97v1ZdPgt2GB8s="; + }; + +in +unifiedCache diff --git a/shelf/deno/hjq/deno.json b/shelf/deno/hjq/deno.json new file mode 100644 index 0000000..f23cdd5 --- /dev/null +++ b/shelf/deno/hjq/deno.json @@ -0,0 +1,10 @@ +{ + "name": "hjq", + "exports": { + ".": "./main.ts" + }, + "imports": { + "hjson": "npm:hjson@^3.2.2", + "jq-web": "npm:jq-web@^0.6.2" + } +} diff --git a/shelf/deno/hjq/deno.lock b/shelf/deno/hjq/deno.lock new file mode 100644 index 0000000..e903f12 --- /dev/null +++ b/shelf/deno/hjq/deno.lock @@ -0,0 +1,21 @@ +{ + "version": "4", + "specifiers": { + "npm:hjson@^3.2.2": "3.2.2", + "npm:jq-web@~0.6.2": "0.6.2" + }, + "npm": { + "hjson@3.2.2": { + "integrity": "sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q==" + }, + "jq-web@0.6.2": { + "integrity": "sha512-+7XvjBYwTx4vP5PYkf6Q6orubO/v+UgMU6By1GritrmShr9QpT3UKa4ANzXWQfhdqtBnQYXsm7ZNbdIHT6tYpQ==" + } + }, + "workspace": { + "dependencies": [ + "npm:hjson@^3.2.2", + "npm:jq-web@~0.6.2" + ] + } +} diff --git a/shelf/hjq/main.ts b/shelf/deno/hjq/main.ts similarity index 92% rename from shelf/hjq/main.ts rename to shelf/deno/hjq/main.ts index 9b00f1b..8016e26 100644 --- a/shelf/hjq/main.ts +++ b/shelf/deno/hjq/main.ts @@ -1,10 +1,12 @@ // a basic drop-in replacement for jq to handle HJSON // tries to preserve comments but doesn't do a very good job :( -import Hjson from "npm:hjson"; -import jqModule from "npm:jq-web"; +import Hjson from "hjson"; +import jqModule from "jq-web"; import fs from "node:fs"; +export const n = 42; + const jq = await jqModule; var filter = process.argv[2]; diff --git a/shelf/hjq/package.nix b/shelf/deno/hjq/package.nix similarity index 87% rename from shelf/hjq/package.nix rename to shelf/deno/hjq/package.nix index f56e920..76149e9 100644 --- a/shelf/hjq/package.nix +++ b/shelf/deno/hjq/package.nix @@ -22,6 +22,8 @@ pkgs.stdenv.mkDerivation rec { unzip ${denort} chmod +x denort popd + + deno cache --reload main.ts ''; buildPhase = '' @@ -29,7 +31,7 @@ pkgs.stdenv.mkDerivation rec { export DENORT_BIN="$TMPDIR/denort/denort" - deno compile --target=${target} --output app main.ts + deno compile --target=${target} --cached-only --output app main.ts runHook postBuild ''; diff --git a/shelf/deno/hjq/scroll.nix b/shelf/deno/hjq/scroll.nix new file mode 100644 index 0000000..caafa8a --- /dev/null +++ b/shelf/deno/hjq/scroll.nix @@ -0,0 +1,3 @@ +{ + cache-command = "deno cache --reload main.ts"; +} diff --git a/shelf/deno/uses-hjq/deno.json b/shelf/deno/uses-hjq/deno.json new file mode 100644 index 0000000..b7d93f4 --- /dev/null +++ b/shelf/deno/uses-hjq/deno.json @@ -0,0 +1,8 @@ +{ + "tasks": { + "start": "deno run --cached-only main.ts" + }, + "patch": [ + "../hjq" + ] +} diff --git a/shelf/deno/uses-hjq/deno.lock b/shelf/deno/uses-hjq/deno.lock new file mode 100644 index 0000000..e9382a1 --- /dev/null +++ b/shelf/deno/uses-hjq/deno.lock @@ -0,0 +1,15 @@ +{ + "version": "4", + "specifiers": { + "npm:hjson@^3.2.2": "3.2.2", + "npm:jq-web@~0.6.2": "0.6.2" + }, + "npm": { + "hjson@3.2.2": { + "integrity": "sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q==" + }, + "jq-web@0.6.2": { + "integrity": "sha512-+7XvjBYwTx4vP5PYkf6Q6orubO/v+UgMU6By1GritrmShr9QpT3UKa4ANzXWQfhdqtBnQYXsm7ZNbdIHT6tYpQ==" + } + } +} diff --git a/shelf/deno/uses-hjq/main.ts b/shelf/deno/uses-hjq/main.ts new file mode 100644 index 0000000..b4f64bd --- /dev/null +++ b/shelf/deno/uses-hjq/main.ts @@ -0,0 +1,3 @@ +import {n} from 'hjq'; + +console.log("I use hjq:", n); diff --git a/shelf/deno/uses-hjq/scroll.nix b/shelf/deno/uses-hjq/scroll.nix new file mode 100644 index 0000000..5faee5e --- /dev/null +++ b/shelf/deno/uses-hjq/scroll.nix @@ -0,0 +1,3 @@ +{ + cache-command = "deno cache -I --reload main.ts"; +}