dotstingray 2023
dotstingray
現状Dhallで文字列組み立てて実行する感じになっている
結局はシェル!!
結局はパスの存在確認とか必要!!
ディレクトリ構造をDhallで表現する?
DhallでJSON的再帰的なkey-value構造を表現するのはダルすぎるはず
TypeScriptっぽそう
Deno でやろう
deno2nix?
これかなり良いな
https://zenn.dev/kato_k/articles/06ab404938f896
仕様
構文が正気で静的型チェックのあるスクリプト言語でプログラマブルにdotfilesが書ける
プログラマブルって何?
dotfiles定義で文字列結合とかをしてもよいことにしたいよね
それでいて "./starship/config.toml": "~/.config/starship/config.toml" みたいに宣言的な感じでも書ける
src: "./foo", dest: "~/.foo" と書くとより低レベルな表現に変換されるような雰囲気
dotfilesのライフサイクルに応じたさまざまなタスクができる
デプロイ…設定ファイルをしかるべき位置に配置する
セットアップ…ツールチェインをインストールする
stat…デプロイやセットアップが正常に機能しているかチェックする
generate: () => string
code:dotfiles.ts
import * as DS from "dotstingray";
// 1 複数のファイルで同じ処理をする必要がある場合関数に分ける必要がある
DS.register([
{type: "link", src: "./zsh/rc.zsh", dest: "~/.zshrc"},
{type: "write", generate: () => "", dest: "~/.foo"},
{type: "write", generate: () => "", dest: "~/.bar"},
{type: "install", install: () => {Deno.cmd("hoge")}},
]);
// 2 destもプログラマブルになる
DS.register([
() => ({content: "", dest: "~/.foo"}),
() => ({content: "", dest: "~/.bar"}),
]);
// 3
DS.register(async (os) => {
const p1, p2 = await Promise.all(plugin1(), plugin2());
return {content: "", }, ...p1, ...p2;
});
code:dot.ts
stat([
link({source: "./zsh/rc.zsh", destination: "~/.zshrc"}),
link(() => )
]);