Personal finance tracker
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

init frontend

jeffydc.xyz 727661f3

+482
+11
.editorconfig
··· 1 + root = true 2 + 3 + [*] 4 + end_of_line = lf 5 + insert_final_newline = true 6 + indent_style = tab 7 + charset = utf-8 8 + trim_trailing_whitespace = true 9 + 10 + [*.{nix,yml,yaml}] 11 + indent_style = space
+1
.envrc
··· 1 + use flake
+54
.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + .DS_Store 12 + dist 13 + dist-ssr 14 + coverage 15 + *.local 16 + 17 + # Editor directories and files 18 + .vscode/* 19 + .idea 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw? 25 + 26 + *.tsbuildinfo 27 + 28 + .eslintcache 29 + 30 + # Cypress 31 + /cypress/videos/ 32 + /cypress/screenshots/ 33 + 34 + # Vitest 35 + __screenshots__/ 36 + 37 + # Vite 38 + *.timestamp-*-*.mjs 39 + 40 + test-results/ 41 + playwright-report/ 42 + 43 + # Lock files 44 + pnpm-lock.yaml 45 + package-lock.json 46 + yarn.lock 47 + bun.lockb 48 + deno.lock 49 + 50 + # Ruta 51 + .ruta 52 + 53 + # Nix flakes 54 + .direnv
+24
flake.lock
··· 1 + { 2 + "nodes": { 3 + "nixpkgs": { 4 + "locked": { 5 + "lastModified": 1770843696, 6 + "narHash": "sha256-9SFCZkVcpDOV6unH5hVEy4+dB0rxMuUoBnDAO6vshac=", 7 + "rev": "2343bbb58f99267223bc2aac4fc9ea301a155a16", 8 + "type": "tarball", 9 + "url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre944764.2343bbb58f99/nixexprs.tar.xz" 10 + }, 11 + "original": { 12 + "type": "tarball", 13 + "url": "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz" 14 + } 15 + }, 16 + "root": { 17 + "inputs": { 18 + "nixpkgs": "nixpkgs" 19 + } 20 + } 21 + }, 22 + "root": "root", 23 + "version": 7 24 + }
+40
flake.nix
··· 1 + { 2 + description = "subete"; 3 + 4 + inputs.nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz"; 5 + 6 + outputs = 7 + { self, nixpkgs, ... }: 8 + let 9 + supportedSystems = [ 10 + "x86_64-linux" 11 + "x86_64-darwin" 12 + "aarch64-linux" 13 + "aarch64-darwin" 14 + ]; 15 + forAllSystems = 16 + f: 17 + nixpkgs.lib.genAttrs supportedSystems ( 18 + system: 19 + f { 20 + pkgs = import nixpkgs { inherit system; }; 21 + } 22 + ); 23 + in 24 + { 25 + formatter = forAllSystems ({ pkgs }: pkgs.nixfmt-tree); 26 + 27 + devShells = forAllSystems ( 28 + { pkgs }: 29 + { 30 + default = pkgs.mkShellNoCC { 31 + name = "subete"; 32 + packages = with pkgs; [ 33 + pnpm 34 + nodejs_24 35 + ]; 36 + }; 37 + } 38 + ); 39 + }; 40 + }
+3
frontend/.npmrc
··· 1 + save-prefix='' 2 + engine-strict=true 3 + shell-emulator=true
+17
frontend/.oxfmtrc.json
··· 1 + { 2 + "$schema": "./node_modules/oxfmt/configuration_schema.json", 3 + "ignorePatterns": [], 4 + "singleQuote": true, 5 + "proseWrap": "always", 6 + "experimentalSortImports": { 7 + "groups": [ 8 + ["side-effect"], 9 + ["builtin"], 10 + ["external", "external-type"], 11 + ["internal", "internal-type"], 12 + ["parent", "parent-type"], 13 + ["sibling", "sibling-type"], 14 + ["index", "index-type"] 15 + ] 16 + } 17 + }
+10
frontend/.oxlintrc.json
··· 1 + { 2 + "$schema": "./node_modules/oxlint/configuration_schema.json", 3 + "plugins": ["eslint", "typescript", "unicorn", "oxc", "vue"], 4 + "env": { 5 + "browser": true 6 + }, 7 + "categories": { 8 + "correctness": "error" 9 + } 10 + }
+4
frontend/e2e/tsconfig.json
··· 1 + { 2 + "extends": "@tsconfig/node24/tsconfig.json", 3 + "include": ["./**/*"] 4 + }
+8
frontend/e2e/vue.spec.ts
··· 1 + import { test, expect } from '@playwright/test'; 2 + 3 + // See here how to get started: 4 + // https://playwright.dev/docs/intro 5 + test('visits the app root url', async ({ page }) => { 6 + await page.goto('/'); 7 + await expect(page.locator('h1')).toHaveText('You did it!'); 8 + });
+1
frontend/env.d.ts
··· 1 + /// <reference types="vite/client" />
+13
frontend/index.html
··· 1 + <!doctype html> 2 + <html lang=""> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <link rel="icon" href="/favicon.ico" /> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>Vite App</title> 8 + </head> 9 + <body> 10 + <div id="app"></div> 11 + <script type="module" src="/src/main.ts"></script> 12 + </body> 13 + </html>
+38
frontend/package.json
··· 1 + { 2 + "name": "@subete/frontend", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "vite build", 9 + "preview": "vite preview", 10 + "test-unit": "vitest", 11 + "test-e2e": "playwright test", 12 + "typecheck": "vue-tsc --build", 13 + "lint": "oxlint .", 14 + "lint-fix": "oxlint . --fix", 15 + "fmt": "oxfmt .", 16 + "fmt-check": "oxfmt . --check" 17 + }, 18 + "dependencies": { 19 + "@jeffydc/ruta-vue": "jsr:0.0.1771065752", 20 + "@playwright/test": "1.58.2", 21 + "@tanstack/vue-query": "5.92.9", 22 + "@tsconfig/node24": "24.0.4", 23 + "@types/node": "24.10.9", 24 + "@vitejs/plugin-vue": "6.0.4", 25 + "@vue/tsconfig": "0.8.1", 26 + "oxfmt": "0.32.0", 27 + "oxlint": "1.47.0", 28 + "typescript": "5.9.3", 29 + "vite": "7.3.1", 30 + "vite-plugin-vue-devtools": "8.0.6", 31 + "vitest": "4.0.18", 32 + "vue": "3.5.28", 33 + "vue-tsc": "3.2.4" 34 + }, 35 + "engines": { 36 + "node": ">=22.12.0" 37 + } 38 + }
+111
frontend/playwright.config.ts
··· 1 + import process from 'node:process'; 2 + 3 + import { defineConfig, devices } from '@playwright/test'; 4 + 5 + /** 6 + * Read environment variables from file. 7 + * https://github.com/motdotla/dotenv 8 + */ 9 + // require('dotenv').config(); 10 + 11 + /** 12 + * See https://playwright.dev/docs/test-configuration. 13 + */ 14 + export default defineConfig({ 15 + testDir: './e2e', 16 + /* Maximum time one test can run for. */ 17 + timeout: 30 * 1000, 18 + expect: { 19 + /** 20 + * Maximum time expect() should wait for the condition to be met. 21 + * For example in `await expect(locator).toHaveText();` 22 + */ 23 + timeout: 5000, 24 + }, 25 + /* Fail the build on CI if you accidentally left test.only in the source code. */ 26 + forbidOnly: !!process.env.CI, 27 + /* Retry on CI only */ 28 + retries: process.env.CI ? 2 : 0, 29 + /* Opt out of parallel tests on CI. */ 30 + workers: process.env.CI ? 1 : undefined, 31 + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 32 + reporter: 'html', 33 + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 34 + use: { 35 + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ 36 + actionTimeout: 0, 37 + /* Base URL to use in actions like `await page.goto('/')`. */ 38 + baseURL: process.env.CI ? 'http://localhost:4173' : 'http://localhost:5173', 39 + 40 + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 41 + trace: 'on-first-retry', 42 + 43 + /* Only on CI systems run the tests headless */ 44 + headless: !!process.env.CI, 45 + }, 46 + 47 + /* Configure projects for major browsers */ 48 + projects: [ 49 + { 50 + name: 'chromium', 51 + use: { 52 + ...devices['Desktop Chrome'], 53 + }, 54 + }, 55 + { 56 + name: 'firefox', 57 + use: { 58 + ...devices['Desktop Firefox'], 59 + }, 60 + }, 61 + { 62 + name: 'webkit', 63 + use: { 64 + ...devices['Desktop Safari'], 65 + }, 66 + }, 67 + 68 + /* Test against mobile viewports. */ 69 + // { 70 + // name: 'Mobile Chrome', 71 + // use: { 72 + // ...devices['Pixel 5'], 73 + // }, 74 + // }, 75 + // { 76 + // name: 'Mobile Safari', 77 + // use: { 78 + // ...devices['iPhone 12'], 79 + // }, 80 + // }, 81 + 82 + /* Test against branded browsers. */ 83 + // { 84 + // name: 'Microsoft Edge', 85 + // use: { 86 + // channel: 'msedge', 87 + // }, 88 + // }, 89 + // { 90 + // name: 'Google Chrome', 91 + // use: { 92 + // channel: 'chrome', 93 + // }, 94 + // }, 95 + ], 96 + 97 + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ 98 + // outputDir: 'test-results/', 99 + 100 + /* Run your local dev server before starting the tests */ 101 + webServer: { 102 + /** 103 + * Use the dev server by default for faster feedback loop. 104 + * Use the preview server on CI for more realistic testing. 105 + * Playwright will re-use the local server if there is already a dev-server running. 106 + */ 107 + command: process.env.CI ? 'npm run preview' : 'npm run dev', 108 + port: process.env.CI ? 4173 : 5173, 109 + reuseExistingServer: !process.env.CI, 110 + }, 111 + });
+3
frontend/pnpm-workspace.yaml
··· 1 + onlyBuiltDependencies: 2 + - esbuild 3 + - vue-demi
frontend/public/favicon.ico

This is a binary file and will not be displayed.

+7
frontend/src/App.vue
··· 1 + <script setup lang="ts"> 2 + import { MatchedRoutes } from '@jeffydc/ruta-vue'; 3 + </script> 4 + 5 + <template> 6 + <MatchedRoutes /> 7 + </template>
+13
frontend/src/main.ts
··· 1 + import { RutaVue } from '@jeffydc/ruta-vue'; 2 + import { VueQueryPlugin } from '@tanstack/vue-query'; 3 + import { createApp } from 'vue'; 4 + 5 + import { routes } from './+routes.gen'; 6 + import App from './App.vue'; 7 + 8 + const app = createApp(App); 9 + const router = new RutaVue({ routes }); 10 + 11 + export type Router = typeof router; 12 + 13 + app.use(router).use(VueQueryPlugin, { queryClient: router.context.qc }).mount('#app');
+8
frontend/src/routes/+root-config.ts
··· 1 + import { createRouteBuilder } from '@jeffydc/ruta-vue'; 2 + import { QueryClient } from '@tanstack/vue-query'; 3 + 4 + export const route = createRouteBuilder(null, '/', () => ({ 5 + qc: new QueryClient(), 6 + })) 7 + .layout() 8 + .page();
+5
frontend/src/routes/+root-error.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template> 4 + <slot></slot> 5 + </template>
+3
frontend/src/routes/+root-layout.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+3
frontend/src/routes/+root-page.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+5
frontend/src/routes/wallets/+wallets-config.ts
··· 1 + import { createRouteBuilder } from '@jeffydc/ruta-vue'; 2 + 3 + import { parentRoute } from './+route.gen.ts'; 4 + 5 + export const route = createRouteBuilder(parentRoute, 'wallets').layout().page();
+3
frontend/src/routes/wallets/+wallets-error.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+3
frontend/src/routes/wallets/+wallets-layout.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+3
frontend/src/routes/wallets/+wallets-page.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+5
frontend/src/routes/wallets/wallet/+wallet-config.ts
··· 1 + import { createRouteBuilder } from '@jeffydc/ruta-vue'; 2 + 3 + import { parentRoute } from './+route.gen.ts'; 4 + 5 + export const route = createRouteBuilder(parentRoute, ':walletId').layout().page();
+3
frontend/src/routes/wallets/wallet/+wallet-error.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+3
frontend/src/routes/wallets/wallet/+wallet-layout.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+3
frontend/src/routes/wallets/wallet/+wallet-page.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template></template>
+8
frontend/tsconfig.app.json
··· 1 + { 2 + "extends": ["@vue/tsconfig/tsconfig.dom.json", "./.ruta/tsconfig.json"], 3 + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], 4 + "exclude": ["src/**/__tests__/*"], 5 + "compilerOptions": { 6 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo" 7 + } 8 + }
+14
frontend/tsconfig.json
··· 1 + { 2 + "files": [], 3 + "references": [ 4 + { 5 + "path": "./tsconfig.node.json" 6 + }, 7 + { 8 + "path": "./tsconfig.app.json" 9 + }, 10 + { 11 + "path": "./tsconfig.vitest.json" 12 + } 13 + ] 14 + }
+19
frontend/tsconfig.node.json
··· 1 + { 2 + "extends": "@tsconfig/node24/tsconfig.json", 3 + "include": [ 4 + "vite.config.*", 5 + "vitest.config.*", 6 + "cypress.config.*", 7 + "nightwatch.conf.*", 8 + "playwright.config.*", 9 + "eslint.config.*" 10 + ], 11 + "compilerOptions": { 12 + "noEmit": true, 13 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 14 + 15 + "module": "ESNext", 16 + "moduleResolution": "Bundler", 17 + "types": ["node"] 18 + } 19 + }
+11
frontend/tsconfig.vitest.json
··· 1 + { 2 + "extends": "./tsconfig.app.json", 3 + "include": ["src/**/__tests__/*", "env.d.ts"], 4 + "exclude": [], 5 + "compilerOptions": { 6 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.vitest.tsbuildinfo", 7 + 8 + "lib": [], 9 + "types": ["node"] 10 + } 11 + }
+9
frontend/vite.config.ts
··· 1 + import { ruta } from '@jeffydc/ruta-vue/vite'; 2 + import vue from '@vitejs/plugin-vue'; 3 + import { defineConfig } from 'vite'; 4 + import vueDevTools from 'vite-plugin-vue-devtools'; 5 + 6 + // https://vite.dev/config/ 7 + export default defineConfig({ 8 + plugins: [vue(), vueDevTools(), ruta({ routerModule: './src/main.ts' })], 9 + });
+16
frontend/vitest.config.ts
··· 1 + import { fileURLToPath } from 'node:url'; 2 + 3 + import { mergeConfig, defineConfig, configDefaults } from 'vitest/config'; 4 + 5 + import viteConfig from './vite.config'; 6 + 7 + export default mergeConfig( 8 + viteConfig, 9 + defineConfig({ 10 + test: { 11 + environment: 'jsdom', 12 + exclude: [...configDefaults.exclude, 'e2e/**'], 13 + root: fileURLToPath(new URL('./', import.meta.url)), 14 + }, 15 + }), 16 + );