[AI] Add no-extraneous-dependencies lint rule (#7480)

* [AI] Add no-extraneous-dependencies lint rule to prevent transitive dependency usage

Closes #7479. Adds a custom ESLint rule that flags imports of packages not
explicitly listed in the workspace's dependencies or devDependencies. Also
fixes all existing violations by adding missing deps and removes unused
deps (@reduxjs/toolkit, @rschedule/json-tools) from loot-core.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* [AI] Fix builtin subpath detection and improve cache in no-extraneous-dependencies

Fix false positives for Node.js builtin subpaths (fs/promises, path/posix)
by checking the package name portion against builtins. Also cache all
visited directories during walk-up, not just the starting directory.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Release notes

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matiss Janis Aboltins
2026-04-12 17:11:26 +01:00
committed by GitHub
parent d2475ebb02
commit 78b1fc2713
11 changed files with 491 additions and 15 deletions

View File

@@ -37,6 +37,7 @@
"actual/no-anchor-tag": "error",
"actual/no-react-default-import": "error",
"actual/prefer-subpath-imports": "error",
"actual/no-extraneous-dependencies": "error",
// JSX A11y rules
"jsx-a11y/no-autofocus": [

View File

@@ -85,7 +85,8 @@
"p-limit": "^7.3.0",
"prompts": "^2.4.2",
"ts-node": "^10.9.2",
"typescript": "^5.9.3"
"typescript": "^5.9.3",
"vitest": "^4.1.0"
},
"resolutions": {
"adm-zip": "patch:adm-zip@npm%3A0.5.16#~/.yarn/patches/adm-zip-npm-0.5.16-4556fea098.patch",

View File

@@ -8,6 +8,7 @@
"typecheck": "tsgo -b"
},
"devDependencies": {
"@octokit/rest": "^22.0.1",
"@typescript/native-preview": "^7.0.0-dev.20260309.1",
"extensionless": "^2.0.6",
"gray-matter": "^4.0.3",

View File

@@ -121,6 +121,8 @@
"@juggle/resize-observer": "^3.4.0",
"@lezer/highlight": "^1.2.3",
"@playwright/test": "1.58.2",
"@react-aria/interactions": "^3.27.0",
"@reduxjs/toolkit": "^2.11.2",
"@rolldown/plugin-babel": "~0.1.8",
"@rollup/plugin-inject": "^5.0.5",
"@swc/core": "^1.15.18",
@@ -141,19 +143,23 @@
"@use-gesture/react": "^10.3.1",
"@vitejs/plugin-basic-ssl": "^2.2.0",
"@vitejs/plugin-react": "^6.0.0",
"absurd-sql": "0.0.54",
"auto-text-size": "^0.2.3",
"babel-plugin-react-compiler": "^1.0.0",
"cmdk": "^1.1.1",
"cross-env": "^10.1.0",
"date-fns": "^4.1.0",
"downshift": "9.3.2",
"html-to-image": "^1.11.13",
"hyperformula": "^3.2.0",
"i18next": "^25.8.14",
"i18next-parser": "^9.4.0",
"i18next-resources-to-backend": "^1.2.1",
"jsdom": "^27.4.0",
"lodash": "^4.18.1",
"lru-cache": "^11.2.6",
"mdast-util-newline-to-break": "^2.0.0",
"memoize-one": "^6.0.0",
"pikaday": "1.8.2",
"promise-retry": "^2.0.1",
"re-resizable": "^6.11.2",
@@ -178,6 +184,7 @@
"recharts": "^3.7.0",
"rehype-external-links": "^3.0.0",
"remark-gfm": "^4.0.1",
"rolldown": "^1.0.0-rc.12",
"rollup-plugin-visualizer": "^6.0.11",
"sass": "^1.97.3",
"typescript-strict-plugin": "^2.4.4",

View File

@@ -22,7 +22,9 @@
},
"devDependencies": {
"@actual-app/core": "workspace:*",
"@actual-app/web": "workspace:*",
"@electron/notarize": "3.1.1",
"@electron/rebuild": "^4.0.3",
"@playwright/test": "1.58.2",
"@types/copyfiles": "^2",
"@types/fs-extra": "^11",

View File

@@ -13,5 +13,6 @@ module.exports = {
'no-anchor-tag': require('./rules/no-anchor-tag'),
'no-react-default-import': require('./rules/no-react-default-import'),
'prefer-subpath-imports': require('./rules/prefer-subpath-imports'),
'no-extraneous-dependencies': require('./rules/no-extraneous-dependencies'),
},
};

View File

@@ -0,0 +1,94 @@
import { runClassic } from 'eslint-vitest-rule-tester';
import * as rule from '../no-extraneous-dependencies';
void runClassic(
'no-extraneous-dependencies',
rule,
{
valid: [
// Relative imports are always allowed
`import foo from './foo'`,
`import foo from '../foo'`,
// Subpath imports are always allowed
`import foo from '#utils/foo'`,
// Node.js built-ins are allowed (including subpaths)
`import fs from 'fs'`,
`import path from 'path'`,
`import crypto from 'node:crypto'`,
`import { readFile } from 'fs/promises'`,
`import posix from 'path/posix'`,
// Virtual modules are allowed
`import { registerSW } from 'virtual:pwa-register'`,
// require() with relative path
`const foo = require('./foo')`,
],
invalid: [
{
code: `import foo from 'not-a-real-package'`,
errors: [
{
messageId: 'extraneous',
data: { packageName: 'not-a-real-package' },
},
],
},
{
code: `import foo from '@not-real/package'`,
errors: [
{
messageId: 'extraneous',
data: { packageName: '@not-real/package' },
},
],
},
{
code: `import foo from '@not-real/package/deep/path'`,
errors: [
{
messageId: 'extraneous',
data: { packageName: '@not-real/package' },
},
],
},
{
code: `export { foo } from 'not-a-real-package'`,
errors: [
{
messageId: 'extraneous',
data: { packageName: 'not-a-real-package' },
},
],
},
{
code: `export * from 'not-a-real-package'`,
errors: [
{
messageId: 'extraneous',
data: { packageName: 'not-a-real-package' },
},
],
},
{
code: `const foo = require('not-a-real-package')`,
errors: [
{
messageId: 'extraneous',
data: { packageName: 'not-a-real-package' },
},
],
},
],
},
{
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
},
},
);

View File

@@ -0,0 +1,136 @@
const fs = require('fs');
const path = require('path');
const Module = require('module');
const builtins = new Set(Module.builtinModules.flatMap(m => [m, `node:${m}`]));
// Cache: directory path → { name, deps } | null
const pkgCache = new Map();
function getPackageName(source) {
if (source.startsWith('@')) {
// @scope/pkg or @scope/pkg/deep → @scope/pkg
const parts = source.split('/');
return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : null;
}
// pkg or pkg/deep → pkg
return source.split('/')[0];
}
function findPackageJson(dir) {
if (pkgCache.has(dir)) return pkgCache.get(dir);
const visited = [dir];
let current = dir;
let result = null;
while (true) {
const pkgPath = path.join(current, 'package.json');
try {
const content = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
if (content.name) {
result = {
name: content.name,
deps: new Set([
...Object.keys(content.dependencies || {}),
...Object.keys(content.devDependencies || {}),
]),
};
break;
}
} catch {
// keep walking
}
const parent = path.dirname(current);
if (parent === current) break;
current = parent;
visited.push(current);
}
for (const d of visited) {
pkgCache.set(d, result);
}
return result;
}
function isExternalImport(source) {
if (
source.startsWith('.') ||
source.startsWith('#') ||
source.startsWith('virtual:')
) {
return false;
}
// Check builtins using the package name to handle subpaths like fs/promises
const pkgName = getPackageName(source);
if (pkgName && builtins.has(pkgName)) return false;
return true;
}
/** @type {import('eslint').Rule.RuleModule} */
module.exports = {
meta: {
type: 'problem',
docs: {
description:
'Disallow importing packages not listed in dependencies or devDependencies',
},
schema: [],
messages: {
extraneous:
'"{{packageName}}" is not listed in dependencies or devDependencies. Add it to the package.json of this workspace.',
},
},
create(context) {
const filename = context.getFilename();
const dir = path.dirname(filename);
const pkg = findPackageJson(dir);
if (!pkg) return {};
function check(node, source) {
if (!source || typeof source.value !== 'string') return;
const importSource = source.value;
if (!isExternalImport(importSource)) return;
const packageName = getPackageName(importSource);
if (!packageName) return;
// Allow self-references
if (packageName === pkg.name) return;
if (!pkg.deps.has(packageName)) {
context.report({
node: source,
messageId: 'extraneous',
data: { packageName },
});
}
}
return {
ImportDeclaration(node) {
check(node, node.source);
},
ExportNamedDeclaration(node) {
check(node, node.source);
},
ExportAllDeclaration(node) {
check(node, node.source);
},
CallExpression(node) {
if (
node.callee.type === 'Identifier' &&
node.callee.name === 'require' &&
node.arguments.length === 1 &&
node.arguments[0].type === 'Literal' &&
typeof node.arguments[0].value === 'string'
) {
check(node, node.arguments[0]);
}
},
};
},
};

View File

@@ -158,9 +158,7 @@
},
"dependencies": {
"@jlongster/sql.js": "^1.6.7",
"@reduxjs/toolkit": "^2.11.2",
"@rschedule/core": "^1.5.0",
"@rschedule/json-tools": "^1.5.0",
"@rschedule/standard-date-adapter": "^1.5.0",
"absurd-sql": "0.0.54",
"adm-zip": "^0.5.16",
@@ -168,14 +166,18 @@
"csv-parse": "^6.1.0",
"csv-stringify": "^6.6.0",
"date-fns": "^4.1.0",
"google-protobuf": "^3.21.4",
"handlebars": "^4.7.9",
"hyperformula": "^3.2.0",
"lodash": "^4.18.1",
"lru-cache": "^11.2.6",
"memoize-one": "^6.0.0",
"mitt": "^3.0.1",
"promise-retry": "^2.0.1",
"typescript-strict-plugin": "^2.4.4",
"ua-parser-js": "^2.0.9",
"uuid": "^13.0.0"
"uuid": "^13.0.0",
"xml2js": "^0.6.2"
},
"devDependencies": {
"@actual-app/crdt": "workspace:*",

View File

@@ -0,0 +1,6 @@
---
category: Maintenance
authors: [MatissJanis]
---
Clean up installed dependencies

247
yarn.lock
View File

@@ -42,6 +42,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@actual-app/ci-actions@workspace:packages/ci-actions"
dependencies:
"@octokit/rest": "npm:^22.0.1"
"@typescript/native-preview": "npm:^7.0.0-dev.20260309.1"
extensionless: "npm:^2.0.6"
gray-matter: "npm:^4.0.3"
@@ -103,9 +104,7 @@ __metadata:
dependencies:
"@actual-app/crdt": "workspace:*"
"@jlongster/sql.js": "npm:^1.6.7"
"@reduxjs/toolkit": "npm:^2.11.2"
"@rschedule/core": "npm:^1.5.0"
"@rschedule/json-tools": "npm:^1.5.0"
"@rschedule/standard-date-adapter": "npm:^1.5.0"
"@swc/core": "npm:^1.15.18"
"@types/adm-zip": "npm:^0.5.7"
@@ -127,10 +126,13 @@ __metadata:
date-fns: "npm:^4.1.0"
fake-indexeddb: "npm:^6.2.5"
fast-check: "npm:4.5.3"
google-protobuf: "npm:^3.21.4"
handlebars: "npm:^4.7.9"
hyperformula: "npm:^3.2.0"
i18next: "npm:^25.8.14"
jest-diff: "npm:^30.2.0"
jsverify: "npm:^0.8.4"
lodash: "npm:^4.18.1"
lru-cache: "npm:^11.2.6"
memoize-one: "npm:^6.0.0"
mitt: "npm:^3.0.1"
@@ -151,6 +153,7 @@ __metadata:
vite-plugin-node-polyfills: "npm:^0.26.0"
vite-plugin-peggy-loader: "npm:^2.0.1"
vitest: "npm:^4.1.0"
xml2js: "npm:^0.6.2"
yargs: "npm:^18.0.0"
languageName: unknown
linkType: soft
@@ -242,6 +245,8 @@ __metadata:
"@juggle/resize-observer": "npm:^3.4.0"
"@lezer/highlight": "npm:^1.2.3"
"@playwright/test": "npm:1.58.2"
"@react-aria/interactions": "npm:^3.27.0"
"@reduxjs/toolkit": "npm:^2.11.2"
"@rolldown/plugin-babel": "npm:~0.1.8"
"@rollup/plugin-inject": "npm:^5.0.5"
"@swc/core": "npm:^1.15.18"
@@ -262,19 +267,23 @@ __metadata:
"@use-gesture/react": "npm:^10.3.1"
"@vitejs/plugin-basic-ssl": "npm:^2.2.0"
"@vitejs/plugin-react": "npm:^6.0.0"
absurd-sql: "npm:0.0.54"
auto-text-size: "npm:^0.2.3"
babel-plugin-react-compiler: "npm:^1.0.0"
cmdk: "npm:^1.1.1"
cross-env: "npm:^10.1.0"
date-fns: "npm:^4.1.0"
downshift: "npm:9.3.2"
html-to-image: "npm:^1.11.13"
hyperformula: "npm:^3.2.0"
i18next: "npm:^25.8.14"
i18next-parser: "npm:^9.4.0"
i18next-resources-to-backend: "npm:^1.2.1"
jsdom: "npm:^27.4.0"
lodash: "npm:^4.18.1"
lru-cache: "npm:^11.2.6"
mdast-util-newline-to-break: "npm:^2.0.0"
memoize-one: "npm:^6.0.0"
pikaday: "npm:1.8.2"
promise-retry: "npm:^2.0.1"
re-resizable: "npm:^6.11.2"
@@ -299,6 +308,7 @@ __metadata:
recharts: "npm:^3.7.0"
rehype-external-links: "npm:^3.0.0"
remark-gfm: "npm:^4.0.1"
rolldown: "npm:^1.0.0-rc.12"
rollup-plugin-visualizer: "npm:^6.0.11"
sass: "npm:^1.97.3"
typescript-strict-plugin: "npm:^2.4.4"
@@ -4140,6 +4150,16 @@ __metadata:
languageName: node
linkType: hard
"@emnapi/core@npm:1.9.2":
version: 1.9.2
resolution: "@emnapi/core@npm:1.9.2"
dependencies:
"@emnapi/wasi-threads": "npm:1.2.1"
tslib: "npm:^2.4.0"
checksum: 10/32084861f306b405f10f3ae13d1a49fa75650bdaaa40704892c397856815fe5d3781670d2662806d39c2d8a19bb62826dd7b870a79858f7be77500d9d0d3d91a
languageName: node
linkType: hard
"@emnapi/core@npm:^1.4.3":
version: 1.5.0
resolution: "@emnapi/core@npm:1.5.0"
@@ -4160,6 +4180,15 @@ __metadata:
languageName: node
linkType: hard
"@emnapi/runtime@npm:1.9.2":
version: 1.9.2
resolution: "@emnapi/runtime@npm:1.9.2"
dependencies:
tslib: "npm:^2.4.0"
checksum: 10/de123d6b7acdbe34bf997523be761e5ae6d8f9b3967b72e8e50ff7dd1791a2a0d2b9fb0d7d92230b0738502980ea6f947189b7c1f47814ff666515a55c6fff48
languageName: node
linkType: hard
"@emnapi/runtime@npm:^1.4.3":
version: 1.5.0
resolution: "@emnapi/runtime@npm:1.5.0"
@@ -4196,6 +4225,15 @@ __metadata:
languageName: node
linkType: hard
"@emnapi/wasi-threads@npm:1.2.1":
version: 1.2.1
resolution: "@emnapi/wasi-threads@npm:1.2.1"
dependencies:
tslib: "npm:^2.4.0"
checksum: 10/57cd4292be81c05d26aa886d68a9e4c449ff666e8503fed6463dfc6b64a4e4213f03c152d53296b7cda32840271e38cd33347332070658f01befeb9bf4e59f36
languageName: node
linkType: hard
"@emotion/babel-plugin@npm:^11.13.5":
version: 11.13.5
resolution: "@emotion/babel-plugin@npm:11.13.5"
@@ -5381,6 +5419,18 @@ __metadata:
languageName: node
linkType: hard
"@napi-rs/wasm-runtime@npm:^1.1.3":
version: 1.1.3
resolution: "@napi-rs/wasm-runtime@npm:1.1.3"
dependencies:
"@tybys/wasm-util": "npm:^0.10.1"
peerDependencies:
"@emnapi/core": ^1.7.1
"@emnapi/runtime": ^1.7.1
checksum: 10/a09f53dea7f5d11cbf4b4e3f10f726dd488b4a715f14f197dd619920d733e657261bb87d399628689dbe2b23b4353ddc122303d0583c4ef6cc4a5245367dfb2a
languageName: node
linkType: hard
"@neoconfetti/react@npm:^1.0.0":
version: 1.0.0
resolution: "@neoconfetti/react@npm:1.0.0"
@@ -5740,6 +5790,13 @@ __metadata:
languageName: node
linkType: hard
"@oxc-project/types@npm:=0.124.0":
version: 0.124.0
resolution: "@oxc-project/types@npm:0.124.0"
checksum: 10/d40ca0769b19b327b89fca30c9c224aace1b696e8b4f5adc2c67ee711e17401d532fdcfe49b8903916e8749ea67b572d3c470045279e27d26ac39af7bf1fc611
languageName: node
linkType: hard
"@oxfmt/binding-android-arm-eabi@npm:0.44.0":
version: 0.44.0
resolution: "@oxfmt/binding-android-arm-eabi@npm:0.44.0"
@@ -8429,6 +8486,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-android-arm64@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.15"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@rolldown/binding-android-arm64@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.9"
@@ -8443,6 +8507,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.15"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.9"
@@ -8457,6 +8528,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-darwin-x64@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.15"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@rolldown/binding-darwin-x64@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.9"
@@ -8471,6 +8549,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.15"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.9"
@@ -8485,6 +8570,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.15"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.9"
@@ -8499,6 +8591,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.15"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.9"
@@ -8513,6 +8612,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.15"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.9"
@@ -8527,6 +8633,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.15"
conditions: os=linux & cpu=ppc64 & libc=glibc
languageName: node
linkType: hard
"@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.9"
@@ -8541,6 +8654,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.15"
conditions: os=linux & cpu=s390x & libc=glibc
languageName: node
linkType: hard
"@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.9"
@@ -8555,6 +8675,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.15"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.9"
@@ -8569,6 +8696,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.15"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.9"
@@ -8583,6 +8717,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.15"
conditions: os=openharmony & cpu=arm64
languageName: node
linkType: hard
"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.9"
@@ -8599,6 +8740,17 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.15"
dependencies:
"@emnapi/core": "npm:1.9.2"
"@emnapi/runtime": "npm:1.9.2"
"@napi-rs/wasm-runtime": "npm:^1.1.3"
conditions: cpu=wasm32
languageName: node
linkType: hard
"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.9"
@@ -8615,6 +8767,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.15"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.9"
@@ -8629,6 +8788,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.15"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.9":
version: 1.0.0-rc.9
resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.9"
@@ -8659,6 +8825,13 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/pluginutils@npm:1.0.0-rc.15":
version: 1.0.0-rc.15
resolution: "@rolldown/pluginutils@npm:1.0.0-rc.15"
checksum: 10/528e6c4ebe43cc64daa1b068b23aac3df5de1aa152842f842c00d343dc4505603133f1f4e95c761551bca42fcf8506063d955c27d3b7ca748b6426d11d1e9fb5
languageName: node
linkType: hard
"@rolldown/pluginutils@npm:1.0.0-rc.7":
version: 1.0.0-rc.7
resolution: "@rolldown/pluginutils@npm:1.0.0-rc.7"
@@ -8928,15 +9101,6 @@ __metadata:
languageName: node
linkType: hard
"@rschedule/json-tools@npm:^1.5.0":
version: 1.5.0
resolution: "@rschedule/json-tools@npm:1.5.0"
peerDependencies:
"@rschedule/core": ^1.5.0
checksum: 10/aa9fa497f91bceb65983c9917fb0fde460d48cb21538859f482e00a0c677afa8ef5b5d7b4c614eceb5a32c542fc23fc105578cb37905f387d379c8e462a3c370
languageName: node
linkType: hard
"@rschedule/standard-date-adapter@npm:^1.5.0":
version: 1.5.0
resolution: "@rschedule/standard-date-adapter@npm:1.5.0"
@@ -11809,6 +11973,7 @@ __metadata:
prompts: "npm:^2.4.2"
ts-node: "npm:^10.9.2"
typescript: "npm:^5.9.3"
vitest: "npm:^4.1.0"
languageName: unknown
linkType: soft
@@ -15437,7 +15602,9 @@ __metadata:
dependencies:
"@actual-app/core": "workspace:*"
"@actual-app/sync-server": "workspace:*"
"@actual-app/web": "workspace:*"
"@electron/notarize": "npm:3.1.1"
"@electron/rebuild": "npm:^4.0.3"
"@playwright/test": "npm:1.58.2"
"@types/copyfiles": "npm:^2"
"@types/fs-extra": "npm:^11"
@@ -26359,6 +26526,64 @@ __metadata:
languageName: node
linkType: hard
"rolldown@npm:^1.0.0-rc.12":
version: 1.0.0-rc.15
resolution: "rolldown@npm:1.0.0-rc.15"
dependencies:
"@oxc-project/types": "npm:=0.124.0"
"@rolldown/binding-android-arm64": "npm:1.0.0-rc.15"
"@rolldown/binding-darwin-arm64": "npm:1.0.0-rc.15"
"@rolldown/binding-darwin-x64": "npm:1.0.0-rc.15"
"@rolldown/binding-freebsd-x64": "npm:1.0.0-rc.15"
"@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-rc.15"
"@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-rc.15"
"@rolldown/binding-linux-arm64-musl": "npm:1.0.0-rc.15"
"@rolldown/binding-linux-ppc64-gnu": "npm:1.0.0-rc.15"
"@rolldown/binding-linux-s390x-gnu": "npm:1.0.0-rc.15"
"@rolldown/binding-linux-x64-gnu": "npm:1.0.0-rc.15"
"@rolldown/binding-linux-x64-musl": "npm:1.0.0-rc.15"
"@rolldown/binding-openharmony-arm64": "npm:1.0.0-rc.15"
"@rolldown/binding-wasm32-wasi": "npm:1.0.0-rc.15"
"@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-rc.15"
"@rolldown/binding-win32-x64-msvc": "npm:1.0.0-rc.15"
"@rolldown/pluginutils": "npm:1.0.0-rc.15"
dependenciesMeta:
"@rolldown/binding-android-arm64":
optional: true
"@rolldown/binding-darwin-arm64":
optional: true
"@rolldown/binding-darwin-x64":
optional: true
"@rolldown/binding-freebsd-x64":
optional: true
"@rolldown/binding-linux-arm-gnueabihf":
optional: true
"@rolldown/binding-linux-arm64-gnu":
optional: true
"@rolldown/binding-linux-arm64-musl":
optional: true
"@rolldown/binding-linux-ppc64-gnu":
optional: true
"@rolldown/binding-linux-s390x-gnu":
optional: true
"@rolldown/binding-linux-x64-gnu":
optional: true
"@rolldown/binding-linux-x64-musl":
optional: true
"@rolldown/binding-openharmony-arm64":
optional: true
"@rolldown/binding-wasm32-wasi":
optional: true
"@rolldown/binding-win32-arm64-msvc":
optional: true
"@rolldown/binding-win32-x64-msvc":
optional: true
bin:
rolldown: bin/cli.mjs
checksum: 10/cc07a103297573690bad1469e96e282230f9eb1acc4e22bf3318294bf5b5221d475d1c0822be6fe4958c5618983cac70fb0155afe510ab51516a053564c9304a
languageName: node
linkType: hard
"rollup-plugin-visualizer@npm:^6.0.11":
version: 6.0.11
resolution: "rollup-plugin-visualizer@npm:6.0.11"