mirror of
https://github.com/actualbudget/actual.git
synced 2026-07-11 11:59:55 -05:00
api-browser-custom-data-dir
209 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
934cac3262 | Merge branch 'master' into api-browser-custom-data-dir | ||
|
|
af799718f8 |
[AI] Add api.getPreferences() for reading synced preferences (#8410)
* [AI] Add api.getPreferences() for reading synced preferences Expose the internal 'preferences/get' handler as a public API method so consumers can read the budget's synced preferences (number format, currency, date format, etc.) without calling internal handlers directly. Re-export the SyncedPrefs type from @actual-app/api/models and document the new method in the API reference. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KxwSQJiPo5mEk79mA54TWg * Update models.ts --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
6056656128 |
[AI] Support custom dataDir in API browser build and stop masking worker errors
Two fixes for the browser build of @actual-app/api: 1. A dataDir other than /documents failed with a cryptic DataCloneError: the directory didn't exist in the worker's virtual filesystem, and the resulting Emscripten ErrnoError (which carries a function-valued property) couldn't be structured-cloned, so postMessage's own DataCloneError replaced the real error entirely. The web worker connection now retries a failed postMessage with a serialized, cloneable copy of the message so the client always receives the actual failure. Cloneable errors pass through unchanged. 2. The web filesystem registers the configured document dir as a persisted root: it is created automatically on init, its files are persisted to IndexedDB (sqlite files symlinked into the blocked fs), and files recorded in IndexedDB are restored at boot regardless of prefix. The API browser worker defaults dataDir to /documents when omitted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
0b239e0a6d |
[AI] Add tag button mobile (#8344)
* added hash button to enable one-click mobile usage of tags feature * added tags to demo * release notes * [autofix.ci] apply automated fixes * fixed long tags wrapping * removed duplicate <Button> usages and fixed coderabbit smell * removed lint * added null check per coderabbit * moved Menus to after the menu to be consistent with transaction menus * textWrap => whiteSpace for coderabbit * updated tsconfig to fix typecheck issue * Update VRT screenshots Auto-generated by VRT workflow PR: #8344 * typecheck * improved button ergonomics * also don't add space if beginning of note * fixed not working on iOS * handle focus properly for add tag button * fixed focus issue when clicking button on new transaction * added delay because without it chrome doesnt work * Added some more logic for button focusing * fix typecheck * extracted common style into iconStyle * added aria label * removed log statement --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> |
||
|
|
8b5b182dbc |
🔖 (26.7.0) (#8332)
* 🔖 (26.7.0) * Generate release notes for v26.7.0 * update blog author * Generate release notes for v26.7.0 * release notes * Generate release notes for v26.7.0 * Generate release notes for v26.7.0 * Generate release notes for v26.7.0 * relink PRs from cherry-picked changes * tweak wording of release summary * update blog post date * akahu experimental --------- Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk> |
||
|
|
8ad218b7d9 |
[AI] api: make the browser build work in consumer production bundles (#8289)
* api: make the browser build work in consumer production bundles
The browser build shipped `new Worker(new URL("./worker.js", import.meta.url))`
in dist/browser.js. A consumer bundler (Vite/Rollup) recognizes that as a worker
entry and re-bundles the already-prebuilt worker.js from scratch, which desyncs
the absurd-sql/connection RPC so `init` throws a structured-clone error. It only
worked in dev and in the package's own e2e because both serve dist verbatim.
Make the browser build fully self-contained instead:
- Inline the worker into browser.js and spawn it from a Blob URL, so consumer
bundlers never see a worker entry to re-bundle. The worker is built as an IIFE
(classic worker), mirroring the web app's kcab.worker.
- Embed the sql.js wasm and the default filesystem data (migrations + default
DB) into the worker so it performs no PUBLIC_URL asset fetches:
- loot-core sqlite gains an opt-in `setWasmBinary` (dormant for web/node);
- the worker installs a scoped fetch shim serving the embedded data/* files
from a sentinel base URL.
- Share the asset-collection logic between the Node disk copy and the embedded
build via scripts/embedded-assets.mjs so the two never drift.
Result: `import '@actual-app/api'` + `init()` works in any bundler with zero
config; only COOP/COEP headers remain required (SharedArrayBuffer).
Adds an e2e (e2e/consumer + e2e/global-setup.mjs) that builds a real consumer
app for production and boots it under COOP/COEP — coverage the verbatim-dist
harness can't provide. Docs note the build is self-contained and that
cross-origin isolation is still required.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] api: address review feedback (guard DOM lookup, revoke blob URL on worker failure)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] api: address review nitpicks (drop BodyInit cast, reword release note)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] api: build the browser worker via Vite ?worker&inline
Replace the hand-rolled worker inlining (a custom Vite plugin that read the
prebuilt worker.js off disk and inlined it as a string, plus a second build
config and a build-ordering dependency) with Vite's native `?worker&inline`
import. This collapses the two browser build configs into one, removes the
`virtual:actual-worker-code` module and the manual Blob URL spawn, and drops
the worker-before-facade build step.
Vite's `?worker&inline` sub-build doesn't receive vite-plugin-node-polyfills'
global-shim injection (the plugin writes it to `build.rollupOptions`, but the
worker sub-build reads `worker.rollupOptions`), so the worker crashed on
`process is not defined`. Patch the plugin to also emit the injection on
`worker.rollupOptions` — additive and backwards compatible (the web app build,
including loot-core's nodePolyfills worker, is unaffected).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] api: embed browser assets via Vite, drop the embedded-assets script
Replace scripts/embedded-assets.mjs with Vite-native asset imports in the
worker entry: `?inline` for the sql.js wasm and default DB, `import.meta.glob`
(`?raw`) for the migrations. The worker builds the default-filesystem wire
format from those at module load, so the embedded set comes straight from
loot-core and can't drift.
The Node build only needs migrations + the default DB on disk (it reads them at
runtime); the old script also wrote sql-wasm.wasm and the data/ fetch tree,
which are dead now that the browser worker is self-contained. Replace
writeEmbeddedAssetsToDist with a small closeBundle copy of just those two.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] api: simplify embedded data map; drop loot-core comment churn
Merge the worker's binData/textData into a single dataFiles map (Response
accepts both bytes and strings), collapsing the fetch shim's two lookups into
one. Revert the unrelated comment edits to loot-core's backend-worker.ts and
fs/index.ts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] api: rename e2e consumer-dist to consumer/dist; drop a prose comment
Use the standard `dist` directory name for the consumer fixture's build output
(now e2e/consumer/dist), and remove the verbose comment from index.browser.ts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] loot-core: own the default-filesystem assets; consumers stop reaching in
Add packages/loot-core/default-filesystem.mjs as the single source of truth for
loot-core's runtime assets (sql.js wasm, default DB, migrations) and the
data-file-index wire format, exported as @actual-app/core/default-filesystem.
- @actual-app/api: the browser worker embeds them via the actual-embedded-assets
Vite plugin (which calls collectEmbeddedAssets), replacing the relative
?inline/?raw/import.meta.glob reaches into ../loot-core; the Node build copies
migrations + default DB using the helper's paths. Drops the direct
@jlongster/sql.js devDependency (loot-core resolves the wasm).
- @actual-app/web: stagePublicData copies from the helper's paths instead of
hardcoding loot-core's tree and the sql.js wasm location.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* [AI] loot-core: scan migrations once when collecting embedded assets
collectEmbeddedAssets() read the migrations directory twice — once in its
own loop and once via buildDataFileIndex(). List the names once and pass
them through, keeping the index wire-format defined in a single place.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
c4775bf288 |
wire tests up to depot test results analysis (#8262)
* emit junit files * wire up the actions * note * [autofix.ci] apply automated fixes * fix overly broad error * scope to master runs --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> |
||
|
|
c1c4856aa7 |
Bump dompurify in the npm_and_yarn group across 1 directory (#8286)
Bumps the npm_and_yarn group with 1 update in the / directory: [dompurify](https://github.com/cure53/DOMPurify). Updates `dompurify` from 3.4.10 to 3.4.11 - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.10...3.4.11) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.11 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
c74923eb30 |
[AI] Replace vite-plugin-peggy-loader with an in-repo Vite plugin (#8285)
* [AI] Replace vite-plugin-peggy-loader with in-repo Peggy plugin Drop the third-party vite-plugin-peggy-loader dependency in favor of a small in-repo Vite plugin (packages/loot-core/scripts/peggy.mts) that compiles .pegjs grammars using the existing peggy dependency. Wire it into the loot-core and api vite/vitest configs, and remove the now-dead loader from the component-library config (it imports no grammars). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Up3H4YR7L8Qb4UKxbasyMp * [AI] Host the Peggy Vite plugin in a workspace package Move the in-repo Peggy loader out of packages/loot-core/scripts and into a dedicated private workspace package, @actual-app/vite-plugin-peggy, so the loot-core and api configs reference it as a normal workspace dependency instead of reaching across packages with ../loot-core relative imports. The peggy dependency now lives with the plugin that uses it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Up3H4YR7L8Qb4UKxbasyMp * [AI] Rename release note to match PR number Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Up3H4YR7L8Qb4UKxbasyMp --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
8f27e177dc |
[AI] api: add browser build (#8166)
* [AI] api: add browser build
Continuation of #7545 (and #8143, which moved the browser Web Worker
bootstrap into loot-core). This adds the browser-compatible build of
@actual-app/api: the full loot-core stack runs inside a Web Worker and a
thin main-thread facade exposes the same public surface as the Node entry.
loot-core:
- Add platform/client/backend-worker.ts: createBackendWorker(worker)
centralizes absurd-sql's main-thread initBackend + __absurd:* message
filtering, and is exported for the api to reuse.
- Refactor browser-preload's start.ts and worker-bridge.ts to route through
it (drops the duplicated __absurd:* filtering; terminate() now also clears
listeners). Behavior is preserved.
api:
- browser-worker.ts: Web Worker entry owning real loot-core, speaking
loot-core's {id,name,args} backend protocol; wraps fetch to map the
.js -> .js.data migration names.
- index.browser.ts: main-thread facade that spawns the worker.
- browser/rpc.ts: main-thread <-> worker RPC bridge (uses createBackendWorker).
- browser/lib-stub.ts: stubs lib.send so methods.ts routes over postMessage.
- vite.browser.config.mts / vite.browser-worker.config.mts and asset bundling
in vite.config.mts (sql-wasm.wasm + data/ + data-file-index.txt); package.json
build chain, browser export, and absurd-sql/npm-run-all/vite-plugin-node-polyfills deps.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] Rename release note to match PR number 8166
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: move browser worker plumbing into loot-core
Address review feedback: the browser worker logic shouldn't live in the api
package since it's generic "loot-core as a browser npm package" plumbing, not
api-specific. Resolve it via loot-core's existing conditional-export system
instead of a vite alias.
- loot-core: add server/main.api-browser.ts (worker-routing `lib` that
delegates to the existing platform/client/connection), selected via a new
`api-browser` export condition on "./server/main". Move the worker entry to
server/api-browser-worker.ts.
- api: the facade (index.browser.ts) now reuses loot-core's client connection
via a minimal global.Actual.getServerSocket shim and spawns the worker built
from loot-core's entry. Deletes browser-worker.ts, browser/rpc.ts and
browser/lib-stub.ts (~270 lines) in favor of the shared loot-core code.
- The facade build selects the impl with resolve.conditions: ['api-browser']
instead of resolve.alias, removing the enforce-boundaries lint exception.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: simplify browser build cleanups
Post-review cleanups (no behavior change):
- backend-worker.ts: fix stale doc comment referencing the removed
packages/api/browser/rpc.ts (the consumer is now index.browser.ts).
- api-browser-worker.ts: drop the redundant `endsWith('/data-file-index.txt')`
disjunct (subsumed by `endsWith('data-file-index.txt')`) and the no-op
`input as RequestInfo | URL` re-casts on the fetch pass-throughs.
- index.browser.ts: replace the single-field `state` holder with a plain
module-level `let backend`.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: drop the createBackendWorker wrapper, revert browser-preload churn
Now that the facade rides on loot-core's platform/client/connection (which
already ignores absurd-sql's `__`-prefixed internal messages), the only thing
the main thread still needs is absurd's one-line initBackend. So:
- Replace the 60-line createBackendWorker wrapper (onMessage/postMessage/
terminate/listener filtering) with a tiny initBrowserBackend(worker) helper.
- Revert browser-preload/start.ts and worker-bridge.ts to their merged state —
they keep importing absurd's initBackend directly, so this PR no longer
refactors just-merged files and the loot-core change is purely additive.
- Facade holds a plain Worker handle and calls worker.terminate() on shutdown.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: trim verbose comments in the browser build
Keep only the load-bearing "why" notes (the absurd-sql init, the fetch/.js.data
workaround, the global.Actual shim, the api-browser condition); drop protocol
diagrams, usage examples, and restated context. No code/behavior change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: drop redundant absurd-sql dependency
No api source imports absurd-sql; it's reached only through @actual-app/core
(the facade's initBrowserBackend and the bundled worker), which declares it.
It's bundled into the build output, so it isn't a runtime dependency of the
published package either. Bundles are byte-for-byte unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: drop the api-browser condition, inject the worker into the connection
Review feedback: the api-browser export condition fought loot-core's idiom
(browser IS the default platform; node/"api" is the override) and hid a bug —
the condition-swapped lib only had `send`, so api.utils.amountToInteger was
silently undefined in the browser build.
Replace the condition with a plain transport seam:
- methods.ts no longer imports server/main; it sends through api/send.ts,
which the Node entry wires to in-process lib.send and the browser entry
wires to loot-core's client connection. utils.ts re-exports
amountToInteger/integerToAmount from shared/util directly (fixes the bug).
- loot-core's client connection init() now accepts an optional injected
socket; connectBackendWorker(worker) installs absurd-sql's bridge and
connects in one call. This removes the forged global.Actual shim and the
facade's `define: { global: 'globalThis' }` workaround. Desktop's argless
init() path is unchanged.
- Delete main.api-browser.ts, the "./server/main" conditional export, and
the facade's resolve.conditions.
The 4 loot-core snapshot failures (main.test.ts / transfer.test.ts) are
pre-existing on the branch without these changes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: route methods through the client connection, slim the facade
Review feedback: get rid of the _setSend seam and move the worker init logic
into loot-core.
- methods.ts now imports `send` from loot-core's client connection. The node
build resolves it via the existing `api` condition to a new in-process
implementation (platform/client/connection/index.api.ts — previously a dead
re-export of the electron client), matching the platform idiom: browser is
the default, node/"api" overrides. api/send.ts is deleted and the node
entry (index.ts) reverts to master byte-for-byte.
- loot-core's startBackendWorker(worker, config, assetsBaseUrl) now owns the
whole worker boot (absurd-sql bridge + connection.init + server init RPC),
so the browser entry just spawns the worker and calls it.
- Trims: single chained build script (drops the npm-run-all dep), copyFileSync
instead of the linkOrCopy helper, drop the worker entry's error listeners
(browsers already log worker uncaughts to DevTools).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: trim prose comments to the essential ones
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] fix client connection stalling when no sends are queued at connect
Found while smoke-testing the browser api build in a real consumer app: the
client connection only nulled messageQueue (switching from queueing to direct
postMessage) when the queue was non-empty at 'connect'. The desktop app always
has queued sends by then, so it never hits this; the api facade connects
before sending anything, so every later send queued forever and init() hung.
Drop the queue on connect unconditionally.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] fix client connection dropping api/* error replies
Found via the browser smoke test: opening an e2e-encrypted budget without the
key surfaced as "undefined is not an object" instead of an error. The server
connection forwards api/* handler failures as {type:'reply', id, error}, but
the web client connection only read `result`, silently resolving undefined for
every failed api/* call. Reject when the reply carries an error, matching the
server's envelope (and the old api rpc behavior). The electron client has the
same latent gap; left untouched here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: move the worker entry back into the api package
Review feedback: browser-worker.ts is the api package's build entry, not
generic loot-core code — move it back (it now imports loot-core through the
public @actual-app/core exports instead of #-subpaths).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [AI] api: drop the manifest rewrite, align shutdown, trim comments
The data-file-index.txt manifest now lists migrations under their real .js
names (the worker's fetch shim already redirects those to the .js.data files
on disk), so the manifest-rewriting half of the shim is gone. The worker init
payload carries config and assetsBaseUrl as separate fields instead of
smuggling a private key into the config object, browser shutdown() mirrors
the node facade, and the client connection's queue flush drops a redundant
branch.
* [AI] fix rejected handler promises poisoning close-budget
runHandler only removed a method's promise from runningMethods when it
fulfilled, so any handler rejection left a stale promise in the set. The next
close-budget then failed: flushRunningMethods' Promise.all rejected with that
old, unrelated error before closeBudget even ran. Remove settled promises on
rejection too, and flush with Promise.allSettled since rejected methods
already reported their error to their caller.
* [AI] api: add a browser e2e test
A Playwright test loads the built browser bundle in chromium from a static
COOP/COEP server and exercises the full stack: worker boot, the rejected-error
contract, budget import, transaction read-back, and IndexedDB persistence
across a page reload. A dedicated workflow runs it in CI on api/loot-core
changes.
* [AI] api: drop the worker fetch shim; strip .data names in loot-core fs
The .js.data scheme was spread across three coordinated pieces: the build
renamed migrations on disk, the manifest listed names that didn't exist, and
a global fetch monkey-patch in the worker un-lied at runtime. Now the
manifest lists the true on-disk names and populateDefaultFilesystem (the only
fetcher of these files) strips the .data suffix when naming the virtual file
— the fetch patch is gone and the suffix becomes a small documented fs
convention. Also: e2e static server uses a single stat and drops a dead MIME
entry.
* [AI] fix electron client connection dropping api/* error replies
Both server connection variants post api/* handler failures as
{type: 'reply', id, error}, but only the web client rejected on it
(
|
||
|
|
fbdad57ff0 |
⬆️ mid month dependency updates (#8235)
* @monorepo-utils/workspaces-to-typescript-project-references (^2.10.3 → ^2.11.0) * @types/node (^22.19.17 → ^22.19.21) * eslint (^10.2.0 → ^10.5.0) * eslint-plugin-perfectionist (^5.8.0 → ^5.9.0) * lage (^2.15.5 → ^2.15.13) * typescript (^6.0.2 → ^6.0.3) * vitest (^4.1.2 → ^4.1.8) * better-sqlite3 (^12.8.0 → ^12.10.0) * vite (^8.0.5 → ^8.0.16) * cosmiconfig (^9.0.1 → ^9.0.2) * react-aria-components (^1.16.0 → ^1.18.0) * @chromatic-com/storybook (^5.1.1 → ^5.2.1) * @storybook/addon-a11y (^10.3.4 → ^10.4.4) * @storybook/addon-docs (^10.3.4 → ^10.4.4) * @storybook/react-vite (^10.3.4 → ^10.4.4) * @types/react (^19.2.14 → ^19.2.17) * @vitejs/plugin-react (^6.0.1 → ^6.0.2) * eslint-plugin-storybook (^10.3.4 → ^10.4.4) * storybook (^10.3.4 → ^10.4.4) * @bufbuild/protobuf (^2.11.0 → ^2.12.0) * @bufbuild/protoc-gen-es (^2.11.0 → ^2.12.0) * @babel/core (^7.29.0 → ^7.29.7) * @codemirror/autocomplete (^6.20.1 → ^6.20.3) * @react-aria/interactions (^3.27.1 → ^3.28.1) * @reduxjs/toolkit (^2.11.2 → ^2.12.0) * @tanstack/react-query (^5.96.2 → ^5.101.0) * @uiw/react-codemirror (^4.25.9 → ^4.25.10) * date-fns (^4.1.0 → ^4.4.0) * hyperformula (^3.2.0 → ^3.3.0) * lru-cache (^11.2.7 → ^11.5.1) * react-aria (^3.47.0 → ^3.49.0) * react-error-boundary (^6.1.1 → ^6.1.2) * react-hotkeys-hook (^5.2.4 → ^5.3.2) * react-redux (^9.2.0 → ^9.3.0) * react-spring (^10.0.3 → ^10.0.4) * rolldown (^1.0.0-rc.13 → ^1.1.1) * sass (^1.99.0 → ^1.101.0) * vite-plugin-pwa (^1.2.0 → ^1.3.0) * @docusaurus/core (^3.10.0 → ^3.10.1) * @docusaurus/plugin-content-docs (^3.10.0 → ^3.10.1) * @docusaurus/plugin-ideal-image (^3.10.0 → ^3.10.1) * @docusaurus/preset-classic (^3.10.0 → ^3.10.1) * @docusaurus/theme-common (^3.10.0 → ^3.10.1) * @docusaurus/theme-mermaid (^3.10.0 → ^3.10.1) * @easyops-cn/docusaurus-search-local (^0.55.1 → ^0.55.2) * @docusaurus/module-type-aliases (^3.10.0 → ^3.10.1) * @oxlint/plugins (^1.60.0 → ^1.69.0) * ua-parser-js (^2.0.9 → ^2.0.10) * fast-check (^4.6.0 → ^4.8.0) * jest-diff (^30.3.0 → ^30.4.1) * workbox-precaching (^7.4.0 → ^7.4.1) * ipaddr.js (^2.3.0 → ^2.4.0) * jws (^3.2.2 → ^3.2.3) * http-proxy-middleware (^3.0.5 → ^3.0.6) * oxlint (^1.59.0 → ^1.69.0) * @codemirror/view (^6.41.0 → ^6.43.1) * yarn dedupe * nano-staged (^0.8.0 → ^1.0.2) * commander (^14.0.3 → ^15.0.0) * react (>=19.2 → 19.2.7) * react-dom (>=19.2 → 19.2.7) * @rolldown/plugin-babel (~0.1.8 → ~0.2.3) * downshift (9.3.2 → 9.3.6) * i18next (^25.10.10 → ^26.3.1) * react-i18next (^16.6.6 → ^17.0.8) * react-router (7.15.0 → 7.17.0) * vite-plugin-node-polyfills (^0.27.0 → ^0.28.0) * jws (^3.2.3 → ^4.0.1) * oxlint-tsgolint (^0.20.0 → ^0.23.0) * jsdom (^27.4.0 → ^29.1.1) * note * [autofix.ci] apply automated fixes * [autofix.ci] apply automated fixes (attempt 2/3) * crdt regenerate and version bump * fix test * yarn dedupe --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> |
||
|
|
1f492387b7 |
🔖 (26.6.0) (#7947)
* 🔖 (26.6.0) * Generate release notes for v26.6.0 * Generate release notes for v26.6.0 * Update check-spelling metadata * Generate release notes for v26.6.0 * add release summary * links * Generate release notes for v26.6.0 * update links * Generate release notes for v26.6.0 * Generate release notes for v26.6.0 * Generate release notes for v26.6.0 * add EB link * Add initial docs for Enable Banking (#7961) * Add initial docs for Enable Banking * Delete upcoming-release-notes/7961.md * [Docs] UI Budget automations & month-end cleanup (#7863) * Add files via upload * Create documentation for budget automation feature Added documentation for the budget automation feature, detailing its functionalities, usage, and examples. * Add files via upload * Revise budget automation documentation for clarity Updated the documentation for budget automation, enhancing clarity and consistency in the descriptions of features and options. * [autofix.ci] apply automated fixes * Update Markdown headers for budget automation section * Add files via upload * Improve formatting in budget automation documentation Updated formatting and added line breaks for better readability in the budget automation documentation. * [autofix.ci] apply automated fixes * Fix HTML line breaks in budget-automation.md Updated HTML line breaks from '</br>' to '<br>' in budget automation documentation. * Fix HTML line breaks in budget automation documentation * Fix headings and formatting in budget-automation.md Updated formatting and corrected headings in budget automation documentation. * Add budget-automation to sidebar items * Add files via upload * Add files via upload * Revise budget automation documentation Updated budget automation documentation to clarify usage of notes templates and detailed instructions for month-end cleanup processes, including named pools and weight calculations. * [autofix.ci] apply automated fixes * Refactor budget automation documentation for clarity Updated various sections for clarity and consistency, including grammar corrections and improved phrasing. * [autofix.ci] apply automated fixes * Enhance budget automation documentation Updated budget automation documentation with new blog links and improved formatting. * Fix links in budget-automation.md Updated links in the budget automation documentation to remove 'docs' prefix for consistency. * Revise budget automation documentation with updates Updated images and text for budget automation documentation, including corrections and enhancements to clarity. * Improve clarity and add save reminders in budget automation Updated wording for clarity and added reminders for saving work. * Update budget automation documentation for clarity Clarify the process of handling leftover funds in the budget automation script. * [autofix.ci] apply automated fixes * Add 'overfund' and 'overfunded' to spelling expect list * Update spelling expectations by removing 'overfunded' Removed 'overfunded' from the spelling expectations. * Add files via upload * 'overfund' to 'overfunded' First the bot tells me overfunded isn't needed if overfund is there. Now, it tells me that overfunded IS needed. I give up. * Enhance budget automation documentation Added new sections on automation adjustments, moved some sections around, added horizontal separators. * Update images and descriptions in budget automation docs * Add files via upload * Add automation notes section to budget automation docs Added a section on automation notes to document how automations, balance caps, and long-term goals can have associated notes for clarity and tracking. * Add files via upload * Update budget automation examples in documentation * Add files via upload * Apply suggestions from code review Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk> * [autofix.ci] apply automated fixes * Add 'unmigrate' to spelling expectations * Improve clarity in budget automation documentation Clarified descriptions for budget automation features and improved wording for better understanding. * Correct spelling of 'unmigrate' to 'Unmigrate' They are the same and github is punking me again. * Clarify automation notes description * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Fix typos in budget-automation documentation Corrected typos and improved clarity in the budget automation documentation. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk> --------- Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk> Co-authored-by: Mats Nilsson <matni403@gmail.com> Co-authored-by: Juulz <julesmcn@gmail.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> |
||
|
|
50feba1afb |
[AI] Fix flaky API test timeouts and use sync file write in tests (#7806)
* [AI] Fix flaky upload-user-file test
The "uploads and updates an existing file successfully" test wrote the
old file content using the async callback form of fs.writeFile without
awaiting it. That write could land after the upload endpoint had already
written the new content, leaving the file with stale content and failing
the assertion. Use fs.writeFileSync so the setup completes before the
request is sent.
* [AI] Increase api test timeouts to fix flaky budget-load test
methods.test.ts loads a budget file and runs all DB migrations in each
test/hook. On busy CI runners this regularly approaches the default 5s
limit, and when it exceeds it the in-flight loadBudget keeps running after
teardown closes the database, producing a cascade of unhandled rejections
("database connection is not open", "no such table: v_schedules",
"Cannot read properties of undefined (reading 'timestamp')") that fail the
suite. Bump testTimeout/hookTimeout to 20s for the api package.
* [AI] Add release note for flaky test fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
|
||
|
|
5d270340a5 |
CLI: Hide hidden categories by default in list commands (#7786)
* [AI] CLI: hide hidden categories by default in list commands The `categories list` and `category-groups list` commands now exclude hidden entries by default. Pass `--include-hidden` to include them, mirroring the existing `--include-closed` flag for `accounts list`. https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F * [AI] Rename release note to 7785.md and update author https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F * [AI] CLI: simplify category-groups list and consolidate test setup - Flatten the include-hidden ternary on category-groups list into a single filter chain, mirroring categories list. - Consolidate duplicated stderr/stdout spy setup into one outer describe in categories.test.ts. https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F * [AI] Rename release note to 7786.md to match PR number https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F * [AI] Push hidden-category filtering down to the API/query layer Add an optional \`hidden\` filter to \`api.getCategories\` and \`api.getCategoryGroups\`. When set, the AQL query filters category groups by hidden status and nested categories are filtered to match. Internal callers (no options) keep the existing "return everything" behavior. The CLI \`categories list\` and \`category-groups list\` commands now pass \`{ hidden: false }\` instead of filtering client-side after fetching. https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F * [AI] Document new \`hidden\` option on getCategories and getCategoryGroups https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F * [AI] getCategories: include hidden categories from visible groups in list When \`hidden: true\` was requested, the flat list only contained hidden categories that lived inside hidden groups, because it was derived from the same already-filtered groups used for the grouped view. A hidden category sitting in a visible group was silently dropped. Fetch the unfiltered groups for the list view and filter by \`category.hidden\` so the list reflects every hidden category regardless of its parent group's hidden status. The grouped view is unchanged. https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F * [AI] getCategories: query categories table directly when hidden=true Replace the second \`getCategoryGroups()\` call (which loaded every group plus its nested categories just to be flattened and filtered) with a direct \`q('categories').filter({ hidden: true })\` AQL query. Same result, one targeted query instead of fetching all groups. The non-hidden=true paths are unchanged. https://claude.ai/code/session_01DhYiicACsWb5NGHX71Wv4F --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
3799b587ec |
[AI] Add getNote and updateNote to public API (#7769)
* [AI] Add getNote and updateNote to public API
Notes on categories and other entities have no public API surface today.
The internal `notes-save` handler exists and works, but callers outside
the app must reach into undocumented internals to use it.
A concrete motivation: AI assistants driving Actual through an MCP server
(e.g. Claude via @actual-app/api) can set budget templates and savings
goals on categories by writing specially-formatted strings to the notes
field (e.g. `#template 250`, `#goal 1000`). Without a public API this
requires using the private `lib.send('notes-save', …)` path, which is
fragile and not guaranteed to stay stable.
This commit adds two public methods:
- `getNote(id)` — returns the NoteEntity for a given entity id, or null
- `updateNote(id, note)` — sets the note string on any entity by id
Implementation:
- Adds `notes-get` handler in `packages/loot-core/src/server/notes/app.ts`
- Adds `api/note-get` and `api/note-update` handlers in `api.ts`
- Adds `ApiHandlers` types for both new handlers
- Exposes `getNote` / `updateNote` in `packages/api/methods.ts`
- Adds a test covering get (null before set) and set/update round-trip
Testing:
- `yarn typecheck` — passed (10/10 packages, 0 errors)
- `yarn lint:fix` — passed (0 errors)
- `yarn workspace @actual-app/api test` — passed (19/19 tests, including
the new "Notes: successfully get and update note" test)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* [AI] Add release note for PR #7769
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* [AI] Address review feedback: tighten types and add docs
- Use NoteEntity field types (Pick<NoteEntity, 'id'>, NoteEntity['id'],
NoteEntity['note']) instead of plain strings throughout
- Rename getNotes -> getNote (singular) in notes/app.ts
- Add Notes section to packages/docs/docs/api/reference.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
|
||
|
|
db38565524 |
Bump uuid from 13.0.2 to 14.0.0 (#7739)
* Bump uuid from 13.0.2 to 14.0.0 Bumps [uuid](https://github.com/uuidjs/uuid) from 13.0.2 to 14.0.0. - [Release notes](https://github.com/uuidjs/uuid/releases) - [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md) - [Commits](https://github.com/uuidjs/uuid/compare/v13.0.2...v14.0.0) --- updated-dependencies: - dependency-name: uuid dependency-version: 14.0.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * [AI] Add engines field to sync-server package.json for Node.js >=22 requirement Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> |
||
|
|
345c99be4d | [AI] Bump workspace packages to 26.5.2 and document 26.5.2 in release notes (#7756) | ||
|
|
bc08ed97e9 | [AI] 🔖 Release 26.5.1 (#7745) | ||
|
|
852b95524b |
[AI] Revert crypto.randomUUID back to uuid library (#7734)
* [AI] Revert crypto.randomUUID back to uuid library
Partial revert of #7529. Restores the `uuid` package dependency in
api, crdt, desktop-client, loot-core, and sync-server, swapping every
`crypto.randomUUID()` call introduced by that PR back to `uuidv4()`
(and the `uuid()` alias in RuleEditor.tsx and ruleUtils.ts where it
was previously used). The lint rule, docs entry, and `vi.mock('uuid')`
test setup are restored as well. The `fs-extra` removals in
desktop-electron from the same PR are left in place.
https://claude.ai/code/session_01KTg1g416Jdjf5feGke8MQw
* Add release notes for PR #7734
* [check-spelling] Update metadata
Update for https://github.com/actualbudget/actual/actions/runs/25480733101/attempts/1
Accepted in https://github.com/actualbudget/actual/pull/7734#issuecomment-4394811498
Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>
* [AI] Use the uuidv4 alias in RuleEditor and ruleUtils
The previous commit preserved the `v4 as uuid` alias in these two files
to match their pre-#7529 state, but the project convention (and lint
rule message) is `v4 as uuidv4`. CodeRabbit flagged the inconsistency,
so normalize the alias and call sites in both files.
https://claude.ai/code/session_01KTg1g416Jdjf5feGke8MQw
* [AI] Pin uuid to ^11.1.0 to fix Electron e2e
uuid v13 is ESM-only (no CJS entry, only an exports map with `node` and
`default` conditions both pointing to ESM files). The Electron backend is
bundled as CJS by `loot-core/vite.desktop.config.mts` and loaded via a
dynamic `await import(process.env.lootCoreScript!)` in the
desktop-electron utilityProcess; that pipeline appears to fall over on
the ESM-to-CJS transform of uuid v13 in Vite 8 / rolldown, which makes
the Functional Desktop App e2e job fail consistently while every other
check (web e2e, VRT, unit tests, lint, typecheck) passes.
uuid v11 still ships `dist/cjs/index.js`, so pinning each workspace's
uuid range to ^11.1.0 sidesteps the resolution path entirely. The API
is unchanged (`v4` is still the same export), so no source-code changes
are needed.
https://claude.ai/code/session_01KTg1g416Jdjf5feGke8MQw
* [AI] Capture Electron stdout/stderr in desktop e2e fixture (TEMP DEBUG)
Pipe the Electron main+utility process stdout/stderr into both the
playwright runner stderr and an electron.log file inside the test's
output directory. This makes the actual backend error visible in the
Functional Desktop App job output and in the desktop-app-test-results
artifact.
Will be reverted once the failure cause is identified.
https://claude.ai/code/session_01KTg1g416Jdjf5feGke8MQw
* Revert "[AI] Capture Electron stdout/stderr in desktop e2e fixture (TEMP DEBUG)"
This reverts commit
|
||
|
|
6c2c96e826 |
🔖 (26.5.0) (#7621)
* 🔖 (26.5.0)
* fix release note generation script (#7635)
* fix release note generation script
* note
* fix cherrypicked commits not being respected and lint race in release note generation workflow (#7640)
* fix cherrypicked commits not being respected and lint race
* note
* coderabbit suggestions
* fix lint
* make double restore possibility safe
* fix lint (#7643)
* Generate release notes for v26.5.0
* add release note highlights
* Fix Sankey income bug, when payee it not set (#7632)
* Ensure income categories are shown correct, even if payee is not set
* Add release note
* Generate release notes for v26.5.0
* increase test coverage for budget templates (#7620)
* [AI] cover existing template engine logic with regression tests
Adds tests for goal template behavior that predates this PR so the
suite can be cherry-picked onto master to confirm no regressions. No
production code changes.
Covers:
- init() validation: schedule names, by/schedule priority match, past
by-target with and without annual/repeat, percentage source not
found, special source aliases, duplicate limit/spend/goal
directives, weekly limit missing start date, invalid limit period,
unrecognized periodic period
- runRemainder cap clamping and hideDecimal fraction removal
- Income-category branch in runTemplatesForPriority
- getLimitExcess against an aggregate weekly cap
- Past by-target rolling forward via the annual period
- runSchedule full=true (no sinking accumulation), percent and fixed
adjustments, completed-schedule filtering, past-date error for
non-repeating schedules, monthly/weekly/daily sinking contribution
branches when interval exceeds the pay-month-of cap, surplus
absorption when last-month balance exceeds the target, and
tracking-budget mode forcing all schedules pay-month-of
- applyMultipleCategoryTemplates orchestration: per-category writes,
cross-category priority clamping when funds run out, error
notification path
- applyTemplate force=false skipping already-budgeted categories
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* note
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix infinite loop when remainder is impossible to solve (#7623)
* fix infinite loop when remainder is impossible to solve
* note
* Generate release notes for v26.5.0
* Update author
Updated author information in the release notes.
* Fix shared worker resumption after tab suspend (#7656)
* [AI] Fix SharedWorker tab resume recovery
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [AI] Fix SharedWorker reload readiness
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add release notes
* Update packages/desktop-client/src/shared-browser-server-core.ts
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
* Update docs release date
* Empty commit to bump CI
* Generate release notes for v26.5.0
* Revert "Generate release notes for v26.5.0"
This reverts commit
|
||
|
|
4a5ee9c2dc |
[AI] Make TypeScript work in test files across packages (#7642)
* [AI] Make TypeScript work in test files across packages Match the CRDT package's tsconfig pattern in loot-core, desktop-client, api, and desktop-electron so test files participate in the project graph (IDE intellisense, project-wide typecheck) while production builds still emit clean declaration files. - Remove test-file exclusions from each package's main tsconfig - Add tsconfig.build.json for loot-core and api with test exclusions, used by the build scripts - Add e2e/tsconfig.json for desktop-client and desktop-electron with Playwright types - Fix latent type errors in test files now caught by typecheck - Disable typescript/unbound-method for test files (mock matcher pattern) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Release notes * [AI] Address review feedback on test type fixes - goal-template.test.ts: extract amounts to typed locals so single-value assertions no longer compare against unknown - category-template-context.test.ts: replace `as unknown as DbCategory` double-cast with a fully-typed object using `satisfies DbCategory` (the previous mock had `is_income: true` which doesn't match the `1 | 0` shape the cast was hiding) - api/tsconfig.build.json: broaden test exclude pattern to `**/*.test.ts` Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * [AI] Widen toMatchThemeScreenshots matcher to accept Page The matcher's runtime impl already handled both Page and Locator (via `typeof locator.page === 'function'` branch), but the type only declared Locator. Call sites pass a Page (`expect(page).toMatchThemeScreenshots()`), which now compiles cleanly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * [AI] Type window.Actual in e2e fixtures and refactor matcher - Pull loot-core/typings/window.ts into the e2e tsconfig include so the ambient `window.Actual` augmentation is visible. - Refactor toMatchThemeScreenshots to derive a Page once via `'page' in target`, then call evaluate on the page consistently. The previous union-typed access (locator.evaluate, locator.page) didn't typecheck on Locator | Page. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * [AI] Drop tsconfig.build.json for loot-core and api The build-config indirection was incomplete protection: typecheck (`tsgo -b` against the main tsconfig, which now includes test files) already emits `*.test.d.ts` into `@types/`, and the build step does not clean before re-emitting. The same is observable in crdt's `dist/`, which currently contains test declarations on disk. What actually keeps test declarations out of the npm tarball is the `files` field in package.json — and loot-core already uses that mechanism for source files (`\!src/**/*.test.ts`). Extending the same pattern to `@types/` is more direct than maintaining a duplicate tsconfig that doesn't reliably do its job. - Delete loot-core/tsconfig.build.json; revert build to `tsgo -b`; add `\!@types/**/*.test.d.ts*`, `\!@types/**/__tests__/**`, `\!@types/**/__mocks__/**` to `files`. - Delete api/tsconfig.build.json; revert build to `vite build && tsgo --emitDeclarationOnly`; add `\!@types/**/*.test.d.ts*` to `files`. Verified: `yarn pack --dry-run` excludes all test declarations from both packages while production declarations still pack (428 .d.ts files for loot-core, methods.d.ts for api). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * [AI] Standardise crdt to drop tsconfig.build.json Apply the same simplification as loot-core and api: a single tsconfig per package, with `files`-field negations preventing test declarations from being published. Note: this also fixes a pre-existing issue where crdt was shipping `crdt/timestamp.test.d.ts` and `crdt/merkle.test.d.ts` to npm. The old `tsconfig.build.json` excluded test files from declaration emit, but the `typecheck` script (`tsgo -b` via the main tsconfig) had already emitted them into `dist/` and the build did not clean first, so they were packed via `"files": ["dist"]`. After this change, `yarn pack --dry-run` packs only production declarations (10 .d.ts files) and excludes the test ones. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
9d91da77ec |
move from tsgo dev preview to beta (#7587)
* move from tsgo dev preview to beta * note |
||
|
|
7d4e28041c |
[AI] Export API models as separate entry point (#7581)
* [AI] Expose API entity types via @actual-app/api/models
Adds a new `./models` subpath export on `@actual-app/api` that re-exports
the public API entity types (`APIAccountEntity`, `APICategoryEntity`,
`APICategoryGroupEntity`, `APIFileEntity`, `APIPayeeEntity`,
`APIScheduleEntity`, `APITagEntity`, `AmountOPType`) from
`@actual-app/core/server/api-models`. Consumers can now import these types
from a stable public entry point instead of reaching into core internals:
import type {
APICategoryEntity,
APICategoryGroupEntity,
} from '@actual-app/api/models';
Uses `export type *` so the compiled `dist/models.js` is empty and no
runtime code is added. The Vite lib config is expanded to a multi-entry
map (`index`, `models`) so both bundles are produced, and tsgo already
emits `@types/models.d.ts` via the existing `declarationDir` setup.
* Add release notes for PR #7581
* Modify release notes for API model exports
Updated category from 'Features' to 'Enhancements' and added API export details.
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
|
||
|
|
2f49c5c400 |
add repository details to package.json files (#7578)
* add package URLs * note |
||
|
|
75da8f1851 |
[AI] fix: ensure crdt builds before loot-core is packed (#7565)
The `Publish nightly npm packages` workflow started failing at the
"Pack the core package" step with:
Cannot find module '@actual-app/crdt' or its corresponding type declarations.
PR #7541 switched `@actual-app/crdt`'s package.json to conditional
exports (`types` → `./dist/index.d.ts`). `yarn pack` for
`@actual-app/core` triggers a prepack that runs `tsgo -b`, which now
resolves `@actual-app/crdt` via the `types` condition and expects
`packages/crdt/dist/index.d.ts`. Nothing was building crdt first
because loot-core's tsconfig didn't declare it as a project
reference.
Fix: declare the project reference so `tsgo -b` walks the graph and
builds crdt before loot-core. Sibling packages already do this.
Also adopt `@monorepo-utils/workspaces-to-typescript-project-references`
to keep each package's tsconfig `references` in sync with its
`workspace:*` deps, and wire it into a new `yarn check:tsconfig-references`
step in the `check` CI job plus lint-staged. Running the tool added
`../desktop-client` references to sync-server and desktop-electron
(both declare `@actual-app/web` as a workspace dep even though they
only use it at runtime via `require.resolve`); the extra references
are harmless — in CI the corresponding build is already cached by
earlier steps.
https://claude.ai/code/session_01AA2gEMqX24GWeq5BovNmaz
|
||
|
|
711939f71c |
replace uuid and fs-extra with builtins (#7529)
* fs-extra * uuid * note |
||
|
|
8c47374b9d |
⬆️ mid-month dependency bump (#7506)
* typescript (^5.9.3 -> ^6.0.2) * eslint-plugin-perfectionist (^5.6.0 → ^5.8.0) * @types/node (^22.19.15 → ^22.19.17) * @typescript/native-preview (^7.0.0-dev.20260309.1 → ^7.0.0-dev.20260404.1) * eslint (^9.39.3 → ^9.39.4) * lage (^2.14.19 → ^2.15.5) * lint-staged (^16.3.2 → ^16.4.0) * minimatch (^10.2.4 → ^10.2.5) * vitest (^4.1.0 → ^4.1.2) * better-sqlite3 (^12.6.2 → ^12.8.0) * commander (^13.0.0 → ^13.1.0) * cosmiconfig (^9.0.0 → ^9.0.1) * @chromatic-com/storybook (^5.0.1 → ^5.1.1) * @storybook/addon-a11y (^10.2.16 → ^10.3.4) * @storybook/addon-docs (^10.2.16 → ^10.3.4) * @storybook/react-vite (^10.2.16 → ^10.3.4) * eslint-plugin-storybook (^10.2.16 → ^10.3.4) * storybook (^10.2.16 → ^10.3.4) * @codemirror/language (^6.12.2 → ^6.12.3) * @react-aria/interactions (^3.27.0 → ^3.27.1) * @swc/core (^1.15.18 → ^1.15.24) * @swc/helpers (^0.5.19 → ^0.5.21) * @tanstack/react-query (^5.90.21 → ^5.96.2) * @uiw/react-codemirror (^4.25.7 → ^4.25.9) * @vitejs/plugin-basic-ssl (^2.2.0 → ^2.3.0) * i18next (^25.8.14 → ^25.10.10) * lru-cache (^11.2.6 → ^11.2.7) * react-grid-layout (^2.2.2 → ^2.2.3) * react-i18next (^16.5.6 → ^16.6.6) * rolldown (^1.0.0-rc.12 → ^1.0.0-rc.13) * sass (^1.97.3 → ^1.99.0) * adm-zip (^0.5.16 → ^0.5.17) * csv-parse (^6.1.0 → ^6.2.1) * csv-stringify (^6.6.0 → ^6.7.0) * jest-diff (^30.2.0 → ^30.3.0) * express-rate-limit (^8.3.0 → ^8.3.2) * upgrade yarn to 4.13.0 * react-aria-components (^1.15.1 → ^1.16.0) * @vitejs/plugin-react (^6.0.0 → ^6.0.1) * @codemirror/state (^6.5.4 → ^6.6.0), @codemirror/view (^6.38.7 → ^6.41.0) * react-aria (^3.46.0 → ^3.47.0) * react-error-boundary (^6.0.3 → ^6.1.1) * recharts (^3.7.0 → ^3.8.1) * fast-check (4.5.3 → ^4.6.0) * rollup-plugin-visualizer (^6.0.11 → ^7.0.1) * commander (^13.1.0 → ^14.0.3) * note * coderabbit feedback, and a test for good measure * typescript (^5.9.3 -> ^6.0.2) * @playwright/test (1.58.2 -> 1.59.1) * yarn dedupe |
||
|
|
c4f3fb0b93 |
[AI] Fix type errors for API consumers by shipping .d.ts declarations (#7468)
* [AI] Fix type errors for API consumers by shipping .d.ts declarations from loot-core Downstream consumers of @actual-app/api with strict: true get type errors because @actual-app/core exports raw .ts source files. Consumers' tsc follows the import chain into core's source (compiled with strict: false), and skipLibCheck doesn't help since it only skips .d.ts files. Add "types" conditions to all imports/exports entries in loot-core's package.json, pointing to the pre-built declarations in lib-dist/decl/. Add .npmignore to include lib-dist/decl/ in the published package. Fixes #7410 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Use prepack/postpack scripts instead of inflating package.json Replace the inline "types" conditions in imports/exports with a prepack script that adds them at pack/publish time. This keeps the checked-in package.json clean while still shipping .d.ts declarations to npm consumers. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Convert prepack/postpack scripts to TypeScript Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Add release notes for #7468 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Fix recursive ExportValue type and remove redundant comment Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Rename scripts to .mts and inline types conditions Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Make backup/restore scripts safer - Check if backup exists before creating it in prepack - Make restore idempotent by checking if backup exists in postpack - Prevents overwriting existing backups from interrupted runs - Addresses CodeRabbit review feedback Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> * [AI] Type api-handlers.ts fields to drop implicit any The `fields` / export-args slots in the ApiHandlers contract were untyped, surfacing as TS7008 errors in strict consumers. Replace them with the `Partial<APIXxxEntity>` shapes the `@actual-app/api` wrappers already pass, and annotate the matching call sites in `api.ts` with `@ts-expect-error` where the legacy helpers still declare full-entity parameters despite accepting partial updates at runtime. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Replace vite-plugin-dts with tsgo for api types Drops vite-plugin-dts in favor of running tsgo --emitDeclarationOnly after the vite bundle, eliminating a heavy dev dependency tree (api-extractor, volar, vue language-core) from the api package build. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Add build script to loot-core to emit declarations via lage `yarn build:cli` failed in CI with TS6305 because api's `tsgo --emitDeclarationOnly` depends on loot-core's pre-built `lib-dist/decl/*.d.ts`, but loot-core had no `build` script, so lage's `^build` cascade silently skipped it. Add `"build": "tsgo -b"` so loot-core slots into the dependency chain; its tsconfig already has `emitDeclarationOnly: true`, so the output is declarations only. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Simplify API build * [AI] Document TypeScript moduleResolution requirement for @actual-app/api The published declarations rely on package.json exports conditions, which classic node / node10 resolvers don't honor. Document the supported modes (bundler / nodenext / node16) in the package README and in the Getting Started section of the API docs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Type-guard default value in add-types-conditions prepack `value.default` is typed `ExportValue | undefined`, which allows nested conditional objects. The previous truthy check fell through to `shouldSkip(defaultValue)` and would crash on `.endsWith()` if that shape ever appeared. Replace with a `typeof === 'string'` narrowing and drop a now-redundant "Insert types as the first key" comment. No runtime change on current package.json — no nested `default` values exist today — but the script is not covered by loot-core's tsconfig include, so the latent type issue was silent. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Allow "nodenext" in docs spellcheck expect list Referenced in the new TypeScript moduleResolution note in the API docs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Move loot-core declarations to @types and whitelist publish with files Relocate loot-core's composite TypeScript output from lib-dist/decl to the top-level @types directory, matching the api package's convention. Replace the old .npmignore blacklist with an explicit package.json files whitelist. - tsconfig.json: outDir @types, exclude test/mock dirs from decl emission - scripts/add-types-conditions.mts: rewrite paths to ./@types/src/... - package.json: files whitelist shipping only src, @types, migrations, typings, default-db.sqlite; drop legacy typesVersions (docs now require moduleResolution bundler/nodenext/node16, so the classic-resolution fallback is unused) - .gitignore: ignore the new @types build artifact - lage.config.js: factor outputGlob into a shared BUILD_OUTPUT_GLOBS constant and add @types/** so lage caches loot-core's decl output - root tsconfig.json: tighten exclude from packages/api/@types to packages/*/@types to cover both api and loot-core - delete .npmignore entirely Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Build loot-core declarations inside prepack yarn workspace @actual-app/core pack is the first non-setup step in the publish workflow, running before any build. Without a build chained into prepack the @types/ tree is empty at pack time, so the tarball shipped a transformed package.json pointing at ./@types/src/... paths that didn't exist. npm publish doesn't re-run hooks on a pre-packed tarball, so the frozen snapshot must be self-contained; prepack now runs yarn build first to populate @types/ before add-types-conditions rewrites the exports. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> |
||
|
|
4960363de6 |
[AI] Stop using .browser extension; removing "resolve.extensions" - prefer conditions via package.json (#7254)
* [AI] Consolidate loot-core connection: default web path, electron split, drop .browser * [autofix.ci] apply automated fixes * [AI] Replace browser-preload .browser extension with package.json subpath imports Use the imports field in desktop-client/package.json with conditional resolution (electron → empty stub, default → real implementation) to eliminate the last .browser file extension from the codebase. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Refactor connection imports to use @actual-app/core * Implement connection mock for desktop-client tests and update import path * [AI] Fix formatting and update imports after master merge Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Fix connection mock in TransactionsTable tests and use electron-renderer condition Wire up the manual connection mock for TransactionsTable tests since the __mocks__ directory was removed, and restore electron-renderer condition in loot-core package.json exports. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [autofix.ci] apply automated fixes * [AI] Remove redundant resolveExtensions from vite configs These arrays were identical to Vite's built-in default and served no purpose. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Remove remaining resolveExtensions from vite/vitest configs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Fix build failures: update browser-preload import path and condition - Change loot-core/shared/platform to @actual-app/core/shared/platform - Use electron-renderer condition for #browser-preload to match vite resolve Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Remove redundant resolveExtensions from api and loot-core desktop configs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Remove '*.browser.ts' extension and alias resolutions Removed the special '*.browser.ts' file extension and file resolutions via alias, preferring conditions. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
d8317c44b7 |
[AI] Migrate desktop-client to subpath imports (#7446)
* [AI] Migrate desktop-client to subpath imports Replace the `@desktop-client/*` path alias with Node.js subpath imports (`#*`) across packages/desktop-client: - Declare the full `imports` map in packages/desktop-client/package.json (bare index entries, root-level files, and per-subdirectory wildcards with explicit extension overrides where `.ts` and `.tsx` mix). - Update all source files to import from `#...` specifiers. - Drop the `@desktop-client` group from .oxfmtrc.json. - Enable `actual/prefer-subpath-imports` for desktop-client in .oxlintrc.json so future code keeps using the subpath form. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Drop legacy desktop-client aliases Remove the `@desktop-client/*` and `loot-core/*` path aliases from vite.config.ts and tsconfig.json now that every desktop-client source file imports via subpath imports / `@actual-app/core`. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Release notes * [AI] Use electron-renderer condition for renderer-only exports Desktop-client's Vite build used the `electron` resolve condition, which overlapped with loot-core exports where `electron` means the Node/main variant (e.g. `shared/platform.electron.ts` using `os`, `platform/server/asyncStorage/index.electron.ts` using `fs`). Once the `loot-core` Vite alias was removed, the renderer bundle started pulling those Node variants and crashed at runtime with `It.default.platform is not a function` inside `platform.electron.ts`. Introduce a distinct `electron-renderer` condition used only by desktop-client's Vite config, and rename the `electron` key to `electron-renderer` on the sole loot-core export whose `electron` branch is the Electron renderer variant (`#/./platform/client/connection`, the IPC `global.Actual.ipcConnect` file). Every other `electron`-conditioned export keeps its Node semantics and is still matched by loot-core's own `vite.desktop.config.ts` (`conditions: ['electron']`). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Drop .electron.* extensions from loot-core desktop resolver Now that every Node/main variant is selected via the `electron` subpath import condition in `packages/loot-core/package.json`, Vite's `resolveExtensions` list no longer needs the `.electron.js`, `.electron.ts`, `.electron.tsx` entries. Remove them to keep resolution explicit and avoid implicit extension picking. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Align desktop-client TS resolution with Vite - Set `customConditions: ["electron-renderer"]` in `packages/desktop-client/tsconfig.json` so TypeScript resolves conditional imports (notably `@actual-app/core/platform/client/connection`) to the same file Vite picks at runtime. Today the surfaces happen to match because both variants import from a shared `index-types.ts`, but the alignment prevents a latent drift bug. - Fix typo in the release note (`Standartise` -> `Standardise`). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
2295e6d464 |
[AI] Add electron conditions to loot-core platform/server exports (#7383)
* trim down some unused/unnecessary dependencies (#7350) * fix github actions inconsistencies * fix pinning of transitive deps in eslint-plugin * drop use of node-fetch in api * drop md5 dependency in favour of node:crypto * drop slash * drop unused top level packages * add note about node-polyfills warning * remove unused deps from desktop-client * drop pegjs types * note * drop node-jq * [Doc] More tour image (mostly) updates & a hotkey fix (#7328) * Fix keyboard shortcut Mac key for undo operations Updated keyboard shortcut instructions for Mac & make consistent. * Add files via upload * Fix undo shortcut from 'K' to 'Z' Updated keyboard shortcut for undo operation in payees guide. COFFEE! * Revise budget section for clarity and consistency Updated category descriptions and improved Markdown support details. * Add files via upload * Fix grammatical error in budget.md * Fix typo and clarify Markdown description in budget.md Corrected a typo in the documentation regarding the chevrons and clarified the description of rendered Markdown. * Fix spelling error in budget documentation Corrected the spelling of 'cheverons' to 'chevrons'. * Add files via upload * Remove redundant text in budget.md * Fix formatting issues in payees.md * count points script should fetch the release note from the PR directly (#7309) * get pr release note from PR, not top of master * note * [AI] Mobile: Post transaction today on global account lists (#7311) (#7322) * [AI] Mobile: pass today for Post transaction today on global account lists (#7311) All Accounts, On budget, and Off budget transaction lists now forward the today flag to schedule/post-transaction, matching single-account mobile and desktop behavior. Made-with: Cursor * [AI] Add release note for PR 7322 (#7311) Made-with: Cursor * [AI] Tighten release note wording for PR 7322 (imperative) Made-with: Cursor --------- Co-authored-by: Pranay Mac M1 <pranayseela@yahoo.com> --------- Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk> Co-authored-by: Pranay S <pranayritvik@gmail.com> Co-authored-by: Pranay Mac M1 <pranayseela@yahoo.com> Co-authored-by: youngcw <calebyoung94@gmail.com> * Implement Sankey report for spent and budgeted money (#7220) * Implement Sankey graph report * Add release notes * Update VRT screenshots Auto-generated by VRT workflow PR: #6068 * Remove local debug settings * [autofix.ci] apply automated fixes * Update VRT screenshots Auto-generated by VRT workflow PR: #6068 * Improve graphs from comments * Fix lints * coderabit fixes * Fix filtering and UI enhancements * remove pngs * Fix typecheck * Another type issue * Update VRT screenshots Auto-generated by VRT workflow PR: #6068 * Update VRT screenshots Auto-generated by VRT workflow PR: #6068 * Fix strict typing issues * Update report page Now better conforms with components from other reports, e.g. by reusing Header Makes it possible to display a period longer than one month. * Change view description order * Formatting and cleanup * Removed difference section, as it will be difficult to get a reliable view across months * Introduce the Timeframe param, similar to Spending report, to allow saving a Live sliding window. * Allow filtering just the last month * Fix linting errors * Remove all information about income * Remove debugging statement * Sort categories and subcategories by amount * Move compact mode to spreadsheet to fix Card view more easily * Update tests file * Add release notes * Rename release notes to match PR# * Fix autofix.ci issues * Update packages/desktop-client/e2e/sankey.test.ts Enable experimental feature fall all tests, pr. coderabbit recommendation Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Add sankey-card to isWidgetType * Gate Sankey routes to prevent direct URL bypass * Fix typo * Change node transformation to work by key instead of name, to remove risk of duplicate issues Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Prevent false-positive pass in month-change test. * Translate mode to a proper label * Fix message for empty data * Enabled LoadingIndicator until data is ready * Change card default mode * More robust filtering * Fixed issue with budgeted spreadsheet not using 'end' date * Allow copying SankeyCard to dashboard * Fix typing and linting issues * Remove e2e tests I cannot currently get them to pass, because I dont fully understand playwright and how they are supposed to work. I can see that they don't exist for other reports. We can add them later if required. * Remove unecessary sankey reference * Refactor spreadsheet * Remove dead code from SankeyGraph * Collect to Other if too many subcategories * Edit wrong comment * Linting and typechecking * Show remaining amount to budget * Hide description on narrow device * Add visual clue if 'To budget' is larger than 'Budgeted' and would extend below the edge of the graph * Add colors to the links * Fix report card showing subcategories instead of main categories * Add tooltip info to Other on SankeyCard * Create globalOther flag and implement greedy category reduction algorithm * Allow user to select between Global or Per category Other * Allow user to choose number of subcategories to show * Allow user to select how subcategories are sorted * Fix budget filtering * [autofix.ci] apply automated fixes * Condense sorting and Other-grouping to one option * Implement Sort as budget option * Dynamically adjust topN based on SankeyCard height * Remove old feature flags from previous PR --------- Co-authored-by: andrewhumble <43395285+andrewhumble@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: youngcw <calebyoung94@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Fix yarn generate:icons command (#7281) * fix icon templates with `module.exports` to `export default` * Add `@svgr/babel-plugin-add-jsx-attribute` to dependencies * Run `yarn generate:icons`, and set prettier singleQuote to reduce changes * Add release note * Add temporary fix for `SvgChartArea` * Add `ChartArea` svg from the existing tsx * CI rerun * Standardise ledger scrolling when using keyboard shortcuts (#7283) * Standardise table keyboard navigation by preventing browser scroll with arrow keys * Add release note * Apply the preventDefault() in specific cases so that it is not applied to default --------- Co-authored-by: youngcw <calebyoung94@gmail.com> * Fix updateTransaction corrupting split parents with partial updates (#7242) * [AI] Fix updateTransaction corrupting split parents with partial updates When `api.updateTransaction(id, { notes: '...' })` is called on a split parent, the `updateTransaction` helper replaces the parent with the sparse update object (`{ id, notes }`) instead of merging it with the existing transaction data. This causes `recalculateSplit` to see `amount` as `undefined` (→ 0), which doesn't match the children's total and sets a `SplitTransactionError` on the parent. `makeChild` also inherits undefined `account`, `date`, and `cleared` values, potentially creating broken child rows. Fix: merge the incoming partial fields (`{ ...trans, ...transaction }`) so all existing properties are preserved. Add a test that performs a notes-only update on a split parent and asserts no error is set and the amount stays intact. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * [AI] Add release notes for PR #7242 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Address review feedback: remove verbose comment and simplify release note Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: L. Warren Thompson <lwarrenthompson@Warren-MBP.local> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * [AI] Add electron conditions to loot-core platform/server exports and fix imports - Add "electron" condition to platform/server exports (asyncStorage, connection, fetch, fs, sqlite) so they resolve to .electron.ts files when using the electron export condition - Remove broken ./client/platform export referencing non-existent files - Convert deep relative imports in electron files to subpath imports (#types/prefs, #server/errors, #server/mutators) https://claude.ai/code/session_01FPpKnozt42Mf79YHAT6ytM * [AI] Convert remaining relative imports to subpath imports in electron files - Convert ../fs, ../log, ../../exceptions to subpath imports (#platform/server/fs, #platform/server/log, #platform/exceptions) - Add electron-conditional entries to the imports field in package.json for all 5 platform/server modules with electron variants - Add resolve.conditions: ['electron'] to vite.desktop.config.ts so the electron condition is recognized during desktop builds https://claude.ai/code/session_01FPpKnozt42Mf79YHAT6ytM * Add release notes for PR #7383 * [AI] Fix API build and test failures from conditional exports - Add "api" condition to all 5 platform/server exports and imports entries so the API build resolves to .api.ts variants correctly - Add resolve.conditions and ssr.resolve.conditions: ['api'] to packages/api/vite.config.ts - Add explicit #platform/server/log and #platform/exceptions entries to the imports field (array fallback in #* wildcard doesn't work for directory modules) - Revert #platform/server/fs back to relative ../fs import in asyncStorage/index.electron.ts — subpath imports for platform modules with electron variants don't work in vitest because the test runner doesn't propagate resolve.conditions to Node's import resolution https://claude.ai/code/session_01FPpKnozt42Mf79YHAT6ytM * fix: apply CodeRabbit auto-fixes Fixed 2 file(s) based on 2 unresolved review comments. Co-authored-by: CodeRabbit <noreply@coderabbit.ai> * [autofix.ci] apply automated fixes * Enhance package.json and Vite configurations for Electron support; refactor imports to use new path aliases. Added new paths for server and shared modules, updated SSR settings, and improved test configurations for better module resolution. * [AI] Merge electron condition with default Vite conditions in vitest config Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> * [AI] Move @ts-strict-ignore comment to first line in reset.ts Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> --------- Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk> Co-authored-by: Juulz <julesmcn@gmail.com> Co-authored-by: Pranay S <pranayritvik@gmail.com> Co-authored-by: Pranay Mac M1 <pranayseela@yahoo.com> Co-authored-by: youngcw <calebyoung94@gmail.com> Co-authored-by: Emil Tveden Bjerglund <emilbp@gmail.com> Co-authored-by: andrewhumble <43395285+andrewhumble@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: James Skinner <56730344+JSkinnerUK@users.noreply.github.com> Co-authored-by: L. Warren Thompson <warren.thompson@zuirail.com> Co-authored-by: L. Warren Thompson <lwarrenthompson@Warren-MBP.local> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: CodeRabbit <noreply@coderabbit.ai> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> |
||
|
|
edc0242203 |
[AI] Fix CLI accounts list: compute balances, hide closed, sort by group (#7378)
* [AI] Fix accounts list: compute balances, hide closed, sort by budget group - Replace empty `balance_current` (bank-sync field) with computed `balance` from transaction history via `getAccountBalance` - Filter out closed accounts by default; add `--include-closed` flag - Stable-sort on-budget accounts before off-budget - Add `balance_current` to AMOUNT_FIELDS for table/csv formatting - Update docs and tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Extract duplicate isRecord type guard to shared utils Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * [AI] Add types condition to api package exports for tsc resolution Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update packages/cli/src/commands/query.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * [AI] Add balance_available/balance_limit to AMOUNT_FIELDS, validate query result.data Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> |
||
|
|
5eaf0be744 |
Bump vite from 8.0.0 to 8.0.5 (#7398)
* Bump vite from 8.0.0 to 8.0.5 Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0 to 8.0.5. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v8.0.5/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 8.0.5 dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> * note --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk> |
||
|
|
b03080b246 |
trim down some unused/unnecessary dependencies (#7350)
* fix github actions inconsistencies * fix pinning of transitive deps in eslint-plugin * drop use of node-fetch in api * drop md5 dependency in favour of node:crypto * drop slash * drop unused top level packages * add note about node-polyfills warning * remove unused deps from desktop-client * drop pegjs types * note * drop node-jq |
||
|
|
a12b971670 |
🔖 (26.4.0) (#7389)
* bump versions * Remove used release notes * add docs pages * Update check-spelling metadata * bump cli * change release date --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> |
||
|
|
a43b6f5c47 |
[AI] Experimental CLI tool for Actual (#7208)
* [AI] Add @actual-app/cli package New CLI tool wrapping the full @actual-app/api surface for interacting with Actual Budget from the command line. Connects to a sync server and supports all CRUD operations across accounts, budgets, categories, transactions, payees, tags, rules, schedules, and AQL queries. * Refactor CLI options: replace `--quiet` with `--verbose` for improved message control. Update related configurations and tests to reflect this change. Adjust build command in workflow for consistency. * Refactor tests: streamline imports in connection and accounts test files for improved clarity and consistency. Remove dynamic imports in favor of static imports. * Enhance package.json: Add exports configuration for module resolution and publish settings. This includes specifying types and default files for better compatibility and clarity in package usage. * Update package.json exports configuration to support environment-specific module resolution. Added 'development' and 'default' entries for improved clarity in file usage. * Enhance CLI functionality: Update configuration loading to support additional search places for config files. Refactor error handling in command options to improve validation and user feedback. Introduce new utility functions for parsing boolean flags and update related commands to utilize these functions. Add comprehensive tests for new utility functions to ensure reliability. * Update CLI TypeScript configuration to include Vitest globals and streamline test imports across multiple test files for improved clarity and consistency. * Update CLI dependencies and build workflow - Upgrade Vite to version 8.0.0 and Vitest to version 4.1.0 in package.json. - Add rollup-plugin-visualizer for bundle analysis. - Modify build workflow to prepare and upload CLI bundle stats. - Update size comparison workflow to include CLI stats. - Remove obsolete vitest.config.ts file as its configuration is now integrated into vite.config.ts. * Enhance size comparison workflow to include CLI build checks and artifact downloads - Added steps to wait for CLI build success in both base and PR workflows. - Included downloading of CLI build artifacts for comparison between base and PR branches. - Updated failure reporting to account for CLI build status. * Update documentation to replace "CLI tool" with "Server CLI" for consistency across multiple files. This change clarifies the distinction between the command-line interface for the Actual Budget application and the sync-server CLI tool. * Refactor configuration to replace "budgetId" with "syncId" across CLI and documentation * Enhance configuration validation by adding support for 'ACTUAL_ENCRYPTION_PASSWORD' and implementing a new validation function for config file content. Update documentation to clarify error output format for the CLI tool. * Enhance configuration tests to include 'encryptionPassword' checks for CLI options and environment variables, ensuring proper priority handling in the configuration resolution process. * Update nightly versioning script to use yarn * Align versions --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
beee16bc8c |
⬆️ march dependency updates (#7222)
* @types/node (^22.19.10 → ^22.19.15) * baseline-browser-mapping (^2.9.19 → ^2.10.0) * eslint (^9.39.2 → ^9.39.3) * lage (^2.14.17 → ^2.14.19) * lint-staged (^16.2.7 → ^16.3.2) * minimatch (^10.1.2 → ^10.2.4) * oxlint (^1.47.0 → ^1.51.0) * rollup-plugin-visualizer (^6.0.5 → ^6.0.11) * @chromatic-com/storybook (^5.0.0 → ^5.0.1) * @storybook/addon-a11y (^10.2.7 → ^10.2.16) * @storybook/addon-docs (^10.2.7 → ^10.2.16) * @storybook/react-vite (^10.2.7 → ^10.2.16) * eslint-plugin-storybook (^10.2.7 → ^10.2.16) * storybook (^10.2.7 → ^10.2.16) * @codemirror/autocomplete (^6.20.0 → ^6.20.1) * @codemirror/lang-javascript (^6.2.4 → ^6.2.5) * @codemirror/language (^6.12.1 → ^6.12.2) * @rolldown/plugin-babel (~0.1.7 → ~0.1.8) * @swc/core (^1.15.11 → ^1.15.18) * @swc/helpers (^0.5.18 → ^0.5.19) * @tanstack/react-query (^5.90.20 → ^5.90.21) * @uiw/react-codemirror (^4.25.4 → ^4.25.7) * hyperformula (^3.1.1 → ^3.2.0) * i18next (^25.8.4 → ^25.8.14) * i18next-parser (^9.3.0 → ^9.4.0) * react-i18next (^16.5.4 → ^16.5.6) * react-virtualized-auto-sizer (^2.0.2 → ^2.0.3) * fs-extra (^11.3.3 → ^11.3.4) * @r74tech/docusaurus-plugin-panzoom (^2.4.0 → ^2.4.2) * lru-cache (^11.2.5 → ^11.2.6) * nodemon (^3.1.11 → ^3.1.14) * eslint-plugin-perfectionist (^4.15.1 → ^5.6.0) * downshift (9.0.10 → 9.3.2) * react-router (7.13.0 → 7.13.1) * @easyops-cn/docusaurus-search-local (^0.52.3 → ^0.55.1) * peggy (5.0.6 → 5.1.0) * @types/supertest (^6.0.3 → ^7.2.0) * note |
||
|
|
6d9b1a1d72 |
Duplicate reimport fix in ui and API (#6926)
* add options to override reimportDeleted * doc and default in ui to false * pr note * period * wording * [autofix.ci] apply automated fixes * docs clarity * actually test default behavior * Update upcoming-release-notes/6926.md Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv> * use new ImportTransactionOpts type for consistency * Release note wording Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * [autofix.ci] apply automated fixes * [autofix.ci] apply automated fixes (attempt 2/3) --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |
||
|
|
a4eb17eff2 |
Upgrade to Vite 8 (#7184)
* Upgrade to Vite 8 * Add release notes * PR feedback * [autofix.ci] apply automated fixes * PR feedback * fix: inject process.env * Restore deleted release note * Clean up and typecheck * Fix dev server * Fix type error * Fix tests * PR feedback --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> |
||
|
|
8a3db77cff | [AI] api: simplify bundling by removing loot-core type inlining (#7209) | ||
|
|
f5a62627f0 |
[AI] Remove @actual-app/crdt Vite aliases and redundant config (#7195)
* [AI] Remove @actual-app/crdt Vite aliases and redundant config * Release notes * Enhance CRDT package configuration and clean up Vite settings * Added `publishConfig` to `crdt/package.json` to specify exports for types and default files. * Removed unused `crdtDir` references from `vite.config.ts` and `vite.desktop.config.ts` to streamline configuration. |
||
|
|
6c150cf28a |
[AI] Publish loot-core (@actual-app/core) nightly first in workflow (#7200)
* [AI] Publish loot-core (@actual-app/core) nightly first in workflow * [autofix.ci] apply automated fixes * Refactor imports and update configuration - Updated .oxfmtrc.json to change "parent" to ["parent", "subpath"]. - Removed unnecessary blank lines in various TypeScript files to improve code readability. - Adjusted import order in reports and rules files for consistency. * Add workflow steps to pack and publish the core package nightly * Remove nightly tag from npm publish command in workflow for core package * Update post-build script comment to reflect correct workspace command for loot-core declarations --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> |
||
|
|
9c61cfc145 |
[AI] Switch typecheck from tsc to tsgo and fix Menu type narrowing (#7183)
* [AI] Switch typecheck from tsc to tsgo and fix Menu type narrowing * [autofix.ci] apply automated fixes * Add .gitignore for dist directory, update typecheck script in package.json to use -b flag, and remove noEmit option from tsconfig.json files in ci-actions and desktop-electron packages. Introduce typesVersions in loot-core package.json for improved type handling. * Refactor SelectedTransactionsButton to improve type safety and readability. Updated items prop to use spread operator for conditional rendering of menu items, ensuring proper type annotations with MenuItem. This change enhances the clarity of the component's structure and maintains TypeScript compliance. * Update tsconfig.json in desktop-electron package to maintain consistent formatting for plugins section. No functional changes made. * [autofix.ci] apply automated fixes * Update package.json and yarn.lock to add TypeScript 5.8.0 dependency. Adjust typesVersions in loot-core package.json for improved type handling. Enhance tsconfig.json in sync-server package to enable strictFunctionTypes for better type safety. * Enhance tsconfig.json in ci-actions package by adding composite option for improved project references and build performance. * [AI] Revert typescript to 5.9.3 for ts-node compatibility Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> * [AI] Update yarn.lock after TypeScript version change Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> * Refactor Menu component for improved type safety and readability. Updated type assertions for Menu.line and Menu.label, simplified type checks in filtering and selection logic, and enhanced conditional rendering of menu items. This change ensures better TypeScript compliance and maintains clarity in the component's structure. * Refactor Select and OpenIdForm components to improve type safety and simplify logic. Updated item mapping to handle Menu.line more effectively, enhancing clarity in selection processes. Adjusted SelectedTransactionsButton to streamline item creation and improve readability. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> |
||
|
|
e968213977 |
Use TypeScript project references for incremental builds (#7180)
* [AI] Fix duplicate typechecking by consolidating into lage Previously `yarn typecheck` ran: 1. `tsc -b` (type-checks all packages via project references) 2. `tsc -p tsconfig.root.json --noEmit` (checks root bin/*.ts) 3. `lage typecheck` (runs `tsc --noEmit` per package - duplicate!) Now it runs: 1. `tsc -p tsconfig.root.json --noEmit` (checks root bin/*.ts) 2. `lage typecheck` (handles everything via dependency ordering) Changes: - Remove `tsc -b` from root typecheck script - Add `dependsOn: ["^typecheck"]` to lage config for correct ordering - Change per-package typecheck from `tsc --noEmit` to `tsc -b` so declarations are emitted for dependent packages https://claude.ai/code/session_01P7mtAHphD6f1FsnQRwWBaW * Add release notes for PR #7180 --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> |
||
|
|
3a22f1a153 |
refactor(api): fix cyclic dependencies (#6809)
* refactor(api): defineConfig vitest, api-helpers, drop vite.api build - Wrap api vitest.config with defineConfig for typing/IDE - Add loot-core api-helpers, use in YNAB4/YNAB5 importers - Remove vite.api.config, build-api, injected.js; simplify api package * refactor(api): update package structure and build scripts - Change main entry point and types definition paths in package.json to reflect new structure. - Simplify build script by removing migration and default database copy commands. - Adjust tsconfig.dist.json to maintain declaration directory. - Add typings for external modules in a new typings.ts file. - Update comments in schedules.ts to improve clarity and maintainability. * chore(api): update dependencies and build configuration - Replace tsc-alias with rollup-plugin-visualizer in package.json. - Update build script to use vite for building the API package. - Add vite configuration file for improved build process and visualization. - Adjust tsconfig.dist.json to exclude additional configuration files from the build. * fix(api): update visualizer output path in vite configuration - Change the output filename for the visualizer plugin from 'dist/stats.json' to 'app/stats.json' to align with the new directory structure. * refactor(api): streamline Vite configuration and remove vitest.config.ts - Remove vitest.config.ts as its configuration is now integrated into vite.config.ts. - Update vite.config.ts to include sourcemap generation and adjust CRDT path resolution. - Modify vitest.setup.ts to correct the import path for the CRDT proto file. * feat(api): enhance build scripts and add file system utilities - Update build scripts in package.json to include separate commands for building node, migrations, and default database. - Introduce a new file system utility module in loot-core to handle file operations such as reading, writing, and directory management. - Implement error handling and logging for file operations to improve robustness. * Refactor typecheck script in api package and enhance api-helpers with new schedule and rule update functions. The typecheck command was simplified by removing the strict check, and new API methods for creating schedules and updating rules were added to improve functionality. * Refactor API integration in loot-core by removing api-helpers and directly invoking handlers. Update typecheck script in api package to include strict checks, and refine TypeScript configurations across multiple packages for improved type safety and build processes. * Refactor imports and enhance code readability across multiple files in loot-core. Simplified import statements in the API and adjusted formatting in YNAB importers for consistency. Updated type annotations to improve type safety and maintainability. * Refactor handler invocation in YNAB importers to use the new send function from main-app. This change improves code consistency and readability by standardizing the method of invoking handlers across different modules. * Refactor schedule configuration in loot-core to enhance type safety by introducing a new ScheduleRuleOptions type. This change improves the clarity of the recurring schedule configuration and ensures better type checking for frequency and interval properties. * Update TypeScript configuration in api package to include path mapping for loot-core. This change enhances module resolution and improves type safety by allowing direct imports from the loot-core source directory. * Update TypeScript configuration in api package to reposition the typescript-strict-plugin entry. This change improves the organization of the tsconfig.json file while maintaining the existing path mapping for loot-core, ensuring consistent type checking across the project. * Update TypeScript configurations across multiple packages to enable noEmit option. This change enhances build processes by preventing unnecessary output files during compilation. Additionally, remove the obsolete tsconfig.api.json file from loot-core to streamline project structure. * Update TypeScript configuration in sync-server package to enable noEmit option. This change allows for the generation of output files during compilation, facilitating the build process. * Update api package configuration to streamline build process and enhance type safety. Removed unnecessary build scripts, integrated vite-plugin-dts for type declaration generation, and added migration and default database copying functionality. Adjusted vitest setup to comment out CRDT proto file import for improved test isolation. * Update TypeScript configurations in desktop-client and desktop-electron packages to enable noEmit option, allowing for output file generation during compilation. Additionally, add ts-strict-ignore comments in YNAB importers to suppress strict type checking, improving compatibility with embedded API usage. * Refactor api package configuration to update type declaration paths and enhance build process. Changed type definitions reference in package.json, streamlined tsconfig.json exclusions, and added functionality to copy inlined types during the build. Removed obsolete vitest setup file for improved test isolation. * Revert to solution without types * Update TypeScript configuration in API package to use ES2022 module and bundler resolution. This change enhances compatibility with modern JavaScript features and improves the build process. * Update yarn.lock and API package to enhance TypeScript build process and add new dependencies * Refactor inline-loot-core-types script to streamline TypeScript declaration handling and improve output organization. Remove legacy code and directly copy loot-core declaration tree, updating index.d.ts to reference local imports. * Add internal export to API and enhance Vite configuration for migration handling * Update Vite configuration in API package to target Node 18, enhancing compatibility with the latest Node features. * Enhance inline-loot-core-types script to improve TypeScript declaration handling by separating source and typings directories. Update the copy process to include emitted typings, ensuring no declarations are dropped and maintaining better organization of loot-core types. * Enhance migration handling by allowing both .sql and .js files to be copied during the migration process. Refactor file system operations in loot-core to improve error handling and streamline file management, including new methods for reading, writing, and removing files and directories. * Refactor rootPath determination in Electron file system module by removing legacy case for 'bundle.api.js'. This simplifies the path management for the Electron app. * Update API tests to mock file system paths for migration handling and change Vite configuration to target Node 20 for improved compatibility. * Add promise-retry dependency to loot-core package and update yarn.lock * Fix lint * Refactor build script order in package.json for improved execution flow * Feedback: API changes for "internal" |
||
|
|
387c8fce16 |
[AI] Enable TypeScript composite project references across monorepo (#7062)
* [AI] Enable TypeScript composite project references across monorepo - Add composite and declaration emit to all package tsconfigs - Wire root and per-package project references in dependency order - Replace cross-package include-based typing with referenced outputs - Fix api TS5055 by emitting declarations to decl-output - Add desktop-client alias for tests; fix oxlint import order in vite.config - Add UsersState.data null type and openDatabase return type for strict emit Co-authored-by: Cursor <cursoragent@cursor.com> * Remove obsolete TypeScript configuration for API and update build script to emit declarations directly to the output directory. This streamlines the build process and ensures compatibility with the new project structure. * Refactor TypeScript configuration in API package to remove obsolete decl-output directory and update build scripts. The changes streamline the build process by directing declaration outputs to the @types directory, ensuring better organization and compatibility with the new project structure. * Add TypeScript declaration emission for loot-core in desktop-electron build process * Refactor TypeScript configuration in API package to utilize composite references and streamline build scripts. Update include and exclude patterns for improved file management, ensuring better organization of declaration outputs and migration SQL files. * Refactor TypeScript configuration in loot-core and desktop-client packages to streamline path management and remove obsolete dependencies. Update paths in tsconfig.json files for better organization and compatibility, and adjust yarn.lock to reflect changes in workspace dependencies. * Update desktop-electron package to utilize loot-core as a workspace dependency. Adjust TypeScript import paths and tsconfig references for improved organization and compatibility across packages. * Enhance Vite configuration for desktop-client to support Electron-specific conditions and update loot-core package.json to include Electron as a platform for client connection. This improves compatibility for Electron builds. * Refactor TypeScript configuration across multiple packages to streamline path management. Update tsconfig.json files in root, api, and loot-core packages to improve import paths and maintain compatibility with internal typings. * Update package dependencies and Vite configuration across component-library and desktop-client. Add vite-tsconfig-paths to component-library and remove it from desktop-client. Refactor Storybook preview file to include a TODO for future refactoring. * Remove Node-specific path from loot-core package.json for client connection, streamlining platform configuration for Electron. * Remove loot-core as a workspace dependency from desktop-electron package.json * Update tsconfig.json to remove reference to desktop-client --------- Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
286d05d187 |
[AI] Move ImportTransactionsOpts from api package to loot-core (#7053)
Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
f9e09ca59b |
🔖 (26.3.0) (#7097)
* 🔖 (26.3.0) * Remove used release notes * Add release notes for PR #7097 * Remove used release notes * Remove used release notes * Add release notes for version 26.3.0 * Add new terms to spelling expectation list * Fix spelling and capitalization in release notes Corrected spelling of 'reorganisation' to 'reorganization' and updated 'coderabbit' to 'CodeRabbit' for consistency. * Update patterns.txt to allowlist 'CodeRabbit' Add 'CodeRabbit' to allowlist of proper nouns. * Clarify chart theming support in release notes Updated the release notes to specify bar/pie chart theming support and added details about theme variables for customization. * Remove 'CodeRabbit' from spelling expectations * Refactor release notes and improve formatting Reorganize release notes for clarity and update content. * Create 2026-03-02-release-26-3-0.md * Change release date to 2026-03-02 Updated the release date for version 26.3.0. * Update release notes for version 26.3.0 --------- Co-authored-by: jfdoming <9922514+jfdoming@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com> |
||
|
|
032d10ac42 |
[AI] Fix API build output path (dist/index.js instead of dist/api/index.js) (#7084)
* [AI] Fix API build output path (dist/index.js instead of dist/api/index.js) - Set rootDir in packages/api/tsconfig.json so output is under dist/ not dist/api/ - Remove loot-core pegjs.ts from include; add local typings/pegjs.d.ts - Use mkdir -p in build:migrations for idempotent build - Exclude **/@types/** so declaration output does not conflict with input Made-with: Cursor * Update TypeScript configuration in api package to refine exclude patterns |
||
|
|
0b361e45b4 |
[AI] Bump version to 26.2.1 (#7052)
Co-authored-by: Cursor <cursoragent@cursor.com> |