CacheInterceptor кэширует каждый успешный GET по путь+параметры в drift (sqlite нативно, wasm+OPFS в браузере) и подменяет им сетевую ошибку; провайдер отдаёт Cached<T>, экран показывает баннер «данные на …». Контракт для остальных экранов — docs/ai/offline-cache.md. flake.nix: libsecret/pkg-config для линуксовой сборки, jq/curl для just app-web-assets (сборка sqlite3.wasm + drift_worker.js).
65 lines
2.3 KiB
Nix
65 lines
2.3 KiB
Nix
{
|
|
description = "fin-tracker — personal finance + investment analytics";
|
|
|
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
|
|
outputs = { self, nixpkgs }:
|
|
let
|
|
system = "x86_64-linux";
|
|
pkgs = import nixpkgs { inherit system; };
|
|
python = pkgs.python312;
|
|
|
|
# manylinux wheels pulled by uv (grpcio for T-Invest, asyncpg, polars, …)
|
|
# dlopen these at runtime. nix-ld is enabled system-wide; we only extend
|
|
# its search path (never overwrite — keeps direnv diffs sane).
|
|
runtimeLibs = pkgs.lib.makeLibraryPath [
|
|
pkgs.stdenv.cc.cc.lib # libstdc++.so.6
|
|
pkgs.zlib
|
|
pkgs.openssl
|
|
];
|
|
|
|
backendTools = [
|
|
python
|
|
pkgs.uv
|
|
pkgs.just
|
|
pkgs.postgresql_17 # local dev cluster (`just db-start`) and psql
|
|
pkgs.openapi-generator-cli # `just gen-client`
|
|
pkgs.jq # `just app-web-assets` reads package_config.json / pub deps
|
|
pkgs.curl # `just app-web-assets` fetches sqlite3.wasm from GitHub releases
|
|
];
|
|
|
|
commonHook = ''
|
|
export UV_PYTHON="${python}/bin/python3"
|
|
export UV_PYTHON_DOWNLOADS=never
|
|
export NIX_LD_LIBRARY_PATH="${runtimeLibs}''${NIX_LD_LIBRARY_PATH:+:$NIX_LD_LIBRARY_PATH}"
|
|
export LD_LIBRARY_PATH="${runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
|
# T-Invest gRPC must not go through a local SOCKS/HTTP proxy
|
|
export no_proxy="invest-public-api.tbank.ru,.tbank.ru,invest-public-api.tinkoff.ru,.tinkoff.ru,localhost,127.0.0.1''${no_proxy:+,$no_proxy}"
|
|
export NO_PROXY="$no_proxy"
|
|
export PGDATA="$PWD/.pgdata"
|
|
export PGHOST="$PWD/.pgdata"
|
|
export PGPORT=54329
|
|
'';
|
|
in {
|
|
devShells.${system} = {
|
|
# backend only — fast to enter
|
|
default = pkgs.mkShell {
|
|
packages = backendTools;
|
|
shellHook = commonHook + ''
|
|
echo "fin-tracker: 'just --list' for recipes; 'nix develop .#app' adds Flutter"
|
|
'';
|
|
};
|
|
# backend + Flutter toolchain (large download on first use)
|
|
app = pkgs.mkShell {
|
|
packages = backendTools ++ [
|
|
pkgs.flutter
|
|
# Linux desktop build: flutter_secure_storage_linux links libsecret via pkg-config
|
|
pkgs.pkg-config
|
|
pkgs.libsecret
|
|
];
|
|
shellHook = commonHook;
|
|
};
|
|
};
|
|
};
|
|
}
|