initial commit

This commit is contained in:
EatThePooh 2025-12-18 11:40:05 +07:00
commit 8222743519
9 changed files with 314 additions and 0 deletions

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
.deno_cache
.emacs*
.oc_local
result

19
AGENTS.md Normal file
View file

@ -0,0 +1,19 @@
# AGENTS.md
## Nix
- Enter a dev shell with `nix develop`
- Assume nothing will work outside of the shell
- See/edit `flake.nix` for relevant concerns
## Deno
- Manage dependencies with `deno add` and `deno remove` in `./src` directory
- Deno maintains its own `deno.lock` which Nix picks up
- IMPORTANT: never use JSR dependencies, only NPM
- Example: `deno add npm:chalk` then `import chalk from "chalk";` in `.ts` files
## Project conventions
- Entry points are CLI subcommands (`./src/main.ts`)
- Use `@stricli/core` for CLI
- Prefer to do things by running shell commands via `dax-sh`
- Verbosity implies `$.setPrintCommand(true)` for `dax-sh` to output what it runs
- Logs always go to `stderr` so that `stdout` can be redirected to a file safely

93
flake.lock generated Normal file
View file

@ -0,0 +1,93 @@
{
"nodes": {
"deno-with-packages": {
"locked": {
"lastModified": 1765960297,
"narHash": "sha256-JLb0HH1GdqqFJg82ZQ3vzS7dVVKC3kwZVjg44WGN5mQ=",
"owner": "voleum-org",
"repo": "deno-with-packages",
"rev": "4cef3f1fd0eabe8d0589c61952b965cfd369bffa",
"type": "github"
},
"original": {
"owner": "voleum-org",
"repo": "deno-with-packages",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1765835352,
"narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "a34fae9c08a15ad73f295041fec82323541400a9",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-root": {
"locked": {
"lastModified": 1723604017,
"narHash": "sha256-rBtQ8gg+Dn4Sx/s+pvjdq3CB2wQNzx9XGFq/JVGCB6k=",
"owner": "srid",
"repo": "flake-root",
"rev": "b759a56851e10cb13f6b8e5698af7b59c44be26e",
"type": "github"
},
"original": {
"owner": "srid",
"repo": "flake-root",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1765934234,
"narHash": "sha256-pJjWUzNnjbIAMIc5gRFUuKCDQ9S1cuh3b2hKgA7Mc4A=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "af84f9d270d404c17699522fab95bbf928a2d92f",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1765674936,
"narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"root": {
"inputs": {
"deno-with-packages": "deno-with-packages",
"flake-parts": "flake-parts",
"flake-root": "flake-root",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

36
flake.nix Normal file
View file

@ -0,0 +1,36 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
deno-with-packages.url = "github:voleum-org/deno-with-packages";
flake-root.url = "github:srid/flake-root";
};
outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } {
imports = [
inputs.flake-root.flakeModule
inputs.deno-with-packages.flakeModule
];
systems = [ "x86_64-linux" ];
perSystem = { pkgs, config, ... }:
let
# rename me
name = "deno-cli-package";
package = import ./package.nix { inherit pkgs config name; };
in {
deno-with-packages = {
lockfiles = [ ./src/deno.lock ];
dir = "$FLAKE_ROOT/.deno_cache";
};
devShells.default = pkgs.mkShell {
inputsFrom = [ config.flake-root.devShell ];
packages = [ package config.deno-with-packages.package ];
};
packages.default = package;
};
};
}

18
package.nix Normal file
View file

@ -0,0 +1,18 @@
{ pkgs, config, name }:
pkgs.stdenv.mkDerivation {
inherit name;
src = ./src;
installPhase = ''
mkdir -p $out/bin
cp -r * $out
# This is meant to be executed from inside a devShell with Deno set up
cat > $out/bin/${name} <<EOF
#!/bin/sh
cd ${builtins.placeholder "out"}
exec ${config.deno-with-packages.package}/bin/deno task --quiet run "\$@"
EOF
chmod +x $out/bin/${name}
'';
}

10
src/deno.json Normal file
View file

@ -0,0 +1,10 @@
{
"tasks": {
"run": "deno run -A main.ts"
},
"imports": {
"@stricli/core": "npm:@stricli/core@1.2.4",
"chalk": "npm:chalk@^5.6.2",
"dax-sh": "npm:dax-sh@0.44.1",
}
}

63
src/deno.lock generated Normal file
View file

@ -0,0 +1,63 @@
{
"version": "5",
"specifiers": {
"npm:@stricli/core@1.2.4": "1.2.4",
"npm:@types/node@*": "22.15.15",
"npm:chalk@^5.6.2": "5.6.2",
"npm:dax-sh@0.44.1": "0.44.1"
},
"npm": {
"@deno/shim-deno-test@0.5.0": {
"integrity": "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w=="
},
"@deno/shim-deno@0.19.2": {
"integrity": "sha512-q3VTHl44ad8T2Tw2SpeAvghdGOjlnLPDNO2cpOxwMrBE/PVas6geWpbpIgrM+czOCH0yejp0yi8OaTuB+NU40Q==",
"dependencies": [
"@deno/shim-deno-test",
"which"
]
},
"@stricli/core@1.2.4": {
"integrity": "sha512-ujvJDQpC2FINWvlTjkFz+Qzw/vsB8p/LyZEW18idisqIyjXR6yb+sF3WTUPksl+5ZON5r4fHQnCqQWnJxeqSzg=="
},
"@types/node@22.15.15": {
"integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==",
"dependencies": [
"undici-types@6.21.0"
]
},
"chalk@5.6.2": {
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="
},
"dax-sh@0.44.1": {
"integrity": "sha512-lUj0mA0LTO6CXUZmbUgFUhtlyowa+9hmg/Z4xeU8/FIdkM1oj541iZR5MELYZdX1IOFD51RLch8uiOTOHzbfSA==",
"dependencies": [
"@deno/shim-deno",
"undici-types@5.28.4"
]
},
"isexe@3.1.1": {
"integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="
},
"undici-types@5.28.4": {
"integrity": "sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww=="
},
"undici-types@6.21.0": {
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="
},
"which@4.0.0": {
"integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
"dependencies": [
"isexe"
],
"bin": true
}
},
"workspace": {
"dependencies": [
"npm:@stricli/core@1.2.4",
"npm:chalk@^5.6.2",
"npm:dax-sh@0.44.1"
]
}
}

44
src/impl.ts Normal file
View file

@ -0,0 +1,44 @@
import $ from 'dax-sh';
import chalk from "chalk";
import { buildCommand } from "@stricli/core";
const log = {
verbose: false,
setup(verbose: boolean) {
this.verbose = verbose;
},
info(msg: string, ...rest: any[]) {
if (this.verbose) {
console.error(chalk.blue(msg), ...rest);
}
},
error(msg: string, ...rest: any[]) {
console.error(chalk.blue(msg), ...rest);
}
};
function loggingSetup(verbose: boolean) {
log.setup(verbose);
$.setPrintCommand(verbose);
}
const commonFlags = {
verbose: {
brief: "Verbose output toggle",
kind: "boolean" as const,
default: false
}
};
export const hello = buildCommand({
func: async (flags: { readonly verbose: boolean }) => {
loggingSetup(flags.verbose);
log.info("about to say hello");
await $`echo hello`;
},
parameters: { flags: { ...commonFlags } },
docs: {
brief: "Prints 'hello'"
}
});

27
src/main.ts Normal file
View file

@ -0,0 +1,27 @@
import {
buildApplication,
buildRouteMap,
buildCommand,
run
} from '@stricli/core';
import process from 'node:process';
import $ from 'dax-sh';
import {
hello
} from './impl.ts';
const root = buildRouteMap({
routes: { hello },
docs: {
brief: "Deno CLI program from template"
}
});
const app = buildApplication(root, {
name: "deno-cli-package",
});
await run(app, process.argv.slice(2), {
process
});