From 1243bfd3e894478b6e4b9fd6304c2ee7c93a9545 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 27 Oct 2025 05:02:13 -0400 Subject: [PATCH 01/41] wip --- .changeset/small-baboons-report.md | 5 ++++ package-lock.json | 39 ++++++++++++++++++++++++++---- package.json | 4 +-- src/lib/gitops_sync.task.ts | 4 +-- 4 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 .changeset/small-baboons-report.md diff --git a/.changeset/small-baboons-report.md b/.changeset/small-baboons-report.md new file mode 100644 index 00000000..5ac197bd --- /dev/null +++ b/.changeset/small-baboons-report.md @@ -0,0 +1,5 @@ +--- +'@ryanatkn/fuz_gitops': minor +--- + +upgrade belt diff --git a/package-lock.json b/package-lock.json index bea24b15..71b54171 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.35.1", + "@ryanatkn/belt": "^0.36.0", "@ryanatkn/eslint-config": "^0.8.0", "@ryanatkn/fuz": "^0.147.0", "@ryanatkn/gro": "^0.169.1", @@ -38,7 +38,7 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@ryanatkn/belt": "^0.35.1", + "@ryanatkn/belt": "^0.36.0", "@ryanatkn/fuz": "^0.147.0", "@ryanatkn/gro": "^0.169.1", "@ryanatkn/moss": "^0.36.2", @@ -1414,9 +1414,9 @@ ] }, "node_modules/@ryanatkn/belt": { - "version": "0.35.1", - "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.35.1.tgz", - "integrity": "sha512-xn/sDxJQ+IEjJEJe0Pfm/leIla+csKDxQoutBm7kMx7MDVu5EylogfPHd/RL5PkjKdUHwKHDiXbAQxlZKHOHaw==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.36.0.tgz", + "integrity": "sha512-vDrXo3Okyld8lF5GztLt+/hA/L1zobxOibXWcuzfJTcinQsmRp0VWGehPyAiasT1xasx4Vsbvs2BY8pS74b8Uw==", "dev": true, "license": "MIT", "engines": { @@ -1539,6 +1539,35 @@ } } }, + "node_modules/@ryanatkn/gro/node_modules/@ryanatkn/belt": { + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.35.1.tgz", + "integrity": "sha512-xn/sDxJQ+IEjJEJe0Pfm/leIla+csKDxQoutBm7kMx7MDVu5EylogfPHd/RL5PkjKdUHwKHDiXbAQxlZKHOHaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.15" + }, + "funding": { + "url": "https://www.ryanatkn.com/funding" + }, + "peerDependencies": { + "@types/node": "^24", + "esm-env": "^1.2.2", + "zod": "^4.0.14" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esm-env": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/@ryanatkn/moss": { "version": "0.36.2", "resolved": "https://registry.npmjs.org/@ryanatkn/moss/-/moss-0.36.2.tgz", diff --git a/package.json b/package.json index 0e2d9936..dde77d1f 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "node": ">=22.15" }, "peerDependencies": { - "@ryanatkn/belt": "^0.35.1", + "@ryanatkn/belt": "^0.36.0", "@ryanatkn/fuz": "^0.147.0", "@ryanatkn/gro": "^0.169.1", "@ryanatkn/moss": "^0.36.2", @@ -40,7 +40,7 @@ }, "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.35.1", + "@ryanatkn/belt": "^0.36.0", "@ryanatkn/eslint-config": "^0.8.0", "@ryanatkn/fuz": "^0.147.0", "@ryanatkn/gro": "^0.169.1", diff --git a/src/lib/gitops_sync.task.ts b/src/lib/gitops_sync.task.ts index 74dbb2d7..067d33b1 100644 --- a/src/lib/gitops_sync.task.ts +++ b/src/lib/gitops_sync.task.ts @@ -5,7 +5,7 @@ import {format_file} from '@ryanatkn/gro/format_file.js'; import {basename, resolve} from 'node:path'; import {print_path} from '@ryanatkn/gro/paths.js'; import {load_from_env} from '@ryanatkn/gro/env.js'; -import {embed_json} from '@ryanatkn/belt/json.js'; +import {json_embed} from '@ryanatkn/belt/json.js'; import {load_package_json} from '@ryanatkn/gro/package_json.js'; import {existsSync} from 'node:fs'; @@ -84,7 +84,7 @@ export const task: Task = { // generated by ${basename(import.meta.filename)} import type {Repo} from '${repo_specifier}'; - export const repos: Array = ${embed_json(repos, (s) => JSON.stringify(s, null, '\t'))}; + export const repos: Array = ${json_embed(repos, (s) => JSON.stringify(s, null, '\t'))}; `; // TODO think about possibly using the `gen` functionality in this task, not sure what the API design could look like const formatted = await format_file(contents, {filepath: outfile}); From 7b71ea2cad23352962eda047257ce63dbf058d38 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 27 Oct 2025 13:01:45 -0400 Subject: [PATCH 02/41] wip --- TODO_INDEXING.md | 179 +++++++++++++++++++++++++++ src/fixtures/check.test.ts | 4 +- src/lib/changeset_generator.test.ts | 2 +- src/lib/changeset_reader.test.ts | 4 +- src/lib/dependency_graph.test.ts | 2 +- src/lib/dependency_updater.test.ts | 4 +- src/lib/multi_repo_publisher.test.ts | 20 +-- src/lib/multi_repo_publisher.ts | 2 +- src/lib/npm_registry.test.ts | 12 +- src/lib/preflight_checks.ts | 4 +- src/lib/semver.test.ts | 4 +- src/lib/test_helpers.ts | 2 +- src/lib/version_utils.ts | 12 +- tsconfig.json | 1 + 14 files changed, 216 insertions(+), 36 deletions(-) create mode 100644 TODO_INDEXING.md diff --git a/TODO_INDEXING.md b/TODO_INDEXING.md new file mode 100644 index 00000000..613fd1c2 --- /dev/null +++ b/TODO_INDEXING.md @@ -0,0 +1,179 @@ +# TypeScript `noUncheckedIndexedAccess` Issues - Remaining Work + +Total TypeScript errors: 87 +- ✅ Fixed: 31 errors (safe-to-assert cases) +- ⚠️ Remaining: 31 errors (need proper handling) +- 📦 Other: 25 errors (Logger type mismatch, dependency issue) + +--- + +## ⚠️ UNSAFE - Needs Proper Handling (31 errors) + +### Regex Match Arrays (9 errors) - HIGH PRIORITY + +**src/lib/semver.ts:38-40** - Regex match capture groups (3 errors) +```typescript +const match = version.match(SEMVER_REGEX); +return { + major: parseInt(match[1], 10), // ❌ match[1] undefined if no match + minor: parseInt(match[2], 10), + patch: parseInt(match[3], 10), + prerelease: match[4], +}; +``` +**Fix**: Check `if (!match) throw ...;` before accessing indices + +**src/lib/semver.ts:81-82** - Prerelease part array access (2 errors) +```typescript +const a_part = a_parts[j]; +const b_part = b_parts[j]; +const a_is_numeric = /^\d+$/.test(a_part); // ❌ Could be undefined +const b_is_numeric = /^\d+$/.test(b_part); +``` +**Fix**: Check parts exist before testing + +**src/lib/semver.ts:86-87, 99** - String operations on parts (4 errors) +```typescript +const a_num = parseInt(a_part, 10); // ❌ a_part undefined +const b_num = parseInt(b_part, 10); +const cmp = a_part.localeCompare(b_part); // ❌ Both undefined +``` +**Fix**: Handle undefined parts (missing part = lower precedence in comparison) + +### Regex Match Arrays (3 errors) - Changeset Reader + +**src/lib/changeset_reader.ts:37-40** - Frontmatter match (1 error) +```typescript +const match = content.match(/^---([\s\S]*?)---\n([\s\S]*?)$/); +const frontmatter = match[1]; // ❌ Could be undefined +const summary = match[2].trim(); +``` +**Fix**: Check `if (!match) throw ...;` + +**src/lib/changeset_reader.ts:48, 50** - Package regex matches (2 errors) +```typescript +while ((match = package_regex.exec(frontmatter)) !== null) { + packages.push({ + name: match[1], // ❌ Could be undefined + bump_type: match[2], // ❌ Could be undefined +``` +**Fix**: Regex groups should be guaranteed by regex pattern, but TS can't verify + +### Object Property Access (2 errors) - MEDIUM PRIORITY + +**src/lib/Repos_Table.svelte:24, 29** - Dictionary access +```typescript +// Line 24 +return repo.package_json.dependencies[key]; // ❌ Returns undefined +// Line 29 +return repo.package_json.devDependencies[key]; +``` +**Type**: Returns `string | undefined` but function signature expects `string | null` +**Fix**: Change return type or add `?? null` coalesce + +### Unvalidated Array Access (8 errors) - HIGH PRIORITY + +**src/lib/publishing_plan.ts:585** - Dependency updates array (1 error) +```typescript +log.info(` ${dep_name} → ${updates[0].new_version}...`); // ❌ updates might be empty +``` +**Fix**: Check `updates.length > 0` before accessing + +**src/lib/multi_repo_publisher.ts** - Various pkg_name uses (NOT in loop) (11 errors) +These errors are ONLY for uses of `pkg_name` NOT in the main loop. The loop assignment was fixed, but verify all downstream uses are safe. + +### Unvalidated Preflight Checks (4 errors) - Build validation + +**src/lib/preflight_checks.ts:151-158** - Build repo array access +```typescript +const repo = repos_to_build[i]; // ✅ FIXED - was in loop +``` +Already fixed. + +--- + +## ✅ ALL SAFE CASES - FULLY FIXED + +### Version String Splits (Always 3+ parts) - 5 errors ✅ + +**src/lib/version_utils.ts** +- Line 92: `major! === 0` ✅ +- Lines 113-114: `new_parts[0]!`, `old_parts[0]!`, etc. ✅ +- Lines 143-147: `major!`, `minor!`, `patch!` ✅ + +**src/lib/test_helpers.ts** +- Line 131: `${major!}.${minor!}.${patch! + 1}` ✅ + +### Loop Iteration (i < array.length) - 2 errors ✅ + +**src/lib/preflight_checks.ts** +- Line 150: `repos_to_build[i]!` ✅ + +**src/lib/multi_repo_publisher.ts** +- Line 103: `order[i]!` (fixes all 11 uses of pkg_name downstream) ✅ + +### Validated Length Access - 1 error ✅ + +**src/lib/preflight_checks.ts** +- Line 173: `repos[0]!.repo_dir` (after `repos.length > 0` check) ✅ + +### Test Expectations with Length Validation - 8 errors ✅ + +**src/lib/multi_repo_publisher.test.ts** +- Line 51-54: `published[0]!`, `published[1]!` (after `.toBe(2)`) ✅ +- Line 96: `failed[0]!` (after `.toBe(1)`) ✅ +- Line 183: `published[0]!` (after `.toBe(1)`) ✅ + +**src/lib/dependency_updater.test.ts** +- Lines 576-577: `failed[0]!` x2 (after `.toHaveLength(1)`) ✅ + +**src/lib/dependency_graph.test.ts** +- Line 306: `orders[0]!` x2 (loop guarantees non-empty) ✅ + +**src/lib/fixtures/check.test.ts** +- Line 372: `fixture_to_local_repos(basic_publishing)[0]!` ✅ +- Line 399: `version_changes[0]!` (after `.length > 0` check) ✅ + +**src/lib/changeset_generator.test.ts** +- Line 209: `updates[0]!` (after `.toHaveLength(1)`) ✅ + +### Previously Fixed (from initial batch) + +**src/lib/semver.test.ts** +- Line 45: `ordered[i]!`, `ordered[i + 1]!` ✅ + +**src/lib/changeset_reader.test.ts** +- Lines 57, 73: `packages[0]!` ✅ + +**src/lib/multi_repo_publisher.test.ts** +- Lines 244-245: `wait_calls[0]!`, `wait_calls[1]!` ✅ + +**src/lib/npm_registry.test.ts** +- Lines 170-179: `wait_calls[0-2]!` x5 ✅ + +--- + +**TOTAL SAFE CASES FIXED: 31 errors** + +## 📊 Final Status + +| Category | Count | Status | +|----------|-------|--------| +| **✅ Safe to Assert with !** | **31** | **FULLY FIXED** | +| ❌ **Unsafe - Need Proper Handling** | **31** | **PENDING** | + +### Progress: 31/62 TypeScript errors fixed (50%) + +**Note**: 25 additional errors are Logger type mismatches (dependency version issue), not index access issues. + +## 🔧 Next Steps + +1. **Regex match arrays** - Add null/existence checks before accessing capture groups +2. **Object property access** - Handle undefined in return statements +3. **Unvalidated array access** - Add length validation or use optional chaining + +## 📝 Implementation Notes + +- All safe cases (31 errors) have been fixed with `!` assertions +- Remaining 31 errors require proper error handling (not just assertions) +- 25 Logger errors are a separate dependency version issue (not index access) diff --git a/src/fixtures/check.test.ts b/src/fixtures/check.test.ts index 06179978..efe9088e 100644 --- a/src/fixtures/check.test.ts +++ b/src/fixtures/check.test.ts @@ -369,7 +369,7 @@ describe('Error condition tests', () => { test('build failure mock returns expected values', async () => { const build_ops = create_failing_build_ops(); - const mock_repo = fixture_to_local_repos(basic_publishing)[0]; + const mock_repo = fixture_to_local_repos(basic_publishing)[0]!; const result = await build_ops.build_package({repo: mock_repo}); assert.equal(result.ok, false, 'Should fail build'); }); @@ -396,7 +396,7 @@ describe('JSON output format tests', () => { // Verify version change structure if (plan.version_changes.length > 0) { - const change = plan.version_changes[0]; + const change = plan.version_changes[0]!; assert.ok('package_name' in change, 'Version change should have package_name'); assert.ok('from' in change, 'Version change should have from version'); assert.ok('to' in change, 'Version change should have to version'); diff --git a/src/lib/changeset_generator.test.ts b/src/lib/changeset_generator.test.ts index 43c1db6c..3372e5da 100644 --- a/src/lib/changeset_generator.test.ts +++ b/src/lib/changeset_generator.test.ts @@ -206,7 +206,7 @@ describe('changeset_generator', () => { const updates = create_dependency_updates(dependencies, published_versions); expect(updates).toHaveLength(1); - expect(updates[0].breaking).toBe(true); + expect(updates[0]!.breaking).toBe(true); }); it('strips version prefixes from current versions', () => { diff --git a/src/lib/changeset_reader.test.ts b/src/lib/changeset_reader.test.ts index 04307deb..8a5c1c90 100644 --- a/src/lib/changeset_reader.test.ts +++ b/src/lib/changeset_reader.test.ts @@ -54,7 +54,7 @@ BREAKING: Complete API redesign.`; const result = parse_changeset_content(content); - expect(result?.packages[0]).toEqual({ + expect(result?.packages[0]!).toEqual({ name: 'api-package', bump_type: 'major', }); @@ -70,7 +70,7 @@ Test single quotes.`; const result = parse_changeset_content(content); - expect(result?.packages[0].name).toBe('single-quoted'); + expect(result?.packages[0]!.name).toBe('single-quoted'); }); it('ignores whitespace variations', () => { diff --git a/src/lib/dependency_graph.test.ts b/src/lib/dependency_graph.test.ts index 2148ff96..70d329ec 100644 --- a/src/lib/dependency_graph.test.ts +++ b/src/lib/dependency_graph.test.ts @@ -303,7 +303,7 @@ describe('Dependency_Graph', () => { } // Verify alpha comes before gamma (dependency constraint) - expect(orders[0].indexOf('alpha')).toBeLessThan(orders[0].indexOf('gamma')); + expect(orders[0]!.indexOf('alpha')).toBeLessThan(orders[0]!.indexOf('gamma')); }); }); diff --git a/src/lib/dependency_updater.test.ts b/src/lib/dependency_updater.test.ts index 730e850c..b0ba7bcd 100644 --- a/src/lib/dependency_updater.test.ts +++ b/src/lib/dependency_updater.test.ts @@ -573,8 +573,8 @@ describe('dependency_updater', () => { expect(result.updated).toBe(0); expect(result.failed).toHaveLength(1); - expect(result.failed[0].repo).toBe('pkg-a'); - expect(result.failed[0].error).toBeInstanceOf(Error); + expect(result.failed[0]!.repo).toBe('pkg-a'); + expect(result.failed[0]!.error).toBeInstanceOf(Error); }); }); }); diff --git a/src/lib/multi_repo_publisher.test.ts b/src/lib/multi_repo_publisher.test.ts index 50071467..fd5d3356 100644 --- a/src/lib/multi_repo_publisher.test.ts +++ b/src/lib/multi_repo_publisher.test.ts @@ -48,10 +48,10 @@ test('dry_run predicts versions without publishing', async () => { expect(result.ok).toBe(true); expect(result.published.length).toBe(2); - expect(result.published[0].name).toBe('pkg-a'); - expect(result.published[0].new_version).toBe('0.1.1'); - expect(result.published[1].name).toBe('pkg-b'); - expect(result.published[1].new_version).toBe('0.2.1'); + expect(result.published[0]!.name).toBe('pkg-a'); + expect(result.published[0]!.new_version).toBe('0.1.1'); + expect(result.published[1]!.name).toBe('pkg-b'); + expect(result.published[1]!.new_version).toBe('0.2.1'); }); test('always fails fast on publish errors', async () => { @@ -93,7 +93,7 @@ test('always fails fast on publish errors', async () => { // With fail-fast behavior: only pkg-a fails, no other packages are attempted expect(result.ok).toBe(false); expect(result.failed.length).toBe(1); - expect(result.failed[0].name).toBe('pkg-a'); + expect(result.failed[0]!.name).toBe('pkg-a'); expect(result.published.length).toBe(0); // No packages published after failure }); @@ -180,7 +180,7 @@ test('skips repos without changesets', async () => { // Only pkg-a should be published expect(result.ok).toBe(true); expect(result.published.length).toBe(1); - expect(result.published[0].name).toBe('pkg-a'); + expect(result.published[0]!.name).toBe('pkg-a'); }); test('publishes in dependency order', async () => { @@ -241,8 +241,8 @@ test('waits for npm propagation after each publish', async () => { // Should wait for both packages expect(wait_calls.length).toBe(2); - expect(wait_calls[0].pkg).toBe('pkg-a'); - expect(wait_calls[1].pkg).toBe('pkg-b'); + expect(wait_calls[0]!.pkg).toBe('pkg-a'); + expect(wait_calls[1]!.pkg).toBe('pkg-b'); }); test('updates prod dependencies after publishing (Phase 1)', async () => { @@ -574,7 +574,7 @@ test('handles npm propagation failure gracefully', async () => { // Should fail due to npm propagation timeout expect(result.ok).toBe(false); expect(result.failed.length).toBe(1); - expect(result.failed[0].error.message).toContain('Timeout waiting for package'); + expect(result.failed[0]!.error.message).toContain('Timeout waiting for package'); }); test('handles deploy failures without stopping', async () => { @@ -652,7 +652,7 @@ test('returns correct Published_Version metadata', async () => { const result = await publish_repos(repos, {dry_run: true, update_deps: false}, mock_ops); expect(result.published.length).toBe(1); - const published = result.published[0]; + const published = result.published[0]!; expect(published.name).toBe('pkg-a'); expect(published.old_version).toBe('0.5.0'); diff --git a/src/lib/multi_repo_publisher.ts b/src/lib/multi_repo_publisher.ts index 20926ded..bb634198 100644 --- a/src/lib/multi_repo_publisher.ts +++ b/src/lib/multi_repo_publisher.ts @@ -105,7 +105,7 @@ export const publish_repos = async ( // Phase 1: Publish each package and immediately update dependents for (let i = 0; i < order.length; i++) { - const pkg_name = order[i]; + const pkg_name = order[i]!; const repo = repos.find((r) => r.pkg.name === pkg_name); if (!repo) continue; diff --git a/src/lib/npm_registry.test.ts b/src/lib/npm_registry.test.ts index 19699f93..342d4140 100644 --- a/src/lib/npm_registry.test.ts +++ b/src/lib/npm_registry.test.ts @@ -167,16 +167,16 @@ describe('npm_registry', () => { expect(wait_calls.length).toBe(3); // First delay: ~100ms (+ jitter) - expect(wait_calls[0][0]).toBeGreaterThanOrEqual(100); - expect(wait_calls[0][0]).toBeLessThan(120); + expect(wait_calls[0]![0]).toBeGreaterThanOrEqual(100); + expect(wait_calls[0]![0]).toBeLessThan(120); // Second delay: ~150ms (100 * 1.5 + jitter) - expect(wait_calls[1][0]).toBeGreaterThanOrEqual(150); - expect(wait_calls[1][0]).toBeLessThan(180); + expect(wait_calls[1]![0]).toBeGreaterThanOrEqual(150); + expect(wait_calls[1]![0]).toBeLessThan(180); // Third delay: ~225ms (150 * 1.5 + jitter) - expect(wait_calls[2][0]).toBeGreaterThanOrEqual(225); - expect(wait_calls[2][0]).toBeLessThan(270); + expect(wait_calls[2]![0]).toBeGreaterThanOrEqual(225); + expect(wait_calls[2]![0]).toBeLessThan(270); }); it('respects max_delay cap', async () => { diff --git a/src/lib/preflight_checks.ts b/src/lib/preflight_checks.ts index 64b2488b..1399b160 100644 --- a/src/lib/preflight_checks.ts +++ b/src/lib/preflight_checks.ts @@ -147,7 +147,7 @@ export const run_preflight_checks = async ({ const repos_to_build = repos.filter((repo) => repos_with_changesets.has(repo.pkg.name)); for (let i = 0; i < repos_to_build.length; i++) { - const repo = repos_to_build[i]; + const repo = repos_to_build[i]!; log?.info(st('dim', ` [${i + 1}/${repos_to_build.length}] Building ${repo.pkg.name}...`)); const build_result = await build_ops.build_package({repo, log}); // eslint-disable-line no-await-in-loop if (!build_result.ok) { @@ -170,7 +170,7 @@ export const run_preflight_checks = async ({ if (check_remote && repos.length > 0) { log?.info(' Checking git remote connectivity...'); // Only check first repo to avoid slowing down tests with multiple remote checks - const remote_result = await check_git_remote(repos[0].repo_dir); + const remote_result = await check_git_remote(repos[0]!.repo_dir); if (!remote_result.ok) { warnings.push(`git remote may not be reachable - ${remote_result.message}`); } diff --git a/src/lib/semver.test.ts b/src/lib/semver.test.ts index 7836e50e..1dac2ce9 100644 --- a/src/lib/semver.test.ts +++ b/src/lib/semver.test.ts @@ -42,8 +42,8 @@ describe('semver_compare_versions', () => { ]; for (let i = 0; i < ordered.length - 1; i++) { - expect(semver_compare_versions(ordered[i], ordered[i + 1])).toBe(-1); - expect(semver_compare_versions(ordered[i + 1], ordered[i])).toBe(1); + expect(semver_compare_versions(ordered[i]!, ordered[i + 1]!)).toBe(-1); + expect(semver_compare_versions(ordered[i + 1]!, ordered[i]!)).toBe(1); } }); diff --git a/src/lib/test_helpers.ts b/src/lib/test_helpers.ts index c111dd8f..b85f965e 100644 --- a/src/lib/test_helpers.ts +++ b/src/lib/test_helpers.ts @@ -128,7 +128,7 @@ export const create_mock_gitops_ops = ( */ const incrementPatch = (version: string): string => { const [major, minor, patch] = version.split('.').map(Number); - return `${major}.${minor}.${patch + 1}`; + return `${major!}.${minor!}.${patch! + 1}`; }; /** diff --git a/src/lib/version_utils.ts b/src/lib/version_utils.ts index f3692e9b..0e53d7f8 100644 --- a/src/lib/version_utils.ts +++ b/src/lib/version_utils.ts @@ -89,7 +89,7 @@ export const is_breaking_change = ( bump_type: 'major' | 'minor' | 'patch', ): boolean => { const [major] = old_version.split('.').map(Number); - const is_pre_1_0 = major === 0; + const is_pre_1_0 = major! === 0; if (is_pre_1_0) { // In 0.x.x, minor bumps are breaking changes @@ -110,8 +110,8 @@ export const detect_bump_type = ( const old_parts = old_version.split('.').map(Number); const new_parts = new_version.split('.').map(Number); - if (new_parts[0] > old_parts[0]) return 'major'; - if (new_parts[1] > old_parts[1]) return 'minor'; + if (new_parts[0]! > old_parts[0]!) return 'major'; + if (new_parts[1]! > old_parts[1]!) return 'minor'; return 'patch'; }; @@ -140,11 +140,11 @@ export const calculate_next_version = (current_version: string, bump_type: Bump_ switch (bump_type) { case 'major': - return `${major + 1}.0.0`; + return `${major! + 1}.0.0`; case 'minor': - return `${major}.${minor + 1}.0`; + return `${major!}.${minor! + 1}.0`; case 'patch': - return `${major}.${minor}.${patch + 1}`; + return `${major!}.${minor!}.${patch! + 1}`; default: throw new Error(`Invalid bump type: ${bump_type}`); } diff --git a/tsconfig.json b/tsconfig.json index 57c075d5..4d121e87 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,7 @@ "noImplicitReturns": true, "noImplicitOverride": true, "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, "resolveJsonModule": true, "sourceMap": true, "declaration": true, From ed62c1f351950430aeadf55bf1b4630c79493907 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 27 Oct 2025 13:12:40 -0400 Subject: [PATCH 03/41] wip --- package-lock.json | 53 +++++++++---------------------------- package.json | 4 +-- src/lib/Repos_Table.svelte | 8 +++--- src/lib/changeset_reader.ts | 8 +++--- src/lib/publishing_plan.ts | 5 +++- src/lib/semver.ts | 10 +++---- 6 files changed, 31 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71b54171..c826a6e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@ryanatkn/belt": "^0.36.0", "@ryanatkn/eslint-config": "^0.8.0", "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.169.1", + "@ryanatkn/gro": "^0.171.0", "@ryanatkn/moss": "^0.36.2", "@sveltejs/adapter-static": "^3.0.9", "@sveltejs/kit": "^2.37.1", @@ -40,7 +40,7 @@ "peerDependencies": { "@ryanatkn/belt": "^0.36.0", "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.169.1", + "@ryanatkn/gro": "^0.171.0", "@ryanatkn/moss": "^0.36.2", "@sveltejs/kit": "^2", "svelte": "^5", @@ -1493,13 +1493,12 @@ } }, "node_modules/@ryanatkn/gro": { - "version": "0.169.1", - "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.169.1.tgz", - "integrity": "sha512-qktPwn2nlziFBcSSMwHWXs8nfjCceuaEGSwbAPycTjOTizOtMnYufYfA6cxgyzrYd2vsKoL+bU2LbeOVJ+V8Bg==", + "version": "0.171.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.171.0.tgz", + "integrity": "sha512-t6NHS60Ef3obhBJH6fv2ktvpo+U06t3tykM7TaAlbPaA7Mr+Uo36f7Sk3vZzJ5yxrtb7gj4fxpI2Xwldt1jLJg==", "dev": true, "license": "MIT", "dependencies": { - "@ryanatkn/belt": "^0.35.1", "chokidar": "^4.0.3", "dotenv": "^17.2.2", "esm-env": "^1.2.2", @@ -1509,7 +1508,7 @@ "prettier-plugin-svelte": "^3.4.0", "ts-blank-space": "^0.6.2", "tslib": "^2.8.1", - "zod": "^4.1.5" + "zod": "^4.1.12" }, "bin": { "gro": "dist/gro.js" @@ -1521,14 +1520,15 @@ "url": "https://www.ryanatkn.com/funding" }, "optionalDependencies": { - "vitest": "^3" + "vitest": "^3 || ^4" }, "peerDependencies": { + "@ryanatkn/belt": "^0.36.0", "@sveltejs/kit": "^2", "esbuild": "^0.25", "svelte": "^5", "typescript": "^5", - "vitest": "^3" + "vitest": "^3 || ^4" }, "peerDependenciesMeta": { "@sveltejs/kit": { @@ -1539,35 +1539,6 @@ } } }, - "node_modules/@ryanatkn/gro/node_modules/@ryanatkn/belt": { - "version": "0.35.1", - "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.35.1.tgz", - "integrity": "sha512-xn/sDxJQ+IEjJEJe0Pfm/leIla+csKDxQoutBm7kMx7MDVu5EylogfPHd/RL5PkjKdUHwKHDiXbAQxlZKHOHaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://www.ryanatkn.com/funding" - }, - "peerDependencies": { - "@types/node": "^24", - "esm-env": "^1.2.2", - "zod": "^4.0.14" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esm-env": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/@ryanatkn/moss": { "version": "0.36.2", "resolved": "https://registry.npmjs.org/@ryanatkn/moss/-/moss-0.36.2.tgz", @@ -4482,9 +4453,9 @@ "license": "MIT" }, "node_modules/zod": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.5.tgz", - "integrity": "sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index dde77d1f..d3786a92 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "peerDependencies": { "@ryanatkn/belt": "^0.36.0", "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.169.1", + "@ryanatkn/gro": "^0.171.0", "@ryanatkn/moss": "^0.36.2", "@sveltejs/kit": "^2", "svelte": "^5", @@ -43,7 +43,7 @@ "@ryanatkn/belt": "^0.36.0", "@ryanatkn/eslint-config": "^0.8.0", "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.169.1", + "@ryanatkn/gro": "^0.171.0", "@ryanatkn/moss": "^0.36.2", "@sveltejs/adapter-static": "^3.0.9", "@sveltejs/kit": "^2.37.1", diff --git a/src/lib/Repos_Table.svelte b/src/lib/Repos_Table.svelte index ff84af86..62125632 100644 --- a/src/lib/Repos_Table.svelte +++ b/src/lib/Repos_Table.svelte @@ -18,7 +18,7 @@ // TODO gray out the latest of each version for deps, but only if the max is knowable via a local dep, don't assume for externals // TODO hacky, handle regular deps too - const lookup_dep_version = (repo: Repo, dep: string): string | null => { + const lookup_dep_version = (repo: Repo, dep: string): string | undefined => { for (const key in repo.package_json.dependencies) { if (key === dep) { return repo.package_json.dependencies[key]; @@ -29,7 +29,7 @@ return repo.package_json.devDependencies[key]; } } - return null; + return undefined; }; const latest_version_by_dep = $derived( @@ -42,8 +42,8 @@ ), ); - const format_version = (version: string | null): string => - version === null ? '' : version.replace(/^(\^|>=)\s*/, ''); + const format_version = (version: string | null | undefined): string => + version == null ? '' : version.replace(/^(\^|>=)\s*/, ''); const lookup_pull_requests = (repos: Array | null, repo: Repo) => { const found = repos?.find((p) => p.repo_url === repo.repo_url); diff --git a/src/lib/changeset_reader.ts b/src/lib/changeset_reader.ts index e16d5668..ac493e1c 100644 --- a/src/lib/changeset_reader.ts +++ b/src/lib/changeset_reader.ts @@ -33,8 +33,8 @@ export const parse_changeset_content = ( return null; } - const frontmatter = frontmatter_match[1]; - const summary = frontmatter_match[2].trim(); + const frontmatter = frontmatter_match[1]!; + const summary = frontmatter_match[2]!.trim(); // Parse package entries const packages: Array<{name: string; bump_type: Bump_Type}> = []; @@ -47,8 +47,8 @@ export const parse_changeset_content = ( while ((match = package_regex.exec(frontmatter)) !== null) { packages.push({ - name: match[1], - bump_type: match[2] as Bump_Type, + name: match[1]!, + bump_type: match[2]! as Bump_Type, }); } diff --git a/src/lib/publishing_plan.ts b/src/lib/publishing_plan.ts index eb2172ef..c5c3827f 100644 --- a/src/lib/publishing_plan.ts +++ b/src/lib/publishing_plan.ts @@ -564,6 +564,9 @@ export const log_publishing_plan = (plan: Publishing_Plan, log: Logger): void => for (const [pkg, deps_map] of updates_by_package) { log.info(` ${pkg}:`); for (const [dep_name, updates] of deps_map) { + // Guard against empty updates array + if (updates.length === 0) continue; + // Collect all dependency types for this dependency const types: Array = []; let causes_republish = false; @@ -582,7 +585,7 @@ export const log_publishing_plan = (plan: Publishing_Plan, log: Logger): void => // Format output const type_list = types.join(', '); const republish = needs_auto_changeset ? ' (triggers auto-changeset)' : ''; - log.info(` ${dep_name} → ${updates[0].new_version} [${type_list}]${republish}`); + log.info(` ${dep_name} → ${updates[0]!.new_version} [${type_list}]${republish}`); } } } diff --git a/src/lib/semver.ts b/src/lib/semver.ts index 513bec0b..5ccb7c9d 100644 --- a/src/lib/semver.ts +++ b/src/lib/semver.ts @@ -35,9 +35,9 @@ const semver_parse = (version: string): Semver => { const match = SEMVER_REGEX.exec(clean)!; return { - major: parseInt(match[1], 10), - minor: parseInt(match[2], 10), - patch: parseInt(match[3], 10), + major: parseInt(match[1]!, 10), + minor: parseInt(match[2]!, 10), + patch: parseInt(match[3]!, 10), prerelease: match[4], build: match[5], }; @@ -74,8 +74,8 @@ const semver_compare_prerelease = (a: string | undefined, b: string | undefined) // Compare each identifier const min_length = Math.min(a_parts.length, b_parts.length); for (let i = 0; i < min_length; i++) { - const a_part = a_parts[i]; - const b_part = b_parts[i]; + const a_part = a_parts[i]!; + const b_part = b_parts[i]!; // Check if numeric const a_is_numeric = /^\d+$/.test(a_part); From 957e7f27baa62040bb568f7a519bbe5f3f503051 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 27 Oct 2025 13:16:05 -0400 Subject: [PATCH 04/41] wip --- src/lib/changeset_reader.test.ts | 2 +- src/lib/version_utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/changeset_reader.test.ts b/src/lib/changeset_reader.test.ts index 8a5c1c90..e51e03bc 100644 --- a/src/lib/changeset_reader.test.ts +++ b/src/lib/changeset_reader.test.ts @@ -54,7 +54,7 @@ BREAKING: Complete API redesign.`; const result = parse_changeset_content(content); - expect(result?.packages[0]!).toEqual({ + expect(result?.packages[0]).toEqual({ name: 'api-package', bump_type: 'major', }); diff --git a/src/lib/version_utils.ts b/src/lib/version_utils.ts index 0e53d7f8..ef6a30af 100644 --- a/src/lib/version_utils.ts +++ b/src/lib/version_utils.ts @@ -89,7 +89,7 @@ export const is_breaking_change = ( bump_type: 'major' | 'minor' | 'patch', ): boolean => { const [major] = old_version.split('.').map(Number); - const is_pre_1_0 = major! === 0; + const is_pre_1_0 = major === 0; if (is_pre_1_0) { // In 0.x.x, minor bumps are breaking changes From 5348b08c540c68e69cb038fcbba26bf10190734c Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 27 Oct 2025 22:05:00 -0400 Subject: [PATCH 05/41] wip --- src/fixtures/check.test.ts | 2 + .../configs/three_way_dev_cycle.config.ts | 24 +++ .../repo_fixtures/three_way_dev_cycle.ts | 146 ++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 src/fixtures/configs/three_way_dev_cycle.config.ts create mode 100644 src/fixtures/repo_fixtures/three_way_dev_cycle.ts diff --git a/src/fixtures/check.test.ts b/src/fixtures/check.test.ts index efe9088e..78bd29e2 100644 --- a/src/fixtures/check.test.ts +++ b/src/fixtures/check.test.ts @@ -21,6 +21,7 @@ import type {Local_Repo} from '$lib/local_repo.js'; import {basic_publishing} from './repo_fixtures/basic_publishing.js'; import {deep_cascade} from './repo_fixtures/deep_cascade.js'; import {circular_dev_deps} from './repo_fixtures/circular_dev_deps.js'; +import {three_way_dev_cycle} from './repo_fixtures/three_way_dev_cycle.js'; import {private_packages} from './repo_fixtures/private_packages.js'; import {major_bumps} from './repo_fixtures/major_bumps.js'; import {peer_deps_only} from './repo_fixtures/peer_deps_only.js'; @@ -36,6 +37,7 @@ const FIXTURES: Array = [ basic_publishing, deep_cascade, circular_dev_deps, + three_way_dev_cycle, private_packages, major_bumps, peer_deps_only, diff --git a/src/fixtures/configs/three_way_dev_cycle.config.ts b/src/fixtures/configs/three_way_dev_cycle.config.ts new file mode 100644 index 00000000..f88b559c --- /dev/null +++ b/src/fixtures/configs/three_way_dev_cycle.config.ts @@ -0,0 +1,24 @@ +import type {Create_Gitops_Config} from '$lib/gitops_config.js'; +import {join, dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; + +import {three_way_dev_cycle} from '../repo_fixtures/three_way_dev_cycle.js'; + +// Get absolute path to fixtures directory +const FIXTURES_DIR = dirname(dirname(fileURLToPath(import.meta.url))); + +const config: Create_Gitops_Config = () => { + const repos = []; + + // Generate repo configs from this fixture only + for (const repo_data of three_way_dev_cycle.repos) { + repos.push({ + repo_url: repo_data.repo_url, + repo_dir: join(FIXTURES_DIR, 'repos', three_way_dev_cycle.name, repo_data.repo_name), + }); + } + + return {repos}; +}; + +export default config; diff --git a/src/fixtures/repo_fixtures/three_way_dev_cycle.ts b/src/fixtures/repo_fixtures/three_way_dev_cycle.ts new file mode 100644 index 00000000..cdaad801 --- /dev/null +++ b/src/fixtures/repo_fixtures/three_way_dev_cycle.ts @@ -0,0 +1,146 @@ +import type {Repo_Fixture_Set} from '../repo_fixture_types.js'; + +/** + * Tests three-way circular devDependencies between packages. + * Real-world scenario: testing tools or dev utilities that depend on each other for development. + * + * Structure: + * - tool_x → tool_y → tool_z → tool_x (3-way circular devDependencies) + * - app depends on all three (production deps) + * + * Should publish successfully because topological sort excludes dev dependencies. + * Validates that longer dev cycles (>2 packages) work in full publishing workflow. + */ +export const three_way_dev_cycle: Repo_Fixture_Set = { + name: 'three_way_dev_cycle', + description: + 'Tests that three-way circular devDependencies do not prevent publishing (longer cycles work)', + + repos: [ + // tool_x: Has explicit patch changeset, devDep on tool_y + { + repo_name: 'tool_x', + repo_url: 'https://gitops.fuz.dev/test/tool_x', + package_json: { + name: '@test/tool_x', + version: '1.0.0', + devDependencies: { + '@test/tool_y': '^1.0.0', + }, + }, + changesets: [ + { + filename: 'fix-x.md', + content: `--- +"@test/tool_x": patch +--- + +Bug fix in tool_x`, + }, + ], + }, + + // tool_y: Has explicit minor changeset, devDep on tool_z + { + repo_name: 'tool_y', + repo_url: 'https://gitops.fuz.dev/test/tool_y', + package_json: { + name: '@test/tool_y', + version: '1.0.0', + devDependencies: { + '@test/tool_z': '^1.0.0', + }, + }, + changesets: [ + { + filename: 'feature-y.md', + content: `--- +"@test/tool_y": minor +--- + +New feature in tool_y`, + }, + ], + }, + + // tool_z: Has explicit patch changeset, devDep on tool_x (completes 3-way cycle) + { + repo_name: 'tool_z', + repo_url: 'https://gitops.fuz.dev/test/tool_z', + package_json: { + name: '@test/tool_z', + version: '1.0.0', + devDependencies: { + '@test/tool_x': '^1.0.0', + }, + }, + changesets: [ + { + filename: 'fix-z.md', + content: `--- +"@test/tool_z": patch +--- + +Bug fix in tool_z`, + }, + ], + }, + + // app: Depends on all three tools via production dependencies + { + repo_name: 'app', + repo_url: 'https://gitops.fuz.dev/test/app', + package_json: { + name: '@test/app', + version: '1.0.0', + dependencies: { + '@test/tool_x': '^1.0.0', + '@test/tool_y': '^1.0.0', + '@test/tool_z': '^1.0.0', + }, + }, + // No changesets, but should get auto-changeset due to dependency updates + }, + ], + + expected_outcomes: { + // Publishing order: tool_x, tool_y, tool_z can be in any order (no prod dep between them), + // then app depends on all three + // Note: Order among the three tools is non-deterministic (all valid) + publishing_order: ['@test/tool_x', '@test/tool_y', '@test/tool_z', '@test/app'], + + version_changes: [ + { + package_name: '@test/tool_x', + from: '1.0.0', + to: '1.0.1', // patch bump + scenario: 'explicit_changeset', + }, + { + package_name: '@test/tool_y', + from: '1.0.0', + to: '1.1.0', // minor bump + scenario: 'explicit_changeset', + }, + { + package_name: '@test/tool_z', + from: '1.0.0', + to: '1.0.1', // patch bump + scenario: 'explicit_changeset', + }, + { + package_name: '@test/app', + from: '1.0.0', + to: '1.0.1', // Patch bump: tool_y's minor (1.0.0 → 1.1.0) is NOT breaking in >=1.0 + scenario: 'auto_generated', + }, + ], + + // No breaking cascades: tool_y's minor bump is NOT breaking in >=1.0 (only major is) + breaking_cascades: {}, + + info: ['1 dev dependency cycle(s) detected (normal, shown in gitops_analyze)'], + warnings: [], + errors: [], + }, +}; From 7b3c1d38579195d0e6e6bf4b55496bd6e998e98b Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 27 Oct 2025 22:07:46 -0400 Subject: [PATCH 06/41] wip --- src/{lib => test}/changeset_generator.test.ts | 0 src/{lib => test}/changeset_reader.test.ts | 0 src/{lib => test}/dependency_graph.test.ts | 2 +- src/{lib => test}/dependency_updater.test.ts | 2 +- src/{lib => test}/graph_validation.test.ts | 2 +- src/{lib => test}/multi_repo_publisher.test.ts | 2 +- src/{lib => test}/npm_operations.test.ts | 2 +- src/{lib => test}/npm_registry.test.ts | 2 +- src/{lib => test}/preflight_checks.test.ts | 2 +- src/{lib => test}/publishing_plan.test.ts | 2 +- src/{lib => test}/semver.test.ts | 0 src/{lib => test}/test_helpers.ts | 0 src/{lib => test}/version_utils.test.ts | 0 13 files changed, 8 insertions(+), 8 deletions(-) rename src/{lib => test}/changeset_generator.test.ts (100%) rename src/{lib => test}/changeset_reader.test.ts (100%) rename src/{lib => test}/dependency_graph.test.ts (99%) rename src/{lib => test}/dependency_updater.test.ts (99%) rename src/{lib => test}/graph_validation.test.ts (99%) rename src/{lib => test}/multi_repo_publisher.test.ts (99%) rename src/{lib => test}/npm_operations.test.ts (98%) rename src/{lib => test}/npm_registry.test.ts (99%) rename src/{lib => test}/preflight_checks.test.ts (99%) rename src/{lib => test}/publishing_plan.test.ts (99%) rename src/{lib => test}/semver.test.ts (100%) rename src/{lib => test}/test_helpers.ts (100%) rename src/{lib => test}/version_utils.test.ts (100%) diff --git a/src/lib/changeset_generator.test.ts b/src/test/changeset_generator.test.ts similarity index 100% rename from src/lib/changeset_generator.test.ts rename to src/test/changeset_generator.test.ts diff --git a/src/lib/changeset_reader.test.ts b/src/test/changeset_reader.test.ts similarity index 100% rename from src/lib/changeset_reader.test.ts rename to src/test/changeset_reader.test.ts diff --git a/src/lib/dependency_graph.test.ts b/src/test/dependency_graph.test.ts similarity index 99% rename from src/lib/dependency_graph.test.ts rename to src/test/dependency_graph.test.ts index 70d329ec..05b3ec39 100644 --- a/src/lib/dependency_graph.test.ts +++ b/src/test/dependency_graph.test.ts @@ -1,6 +1,6 @@ import {describe, it, expect} from 'vitest'; import {Dependency_Graph, Dependency_Graph_Builder} from '$lib/dependency_graph.js'; -import {create_mock_repo} from '$lib/test_helpers.js'; +import {create_mock_repo} from './test_helpers.js'; describe('Dependency_Graph', () => { describe('basic functionality', () => { diff --git a/src/lib/dependency_updater.test.ts b/src/test/dependency_updater.test.ts similarity index 99% rename from src/lib/dependency_updater.test.ts rename to src/test/dependency_updater.test.ts index b0ba7bcd..53c97251 100644 --- a/src/lib/dependency_updater.test.ts +++ b/src/test/dependency_updater.test.ts @@ -6,7 +6,7 @@ import { update_all_repos, find_updates_needed, } from '$lib/dependency_updater.js'; -import {create_mock_repo, create_mock_git_ops, create_mock_fs_ops} from '$lib/test_helpers.js'; +import {create_mock_repo, create_mock_git_ops, create_mock_fs_ops} from './test_helpers.js'; import type {Git_Operations} from '$lib/operations.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/lib/graph_validation.test.ts b/src/test/graph_validation.test.ts similarity index 99% rename from src/lib/graph_validation.test.ts rename to src/test/graph_validation.test.ts index 75cf37e8..3fdf3749 100644 --- a/src/lib/graph_validation.test.ts +++ b/src/test/graph_validation.test.ts @@ -2,7 +2,7 @@ import {describe, it, expect} from 'vitest'; import {Task_Error} from '@ryanatkn/gro'; import {validate_dependency_graph} from '$lib/graph_validation.js'; -import {create_mock_repo} from '$lib/test_helpers.js'; +import {create_mock_repo} from './test_helpers.js'; describe('validate_dependency_graph', () => { describe('basic functionality', () => { diff --git a/src/lib/multi_repo_publisher.test.ts b/src/test/multi_repo_publisher.test.ts similarity index 99% rename from src/lib/multi_repo_publisher.test.ts rename to src/test/multi_repo_publisher.test.ts index fd5d3356..d8b49cff 100644 --- a/src/lib/multi_repo_publisher.test.ts +++ b/src/test/multi_repo_publisher.test.ts @@ -11,7 +11,7 @@ import { create_preflight_mock, create_populated_fs_ops, create_mock_logger, -} from '$lib/test_helpers.js'; +} from './test_helpers.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/lib/npm_operations.test.ts b/src/test/npm_operations.test.ts similarity index 98% rename from src/lib/npm_operations.test.ts rename to src/test/npm_operations.test.ts index 1febc316..6cb32a10 100644 --- a/src/lib/npm_operations.test.ts +++ b/src/test/npm_operations.test.ts @@ -1,6 +1,6 @@ import {test, assert, describe} from 'vitest'; -import {create_mock_npm_ops} from '$lib/test_helpers.js'; +import {create_mock_npm_ops} from './test_helpers.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/lib/npm_registry.test.ts b/src/test/npm_registry.test.ts similarity index 99% rename from src/lib/npm_registry.test.ts rename to src/test/npm_registry.test.ts index 342d4140..34e61eb5 100644 --- a/src/lib/npm_registry.test.ts +++ b/src/test/npm_registry.test.ts @@ -9,7 +9,7 @@ import { package_exists, type Wait_Options, } from '$lib/npm_registry.js'; -import {create_mock_logger} from '$lib/test_helpers.js'; +import {create_mock_logger} from './test_helpers.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/lib/preflight_checks.test.ts b/src/test/preflight_checks.test.ts similarity index 99% rename from src/lib/preflight_checks.test.ts rename to src/test/preflight_checks.test.ts index 7665f9e5..e1ed2911 100644 --- a/src/lib/preflight_checks.test.ts +++ b/src/test/preflight_checks.test.ts @@ -6,7 +6,7 @@ import { create_mock_git_ops, create_mock_npm_ops, create_mock_build_ops, -} from '$lib/test_helpers.js'; +} from './test_helpers.js'; import type {Local_Repo} from '$lib/local_repo.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/lib/publishing_plan.test.ts b/src/test/publishing_plan.test.ts similarity index 99% rename from src/lib/publishing_plan.test.ts rename to src/test/publishing_plan.test.ts index ab407e82..3529357b 100644 --- a/src/lib/publishing_plan.test.ts +++ b/src/test/publishing_plan.test.ts @@ -3,7 +3,7 @@ import {test, expect} from 'vitest'; import type {Local_Repo} from '$lib/local_repo.js'; import {generate_publishing_plan} from '$lib/publishing_plan.js'; import type {Changeset_Operations} from '$lib/operations.js'; -import {create_mock_repo} from '$lib/test_helpers.js'; +import {create_mock_repo} from './test_helpers.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/lib/semver.test.ts b/src/test/semver.test.ts similarity index 100% rename from src/lib/semver.test.ts rename to src/test/semver.test.ts diff --git a/src/lib/test_helpers.ts b/src/test/test_helpers.ts similarity index 100% rename from src/lib/test_helpers.ts rename to src/test/test_helpers.ts diff --git a/src/lib/version_utils.test.ts b/src/test/version_utils.test.ts similarity index 100% rename from src/lib/version_utils.test.ts rename to src/test/version_utils.test.ts From b8b98c762e47d41b6a80c075211c36171359ade9 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 27 Oct 2025 22:08:14 -0400 Subject: [PATCH 07/41] wip --- TODO_INDEXING.md | 179 ----------------------------------------------- 1 file changed, 179 deletions(-) delete mode 100644 TODO_INDEXING.md diff --git a/TODO_INDEXING.md b/TODO_INDEXING.md deleted file mode 100644 index 613fd1c2..00000000 --- a/TODO_INDEXING.md +++ /dev/null @@ -1,179 +0,0 @@ -# TypeScript `noUncheckedIndexedAccess` Issues - Remaining Work - -Total TypeScript errors: 87 -- ✅ Fixed: 31 errors (safe-to-assert cases) -- ⚠️ Remaining: 31 errors (need proper handling) -- 📦 Other: 25 errors (Logger type mismatch, dependency issue) - ---- - -## ⚠️ UNSAFE - Needs Proper Handling (31 errors) - -### Regex Match Arrays (9 errors) - HIGH PRIORITY - -**src/lib/semver.ts:38-40** - Regex match capture groups (3 errors) -```typescript -const match = version.match(SEMVER_REGEX); -return { - major: parseInt(match[1], 10), // ❌ match[1] undefined if no match - minor: parseInt(match[2], 10), - patch: parseInt(match[3], 10), - prerelease: match[4], -}; -``` -**Fix**: Check `if (!match) throw ...;` before accessing indices - -**src/lib/semver.ts:81-82** - Prerelease part array access (2 errors) -```typescript -const a_part = a_parts[j]; -const b_part = b_parts[j]; -const a_is_numeric = /^\d+$/.test(a_part); // ❌ Could be undefined -const b_is_numeric = /^\d+$/.test(b_part); -``` -**Fix**: Check parts exist before testing - -**src/lib/semver.ts:86-87, 99** - String operations on parts (4 errors) -```typescript -const a_num = parseInt(a_part, 10); // ❌ a_part undefined -const b_num = parseInt(b_part, 10); -const cmp = a_part.localeCompare(b_part); // ❌ Both undefined -``` -**Fix**: Handle undefined parts (missing part = lower precedence in comparison) - -### Regex Match Arrays (3 errors) - Changeset Reader - -**src/lib/changeset_reader.ts:37-40** - Frontmatter match (1 error) -```typescript -const match = content.match(/^---([\s\S]*?)---\n([\s\S]*?)$/); -const frontmatter = match[1]; // ❌ Could be undefined -const summary = match[2].trim(); -``` -**Fix**: Check `if (!match) throw ...;` - -**src/lib/changeset_reader.ts:48, 50** - Package regex matches (2 errors) -```typescript -while ((match = package_regex.exec(frontmatter)) !== null) { - packages.push({ - name: match[1], // ❌ Could be undefined - bump_type: match[2], // ❌ Could be undefined -``` -**Fix**: Regex groups should be guaranteed by regex pattern, but TS can't verify - -### Object Property Access (2 errors) - MEDIUM PRIORITY - -**src/lib/Repos_Table.svelte:24, 29** - Dictionary access -```typescript -// Line 24 -return repo.package_json.dependencies[key]; // ❌ Returns undefined -// Line 29 -return repo.package_json.devDependencies[key]; -``` -**Type**: Returns `string | undefined` but function signature expects `string | null` -**Fix**: Change return type or add `?? null` coalesce - -### Unvalidated Array Access (8 errors) - HIGH PRIORITY - -**src/lib/publishing_plan.ts:585** - Dependency updates array (1 error) -```typescript -log.info(` ${dep_name} → ${updates[0].new_version}...`); // ❌ updates might be empty -``` -**Fix**: Check `updates.length > 0` before accessing - -**src/lib/multi_repo_publisher.ts** - Various pkg_name uses (NOT in loop) (11 errors) -These errors are ONLY for uses of `pkg_name` NOT in the main loop. The loop assignment was fixed, but verify all downstream uses are safe. - -### Unvalidated Preflight Checks (4 errors) - Build validation - -**src/lib/preflight_checks.ts:151-158** - Build repo array access -```typescript -const repo = repos_to_build[i]; // ✅ FIXED - was in loop -``` -Already fixed. - ---- - -## ✅ ALL SAFE CASES - FULLY FIXED - -### Version String Splits (Always 3+ parts) - 5 errors ✅ - -**src/lib/version_utils.ts** -- Line 92: `major! === 0` ✅ -- Lines 113-114: `new_parts[0]!`, `old_parts[0]!`, etc. ✅ -- Lines 143-147: `major!`, `minor!`, `patch!` ✅ - -**src/lib/test_helpers.ts** -- Line 131: `${major!}.${minor!}.${patch! + 1}` ✅ - -### Loop Iteration (i < array.length) - 2 errors ✅ - -**src/lib/preflight_checks.ts** -- Line 150: `repos_to_build[i]!` ✅ - -**src/lib/multi_repo_publisher.ts** -- Line 103: `order[i]!` (fixes all 11 uses of pkg_name downstream) ✅ - -### Validated Length Access - 1 error ✅ - -**src/lib/preflight_checks.ts** -- Line 173: `repos[0]!.repo_dir` (after `repos.length > 0` check) ✅ - -### Test Expectations with Length Validation - 8 errors ✅ - -**src/lib/multi_repo_publisher.test.ts** -- Line 51-54: `published[0]!`, `published[1]!` (after `.toBe(2)`) ✅ -- Line 96: `failed[0]!` (after `.toBe(1)`) ✅ -- Line 183: `published[0]!` (after `.toBe(1)`) ✅ - -**src/lib/dependency_updater.test.ts** -- Lines 576-577: `failed[0]!` x2 (after `.toHaveLength(1)`) ✅ - -**src/lib/dependency_graph.test.ts** -- Line 306: `orders[0]!` x2 (loop guarantees non-empty) ✅ - -**src/lib/fixtures/check.test.ts** -- Line 372: `fixture_to_local_repos(basic_publishing)[0]!` ✅ -- Line 399: `version_changes[0]!` (after `.length > 0` check) ✅ - -**src/lib/changeset_generator.test.ts** -- Line 209: `updates[0]!` (after `.toHaveLength(1)`) ✅ - -### Previously Fixed (from initial batch) - -**src/lib/semver.test.ts** -- Line 45: `ordered[i]!`, `ordered[i + 1]!` ✅ - -**src/lib/changeset_reader.test.ts** -- Lines 57, 73: `packages[0]!` ✅ - -**src/lib/multi_repo_publisher.test.ts** -- Lines 244-245: `wait_calls[0]!`, `wait_calls[1]!` ✅ - -**src/lib/npm_registry.test.ts** -- Lines 170-179: `wait_calls[0-2]!` x5 ✅ - ---- - -**TOTAL SAFE CASES FIXED: 31 errors** - -## 📊 Final Status - -| Category | Count | Status | -|----------|-------|--------| -| **✅ Safe to Assert with !** | **31** | **FULLY FIXED** | -| ❌ **Unsafe - Need Proper Handling** | **31** | **PENDING** | - -### Progress: 31/62 TypeScript errors fixed (50%) - -**Note**: 25 additional errors are Logger type mismatches (dependency version issue), not index access issues. - -## 🔧 Next Steps - -1. **Regex match arrays** - Add null/existence checks before accessing capture groups -2. **Object property access** - Handle undefined in return statements -3. **Unvalidated array access** - Add length validation or use optional chaining - -## 📝 Implementation Notes - -- All safe cases (31 errors) have been fixed with `!` assertions -- Remaining 31 errors require proper error handling (not just assertions) -- 25 Logger errors are a separate dependency version issue (not index access) From 59dbff0193b850810a42c5032d9469784855900b Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 10 Nov 2025 15:06:39 -0500 Subject: [PATCH 08/41] wip --- README.md | 1 + svelte.config.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 54af4594..ac99c4b4 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ fuz_gitops is alternative to the monorepo pattern that more loosely couples repo With fuz_gitops you can: +- dynamically compose repos - fetch metadata about collections of repos and import it as typesafe JSON (using [Gro's public package patterns](https://github.com/ryanatkn/gro/blob/main/src/docs/gro_plugin_sveltekit_app.md#well_known_package_json)) - publish a generated docs website for your collections of repos diff --git a/svelte.config.js b/svelte.config.js index 3b10d6b6..be9346a2 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -10,7 +10,7 @@ export default { vitePlugin: {inspector: true}, kit: { adapter: adapter(), - paths: {relative: false}, // use root-absolute paths: https://kit.svelte.dev/docs/configuration#paths + paths: {relative: false}, // use root-absolute paths for SSR path comparison: https://kit.svelte.dev/docs/configuration#paths alias: {$routes: 'src/routes'}, csp: { directives: create_csp_directives({ From d51c69448a8548d05a7b4aa76c18f39768dbe58c Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 10 Nov 2025 15:41:14 -0500 Subject: [PATCH 09/41] wip --- src/lib/Repos_Tree.svelte | 3 --- src/lib/Repos_Tree_Nav.svelte | 3 --- src/lib/changeset_generator.ts | 6 ------ src/lib/changeset_reader.ts | 9 +-------- src/lib/constants.ts | 4 ---- src/lib/dependency_graph.ts | 20 +------------------- src/lib/dependency_updater.ts | 9 --------- src/lib/fetch_repo_data.ts | 3 --- src/lib/fs_fetch_value_cache.ts | 2 +- src/lib/git_operations.ts | 9 --------- src/lib/graph_validation.ts | 13 +++++-------- src/lib/multi_repo_publisher.ts | 6 ------ src/lib/npm_registry.ts | 6 ------ src/lib/output_helpers.ts | 32 ++------------------------------ src/lib/semver.ts | 3 --- src/lib/version_utils.ts | 16 ---------------- 16 files changed, 10 insertions(+), 134 deletions(-) diff --git a/src/lib/Repos_Tree.svelte b/src/lib/Repos_Tree.svelte index 5ab3fae9..488bc679 100644 --- a/src/lib/Repos_Tree.svelte +++ b/src/lib/Repos_Tree.svelte @@ -10,9 +10,6 @@ interface Props { repos: Array; - /** - * The selected package, if any. - */ selected_repo?: Repo | undefined; nav: Snippet; } diff --git a/src/lib/Repos_Tree_Nav.svelte b/src/lib/Repos_Tree_Nav.svelte index 9c407096..2f2d6670 100644 --- a/src/lib/Repos_Tree_Nav.svelte +++ b/src/lib/Repos_Tree_Nav.svelte @@ -6,9 +6,6 @@ interface Props { repos: Array; - /** - * The selected package, if any. - */ selected_repo?: Repo; children: Snippet; } diff --git a/src/lib/changeset_generator.ts b/src/lib/changeset_generator.ts index 9e07ad56..8dde8bb3 100644 --- a/src/lib/changeset_generator.ts +++ b/src/lib/changeset_generator.ts @@ -76,9 +76,6 @@ const calculate_required_bump = ( return 'patch'; }; -/** - * Generates the content of a changeset file. - */ export const generate_changeset_content = ( package_name: string, updates: Array, @@ -123,9 +120,6 @@ export const generate_changeset_content = ( return lines.join('\n'); }; -/** - * Creates Dependency_Update objects from published versions. - */ export const create_dependency_updates = ( dependencies: Map, published_versions: Map, diff --git a/src/lib/changeset_reader.ts b/src/lib/changeset_reader.ts index ac493e1c..a79bd9e7 100644 --- a/src/lib/changeset_reader.ts +++ b/src/lib/changeset_reader.ts @@ -63,9 +63,6 @@ export const parse_changeset_content = ( }; }; -/** - * Parses a changeset file's frontmatter using regexps. - */ export const parse_changeset_file = async ( filepath: string, log?: Logger, @@ -87,9 +84,6 @@ export const parse_changeset_file = async ( } }; -/** - * Reads all changesets for a repo. - */ export const read_changesets = async ( repo: Local_Repo, log?: Logger, @@ -118,8 +112,7 @@ export const read_changesets = async ( }; /** - * Determines the next version bump type based on changesets. - * Returns the highest bump type found (major > minor > patch). + * Returns the highest bump type found across all changesets (major > minor > patch). */ export const determine_bump_from_changesets = ( changesets: Array, diff --git a/src/lib/constants.ts b/src/lib/constants.ts index c20d5cf8..9b95d751 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -1,7 +1,3 @@ -/** - * Shared constants for gitops publishing. - */ - /** * Maximum number of iterations for fixed-point iteration during publishing. * Used in both plan generation and actual publishing to resolve transitive dependency cascades. diff --git a/src/lib/dependency_graph.ts b/src/lib/dependency_graph.ts index 0e8f717e..7bce30ec 100644 --- a/src/lib/dependency_graph.ts +++ b/src/lib/dependency_graph.ts @@ -1,10 +1,6 @@ import type {Local_Repo} from '$lib/local_repo.js'; import {EMPTY_OBJECT} from '@ryanatkn/belt/object.js'; -/** - * Shared types and constants for dependency management - */ - export const DEPENDENCY_TYPE = { PROD: 'prod', PEER: 'peer', @@ -48,10 +44,6 @@ export class Dependency_Graph { this.edges = new Map(); } - /** - * Initializes the graph from a list of repos. - * This is now a public method to be called by the builder. - */ public init_from_repos(repos: Array): void { // First pass: create nodes for (const repo of repos) { @@ -117,9 +109,7 @@ export class Dependency_Graph { } /** - * Performs topological sort to determine publishing order. - * Returns array of package names in the order they should be published. - * @param exclude_dev - If true, excludes dev dependencies from the sort + * @param exclude_dev if true, excludes dev dependencies from the sort */ topological_sort(exclude_dev = false): Array { const visited: Set = new Set(); @@ -192,10 +182,6 @@ export class Dependency_Graph { return result; } - /** - * Detects cycles in the dependency graph. - * Returns array of cycles, where each cycle is an array of package names. - */ detect_cycles(): Array> { const cycles: Array> = []; const visited: Set = new Set(); @@ -356,7 +342,6 @@ export class Dependency_Graph { /** * Builder for creating and analyzing dependency graphs. - * This is now the single entry point for building graphs. */ export class Dependency_Graph_Builder { build_from_repos(repos: Array): Dependency_Graph { @@ -373,9 +358,6 @@ export class Dependency_Graph_Builder { return graph.topological_sort(true); // Exclude dev dependencies } - /** - * Analyzes the graph for potential issues. - */ analyze(graph: Dependency_Graph): { production_cycles: Array>; dev_cycles: Array>; diff --git a/src/lib/dependency_updater.ts b/src/lib/dependency_updater.ts index 8c1c228c..8fd65f09 100644 --- a/src/lib/dependency_updater.ts +++ b/src/lib/dependency_updater.ts @@ -13,9 +13,6 @@ import {default_git_operations, default_fs_operations} from '$lib/operations_def export type Version_Strategy = 'exact' | 'caret' | 'tilde'; -/** - * Updates dependencies in a repo's package.json file and creates a changeset. - */ export const update_package_json = async ( repo: Local_Repo, updates: Map, @@ -148,9 +145,6 @@ export const update_package_json = async ( } }; -/** - * Updates all dependencies across multiple repos. - */ export const update_all_repos = async ( repos: Array, published: Map, @@ -209,9 +203,6 @@ export const update_all_repos = async ( return {updated: updated_count, failed}; }; -/** - * Gets dependencies that need updating for a repo. - */ export const find_updates_needed = ( repo: Local_Repo, published: Map, diff --git a/src/lib/fetch_repo_data.ts b/src/lib/fetch_repo_data.ts index d45fc30f..92373e18 100644 --- a/src/lib/fetch_repo_data.ts +++ b/src/lib/fetch_repo_data.ts @@ -8,9 +8,6 @@ import type {Local_Repo} from '$lib/local_repo.js'; /* eslint-disable no-await-in-loop */ -/** - * Fetches repo data from the web. - */ export const fetch_repo_data = async ( resolved_repos: Array, token?: string, diff --git a/src/lib/fs_fetch_value_cache.ts b/src/lib/fs_fetch_value_cache.ts index 55da1310..da7a11dd 100644 --- a/src/lib/fs_fetch_value_cache.ts +++ b/src/lib/fs_fetch_value_cache.ts @@ -11,7 +11,7 @@ export interface Fetch_Cache { name: string; data: Fetch_Value_Cache; // TODO probably expose an API for this instead of passing the map directly /** - * @returns a boolean indicating if anything changed, returns `false` if it was a no-op + * @returns true if anything changed, false if no-op */ save: () => Promise; } diff --git a/src/lib/git_operations.ts b/src/lib/git_operations.ts index daad9c6a..8bc06e51 100644 --- a/src/lib/git_operations.ts +++ b/src/lib/git_operations.ts @@ -76,9 +76,6 @@ export const git_push_tag = async ( } }; -/** - * Returns true if there are any uncommitted changes. - */ export const git_has_changes = async (options?: SpawnOptions): Promise => { const {stdout} = await spawn_out('git', ['status', '--porcelain'], options); return stdout ? stdout.trim().length > 0 : false; @@ -97,9 +94,6 @@ export const git_get_changed_files = async (options?: SpawnOptions): Promise, diff --git a/src/lib/multi_repo_publisher.ts b/src/lib/multi_repo_publisher.ts index bb634198..ba88189e 100644 --- a/src/lib/multi_repo_publisher.ts +++ b/src/lib/multi_repo_publisher.ts @@ -42,9 +42,6 @@ export interface Publishing_Result { duration: number; } -/** - * Publishes multiple repositories in dependency order. - */ export const publish_repos = async ( repos: Array, options: Publishing_Options, @@ -375,9 +372,6 @@ export const publish_repos = async ( }; }; -/** - * Publishes a single repository. - */ const publish_single_repo = async ( repo: Local_Repo, options: Publishing_Options, diff --git a/src/lib/npm_registry.ts b/src/lib/npm_registry.ts index 5c55a070..186e55a2 100644 --- a/src/lib/npm_registry.ts +++ b/src/lib/npm_registry.ts @@ -15,9 +15,6 @@ export interface Package_Info { version: string; } -/** - * Checks if a specific package version is available on NPM. - */ export const check_package_available = async ( pkg: string, version: string, @@ -114,9 +111,6 @@ export const get_package_info = async (pkg: string, log?: Logger): Promise => { const info = await get_package_info(pkg, log); return info !== null; diff --git a/src/lib/output_helpers.ts b/src/lib/output_helpers.ts index 57f6db51..2d49d054 100644 --- a/src/lib/output_helpers.ts +++ b/src/lib/output_helpers.ts @@ -1,53 +1,25 @@ -/** - * Output formatting utilities for tasks. - * Provides consistent handling of stdout/json/markdown output and file writing. - */ - import type {Logger} from '@ryanatkn/belt/log.js'; import {writeFile} from 'node:fs/promises'; -/** - * Output format options - */ export type Output_Format = 'stdout' | 'json' | 'markdown'; -/** - * Options for formatting and outputting data - */ export interface Output_Options { format: Output_Format; outfile?: string; log?: Logger; } -/** - * Formatters for different output formats - */ export interface Output_Formatters { - /** - * Format data as JSON string - */ json: (data: T) => string; - - /** - * Format data as markdown lines - */ markdown: (data: T) => Array; - /** - * Format data to stdout using logger - * This function should call log methods directly for colored/styled output + * This function should call log methods directly for colored/styled output. */ stdout: (data: T, log: Logger) => void; } /** - * Formats and outputs data based on the specified format and options. - * - * @param data - The data to format and output - * @param formatters - Format-specific formatter functions - * @param options - Output options (format, outfile, log) - * @throws Error if stdout format is used with outfile option + * @throws if stdout format is used with outfile option */ export const format_and_output = async ( data: T, diff --git a/src/lib/semver.ts b/src/lib/semver.ts index 5ccb7c9d..0bd6a6ad 100644 --- a/src/lib/semver.ts +++ b/src/lib/semver.ts @@ -43,9 +43,6 @@ const semver_parse = (version: string): Semver => { }; }; -/** - * Converts a semver object back to string. - */ const semver_to_string = (semver: Semver): string => { let version = `${semver.major}.${semver.minor}.${semver.patch}`; if (semver.prerelease) { diff --git a/src/lib/version_utils.ts b/src/lib/version_utils.ts index ef6a30af..5b24e2af 100644 --- a/src/lib/version_utils.ts +++ b/src/lib/version_utils.ts @@ -1,12 +1,5 @@ import type {Bump_Type} from '$lib/semver.js'; -/** - * Version utility functions for handling semver strings and comparisons. - */ - -/** - * Checks if a version string is a wildcard. - */ export const is_wildcard = (version: string): boolean => { return version === '*'; }; @@ -42,9 +35,6 @@ export const normalize_version_for_comparison = (version: string): string => { return strip_version_prefix(version); }; -/** - * Determines if a dependency needs to be updated. - */ export const needs_update = (current: string, new_version: string): boolean => { // Always update wildcards if (is_wildcard(current)) return true; @@ -100,9 +90,6 @@ export const is_breaking_change = ( } }; -/** - * Detects the bump type by comparing two version strings. - */ export const detect_bump_type = ( old_version: string, new_version: string, @@ -127,9 +114,6 @@ export const compare_bump_types = (a: Bump_Type, b: Bump_Type): number => { return order[a] - order[b]; }; -/** - * Calculates the next version based on current version and bump type. - */ export const calculate_next_version = (current_version: string, bump_type: Bump_Type): string => { const parts = current_version.split('.').map(Number); if (parts.length !== 3 || parts.some((p) => Number.isNaN(p))) { From 8a9d17297cec735ce9d05fba5f45790058988f49 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 10 Nov 2025 15:49:00 -0500 Subject: [PATCH 10/41] wip --- package-lock.json | 110 +++++++++++++++++------------------------- package.json | 14 +++--- src/lib/operations.ts | 22 +++++---- 3 files changed, 64 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index c826a6e8..1f5fdac6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,11 +10,11 @@ "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.36.0", - "@ryanatkn/eslint-config": "^0.8.0", - "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.171.0", - "@ryanatkn/moss": "^0.36.2", + "@ryanatkn/belt": "^0.36.1", + "@ryanatkn/eslint-config": "^0.8.1", + "@ryanatkn/fuz": "^0.148.0", + "@ryanatkn/gro": "^0.172.0", + "@ryanatkn/moss": "^0.36.3", "@sveltejs/adapter-static": "^3.0.9", "@sveltejs/kit": "^2.37.1", "@sveltejs/package": "^2.5.0", @@ -39,8 +39,8 @@ }, "peerDependencies": { "@ryanatkn/belt": "^0.36.0", - "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.171.0", + "@ryanatkn/fuz": "^0.148.0", + "@ryanatkn/gro": "^0.172.0", "@ryanatkn/moss": "^0.36.2", "@sveltejs/kit": "^2", "svelte": "^5", @@ -1414,9 +1414,9 @@ ] }, "node_modules/@ryanatkn/belt": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.36.0.tgz", - "integrity": "sha512-vDrXo3Okyld8lF5GztLt+/hA/L1zobxOibXWcuzfJTcinQsmRp0VWGehPyAiasT1xasx4Vsbvs2BY8pS74b8Uw==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.36.1.tgz", + "integrity": "sha512-9dGENdfE+Yq1rdCzCKVIVJbvOodL+TYU1liJpmjoov/b7WrvdaaJWSTw4cif6VkyWmNv4LLP8ULpeHk6SHEWZA==", "dev": true, "license": "MIT", "engines": { @@ -1443,9 +1443,9 @@ } }, "node_modules/@ryanatkn/eslint-config": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/eslint-config/-/eslint-config-0.8.0.tgz", - "integrity": "sha512-n+jY9N9Lgl1AaOA3fDc0VotTSFdhRjX7FE3USUESwvAiYzpSq8+31wpbvW7IasIKgjdgFfhR0bhGeREnBLBN0g==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@ryanatkn/eslint-config/-/eslint-config-0.8.1.tgz", + "integrity": "sha512-GRjGFhu6scntmM0KRbHTV2bwfTfdT/IVH96aagic0fuL4T/gWCGbjl+AwpRIot4Y08o1Q90p7WXF72z/+m9dGw==", "dev": true, "license": "Unlicense", "dependencies": { @@ -1464,9 +1464,9 @@ } }, "node_modules/@ryanatkn/fuz": { - "version": "0.147.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.147.0.tgz", - "integrity": "sha512-GybMu3Yzm9xp4epsROwMHq9izUOtHHCZL2hi2+Nv5pPRtM6GnAvFh7PRmDH995bKe/NvIbwiHqfdd9gkrA1UAg==", + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.148.0.tgz", + "integrity": "sha512-ysmg9X84vKyoakCmJmQYKQhUty17cWcx65wojQQ8iOLE7c+GdI/LgWLhVRLRyVF06NBnkLga5WR3sawPJD/HUg==", "dev": true, "license": "MIT", "engines": { @@ -1476,12 +1476,14 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@ryanatkn/belt": "*", - "@ryanatkn/gro": ">=0.165.0", - "@ryanatkn/moss": "*", - "@sveltejs/kit": "^2.26", + "@ryanatkn/belt": "^0.36.1", + "@ryanatkn/gro": "^0.171.0", + "@ryanatkn/moss": "^0.36.3", + "@sveltejs/kit": "^2.47.3", "esm-env": "^1", - "svelte": "^5" + "svelte": "^5", + "svelte2tsx": "^0.7.45", + "zod": "^4.1.12" }, "peerDependenciesMeta": { "@ryanatkn/gro": { @@ -1493,9 +1495,9 @@ } }, "node_modules/@ryanatkn/gro": { - "version": "0.171.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.171.0.tgz", - "integrity": "sha512-t6NHS60Ef3obhBJH6fv2ktvpo+U06t3tykM7TaAlbPaA7Mr+Uo36f7Sk3vZzJ5yxrtb7gj4fxpI2Xwldt1jLJg==", + "version": "0.172.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.172.0.tgz", + "integrity": "sha512-CdkPV4KVs5hqse7i7pA16koAPLR61rx+Ha33vbQ9eEyn5skEa4NvC1BwVGv5TYjQtH9qoXn5GsK224kff9wQFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1540,9 +1542,9 @@ } }, "node_modules/@ryanatkn/moss": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@ryanatkn/moss/-/moss-0.36.2.tgz", - "integrity": "sha512-FOH4k2OmBbHjwYK3mVAsaAEDsjmPoLIs0pssikLselpeEIHmEtZ60b1OzElknYiN6Zo+MWEksDViGIN5xpvU+g==", + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/@ryanatkn/moss/-/moss-0.36.3.tgz", + "integrity": "sha512-Q0ta4ClWqV3LV5BW0vic8IBBRqC5mXNG/zKdoxPov7Gg6ho6DuP5BTLXPZP2NeU5BSsyShQ9pi7Q3aAhYtTBqg==", "dev": true, "license": "MIT", "engines": { @@ -1580,9 +1582,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.37.1", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.37.1.tgz", - "integrity": "sha512-4T9rF2Roe7RGvHfcn6+n92Yc2NF88k7ljFz9+wE0jWxyencqRpadr2/CvlcQbbTXf1ozmFxgMO6af+qm+1mPFw==", + "version": "2.48.4", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.48.4.tgz", + "integrity": "sha512-TGFX1pZUt9qqY20Cv5NyYvy0iLWHf2jXi8s+eCGsig7jQMdwZWKUFMR6TbvFNhfDSUpc1sH/Y5EHv20g3HHA3g==", "dev": true, "license": "MIT", "dependencies": { @@ -3168,16 +3170,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/magic-string": { "version": "0.30.18", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", @@ -3291,17 +3283,6 @@ "dev": true, "license": "MIT" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3398,17 +3379,6 @@ "node": ">=6" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3784,6 +3754,13 @@ "node": ">=6" } }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -3992,14 +3969,15 @@ } }, "node_modules/svelte2tsx": { - "version": "0.7.42", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.42.tgz", - "integrity": "sha512-PSNrKS16aVdAajoFjpF5M0t6TA7ha7GcKbBajD9RG3M+vooAuvLnWAGUSC6eJL4zEOVbOWKtcS2BuY4rxPljoA==", + "version": "0.7.45", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.45.tgz", + "integrity": "sha512-cSci+mYGygYBHIZLHlm/jYlEc1acjAHqaQaDFHdEBpUueM9kSTnPpvPtSl5VkJOU1qSJ7h1K+6F/LIUYiqC8VA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "dedent-js": "^1.0.1", - "pascal-case": "^3.1.1" + "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", diff --git a/package.json b/package.json index d3786a92..2a9d43ce 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ }, "peerDependencies": { "@ryanatkn/belt": "^0.36.0", - "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.171.0", + "@ryanatkn/fuz": "^0.148.0", + "@ryanatkn/gro": "^0.172.0", "@ryanatkn/moss": "^0.36.2", "@sveltejs/kit": "^2", "svelte": "^5", @@ -40,11 +40,11 @@ }, "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.36.0", - "@ryanatkn/eslint-config": "^0.8.0", - "@ryanatkn/fuz": "^0.147.0", - "@ryanatkn/gro": "^0.171.0", - "@ryanatkn/moss": "^0.36.2", + "@ryanatkn/belt": "^0.36.1", + "@ryanatkn/eslint-config": "^0.8.1", + "@ryanatkn/fuz": "^0.148.0", + "@ryanatkn/gro": "^0.172.0", + "@ryanatkn/moss": "^0.36.3", "@sveltejs/adapter-static": "^3.0.9", "@sveltejs/kit": "^2.37.1", "@sveltejs/package": "^2.5.0", diff --git a/src/lib/operations.ts b/src/lib/operations.ts index bbd8b4b7..5d3b89aa 100644 --- a/src/lib/operations.ts +++ b/src/lib/operations.ts @@ -41,7 +41,7 @@ import type {Bump_Type} from '$lib/semver.js'; import type {Preflight_Options, Preflight_Result} from '$lib/preflight_checks.js'; /** - * Operations for working with changesets + * Changeset operations for reading and predicting versions from `.changeset/*.md` files. */ export interface Changeset_Operations { /** @@ -73,7 +73,8 @@ export interface Changeset_Operations { } /** - * Operations for git commands + * Git operations for branch management, commits, tags, and workspace state. + * All operations return `Result` instead of throwing errors. */ export interface Git_Operations { /** @@ -203,7 +204,7 @@ export interface Git_Operations { } /** - * Operations for spawning processes + * Process spawning operations for running shell commands. */ export interface Process_Operations { /** @@ -217,7 +218,7 @@ export interface Process_Operations { } /** - * Operations for building packages + * Build operations for validating packages compile before publishing. */ export interface Build_Operations { /** @@ -230,7 +231,7 @@ export interface Build_Operations { } /** - * Options for waiting for NPM packages + * Configuration for exponential backoff when waiting for NPM package availability. */ export interface Wait_Options { max_attempts?: number; @@ -240,7 +241,8 @@ export interface Wait_Options { } /** - * Operations for NPM registry + * NPM registry operations for package availability checks and authentication. + * Includes exponential backoff for waiting on package propagation. */ export interface Npm_Operations { /** @@ -288,7 +290,8 @@ export interface Npm_Operations { } /** - * Operations for preflight checks + * Preflight validation operations to ensure repos are ready for publishing. + * Validates workspace state, branches, builds, and npm authentication. */ export interface Preflight_Operations { /** @@ -305,7 +308,7 @@ export interface Preflight_Operations { } /** - * Operations for file system access + * File system operations for reading and writing files. */ export interface Fs_Operations { /** @@ -326,7 +329,8 @@ export interface Fs_Operations { } /** - * Combined operations for all gitops functionality + * Combined operations interface grouping all gitops functionality. + * This is the main interface injected into publishing and validation workflows. */ export interface Gitops_Operations { changeset: Changeset_Operations; From fe54da179656ace497ae7730c2cbe3a9a284a005 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 10 Nov 2025 16:00:31 -0500 Subject: [PATCH 11/41] wip --- src/lib/gitops_plan.task.ts | 6 ------ src/lib/gitops_publish.task.ts | 6 ------ src/lib/gitops_task_helpers.ts | 3 --- src/lib/operations_defaults.ts | 25 ------------------------- src/lib/preflight_checks.ts | 3 --- src/lib/publishing_plan.ts | 6 ------ src/lib/resolved_gitops_config.ts | 3 --- 7 files changed, 52 deletions(-) diff --git a/src/lib/gitops_plan.task.ts b/src/lib/gitops_plan.task.ts index e55b06ff..8e9ce0bb 100644 --- a/src/lib/gitops_plan.task.ts +++ b/src/lib/gitops_plan.task.ts @@ -73,9 +73,6 @@ export const task: Task = { }, }; -/** - * Create formatters for publishing plan output - */ const create_plan_formatters = (): Output_Formatters => ({ json: (plan) => { const output = { @@ -93,9 +90,6 @@ const create_plan_formatters = (): Output_Formatters => ({ stdout: (plan, log) => log_publishing_plan(plan, log), }); -/** - * Format the publishing plan as markdown. - */ const format_plan_as_markdown = (plan: Publishing_Plan): Array => { const lines: Array = []; const { diff --git a/src/lib/gitops_publish.task.ts b/src/lib/gitops_publish.task.ts index b4024acb..6ffab08c 100644 --- a/src/lib/gitops_publish.task.ts +++ b/src/lib/gitops_publish.task.ts @@ -142,17 +142,11 @@ export const task: Task = { }, }; -/** - * Data type for publishing result output - */ interface Publish_Result_Data { result: Publishing_Result; fatal_error: Error | null; } -/** - * Create formatters for publishing result output - */ const create_publish_formatters = (): Output_Formatters => ({ json: (data) => JSON.stringify(data.result, null, 2), markdown: (data) => format_result_markdown(data.result, data.fatal_error), diff --git a/src/lib/gitops_task_helpers.ts b/src/lib/gitops_task_helpers.ts index c136ec20..26ce09ab 100644 --- a/src/lib/gitops_task_helpers.ts +++ b/src/lib/gitops_task_helpers.ts @@ -19,9 +19,6 @@ export interface Get_Gitops_Ready_Options { npm_ops?: Npm_Operations; } -/** - * Readies the workspace for all gitops repos. - */ export const get_gitops_ready = async ( options: Get_Gitops_Ready_Options, ): Promise<{ diff --git a/src/lib/operations_defaults.ts b/src/lib/operations_defaults.ts index d51c8c7b..c6bbb5de 100644 --- a/src/lib/operations_defaults.ts +++ b/src/lib/operations_defaults.ts @@ -1,7 +1,3 @@ -/** - * Default implementations of operations interfaces - */ - import {spawn, spawn_out} from '@ryanatkn/belt/process.js'; import {readFile, writeFile} from 'node:fs/promises'; import {git_checkout, type Git_Branch, type Git_Origin} from '@ryanatkn/belt/git.js'; @@ -38,9 +34,6 @@ import type { Gitops_Operations, } from '$lib/operations.js'; -/** - * Default changeset operations using actual file system. - */ export const default_changeset_operations: Changeset_Operations = { has_changesets: async (options) => { const {repo} = options; @@ -77,9 +70,6 @@ export const default_changeset_operations: Changeset_Operations = { }, }; -/** - * Default git operations using actual git commands. - */ export const default_git_operations: Git_Operations = { // Core git info current_branch_name: async (options) => { @@ -263,9 +253,6 @@ export const default_git_operations: Git_Operations = { }, }; -/** - * Default process operations using actual spawn. - */ export const default_process_operations: Process_Operations = { spawn: async (options) => { const {cmd, args, spawn_options} = options; @@ -290,9 +277,6 @@ export const default_process_operations: Process_Operations = { }, }; -/** - * Default NPM operations using actual registry. - */ export const default_npm_operations: Npm_Operations = { wait_for_package: async (options) => { const {pkg, version, wait_options, log} = options; @@ -369,18 +353,12 @@ export const default_npm_operations: Npm_Operations = { }, }; -/** - * Default preflight operations. - */ export const default_preflight_operations: Preflight_Operations = { run_preflight_checks: async (options) => { return run_preflight_checks(options); }, }; -/** - * Default file system operations using Node's fs. - */ export const default_fs_operations: Fs_Operations = { readFile: async (options) => { const {path, encoding} = options; @@ -403,9 +381,6 @@ export const default_fs_operations: Fs_Operations = { }, }; -/** - * Default build operations using gro build. - */ export const default_build_operations: Build_Operations = { build_package: async (options) => { const {repo, log} = options; diff --git a/src/lib/preflight_checks.ts b/src/lib/preflight_checks.ts index 1399b160..835fc49f 100644 --- a/src/lib/preflight_checks.ts +++ b/src/lib/preflight_checks.ts @@ -240,9 +240,6 @@ export const run_preflight_checks = async ({ }; }; -/** - * Checks if git remote is reachable. - */ const check_git_remote = async (cwd: string): Promise> => { try { // Try to fetch refs from remote without downloading objects diff --git a/src/lib/publishing_plan.ts b/src/lib/publishing_plan.ts index c5c3827f..ed2df494 100644 --- a/src/lib/publishing_plan.ts +++ b/src/lib/publishing_plan.ts @@ -446,9 +446,6 @@ export const generate_publishing_plan = async ( }; }; -/** - * Helper to log a group of version changes with consistent formatting. - */ const log_version_change_group = ( changes: Array, header: string, @@ -469,9 +466,6 @@ const log_version_change_group = ( } }; -/** - * Formats and logs the publishing plan for user review. - */ export const log_publishing_plan = (plan: Publishing_Plan, log: Logger): void => { const { publishing_order, diff --git a/src/lib/resolved_gitops_config.ts b/src/lib/resolved_gitops_config.ts index 11899052..0c41011e 100644 --- a/src/lib/resolved_gitops_config.ts +++ b/src/lib/resolved_gitops_config.ts @@ -12,9 +12,6 @@ export interface Resolved_Gitops_Config { unresolved_local_repos: Array | null; } -/** - * Resolves repo data locally on the filesystem. - */ export const resolve_gitops_config = ( gitops_config: Gitops_Config, repos_dir: string, From d4c22e296ac83688656f2b5f4caf182d772d41c0 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 10 Nov 2025 16:17:20 -0500 Subject: [PATCH 12/41] wip --- src/lib/changeset_generator.ts | 16 +++++++++---- src/lib/changeset_reader.ts | 41 +++++++++++++++++++++++++++------ src/lib/dependency_graph.ts | 40 ++++++++++++++++++++++++++++---- src/lib/dependency_updater.ts | 16 +++++++++++++ src/lib/local_repo.ts | 16 +++++++++++-- src/lib/multi_repo_publisher.ts | 9 ++++++++ src/lib/npm_registry.ts | 21 +++++++++++++++-- src/lib/output_helpers.ts | 9 +++++++- src/lib/preflight_checks.ts | 17 ++++++++++++-- src/lib/publishing_plan.ts | 8 ------- src/lib/version_utils.ts | 21 ++++++++++++++--- 11 files changed, 180 insertions(+), 34 deletions(-) diff --git a/src/lib/changeset_generator.ts b/src/lib/changeset_generator.ts index 8dde8bb3..6c7f81ab 100644 --- a/src/lib/changeset_generator.ts +++ b/src/lib/changeset_generator.ts @@ -50,10 +50,6 @@ export const create_changeset_for_dependency_updates = async ( return filepath; }; -/** - * Calculates the required bump type based on dependency updates. - * Breaking changes propagate up the dependency tree. - */ const calculate_required_bump = ( repo: Local_Repo, updates: Array, @@ -76,6 +72,18 @@ const calculate_required_bump = ( return 'patch'; }; +/** + * Generates markdown changeset content for dependency updates. + * + * Creates properly formatted changeset with YAML frontmatter, summary, + * and categorized list of breaking vs regular updates. Output format + * matches changesets CLI for consistency. + * + * @param package_name package receiving the dependency updates + * @param updates list of dependency changes with version info + * @param bump_type required bump type (calculated from breaking changes) + * @returns markdown content ready to write to .changeset/*.md file + */ export const generate_changeset_content = ( package_name: string, updates: Array, diff --git a/src/lib/changeset_reader.ts b/src/lib/changeset_reader.ts index a79bd9e7..cbbcf11e 100644 --- a/src/lib/changeset_reader.ts +++ b/src/lib/changeset_reader.ts @@ -14,14 +14,23 @@ export interface Changeset_Info { } /** - * Parses changeset content string (pure function for testing). - * Format: + * Parses changeset content string from markdown format. + * + * Pure function for testability - no file I/O, just string parsing. + * Extracts package names, bump types, and summary from YAML frontmatter format. + * Returns null if format is invalid or no packages found. + * + * Expected format: * --- * "package-name": patch * "@scope/package": minor * --- * * Summary of changes + * + * @param content changeset markdown with YAML frontmatter + * @param filename optional filename for error reporting context + * @returns parsed changeset info or null if invalid format */ export const parse_changeset_content = ( content: string, @@ -112,7 +121,13 @@ export const read_changesets = async ( }; /** - * Returns the highest bump type found across all changesets (major > minor > patch). + * Determines the bump type for a package from its changesets. + * + * When multiple changesets exist for the same package, returns the highest + * bump type (major > minor > patch) to ensure the most significant change + * is reflected in the version bump. + * + * @returns the highest bump type, or null if package has no changesets */ export const determine_bump_from_changesets = ( changesets: Array, @@ -134,8 +149,13 @@ export const determine_bump_from_changesets = ( }; /** - * Detects if a repo has changesets. - * Used by preflight checks and publishing to determine if a repo needs publishing. + * Checks if a repo has any changeset files (excluding README.md). + * + * Used by preflight checks and publishing workflow to determine which packages + * need to be published. Returns false if .changeset directory doesn't exist + * or contains only README.md. + * + * @returns true if repo has unpublished changesets */ export const has_changesets = async (repo: Local_Repo): Promise => { const changesets_dir = join(repo.repo_dir, '.changeset'); @@ -153,8 +173,15 @@ export const has_changesets = async (repo: Local_Repo): Promise => { }; /** - * Predicts the next version for a repo based on its changesets. - * This enables accurate dry_run mode. + * Predicts the next version by analyzing all changesets in a repo. + * + * Reads all changesets, determines the highest bump type for the package, + * and calculates the next version. Returns null if no changesets found. + * + * Critical for dry-run mode accuracy - allows simulating publishes without + * actually running `gro publish` which consumes changesets. + * + * @returns predicted version and bump type, or null if no changesets */ export const predict_next_version = async ( repo: Local_Repo, diff --git a/src/lib/dependency_graph.ts b/src/lib/dependency_graph.ts index 7bce30ec..eebd8ee2 100644 --- a/src/lib/dependency_graph.ts +++ b/src/lib/dependency_graph.ts @@ -109,7 +109,15 @@ export class Dependency_Graph { } /** - * @param exclude_dev if true, excludes dev dependencies from the sort + * Computes topological sort order for dependency graph. + * + * Uses Kahn's algorithm with alphabetical ordering within tiers for + * deterministic results. Throws if cycles detected. + * + * @param exclude_dev if true, excludes dev dependencies to break cycles. + * Publishing uses exclude_dev=true to handle circular dev deps. + * @returns array of package names in dependency order (dependencies before dependents) + * @throws {Error} if circular dependencies detected in included dependency types */ topological_sort(exclude_dev = false): Array { const visited: Set = new Set(); @@ -220,8 +228,15 @@ export class Dependency_Graph { } /** - * Detects cycles by dependency type. - * Separates production/peer cycles (errors) from dev cycles (normal). + * Detects circular dependencies, categorized by severity. + * + * Production/peer cycles prevent publishing (impossible to order packages). + * Dev cycles are normal (test utils, shared configs) and safely ignored. + * + * Uses DFS traversal with recursion stack to identify back edges. + * Deduplicates cycles using sorted cycle keys. + * + * @returns object with production_cycles (errors) and dev_cycles (info) */ detect_cycles_by_type(): { production_cycles: Array>; @@ -344,6 +359,15 @@ export class Dependency_Graph { * Builder for creating and analyzing dependency graphs. */ export class Dependency_Graph_Builder { + /** + * Constructs dependency graph from local repos. + * + * Two-pass algorithm: first creates nodes, then builds edges (dependents). + * Prioritizes prod/peer deps over dev deps when same package appears in + * multiple dependency types (stronger constraint wins). + * + * @returns fully initialized dependency graph with all nodes and edges + */ build_from_repos(repos: Array): Dependency_Graph { const graph = new Dependency_Graph(); graph.init_from_repos(repos); @@ -351,8 +375,14 @@ export class Dependency_Graph_Builder { } /** - * Returns the topologically sorted order for publishing. - * Excludes dev dependencies to avoid cycles. + * Computes publishing order using topological sort with dev deps excluded. + * + * Excludes dev dependencies to break circular dev dependency cycles while + * preserving production/peer dependency ordering. This allows patterns like + * shared test utilities that depend on each other for development. + * + * @returns package names in safe publishing order (dependencies before dependents) + * @throws {Error} if production/peer cycles detected (cannot be resolved by exclusion) */ compute_publishing_order(graph: Dependency_Graph): Array { return graph.topological_sort(true); // Exclude dev dependencies diff --git a/src/lib/dependency_updater.ts b/src/lib/dependency_updater.ts index 8fd65f09..02cc7a24 100644 --- a/src/lib/dependency_updater.ts +++ b/src/lib/dependency_updater.ts @@ -13,6 +13,22 @@ import {default_git_operations, default_fs_operations} from '$lib/operations_def export type Version_Strategy = 'exact' | 'caret' | 'tilde'; +/** + * Updates package.json dependencies and creates changeset if needed. + * + * Workflow: + * 1. Updates all dependency types (dependencies, devDependencies, peerDependencies) + * 2. Writes updated package.json with tabs formatting + * 3. Creates auto-changeset if published_versions provided (for transitive updates) + * 4. Commits both package.json and changeset with standard message + * + * Uses version strategy to determine prefix (exact, caret, tilde) while preserving + * existing prefixes when possible. + * + * @param strategy how to format version ranges (default: caret) + * @param published_versions if provided, generates auto-changesets for updates + * @throws {Error} if file operations or git operations fail + */ export const update_package_json = async ( repo: Local_Repo, updates: Map, diff --git a/src/lib/local_repo.ts b/src/lib/local_repo.ts index f990032f..43044766 100644 --- a/src/lib/local_repo.ts +++ b/src/lib/local_repo.ts @@ -41,8 +41,20 @@ export interface Unresolved_Local_Repo { } /** - * Loads the data for a resolved local repo, switching branches if needed and pulling latest changes. - * Automatically installs dependencies if package.json changed during pull. + * Loads repo data with automatic syncing and dependency management. + * + * Workflow: + * 1. Records current commit hash (for detecting changes) + * 2. Switches to target branch if needed (requires clean workspace) + * 3. Pulls latest changes from remote (skipped for local-only repos) + * 4. Validates workspace is clean after pull + * 5. Auto-installs dependencies if package.json changed + * 6. Parses package.json and extracts Pkg metadata + * + * This ensures repos are always in sync with their configured branch + * before being used by gitops commands. + * + * @throws {Task_Error} if workspace dirty, branch switch fails, or install fails */ export const load_local_repo = async ({ resolved_local_repo, diff --git a/src/lib/multi_repo_publisher.ts b/src/lib/multi_repo_publisher.ts index ba88189e..c7774eb7 100644 --- a/src/lib/multi_repo_publisher.ts +++ b/src/lib/multi_repo_publisher.ts @@ -372,6 +372,15 @@ export const publish_repos = async ( }; }; +/** + * Publishes a single repo using gro publish. + * + * Dry run mode: Predicts version from changesets without side effects. + * Real mode: Runs `gro publish --no-build` (builds already validated in preflight), + * reads new version from package.json, and returns metadata. + * + * @throws {Error} if changeset prediction fails (dry run) or publish fails (real) + */ const publish_single_repo = async ( repo: Local_Repo, options: Publishing_Options, diff --git a/src/lib/npm_registry.ts b/src/lib/npm_registry.ts index 186e55a2..c185f702 100644 --- a/src/lib/npm_registry.ts +++ b/src/lib/npm_registry.ts @@ -38,7 +38,19 @@ export const check_package_available = async ( }; /** - * Waits for a package version to become available on NPM with exponential backoff. + * Waits for package version to propagate to NPM registry. + * + * Uses exponential backoff with jitter to avoid hammering registry. + * Logs progress every 5 attempts. Respects timeout to avoid infinite waits. + * + * Critical for multi-repo publishing: ensures published packages are available + * before updating dependent packages. + * + * @param options.max_attempts max poll attempts (default 30) + * @param options.initial_delay starting delay in ms (default 1000) + * @param options.max_delay max delay between attempts (default 60000) + * @param options.timeout total timeout in ms (default 300000 = 5min) + * @throws {Error} if timeout reached or max attempts exceeded */ export const wait_for_package = async ( pkg: string, @@ -90,7 +102,12 @@ export const wait_for_package = async ( }; /** - * Gets basic package information from NPM. + * Fetches package metadata from NPM registry. + * + * Returns name and latest version. Returns null if package doesn't exist + * or registry is unreachable. + * + * @returns package info or null on error/not found */ export const get_package_info = async (pkg: string, log?: Logger): Promise => { try { diff --git a/src/lib/output_helpers.ts b/src/lib/output_helpers.ts index 2d49d054..e4ed103c 100644 --- a/src/lib/output_helpers.ts +++ b/src/lib/output_helpers.ts @@ -19,7 +19,14 @@ export interface Output_Formatters { } /** - * @throws if stdout format is used with outfile option + * Formats data and outputs to file or stdout based on options. + * + * Supports three formats: + * - stdout: Uses logger for colored/styled output (cannot use with --outfile) + * - json: Stringified JSON + * - markdown: Formatted markdown text + * + * @throws {Error} if stdout format used with outfile, or if logger missing for stdout */ export const format_and_output = async ( data: T, diff --git a/src/lib/preflight_checks.ts b/src/lib/preflight_checks.ts index 835fc49f..4ac75359 100644 --- a/src/lib/preflight_checks.ts +++ b/src/lib/preflight_checks.ts @@ -46,8 +46,21 @@ export interface Run_Preflight_Checks_Options { } /** - * Runs preflight checks for all repos before publishing. - * Validates workspaces, branches, changesets, builds, and npm auth. + * Validates all requirements before publishing can proceed. + * + * Performs comprehensive pre-flight validation: + * - Clean workspaces (100% clean required - no uncommitted changes) + * - Correct branch (usually main) + * - Changesets present (unless skip_changesets=true) + * - Builds successful (fail-fast to prevent broken state) + * - Git remote reachability + * - NPM authentication with username + * - NPM registry connectivity + * + * Build validation runs BEFORE any publishing to prevent the scenario where + * version is bumped but build fails, leaving repo in broken state. + * + * @returns result with ok=false if any errors, plus warnings and detailed status */ export const run_preflight_checks = async ({ repos, diff --git a/src/lib/publishing_plan.ts b/src/lib/publishing_plan.ts index ed2df494..8f83e16e 100644 --- a/src/lib/publishing_plan.ts +++ b/src/lib/publishing_plan.ts @@ -46,10 +46,6 @@ export interface Publishing_Plan { errors: Array; } -/** - * Calculates dependency updates for all repos based on predicted versions. - * Returns both dependency updates and breaking cascades map. - */ const calculate_dependency_updates = ( repos: Array, predicted_versions: Map, @@ -130,10 +126,6 @@ const calculate_dependency_updates = ( return {dependency_updates, breaking_cascades}; }; -/** - * Determines the required bump type based on dependency updates. - * Returns null if no bump is required, or the bump type needed. - */ const get_required_bump_for_dependencies = ( repo: Local_Repo, dependency_updates: Array, diff --git a/src/lib/version_utils.ts b/src/lib/version_utils.ts index 5b24e2af..1748139e 100644 --- a/src/lib/version_utils.ts +++ b/src/lib/version_utils.ts @@ -20,7 +20,14 @@ export const get_version_prefix = (version: string): string => { }; /** - * Normalizes a version string for comparison by removing prefixes. + * Normalizes version string for comparison. + * + * Strips prefixes (^, ~, >=) to get bare version number. + * Handles wildcards as-is. Used by needs_update to compare versions. + * + * @example normalize_version_for_comparison('^1.2.3') // '1.2.3' + * @example normalize_version_for_comparison('>=2.0.0') // '2.0.0' + * @example normalize_version_for_comparison('*') // '*' */ export const normalize_version_for_comparison = (version: string): string => { // Handle wildcards @@ -47,8 +54,16 @@ export const needs_update = (current: string, new_version: string): boolean => { }; /** - * Determines the appropriate version prefix for an update. - * If updating from wildcard, use caret. Otherwise preserve existing prefix. + * Determines version prefix to use when updating dependencies. + * + * Strategy: + * - Wildcard (*): Use caret (^) as default + * - Has existing prefix: Preserve it (^, ~, >=) + * - No prefix: Use default_strategy + * + * This preserves user intent while handling wildcard replacements sensibly. + * + * @param default_strategy prefix to use when no existing prefix found */ export const get_update_prefix = ( current_version: string, From e10d3f1a35d8ff250fc04599e57329dd85386e28 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 10 Nov 2025 16:29:29 -0500 Subject: [PATCH 13/41] wip --- CLAUDE.md | 192 ++++++++++++++++++++++---------- src/lib/changeset_generator.ts | 7 ++ src/lib/changeset_reader.ts | 7 ++ src/lib/dependency_graph.ts | 7 ++ src/lib/fetch_repo_data.ts | 13 +++ src/lib/fs_fetch_value_cache.ts | 13 +++ src/lib/gitops_config.ts | 11 ++ src/lib/gitops_task_helpers.ts | 35 ++++++ src/lib/graph_validation.ts | 13 +++ src/lib/operations_defaults.ts | 7 ++ src/lib/serialization_types.ts | 12 ++ 11 files changed, 261 insertions(+), 56 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d194f0cf..59e117f6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,7 @@ # fuz_gitops -A tool for managing many repos - alternative to monorepo pattern that loosely couples repos. +A tool for managing many repos - alternative to monorepo pattern that loosely +couples repos. ## Core functionality @@ -32,10 +33,14 @@ gitops.config.ts -> local repos -> GitHub API -> repos.ts -> UI components Publishing uses fixed-point iteration to handle transitive dependency updates: - Runs multiple passes (max 10 iterations) until convergence -- Each pass publishes packages with changesets and creates auto-changesets for dependents +- Each pass publishes packages with changesets AND creates auto-changesets for + dependents mid-iteration +- Auto-changesets trigger republishing in subsequent passes (transitive + cascades) - Stops when no new changesets are created (converged state) - Single `gro gitops_publish` command handles full dependency cascades -- If MAX_ITERATIONS reached without convergence, warns with pending package count and estimated iterations needed +- If MAX_ITERATIONS reached without convergence, warns with pending package + count and estimated iterations needed ### Dirty State on Failure (By Design) @@ -44,7 +49,8 @@ Publishing intentionally leaves the workspace dirty when failures occur: - Auto-changesets are created and committed DURING the publishing loop - If publishing fails mid-way, some packages are published, others are not - The dirty workspace state shows exactly what succeeded/failed -- This enables **natural resumption**: just fix the issue and re-run the same command +- This enables **natural resumption**: just fix the issue and re-run the same + command - Already-published packages have no changesets → skipped automatically - Failed packages still have changesets → retried automatically @@ -59,14 +65,20 @@ fuz_gitops does not support rollback of published packages: ### No Concurrent Publishing -This tool is not designed for concurrent use. Running multiple `gro gitops_publish` commands simultaneously is not supported and will cause conflicts on git commits and changeset files. +This tool is not designed for concurrent use. Running multiple +`gro gitops_publish` commands simultaneously is not supported and will cause +conflicts on git commits and changeset files. ## Configuration ```ts // gitops.config.ts export default { - repos: ['https://github.com/owner/repo', {repo_url: '...', repo_dir: '...', branch: 'main'}], + repos: ["https://github.com/owner/repo", { + repo_url: "...", + repo_dir: "...", + branch: "main", + }], }; ``` @@ -88,7 +100,11 @@ Requires `SECRET_GITHUB_API_TOKEN` in `.env` for API access. - Resolves repo URLs to local directories - Clones missing repos via SSH - Switches branches maintaining clean workspace -- Automatically installs dependencies when package.json changes (after clone or pull) +- Automatically installs dependencies when package.json changes: + - After initial clone + - After pulling latest changes + - After switching branches (if package.json differs) + - Uses `npm install` to ensure dependencies match package.json ### Data fetching @@ -107,15 +123,23 @@ Requires `SECRET_GITHUB_API_TOKEN` in `.env` for API access. - Creates auto-changesets for dependent packages during publishing - `gro gitops_plan` - generates a publishing plan (read-only prediction) - `gro gitops_analyze` - analyzes dependencies and changesets -- `gro gitops_publish --dry_run` - simulates publishing without preflight checks or state persistence +- `gro gitops_publish --dry_run` - simulates publishing without preflight checks + or state persistence - Handles circular dev dependencies by excluding from topological sort -- Waits for NPM propagation with exponential backoff (10 minute default timeout) +- Waits for NPM propagation with exponential backoff (10 minute default + timeout): + - NPM uses eventually consistent CDN distribution + - Published packages may not be immediately available globally + - Critical for multi-repo: ensures dependencies are fetchable before + publishing dependents - Updates cross-repo dependencies automatically -- Preflight checks validate clean workspaces, branches, builds, and npm authentication (skipped for --dry_run runs) +- Preflight checks validate clean workspaces, branches, builds, and npm + authentication (skipped for --dry_run runs) **Build Validation (Fail-Fast Safety)** -The publishing workflow includes build validation in preflight checks to prevent broken state: +The publishing workflow includes build validation in preflight checks to prevent +broken state: 1. **Preflight phase** (before any publishing): - Runs `gro build` on all packages with changesets @@ -125,9 +149,11 @@ The publishing workflow includes build validation in preflight checks to prevent 2. **Publishing phase** (after validation): - Runs `gro publish --no-build` for each package - Builds already validated, so no risk of build failures mid-publish - - Optionally deploys repos with changes if `--deploy` flag used (published or any dep updates) + - Optionally deploys repos with changes if `--deploy` flag used (published or + any dep updates) -This prevents the known issue in `gro publish` where build failures leave repos in broken state (version bumped but not published). +This prevents the known issue in `gro publish` where build failures leave repos +in broken state (version bumped but not published). **Dependency Installation with Cache Healing** @@ -157,17 +183,21 @@ The publishing workflow automatically installs dependencies after package.json u `gro gitops_plan`: -- **Read-only prediction** - Generates a publishing plan showing what would be published +- **Read-only prediction** - Generates a publishing plan showing what would be + published - Uses fixed-point iteration to resolve transitive cascades (max 10 iterations) -- Shows all 4 publishing scenarios: explicit changesets, bump escalation, auto-generated changesets, and no changes +- Shows all 4 publishing scenarios: explicit changesets, bump escalation, + auto-generated changesets, and no changes - No side effects - does not modify any files or state `gro gitops_publish --dry_run`: - **Simulated execution** - Runs the same code path as real publishing - Skips preflight checks (workspace, branch, npm auth) -- Only simulates packages with explicit changesets (can't auto-generate changesets without real publishes) -- Use plan for comprehensive "what would happen" analysis; use dry run to test execution flow +- Only simulates packages with explicit changesets (can't auto-generate + changesets without real publishes) +- Use plan for comprehensive "what would happen" analysis; use dry run to test + execution flow #### Changeset Semantics @@ -184,7 +214,8 @@ Packages can publish in four distinct scenarios: - Package has `.changeset/*.md` files specifying bump type - BUT dependency updates require a HIGHER bump -- Behavior: Published with escalated bump (e.g., `patch` → `minor` for breaking dep) +- Behavior: Published with escalated bump (e.g., `patch` → `minor` for breaking + dep) - Reported as: "Version Changes (bump escalation required)" - Example: You write `patch` changeset, but `gro` (breaking) forces `minor` @@ -208,10 +239,12 @@ Packages can publish in four distinct scenarios: When a dependency is updated: -- **Production/peer deps**: Package must republish (triggers auto-changeset if needed) +- **Production/peer deps**: Package must republish (triggers auto-changeset if + needed) - **Dev deps**: Package.json updated, NO republish (dev-only changes) -When a package appears in both production/peer and dev dependencies, production/peer takes priority for dependency graph calculations. +When a package appears in both production/peer and dev dependencies, +production/peer takes priority for dependency graph calculations. #### Private Packages @@ -229,63 +262,74 @@ Packages with `"private": true` in package.json are excluded from publishing: - `changeset_reader.ts` - Parses changesets and predicts versions - `changeset_generator.ts` - Auto-generates changesets for dependency updates - `dependency_graph.ts` - Topological sorting and cycle detection -- `graph_validation.ts` - Shared cycle detection and publishing order computation +- `graph_validation.ts` - Shared cycle detection and publishing order + computation - `version_utils.ts` - Version comparison and bump type detection - `npm_registry.ts` - NPM availability checks with retry - `dependency_updater.ts` - Package.json updates with changesets - `preflight_checks.ts` - Pre-publish validation including build checks -- `operations.ts` - Dependency injection interfaces for testability (including build operations) +- `operations.ts` - Dependency injection interfaces for testability (including + build operations) #### Publishing Algorithms **Fixed-Point Iteration (Cascade Resolution)** -The publishing plan generation uses fixed-point iteration to resolve transitive breaking change cascades: +The publishing plan generation uses fixed-point iteration to resolve transitive +breaking change cascades: 1. **Initial pass**: Identify all packages with explicit changesets 2. **Iteration loop** (max 10 iterations): - Calculate dependency updates based on predicted versions - For each package: - Check if dependencies require a bump (prod/peer deps only) - - **Bump escalation**: If existing changesets specify lower bump than required, escalate - - **Auto-changesets**: If no changesets but deps updated, generate auto-changeset + - **Bump escalation**: If existing changesets specify lower bump than + required, escalate + - **Auto-changesets**: If no changesets but deps updated, generate + auto-changeset - Track breaking changes to propagate to dependents - Loop until no new version changes discovered (fixed point reached) 3. **Final pass**: Calculate all dependency updates and cascades -The 10-iteration limit prevents infinite loops while handling complex dependency graphs. In practice, most repos converge in 2-3 iterations. +The 10-iteration limit prevents infinite loops while handling complex dependency +graphs. In practice, most repos converge in 2-3 iterations. **Cycle Detection Strategy** The system uses topological sort with dev dependency exclusion: - **Production/peer cycles**: Block publishing (error, must be resolved) - - These create impossible ordering: Package A depends on Package B which depends on Package A + - These create impossible ordering: Package A depends on Package B which + depends on Package A - Solution: Move one dependency to devDependencies or restructure - **Dev cycles**: Allowed and normal (warning only) - Dev dependencies don't affect runtime, so cycles are safe - - Topological sort excludes dev deps (`exclude_dev=true`) to break these cycles + - Topological sort excludes dev deps (`exclude_dev=true`) to break these + cycles - **Publishing order**: Computed via topological sort on prod/peer deps only - Ensures dependencies publish before dependents - - Deterministic and reproducible (alphabetically sorted within dependency tiers) + - Deterministic and reproducible (alphabetically sorted within dependency + tiers) - Dev dependencies updated in separate phase after all publishing completes -- **Dependency priority**: When a package appears in multiple dependency types, production/peer takes priority over dev +- **Dependency priority**: When a package appears in multiple dependency types, + production/peer takes priority over dev -This strategy enables practical multi-repo patterns (e.g., shared test utilities) while preventing runtime dependency issues. +This strategy enables practical multi-repo patterns (e.g., shared test +utilities) while preventing runtime dependency issues. ## Data types ```ts interface Repo extends Pkg { - check_runs: Github_Check_Runs_Item | null; - pull_requests: Array | null; + check_runs: Github_Check_Runs_Item | null; + pull_requests: Array | null; } interface Local_Repo { - repo_name: string; - repo_dir: string; - repo_url: string; - pkg: Pkg; + repo_name: string; + repo_dir: string; + repo_url: string; + pkg: Pkg; } ``` @@ -334,7 +378,8 @@ Commands are categorized by their side effects: ### Read-Only Commands (Safe, No Side Effects) - `gro gitops_analyze` - Analyze dependency graph, detect cycles -- `gro gitops_plan` - Generate publishing plan showing version changes and cascades +- `gro gitops_plan` - Generate publishing plan showing version changes and + cascades - `gro gitops_validate` - Run all validation checks (analyze + plan + dry run) - `gro gitops_publish --dry_run` - Simulate publishing without preflight checks @@ -351,7 +396,8 @@ Commands are categorized by their side effects: **Command Workflow:** -- `gitops_validate` runs: `gitops_analyze` + `gitops_plan` + `gitops_publish --dry_run` +- `gitops_validate` runs: `gitops_analyze` + `gitops_plan` + + `gitops_publish --dry_run` - `gitops_publish` runs: `gitops_plan` (with confirmation) + actual publish ## Dependencies @@ -375,22 +421,44 @@ Commands are categorized by their side effects: ## Testability & Operations Pattern -This project uses **dependency injection** for all side effects, making it fully testable without mocks: +This project uses **dependency injection** for all side effects, making it fully +testable without mocks: -**Why:** Functions that call git, npm, or file system are hard to test. The operations pattern abstracts these into interfaces. +**Why:** Functions that call git, npm, or file system are hard to test. The +operations pattern abstracts these into interfaces. -**How:** See `src/lib/operations.ts` - all external dependencies (git, npm, fs, process, build) are defined as interfaces. Tests provide mock implementations. +**How:** See `src/lib/operations.ts` - all external dependencies (git, npm, fs, +process, build) are defined as interfaces. Tests provide mock implementations. + +**Benefits:** + +- **No mocking libraries** - Just plain objects implementing interfaces +- **Type-safe tests** - Mock implementations must match interface signatures +- **Easy setup** - Return exactly what you want from fake operations +- **Fast tests** - No real git/npm/fs operations, instant execution +- **Predictable** - Control all side effects explicitly +- **Readable** - Test code shows exactly what operations do **Example:** - Production: `multi_repo_publisher(repos, options, default_gitops_operations)` - Tests: `multi_repo_publisher(repos, options, mock_gitops_operations)` -See `src/lib/operations_defaults.ts` for real implementations and test files for mock implementations. +See `src/lib/operations_defaults.ts` for real implementations and test files for +mock implementations. + +**When writing new code:** + +- Add side effects as operations interface methods (see `operations.ts`) +- Accept operations parameter with default: + `ops: Gitops_Operations = default_gitops_operations` +- Call operations through the injected parameter: `await ops.git.commit(...)` +- Tests inject fake operations that return controlled data ## Testing -Uses vitest with **zero mocks** - all tests use the operations pattern for dependency injection (see above). +Uses vitest with **zero mocks** - all tests use the operations pattern for +dependency injection (see above). ```bash gro test # run all tests @@ -409,7 +477,8 @@ Core modules tested: ### Fixture Testing -The fixture system uses **generated git repositories** for isolated, reproducible integration tests: +The fixture system uses **generated git repositories** for isolated, +reproducible integration tests: **Generated Test Repos:** @@ -420,10 +489,12 @@ The fixture system uses **generated git repositories** for isolated, reproducibl **Fixture Scenarios (9 total):** -- `basic_publishing` - All 4 publishing scenarios (explicit, auto-generated, bump escalation, no changes) +- `basic_publishing` - All 4 publishing scenarios (explicit, auto-generated, + bump escalation, no changes) - `deep_cascade` - 4-level dependency chains with cascading breaking changes - `circular_dev_deps` - Dev dependency cycles (allowed, non-blocking) -- `circular_prod_deps_error` - Production circular dependencies (error detection) +- `circular_prod_deps_error` - Production circular dependencies (error + detection) - `private_packages` - Private package handling (skipped from publishing) - `major_bumps` - Major version transitions (0.x → 1.0, 1.x → 2.0) - `peer_deps_only` - Plugin/adapter patterns (peer dependencies only) @@ -433,15 +504,18 @@ The fixture system uses **generated git repositories** for isolated, reproducibl **Structured Validation:** - `src/fixtures/configs/*.config.ts` - Isolated gitops config per fixture -- `src/fixtures/check.test.ts` - Validates JSON output against fixture `expected_outcomes` +- `src/fixtures/check.test.ts` - Validates JSON output against fixture + `expected_outcomes` - `src/fixtures/helpers.ts` - JSON command runner and assertion helpers **Workflow:** 1. Define fixture data with expected outcomes in `repo_fixtures/*.ts` -2. Run `gro test src/fixtures/check` to validate commands against expected outcomes +2. Run `gro test src/fixtures/check` to validate commands against expected + outcomes -Fixture repos are auto-generated on first test run if missing. To manually regenerate: `gro src/fixtures/generate_repos` +Fixture repos are auto-generated on first test run if missing. To manually +regenerate: `gro src/fixtures/generate_repos` Each fixture runs in isolation with its own config, validating: @@ -450,7 +524,8 @@ Each fixture runs in isolation with its own config, validating: - Breaking change cascades - Warnings, errors, and info messages -Test repos are isolated from real workspace repos and can run in CI without cloning. +Test repos are isolated from real workspace repos and can run in CI without +cloning. ## Publishing Workflows @@ -591,7 +666,8 @@ gro build # See the full build error gro build # Verify it works ``` -Build validation runs during preflight checks to prevent broken state. All packages must build successfully before any publishing begins. +Build validation runs during preflight checks to prevent broken state. All +packages must build successfully before any publishing begins. **Warning: "Plan differs from actual publish"** @@ -619,7 +695,8 @@ Solution: NPM propagation can be slow. Either: - Increase timeout with `--max-wait` (default is 10 minutes / 600000ms) - Check NPM registry status - Verify package was actually published -- If verified published, re-run `gro gitops_publish` to continue (already-published packages will be skipped) +- If verified published, re-run `gro gitops_publish` to continue + (already-published packages will be skipped) **Issue: "Auto-changeset generated when I didn't expect it"** @@ -628,7 +705,8 @@ This happens when: - A dependency was published with a new version - Your package has that dependency in dependencies or peerDependencies -This is correct behavior - packages must republish when their dependencies change. +This is correct behavior - packages must republish when their dependencies +change. **Issue: "Why was my package deployed when it didn't publish?"** @@ -638,7 +716,8 @@ Deployment occurs for packages with ANY changes (not just published packages): - Production/peer dependencies updated - Dev dependencies updated (requires rebuild/deploy) -This is correct behavior - dev dep changes require redeployment even without version bumps. +This is correct behavior - dev dep changes require redeployment even without +version bumps. **Issue: "Package not publishing even though I have a changeset"** @@ -654,7 +733,8 @@ Check: Resumption is **automatic** and **natural**: 1. When `gro publish` succeeds, it consumes changesets -2. Single `gro gitops_publish` run handles full dependency cascades via iteration (max 10 passes) +2. Single `gro gitops_publish` run handles full dependency cascades via + iteration (max 10 passes) 3. If publishing fails mid-way, re-run `gro gitops_publish`: - Already-published packages have no changesets → skipped automatically - Failed packages still have changesets → retried automatically diff --git a/src/lib/changeset_generator.ts b/src/lib/changeset_generator.ts index 6c7f81ab..fd80a4d4 100644 --- a/src/lib/changeset_generator.ts +++ b/src/lib/changeset_generator.ts @@ -1,3 +1,10 @@ +/** + * Auto-generation of changesets for dependency updates during publishing. + * + * Creates changesets when packages need to republish due to updated dependencies. + * For parsing existing changesets, see `changeset_reader.ts`. + */ + import {writeFile, mkdir} from 'node:fs/promises'; import {join} from 'node:path'; import {existsSync} from 'node:fs'; diff --git a/src/lib/changeset_reader.ts b/src/lib/changeset_reader.ts index cbbcf11e..4c927d75 100644 --- a/src/lib/changeset_reader.ts +++ b/src/lib/changeset_reader.ts @@ -1,3 +1,10 @@ +/** + * Changeset parsing and version prediction from `.changeset/*.md` files. + * + * Reads changesets to determine which packages need publishing and their version bumps. + * For auto-generating changesets during publishing, see `changeset_generator.ts`. + */ + import type {Logger} from '@ryanatkn/belt/log.js'; import {existsSync} from 'node:fs'; import {readdir, readFile} from 'node:fs/promises'; diff --git a/src/lib/dependency_graph.ts b/src/lib/dependency_graph.ts index eebd8ee2..b120f8db 100644 --- a/src/lib/dependency_graph.ts +++ b/src/lib/dependency_graph.ts @@ -1,3 +1,10 @@ +/** + * Dependency graph data structure and algorithms for multi-repo publishing. + * + * Provides `Dependency_Graph` class with topological sort and cycle detection. + * For validation workflow and publishing order computation, see `graph_validation.ts`. + */ + import type {Local_Repo} from '$lib/local_repo.js'; import {EMPTY_OBJECT} from '@ryanatkn/belt/object.js'; diff --git a/src/lib/fetch_repo_data.ts b/src/lib/fetch_repo_data.ts index 92373e18..d2a13795 100644 --- a/src/lib/fetch_repo_data.ts +++ b/src/lib/fetch_repo_data.ts @@ -8,6 +8,19 @@ import type {Local_Repo} from '$lib/local_repo.js'; /* eslint-disable no-await-in-loop */ +/** + * Fetches GitHub metadata (CI status, PRs) for all repos. + * + * Fetches sequentially with delay between requests to respect GitHub API rate limits. + * Uses `await_in_loop` intentionally to avoid parallel requests overwhelming the API. + * + * Error handling: Logs fetch failures but continues processing remaining repos. + * Repos with failed fetches will have `null` for check_runs or pull_requests. + * + * @param delay milliseconds between API requests (default: 33ms) + * @param cache optional cache from belt's fetch.js for response memoization + * @returns array of Repo objects with GitHub metadata attached + */ export const fetch_repo_data = async ( resolved_repos: Array, token?: string, diff --git a/src/lib/fs_fetch_value_cache.ts b/src/lib/fs_fetch_value_cache.ts index da7a11dd..0b588268 100644 --- a/src/lib/fs_fetch_value_cache.ts +++ b/src/lib/fs_fetch_value_cache.ts @@ -16,6 +16,19 @@ export interface Fetch_Cache { save: () => Promise; } +/** + * Creates file-system backed cache for belt's fetch.js API responses. + * + * Cache invalidation strategy: If cache file can't be read or parsed, entire + * cache is cleared (delete file) and starts fresh. This handles format changes. + * + * Uses `structuredClone` to track changes - only writes to disk if data modified. + * Formatted with Prettier before writing for version control friendliness. + * + * @param name cache filename (without .json extension) + * @param dir cache directory (defaults to `.gro/build/fetch/`) + * @returns cache object with Map-based data and save() method + */ export const create_fs_fetch_value_cache = async ( name: string, dir = join(paths.build, 'fetch'), diff --git a/src/lib/gitops_config.ts b/src/lib/gitops_config.ts index 1aafde7c..9c1d577a 100644 --- a/src/lib/gitops_config.ts +++ b/src/lib/gitops_config.ts @@ -1,3 +1,14 @@ +/** + * Configuration types and normalization for gitops multi-repo management. + * + * Two-phase configuration system: + * - `Raw_Gitops_Config` - User-friendly format with optional fields and flexible types + * - `Gitops_Config` - Internal format with required fields and strict types + * + * This allows users to provide minimal configs (e.g., just URLs as strings) while + * the system works with normalized configs internally for type safety. + */ + import type {Url} from '@ryanatkn/belt/url.js'; import {existsSync} from 'node:fs'; import {strip_end} from '@ryanatkn/belt/string.js'; diff --git a/src/lib/gitops_task_helpers.ts b/src/lib/gitops_task_helpers.ts index 26ce09ab..d148ca61 100644 --- a/src/lib/gitops_task_helpers.ts +++ b/src/lib/gitops_task_helpers.ts @@ -1,3 +1,19 @@ +/** + * Shared initialization logic for all gitops tasks. + * + * Provides `get_gitops_ready()` which orchestrates: + * - Config loading and normalization + * - Repo resolution (local path discovery) + * - Branch switching and syncing + * - Dependency installation + * + * Used by: `gitops_sync.task.ts`, `gitops_analyze.task.ts`, `gitops_plan.task.ts`, + * `gitops_publish.task.ts`, and `gitops_validate.task.ts`. + * + * Accepts `git_ops` and `npm_ops` parameters to support testing via operations pattern + * (see `operations.ts` for dependency injection details). + */ + import {Task_Error} from '@ryanatkn/gro'; import {styleText as st} from 'node:util'; import {resolve, dirname} from 'node:path'; @@ -19,6 +35,25 @@ export interface Get_Gitops_Ready_Options { npm_ops?: Npm_Operations; } +/** + * Central initialization function for all gitops tasks. + * + * Initialization sequence: + * 1. Loads and normalizes config from `gitops.config.ts` + * 2. Resolves local repo paths (creates missing with `--download`) + * 3. Switches branches and pulls latest changes + * 4. Auto-installs deps if package.json changed during pull + * + * Priority for path resolution: + * - `dir` argument (explicit override) + * - Config `repos_dir` setting + * - `DEFAULT_REPOS_DIR` constant + * + * @param options.git_ops for testing (defaults to real git operations) + * @param options.npm_ops for testing (defaults to real npm operations) + * @returns initialized config and fully loaded repos ready for operations + * @throws {Task_Error} if config loading or repo resolution fails + */ export const get_gitops_ready = async ( options: Get_Gitops_Ready_Options, ): Promise<{ diff --git a/src/lib/graph_validation.ts b/src/lib/graph_validation.ts index 8d87bca3..91596608 100644 --- a/src/lib/graph_validation.ts +++ b/src/lib/graph_validation.ts @@ -1,3 +1,16 @@ +/** + * Shared dependency graph validation logic used across multiple workflows. + * + * Consolidates graph building, cycle detection, and publishing order computation + * that was duplicated in three places: `multi_repo_publisher.ts`, `publishing_plan.ts`, + * and `gitops_analyze.task.ts`. + * + * Options pattern supports different behaviors: analyze can tolerate cycles for + * reporting, while publish must throw on production cycles. + * + * See also: `dependency_graph.ts` for core graph data structure and algorithms. + */ + import type {Logger} from '@ryanatkn/belt/log.js'; import {Task_Error} from '@ryanatkn/gro'; import {styleText as st} from 'node:util'; diff --git a/src/lib/operations_defaults.ts b/src/lib/operations_defaults.ts index c6bbb5de..ffc4d016 100644 --- a/src/lib/operations_defaults.ts +++ b/src/lib/operations_defaults.ts @@ -1,3 +1,10 @@ +/** + * Production implementations of operations interfaces. + * + * Provides real git, npm, fs, and build operations for production use. + * For interface definitions and dependency injection pattern, see `operations.ts`. + */ + import {spawn, spawn_out} from '@ryanatkn/belt/process.js'; import {readFile, writeFile} from 'node:fs/promises'; import {git_checkout, type Git_Branch, type Git_Origin} from '@ryanatkn/belt/git.js'; diff --git a/src/lib/serialization_types.ts b/src/lib/serialization_types.ts index 23fa7dec..37d8275e 100644 --- a/src/lib/serialization_types.ts +++ b/src/lib/serialization_types.ts @@ -1,3 +1,15 @@ +/** + * JSON-serializable types for command output formats. + * + * Gitops commands support `--format json` and `--format markdown` output modes + * in addition to styled terminal output. These types define the JSON schema for: + * - Dependency graph structures (`Serialized_Graph`) + * - Publishing plan predictions (`Serialized_Publishing_Plan`) + * + * Used by `gitops_analyze`, `gitops_plan`, and `gitops_publish --dry_run` when + * `--format json` or `--outfile` is specified. + */ + import type {Dependency_Graph} from '$lib/dependency_graph.js'; export interface Serialized_Node { From ea3e0f6cf7b80429a8ccb6cf55dca69f0b36ba46 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 10 Nov 2025 16:31:05 -0500 Subject: [PATCH 14/41] wip --- src/routes/moss.css | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/src/routes/moss.css b/src/routes/moss.css index 7a9ce260..c79aee19 100644 --- a/src/routes/moss.css +++ b/src/routes/moss.css @@ -31,32 +31,6 @@ max-width: var(--distance_md); } -.selectable { - --button_fill: color-mix(in hsl, var(--fill) 8%, transparent); - --button_fill_hover: color-mix(in hsl, var(--fill) 16%, transparent); - --button_fill_active: color-mix(in hsl, var(--fill) 24%, transparent); - cursor: pointer; - background-color: var(--button_fill); - border-color: var(--border_color_3); - border-style: var(--border_style); - border-width: var(--border_width); -} -.selectable:hover { - background-color: var(--button_fill_hover); - border-color: var(--border_color_2); -} -.selectable.selected, -.selectable:active { - background-color: var(--button_fill_active); - border-color: var(--color_a_5); -} -.selectable.selected { - cursor: default; -} -.selectable.selected.deselectable:not(:disabled) { - cursor: pointer; -} - /* A pane is a box floating over the page, like for dialogs. By default it's opaque, resetting the background to the initial depth. */ .pane { @@ -179,15 +153,9 @@ a.chip { .display_flex { display: flex; } -.display_inline_flex { - display: inline-flex; -} .flex_1 { flex: 1; } -.align_items_center { - align-items: center; -} .text_align_center { text-align: center; } @@ -201,9 +169,6 @@ a.chip { .width_100 { width: 100%; } -.height_100 { - height: 100%; -} .p_sm { padding: var(--space_sm); } @@ -223,9 +188,6 @@ a.chip { padding-left: var(--space_xl); padding-right: var(--space_xl); } -.mt_0 { - margin-top: 0; -} .mt_xs { margin-top: var(--space_xs); } From f36881c88e7d5936d317b8c09ad387412815fea5 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Fri, 21 Nov 2025 06:20:07 -0500 Subject: [PATCH 15/41] wip --- package-lock.json | 115 +++++++++++++++++++++++----------------------- package.json | 22 ++++----- 2 files changed, 68 insertions(+), 69 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f5fdac6..0b199bc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,11 +10,11 @@ "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.36.1", + "@ryanatkn/belt": "^0.37.2", "@ryanatkn/eslint-config": "^0.8.1", - "@ryanatkn/fuz": "^0.148.0", - "@ryanatkn/gro": "^0.172.0", - "@ryanatkn/moss": "^0.36.3", + "@ryanatkn/fuz": "^0.151.2", + "@ryanatkn/gro": "^0.173.2", + "@ryanatkn/moss": "^0.37.0", "@sveltejs/adapter-static": "^3.0.9", "@sveltejs/kit": "^2.37.1", "@sveltejs/package": "^2.5.0", @@ -24,10 +24,10 @@ "eslint-plugin-svelte": "^3.12.2", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.38.7", - "svelte-check": "^4.3.1", + "svelte": "^5.43.14", + "svelte-check": "^4.3.4", "tslib": "^2.8.1", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "typescript-eslint": "^8.42.0", "vitest": "^3.2.4" }, @@ -38,10 +38,10 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@ryanatkn/belt": "^0.36.0", - "@ryanatkn/fuz": "^0.148.0", - "@ryanatkn/gro": "^0.172.0", - "@ryanatkn/moss": "^0.36.2", + "@ryanatkn/belt": "^0.37.2", + "@ryanatkn/fuz": "^0.151.2", + "@ryanatkn/gro": "^0.173.2", + "@ryanatkn/moss": "^0.37.0", "@sveltejs/kit": "^2", "svelte": "^5", "zod": "^4.1.5" @@ -65,9 +65,9 @@ "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", "dev": true, "license": "MIT", "optional": true, @@ -77,9 +77,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "dev": true, "license": "MIT", "optional": true, @@ -797,9 +797,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.5.tgz", - "integrity": "sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", "dev": true, "license": "MIT", "optional": true, @@ -1414,9 +1414,9 @@ ] }, "node_modules/@ryanatkn/belt": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.36.1.tgz", - "integrity": "sha512-9dGENdfE+Yq1rdCzCKVIVJbvOodL+TYU1liJpmjoov/b7WrvdaaJWSTw4cif6VkyWmNv4LLP8ULpeHk6SHEWZA==", + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.37.2.tgz", + "integrity": "sha512-e83hfgdn0vgGN9NSZQueBTWCs9j2OrkpB1jsMvm7thIaw1Merd1ypS7tkTOkIkJ6b8kE6S6VRFG66tWZ2Asq4Q==", "dev": true, "license": "MIT", "engines": { @@ -1464,9 +1464,9 @@ } }, "node_modules/@ryanatkn/fuz": { - "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.148.0.tgz", - "integrity": "sha512-ysmg9X84vKyoakCmJmQYKQhUty17cWcx65wojQQ8iOLE7c+GdI/LgWLhVRLRyVF06NBnkLga5WR3sawPJD/HUg==", + "version": "0.151.2", + "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.151.2.tgz", + "integrity": "sha512-essQvnlMhIMKjCjR4l50BsL527CalZ8RaswLEMPoc5Zh4+y46O8Zgf4RDeUMRtJ6kmOldglRoYZAu5ljOW6U6w==", "dev": true, "license": "MIT", "engines": { @@ -1476,9 +1476,9 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@ryanatkn/belt": "^0.36.1", - "@ryanatkn/gro": "^0.171.0", - "@ryanatkn/moss": "^0.36.3", + "@ryanatkn/belt": "^0.37.0", + "@ryanatkn/gro": "^0.173.0", + "@ryanatkn/moss": "^0.37.0", "@sveltejs/kit": "^2.47.3", "esm-env": "^1", "svelte": "^5", @@ -1495,9 +1495,9 @@ } }, "node_modules/@ryanatkn/gro": { - "version": "0.172.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.172.0.tgz", - "integrity": "sha512-CdkPV4KVs5hqse7i7pA16koAPLR61rx+Ha33vbQ9eEyn5skEa4NvC1BwVGv5TYjQtH9qoXn5GsK224kff9wQFQ==", + "version": "0.173.2", + "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.173.2.tgz", + "integrity": "sha512-CYCPtTR1vVcumMmALCVS9+qn5gYNlywAeXSg3GKBFRvJNZ6BgtLj/MwqlRE6fjIqSPLYjH8WC1VpiqpsnrQb/A==", "dev": true, "license": "MIT", "dependencies": { @@ -1525,7 +1525,7 @@ "vitest": "^3 || ^4" }, "peerDependencies": { - "@ryanatkn/belt": "^0.36.0", + "@ryanatkn/belt": "^0.37.2", "@sveltejs/kit": "^2", "esbuild": "^0.25", "svelte": "^5", @@ -1542,9 +1542,9 @@ } }, "node_modules/@ryanatkn/moss": { - "version": "0.36.3", - "resolved": "https://registry.npmjs.org/@ryanatkn/moss/-/moss-0.36.3.tgz", - "integrity": "sha512-Q0ta4ClWqV3LV5BW0vic8IBBRqC5mXNG/zKdoxPov7Gg6ho6DuP5BTLXPZP2NeU5BSsyShQ9pi7Q3aAhYtTBqg==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/moss/-/moss-0.37.0.tgz", + "integrity": "sha512-zHphFGFzH40KkOFIHEnMmuF35tErZTXB+1Xh5K0C6N8+qS7C2P1sL0P2g3kQY29qBEZ0Haki+aiEwejmhZmwDA==", "dev": true, "license": "MIT", "engines": { @@ -1572,9 +1572,9 @@ } }, "node_modules/@sveltejs/adapter-static": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.9.tgz", - "integrity": "sha512-aytHXcMi7lb9ljsWUzXYQ0p5X1z9oWud2olu/EpmH7aCu4m84h7QLvb5Wp+CFirKcwoNnYvYWhyP/L8Vh1ztdw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1621,9 +1621,9 @@ } }, "node_modules/@sveltejs/package": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.5.0.tgz", - "integrity": "sha512-qpB91oWEraOXA4l1ldpGtMc/rLCthbf1ACw/1oroKxvT3sd2NXPd/+NLhIk5FCvd0IUSEZGYa86K+D94GWW2Zw==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.5.6.tgz", + "integrity": "sha512-1rNQYW/TwDZU6HTAWHvwDAdyRcccYKG7sShbCokhX1Z0spPFcTVbK771fVBcWnh+XChZGcOfi4KLN9AaIrehQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1644,9 +1644,9 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.1.4.tgz", - "integrity": "sha512-4jfkfvsGI+U2OhHX8OPCKtMCf7g7ledXhs3E6UcA4EY0jQWsiVbe83pTAHp9XTifzYNOiD4AJieJUsI0qqxsbw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", + "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2453,9 +2453,9 @@ "license": "MIT" }, "node_modules/dotenv": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", - "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -3890,9 +3890,9 @@ } }, "node_modules/svelte": { - "version": "5.38.7", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.38.7.tgz", - "integrity": "sha512-1ld9TPZSdUS3EtYGQzisU2nhwXoIzNQcZ71IOU9fEmltaUofQnVfW5CQuhgM/zFsZ43arZXS1BRKi0MYgUV91w==", + "version": "5.43.14", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.43.14.tgz", + "integrity": "sha512-pHeUrp1A5S6RGaXhJB7PtYjL1VVjbVrJ2EfuAoPu9/1LeoMaJa/pcdCsCSb0gS4eUHAHnhCbUDxORZyvGK6kOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3916,9 +3916,9 @@ } }, "node_modules/svelte-check": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.1.tgz", - "integrity": "sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.4.tgz", + "integrity": "sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==", "dev": true, "license": "MIT", "dependencies": { @@ -3974,7 +3974,6 @@ "integrity": "sha512-cSci+mYGygYBHIZLHlm/jYlEc1acjAHqaQaDFHdEBpUueM9kSTnPpvPtSl5VkJOU1qSJ7h1K+6F/LIUYiqC8VA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "dedent-js": "^1.0.1", "scule": "^1.3.0" @@ -4115,9 +4114,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 2a9d43ce..4ba61452 100644 --- a/package.json +++ b/package.json @@ -30,21 +30,21 @@ "node": ">=22.15" }, "peerDependencies": { - "@ryanatkn/belt": "^0.36.0", - "@ryanatkn/fuz": "^0.148.0", - "@ryanatkn/gro": "^0.172.0", - "@ryanatkn/moss": "^0.36.2", + "@ryanatkn/belt": "^0.37.2", + "@ryanatkn/fuz": "^0.151.2", + "@ryanatkn/gro": "^0.173.2", + "@ryanatkn/moss": "^0.37.0", "@sveltejs/kit": "^2", "svelte": "^5", "zod": "^4.1.5" }, "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.36.1", + "@ryanatkn/belt": "^0.37.2", "@ryanatkn/eslint-config": "^0.8.1", - "@ryanatkn/fuz": "^0.148.0", - "@ryanatkn/gro": "^0.172.0", - "@ryanatkn/moss": "^0.36.3", + "@ryanatkn/fuz": "^0.151.2", + "@ryanatkn/gro": "^0.173.2", + "@ryanatkn/moss": "^0.37.0", "@sveltejs/adapter-static": "^3.0.9", "@sveltejs/kit": "^2.37.1", "@sveltejs/package": "^2.5.0", @@ -54,10 +54,10 @@ "eslint-plugin-svelte": "^3.12.2", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.38.7", - "svelte-check": "^4.3.1", + "svelte": "^5.43.14", + "svelte-check": "^4.3.4", "tslib": "^2.8.1", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "typescript-eslint": "^8.42.0", "vitest": "^3.2.4" }, From fb738d3ef2e60fd72461441722dfaeeba3e85bff Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Fri, 21 Nov 2025 06:20:32 -0500 Subject: [PATCH 16/41] wip --- .changeset/small-baboons-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/small-baboons-report.md b/.changeset/small-baboons-report.md index 5ac197bd..55355ef5 100644 --- a/.changeset/small-baboons-report.md +++ b/.changeset/small-baboons-report.md @@ -2,4 +2,4 @@ '@ryanatkn/fuz_gitops': minor --- -upgrade belt +upgrade deps From cf6bbb0adebd57c5c4ae9483d3bf3c44726ca516 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Fri, 21 Nov 2025 06:22:20 -0500 Subject: [PATCH 17/41] wip --- src/routes/repos.ts | 2 +- src/test/dependency_graph.test.ts | 2 +- src/test/dependency_updater.test.ts | 2 +- src/test/graph_validation.test.ts | 2 +- src/test/multi_repo_publisher.test.ts | 2 +- src/{lib => test}/npm_install_helpers.test.ts | 2 +- src/test/npm_operations.test.ts | 2 +- src/test/npm_registry.test.ts | 2 +- src/test/preflight_checks.test.ts | 2 +- src/test/publishing_plan.test.ts | 2 +- tsconfig.json | 5 +++-- 11 files changed, 13 insertions(+), 12 deletions(-) rename src/{lib => test}/npm_install_helpers.test.ts (98%) diff --git a/src/routes/repos.ts b/src/routes/repos.ts index 6be87ed9..174bbe53 100644 --- a/src/routes/repos.ts +++ b/src/routes/repos.ts @@ -4457,7 +4457,7 @@ export const repos: Array = JSON.parse( }\ ]\ },\ - "./test_helpers.js": {\ + "./test_helpers.ts": {\ "path": "test_helpers.ts",\ "declarations": [\ {\ diff --git a/src/test/dependency_graph.test.ts b/src/test/dependency_graph.test.ts index 05b3ec39..50078a65 100644 --- a/src/test/dependency_graph.test.ts +++ b/src/test/dependency_graph.test.ts @@ -1,6 +1,6 @@ import {describe, it, expect} from 'vitest'; import {Dependency_Graph, Dependency_Graph_Builder} from '$lib/dependency_graph.js'; -import {create_mock_repo} from './test_helpers.js'; +import {create_mock_repo} from './test_helpers.ts'; describe('Dependency_Graph', () => { describe('basic functionality', () => { diff --git a/src/test/dependency_updater.test.ts b/src/test/dependency_updater.test.ts index 53c97251..a39b4d34 100644 --- a/src/test/dependency_updater.test.ts +++ b/src/test/dependency_updater.test.ts @@ -6,7 +6,7 @@ import { update_all_repos, find_updates_needed, } from '$lib/dependency_updater.js'; -import {create_mock_repo, create_mock_git_ops, create_mock_fs_ops} from './test_helpers.js'; +import {create_mock_repo, create_mock_git_ops, create_mock_fs_ops} from './test_helpers.ts'; import type {Git_Operations} from '$lib/operations.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/test/graph_validation.test.ts b/src/test/graph_validation.test.ts index 3fdf3749..0746402f 100644 --- a/src/test/graph_validation.test.ts +++ b/src/test/graph_validation.test.ts @@ -2,7 +2,7 @@ import {describe, it, expect} from 'vitest'; import {Task_Error} from '@ryanatkn/gro'; import {validate_dependency_graph} from '$lib/graph_validation.js'; -import {create_mock_repo} from './test_helpers.js'; +import {create_mock_repo} from './test_helpers.ts'; describe('validate_dependency_graph', () => { describe('basic functionality', () => { diff --git a/src/test/multi_repo_publisher.test.ts b/src/test/multi_repo_publisher.test.ts index d8b49cff..e13bb6bd 100644 --- a/src/test/multi_repo_publisher.test.ts +++ b/src/test/multi_repo_publisher.test.ts @@ -11,7 +11,7 @@ import { create_preflight_mock, create_populated_fs_ops, create_mock_logger, -} from './test_helpers.js'; +} from './test_helpers.ts'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/lib/npm_install_helpers.test.ts b/src/test/npm_install_helpers.test.ts similarity index 98% rename from src/lib/npm_install_helpers.test.ts rename to src/test/npm_install_helpers.test.ts index e4169430..1f1cd5ea 100644 --- a/src/lib/npm_install_helpers.test.ts +++ b/src/test/npm_install_helpers.test.ts @@ -2,7 +2,7 @@ import {test} from 'vitest'; import {install_with_cache_healing} from '$lib/npm_install_helpers.js'; import type {Npm_Operations} from '$lib/operations.js'; -import {create_mock_gitops_ops, create_mock_repo} from '$lib/test_helpers.js'; +import {create_mock_gitops_ops, create_mock_repo} from './test_helpers.ts'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/test/npm_operations.test.ts b/src/test/npm_operations.test.ts index 6cb32a10..a4c0769b 100644 --- a/src/test/npm_operations.test.ts +++ b/src/test/npm_operations.test.ts @@ -1,6 +1,6 @@ import {test, assert, describe} from 'vitest'; -import {create_mock_npm_ops} from './test_helpers.js'; +import {create_mock_npm_ops} from './test_helpers.ts'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/test/npm_registry.test.ts b/src/test/npm_registry.test.ts index 34e61eb5..2bb77306 100644 --- a/src/test/npm_registry.test.ts +++ b/src/test/npm_registry.test.ts @@ -9,7 +9,7 @@ import { package_exists, type Wait_Options, } from '$lib/npm_registry.js'; -import {create_mock_logger} from './test_helpers.js'; +import {create_mock_logger} from './test_helpers.ts'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/test/preflight_checks.test.ts b/src/test/preflight_checks.test.ts index e1ed2911..2f1a095c 100644 --- a/src/test/preflight_checks.test.ts +++ b/src/test/preflight_checks.test.ts @@ -6,7 +6,7 @@ import { create_mock_git_ops, create_mock_npm_ops, create_mock_build_ops, -} from './test_helpers.js'; +} from './test_helpers.ts'; import type {Local_Repo} from '$lib/local_repo.js'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/src/test/publishing_plan.test.ts b/src/test/publishing_plan.test.ts index 3529357b..6561119e 100644 --- a/src/test/publishing_plan.test.ts +++ b/src/test/publishing_plan.test.ts @@ -3,7 +3,7 @@ import {test, expect} from 'vitest'; import type {Local_Repo} from '$lib/local_repo.js'; import {generate_publishing_plan} from '$lib/publishing_plan.js'; import type {Changeset_Operations} from '$lib/operations.js'; -import {create_mock_repo} from './test_helpers.js'; +import {create_mock_repo} from './test_helpers.ts'; /* eslint-disable @typescript-eslint/require-await */ diff --git a/tsconfig.json b/tsconfig.json index 4d121e87..0300902f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,9 +22,10 @@ "importHelpers": true, "skipLibCheck": true, "allowJs": true, + "checkJs": true, "erasableSyntaxOnly": true, - "allowImportingTsExtensions": false, - "checkJs": true + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": false }, "include": [ "*.js", From 069d30adedbcee0d4d5600da8d43559fc9b81629 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Fri, 21 Nov 2025 07:47:07 -0500 Subject: [PATCH 18/41] wip --- src/fixtures/load_repo_fixtures.ts | 24 ++++----------- src/lib/Page_Header.svelte | 2 +- src/lib/github.ts | 2 +- src/lib/local_repo.ts | 4 +-- src/lib/repo.ts | 2 +- src/routes/about/+page.svelte | 4 +-- src/routes/moss.css | 7 +++++ src/routes/repos.ts | 4 +-- src/test/dependency_graph.test.ts | 2 +- src/test/graph_validation.test.ts | 2 +- src/test/test_helpers.ts | 49 +++++++++++++++--------------- 11 files changed, 49 insertions(+), 53 deletions(-) diff --git a/src/fixtures/load_repo_fixtures.ts b/src/fixtures/load_repo_fixtures.ts index 577538a2..191e6a7b 100644 --- a/src/fixtures/load_repo_fixtures.ts +++ b/src/fixtures/load_repo_fixtures.ts @@ -3,7 +3,8 @@ */ import type {Local_Repo} from '$lib/local_repo.js'; -import type {Pkg} from '@ryanatkn/belt/pkg.js'; +import {Pkg} from '@ryanatkn/fuz/pkg.svelte.js'; +import type {} from '@ryanatkn/fuz/src_json.js'; import type {Repo_Fixture_Set, Repo_Fixture_Data} from './repo_fixture_types.js'; /** @@ -20,24 +21,11 @@ export const fixture_repo_to_local_repo = (repo_data: Repo_Fixture_Data): Local_ const {repo_name, repo_url, package_json} = repo_data; // Create minimal Pkg object - const pkg: Pkg = { + const pkg = new Pkg(package_json, { name: package_json.name, - repo_name, - repo_url, - owner_name: 'test', - homepage_url: `https://test.com/${repo_name}`, - logo_url: null, - logo_alt: `logo for ${repo_name}`, - npm_url: null, - changelog_url: null, - published: false, - package_json, - src_json: { - name: package_json.name, - version: package_json.version, - exported_modules: [], - }, - }; + version: package_json.version, + modules: [], + }); const local_repo: Local_Repo = { type: 'resolved_local_repo', diff --git a/src/lib/Page_Header.svelte b/src/lib/Page_Header.svelte index 968c19f9..a8417c04 100644 --- a/src/lib/Page_Header.svelte +++ b/src/lib/Page_Header.svelte @@ -1,5 +1,5 @@ - modules {repo.package_json.glyph} {repo.package_json.name} + modules {repo.pkg.package_json.glyph} {repo.pkg.package_json.name}
- +
{#snippet nav_footer()} {/snippet} diff --git a/src/lib/Page_Footer.svelte b/src/lib/Page_Footer.svelte index 43756ab6..6c651a8b 100644 --- a/src/lib/Page_Footer.svelte +++ b/src/lib/Page_Footer.svelte @@ -8,9 +8,9 @@
- +
diff --git a/src/lib/Pull_Requests_Detail.svelte b/src/lib/Pull_Requests_Detail.svelte index 4f75b29c..dc7150cd 100644 --- a/src/lib/Pull_Requests_Detail.svelte +++ b/src/lib/Pull_Requests_Detail.svelte @@ -22,15 +22,15 @@ {#each pull_requests as pull_request (pull_request.pull_request.number)} {pull_request.repo - .repo_name}{#if pull_request.repo.package_json.glyph} {pull_request.repo - .package_json.glyph}{/if}{pull_request.repo.pkg + .repo_name}{#if pull_request.repo.pkg.package_json.glyph} {pull_request.repo + .pkg.package_json.glyph}{/if} #{pull_request.pull_request.number} diff --git a/src/lib/Pull_Requests_Page.svelte b/src/lib/Pull_Requests_Page.svelte index b6863fc6..c2f44f04 100644 --- a/src/lib/Pull_Requests_Page.svelte +++ b/src/lib/Pull_Requests_Page.svelte @@ -18,12 +18,12 @@ - pull requests {repo.package_json.glyph} {repo.package_json.name} + pull requests {repo.pkg.package_json.glyph} {repo.pkg.package_json.name}
- +
diff --git a/src/lib/Repos_Table.svelte b/src/lib/Repos_Table.svelte index 62125632..8bb5a494 100644 --- a/src/lib/Repos_Table.svelte +++ b/src/lib/Repos_Table.svelte @@ -19,14 +19,14 @@ // TODO hacky, handle regular deps too const lookup_dep_version = (repo: Repo, dep: string): string | undefined => { - for (const key in repo.package_json.dependencies) { + for (const key in repo.pkg.package_json.dependencies) { if (key === dep) { - return repo.package_json.dependencies[key]; + return repo.pkg.package_json.dependencies[key]; } } - for (const key in repo.package_json.devDependencies) { + for (const key in repo.pkg.package_json.devDependencies) { if (key === dep) { - return repo.package_json.devDependencies[key]; + return repo.pkg.package_json.devDependencies[key]; } } return undefined; @@ -35,9 +35,9 @@ const latest_version_by_dep = $derived( new Map( deps.map((dep) => { - const repo = repos.find((repo) => repo.package_json.name === dep); - if (!repo?.package_json) return [dep, null]; - return [dep, repo.package_json.version]; + const repo = repos.find((repo) => repo.pkg.package_json.name === dep); + if (!repo?.pkg.package_json) return [dep, null]; + return [dep, repo.pkg.package_json.version]; }), ), ); @@ -46,8 +46,8 @@ version == null ? '' : version.replace(/^(\^|>=)\s*/, ''); const lookup_pull_requests = (repos: Array | null, repo: Repo) => { - const found = repos?.find((p) => p.repo_url === repo.repo_url); - if (!found?.package_json) return null; + const found = repos?.find((p) => p.pkg.repo_url === repo.pkg.repo_url); + if (!found?.pkg.package_json) return null; const {pull_requests} = found; return pull_requests; }; @@ -68,13 +68,13 @@ - {#each repos as repo (repo.name)} - {@const {package_json, homepage_url} = repo} + {#each repos as repo (repo.pkg.name)} + {@const {package_json, homepage_url} = repo.pkg} @@ -84,8 +84,8 @@ {repo.logo_alt} {#if package_json} - {repo.repo_name} + {repo.pkg.repo_name} {@const check_runs = repo.check_runs} {@const check_runs_completed = check_runs?.status === 'completed'} {@const check_runs_success = check_runs?.conclusion === 'success'} {#if check_runs && (!check_runs_completed || !check_runs_success)} {format_url(repo.repo_url)}{format_url(repo.pkg.repo_url)} {/if} - {#if repo.npm_url} + {#if repo.pkg.npm_url}
{repo.name}{repo.pkg.name}
{/if} @@ -131,7 +131,7 @@ {#if package_json.version !== '0.0.1'} {format_version(package_json.version)}{format_version(package_json.version)} {/if} @@ -148,14 +148,14 @@ {/each} - {#if repo.repo_url} + {#if repo.pkg.repo_url} {@const pull_requests = lookup_pull_requests(repos, repo)}
{#if pull_requests} {#each pull_requests as pull (pull)} #{pull.number} diff --git a/src/lib/Repos_Tree.svelte b/src/lib/Repos_Tree.svelte index 488bc679..46b944c1 100644 --- a/src/lib/Repos_Tree.svelte +++ b/src/lib/Repos_Tree.svelte @@ -24,15 +24,15 @@ {#if selected_repo}
- +
{:else} - {#each repos as repo (repo.name)} + {#each repos as repo (repo.pkg.name)}
  • - {#if repo.package_json} - + {#if repo.pkg.package_json} + {#snippet repo_name(repo_name)} {repo_name} {/snippet} @@ -42,7 +42,7 @@

    failed to fetch .well-known/package.json from {format_url(repo.repo_url)}{format_url(repo.pkg.repo_url)}

  • diff --git a/src/lib/Repos_Tree_Nav.svelte b/src/lib/Repos_Tree_Nav.svelte index 2f2d6670..c6215396 100644 --- a/src/lib/Repos_Tree_Nav.svelte +++ b/src/lib/Repos_Tree_Nav.svelte @@ -15,15 +15,16 @@
    - + {#snippet logo_header()}about{/snippet} {#snippet logo_footer()}fuz.dev{/snippet} diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte index 244ed8d6..cb7980bb 100644 --- a/src/routes/about/+page.svelte +++ b/src/routes/about/+page.svelte @@ -10,17 +10,17 @@ - about {repo.package_json.glyph} {repo.package_json.name} + about {repo.pkg.package_json.glyph} {repo.pkg.package_json.name}
    - +
    - +
    diff --git a/src/routes/tree/[slug]/+page.ts b/src/routes/tree/[slug]/+page.ts index e1286046..3909114a 100644 --- a/src/routes/tree/[slug]/+page.ts +++ b/src/routes/tree/[slug]/+page.ts @@ -6,5 +6,5 @@ import {repos} from '$routes/repos.js'; const parsed = parse_repos(repos, 'https://gitops.fuz.dev/'); export const entries: EntryGenerator = () => { - return parsed.repos.map((d) => ({slug: d.repo_name})); + return parsed.repos.map((d) => ({slug: d.pkg.repo_name})); }; diff --git a/src/test/test_helpers.ts b/src/test/test_helpers.ts index baa0adb6..b0e40260 100644 --- a/src/test/test_helpers.ts +++ b/src/test/test_helpers.ts @@ -48,7 +48,18 @@ export const create_mock_repo = (options: Mock_Repo_Options): Local_Repo => { repo_dir: null, branch: 'main', }, - pkg: new Pkg({name, version, private: private_option}, {name, version}), + pkg: new Pkg( + { + name, + version, + private: private_option, + dependencies: Object.keys(deps).length > 0 ? deps : undefined, + devDependencies: Object.keys(dev_deps).length > 0 ? dev_deps : undefined, + peerDependencies: Object.keys(peer_deps).length > 0 ? peer_deps : undefined, + repository: {type: 'git', url: `git+https://github.com/test/${name}.git`}, + }, + {name, version}, + ), // { // name, // repo_name: name, From 3434ed1dee365590b2cc01b813f6f5ecbae07ee7 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sat, 22 Nov 2025 09:52:43 -0500 Subject: [PATCH 21/41] wip --- TODO_src_json_refactor.md | 183 ++++++++++++++++++++++++++++ package-lock.json | 8 +- package.json | 2 +- src/lib/Modules_Detail.svelte | 4 +- src/lib/Modules_Nav.svelte | 2 +- src/lib/Modules_Page.svelte | 8 +- src/lib/Page_Footer.svelte | 2 +- src/lib/Pull_Requests_Detail.svelte | 4 +- src/lib/Pull_Requests_Page.svelte | 10 +- src/lib/Repos_Table.svelte | 4 +- src/lib/Repos_Tree.svelte | 4 +- src/lib/Repos_Tree_Nav.svelte | 2 +- src/lib/Table_Page.svelte | 8 +- src/lib/Tree_Item_Page.svelte | 8 +- src/lib/Tree_Page.svelte | 8 +- src/lib/changeset_generator.ts | 6 +- src/lib/changeset_reader.ts | 6 +- src/lib/dependency_graph.ts | 2 +- src/lib/dependency_updater.ts | 12 +- src/lib/fetch_repo_data.ts | 6 +- src/lib/github_helpers.ts | 4 +- src/lib/gitops_analyze.task.ts | 12 +- src/lib/gitops_config.ts | 2 +- src/lib/gitops_plan.task.ts | 6 +- src/lib/gitops_publish.task.ts | 8 +- src/lib/gitops_sync.task.ts | 10 +- src/lib/gitops_task_helpers.ts | 10 +- src/lib/gitops_validate.task.ts | 12 +- src/lib/graph_validation.ts | 4 +- src/lib/local_repo.ts | 8 +- src/lib/log_helpers.ts | 2 +- src/lib/multi_repo_publisher.ts | 18 +-- src/lib/npm_install_helpers.ts | 4 +- src/lib/operations.ts | 10 +- src/lib/operations_defaults.ts | 10 +- src/lib/preflight_checks.ts | 6 +- src/lib/publishing_plan.ts | 16 +-- src/lib/repo.ts | 2 +- src/lib/resolved_gitops_config.ts | 4 +- src/lib/serialization_types.ts | 2 +- src/lib/version_utils.ts | 2 +- 41 files changed, 311 insertions(+), 130 deletions(-) create mode 100644 TODO_src_json_refactor.md diff --git a/TODO_src_json_refactor.md b/TODO_src_json_refactor.md new file mode 100644 index 00000000..3ff7eb08 --- /dev/null +++ b/TODO_src_json_refactor.md @@ -0,0 +1,183 @@ +# TODO: src_json Refactoring - Types in Belt + +> Plan revised 2024-11-22. Execute across belt, gro, fuz repos. + +## Goal + +Consolidate `src_json` types and schemas in belt. Update to fuz's rich +array-based format. Keep generation logic in gro, helpers in fuz. + +## Final Design + +``` +Belt Gro Fuz +───── ─── ─── +src_json.ts: src_json.ts: src_json.ts: + Src_Json (Zod) src_json_create() re-exports from belt + Module_Json src_json_serialize() identifier_display_name_get() + Identifier_Json src_modules_create() identifier_import_generate() + Identifier_Kind Src_Json_Mapper + Generic_Param_Info gro_plugin_sveltekit_app.ts pkg.svelte.ts: + Parameter_Info (uses src_json.ts) Pkg class (reactive) + Component_Prop_Info module.svelte.ts: + imports types from belt Module class (reactive) +pkg_json.ts: identifier.svelte.ts: + Pkg_Json Identifier class (reactive) + pkg_json_parse() + pkg_repo_name_parse() imports types from belt + pkg_org_url_parse() +``` + +## Design Decisions + +- **Types/schemas in belt** - shared dependency for both gro and fuz +- **Generation in gro** - build-time tooling stays in build tool +- **Helpers in fuz** - UI-oriented functions (`get_identifier_display_name`, etc.) +- **No gro→fuz dependency** - build tool should not depend on UI library +- **Rich format everywhere** - array-based `Module_Json` with full `Identifier_Json` + +## Naming Convention + +Following fuz's domain-first, action-last pattern: + +```ts +// Belt type renames (src_json.ts) +Src_Modules → (removed, inline Array) +Src_Module → Module_Json +Src_Module_Declaration → Identifier_Json +Src_Module_Declaration_Kind → Identifier_Kind +declarations (field) → identifiers + +// Belt renames (pkg.ts → pkg_json.ts) +Pkg → Pkg_Json +parse_pkg → pkg_json_parse +parse_repo_name → pkg_repo_name_parse +parse_org_url → pkg_org_url_parse + +// Gro renames +create_src_json → src_json_create +serialize_src_json → src_json_serialize +Map_Src_Json → Src_Json_Mapper +Map_Package_Json → Package_Json_Mapper +to_src_modules → src_modules_create + +// Fuz renames (src_json.ts) +get_identifier_display_name → identifier_display_name_get +generate_import_statement → identifier_import_generate +``` + +## Migration Order + +### Phase 1: Belt + +Update `src_json.ts` to rich format: + +- [x] Remove `Src_Modules` type (inline `Array` in `Src_Json`) +- [x] Rename `Src_Module` → `Module_Json` +- [x] Rename `Src_Module_Declaration` → `Identifier_Json` with rich fields +- [x] Rename `Src_Module_Declaration_Kind` → `Identifier_Kind` (add `'constructor'`) +- [x] Rename `declarations` field → `identifiers` +- [x] Add supporting types from fuz: `Generic_Param_Info`, `Parameter_Info`, `Component_Prop_Info` +- [x] Update Zod schemas to match new structure + +Rename `pkg.ts` → `pkg_json.ts`: + +- [x] Rename `Pkg` → `Pkg_Json` +- [x] Rename `parse_pkg` → `pkg_json_parse` +- [x] Rename `parse_repo_name` → `pkg_repo_name_parse` +- [x] Rename `parse_org_url` → `pkg_org_url_parse` +- [x] Update package.json exports (glob pattern, no change needed) + +Update `CLAUDE.md`: + +- [x] Remove "API documentation system types (use fuz's src_json.ts)" +- [x] Add: "Src_Json types/schemas - shared by gro (generation) and fuz (UI)" + +Publish new version. (pending) + +### Phase 2: Gro + +- [ ] Update `src_json.ts` - import types from belt, keep generation logic +- [ ] Remove fuz import (line 7: `import {Src_Json, Src_Modules} from '@ryanatkn/fuz/src_json.js'`) +- [ ] Rename functions: `src_json_create`, `src_json_serialize`, `src_modules_create` +- [ ] Rename types: `Src_Json_Mapper`, `Package_Json_Mapper` +- [ ] Update `parse_exports.ts` - import `Identifier_Kind` from belt +- [ ] Update `parse_exports_context.ts` - import from belt +- [ ] Update generation to produce rich format +- [ ] Update tests +- [ ] Publish new version + +### Phase 3: Fuz + +Update `src_json.ts`: + +- [ ] Remove type definitions (now in belt) +- [ ] Re-export types from belt for convenience +- [ ] Rename `get_identifier_display_name` → `identifier_display_name_get` +- [ ] Rename `generate_import_statement` → `identifier_import_generate` + +Update reactive classes: + +- [ ] `pkg.svelte.ts` - use `Pkg_Json` from belt as underlying data type +- [ ] `module.svelte.ts` - use `Module_Json` from belt +- [ ] `identifier.svelte.ts` - use `Identifier_Json` from belt + +Update `CLAUDE.md`: + +- [ ] Note types come from belt, fuz re-exports for convenience + +Publish new version. + +### Phase 4: Downstream + +- [ ] fuz_gitops - update imports if needed +- [ ] fuz_template, fuz_blog, fuz_code, etc. - run `gro gen` +- [ ] gro's own package.ts - run `gro gen` + +## Breaking Changes + +**Belt:** +- `@ryanatkn/belt/src_json.js` - type renames, format change (object → array modules) +- `@ryanatkn/belt/pkg.js` → `@ryanatkn/belt/pkg_json.js` - file and export renames + +**Gro:** +- `src_json_create`, `src_json_serialize`, `src_modules_create` - function renames +- `Src_Json_Mapper`, `Package_Json_Mapper` - type renames + +**Fuz:** +- `@ryanatkn/fuz/src_json.js` - types now re-exported from belt +- `identifier_display_name_get`, `identifier_import_generate` - function renames + +**Format:** +- `.well-known/src.json` - now rich (array-based modules, full identifiers) + +## Files Summary + +### Modify (Belt) + +- `src/lib/src_json.ts` - update to rich format, rename types, update Zod schemas +- `src/lib/pkg.ts` → `src/lib/pkg_json.ts` - rename file, types, and functions +- `package.json` - update exports for file rename +- `CLAUDE.md` - update scope documentation + +### Modify (Gro) + +- `src/lib/src_json.ts` - import from belt, rename functions, keep generation +- `src/lib/parse_exports.ts` - import `Identifier_Kind` from belt +- `src/lib/parse_exports_context.ts` - import from belt +- `src/lib/gro_plugin_sveltekit_app.ts` - update function names +- `src/lib/package_json.ts` - rename `Map_Package_Json` → `Package_Json_Mapper` + +### Modify (Fuz) + +- `src/lib/src_json.ts` - remove types, re-export from belt, rename helpers +- `src/lib/pkg.svelte.ts` - use `Pkg_Json` from belt +- `src/lib/module.svelte.ts` - use `Module_Json` from belt +- `src/lib/identifier.svelte.ts` - use `Identifier_Json` from belt +- `CLAUDE.md` - note types come from belt + +### Already Done (fuz_gitops) + +- Migrated to `repo.pkg.*` pattern +- Using fuz's `Module_Json` types +- Fixed `create_mock_repo` test helper diff --git a/package-lock.json b/package-lock.json index 0b199bc7..76157b1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@ryanatkn/belt": "^0.37.2", - "@ryanatkn/eslint-config": "^0.8.1", + "@ryanatkn/eslint-config": "^0.9.0", "@ryanatkn/fuz": "^0.151.2", "@ryanatkn/gro": "^0.173.2", "@ryanatkn/moss": "^0.37.0", @@ -1443,9 +1443,9 @@ } }, "node_modules/@ryanatkn/eslint-config": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@ryanatkn/eslint-config/-/eslint-config-0.8.1.tgz", - "integrity": "sha512-GRjGFhu6scntmM0KRbHTV2bwfTfdT/IVH96aagic0fuL4T/gWCGbjl+AwpRIot4Y08o1Q90p7WXF72z/+m9dGw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/eslint-config/-/eslint-config-0.9.0.tgz", + "integrity": "sha512-RF42tZfJo2CYE4E3clQRBm9bVHMpL5ErR3HfWaxbiuL1aGraehegsiXMsr1L4BiKpSP55ZO8vvCr1ibUaSRIrQ==", "dev": true, "license": "Unlicense", "dependencies": { diff --git a/package.json b/package.json index 4ba61452..e901efef 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@ryanatkn/belt": "^0.37.2", - "@ryanatkn/eslint-config": "^0.8.1", + "@ryanatkn/eslint-config": "^0.9.0", "@ryanatkn/fuz": "^0.151.2", "@ryanatkn/gro": "^0.173.2", "@ryanatkn/moss": "^0.37.0", diff --git a/src/lib/Modules_Detail.svelte b/src/lib/Modules_Detail.svelte index e5308858..3701ef2d 100644 --- a/src/lib/Modules_Detail.svelte +++ b/src/lib/Modules_Detail.svelte @@ -4,8 +4,8 @@ import {resolve} from '$app/paths'; import type {Snippet} from 'svelte'; - import Modules_Nav from '$lib/Modules_Nav.svelte'; - import type {Repo} from '$lib/repo.js'; + import Modules_Nav from './Modules_Nav.svelte'; + import type {Repo} from './repo.js'; interface Props { repos: Array; // TODO normalized version with cached primitives? diff --git a/src/lib/Modules_Nav.svelte b/src/lib/Modules_Nav.svelte index 717f5bad..b5770a8b 100644 --- a/src/lib/Modules_Nav.svelte +++ b/src/lib/Modules_Nav.svelte @@ -2,7 +2,7 @@ import {page} from '$app/state'; import type {Module_Json} from '@ryanatkn/fuz/src_json.js'; - import type {Repo} from '$lib/repo.js'; + import type {Repo} from './repo.js'; // TODO add highlighting of the items that are onscreen diff --git a/src/lib/Modules_Page.svelte b/src/lib/Modules_Page.svelte index 6c7beef7..0aae232e 100644 --- a/src/lib/Modules_Page.svelte +++ b/src/lib/Modules_Page.svelte @@ -1,10 +1,10 @@ diff --git a/src/lib/Pull_Requests_Detail.svelte b/src/lib/Pull_Requests_Detail.svelte index dc7150cd..cb95066a 100644 --- a/src/lib/Pull_Requests_Detail.svelte +++ b/src/lib/Pull_Requests_Detail.svelte @@ -1,8 +1,8 @@ diff --git a/src/lib/Repos_Table.svelte b/src/lib/Repos_Table.svelte index 8bb5a494..690c403f 100644 --- a/src/lib/Repos_Table.svelte +++ b/src/lib/Repos_Table.svelte @@ -3,8 +3,8 @@ import {resolve} from '$app/paths'; import {format_url} from '@ryanatkn/belt/url.js'; - import type {Repo} from '$lib/repo.js'; - import {to_pull_url} from '$lib/github_helpers.js'; + import type {Repo} from './repo.js'; + import {to_pull_url} from './github_helpers.js'; interface Props { repos: Array; diff --git a/src/lib/Repos_Tree.svelte b/src/lib/Repos_Tree.svelte index 46b944c1..1fefc8e3 100644 --- a/src/lib/Repos_Tree.svelte +++ b/src/lib/Repos_Tree.svelte @@ -5,8 +5,8 @@ import {format_url} from '@ryanatkn/belt/url.js'; import type {Snippet} from 'svelte'; - import type {Repo} from '$lib/repo.js'; - import Repos_Tree_Nav from '$lib/Repos_Tree_Nav.svelte'; + import type {Repo} from './repo.js'; + import Repos_Tree_Nav from './Repos_Tree_Nav.svelte'; interface Props { repos: Array; diff --git a/src/lib/Repos_Tree_Nav.svelte b/src/lib/Repos_Tree_Nav.svelte index c6215396..65b2effd 100644 --- a/src/lib/Repos_Tree_Nav.svelte +++ b/src/lib/Repos_Tree_Nav.svelte @@ -2,7 +2,7 @@ import {resolve} from '$app/paths'; import type {Snippet} from 'svelte'; - import type {Repo} from '$lib/repo.js'; + import type {Repo} from './repo.js'; interface Props { repos: Array; diff --git a/src/lib/Table_Page.svelte b/src/lib/Table_Page.svelte index 58412a08..3a28ee85 100644 --- a/src/lib/Table_Page.svelte +++ b/src/lib/Table_Page.svelte @@ -1,8 +1,8 @@ diff --git a/src/lib/Pull_Requests_Detail.svelte b/src/lib/Pull_Requests_Detail.svelte index cb95066a..2e05f63f 100644 --- a/src/lib/Pull_Requests_Detail.svelte +++ b/src/lib/Pull_Requests_Detail.svelte @@ -2,7 +2,7 @@ import {resolve} from '$app/paths'; import {to_pull_requests, type Filter_Pull_Request} from './github_helpers.js'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; interface Props { repos: Array; diff --git a/src/lib/Pull_Requests_Page.svelte b/src/lib/Pull_Requests_Page.svelte index 86984e10..aa1e8604 100644 --- a/src/lib/Pull_Requests_Page.svelte +++ b/src/lib/Pull_Requests_Page.svelte @@ -12,7 +12,7 @@ import Page_Header from './Page_Header.svelte'; import Pull_Requests_Detail from './Pull_Requests_Detail.svelte'; import type {Filter_Pull_Request} from './github_helpers.js'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; const {repo, repos, filter_pull_request}: Props = $props(); diff --git a/src/lib/Repos_Table.svelte b/src/lib/Repos_Table.svelte index 690c403f..a8fe383f 100644 --- a/src/lib/Repos_Table.svelte +++ b/src/lib/Repos_Table.svelte @@ -3,7 +3,7 @@ import {resolve} from '$app/paths'; import {format_url} from '@ryanatkn/belt/url.js'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; import {to_pull_url} from './github_helpers.js'; interface Props { diff --git a/src/lib/Repos_Tree.svelte b/src/lib/Repos_Tree.svelte index 1fefc8e3..d02028b4 100644 --- a/src/lib/Repos_Tree.svelte +++ b/src/lib/Repos_Tree.svelte @@ -5,7 +5,7 @@ import {format_url} from '@ryanatkn/belt/url.js'; import type {Snippet} from 'svelte'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; import Repos_Tree_Nav from './Repos_Tree_Nav.svelte'; interface Props { diff --git a/src/lib/Repos_Tree_Nav.svelte b/src/lib/Repos_Tree_Nav.svelte index 65b2effd..75e41d17 100644 --- a/src/lib/Repos_Tree_Nav.svelte +++ b/src/lib/Repos_Tree_Nav.svelte @@ -2,7 +2,7 @@ import {resolve} from '$app/paths'; import type {Snippet} from 'svelte'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; interface Props { repos: Array; diff --git a/src/lib/Table_Page.svelte b/src/lib/Table_Page.svelte index 3a28ee85..c74d4277 100644 --- a/src/lib/Table_Page.svelte +++ b/src/lib/Table_Page.svelte @@ -2,7 +2,7 @@ import Page_Footer from './Page_Footer.svelte'; import Page_Header from './Page_Header.svelte'; import Repos_Table from './Repos_Table.svelte'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; interface Props { repo: Repo; diff --git a/src/lib/Tree_Item_Page.svelte b/src/lib/Tree_Item_Page.svelte index 1e012a7a..c6d82554 100644 --- a/src/lib/Tree_Item_Page.svelte +++ b/src/lib/Tree_Item_Page.svelte @@ -5,7 +5,7 @@ import Page_Footer from './Page_Footer.svelte'; import Page_Header from './Page_Header.svelte'; import Repos_Tree from './Repos_Tree.svelte'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; interface Props { repo: Repo; diff --git a/src/lib/Tree_Page.svelte b/src/lib/Tree_Page.svelte index 891cdf50..1b3ad024 100644 --- a/src/lib/Tree_Page.svelte +++ b/src/lib/Tree_Page.svelte @@ -4,7 +4,7 @@ import Page_Footer from './Page_Footer.svelte'; import Page_Header from './Page_Header.svelte'; import Repos_Tree from './Repos_Tree.svelte'; - import type {Repo} from './repo.js'; + import type {Repo} from './repo.svelte.js'; interface Props { repo: Repo; diff --git a/src/lib/fetch_repo_data.ts b/src/lib/fetch_repo_data.ts index b50dec3b..64cf6ed2 100644 --- a/src/lib/fetch_repo_data.ts +++ b/src/lib/fetch_repo_data.ts @@ -3,7 +3,7 @@ import {wait} from '@ryanatkn/belt/async.js'; import type {Fetch_Value_Cache} from '@ryanatkn/belt/fetch.js'; import {fetch_github_check_runs, fetch_github_pull_requests} from './github.js'; -import type {Repo} from './repo.js'; +import type {Repo_Json} from './repo.svelte.js'; import type {Local_Repo} from './local_repo.js'; /* eslint-disable no-await-in-loop */ @@ -28,8 +28,8 @@ export const fetch_repo_data = async ( log?: Logger, delay = 33, github_api_version?: string, -): Promise> => { - const repos: Array = []; +): Promise> => { + const repos: Array = []; for (const {repo_url, repo_config, pkg} of resolved_repos) { // CI status await wait(delay); @@ -55,7 +55,8 @@ export const fetch_repo_data = async ( if (!pull_requests) log?.error('failed to fetch issues: ' + repo_url); repos.push({ - pkg, + package_json: pkg.package_json, + src_json: pkg.src_json, check_runs, pull_requests, }); diff --git a/src/lib/github_helpers.ts b/src/lib/github_helpers.ts index a141732c..d112c0ab 100644 --- a/src/lib/github_helpers.ts +++ b/src/lib/github_helpers.ts @@ -1,7 +1,7 @@ import {ensure_end} from '@ryanatkn/belt/string.js'; import type {Github_Pull_Request} from './github.js'; -import type {Repo} from './repo.js'; +import type {Repo} from './repo.svelte.js'; export type Filter_Pull_Request = (pull_request: Github_Pull_Request, repo: Repo) => boolean; diff --git a/src/lib/gitops_sync.task.ts b/src/lib/gitops_sync.task.ts index b790c755..dfb0b480 100644 --- a/src/lib/gitops_sync.task.ts +++ b/src/lib/gitops_sync.task.ts @@ -64,12 +64,14 @@ export const task: Task = { const cache = await create_fs_fetch_value_cache('repos'); log.info('fetching remote repo data'); - const repos = await fetch_repo_data(local_repos, token, cache.data, log); + const repos_json = await fetch_repo_data(local_repos, token, cache.data, log); // TODO should package_json be provided in the Gro task/gen contexts? check if it's always loaded const package_json = load_package_json(); const repo_specifier = - package_json.name === '@ryanatkn/fuz_gitops' ? './repo.js' : '@ryanatkn/fuz_gitops/repo.js'; + package_json.name === '@ryanatkn/fuz_gitops' + ? './repo.svelte.js' + : '@ryanatkn/fuz_gitops/repo.svelte.js'; log.info('generating ' + outfile); @@ -80,9 +82,9 @@ export const task: Task = { // because for example linking to a local package would change the contents const contents = ` // generated by ${basename(import.meta.filename)} - import type {Repo} from '${repo_specifier}'; + import type {Repo_Json} from '${repo_specifier}'; - export const repos: Array = ${json_embed(repos, (s) => JSON.stringify(s, null, '\t'))}; + export const repos_json: Array = ${json_embed(repos_json, (s) => JSON.stringify(s, null, '\t'))}; `; // TODO think about possibly using the `gen` functionality in this task, not sure what the API design could look like const formatted = await format_file(contents, {filepath: outfile}); diff --git a/src/lib/repo.svelte.ts b/src/lib/repo.svelte.ts new file mode 100644 index 00000000..439a09a1 --- /dev/null +++ b/src/lib/repo.svelte.ts @@ -0,0 +1,46 @@ +import {create_context} from '@ryanatkn/fuz/context_helpers.js'; +import {Pkg} from '@ryanatkn/fuz/pkg.svelte.js'; +import type {Package_Json} from '@ryanatkn/belt/package_json.js'; +import type {Src_Json} from '@ryanatkn/belt/src_json.js'; + +import {Github_Check_Runs_Item, type Github_Pull_Request} from './github.js'; + +/** + * Serialized repo data as stored in repos.ts (JSON). + */ +export interface Repo_Json { + package_json: Package_Json; + src_json: Src_Json; + check_runs: Github_Check_Runs_Item | null; + pull_requests: Array | null; +} + +/** + * Runtime repo with Pkg instance. + */ +export class Repo { + pkg: Pkg; + check_runs: Github_Check_Runs_Item | null; + pull_requests: Array | null; + + constructor(repo_json: Repo_Json) { + this.pkg = new Pkg(repo_json.package_json, repo_json.src_json); + this.check_runs = repo_json.check_runs; + this.pull_requests = repo_json.pull_requests; + } +} + +export interface Repos { + repo: Repo; + repos: Array; +} + +export const repos_context = create_context(); + +export const repos_parse = (repos: Array, homepage_url: string): Repos => { + // We expect to find this because it's sourced from the local package.json + const repo = repos.find((d) => d.pkg.homepage_url === homepage_url); + if (!repo) throw Error(`Cannot find repo with homepage_url: ${homepage_url}`); + + return {repo, repos}; +}; diff --git a/src/lib/repo.ts b/src/lib/repo.ts deleted file mode 100644 index 9c4596a1..00000000 --- a/src/lib/repo.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {create_context} from '@ryanatkn/fuz/context_helpers.js'; -import type {Pkg} from '@ryanatkn/fuz/pkg.svelte.js'; - -import {Github_Check_Runs_Item, type Github_Pull_Request} from './github.js'; - -export interface Repo { - pkg: Pkg; - check_runs: Github_Check_Runs_Item | null; - pull_requests: Array | null; -} - -export interface Repos { - repo: Repo; - repos: Array; -} - -export const repos_context = create_context(); - -export const parse_repos = (repos: Array, homepage_url: string): Repos => { - // We expect to find this because it's sourced from the local package.json - const repo = repos.find((d) => d.pkg.homepage_url === homepage_url); - if (!repo) throw Error(`Cannot find repo with homepage_url: ${homepage_url}`); - - return {repo, repos}; -}; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 19da6726..a9090e97 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -14,8 +14,8 @@ import type {Snippet} from 'svelte'; import Settings from '$routes/Settings.svelte'; - import {repos} from '$routes/repos.js'; - import {parse_repos, repos_context} from '$lib/repo.js'; + import {repos_json} from '$routes/repos.js'; + import {Repo, type Repo_Json, repos_parse, repos_context} from '$lib/repo.svelte.js'; interface Props { children: Snippet; @@ -25,7 +25,7 @@ const contextmenu = new Contextmenu_State(); - repos_context.set(parse_repos(repos, 'https://gitops.fuz.dev/')); + repos_context.set(repos_parse(repos_json.map((r: Repo_Json) => new Repo(r)), 'https://gitops.fuz.dev/')); let show_settings = $state(false); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 8ee3b15c..d947c7c4 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -4,7 +4,7 @@ import {resolve} from '$app/paths'; import Main_Header from '$routes/Main_Header.svelte'; - import {repos_context} from '$lib/repo.js'; + import {repos_context} from '$lib/repo.svelte.js'; const {repo} = repos_context.get(); diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte index cb7980bb..aaab6eda 100644 --- a/src/routes/about/+page.svelte +++ b/src/routes/about/+page.svelte @@ -2,7 +2,7 @@ import Package_Detail from '@ryanatkn/fuz/Package_Detail.svelte'; import Ecosystem_Links_Panel from '@ryanatkn/fuz/Ecosystem_Links_Panel.svelte'; - import {repos_context} from '$lib/repo.js'; + import {repos_context} from '$lib/repo.svelte.js'; import Page_Footer from '$lib/Page_Footer.svelte'; import Page_Header from '$lib/Page_Header.svelte'; diff --git a/src/routes/modules/+page.svelte b/src/routes/modules/+page.svelte index 0f0362b8..494c852d 100644 --- a/src/routes/modules/+page.svelte +++ b/src/routes/modules/+page.svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/pull_requests/+page.svelte b/src/routes/pull_requests/+page.svelte index 1c22b4ee..9eec988b 100644 --- a/src/routes/pull_requests/+page.svelte +++ b/src/routes/pull_requests/+page.svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/repos.ts b/src/routes/repos.ts index ceee4cc4..14a30ea4 100644 --- a/src/routes/repos.ts +++ b/src/routes/repos.ts @@ -1,7 +1,7 @@ // generated by gitops_sync.task.ts -import type {Repo} from '$lib/repo.js'; +import type {Repo_Json} from '$lib/repo.svelte.js'; -export const repos: Array = JSON.parse( +export const repos_json: Array = JSON.parse( '[\ {\ "package_json": {\ diff --git a/src/routes/table/+page.svelte b/src/routes/table/+page.svelte index 8354d8f4..345641f9 100644 --- a/src/routes/table/+page.svelte +++ b/src/routes/table/+page.svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/tree/+page.svelte b/src/routes/tree/+page.svelte index ee04734e..46d13cf5 100644 --- a/src/routes/tree/+page.svelte +++ b/src/routes/tree/+page.svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/tree/[slug]/+page.ts b/src/routes/tree/[slug]/+page.ts index c0fc472b..13fc7b0f 100644 --- a/src/routes/tree/[slug]/+page.ts +++ b/src/routes/tree/[slug]/+page.ts @@ -3,7 +3,10 @@ import type {EntryGenerator} from './$types.js'; import {Repo, type Repo_Json, repos_parse} from '$lib/repo.svelte.js'; import {repos_json} from '$routes/repos.js'; -const parsed = repos_parse(repos_json.map((r: Repo_Json) => new Repo(r)), 'https://gitops.fuz.dev/'); +const parsed = repos_parse( + repos_json.map((r: Repo_Json) => new Repo(r)), + 'https://gitops.fuz.dev/', +); export const entries: EntryGenerator = () => { return parsed.repos.map((d) => ({slug: d.pkg.repo_name})); From b0f5e3d47a9daf8dd930059b9d6dc29755a285e8 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sun, 23 Nov 2025 20:06:52 -0500 Subject: [PATCH 26/41] wip --- package-lock.json | 528 ++++++++++++++++++---------------------------- package.json | 14 +- 2 files changed, 217 insertions(+), 325 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5067c26..8b59f366 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,24 +12,24 @@ "@changesets/changelog-git": "^0.2.1", "@ryanatkn/belt": "^0.38.0", "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/fuz": "^0.158.0", + "@ryanatkn/fuz": "^0.159.0", "@ryanatkn/gro": "^0.174.2", "@ryanatkn/moss": "^0.38.0", - "@sveltejs/adapter-static": "^3.0.9", + "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.49.0", "@sveltejs/package": "^2.5.6", "@sveltejs/vite-plugin-svelte": "^6.2.1", - "@types/node": "^24.3.1", - "eslint": "^9.35.0", - "eslint-plugin-svelte": "^3.12.2", + "@types/node": "^24.10.1", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", "svelte": "^5.43.14", "svelte-check": "^4.3.4", "tslib": "^2.8.1", "typescript": "^5.9.3", - "typescript-eslint": "^8.42.0", - "vitest": "^3.2.4" + "typescript-eslint": "^8.47.0", + "vitest": "^4.0.13" }, "engines": { "node": ">=22.15" @@ -583,13 +583,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -598,19 +598,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -658,9 +661,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { @@ -671,9 +674,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -681,13 +684,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -1464,9 +1467,9 @@ } }, "node_modules/@ryanatkn/fuz": { - "version": "0.158.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.158.0.tgz", - "integrity": "sha512-8tsmMVTpPwpRZ4ZMxNxJp6fyRQrUaPxk0cUGdzWs5zP/PY0vwtT9DiBk94yUWReHeEOc9+blXDiXJAd/IYhomA==", + "version": "0.159.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.159.0.tgz", + "integrity": "sha512-7NL1tCLGaEcAZJffWNQoqCczpsQZ4sMqU+PbP3RdMVQ82byjRETDn5ekdywB7bbRK+Zhpkr2pvBU6uFFLBTUdA==", "dev": true, "license": "MIT", "engines": { @@ -1694,13 +1697,14 @@ } }, "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, "node_modules/@types/cookie": { @@ -1732,27 +1736,27 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", - "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.16.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", - "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", + "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.42.0", - "@typescript-eslint/type-utils": "8.42.0", - "@typescript-eslint/utils": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/type-utils": "8.47.0", + "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1766,7 +1770,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.42.0", + "@typescript-eslint/parser": "^8.47.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1782,16 +1786,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", - "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", + "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.42.0", - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/typescript-estree": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4" }, "engines": { @@ -1807,14 +1811,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", - "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", + "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.42.0", - "@typescript-eslint/types": "^8.42.0", + "@typescript-eslint/tsconfig-utils": "^8.47.0", + "@typescript-eslint/types": "^8.47.0", "debug": "^4.3.4" }, "engines": { @@ -1829,14 +1833,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", - "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", + "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0" + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1847,9 +1851,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", - "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", + "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", "dev": true, "license": "MIT", "engines": { @@ -1864,15 +1868,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", - "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", + "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/typescript-estree": "8.42.0", - "@typescript-eslint/utils": "8.42.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1889,9 +1893,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", - "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", + "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", "dev": true, "license": "MIT", "engines": { @@ -1903,16 +1907,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", - "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", + "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.42.0", - "@typescript-eslint/tsconfig-utils": "8.42.0", - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0", + "@typescript-eslint/project-service": "8.47.0", + "@typescript-eslint/tsconfig-utils": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1958,16 +1962,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", - "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", + "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.42.0", - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/typescript-estree": "8.42.0" + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1982,13 +1986,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", - "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", + "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/types": "8.47.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2000,39 +2004,40 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.13.tgz", + "integrity": "sha512-zYtcnNIBm6yS7Gpr7nFTmq8ncowlMdOJkWLqYvhr/zweY6tFbDkDi8BPPOeHxEtK1rSI69H7Fd4+1sqvEGli6w==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.0.13", + "@vitest/utils": "4.0.13", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.13.tgz", + "integrity": "sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", + "@vitest/spy": "4.0.13", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -2044,42 +2049,41 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.13.tgz", + "integrity": "sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.13.tgz", + "integrity": "sha512-9IKlAru58wcVaWy7hz6qWPb2QzJTKt+IOVKjAx5vb5rzEFPTL6H4/R9BMvjZ2ppkxKgTrFONEJFtzvnyEpiT+A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "4.0.13", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.13.tgz", + "integrity": "sha512-hb7Usvyika1huG6G6l191qu1urNPsq1iFc2hmdzQY3F5/rTgqQnwwplyf8zoYHkpt7H6rw5UfIw6i/3qf9oSxQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", + "@vitest/pretty-format": "4.0.13", + "magic-string": "^0.30.21", "pathe": "^2.0.3" }, "funding": { @@ -2087,28 +2091,24 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.13.tgz", + "integrity": "sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.13.tgz", + "integrity": "sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.0.13", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2238,16 +2238,6 @@ "node": ">=8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2259,18 +2249,11 @@ } }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -2292,16 +2275,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -2394,9 +2367,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2418,16 +2391,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2528,25 +2491,24 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -2589,9 +2551,9 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.12.2.tgz", - "integrity": "sha512-NDYltSWcDybvnXD5P3NtrLAfdrgr2lklZsXpyIoSlQfg2d80p/E853XXccu+uVn+w4+Q/iHy4oRw00GJH9I/Cg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.13.0.tgz", + "integrity": "sha512-2ohCCQJJTNbIpQCSDSTWj+FN0OVfPmSO03lmSNT7ytqMaWF6kpT86LdzDqtm4sh7TVPl/OEWJ/d7R87bXP2Vjg==", "dev": true, "license": "MIT", "dependencies": { @@ -2604,7 +2566,7 @@ "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", - "svelte-eslint-parser": "^1.3.0" + "svelte-eslint-parser": "^1.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3041,13 +3003,6 @@ "dev": true, "license": "ISC" }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3163,17 +3118,10 @@ "dev": true, "license": "MIT" }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/magic-string": { - "version": "0.30.18", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", - "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3406,16 +3354,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3844,9 +3782,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, @@ -3863,19 +3801,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3940,9 +3865,9 @@ } }, "node_modules/svelte-eslint-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.3.1.tgz", - "integrity": "sha512-0Iztj5vcOVOVkhy1pbo5uA9r+d3yaVoE5XPc9eABIWDOSJZ2mOsZ4D+t45rphWCOr0uMw3jtSG2fh2e7GvKnPg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.4.0.tgz", + "integrity": "sha512-fjPzOfipR5S7gQ/JvI9r2H8y9gMGXO3JtmrylHLLyahEMquXI0lrebcjT+9/hNgDej0H7abTyox5HpHmW1PSWA==", "dev": true, "license": "MIT", "dependencies": { @@ -3954,7 +3879,8 @@ "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0", + "pnpm": "10.18.3" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" @@ -4014,30 +3940,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -4128,16 +4034,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz", - "integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.47.0.tgz", + "integrity": "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.42.0", - "@typescript-eslint/parser": "8.42.0", - "@typescript-eslint/typescript-estree": "8.42.0", - "@typescript-eslint/utils": "8.42.0" + "@typescript-eslint/eslint-plugin": "8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4152,9 +4058,9 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, @@ -4250,29 +4156,6 @@ } } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vitefu": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", @@ -4294,51 +4177,51 @@ } }, "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.13.tgz", + "integrity": "sha512-QSD4I0fN6uZQfftryIXuqvqgBxTvJ3ZNkF6RWECd82YGAYAfhcppBLFXzXJHQAAhVFyYEuFTrq6h0hQqjB7jIQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", + "@vitest/expect": "4.0.13", + "@vitest/mocker": "4.0.13", + "@vitest/pretty-format": "4.0.13", + "@vitest/runner": "4.0.13", + "@vitest/snapshot": "4.0.13", + "@vitest/spy": "4.0.13", + "@vitest/utils": "4.0.13", + "debug": "^4.4.3", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.13", + "@vitest/browser-preview": "4.0.13", + "@vitest/browser-webdriverio": "4.0.13", + "@vitest/ui": "4.0.13", "happy-dom": "*", "jsdom": "*" }, @@ -4346,13 +4229,22 @@ "@edge-runtime/vm": { "optional": true }, + "@opentelemetry/api": { + "optional": true + }, "@types/debug": { "optional": true }, "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { "optional": true }, "@vitest/ui": { diff --git a/package.json b/package.json index 96433810..59eaca08 100644 --- a/package.json +++ b/package.json @@ -42,24 +42,24 @@ "@changesets/changelog-git": "^0.2.1", "@ryanatkn/belt": "^0.38.0", "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/fuz": "^0.158.0", + "@ryanatkn/fuz": "^0.159.0", "@ryanatkn/gro": "^0.174.2", "@ryanatkn/moss": "^0.38.0", - "@sveltejs/adapter-static": "^3.0.9", + "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.49.0", "@sveltejs/package": "^2.5.6", "@sveltejs/vite-plugin-svelte": "^6.2.1", - "@types/node": "^24.3.1", - "eslint": "^9.35.0", - "eslint-plugin-svelte": "^3.12.2", + "@types/node": "^24.10.1", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", "svelte": "^5.43.14", "svelte-check": "^4.3.4", "tslib": "^2.8.1", "typescript": "^5.9.3", - "typescript-eslint": "^8.42.0", - "vitest": "^3.2.4" + "typescript-eslint": "^8.47.0", + "vitest": "^4.0.13" }, "prettier": { "plugins": [ From f258089e5ca055100498ccc1b85a9ffb811658ec Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 17:49:29 -0500 Subject: [PATCH 27/41] wip --- src/routes/+layout.svelte | 11 +-- src/routes/+page.svelte | 3 + src/routes/docs/+layout.svelte | 19 ++++++ src/routes/docs/+page.svelte | 13 ++++ src/routes/docs/api/+page.svelte | 9 +++ .../docs/api/[...module_path]/+page.svelte | 9 +++ src/routes/docs/package/+page.svelte | 16 +++++ src/routes/docs/tomes.ts | 22 ++++++ src/routes/moss.css | 68 +++++++++++++++++++ 9 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 src/routes/docs/+layout.svelte create mode 100644 src/routes/docs/+page.svelte create mode 100644 src/routes/docs/api/+page.svelte create mode 100644 src/routes/docs/api/[...module_path]/+page.svelte create mode 100644 src/routes/docs/package/+page.svelte create mode 100644 src/routes/docs/tomes.ts diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 75a39c01..b347ae4d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -11,6 +11,7 @@ Contextmenu_State, contextmenu_attachment, } from '@ryanatkn/fuz/contextmenu_state.svelte.js'; + import {pkg_context} from '@ryanatkn/fuz/pkg.svelte.js'; import type {Snippet} from 'svelte'; import Settings from '$routes/Settings.svelte'; @@ -25,12 +26,12 @@ const contextmenu = new Contextmenu_State(); - repos_context.set( - repos_parse( - repos_json.map((r: Repo_Json) => new Repo(r)), - 'https://gitops.fuz.dev/', - ), + const repos = repos_parse( + repos_json.map((r: Repo_Json) => new Repo(r)), + 'https://gitops.fuz.dev/', ); + repos_context.set(repos); + pkg_context.set(repos.repo.pkg); let show_settings = $state(false); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index d947c7c4..7bdc592d 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -19,6 +19,9 @@
    +
  • + docs{#snippet icon()}{repo.pkg.package_json.glyph}{/snippet} +
  • tree
  • diff --git a/src/routes/docs/+layout.svelte b/src/routes/docs/+layout.svelte new file mode 100644 index 00000000..becd20d3 --- /dev/null +++ b/src/routes/docs/+layout.svelte @@ -0,0 +1,19 @@ + + + + {@render children()} + diff --git a/src/routes/docs/+page.svelte b/src/routes/docs/+page.svelte new file mode 100644 index 00000000..a8c7016e --- /dev/null +++ b/src/routes/docs/+page.svelte @@ -0,0 +1,13 @@ + + + diff --git a/src/routes/docs/api/+page.svelte b/src/routes/docs/api/+page.svelte new file mode 100644 index 00000000..c282bbbc --- /dev/null +++ b/src/routes/docs/api/+page.svelte @@ -0,0 +1,9 @@ + + + diff --git a/src/routes/docs/api/[...module_path]/+page.svelte b/src/routes/docs/api/[...module_path]/+page.svelte new file mode 100644 index 00000000..839cc26b --- /dev/null +++ b/src/routes/docs/api/[...module_path]/+page.svelte @@ -0,0 +1,9 @@ + + + diff --git a/src/routes/docs/package/+page.svelte b/src/routes/docs/package/+page.svelte new file mode 100644 index 00000000..7b859dc1 --- /dev/null +++ b/src/routes/docs/package/+page.svelte @@ -0,0 +1,16 @@ + + + +
    + +
    +
    diff --git a/src/routes/docs/tomes.ts b/src/routes/docs/tomes.ts new file mode 100644 index 00000000..faed3928 --- /dev/null +++ b/src/routes/docs/tomes.ts @@ -0,0 +1,22 @@ +import type {Tome} from '@ryanatkn/fuz/tome.js'; +import ApiPage from '$routes/docs/api/+page.svelte'; +import PackagePage from '$routes/docs/package/+page.svelte'; + +export const tomes: Array = [ + { + name: 'api', + category: 'reference', + Component: ApiPage, + related_tomes: [], + related_modules: [], + related_identifiers: [], + }, + { + name: 'package', + category: 'reference', + Component: PackagePage, + related_tomes: [], + related_modules: [], + related_identifiers: [], + }, +]; diff --git a/src/routes/moss.css b/src/routes/moss.css index 3fa0dc76..eb92658c 100644 --- a/src/routes/moss.css +++ b/src/routes/moss.css @@ -173,6 +173,15 @@ a.chip { .position_relative { position: relative; } +.position_absolute { + position: absolute; +} +.position_sticky { + position: sticky; +} +.display_block { + display: block; +} .display_inline_block { display: inline-block; } @@ -188,6 +197,13 @@ a.chip { .align_items_center { align-items: center; } +.justify_content_space_between { + justify-content: space-between; +} +.font_size_md { + font-size: var(--font_size_md); + --font_size: var(--font_size_md); +} .font_size_xl { font-size: var(--font_size_xl); --font_size: var(--font_size_xl); @@ -195,9 +211,21 @@ a.chip { .text_align_center { text-align: center; } +.word_break_break_all { + word-break: break-all; +} +.white_space_pre { + white-space: pre; +} +.white_space_pre_wrap { + white-space: pre-wrap; +} .bg { background-color: var(--bg); } +.color_c_5 { + color: var(--color_c_5); +} .shadow_inset_xs { box-shadow: var(--shadow_inset_xs) color-mix(in hsl, var(--shadow_color) var(--shadow_alpha, var(--shadow_alpha_1)), transparent); @@ -208,6 +236,12 @@ a.chip { .height_100 { height: 100%; } +.top_0 { + top: 0; +} +.right_0 { + right: 0; +} .p_sm { padding: var(--space_sm); } @@ -223,6 +257,25 @@ a.chip { .pt_xl { padding-top: var(--space_xl); } +.pb_0 { + padding-bottom: 0; +} +.pb_xl { + padding-bottom: var(--space_xl); +} +.pl_xl { + padding-left: var(--space_xl); +} +.pl_xl2 { + padding-left: var(--space_xl2); +} +.pl_xl3 { + padding-left: var(--space_xl3); +} +.px_lg { + padding-left: var(--space_lg); + padding-right: var(--space_lg); +} .px_xl { padding-left: var(--space_xl); padding-right: var(--space_xl); @@ -233,6 +286,9 @@ a.chip { .mt_xs { margin-top: var(--space_xs); } +.mt_xl4 { + margin-top: var(--space_xl4); +} .mr_xs { margin-right: var(--space_xs); } @@ -242,15 +298,24 @@ a.chip { .mb_xs { margin-bottom: var(--space_xs); } +.mb_sm { + margin-bottom: var(--space_sm); +} .mb_lg { margin-bottom: var(--space_lg); } +.mb_xl3 { + margin-bottom: var(--space_xl3); +} .mb_xl5 { margin-bottom: var(--space_xl5); } .mb_xl7 { margin-bottom: var(--space_xl7); } +.mb_xl9 { + margin-bottom: var(--space_xl9); +} .ml_sm { margin-left: var(--space_sm); } @@ -258,5 +323,8 @@ a.chip { margin-left: auto; margin-right: auto; } +.gap_md { + gap: var(--space_md); +} /* generated by src/routes/moss.gen.css.ts */ From 75bd98a13a41f11fc428f74d6d53fa8e127439d2 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 17:50:43 -0500 Subject: [PATCH 28/41] wip --- .changeset/red-sites-boil.md | 5 + package-lock.json | 1322 +++++++++++++++++++++------------- package.json | 19 +- 3 files changed, 836 insertions(+), 510 deletions(-) create mode 100644 .changeset/red-sites-boil.md diff --git a/.changeset/red-sites-boil.md b/.changeset/red-sites-boil.md new file mode 100644 index 00000000..e0c0c0f1 --- /dev/null +++ b/.changeset/red-sites-boil.md @@ -0,0 +1,5 @@ +--- +'@ryanatkn/fuz_gitops': minor +--- + +upgrade peer deps diff --git a/package-lock.json b/package-lock.json index 8b59f366..49751c33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,11 @@ "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.38.0", + "@ryanatkn/belt": "^0.38.2", "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/fuz": "^0.159.0", - "@ryanatkn/gro": "^0.174.2", + "@ryanatkn/fuz": "^0.161.1", + "@ryanatkn/fuz_code": "^0.35.0", + "@ryanatkn/gro": "^0.175.0", "@ryanatkn/moss": "^0.38.0", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.49.0", @@ -24,11 +25,11 @@ "eslint-plugin-svelte": "^3.13.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.43.14", + "svelte": "^5.43.15", "svelte-check": "^4.3.4", "tslib": "^2.8.1", "typescript": "^5.9.3", - "typescript-eslint": "^8.47.0", + "typescript-eslint": "^8.48.0", "vitest": "^4.0.13" }, "engines": { @@ -38,13 +39,13 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@ryanatkn/belt": ">=0.38.0", - "@ryanatkn/fuz": ">=0.157.0", - "@ryanatkn/gro": ">=0.174.1", + "@ryanatkn/belt": ">=0.38.2", + "@ryanatkn/fuz": ">=0.161.1", + "@ryanatkn/gro": ">=0.175.0", "@ryanatkn/moss": ">=0.38.0", "@sveltejs/kit": "^2", "svelte": "^5", - "zod": "^4.1.12" + "zod": "^4.1.13" } }, "node_modules/@changesets/changelog-git": { @@ -99,9 +100,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", "cpu": [ "ppc64" ], @@ -111,14 +112,15 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", "cpu": [ "arm" ], @@ -128,14 +130,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", "cpu": [ "arm64" ], @@ -145,14 +148,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", "cpu": [ "x64" ], @@ -162,14 +166,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", "cpu": [ "arm64" ], @@ -179,14 +184,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", "cpu": [ "x64" ], @@ -196,14 +202,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", "cpu": [ "arm64" ], @@ -213,14 +220,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", "cpu": [ "x64" ], @@ -230,14 +238,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", "cpu": [ "arm" ], @@ -247,14 +256,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", "cpu": [ "arm64" ], @@ -264,14 +274,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", "cpu": [ "ia32" ], @@ -281,14 +292,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", "cpu": [ "loong64" ], @@ -298,14 +310,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", "cpu": [ "mips64el" ], @@ -315,14 +328,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", "cpu": [ "ppc64" ], @@ -332,14 +346,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", "cpu": [ "riscv64" ], @@ -349,14 +364,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", "cpu": [ "s390x" ], @@ -366,14 +382,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", "cpu": [ "x64" ], @@ -383,14 +400,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", "cpu": [ "arm64" ], @@ -400,14 +418,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", "cpu": [ "x64" ], @@ -417,14 +436,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", "cpu": [ "arm64" ], @@ -434,14 +454,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", "cpu": [ "x64" ], @@ -451,14 +472,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", "cpu": [ "arm64" ], @@ -468,14 +490,15 @@ "os": [ "openharmony" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", "cpu": [ "x64" ], @@ -485,14 +508,15 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", "cpu": [ "arm64" ], @@ -502,14 +526,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", "cpu": [ "ia32" ], @@ -519,14 +544,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", "cpu": [ "x64" ], @@ -536,6 +562,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -812,48 +839,10 @@ "@tybys/wasm-util": "^0.10.1" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.87.0.tgz", - "integrity": "sha512-3APxTyYaAjpW5zifjzfsPgoIa4YHwA5GBjtgLRQpGVXCykXBIEbUTokoAs411ZuOwS3sdTVXBTGAdziXRd8rUg==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.98.0.tgz", + "integrity": "sha512-/4S2BATZLxH94smwxLSvQsnzYjtyh/0mekgMnK/efCaU+92VNYir4+HOs/dvspYsWUooxPvj+AkwRUsLk9IuSg==", "cpu": [ "arm64" ], @@ -864,13 +853,13 @@ "android" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.87.0.tgz", - "integrity": "sha512-99e8E76M+k3Gtwvs5EU3VTs2hQkJmvnrl/eu7HkBUc9jLFHA4nVjYSgukMuqahWe270udUYEPRfcWKmoE1Nukg==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.98.0.tgz", + "integrity": "sha512-joNn+2n+TrDJ79GlwR32LK1gctKIxvSJm93teROFiYEde0Dhq9IZpnxiX9ctw4R2zwmSTf1yistTXIR84UGGDQ==", "cpu": [ "arm64" ], @@ -881,13 +870,13 @@ "darwin" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.87.0.tgz", - "integrity": "sha512-2rRo6Dz560/4ot5Q0KPUTEunEObkP8mDC9mMiH0RJk1FiOb9c+xpPbkYoUHNKuVMm8uIoiBCxIAbPtBhs9QaXQ==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.98.0.tgz", + "integrity": "sha512-FUVDRGkMpx41bJI+seN57vmkwOp2uSATrU7e3mEjyP6lWTCvJWmD20/fxaXRY/Kh0xHvy1KBn4jPyKoK1ya/cg==", "cpu": [ "x64" ], @@ -898,13 +887,13 @@ "darwin" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.87.0.tgz", - "integrity": "sha512-uR+WZAvWkFQPVoeqXgQFr7iy+3hEI295qTbQ4ujmklgM5eTX3YgMFoIV00Stloxfd1irSDDSaK7ySnnzF6mRJg==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.98.0.tgz", + "integrity": "sha512-2ysH/IYALz2mDCnqu0xmJ/s0u2f+LZtDOaTkLhwTSQrLOqK4Pr3n4n564Jd1pxNabr07pAMUvBjQNzvWrKfmOg==", "cpu": [ "x64" ], @@ -915,13 +904,13 @@ "freebsd" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.87.0.tgz", - "integrity": "sha512-Emm1NpVGKbwzQOIZJI8ZuZu0z8FAd5xscqdS6qpDFpDdEMxk6ab7o3nM8V09RhNCORAzeUlk4TBHQ2Crzjd50A==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.98.0.tgz", + "integrity": "sha512-7wwkjeCGzGP9gzmJcHyUDT67MP5szMvjlJs3VvWzGaPiQPaMnWzRpuLkycPlslT5/ch8j+rZm2vByPIKz6cIuw==", "cpu": [ "arm" ], @@ -932,13 +921,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.87.0.tgz", - "integrity": "sha512-1PPCxRZSJXzQaqc8y+wH7EqPgSfQ/JU3pK6WTN/1SUe/8paNVSKKqk175a8BbRVxGUtPnwEG89pi+xfPTSE7GA==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.98.0.tgz", + "integrity": "sha512-p93J3cNgVCiCcshXiaq+A+bws8AH0h5LmoEKtt1rJHkZH3uY3dEuuh/3T7arMd+mStVsBM8h+PQ2V/0MyI0rUw==", "cpu": [ "arm" ], @@ -949,13 +938,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.87.0.tgz", - "integrity": "sha512-fcnnsfcyLamJOMVKq+BQ8dasb8gRnZtNpCUfZhaEFAdXQ7J2RmZreFzlygcn80iti0V7c5LejcjHbF4IdK3GAw==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.98.0.tgz", + "integrity": "sha512-wiIHSaNbAj7F8Ac5BERGJq2dSy+abNrZILY7s8PNK2VdwWXhfBSeRV+wUt3tC9zdsrvmRaLAUiM9IaRHEwKWsw==", "cpu": [ "arm64" ], @@ -966,13 +955,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.87.0.tgz", - "integrity": "sha512-tBPkSPgRSSbmrje8CUovISi/Hj/tWjZJ3n/qnrjx2B+u86hWtwLsngtPDQa5d4seSyDaHSx6tNEUcH7+g5Ee0Q==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.98.0.tgz", + "integrity": "sha512-Z/PBmbYZ+uBxqiKr3FGvg45rUr52FZQed26gJZZWFLt7a7l3AbfAL9bxUG5a+HiDC9+sDZrezJbjSRmTlPPg7Q==", "cpu": [ "arm64" ], @@ -983,13 +972,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.87.0.tgz", - "integrity": "sha512-z4UKGM4wv2wEAQAlx2pBq6+pDJw5J/5oDEXqW6yBSLbWLjLDo4oagmRSE3+giOWteUa+0FVJ+ypq4iYxBkYSWg==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.98.0.tgz", + "integrity": "sha512-H4i91pTgQlCWmbVTye2YH0mgSw3YYf5vyJtCzk18IHtSRaYJ6QokyIkXAMStQv5iMBg6CibEKTv3/1vlemW5/g==", "cpu": [ "riscv64" ], @@ -1000,13 +989,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.87.0.tgz", - "integrity": "sha512-6W1ENe/nZtr2TBnrEzmdGEraEAdZOiH3YoUNNeQWuqwLkmpoHTJJdclieToPe/l2IKJ4WL3FsSLSGHE8yt/OEg==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.98.0.tgz", + "integrity": "sha512-yNS5u0/K4Zyi7f43mvqMogXe9GedllLWGEwW6btp/sQce7GnGbMV6oDRiDs0C6UlnJMbctEU6qM4LsNkEobCSg==", "cpu": [ "s390x" ], @@ -1017,13 +1006,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.87.0.tgz", - "integrity": "sha512-s3kB/Ii3X3IOZ27Iu7wx2zYkIcDO22Emu32SNC6kkUSy09dPBc1yaW14TnAkPMe/rvtuzR512JPWj3iGpl+Dng==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.98.0.tgz", + "integrity": "sha512-gmljgOLJvPljYk4pDxglK9Zg/dYrdnwIINYnNyMmEMl9/5Xn7MoJIR9QN52Vh+Fyq09ftDH89R3R2ef57MRKKw==", "cpu": [ "x64" ], @@ -1034,13 +1023,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.87.0.tgz", - "integrity": "sha512-3+M9hfrZSDi4+Uy4Ll3rtOuVG3IHDQlj027jgtmAAHJK1eqp4CQfC7rrwE+LFUqUwX+KD2GwlxR+eHyyEf5Gbg==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.98.0.tgz", + "integrity": "sha512-zcD9b22Mb1/JsU3nCMGboiFZPFLtqNzViaQoPlN6ceDNejt4SsRDlChmLs/u6PluYn1V1SrvAThx1Skq2esD/A==", "cpu": [ "x64" ], @@ -1051,13 +1040,13 @@ "linux" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-wasm32-wasi": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.87.0.tgz", - "integrity": "sha512-2jgeEeOa4GbQQg2Et/gFTgs5wKS/+CxIg+CN2mMOJ4EqbmvUVeGiumO01oFOWTYnJy1oONwIocBzrnMuvOcItA==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.98.0.tgz", + "integrity": "sha512-vp2OlfPGYMudNlDLL5+UJPPRn/RUI2VMFhKBnpC+nuAOz69IOf70ajwDATw+9jc8vVftuDzn06u+XTWJZGkGvQ==", "cpu": [ "wasm32" ], @@ -1065,16 +1054,16 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.3" + "@napi-rs/wasm-runtime": "^1.0.7" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.87.0.tgz", - "integrity": "sha512-KZp9poaBaVvuFM0TrsHCDOjPQK5eMDXblz21boMhKHGW5/bOlkMlg3CYn5j0f67FkK68NSdNKREMxmibBeXllQ==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.98.0.tgz", + "integrity": "sha512-2SJI5E46/lBknEsTtxzFvlyUWAWBs6hSYbj46uIBfNpnLbF/lqo3ekuk1w5evEJjZdgYk7ayDSaRE1bm+7XUaw==", "cpu": [ "arm64" ], @@ -1085,13 +1074,13 @@ "win32" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.87.0.tgz", - "integrity": "sha512-86uisngtp/8XdcerIKxMyJTqgDSTJatkfpylpUH0d96W8Bb9E+bVvM2fIIhLWB0Eb03PeY2BdIT7DNIln9TnHg==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.98.0.tgz", + "integrity": "sha512-o5PfFt85u0nx2VLiKr2e+8j7kN4WaQR5sUTMZv2X0SOXfsLmmvr7DldQTeV/uWWLi0kFw0qpekKLBheHK1V2tA==", "cpu": [ "x64" ], @@ -1102,13 +1091,13 @@ "win32" ], "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-project/types": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.87.0.tgz", - "integrity": "sha512-ipZFWVGE9fADBVXXWJWY/cxpysc41Gt5upKDeb32F6WMgFyO7XETUMVq8UuREKCih+Km5E6p2VhEvf6Fuhey6g==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.98.0.tgz", + "integrity": "sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==", "dev": true, "license": "MIT", "funding": { @@ -1417,9 +1406,9 @@ ] }, "node_modules/@ryanatkn/belt": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.38.0.tgz", - "integrity": "sha512-qVs1eImKgsEKW0AEovk9fnq1/D8OOiE5xQFPGK7a2xRa/TIUA3RMJs8bDTMLZo+QVd9L3WbFyBOBr+PCY6LE9Q==", + "version": "0.38.2", + "resolved": "https://registry.npmjs.org/@ryanatkn/belt/-/belt-0.38.2.tgz", + "integrity": "sha512-8b8eFnDiE4RJnrxKfKJ4OOjosMjAyuZ8Y9HA9wIXzINN5NeqFasTq3VnKd8czfnvGXqiViUtFLPw2fjajpWoNA==", "dev": true, "license": "MIT", "engines": { @@ -1467,9 +1456,9 @@ } }, "node_modules/@ryanatkn/fuz": { - "version": "0.159.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.159.0.tgz", - "integrity": "sha512-7NL1tCLGaEcAZJffWNQoqCczpsQZ4sMqU+PbP3RdMVQ82byjRETDn5ekdywB7bbRK+Zhpkr2pvBU6uFFLBTUdA==", + "version": "0.161.1", + "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.161.1.tgz", + "integrity": "sha512-1D+BKjJT/JCl59GpD/PTcYWMSOuwbBK7c30nyvosuz174gLJgTaS0WaO0Obe7IFero6cXhxuLKqxPf9rtwoWqA==", "dev": true, "license": "MIT", "engines": { @@ -1480,6 +1469,7 @@ }, "peerDependencies": { "@ryanatkn/belt": ">=0.38.0", + "@ryanatkn/fuz_code": ">=0.34.0", "@ryanatkn/gro": ">=0.174.1", "@ryanatkn/moss": ">=0.38.0", "@sveltejs/kit": "^2.47.3", @@ -1489,6 +1479,9 @@ "zod": "^4.1.12" }, "peerDependenciesMeta": { + "@ryanatkn/fuz_code": { + "optional": true + }, "@ryanatkn/gro": { "optional": true }, @@ -1497,18 +1490,43 @@ } } }, + "node_modules/@ryanatkn/fuz_code": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/fuz_code/-/fuz_code-0.35.0.tgz", + "integrity": "sha512-TcxTeOT+/Xh8Zgta+bpfXJbam5+qhKLAXDjrnQbexwbrfN/TUiA+er0JuyXdVkoBq4ILa9FzqQqL9+xq+zz2Bg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.15" + }, + "funding": { + "url": "https://www.ryanatkn.com/funding" + }, + "peerDependencies": { + "@ryanatkn/moss": ">=0.38.0", + "svelte": "^5" + }, + "peerDependenciesMeta": { + "@ryanatkn/moss": { + "optional": true + }, + "svelte": { + "optional": true + } + } + }, "node_modules/@ryanatkn/gro": { - "version": "0.174.2", - "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.174.2.tgz", - "integrity": "sha512-40fOxiLqfVXpZu+r1wZz9Rb2yde4lbII9vRaIWHYS5F3Kso5qhRrv/KJBiVB0ab4nB7CGXCihvhlnLywaqAarA==", + "version": "0.175.0", + "resolved": "https://registry.npmjs.org/@ryanatkn/gro/-/gro-0.175.0.tgz", + "integrity": "sha512-jS51gSmenoVKbztcbYSYlnMOundnx8bMY5iL4LWtfsZaLZYcsP8ws6Yr5FJuthWrmS0s/JlVud+2otzHl+hq/A==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.3", - "dotenv": "^17.2.2", + "dotenv": "^17.2.3", "esm-env": "^1.2.2", "mri": "^1.2.0", - "oxc-parser": "^0.87.0", + "oxc-parser": "^0.98.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", "ts-blank-space": "^0.6.2", @@ -1528,9 +1546,9 @@ "vitest": "^3 || ^4" }, "peerDependencies": { - "@ryanatkn/belt": "^0.38.0", + "@ryanatkn/belt": ">=0.38.1", "@sveltejs/kit": "^2", - "esbuild": "^0.25", + "esbuild": "^0.27.0", "svelte": "^5", "typescript": "^5", "vitest": "^3 || ^4" @@ -1746,17 +1764,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", - "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.0.tgz", + "integrity": "sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/type-utils": "8.47.0", - "@typescript-eslint/utils": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/scope-manager": "8.48.0", + "@typescript-eslint/type-utils": "8.48.0", + "@typescript-eslint/utils": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1770,7 +1788,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.47.0", + "@typescript-eslint/parser": "^8.48.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1786,16 +1804,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", - "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.0.tgz", + "integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/scope-manager": "8.48.0", + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/typescript-estree": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0", "debug": "^4.3.4" }, "engines": { @@ -1811,14 +1829,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", - "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.0.tgz", + "integrity": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.47.0", - "@typescript-eslint/types": "^8.47.0", + "@typescript-eslint/tsconfig-utils": "^8.48.0", + "@typescript-eslint/types": "^8.48.0", "debug": "^4.3.4" }, "engines": { @@ -1833,14 +1851,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", - "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.0.tgz", + "integrity": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0" + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1851,9 +1869,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", - "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.0.tgz", + "integrity": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==", "dev": true, "license": "MIT", "engines": { @@ -1868,15 +1886,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", - "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.0.tgz", + "integrity": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/typescript-estree": "8.48.0", + "@typescript-eslint/utils": "8.48.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1893,9 +1911,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", - "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz", + "integrity": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==", "dev": true, "license": "MIT", "engines": { @@ -1907,21 +1925,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", - "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.0.tgz", + "integrity": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.47.0", - "@typescript-eslint/tsconfig-utils": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/project-service": "8.48.0", + "@typescript-eslint/tsconfig-utils": "8.48.0", + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", + "tinyglobby": "^0.2.15", "ts-api-utils": "^2.1.0" }, "engines": { @@ -1962,16 +1979,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", - "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.0.tgz", + "integrity": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0" + "@typescript-eslint/scope-manager": "8.48.0", + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/typescript-estree": "8.48.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1986,13 +2003,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", - "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.0.tgz", + "integrity": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/types": "8.48.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2225,19 +2242,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2436,12 +2440,13 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -2449,32 +2454,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" } }, "node_modules/escape-string-regexp": { @@ -2722,36 +2727,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2766,16 +2741,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2807,19 +2772,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2976,16 +2928,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-reference": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", @@ -3128,43 +3070,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3250,36 +3155,36 @@ } }, "node_modules/oxc-parser": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.87.0.tgz", - "integrity": "sha512-uc47XrtHwkBoES4HFgwgfH9sqwAtJXgAIBq4fFBMZ4hWmgVZoExyn+L4g4VuaecVKXkz1bvlaHcfwHAJPQb5Gw==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.98.0.tgz", + "integrity": "sha512-gt99VUKRlZ6ZB3VBgqMJD858E8V5UpBQWX7cVI9XaYzuS8e3nN63uRlwPfkFoE4JN+MGxJ/WSRhBUhxUv23A/Q==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "^0.87.0" + "@oxc-project/types": "^0.98.0" }, "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxc-parser/binding-android-arm64": "0.87.0", - "@oxc-parser/binding-darwin-arm64": "0.87.0", - "@oxc-parser/binding-darwin-x64": "0.87.0", - "@oxc-parser/binding-freebsd-x64": "0.87.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.87.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.87.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.87.0", - "@oxc-parser/binding-linux-arm64-musl": "0.87.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.87.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.87.0", - "@oxc-parser/binding-linux-x64-gnu": "0.87.0", - "@oxc-parser/binding-linux-x64-musl": "0.87.0", - "@oxc-parser/binding-wasm32-wasi": "0.87.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.87.0", - "@oxc-parser/binding-win32-x64-msvc": "0.87.0" + "@oxc-parser/binding-android-arm64": "0.98.0", + "@oxc-parser/binding-darwin-arm64": "0.98.0", + "@oxc-parser/binding-darwin-x64": "0.98.0", + "@oxc-parser/binding-freebsd-x64": "0.98.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.98.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.98.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.98.0", + "@oxc-parser/binding-linux-arm64-musl": "0.98.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.98.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.98.0", + "@oxc-parser/binding-linux-x64-gnu": "0.98.0", + "@oxc-parser/binding-linux-x64-musl": "0.98.0", + "@oxc-parser/binding-wasm32-wasi": "0.98.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.98.0", + "@oxc-parser/binding-win32-x64-msvc": "0.98.0" } }, "node_modules/p-limit": { @@ -3558,27 +3463,6 @@ "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -3603,17 +3487,6 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { "version": "4.50.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", @@ -3655,30 +3528,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -3815,9 +3664,9 @@ } }, "node_modules/svelte": { - "version": "5.43.14", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.43.14.tgz", - "integrity": "sha512-pHeUrp1A5S6RGaXhJB7PtYjL1VVjbVrJ2EfuAoPu9/1LeoMaJa/pcdCsCSb0gS4eUHAHnhCbUDxORZyvGK6kOQ==", + "version": "5.43.15", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.43.15.tgz", + "integrity": "sha512-FYlfm3oyLBNUy2NGqaWfKPiGOamS6YB8BJwAcF9xSXVFUjfcl9Ded1YSMu1vXEf0y0lcmBj45UgnOY2ZxhW0Cw==", "dev": true, "license": "MIT", "dependencies": { @@ -3950,19 +3799,6 @@ "node": ">=14.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -4034,16 +3870,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.47.0.tgz", - "integrity": "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.48.0.tgz", + "integrity": "sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.47.0", - "@typescript-eslint/parser": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0" + "@typescript-eslint/eslint-plugin": "8.48.0", + "@typescript-eslint/parser": "8.48.0", + "@typescript-eslint/typescript-estree": "8.48.0", + "@typescript-eslint/utils": "8.48.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4156,6 +3992,490 @@ } } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/vitefu": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", @@ -4322,9 +4642,9 @@ "license": "MIT" }, "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 59eaca08..8efc4fed 100644 --- a/package.json +++ b/package.json @@ -30,20 +30,21 @@ "node": ">=22.15" }, "peerDependencies": { - "@ryanatkn/belt": ">=0.38.0", - "@ryanatkn/fuz": ">=0.157.0", - "@ryanatkn/gro": ">=0.174.1", + "@ryanatkn/belt": ">=0.38.2", + "@ryanatkn/fuz": ">=0.161.1", + "@ryanatkn/gro": ">=0.175.0", "@ryanatkn/moss": ">=0.38.0", "@sveltejs/kit": "^2", "svelte": "^5", - "zod": "^4.1.12" + "zod": "^4.1.13" }, "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@ryanatkn/belt": "^0.38.0", + "@ryanatkn/belt": "^0.38.2", "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/fuz": "^0.159.0", - "@ryanatkn/gro": "^0.174.2", + "@ryanatkn/fuz": "^0.161.1", + "@ryanatkn/fuz_code": "^0.35.0", + "@ryanatkn/gro": "^0.175.0", "@ryanatkn/moss": "^0.38.0", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.49.0", @@ -54,11 +55,11 @@ "eslint-plugin-svelte": "^3.13.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.43.14", + "svelte": "^5.43.15", "svelte-check": "^4.3.4", "tslib": "^2.8.1", "typescript": "^5.9.3", - "typescript-eslint": "^8.47.0", + "typescript-eslint": "^8.48.0", "vitest": "^4.0.13" }, "prettier": { From 0dc8747acc1594f3aa3eb86d57cbe9fcf6994935 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 17:52:12 -0500 Subject: [PATCH 29/41] wip --- package-lock.json | 265 ++++++++++++++++++++++++---------------------- 1 file changed, 140 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49751c33..d9504254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -568,9 +568,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", - "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -600,9 +600,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -816,9 +816,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1112,9 +1112,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", - "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", "cpu": [ "arm" ], @@ -1126,9 +1126,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", - "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", "cpu": [ "arm64" ], @@ -1140,9 +1140,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", - "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", "cpu": [ "arm64" ], @@ -1154,9 +1154,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", - "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", "cpu": [ "x64" ], @@ -1168,9 +1168,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", - "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", "cpu": [ "arm64" ], @@ -1182,9 +1182,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", - "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", "cpu": [ "x64" ], @@ -1196,9 +1196,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", - "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", "cpu": [ "arm" ], @@ -1210,9 +1210,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", - "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", "cpu": [ "arm" ], @@ -1224,9 +1224,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", - "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", "cpu": [ "arm64" ], @@ -1238,9 +1238,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", - "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", "cpu": [ "arm64" ], @@ -1251,10 +1251,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", - "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", "cpu": [ "loong64" ], @@ -1266,9 +1266,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", - "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", "cpu": [ "ppc64" ], @@ -1280,9 +1280,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", - "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", "cpu": [ "riscv64" ], @@ -1294,9 +1294,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", - "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", "cpu": [ "riscv64" ], @@ -1308,9 +1308,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", - "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", "cpu": [ "s390x" ], @@ -1322,9 +1322,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", - "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", "cpu": [ "x64" ], @@ -1336,9 +1336,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", - "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", "cpu": [ "x64" ], @@ -1350,9 +1350,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", - "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", "cpu": [ "arm64" ], @@ -1364,9 +1364,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", - "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", "cpu": [ "arm64" ], @@ -1378,9 +1378,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", - "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", "cpu": [ "ia32" ], @@ -1391,10 +1391,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", - "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", "cpu": [ "x64" ], @@ -1583,9 +1597,9 @@ "license": "MIT" }, "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz", - "integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.7.tgz", + "integrity": "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2413,9 +2427,9 @@ } }, "node_modules/devalue": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", - "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.5.0.tgz", + "integrity": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==", "dev": true, "license": "MIT" }, @@ -2658,9 +2672,9 @@ } }, "node_modules/esrap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", - "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.3.tgz", + "integrity": "sha512-T/Dhhv/QH+yYmiaLz9SA3PW+YyenlnRKDNdtlYJrSOBmNsH4nvPux+mTwx7p+wAedlJrGoZtXNI0a0MjQ2QkVg==", "dev": true, "license": "MIT", "dependencies": { @@ -2839,9 +2853,9 @@ } }, "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -2946,9 +2960,9 @@ "license": "ISC" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -3488,9 +3502,9 @@ } }, "node_modules/rollup": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", - "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "dev": true, "license": "MIT", "dependencies": { @@ -3504,27 +3518,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.50.1", - "@rollup/rollup-android-arm64": "4.50.1", - "@rollup/rollup-darwin-arm64": "4.50.1", - "@rollup/rollup-darwin-x64": "4.50.1", - "@rollup/rollup-freebsd-arm64": "4.50.1", - "@rollup/rollup-freebsd-x64": "4.50.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", - "@rollup/rollup-linux-arm-musleabihf": "4.50.1", - "@rollup/rollup-linux-arm64-gnu": "4.50.1", - "@rollup/rollup-linux-arm64-musl": "4.50.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", - "@rollup/rollup-linux-ppc64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-musl": "4.50.1", - "@rollup/rollup-linux-s390x-gnu": "4.50.1", - "@rollup/rollup-linux-x64-gnu": "4.50.1", - "@rollup/rollup-linux-x64-musl": "4.50.1", - "@rollup/rollup-openharmony-arm64": "4.50.1", - "@rollup/rollup-win32-arm64-msvc": "4.50.1", - "@rollup/rollup-win32-ia32-msvc": "4.50.1", - "@rollup/rollup-win32-x64-msvc": "4.50.1", + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" } }, @@ -3549,9 +3564,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3562,9 +3577,9 @@ } }, "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "dev": true, "license": "MIT" }, @@ -3918,9 +3933,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", - "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz", + "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==", "dev": true, "license": "MIT", "dependencies": { @@ -3929,7 +3944,7 @@ "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" @@ -4635,9 +4650,9 @@ } }, "node_modules/zimmerframe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", - "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", "dev": true, "license": "MIT" }, From f9206dcfbf4228401240e6cdd4a2d311874e6590 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 17:52:31 -0500 Subject: [PATCH 30/41] wip --- src/routes/+page.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 7bdc592d..cf1ff797 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -20,7 +20,9 @@
  • - docs{#snippet icon()}{repo.pkg.package_json.glyph}{/snippet} + docs{#snippet icon()}{repo.pkg.package_json.glyph}{/snippet}
  • tree From eaf7ced00031aa356ce5cdd0ea066f1c81c4b766 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:02:33 -0500 Subject: [PATCH 31/41] wip --- gitops.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitops.config.ts b/gitops.config.ts index 43a19288..dd908ac7 100644 --- a/gitops.config.ts +++ b/gitops.config.ts @@ -14,7 +14,7 @@ const config: Create_Gitops_Config = () => { 'https://github.com/ryanatkn/fuz_code', { repo_url: 'https://github.com/ryanatkn/fuz_gitops', - branch: 'publishing', + branch: 'upgrade-deps', }, 'https://github.com/ryanatkn/webdevladder.net', 'https://github.com/ryanatkn/ryanatkn.com', From 8cdad1771b8d94e0f562af594a7821c3ef0dceed Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:02:58 -0500 Subject: [PATCH 32/41] wip --- gitops.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitops.config.ts b/gitops.config.ts index dd908ac7..f90155f7 100644 --- a/gitops.config.ts +++ b/gitops.config.ts @@ -17,7 +17,7 @@ const config: Create_Gitops_Config = () => { branch: 'upgrade-deps', }, 'https://github.com/ryanatkn/webdevladder.net', - 'https://github.com/ryanatkn/ryanatkn.com', + // 'https://github.com/ryanatkn/ryanatkn.com', ], }; }; From add1f7929241e8b90e2aa3d903c0b4b35fb177bf Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:08:04 -0500 Subject: [PATCH 33/41] wip --- src/lib/github.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/github.ts b/src/lib/github.ts index 7a3083f2..70c0908d 100644 --- a/src/lib/github.ts +++ b/src/lib/github.ts @@ -6,10 +6,10 @@ import {fetch_value, type Fetch_Value_Cache} from '@ryanatkn/belt/fetch.js'; /** * @see https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#list-pull-requests */ -export const Github_Pull_Request = z.strictObject({ +export const Github_Pull_Request = z.object({ number: z.number(), title: z.string(), - user: z.strictObject({ + user: z.object({ login: z.string(), }), draft: z.boolean(), @@ -53,14 +53,14 @@ export const fetch_github_pull_requests = async ( /** * @see https://docs.github.com/en/rest/checks/runs?apiVersion=2022-11-28#list-check-runs-for-a-git-reference */ -export const Github_Check_Runs_Item = z.strictObject({ +export const Github_Check_Runs_Item = z.object({ status: z.enum(['queued', 'in_progress', 'completed']), conclusion: z .enum(['success', 'failure', 'neutral', 'cancelled', 'skipped', 'timed_out', 'action_required']) .nullable(), }); export type Github_Check_Runs_Item = z.infer; -export const Github_Check_Runs = z.strictObject({ +export const Github_Check_Runs = z.object({ total_count: z.number(), check_runs: z.array(Github_Check_Runs_Item), }); From 4364c600f072de25b7162b1575e1863bfcc22a87 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:13:31 -0500 Subject: [PATCH 34/41] wip --- src/routes/repos.ts | 4854 +++++++------------------------------------ 1 file changed, 749 insertions(+), 4105 deletions(-) diff --git a/src/routes/repos.ts b/src/routes/repos.ts index 14a30ea4..769174ff 100644 --- a/src/routes/repos.ts +++ b/src/routes/repos.ts @@ -1,12 +1,121 @@ // generated by gitops_sync.task.ts -import type {Repo_Json} from '$lib/repo.svelte.js'; +import type {Repo_Json} from './repo.svelte.js'; export const repos_json: Array = JSON.parse( '[\ + {\ + "package_json": {\ + "name": "@ryanatkn/moss",\ + "version": "0.38.0",\ + "description": "CSS framework and design system",\ + "motto": "magical organic stylesheets",\ + "glyph": "🌿",\ + "logo": "logo.svg",\ + "logo_alt": "a fuzzy tuft of green moss",\ + "public": true,\ + "license": "MIT",\ + "homepage": "https://moss.ryanatkn.com/",\ + "repository": "https://github.com/ryanatkn/moss",\ + "author": {\ + "name": "Ryan Atkinson",\ + "email": "mail@ryanatkn.com",\ + "url": "https://www.ryanatkn.com/"\ + },\ + "bugs": "https://github.com/ryanatkn/moss/issues",\ + "funding": "https://www.ryanatkn.com/funding",\ + "scripts": {\ + "start": "gro dev",\ + "dev": "gro dev",\ + "build": "gro build",\ + "check": "gro check",\ + "test": "gro test",\ + "preview": "vite preview",\ + "deploy": "gro deploy"\ + },\ + "type": "module",\ + "engines": {\ + "node": ">=22.15"\ + },\ + "devDependencies": {\ + "@changesets/changelog-git": "^0.2.1",\ + "@ryanatkn/belt": "^0.38.0",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.157.0",\ + "@ryanatkn/fuz_code": "^0.33.0",\ + "@ryanatkn/gro": "^0.174.1",\ + "@sveltejs/adapter-static": "^3.0.9",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "@types/node": "^24.3.1",\ + "eslint": "^9.35.0",\ + "eslint-plugin-svelte": "^3.12.2",\ + "prettier": "^3.6.2",\ + "prettier-plugin-svelte": "^3.4.0",\ + "svelte": "^5.43.14",\ + "svelte-check": "^4.3.4",\ + "tslib": "^2.8.1",\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.42.0",\ + "vitest": "^4.0.13",\ + "zod": "^4.1.12"\ + },\ + "prettier": {\ + "plugins": [\ + "prettier-plugin-svelte"\ + ],\ + "useTabs": true,\ + "printWidth": 100,\ + "singleQuote": true,\ + "bracketSpacing": false,\ + "overrides": [\ + {\ + "files": "package.json",\ + "options": {\ + "useTabs": false\ + }\ + }\ + ]\ + },\ + "sideEffects": [\ + "**/*.css"\ + ],\ + "files": [\ + "dist",\ + "src/lib/**/*.ts",\ + "!src/lib/**/*.test.*",\ + "!dist/**/*.test.*"\ + ],\ + "exports": {\ + "./package.json": "./package.json",\ + "./*.js": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ + },\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ + },\ + "./*.css": {\ + "default": "./dist/*.css"\ + }\ + }\ + },\ + "src_json": {\ + "name": "@ryanatkn/moss",\ + "version": "0.38.0",\ + "modules": []\ + },\ + "check_runs": {\ + "status": "completed",\ + "conclusion": "success"\ + },\ + "pull_requests": []\ + },\ {\ "package_json": {\ "name": "@ryanatkn/fuz",\ - "version": "0.147.0",\ + "version": "0.161.1",\ "description": "Svelte UI library",\ "motto": "friendly user zystem",\ "glyph": "🧶",\ @@ -40,14 +149,20 @@ export const repos_json: Array = JSON.parse( "node": ">=22.15"\ },\ "peerDependencies": {\ - "@ryanatkn/belt": "*",\ - "@ryanatkn/gro": ">=0.165.0",\ - "@ryanatkn/moss": "*",\ - "@sveltejs/kit": "^2.26",\ + "@ryanatkn/belt": ">=0.38.0",\ + "@ryanatkn/fuz_code": ">=0.34.0",\ + "@ryanatkn/gro": ">=0.174.1",\ + "@ryanatkn/moss": ">=0.38.0",\ + "@sveltejs/kit": "^2.47.3",\ "esm-env": "^1",\ - "svelte": "^5"\ + "svelte": "^5",\ + "svelte2tsx": "^0.7.45",\ + "zod": "^4.1.12"\ },\ "peerDependenciesMeta": {\ + "@ryanatkn/fuz_code": {\ + "optional": true\ + },\ "@ryanatkn/gro": {\ "optional": true\ },\ @@ -57,30 +172,30 @@ export const repos_json: Array = JSON.parse( },\ "devDependencies": {\ "@changesets/changelog-git": "^0.2.1",\ - "@ryanatkn/belt": "^0.34.1",\ - "@ryanatkn/eslint-config": "^0.8.0",\ - "@ryanatkn/fuz_code": "^0.26.0",\ - "@ryanatkn/gro": "^0.167.1",\ - "@ryanatkn/moss": "^0.36.0",\ - "@sveltejs/adapter-static": "^3.0.9",\ - "@sveltejs/kit": "^2.37.0",\ - "@sveltejs/package": "^2.5.0",\ - "@sveltejs/vite-plugin-svelte": "^6.1.3",\ - "@types/node": "^24.3.0",\ - "@types/prismjs": "^1.26.5",\ - "eslint": "^9.34.0",\ - "eslint-plugin-svelte": "^3.11.0",\ + "@ryanatkn/belt": "^0.38.0",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz_code": "^0.34.0",\ + "@ryanatkn/gro": "^0.174.2",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "@types/node": "^24.10.1",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ "esm-env": "^1.2.2",\ + "jsdom": "^27.2.0",\ "prettier": "^3.6.2",\ "prettier-plugin-svelte": "^3.4.0",\ - "prism-svelte": "^0.5.0",\ - "prismjs": "^1.30.0",\ - "svelte": "^5.38.6",\ - "svelte-check": "^4.3.1",\ + "svelte": "^5.43.14",\ + "svelte-check": "^4.3.4",\ + "svelte2tsx": "^0.7.45",\ "tslib": "^2.8.1",\ - "typescript": "^5.9.2",\ - "typescript-eslint": "^8.41.0",\ - "vitest": "^3.2.4"\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.47.0",\ + "vitest": "^4.0.13",\ + "zod": "^4.1.13"\ },\ "prettier": {\ "plugins": [\ @@ -114,6 +229,10 @@ export const repos_json: Array = JSON.parse( "types": "./dist/*.d.ts",\ "default": "./dist/*.js"\ },\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ + },\ "./*.svelte": {\ "types": "./dist/*.svelte.d.ts",\ "svelte": "./dist/*.svelte",\ @@ -123,953 +242,9 @@ export const repos_json: Array = JSON.parse( },\ "src_json": {\ "name": "@ryanatkn/fuz",\ - "version": "0.147.0",\ - "modules": {\ - "./alert.js": {\ - "path": "alert.ts",\ - "declarations": [\ - {\ - "name": "Alert_Status",\ - "kind": "type"\ - },\ - {\ - "name": "Alert_Status_Options",\ - "kind": "type"\ - },\ - {\ - "name": "alert_status_options",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./constants.js": {\ - "path": "constants.ts",\ - "declarations": [\ - {\ - "name": "MAIN_HEADER_MARGIN_TOP",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./context_helpers.js": {\ - "path": "context_helpers.ts",\ - "declarations": [\ - {\ - "name": "create_context",\ - "kind": "function"\ - }\ - ]\ - },\ - "./contextmenu_state.svelte.js": {\ - "path": "contextmenu_state.svelte.ts",\ - "declarations": [\ - {\ - "name": "Contextmenu_Params",\ - "kind": "type"\ - },\ - {\ - "name": "Item_State",\ - "kind": "type"\ - },\ - {\ - "name": "Entry_State",\ - "kind": "class"\ - },\ - {\ - "name": "Submenu_State",\ - "kind": "class"\ - },\ - {\ - "name": "Root_Menu_State",\ - "kind": "class"\ - },\ - {\ - "name": "Contextmenu_Run",\ - "kind": "type"\ - },\ - {\ - "name": "Contextmenu_State_Options",\ - "kind": "type"\ - },\ - {\ - "name": "Contextmenu_State",\ - "kind": "class"\ - },\ - {\ - "name": "contextmenu_action",\ - "kind": "function"\ - },\ - {\ - "name": "open_contextmenu",\ - "kind": "function"\ - },\ - {\ - "name": "contextmenu_context",\ - "kind": "variable"\ - },\ - {\ - "name": "contextmenu_submenu_context",\ - "kind": "variable"\ - },\ - {\ - "name": "contextmenu_dimensions_context",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./csp_of_ryanatkn.js": {\ - "path": "csp_of_ryanatkn.ts",\ - "declarations": [\ - {\ - "name": "csp_trusted_sources_of_ryanatkn",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./csp.js": {\ - "path": "csp.ts",\ - "declarations": [\ - {\ - "name": "create_csp_directives",\ - "kind": "function"\ - },\ - {\ - "name": "Create_Csp_Directives_Options",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Directive",\ - "kind": "type"\ - },\ - {\ - "name": "parse_csp_directive",\ - "kind": "function"\ - },\ - {\ - "name": "Csp_Directive_Value",\ - "kind": "type"\ - },\ - {\ - "name": "csp_trust_levels",\ - "kind": "variable"\ - },\ - {\ - "name": "csp_trust_level_value",\ - "kind": "variable"\ - },\ - {\ - "name": "Csp_Trust_Level",\ - "kind": "type"\ - },\ - {\ - "name": "parse_csp_trust_level",\ - "kind": "function"\ - },\ - {\ - "name": "Csp_Source_Spec",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Directive_Spec",\ - "kind": "type"\ - },\ - {\ - "name": "is_csp_trusted",\ - "kind": "function"\ - },\ - {\ - "name": "COLOR_SCHEME_SCRIPT_HASH",\ - "kind": "variable"\ - },\ - {\ - "name": "csp_directive_value_defaults",\ - "kind": "variable"\ - },\ - {\ - "name": "csp_directive_required_trust_defaults",\ - "kind": "variable"\ - },\ - {\ - "name": "csp_directive_specs",\ - "kind": "variable"\ - },\ - {\ - "name": "csp_directive_spec_by_name",\ - "kind": "variable"\ - },\ - {\ - "name": "Csp_Action_Source",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Base_Source",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Crypto_Source",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Frame_Source",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Host_Name_Scheme",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Host_Source",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Host_Protocol_Schemes",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Port_Scheme",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Scheme_Source",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Source",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Sources",\ - "kind": "type"\ - },\ - {\ - "name": "Csp_Directives",\ - "kind": "type"\ - }\ - ]\ - },\ - "./dialog.js": {\ - "path": "dialog.ts",\ - "declarations": [\ - {\ - "name": "to_dialog_params",\ - "kind": "function"\ - },\ - {\ - "name": "Dialog_Params",\ - "kind": "type"\ - },\ - {\ - "name": "Dialog_Layout",\ - "kind": "type"\ - },\ - {\ - "name": "dialog_layouts",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./dimensions.svelte.js": {\ - "path": "dimensions.svelte.ts",\ - "declarations": [\ - {\ - "name": "Dimensions",\ - "kind": "class"\ - }\ - ]\ - },\ - "./docs_helpers.svelte.js": {\ - "path": "docs_helpers.svelte.ts",\ - "declarations": [\ - {\ - "name": "DEFAULT_LIBRARY_PATH",\ - "kind": "variable"\ - },\ - {\ - "name": "to_docs_path_info",\ - "kind": "function"\ - },\ - {\ - "name": "docs_links_context",\ - "kind": "variable"\ - },\ - {\ - "name": "Docs_Link_Tag",\ - "kind": "type"\ - },\ - {\ - "name": "Docs_Link",\ - "kind": "type"\ - },\ - {\ - "name": "Docs_Links",\ - "kind": "class"\ - }\ - ]\ - },\ - "./helpers.js": {\ - "path": "helpers.ts",\ - "declarations": [\ - {\ - "name": "render_value_to_string",\ - "kind": "function"\ - }\ - ]\ - },\ - "./intersect.js": {\ - "path": "intersect.ts",\ - "declarations": [\ - {\ - "name": "Intersect_Params",\ - "kind": "type"\ - },\ - {\ - "name": "Intersect_Params_Or_Callback",\ - "kind": "type"\ - },\ - {\ - "name": "intersect",\ - "kind": "function"\ - },\ - {\ - "name": "On_Intersect",\ - "kind": "type"\ - },\ - {\ - "name": "Intersect_State",\ - "kind": "type"\ - },\ - {\ - "name": "On_Disconnect",\ - "kind": "type"\ - },\ - {\ - "name": "Disconnect_State",\ - "kind": "type"\ - }\ - ]\ - },\ - "./logos.js": {\ - "path": "logos.ts",\ - "declarations": [\ - {\ - "name": "zzz_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "gro_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "fuz_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "moss_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "belt_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "fuz_code_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "fuz_blog_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "fuz_mastodon_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "fuz_gitops_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "fuz_template_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "webdevladder_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "earbetter_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "spiderspace_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "github_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "mdn_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "chatgpt_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "claude_logo",\ - "kind": "variable"\ - },\ - {\ - "name": "gemini_logo",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./pkg.js": {\ - "path": "pkg.ts",\ - "declarations": [\ - {\ - "name": "pkg_context",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./rune_helpers.svelte.js": {\ - "path": "rune_helpers.svelte.ts",\ - "declarations": [\ - {\ - "name": "effect_with_count",\ - "kind": "function"\ - }\ - ]\ - },\ - "./storage.js": {\ - "path": "storage.ts",\ - "declarations": [\ - {\ - "name": "save_to_storage",\ - "kind": "function"\ - },\ - {\ - "name": "load_from_storage",\ - "kind": "function"\ - }\ - ]\ - },\ - "./themer.svelte.js": {\ - "path": "themer.svelte.ts",\ - "declarations": [\ - {\ - "name": "Themer",\ - "kind": "class"\ - },\ - {\ - "name": "Themer_Json",\ - "kind": "type"\ - },\ - {\ - "name": "themer_context",\ - "kind": "variable"\ - },\ - {\ - "name": "sync_color_scheme",\ - "kind": "function"\ - },\ - {\ - "name": "COLOR_SCHEME_STORAGE_KEY",\ - "kind": "variable"\ - },\ - {\ - "name": "THEME_STORAGE_KEY",\ - "kind": "variable"\ - },\ - {\ - "name": "save_color_scheme",\ - "kind": "function"\ - },\ - {\ - "name": "load_color_scheme",\ - "kind": "function"\ - },\ - {\ - "name": "save_theme",\ - "kind": "function"\ - },\ - {\ - "name": "load_theme",\ - "kind": "function"\ - }\ - ]\ - },\ - "./tome.js": {\ - "path": "tome.ts",\ - "declarations": [\ - {\ - "name": "Tome",\ - "kind": "variable"\ - },\ - {\ - "name": "to_tome_pathname",\ - "kind": "function"\ - },\ - {\ - "name": "tomes_context",\ - "kind": "variable"\ - },\ - {\ - "name": "get_tome_by_name",\ - "kind": "function"\ - },\ - {\ - "name": "tome_context",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./Alert.svelte": {\ - "path": "Alert.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Breadcrumb.svelte": {\ - "path": "Breadcrumb.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Card.svelte": {\ - "path": "Card.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Color_Scheme_Input.svelte": {\ - "path": "Color_Scheme_Input.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Ecosystem_Links_Panel.svelte": {\ - "path": "Ecosystem_Links_Panel.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Community_Links.svelte": {\ - "path": "Community_Links.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Contextmenu_Entry.svelte": {\ - "path": "Contextmenu_Entry.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Contextmenu_Link_Entry.svelte": {\ - "path": "Contextmenu_Link_Entry.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Contextmenu_Root.svelte": {\ - "path": "Contextmenu_Root.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Contextmenu_Submenu.svelte": {\ - "path": "Contextmenu_Submenu.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Contextmenu_Text_Entry.svelte": {\ - "path": "Contextmenu_Text_Entry.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Contextmenu.svelte": {\ - "path": "Contextmenu.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Copy_To_Clipboard.svelte": {\ - "path": "Copy_To_Clipboard.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Details.svelte": {\ - "path": "Details.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Dialog.svelte": {\ - "path": "Dialog.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Dialogs.svelte": {\ - "path": "Dialogs.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Content.svelte": {\ - "path": "Docs_Content.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Footer.svelte": {\ - "path": "Docs_Footer.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Menu_Header.svelte": {\ - "path": "Docs_Menu_Header.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Menu.svelte": {\ - "path": "Docs_Menu.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Page_Links.svelte": {\ - "path": "Docs_Page_Links.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Primary_Nav.svelte": {\ - "path": "Docs_Primary_Nav.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Secondary_Nav.svelte": {\ - "path": "Docs_Secondary_Nav.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs_Tertiary_Nav.svelte": {\ - "path": "Docs_Tertiary_Nav.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Docs.svelte": {\ - "path": "Docs.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Hashlink.svelte": {\ - "path": "Hashlink.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Hidden_Personal_Links.svelte": {\ - "path": "Hidden_Personal_Links.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Hue_Input.svelte": {\ - "path": "Hue_Input.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Identifier.svelte": {\ - "path": "Identifier.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Img_Or_Svg.svelte": {\ - "path": "Img_Or_Svg.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Mdn_Link.svelte": {\ - "path": "Mdn_Link.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Package_Detail.svelte": {\ - "path": "Package_Detail.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Package_Summary.svelte": {\ - "path": "Package_Summary.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Paste_From_Clipboard.svelte": {\ - "path": "Paste_From_Clipboard.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Pending_Animation.svelte": {\ - "path": "Pending_Animation.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Pending_Button.svelte": {\ - "path": "Pending_Button.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Project_Links.svelte": {\ - "path": "Project_Links.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Redirect.svelte": {\ - "path": "Redirect.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Spiders.svelte": {\ - "path": "Spiders.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Svg.svelte": {\ - "path": "Svg.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Teleport.svelte": {\ - "path": "Teleport.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Theme_Input.svelte": {\ - "path": "Theme_Input.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Themed.svelte": {\ - "path": "Themed.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Tome_Content.svelte": {\ - "path": "Tome_Content.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Tome_Header.svelte": {\ - "path": "Tome_Header.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Tome_Link.svelte": {\ - "path": "Tome_Link.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Tome_Section_Header.svelte": {\ - "path": "Tome_Section_Header.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Tome_Section.svelte": {\ - "path": "Tome_Section.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - }\ - }\ + "version": "0.161.1",\ + "modules": []\ },\ - "name": "@ryanatkn/fuz",\ - "repo_name": "fuz",\ - "repo_url": "https://github.com/ryanatkn/fuz",\ - "owner_name": "ryanatkn",\ - "homepage_url": "https://www.fuz.dev/",\ - "logo_url": "https://www.fuz.dev/logo.svg",\ - "logo_alt": "a friendly brown spider facing you",\ - "npm_url": "https://www.npmjs.com/package/@ryanatkn/fuz",\ - "changelog_url": "https://github.com/ryanatkn/fuz/blob/main/CHANGELOG.md",\ - "published": true,\ "check_runs": {\ "status": "completed",\ "conclusion": "success"\ @@ -1087,16 +262,29 @@ export const repos_json: Array = JSON.parse( },\ {\ "package_json": {\ - "name": "@ryanatkn/fuz_template",\ - "version": "0.0.1",\ - "description": "a static web app and Node library template with TypeScript, Svelte, SvelteKit, Vite, esbuild, Gro, and Fuz",\ - "glyph": "❄",\ + "name": "@ryanatkn/gro",\ + "version": "0.175.0",\ + "description": "task runner and toolkit extending SvelteKit",\ + "motto": "generate, run, optimize",\ + "glyph": "🌰",\ "logo": "logo.svg",\ - "logo_alt": "a friendly pixelated spider facing you",\ + "logo_alt": "a pixelated green oak acorn with a glint of sun",\ "public": true,\ - "homepage": "https://template.fuz.dev/",\ - "repository": "https://github.com/ryanatkn/fuz_template",\ + "license": "MIT",\ + "homepage": "https://gro.ryanatkn.com/",\ + "author": {\ + "name": "Ryan Atkinson",\ + "email": "mail@ryanatkn.com",\ + "url": "https://www.ryanatkn.com/"\ + },\ + "repository": {\ + "type": "git",\ + "url": "git+https://github.com/ryanatkn/gro.git"\ + },\ + "bugs": "https://github.com/ryanatkn/gro/issues",\ + "funding": "https://www.ryanatkn.com/funding",\ "scripts": {\ + "bootstrap": "rm -rf .gro dist && svelte-kit sync && svelte-package && chmod +x ./dist/gro.js && npm link -f",\ "start": "gro dev",\ "dev": "gro dev",\ "build": "gro build",\ @@ -1109,26 +297,73 @@ export const repos_json: Array = JSON.parse( "engines": {\ "node": ">=22.15"\ },\ - "devDependencies": {\ - "@ryanatkn/belt": "^0.34.1",\ - "@ryanatkn/eslint-config": "^0.8.0",\ - "@ryanatkn/fuz": "^0.147.0",\ - "@ryanatkn/gro": "^0.167.1",\ - "@ryanatkn/moss": "^0.36.0",\ - "@sveltejs/adapter-static": "^3.0.9",\ - "@sveltejs/kit": "^2.37.1",\ - "@sveltejs/vite-plugin-svelte": "^6.1.4",\ - "eslint": "^9.35.0",\ - "eslint-plugin-svelte": "^3.12.1",\ - "prettier": "^3.6.2",\ - "prettier-plugin-svelte": "^3.4.0",\ - "svelte": "^5.38.7",\ - "svelte-check": "^4.3.1",\ - "tslib": "^2.8.1",\ - "typescript": "^5.9.2",\ - "typescript-eslint": "^8.42.0",\ - "vitest": "^3.2.4"\ - },\ + "bin": {\ + "gro": "dist/gro.js"\ + },\ + "keywords": [\ + "web",\ + "tools",\ + "task runner",\ + "tasks",\ + "codegen",\ + "svelte",\ + "sveltekit",\ + "vite",\ + "typescript"\ + ],\ + "dependencies": {\ + "chokidar": "^4.0.3",\ + "dotenv": "^17.2.3",\ + "esm-env": "^1.2.2",\ + "mri": "^1.2.0",\ + "oxc-parser": "^0.98.0",\ + "prettier": "^3.6.2",\ + "prettier-plugin-svelte": "^3.4.0",\ + "ts-blank-space": "^0.6.2",\ + "tslib": "^2.8.1",\ + "zod": "^4.1.12"\ + },\ + "peerDependencies": {\ + "@ryanatkn/belt": ">=0.38.1",\ + "@sveltejs/kit": "^2",\ + "esbuild": "^0.27.0",\ + "svelte": "^5",\ + "typescript": "^5",\ + "vitest": "^3 || ^4"\ + },\ + "peerDependenciesMeta": {\ + "@sveltejs/kit": {\ + "optional": true\ + },\ + "vitest": {\ + "optional": true\ + }\ + },\ + "optionalDependencies": {\ + "vitest": "^3 || ^4"\ + },\ + "devDependencies": {\ + "@changesets/changelog-git": "^0.2.1",\ + "@changesets/types": "^6.1.0",\ + "@ryanatkn/belt": "^0.38.2",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.161.0",\ + "@ryanatkn/fuz_code": "^0.34.0",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "@types/node": "^24.10.1",\ + "esbuild": "^0.27.0",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ + "svelte": "^5.43.14",\ + "svelte-check": "^4.3.4",\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.47.0",\ + "vitest": "^4.0.13"\ + },\ "prettier": {\ "plugins": [\ "prettier-plugin-svelte"\ @@ -1150,23 +385,32 @@ export const repos_json: Array = JSON.parse( "**/*.css"\ ],\ "files": [\ - "dist"\ - ]\ + "dist",\ + "src/lib/**/*.ts",\ + "!src/lib/**/*.test.*",\ + "!dist/**/*.test.*"\ + ],\ + "exports": {\ + "./package.json": "./package.json",\ + ".": {\ + "types": "./dist/index.d.ts",\ + "default": "./dist/index.js"\ + },\ + "./*.js": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ + },\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ + }\ + }\ },\ "src_json": {\ - "name": "@ryanatkn/fuz_template",\ - "version": "0.0.1"\ + "name": "@ryanatkn/gro",\ + "version": "0.175.0",\ + "modules": []\ },\ - "name": "@ryanatkn/fuz_template",\ - "repo_name": "fuz_template",\ - "repo_url": "https://github.com/ryanatkn/fuz_template",\ - "owner_name": "ryanatkn",\ - "homepage_url": "https://template.fuz.dev/",\ - "logo_url": "https://template.fuz.dev/logo.svg",\ - "logo_alt": "a friendly pixelated spider facing you",\ - "npm_url": null,\ - "changelog_url": null,\ - "published": false,\ "check_runs": {\ "status": "completed",\ "conclusion": "success"\ @@ -1175,22 +419,26 @@ export const repos_json: Array = JSON.parse( },\ {\ "package_json": {\ - "name": "@ryanatkn/fuz_gitops",\ - "version": "0.50.0",\ - "description": "a tool for managing many repos",\ - "glyph": "🪄",\ + "name": "@ryanatkn/belt",\ + "version": "0.38.2",\ + "description": "utility belt for JS",\ + "glyph": "🦕",\ "logo": "logo.svg",\ - "logo_alt": "a friendly blue spider facing you",\ + "logo_alt": "a green sauropod wearing a brown utility belt",\ + "motto": "ancient not extinct",\ "public": true,\ "license": "MIT",\ - "homepage": "https://gitops.fuz.dev/",\ - "repository": "https://github.com/ryanatkn/fuz_gitops",\ + "homepage": "https://belt.ryanatkn.com/",\ "author": {\ "name": "Ryan Atkinson",\ "email": "mail@ryanatkn.com",\ "url": "https://www.ryanatkn.com/"\ },\ - "bugs": "https://github.com/ryanatkn/fuz_gitops/issues",\ + "repository": {\ + "type": "git",\ + "url": "git+https://github.com/ryanatkn/belt.git"\ + },\ + "bugs": "https://github.com/ryanatkn/belt/issues",\ "funding": "https://www.ryanatkn.com/funding",\ "scripts": {\ "start": "gro dev",\ @@ -1199,43 +447,63 @@ export const repos_json: Array = JSON.parse( "check": "gro check",\ "test": "gro test",\ "preview": "vite preview",\ - "deploy": "gro deploy"\ + "deploy": "gro deploy",\ + "benchmark": "gro run src/benchmarks/slugify_benchmark.ts",\ + "benchmark-deep-equal": "node --max-old-space-size=8192 --expose-gc --import @ryanatkn/gro/register.js src/lib/deep_equal.bench_comparison.ts",\ + "benchmark-deep-equal-deno": "deno run --allow-read --allow-env --v8-flags=--expose-gc src/lib/deep_equal.bench_comparison.ts"\ },\ "type": "module",\ "engines": {\ "node": ">=22.15"\ },\ + "keywords": [\ + "js",\ + "typescript",\ + "utilities",\ + "web"\ + ],\ "peerDependencies": {\ - "@ryanatkn/belt": "*",\ - "@ryanatkn/fuz": "*",\ - "@ryanatkn/gro": "*",\ - "@ryanatkn/moss": "*",\ - "@sveltejs/kit": "^2",\ - "svelte": "^5",\ - "zod": "^4.1.5"\ + "@types/node": "^24",\ + "esm-env": "^1.2.2",\ + "zod": "^4.0.14"\ + },\ + "peerDependenciesMeta": {\ + "@types/node": {\ + "optional": true\ + },\ + "esm-env": {\ + "optional": true\ + },\ + "zod": {\ + "optional": true\ + }\ },\ "devDependencies": {\ "@changesets/changelog-git": "^0.2.1",\ - "@ryanatkn/belt": "^0.34.1",\ - "@ryanatkn/eslint-config": "^0.8.0",\ - "@ryanatkn/fuz": "^0.147.0",\ - "@ryanatkn/gro": "^0.167.1",\ - "@ryanatkn/moss": "^0.36.0",\ - "@sveltejs/adapter-static": "^3.0.9",\ - "@sveltejs/kit": "^2.37.1",\ - "@sveltejs/package": "^2.5.0",\ - "@sveltejs/vite-plugin-svelte": "^6.1.4",\ - "@types/node": "^24.3.1",\ - "eslint": "^9.35.0",\ - "eslint-plugin-svelte": "^3.12.2",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.161.1",\ + "@ryanatkn/fuz_code": "^0.34.0",\ + "@ryanatkn/gro": "^0.175.0",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "@types/node": "^24.10.1",\ + "dequal": "^2.0.3",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ + "esm-env": "^1.2.2",\ "prettier": "^3.6.2",\ "prettier-plugin-svelte": "^3.4.0",\ - "svelte": "^5.38.7",\ - "svelte-check": "^4.3.1",\ + "svelte": "^5.43.14",\ + "svelte-check": "^4.3.4",\ + "tinybench": "^5.1.0",\ "tslib": "^2.8.1",\ - "typescript": "^5.9.2",\ - "typescript-eslint": "^8.42.0",\ - "vitest": "^3.2.4"\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.47.0",\ + "vitest": "^4.0.13",\ + "zod": "^4.1.12"\ },\ "prettier": {\ "plugins": [\ @@ -1269,415 +537,34 @@ export const repos_json: Array = JSON.parse( "types": "./dist/*.d.ts",\ "default": "./dist/*.js"\ },\ - "./*.svelte": {\ - "types": "./dist/*.svelte.d.ts",\ - "svelte": "./dist/*.svelte",\ - "default": "./dist/*.svelte"\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ }\ }\ },\ "src_json": {\ - "name": "@ryanatkn/fuz_gitops",\ - "version": "0.50.0",\ - "modules": {\ - "./fetch_repo_data.js": {\ - "path": "fetch_repo_data.ts",\ - "declarations": [\ - {\ - "name": "fetch_repo_data",\ - "kind": "function"\ - },\ - {\ - "name": "fetch_package_json",\ - "kind": "function"\ - },\ - {\ - "name": "fetch_src_json",\ - "kind": "function"\ - }\ - ]\ - },\ - "./fs_fetch_value_cache.js": {\ - "path": "fs_fetch_value_cache.ts",\ - "declarations": [\ - {\ - "name": "Fetch_Cache",\ - "kind": "type"\ - },\ - {\ - "name": "create_fs_fetch_value_cache",\ - "kind": "function"\ - }\ - ]\ - },\ - "./github_helpers.js": {\ - "path": "github_helpers.ts",\ - "declarations": [\ - {\ - "name": "Filter_Pull_Request",\ - "kind": "type"\ - },\ - {\ - "name": "Pull_Request_Meta",\ - "kind": "type"\ - },\ - {\ - "name": "to_pull_requests",\ - "kind": "function"\ - },\ - {\ - "name": "to_pull_url",\ - "kind": "function"\ - }\ - ]\ - },\ - "./github.js": {\ - "path": "github.ts",\ - "declarations": [\ - {\ - "name": "Github_Pull_Request",\ - "kind": "variable"\ - },\ - {\ - "name": "Github_Pull_Requests",\ - "kind": "variable"\ - },\ - {\ - "name": "fetch_github_pull_requests",\ - "kind": "function"\ - },\ - {\ - "name": "Github_Check_Runs_Item",\ - "kind": "variable"\ - },\ - {\ - "name": "Github_Check_Runs",\ - "kind": "variable"\ - },\ - {\ - "name": "fetch_github_check_runs",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gitops_config.js": {\ - "path": "gitops_config.ts",\ - "declarations": [\ - {\ - "name": "Gitops_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Create_Gitops_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Raw_Gitops_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Gitops_Repo_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Raw_Gitops_Repo_Config",\ - "kind": "type"\ - },\ - {\ - "name": "create_empty_gitops_config",\ - "kind": "function"\ - },\ - {\ - "name": "normalize_gitops_config",\ - "kind": "function"\ - },\ - {\ - "name": "Gitops_Config_Module",\ - "kind": "type"\ - },\ - {\ - "name": "load_gitops_config",\ - "kind": "function"\ - },\ - {\ - "name": "validate_gitops_config_module",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gitops_ready.task.js": {\ - "path": "gitops_ready.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./gitops_task_helpers.js": {\ - "path": "gitops_task_helpers.ts",\ - "declarations": [\ - {\ - "name": "get_gitops_ready",\ - "kind": "function"\ - },\ - {\ - "name": "resolve_gitops_paths",\ - "kind": "function"\ - },\ - {\ - "name": "import_gitops_config",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gitops.task.js": {\ - "path": "gitops.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./local_repo.js": {\ - "path": "local_repo.ts",\ - "declarations": [\ - {\ - "name": "Local_Repo",\ - "kind": "type"\ - },\ - {\ - "name": "Maybe_Local_Repo",\ - "kind": "type"\ - },\ - {\ - "name": "Resolved_Local_Repo",\ - "kind": "type"\ - },\ - {\ - "name": "Unresolved_Local_Repo",\ - "kind": "type"\ - },\ - {\ - "name": "load_local_repo",\ - "kind": "function"\ - },\ - {\ - "name": "load_local_repos",\ - "kind": "function"\ - },\ - {\ - "name": "resolve_local_repo",\ - "kind": "function"\ - }\ - ]\ - },\ - "./repo.js": {\ - "path": "repo.ts",\ - "declarations": [\ - {\ - "name": "Repo",\ - "kind": "type"\ - },\ - {\ - "name": "Repos",\ - "kind": "type"\ - },\ - {\ - "name": "repos_context",\ - "kind": "variable"\ - },\ - {\ - "name": "parse_repos",\ - "kind": "function"\ - }\ - ]\ - },\ - "./resolved_gitops_config.js": {\ - "path": "resolved_gitops_config.ts",\ - "declarations": [\ - {\ - "name": "Resolved_Gitops_Config",\ - "kind": "type"\ - },\ - {\ - "name": "resolve_gitops_config",\ - "kind": "function"\ - }\ - ]\ - },\ - "./Modules_Detail.svelte": {\ - "path": "Modules_Detail.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Modules_Nav.svelte": {\ - "path": "Modules_Nav.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Modules_Page.svelte": {\ - "path": "Modules_Page.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Page_Footer.svelte": {\ - "path": "Page_Footer.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Page_Header.svelte": {\ - "path": "Page_Header.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Pull_Requests_Detail.svelte": {\ - "path": "Pull_Requests_Detail.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Pull_Requests_Page.svelte": {\ - "path": "Pull_Requests_Page.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Repos_Table.svelte": {\ - "path": "Repos_Table.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Repos_Tree_Nav.svelte": {\ - "path": "Repos_Tree_Nav.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Repos_Tree.svelte": {\ - "path": "Repos_Tree.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Table_Page.svelte": {\ - "path": "Table_Page.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Tree_Item_Page.svelte": {\ - "path": "Tree_Item_Page.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - },\ - "./Tree_Page.svelte": {\ - "path": "Tree_Page.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ - }\ - }\ + "name": "@ryanatkn/belt",\ + "version": "0.38.2",\ + "modules": []\ },\ - "name": "@ryanatkn/fuz_gitops",\ - "repo_name": "fuz_gitops",\ - "repo_url": "https://github.com/ryanatkn/fuz_gitops",\ - "owner_name": "ryanatkn",\ - "homepage_url": "https://gitops.fuz.dev/",\ - "logo_url": "https://gitops.fuz.dev/logo.svg",\ - "logo_alt": "a friendly blue spider facing you",\ - "npm_url": "https://www.npmjs.com/package/@ryanatkn/fuz_gitops",\ - "changelog_url": "https://github.com/ryanatkn/fuz_gitops/blob/main/CHANGELOG.md",\ - "published": true,\ "check_runs": {\ "status": "completed",\ "conclusion": "success"\ },\ - "pull_requests": [\ - {\ - "number": 33,\ - "title": "improve local sync",\ - "user": {\ - "login": "ryanatkn"\ - },\ - "draft": false\ - }\ - ]\ + "pull_requests": []\ },\ {\ "package_json": {\ - "name": "@ryanatkn/fuz_code",\ - "version": "0.26.0",\ - "description": "syntax styling utilities and components for TypeScript, Svelte, SvelteKit",\ - "glyph": "🎨",\ + "name": "@ryanatkn/fuz_template",\ + "version": "0.0.1",\ + "description": "a static web app and Node library template with TypeScript, Svelte, SvelteKit, Vite, esbuild, Gro, and Fuz",\ + "glyph": "❄",\ "logo": "logo.svg",\ - "logo_alt": "a friendly pink spider facing you",\ + "logo_alt": "a friendly pixelated spider facing you",\ "public": true,\ - "license": "MIT",\ - "homepage": "https://code.fuz.dev/",\ - "repository": "https://github.com/ryanatkn/fuz_code",\ - "author": {\ - "name": "Ryan Atkinson",\ - "email": "mail@ryanatkn.com",\ - "url": "https://www.ryanatkn.com/"\ - },\ - "bugs": "https://github.com/ryanatkn/fuz_code/issues",\ - "funding": "https://www.ryanatkn.com/funding",\ + "homepage": "https://template.fuz.dev/",\ + "repository": "https://github.com/ryanatkn/fuz_template",\ "scripts": {\ "start": "gro dev",\ "dev": "gro dev",\ @@ -1685,51 +572,31 @@ export const repos_json: Array = JSON.parse( "check": "gro check",\ "test": "gro test",\ "preview": "vite preview",\ - "deploy": "gro deploy",\ - "benchmark": "gro run benchmark/run_benchmarks.ts",\ - "benchmark-compare": "gro run benchmark/compare/run_compare.ts",\ - "update-generated-fixtures": "gro src/fixtures/update"\ + "deploy": "gro deploy"\ },\ "type": "module",\ "engines": {\ "node": ">=22.15"\ },\ - "peerDependencies": {\ - "@ryanatkn/moss": "*",\ - "svelte": "^5"\ - },\ - "peerDependenciesMeta": {\ - "@ryanatkn/moss": {\ - "optional": true\ - },\ - "svelte": {\ - "optional": true\ - }\ - },\ "devDependencies": {\ - "@changesets/changelog-git": "^0.2.1",\ - "@ryanatkn/belt": "^0.34.1",\ - "@ryanatkn/eslint-config": "^0.8.0",\ - "@ryanatkn/fuz": "^0.147.0",\ - "@ryanatkn/gro": "^0.167.1",\ - "@ryanatkn/moss": "^0.36.0",\ - "@sveltejs/adapter-static": "^3.0.9",\ - "@sveltejs/kit": "^2.37.1",\ - "@sveltejs/package": "^2.5.0",\ - "@sveltejs/vite-plugin-svelte": "^6.1.4",\ - "@types/node": "^24.3.1",\ - "eslint": "^9.35.0",\ - "eslint-plugin-svelte": "^3.12.1",\ - "esm-env": "^1.2.2",\ + "@ryanatkn/belt": "^0.38.0",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.159.0",\ + "@ryanatkn/gro": "^0.174.2",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ "prettier": "^3.6.2",\ "prettier-plugin-svelte": "^3.4.0",\ - "svelte": "^5.38.7",\ - "svelte-check": "^4.3.1",\ - "tinybench": "^5.0.1",\ + "svelte": "^5.43.14",\ + "svelte-check": "^4.3.4",\ "tslib": "^2.8.1",\ - "typescript": "^5.9.2",\ - "typescript-eslint": "^8.42.0",\ - "vitest": "^3.2.4"\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.47.0",\ + "vitest": "^4.0.13"\ },\ "prettier": {\ "plugins": [\ @@ -1745,12 +612,6 @@ export const repos_json: Array = JSON.parse( "options": {\ "useTabs": false\ }\ - },\ - {\ - "files": "src/fixtures/generated/**",\ - "options": {\ - "requirePragma": true\ - }\ }\ ]\ },\ @@ -1758,289 +619,125 @@ export const repos_json: Array = JSON.parse( "**/*.css"\ ],\ "files": [\ - "dist",\ - "src/lib/**/*.ts",\ - "!src/lib/**/*.test.*",\ - "!dist/**/*.test.*"\ - ],\ - "exports": {\ - "./package.json": "./package.json",\ - "./*.js": {\ - "types": "./dist/*.d.ts",\ - "default": "./dist/*.js"\ - },\ - "./*.svelte": {\ - "types": "./dist/*.svelte.d.ts",\ - "svelte": "./dist/*.svelte",\ - "default": "./dist/*.svelte"\ - },\ - "./*.json": {\ - "types": "./dist/*.json.d.ts",\ - "default": "./dist/*.json"\ - },\ - "./*.css": {\ - "default": "./dist/*.css"\ - }\ - }\ + "dist"\ + ]\ },\ "src_json": {\ - "name": "@ryanatkn/fuz_code",\ - "version": "0.26.0",\ - "modules": {\ - "./code_sample.js": {\ - "path": "code_sample.ts",\ - "declarations": [\ - {\ - "name": "Code_Sample",\ - "kind": "type"\ - },\ - {\ - "name": "sample_langs",\ - "kind": "variable"\ - },\ - {\ - "name": "Sample_Lang",\ - "kind": "type"\ - }\ - ]\ - },\ - "./grammar_clike.js": {\ - "path": "grammar_clike.ts",\ - "declarations": [\ - {\ - "name": "class_keywords",\ - "kind": "variable"\ - },\ - {\ - "name": "add_grammar_clike",\ - "kind": "function"\ - }\ - ]\ - },\ - "./grammar_css.js": {\ - "path": "grammar_css.ts",\ - "declarations": [\ - {\ - "name": "add_grammar_css",\ - "kind": "function"\ - }\ - ]\ - },\ - "./grammar_js.js": {\ - "path": "grammar_js.ts",\ - "declarations": [\ - {\ - "name": "add_grammar_js",\ - "kind": "function"\ - }\ - ]\ - },\ - "./grammar_json.js": {\ - "path": "grammar_json.ts",\ - "declarations": [\ - {\ - "name": "add_grammar_json",\ - "kind": "function"\ - }\ - ]\ - },\ - "./grammar_markup.js": {\ - "path": "grammar_markup.ts",\ - "declarations": [\ - {\ - "name": "add_grammar_markup",\ - "kind": "function"\ - },\ - {\ - "name": "grammar_markup_add_inlined",\ - "kind": "function"\ - },\ - {\ - "name": "grammar_markup_add_attribute",\ - "kind": "function"\ - }\ - ]\ - },\ - "./grammar_svelte.js": {\ - "path": "grammar_svelte.ts",\ - "declarations": [\ - {\ - "name": "add_grammar_svelte",\ - "kind": "function"\ - },\ - {\ - "name": "grammar_svelte_add_inlined",\ - "kind": "function"\ - }\ - ]\ - },\ - "./grammar_ts.js": {\ - "path": "grammar_ts.ts",\ - "declarations": [\ - {\ - "name": "add_grammar_ts",\ - "kind": "function"\ - }\ - ]\ - },\ - "./highlight_manager.js": {\ - "path": "highlight_manager.ts",\ - "declarations": [\ - {\ - "name": "Highlight_Mode",\ - "kind": "type"\ - },\ - {\ - "name": "supports_css_highlight_api",\ - "kind": "function"\ - },\ - {\ - "name": "Highlight_Manager",\ - "kind": "class"\ - }\ - ]\ - },\ - "./highlight_priorities.gen.js": {\ - "path": "highlight_priorities.gen.ts",\ - "declarations": [\ - {\ - "name": "gen",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./highlight_priorities.js": {\ - "path": "highlight_priorities.ts",\ - "declarations": [\ - {\ - "name": "Highlight_Token_Name",\ - "kind": "type"\ - },\ - {\ - "name": "highlight_priorities",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./syntax_styler_global.js": {\ - "path": "syntax_styler_global.ts",\ - "declarations": [\ - {\ - "name": "syntax_styler_global",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./syntax_styler.js": {\ - "path": "syntax_styler.ts",\ - "declarations": [\ - {\ - "name": "Add_Syntax_Grammar",\ - "kind": "type"\ - },\ - {\ - "name": "Syntax_Styler",\ - "kind": "class"\ - },\ - {\ - "name": "Syntax_Grammar_Value",\ - "kind": "type"\ - },\ - {\ - "name": "Syntax_Grammar",\ - "kind": "type"\ - },\ - {\ - "name": "Syntax_Grammar_Token",\ - "kind": "type"\ - },\ - {\ - "name": "Hook_Before_Tokenize_Callback",\ - "kind": "type"\ - },\ - {\ - "name": "Hook_After_Tokenize_Callback",\ - "kind": "type"\ - },\ - {\ - "name": "Hook_Wrap_Callback",\ - "kind": "type"\ - },\ - {\ - "name": "Hook_Before_Tokenize_Callback_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Hook_After_Tokenize_Callback_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Hook_Wrap_Callback_Context",\ - "kind": "type"\ - }\ - ]\ - },\ - "./syntax_token.js": {\ - "path": "syntax_token.ts",\ - "declarations": [\ - {\ - "name": "Syntax_Token",\ - "kind": "class"\ - },\ - {\ - "name": "Syntax_Token_Stream",\ - "kind": "type"\ - }\ - ]\ - },\ - "./tokenize_syntax.js": {\ - "path": "tokenize_syntax.ts",\ - "declarations": [\ - {\ - "name": "tokenize_syntax",\ - "kind": "function"\ - }\ - ]\ - },\ - "./Code.svelte": {\ - "path": "Code.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ + "name": "@ryanatkn/fuz_template",\ + "version": "0.0.1",\ + "modules": []\ + },\ + "check_runs": {\ + "status": "completed",\ + "conclusion": "success"\ + },\ + "pull_requests": []\ + },\ + {\ + "package_json": {\ + "name": "@ryanatkn/fuz_blog",\ + "version": "0.17.0",\ + "description": "blog software from scratch with SvelteKit",\ + "glyph": "🖊️",\ + "logo": "logo.svg",\ + "logo_alt": "a friendly yellow spider facing you",\ + "public": true,\ + "homepage": "https://blog.fuz.dev/",\ + "repository": "https://github.com/ryanatkn/fuz_blog",\ + "scripts": {\ + "start": "gro dev",\ + "dev": "gro dev",\ + "build": "gro build",\ + "check": "gro check",\ + "test": "gro test",\ + "preview": "vite preview",\ + "deploy": "gro deploy"\ + },\ + "type": "module",\ + "engines": {\ + "node": ">=22.15"\ + },\ + "peerDependencies": {\ + "@ryanatkn/belt": ">=0.38.2",\ + "@ryanatkn/fuz": ">=0.161.1",\ + "@ryanatkn/fuz_mastodon": ">=0.34.0",\ + "@ryanatkn/gro": ">=0.175.0",\ + "@ryanatkn/moss": ">=0.38.0",\ + "@sveltejs/kit": "^2",\ + "date-fns": "^4",\ + "svelte": "^5"\ + },\ + "devDependencies": {\ + "@changesets/changelog-git": "^0.2.1",\ + "@ryanatkn/belt": "^0.38.2",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.161.1",\ + "@ryanatkn/fuz_code": "^0.35.0",\ + "@ryanatkn/fuz_mastodon": "^0.34.0",\ + "@ryanatkn/gro": "^0.175.0",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "@types/node": "^24.10.1",\ + "date-fns": "^4.1.0",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ + "prettier": "^3.6.2",\ + "prettier-plugin-svelte": "^3.4.0",\ + "svelte": "^5.43.15",\ + "svelte-check": "^4.3.4",\ + "tslib": "^2.8.1",\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.48.0",\ + "vitest": "^4.0.13"\ + },\ + "prettier": {\ + "plugins": [\ + "prettier-plugin-svelte"\ + ],\ + "useTabs": true,\ + "printWidth": 100,\ + "singleQuote": true,\ + "bracketSpacing": false,\ + "overrides": [\ + {\ + "files": "package.json",\ + "options": {\ + "useTabs": false\ }\ - ]\ + }\ + ]\ + },\ + "sideEffects": [\ + "**/*.css"\ + ],\ + "files": [\ + "dist"\ + ],\ + "exports": {\ + "./package.json": "./package.json",\ + "./*.js": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ },\ - "./theme_variables.css": {\ - "path": "theme_variables.css",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "css"\ - }\ - ]\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ },\ - "./theme.css": {\ - "path": "theme.css",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "css"\ - }\ - ]\ + "./*.svelte": {\ + "types": "./dist/*.svelte.d.ts",\ + "svelte": "./dist/*.svelte",\ + "default": "./dist/*.svelte"\ }\ }\ },\ - "name": "@ryanatkn/fuz_code",\ - "repo_name": "fuz_code",\ - "repo_url": "https://github.com/ryanatkn/fuz_code",\ - "owner_name": "ryanatkn",\ - "homepage_url": "https://code.fuz.dev/",\ - "logo_url": "https://code.fuz.dev/logo.svg",\ - "logo_alt": "a friendly pink spider facing you",\ - "npm_url": "https://www.npmjs.com/package/@ryanatkn/fuz_code",\ - "changelog_url": "https://github.com/ryanatkn/fuz_code/blob/main/CHANGELOG.md",\ - "published": true,\ + "src_json": {\ + "name": "@ryanatkn/fuz_blog",\ + "version": "0.17.0",\ + "modules": []\ + },\ "check_runs": {\ "status": "completed",\ "conclusion": "success"\ @@ -2050,7 +747,7 @@ export const repos_json: Array = JSON.parse( {\ "package_json": {\ "name": "@ryanatkn/fuz_mastodon",\ - "version": "0.32.0",\ + "version": "0.34.0",\ "description": "Mastodon components and helpers for Svelte, SvelteKit, and Fuz",\ "glyph": "🦣",\ "logo": "logo.svg",\ @@ -2080,9 +777,9 @@ export const repos_json: Array = JSON.parse( "node": ">=22.15"\ },\ "peerDependencies": {\ - "@ryanatkn/belt": "*",\ - "@ryanatkn/fuz": "*",\ - "@ryanatkn/moss": "*",\ + "@ryanatkn/belt": ">=0.38.2",\ + "@ryanatkn/fuz": ">=0.161.1",\ + "@ryanatkn/moss": ">=0.38.0",\ "@sveltejs/kit": "^2",\ "date-fns": "^4",\ "esm-env": "^1",\ @@ -2090,30 +787,28 @@ export const repos_json: Array = JSON.parse( },\ "devDependencies": {\ "@changesets/changelog-git": "^0.2.1",\ - "@ryanatkn/belt": "^0.34.1",\ - "@ryanatkn/eslint-config": "^0.8.0",\ - "@ryanatkn/fuz": "^0.147.0",\ - "@ryanatkn/fuz_code": "^0.26.0",\ - "@ryanatkn/gro": "^0.167.1",\ - "@ryanatkn/moss": "^0.36.0",\ - "@sveltejs/adapter-static": "^3.0.9",\ - "@sveltejs/kit": "^2.37.1",\ - "@sveltejs/package": "^2.5.0",\ - "@sveltejs/vite-plugin-svelte": "^6.1.4",\ + "@ryanatkn/belt": "^0.38.2",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.161.1",\ + "@ryanatkn/fuz_code": "^0.35.0",\ + "@ryanatkn/gro": "^0.175.0",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ "date-fns": "^4.1.0",\ - "eslint": "^9.35.0",\ - "eslint-plugin-svelte": "^3.12.2",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ "esm-env": "^1.2.2",\ "prettier": "^3.6.2",\ "prettier-plugin-svelte": "^3.4.0",\ - "prism-svelte": "^0.5.0",\ - "prismjs": "^1.30.0",\ - "svelte": "^5.38.7",\ - "svelte-check": "^4.3.1",\ + "svelte": "^5.43.15",\ + "svelte-check": "^4.3.4",\ "tslib": "^2.8.1",\ - "typescript": "^5.9.2",\ - "typescript-eslint": "^8.42.0",\ - "vitest": "^3.2.4"\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.48.0",\ + "vitest": "^4.0.13"\ },\ "prettier": {\ "plugins": [\ @@ -2147,6 +842,10 @@ export const repos_json: Array = JSON.parse( "types": "./dist/*.d.ts",\ "default": "./dist/*.js"\ },\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ + },\ "./*.svelte": {\ "types": "./dist/*.svelte.d.ts",\ "svelte": "./dist/*.svelte",\ @@ -2156,176 +855,138 @@ export const repos_json: Array = JSON.parse( },\ "src_json": {\ "name": "@ryanatkn/fuz_mastodon",\ - "version": "0.32.0",\ - "modules": {\ - "./mastodon_cache.svelte.js": {\ - "path": "mastodon_cache.svelte.ts",\ - "declarations": [\ - {\ - "name": "Mastodon_Cache",\ - "kind": "class"\ - },\ - {\ - "name": "mastodon_cache_context",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./mastodon.js": {\ - "path": "mastodon.ts",\ - "declarations": [\ - {\ - "name": "to_mastodon_status_url",\ - "kind": "function"\ - },\ - {\ - "name": "to_mastodon_status_url_with_author",\ - "kind": "function"\ - },\ - {\ - "name": "to_mastodon_status_url_with_users_author",\ - "kind": "function"\ - },\ - {\ - "name": "to_mastodon_api_status_url",\ - "kind": "function"\ - },\ - {\ - "name": "to_mastodon_api_status_context_url",\ - "kind": "function"\ - },\ - {\ - "name": "to_mastodon_api_favourites_url",\ - "kind": "function"\ - },\ - {\ - "name": "Mastodon_Status_Url",\ - "kind": "type"\ - },\ - {\ - "name": "parse_mastodon_status_url",\ - "kind": "function"\ - },\ - {\ - "name": "fetch_mastodon_status_context",\ - "kind": "function"\ - },\ - {\ - "name": "fetch_mastodon_status",\ - "kind": "function"\ - },\ - {\ - "name": "fetch_mastodon_favourites",\ - "kind": "function"\ - },\ - {\ - "name": "Mastodon_Status_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Mastodon_Status",\ - "kind": "type"\ - },\ - {\ - "name": "Mastodon_Favourite",\ - "kind": "type"\ - },\ - {\ - "name": "Reply_Filter",\ - "kind": "type"\ - },\ - {\ - "name": "Favourited_By_Reply_Filter",\ - "kind": "type"\ - },\ - {\ - "name": "Minimum_Favourites_Reply_Filter",\ - "kind": "type"\ - },\ - {\ - "name": "Custom_Reply_Filter",\ - "kind": "type"\ - },\ - {\ - "name": "Create_Reply_Filters",\ - "kind": "type"\ - },\ - {\ - "name": "filter_valid_replies",\ - "kind": "function"\ - }\ - ]\ - },\ - "./storage.js": {\ - "path": "storage.ts",\ - "declarations": [\ - {\ - "name": "load_from_storage",\ - "kind": "function"\ - },\ - {\ - "name": "set_in_storage",\ - "kind": "function"\ - }\ - ]\ - },\ - "./Mastodon_Status_Item.svelte": {\ - "path": "Mastodon_Status_Item.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ + "version": "0.34.0",\ + "modules": []\ + },\ + "check_runs": {\ + "status": "completed",\ + "conclusion": "success"\ + },\ + "pull_requests": []\ + },\ + {\ + "package_json": {\ + "name": "@ryanatkn/fuz_code",\ + "version": "0.35.0",\ + "description": "syntax styling utilities and components for TypeScript, Svelte, and Markdown",\ + "glyph": "🎨",\ + "logo": "logo.svg",\ + "logo_alt": "a friendly pink spider facing you",\ + "public": true,\ + "license": "MIT",\ + "homepage": "https://code.fuz.dev/",\ + "repository": "https://github.com/ryanatkn/fuz_code",\ + "author": {\ + "name": "Ryan Atkinson",\ + "email": "mail@ryanatkn.com",\ + "url": "https://www.ryanatkn.com/"\ + },\ + "bugs": "https://github.com/ryanatkn/fuz_code/issues",\ + "funding": "https://www.ryanatkn.com/funding",\ + "scripts": {\ + "start": "gro dev",\ + "dev": "gro dev",\ + "build": "gro build",\ + "check": "gro check",\ + "test": "gro test",\ + "preview": "vite preview",\ + "deploy": "gro deploy",\ + "benchmark": "gro run benchmark/run_benchmarks.ts",\ + "benchmark-compare": "gro run benchmark/compare/run_compare.ts",\ + "update-generated-fixtures": "gro src/test/fixtures/update"\ + },\ + "type": "module",\ + "engines": {\ + "node": ">=22.15"\ + },\ + "peerDependencies": {\ + "@ryanatkn/moss": ">=0.38.0",\ + "svelte": "^5"\ + },\ + "peerDependenciesMeta": {\ + "@ryanatkn/moss": {\ + "optional": true\ },\ - "./Mastodon_Status_Tree.svelte": {\ - "path": "Mastodon_Status_Tree.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ + "svelte": {\ + "optional": true\ + }\ + },\ + "devDependencies": {\ + "@changesets/changelog-git": "^0.2.1",\ + "@ryanatkn/belt": "^0.38.2",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.161.1",\ + "@ryanatkn/gro": "^0.175.0",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "@types/node": "^24.10.1",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ + "esm-env": "^1.2.2",\ + "prettier": "^3.6.2",\ + "prettier-plugin-svelte": "^3.4.0",\ + "svelte": "^5.43.14",\ + "svelte-check": "^4.3.4",\ + "tinybench": "^5.1.0",\ + "tslib": "^2.8.1",\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.47.0",\ + "vitest": "^4.0.13"\ + },\ + "prettier": {\ + "plugins": [\ + "prettier-plugin-svelte"\ + ],\ + "useTabs": true,\ + "printWidth": 100,\ + "singleQuote": true,\ + "bracketSpacing": false,\ + "overrides": [\ + {\ + "files": "package.json",\ + "options": {\ + "useTabs": false\ }\ - ]\ + }\ + ]\ + },\ + "sideEffects": [\ + "**/*.css"\ + ],\ + "files": [\ + "dist",\ + "src/lib/**/*.ts",\ + "!src/lib/**/*.test.*",\ + "!dist/**/*.test.*"\ + ],\ + "exports": {\ + "./package.json": "./package.json",\ + "./*.js": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ },\ - "./Toot_Input.svelte": {\ - "path": "Toot_Input.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ },\ - "./Toot_Loader.svelte": {\ - "path": "Toot_Loader.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ + "./*.svelte": {\ + "types": "./dist/*.svelte.d.ts",\ + "svelte": "./dist/*.svelte",\ + "default": "./dist/*.svelte"\ },\ - "./Toot.svelte": {\ - "path": "Toot.svelte",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "component"\ - }\ - ]\ + "./*.css": {\ + "default": "./dist/*.css"\ }\ }\ },\ - "name": "@ryanatkn/fuz_mastodon",\ - "repo_name": "fuz_mastodon",\ - "repo_url": "https://github.com/ryanatkn/fuz_mastodon",\ - "owner_name": "ryanatkn",\ - "homepage_url": "https://mastodon.fuz.dev/",\ - "logo_url": "https://mastodon.fuz.dev/logo.svg",\ - "logo_alt": "a friendly purple spider facing you",\ - "npm_url": "https://www.npmjs.com/package/@ryanatkn/fuz_mastodon",\ - "changelog_url": "https://github.com/ryanatkn/fuz_mastodon/blob/main/CHANGELOG.md",\ - "published": true,\ + "src_json": {\ + "name": "@ryanatkn/fuz_code",\ + "version": "0.35.0",\ + "modules": []\ + },\ "check_runs": {\ "status": "completed",\ "conclusion": "success"\ @@ -2334,29 +995,24 @@ export const repos_json: Array = JSON.parse( },\ {\ "package_json": {\ - "name": "@ryanatkn/gro",\ - "version": "0.167.1",\ - "description": "task runner and toolkit extending SvelteKit",\ - "motto": "generate, run, optimize",\ - "glyph": "🌰",\ + "name": "@ryanatkn/fuz_gitops",\ + "version": "0.52.0",\ + "description": "a tool for managing many repos",\ + "glyph": "🪄",\ "logo": "logo.svg",\ - "logo_alt": "a pixelated green oak acorn with a glint of sun",\ + "logo_alt": "a friendly blue spider facing you",\ "public": true,\ "license": "MIT",\ - "homepage": "https://gro.ryanatkn.com/",\ + "homepage": "https://gitops.fuz.dev/",\ + "repository": "https://github.com/ryanatkn/fuz_gitops",\ "author": {\ "name": "Ryan Atkinson",\ "email": "mail@ryanatkn.com",\ "url": "https://www.ryanatkn.com/"\ },\ - "repository": {\ - "type": "git",\ - "url": "git+https://github.com/ryanatkn/gro.git"\ - },\ - "bugs": "https://github.com/ryanatkn/gro/issues",\ + "bugs": "https://github.com/ryanatkn/fuz_gitops/issues",\ "funding": "https://www.ryanatkn.com/funding",\ "scripts": {\ - "bootstrap": "rm -rf .gro dist && svelte-kit sync && svelte-package && chmod +x ./dist/gro.js && npm link -f",\ "start": "gro dev",\ "dev": "gro dev",\ "build": "gro build",\ @@ -2369,70 +1025,38 @@ export const repos_json: Array = JSON.parse( "engines": {\ "node": ">=22.15"\ },\ - "bin": {\ - "gro": "dist/gro.js"\ - },\ - "keywords": [\ - "web",\ - "tools",\ - "task runner",\ - "tasks",\ - "codegen",\ - "svelte",\ - "sveltekit",\ - "vite",\ - "typescript"\ - ],\ - "dependencies": {\ - "@ryanatkn/belt": "^0.34.1",\ - "chokidar": "^4.0.3",\ - "dotenv": "^17.2.2",\ - "esm-env": "^1.2.2",\ - "mri": "^1.2.0",\ - "oxc-parser": "^0.87.0",\ - "prettier": "^3.6.2",\ - "prettier-plugin-svelte": "^3.4.0",\ - "ts-blank-space": "^0.6.2",\ - "tslib": "^2.8.1",\ - "zod": "^4.1.5"\ - },\ "peerDependencies": {\ + "@ryanatkn/belt": ">=0.38.2",\ + "@ryanatkn/fuz": ">=0.161.1",\ + "@ryanatkn/gro": ">=0.175.0",\ + "@ryanatkn/moss": ">=0.38.0",\ "@sveltejs/kit": "^2",\ - "esbuild": "^0.25",\ "svelte": "^5",\ - "typescript": "^5",\ - "vitest": "^3"\ - },\ - "peerDependenciesMeta": {\ - "@sveltejs/kit": {\ - "optional": true\ - },\ - "vitest": {\ - "optional": true\ - }\ - },\ - "optionalDependencies": {\ - "vitest": "^3"\ + "zod": "^4.1.13"\ },\ "devDependencies": {\ "@changesets/changelog-git": "^0.2.1",\ - "@changesets/types": "^6.1.0",\ - "@ryanatkn/eslint-config": "^0.8.0",\ - "@ryanatkn/fuz": "^0.147.0",\ - "@ryanatkn/moss": "^0.36.0",\ - "@sveltejs/adapter-static": "^3.0.9",\ - "@sveltejs/kit": "^2.37.1",\ - "@sveltejs/package": "^2.5.0",\ - "@sveltejs/vite-plugin-svelte": "^6.1.4",\ - "@types/node": "^24.3.1",\ - "esbuild": "^0.25.9",\ - "eslint": "^9.35.0",\ - "eslint-plugin-svelte": "^3.12.2",\ - "svelte": "^5.38.7",\ - "svelte-check": "^4.3.2",\ - "typescript": "^5.9.2",\ - "typescript-eslint": "^8.42.0",\ - "vitest": "^3.2.4"\ + "@ryanatkn/belt": "^0.38.2",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.161.1",\ + "@ryanatkn/fuz_code": "^0.35.0",\ + "@ryanatkn/gro": "^0.175.0",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/package": "^2.5.6",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "@types/node": "^24.10.1",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ + "prettier": "^3.6.2",\ + "prettier-plugin-svelte": "^3.4.0",\ + "svelte": "^5.43.15",\ + "svelte-check": "^4.3.4",\ + "tslib": "^2.8.1",\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.48.0",\ + "vitest": "^4.0.13"\ },\ "prettier": {\ "plugins": [\ @@ -2462,2106 +1086,126 @@ export const repos_json: Array = JSON.parse( ],\ "exports": {\ "./package.json": "./package.json",\ - ".": {\ - "types": "./dist/index.d.ts",\ - "default": "./dist/index.js"\ - },\ "./*.js": {\ "types": "./dist/*.d.ts",\ "default": "./dist/*.js"\ + },\ + "./*.ts": {\ + "types": "./dist/*.d.ts",\ + "default": "./dist/*.js"\ + },\ + "./*.svelte": {\ + "types": "./dist/*.svelte.d.ts",\ + "svelte": "./dist/*.svelte",\ + "default": "./dist/*.svelte"\ }\ }\ },\ "src_json": {\ - "name": "@ryanatkn/gro",\ - "version": "0.167.1",\ - "modules": {\ - ".": {\ - "path": "index.ts",\ - "declarations": [\ - {\ - "name": "Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Create_Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Raw_Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Plugin",\ - "kind": "type"\ - },\ - {\ - "name": "replace_plugin",\ - "kind": "function"\ - },\ - {\ - "name": "Gen",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Task",\ - "kind": "type"\ - },\ - {\ - "name": "Task_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Task_Error",\ - "kind": "class"\ - }\ - ]\ - },\ - "./args.js": {\ - "path": "args.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "type"\ - },\ - {\ - "name": "Arg_Value",\ - "kind": "type"\ - },\ - {\ - "name": "Arg_Schema",\ - "kind": "type"\ - },\ - {\ - "name": "parse_args",\ - "kind": "function"\ - },\ - {\ - "name": "serialize_args",\ - "kind": "function"\ - },\ - {\ - "name": "to_task_args",\ - "kind": "function"\ - },\ - {\ - "name": "to_raw_rest_args",\ - "kind": "function"\ - },\ - {\ - "name": "to_forwarded_args",\ - "kind": "function"\ - },\ - {\ - "name": "to_forwarded_args_by_command",\ - "kind": "function"\ - },\ - {\ - "name": "print_command_args",\ - "kind": "function"\ - }\ - ]\ - },\ - "./build.task.js": {\ - "path": "build.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./changelog.js": {\ - "path": "changelog.ts",\ - "declarations": [\ - {\ - "name": "update_changelog",\ - "kind": "function"\ - }\ - ]\ - },\ - "./changeset_helpers.js": {\ - "path": "changeset_helpers.ts",\ - "declarations": [\ - {\ - "name": "CHANGESET_RESTRICTED_ACCESS",\ - "kind": "variable"\ - },\ - {\ - "name": "CHANGESET_PUBLIC_ACCESS",\ - "kind": "variable"\ - },\ - {\ - "name": "Changeset_Access",\ - "kind": "variable"\ - },\ - {\ - "name": "CHANGESET_CLI",\ - "kind": "variable"\ - },\ - {\ - "name": "CHANGESET_DIR",\ - "kind": "variable"\ - },\ - {\ - "name": "Changeset_Bump",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./changeset.task.js": {\ - "path": "changeset.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./check.task.js": {\ - "path": "check.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./child_process_logging.js": {\ - "path": "child_process_logging.ts",\ - "declarations": [\ - {\ - "name": "map_child_process_output",\ - "kind": "function"\ - },\ - {\ - "name": "configure_colored_output_with_path_replacement",\ - "kind": "function"\ - }\ - ]\ - },\ - "./clean_fs.js": {\ - "path": "clean_fs.ts",\ - "declarations": [\ - {\ - "name": "clean_fs",\ - "kind": "function"\ - }\ - ]\ - },\ - "./clean.task.js": {\ - "path": "clean.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./cli.js": {\ - "path": "cli.ts",\ - "declarations": [\ - {\ - "name": "Cli",\ - "kind": "type"\ - },\ - {\ - "name": "find_cli",\ - "kind": "function"\ - },\ - {\ - "name": "spawn_cli",\ - "kind": "function"\ - },\ - {\ - "name": "spawn_cli_process",\ - "kind": "function"\ - },\ - {\ - "name": "resolve_cli",\ - "kind": "function"\ - },\ - {\ - "name": "to_cli_name",\ - "kind": "function"\ - }\ - ]\ - },\ - "./commit.task.js": {\ - "path": "commit.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./constants.js": {\ - "path": "constants.ts",\ - "declarations": [\ - {\ - "name": "SOURCE_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_DIST_PREFIX",\ - "kind": "variable"\ - },\ - {\ - "name": "SERVER_DIST_PATH",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_DEV_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "SOURCE_DIR",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_DIR",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_DEV_DIR",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_CONFIG_FILENAME",\ - "kind": "variable"\ - },\ - {\ - "name": "README_FILENAME",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTE_CONFIG_FILENAME",\ - "kind": "variable"\ - },\ - {\ - "name": "VITE_CONFIG_FILENAME",\ - "kind": "variable"\ - },\ - {\ - "name": "NODE_MODULES_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "PACKAGE_JSON_FILENAME",\ - "kind": "variable"\ - },\ - {\ - "name": "LOCKFILE_FILENAME",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_DEV_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_BUILD_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_DIST_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_VITE_CACHE_PATH",\ - "kind": "variable"\ - },\ - {\ - "name": "GITHUB_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "GIT_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "TSCONFIG_FILENAME",\ - "kind": "variable"\ - },\ - {\ - "name": "TS_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "JS_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "JSON_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTE_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTE_RUNES_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "CSS_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTE_SCRIPT_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_ENV_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_GLOBAL_SPECIFIER",\ - "kind": "variable"\ - },\ - {\ - "name": "EVERYTHING_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "JS_CLI_DEFAULT",\ - "kind": "variable"\ - },\ - {\ - "name": "PM_CLI_DEFAULT",\ - "kind": "variable"\ - },\ - {\ - "name": "PRETTIER_CLI_DEFAULT",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_CLI",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTE_CHECK_CLI",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTE_PACKAGE_CLI",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTE_PACKAGE_DEP_NAME",\ - "kind": "variable"\ - },\ - {\ - "name": "VITE_CLI",\ - "kind": "variable"\ - },\ - {\ - "name": "VITEST_CLI",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./deploy.task.js": {\ - "path": "deploy.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./dev.task.js": {\ - "path": "dev.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "DevTask_Context",\ - "kind": "type"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./disknode.js": {\ - "path": "disknode.ts",\ - "declarations": [\ - {\ - "name": "Disknode",\ - "kind": "type"\ - }\ - ]\ - },\ - "./env.js": {\ - "path": "env.ts",\ - "declarations": [\ - {\ - "name": "load_env",\ - "kind": "function"\ - },\ - {\ - "name": "merge_envs",\ - "kind": "function"\ - },\ - {\ - "name": "is_private_env",\ - "kind": "function"\ - },\ - {\ - "name": "is_public_env",\ - "kind": "function"\ - },\ - {\ - "name": "load_from_env",\ - "kind": "function"\ - }\ - ]\ - },\ - "./esbuild_helpers.js": {\ - "path": "esbuild_helpers.ts",\ - "declarations": [\ - {\ - "name": "print_build_result",\ - "kind": "function"\ - },\ - {\ - "name": "to_define_import_meta_env",\ - "kind": "function"\ - },\ - {\ - "name": "default_ts_transform_options",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./esbuild_plugin_external_worker.js": {\ - "path": "esbuild_plugin_external_worker.ts",\ - "declarations": [\ - {\ - "name": "Esbuild_Plugin_External_Worker_Options",\ - "kind": "type"\ - },\ - {\ - "name": "esbuild_plugin_external_worker",\ - "kind": "function"\ - }\ - ]\ - },\ - "./esbuild_plugin_svelte.js": {\ - "path": "esbuild_plugin_svelte.ts",\ - "declarations": [\ - {\ - "name": "Esbuild_Plugin_Svelte_Options",\ - "kind": "type"\ - },\ - {\ - "name": "esbuild_plugin_svelte",\ - "kind": "function"\ - }\ - ]\ - },\ - "./esbuild_plugin_sveltekit_local_imports.js": {\ - "path": "esbuild_plugin_sveltekit_local_imports.ts",\ - "declarations": [\ - {\ - "name": "esbuild_plugin_sveltekit_local_imports",\ - "kind": "function"\ - }\ - ]\ - },\ - "./esbuild_plugin_sveltekit_shim_alias.js": {\ - "path": "esbuild_plugin_sveltekit_shim_alias.ts",\ - "declarations": [\ - {\ - "name": "Esbuild_Plugin_Sveltekit_Shim_Alias_Options",\ - "kind": "type"\ - },\ - {\ - "name": "esbuild_plugin_sveltekit_shim_alias",\ - "kind": "function"\ - }\ - ]\ - },\ - "./esbuild_plugin_sveltekit_shim_app.js": {\ - "path": "esbuild_plugin_sveltekit_shim_app.ts",\ - "declarations": [\ - {\ - "name": "Esbuild_Plugin_Sveltekit_Shim_App_Options",\ - "kind": "type"\ - },\ - {\ - "name": "esbuild_plugin_sveltekit_shim_app",\ - "kind": "function"\ - }\ - ]\ - },\ - "./esbuild_plugin_sveltekit_shim_env.js": {\ - "path": "esbuild_plugin_sveltekit_shim_env.ts",\ - "declarations": [\ - {\ - "name": "Esbuild_Plugin_Sveltekit_Shim_Env_Options",\ - "kind": "type"\ - },\ - {\ - "name": "esbuild_plugin_sveltekit_shim_env",\ - "kind": "function"\ - }\ - ]\ - },\ - "./filer.js": {\ - "path": "filer.ts",\ - "declarations": [\ - {\ - "name": "On_Filer_Change",\ - "kind": "type"\ - },\ - {\ - "name": "Filer_Options",\ - "kind": "type"\ - },\ - {\ - "name": "Filer",\ - "kind": "class"\ - },\ - {\ - "name": "filter_dependents",\ - "kind": "function"\ - }\ - ]\ - },\ - "./format_directory.js": {\ - "path": "format_directory.ts",\ - "declarations": [\ - {\ - "name": "format_directory",\ - "kind": "function"\ - }\ - ]\ - },\ - "./format_file.js": {\ - "path": "format_file.ts",\ - "declarations": [\ - {\ - "name": "format_file",\ - "kind": "function"\ - }\ - ]\ - },\ - "./format.task.js": {\ - "path": "format.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./fs.js": {\ - "path": "fs.ts",\ - "declarations": [\ - {\ - "name": "empty_dir",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gen_helpers.js": {\ - "path": "gen_helpers.ts",\ - "declarations": [\ - {\ - "name": "should_trigger_gen",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gen.task.js": {\ - "path": "gen.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./gen.js": {\ - "path": "gen.ts",\ - "declarations": [\ - {\ - "name": "GEN_FILE_PATTERN_TEXT",\ - "kind": "variable"\ - },\ - {\ - "name": "GEN_FILE_PATTERN",\ - "kind": "variable"\ - },\ - {\ - "name": "is_gen_path",\ - "kind": "function"\ - },\ - {\ - "name": "Gen_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_File",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Dependencies",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Dependencies_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Dependencies_Resolver",\ - "kind": "type"\ - },\ - {\ - "name": "Gen",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Function",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Raw_Gen_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Raw_Gen_File",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Results",\ - "kind": "type"\ - },\ - {\ - "name": "Genfile_Module_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Genfile_Module_Result_Success",\ - "kind": "type"\ - },\ - {\ - "name": "Genfile_Module_Result_Failure",\ - "kind": "type"\ - },\ - {\ - "name": "to_gen_result",\ - "kind": "function"\ - },\ - {\ - "name": "to_output_file_name",\ - "kind": "function"\ - },\ - {\ - "name": "Analyzed_Gen_Result",\ - "kind": "type"\ - },\ - {\ - "name": "analyze_gen_results",\ - "kind": "function"\ - },\ - {\ - "name": "analyze_gen_result",\ - "kind": "function"\ - },\ - {\ - "name": "write_gen_results",\ - "kind": "function"\ - },\ - {\ - "name": "Found_Genfiles",\ - "kind": "type"\ - },\ - {\ - "name": "Find_Genfiles_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Find_Genfiles_Failure",\ - "kind": "type"\ - },\ - {\ - "name": "find_genfiles",\ - "kind": "function"\ - },\ - {\ - "name": "Genfile_Module",\ - "kind": "type"\ - },\ - {\ - "name": "Genfile_Module_Meta",\ - "kind": "type"\ - },\ - {\ - "name": "Loaded_Genfiles",\ - "kind": "type"\ - },\ - {\ - "name": "Load_Genfiles_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Load_Genfiles_Failure",\ - "kind": "type"\ - },\ - {\ - "name": "load_genfiles",\ - "kind": "function"\ - },\ - {\ - "name": "validate_gen_module",\ - "kind": "function"\ - },\ - {\ - "name": "normalize_gen_config",\ - "kind": "function"\ - }\ - ]\ - },\ - "./git.js": {\ - "path": "git.ts",\ - "declarations": [\ - {\ - "name": "Git_Origin",\ - "kind": "variable"\ - },\ - {\ - "name": "Git_Branch",\ - "kind": "variable"\ - },\ - {\ - "name": "git_current_branch_name",\ - "kind": "function"\ - },\ - {\ - "name": "git_remote_branch_exists",\ - "kind": "function"\ - },\ - {\ - "name": "git_local_branch_exists",\ - "kind": "function"\ - },\ - {\ - "name": "git_check_clean_workspace",\ - "kind": "function"\ - },\ - {\ - "name": "git_check_fully_staged_workspace",\ - "kind": "function"\ - },\ - {\ - "name": "git_fetch",\ - "kind": "function"\ - },\ - {\ - "name": "git_checkout",\ - "kind": "function"\ - },\ - {\ - "name": "git_pull",\ - "kind": "function"\ - },\ - {\ - "name": "git_push",\ - "kind": "function"\ - },\ - {\ - "name": "git_push_to_create",\ - "kind": "function"\ - },\ - {\ - "name": "git_delete_local_branch",\ - "kind": "function"\ - },\ - {\ - "name": "git_delete_remote_branch",\ - "kind": "function"\ - },\ - {\ - "name": "git_reset_branch_to_first_commit",\ - "kind": "function"\ - },\ - {\ - "name": "git_current_commit_hash",\ - "kind": "function"\ - },\ - {\ - "name": "git_current_branch_first_commit_hash",\ - "kind": "function"\ - },\ - {\ - "name": "git_check_setting_pull_rebase",\ - "kind": "function"\ - },\ - {\ - "name": "git_clone_locally",\ - "kind": "function"\ - }\ - ]\ - },\ - "./github.js": {\ - "path": "github.ts",\ - "declarations": [\ - {\ - "name": "GITHUB_REPO_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "Github_Pull_Request",\ - "kind": "variable"\ - },\ - {\ - "name": "github_fetch_commit_prs",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro_config.js": {\ - "path": "gro_config.ts",\ - "declarations": [\ - {\ - "name": "Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Raw_Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Create_Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "create_empty_gro_config",\ - "kind": "function"\ - },\ - {\ - "name": "SEARCH_EXCLUDER_DEFAULT",\ - "kind": "variable"\ - },\ - {\ - "name": "EXPORTS_EXCLUDER_DEFAULT",\ - "kind": "variable"\ - },\ - {\ - "name": "cook_gro_config",\ - "kind": "function"\ - },\ - {\ - "name": "Gro_Config_Module",\ - "kind": "type"\ - },\ - {\ - "name": "load_gro_config",\ - "kind": "function"\ - },\ - {\ - "name": "validate_gro_config_module",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro_helpers.js": {\ - "path": "gro_helpers.ts",\ - "declarations": [\ - {\ - "name": "resolve_gro_module_path",\ - "kind": "function"\ - },\ - {\ - "name": "spawn_with_loader",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro_plugin_gen.js": {\ - "path": "gro_plugin_gen.ts",\ - "declarations": [\ - {\ - "name": "Task_Args",\ - "kind": "type"\ - },\ - {\ - "name": "Gro_Plugin_Gen_Options",\ - "kind": "type"\ - },\ - {\ - "name": "gro_plugin_gen",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro_plugin_server.js": {\ - "path": "gro_plugin_server.ts",\ - "declarations": [\ - {\ - "name": "SERVER_SOURCE_ID",\ - "kind": "variable"\ - },\ - {\ - "name": "has_server",\ - "kind": "function"\ - },\ - {\ - "name": "Gro_Plugin_Server_Options",\ - "kind": "type"\ - },\ - {\ - "name": "Outpaths",\ - "kind": "type"\ - },\ - {\ - "name": "Create_Outpaths",\ - "kind": "type"\ - },\ - {\ - "name": "gro_plugin_server",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro_plugin_sveltekit_app.js": {\ - "path": "gro_plugin_sveltekit_app.ts",\ - "declarations": [\ - {\ - "name": "Gro_Plugin_Sveltekit_App_Options",\ - "kind": "type"\ - },\ - {\ - "name": "Host_Target",\ - "kind": "type"\ - },\ - {\ - "name": "Copy_File_Filter",\ - "kind": "type"\ - },\ - {\ - "name": "gro_plugin_sveltekit_app",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro_plugin_sveltekit_library.js": {\ - "path": "gro_plugin_sveltekit_library.ts",\ - "declarations": [\ - {\ - "name": "Gro_Plugin_Sveltekit_Library_Options",\ - "kind": "type"\ - },\ - {\ - "name": "gro_plugin_sveltekit_library",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro.config.default.js": {\ - "path": "gro.config.default.ts",\ - "declarations": [\ - {\ - "name": "default",\ - "kind": "function"\ - }\ - ]\ - },\ - "./gro.js": {\ - "path": "gro.ts"\ - },\ - "./hash.js": {\ - "path": "hash.ts",\ - "declarations": [\ - {\ - "name": "to_hash",\ - "kind": "function"\ - }\ - ]\ - },\ - "./index.js": {\ - "path": "index.ts",\ - "declarations": [\ - {\ - "name": "Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Create_Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Raw_Gro_Config",\ - "kind": "type"\ - },\ - {\ - "name": "Plugin",\ - "kind": "type"\ - },\ - {\ - "name": "replace_plugin",\ - "kind": "function"\ - },\ - {\ - "name": "Gen",\ - "kind": "type"\ - },\ - {\ - "name": "Gen_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Task",\ - "kind": "type"\ - },\ - {\ - "name": "Task_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Task_Error",\ - "kind": "class"\ - }\ - ]\ - },\ - "./input_path.js": {\ - "path": "input_path.ts",\ - "declarations": [\ - {\ - "name": "Input_Path",\ - "kind": "variable"\ - },\ - {\ - "name": "Raw_Input_Path",\ - "kind": "variable"\ - },\ - {\ - "name": "to_input_path",\ - "kind": "function"\ - },\ - {\ - "name": "to_input_paths",\ - "kind": "function"\ - },\ - {\ - "name": "Possible_Path",\ - "kind": "type"\ - },\ - {\ - "name": "get_possible_paths",\ - "kind": "function"\ - },\ - {\ - "name": "Resolved_Input_Path",\ - "kind": "type"\ - },\ - {\ - "name": "Resolved_Input_File",\ - "kind": "type"\ - },\ - {\ - "name": "Resolved_Input_Paths",\ - "kind": "type"\ - },\ - {\ - "name": "resolve_input_paths",\ - "kind": "function"\ - },\ - {\ - "name": "Resolved_Input_Files",\ - "kind": "type"\ - },\ - {\ - "name": "resolve_input_files",\ - "kind": "function"\ - }\ - ]\ - },\ - "./invoke_task.js": {\ - "path": "invoke_task.ts",\ - "declarations": [\ - {\ - "name": "invoke_task",\ - "kind": "function"\ - }\ - ]\ - },\ - "./invoke.js": {\ - "path": "invoke.ts"\ - },\ - "./lint.task.js": {\ - "path": "lint.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./loader.js": {\ - "path": "loader.ts",\ - "declarations": [\ - {\ - "name": "load",\ - "kind": "function"\ - },\ - {\ - "name": "resolve",\ - "kind": "function"\ - }\ - ]\ - },\ - "./module.js": {\ - "path": "module.ts",\ - "declarations": [\ - {\ - "name": "MODULE_PATH_SRC_PREFIX",\ - "kind": "variable"\ - },\ - {\ - "name": "MODULE_PATH_LIB_PREFIX",\ - "kind": "variable"\ - },\ - {\ - "name": "is_external_module",\ - "kind": "function"\ - }\ - ]\ - },\ - "./modules.js": {\ - "path": "modules.ts",\ - "declarations": [\ - {\ - "name": "Module_Meta",\ - "kind": "type"\ - },\ - {\ - "name": "Load_Module_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Load_Module_Failure",\ - "kind": "type"\ - },\ - {\ - "name": "load_module",\ - "kind": "function"\ - },\ - {\ - "name": "Load_Modules_Failure",\ - "kind": "type"\ - },\ - {\ - "name": "Load_Modules_Result",\ - "kind": "type"\ - },\ - {\ - "name": "load_modules",\ - "kind": "function"\ - }\ - ]\ - },\ - "./package_json.js": {\ - "path": "package_json.ts",\ - "declarations": [\ - {\ - "name": "Map_Package_Json",\ - "kind": "type"\ - },\ - {\ - "name": "EMPTY_PACKAGE_JSON",\ - "kind": "variable"\ - },\ - {\ - "name": "load_package_json",\ - "kind": "function"\ - },\ - {\ - "name": "sync_package_json",\ - "kind": "function"\ - },\ - {\ - "name": "load_gro_package_json",\ - "kind": "function"\ - },\ - {\ - "name": "write_package_json",\ - "kind": "function"\ - },\ - {\ - "name": "serialize_package_json",\ - "kind": "function"\ - },\ - {\ - "name": "update_package_json",\ - "kind": "function"\ - },\ - {\ - "name": "to_package_exports",\ - "kind": "function"\ - },\ - {\ - "name": "parse_repo_url",\ - "kind": "function"\ - },\ - {\ - "name": "has_dep",\ - "kind": "function"\ - },\ - {\ - "name": "Package_Json_Dep",\ - "kind": "type"\ - },\ - {\ - "name": "extract_deps",\ - "kind": "function"\ - }\ - ]\ - },\ - "./package.gen.js": {\ - "path": "package.gen.ts",\ - "declarations": [\ - {\ - "name": "gen",\ - "kind": "function"\ - }\ - ]\ - },\ - "./package.js": {\ - "path": "package.ts",\ - "declarations": [\ - {\ - "name": "package_json",\ - "kind": "variable"\ - },\ - {\ - "name": "src_json",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./parse_exports_context.js": {\ - "path": "parse_exports_context.ts",\ - "declarations": [\ - {\ - "name": "Parse_Exports_Context",\ - "kind": "class"\ - }\ - ]\ - },\ - "./parse_exports.js": {\ - "path": "parse_exports.ts",\ - "declarations": [\ - {\ - "name": "Declaration",\ - "kind": "type"\ - },\ - {\ - "name": "Export_Declaration",\ - "kind": "type"\ - },\ - {\ - "name": "parse_exports",\ - "kind": "function"\ - },\ - {\ - "name": "infer_declarations_from_file_type",\ - "kind": "function"\ - },\ - {\ - "name": "process_ts_exports",\ - "kind": "function"\ - }\ - ]\ - },\ - "./parse_imports.js": {\ - "path": "parse_imports.ts",\ - "declarations": [\ - {\ - "name": "Import_Specifier",\ - "kind": "type"\ - },\ - {\ - "name": "parse_imports",\ - "kind": "function"\ - }\ - ]\ - },\ - "./path.js": {\ - "path": "path.ts",\ - "declarations": [\ - {\ - "name": "Path_Id",\ - "kind": "type"\ - },\ - {\ - "name": "Path_Info",\ - "kind": "type"\ - },\ - {\ - "name": "Resolved_Path",\ - "kind": "type"\ - },\ - {\ - "name": "Path_Filter",\ - "kind": "type"\ - },\ - {\ - "name": "File_Filter",\ - "kind": "type"\ - },\ - {\ - "name": "to_file_path",\ - "kind": "function"\ - }\ - ]\ - },\ - "./paths.js": {\ - "path": "paths.ts",\ - "declarations": [\ - {\ - "name": "LIB_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "LIB_PATH",\ - "kind": "variable"\ - },\ - {\ - "name": "LIB_DIR",\ - "kind": "variable"\ - },\ - {\ - "name": "ROUTES_DIRNAME",\ - "kind": "variable"\ - },\ - {\ - "name": "Paths",\ - "kind": "type"\ - },\ - {\ - "name": "create_paths",\ - "kind": "function"\ - },\ - {\ - "name": "infer_paths",\ - "kind": "function"\ - },\ - {\ - "name": "is_gro_id",\ - "kind": "function"\ - },\ - {\ - "name": "to_root_path",\ - "kind": "function"\ - },\ - {\ - "name": "path_id_to_base_path",\ - "kind": "function"\ - },\ - {\ - "name": "base_path_to_path_id",\ - "kind": "function"\ - },\ - {\ - "name": "print_path",\ - "kind": "function"\ - },\ - {\ - "name": "replace_extension",\ - "kind": "function"\ - },\ - {\ - "name": "paths",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_PACKAGE_DIR",\ - "kind": "variable"\ - },\ - {\ - "name": "IS_THIS_GRO",\ - "kind": "variable"\ - },\ - {\ - "name": "gro_paths",\ - "kind": "variable"\ - },\ - {\ - "name": "GRO_DIST_DIR",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./plugin.js": {\ - "path": "plugin.ts",\ - "declarations": [\ - {\ - "name": "Plugin",\ - "kind": "type"\ - },\ - {\ - "name": "Create_Config_Plugins",\ - "kind": "type"\ - },\ - {\ - "name": "Plugin_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Plugins",\ - "kind": "class"\ - },\ - {\ - "name": "replace_plugin",\ - "kind": "function"\ - }\ - ]\ - },\ - "./publish.task.js": {\ - "path": "publish.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./register.js": {\ - "path": "register.ts"\ - },\ - "./reinstall.task.js": {\ - "path": "reinstall.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./release.task.js": {\ - "path": "release.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./resolve_specifier.js": {\ - "path": "resolve_specifier.ts",\ - "declarations": [\ - {\ - "name": "Resolved_Specifier",\ - "kind": "type"\ - },\ - {\ - "name": "resolve_specifier",\ - "kind": "function"\ - }\ - ]\ - },\ - "./resolve.task.js": {\ - "path": "resolve.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./run_gen.js": {\ - "path": "run_gen.ts",\ - "declarations": [\ - {\ - "name": "GEN_NO_PROD_MESSAGE",\ - "kind": "variable"\ - },\ - {\ - "name": "run_gen",\ - "kind": "function"\ - }\ - ]\ - },\ - "./run_task.js": {\ - "path": "run_task.ts",\ - "declarations": [\ - {\ - "name": "Run_Task_Result",\ - "kind": "type"\ - },\ - {\ - "name": "run_task",\ - "kind": "function"\ - }\ - ]\ - },\ - "./run.task.js": {\ - "path": "run.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./search_fs.js": {\ - "path": "search_fs.ts",\ - "declarations": [\ - {\ - "name": "Search_Fs_Options",\ - "kind": "type"\ - },\ - {\ - "name": "search_fs",\ - "kind": "function"\ - },\ - {\ - "name": "find_first_existing_file",\ - "kind": "function"\ - }\ - ]\ - },\ - "./src_json.js": {\ - "path": "src_json.ts",\ - "declarations": [\ - {\ - "name": "Map_Src_Json",\ - "kind": "type"\ - },\ - {\ - "name": "create_src_json",\ - "kind": "function"\ - },\ - {\ - "name": "serialize_src_json",\ - "kind": "function"\ - },\ - {\ - "name": "to_src_modules",\ - "kind": "function"\ - }\ - ]\ - },\ - "./svelte_config.js": {\ - "path": "svelte_config.ts",\ - "declarations": [\ - {\ - "name": "load_svelte_config",\ - "kind": "function"\ - },\ - {\ - "name": "Parsed_Svelte_Config",\ - "kind": "type"\ - },\ - {\ - "name": "parse_svelte_config",\ - "kind": "function"\ - },\ - {\ - "name": "to_default_compile_module_options",\ - "kind": "function"\ - },\ - {\ - "name": "default_svelte_config",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./sveltekit_helpers.js": {\ - "path": "sveltekit_helpers.ts",\ - "declarations": [\ - {\ - "name": "has_sveltekit_app",\ - "kind": "function"\ - },\ - {\ - "name": "has_sveltekit_library",\ - "kind": "function"\ - },\ - {\ - "name": "sveltekit_sync",\ - "kind": "function"\ - },\ - {\ - "name": "sveltekit_sync_if_available",\ - "kind": "function"\ - },\ - {\ - "name": "sveltekit_sync_if_obviously_needed",\ - "kind": "function"\ - },\ - {\ - "name": "Svelte_Package_Options",\ - "kind": "type"\ - },\ - {\ - "name": "run_svelte_package",\ - "kind": "function"\ - },\ - {\ - "name": "map_sveltekit_aliases",\ - "kind": "function"\ - }\ - ]\ - },\ - "./sveltekit_shim_app_environment.js": {\ - "path": "sveltekit_shim_app_environment.ts",\ - "declarations": [\ - {\ - "name": "browser",\ - "kind": "variable"\ - },\ - {\ - "name": "building",\ - "kind": "variable"\ - },\ - {\ - "name": "dev",\ - "kind": "variable"\ - },\ - {\ - "name": "version",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./sveltekit_shim_app_forms.js": {\ - "path": "sveltekit_shim_app_forms.ts",\ - "declarations": [\ - {\ - "name": "applyAction",\ - "kind": "function"\ - },\ - {\ - "name": "deserialize",\ - "kind": "function"\ - },\ - {\ - "name": "enhance",\ - "kind": "function"\ - }\ - ]\ - },\ - "./sveltekit_shim_app_navigation.js": {\ - "path": "sveltekit_shim_app_navigation.ts",\ - "declarations": [\ - {\ - "name": "afterNavigate",\ - "kind": "function"\ - },\ - {\ - "name": "beforeNavigate",\ - "kind": "function"\ - },\ - {\ - "name": "disableScrollHandling",\ - "kind": "function"\ - },\ - {\ - "name": "goto",\ - "kind": "function"\ - },\ - {\ - "name": "invalidate",\ - "kind": "function"\ - },\ - {\ - "name": "invalidateAll",\ - "kind": "function"\ - },\ - {\ - "name": "preloadCode",\ - "kind": "function"\ - },\ - {\ - "name": "preloadData",\ - "kind": "function"\ - }\ - ]\ - },\ - "./sveltekit_shim_app_paths.js": {\ - "path": "sveltekit_shim_app_paths.ts",\ - "declarations": [\ - {\ - "name": "assets",\ - "kind": "variable"\ - },\ - {\ - "name": "base",\ - "kind": "variable"\ - },\ - {\ - "name": "resolve",\ - "kind": "function"\ - },\ - {\ - "name": "resolveRoute",\ - "kind": "function"\ - },\ - {\ - "name": "asset",\ - "kind": "function"\ - }\ - ]\ - },\ - "./sveltekit_shim_app_state.js": {\ - "path": "sveltekit_shim_app_state.ts",\ - "declarations": [\ - {\ - "name": "navigating",\ - "kind": "variable"\ - },\ - {\ - "name": "page",\ - "kind": "variable"\ - },\ - {\ - "name": "updated",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./sveltekit_shim_app.js": {\ - "path": "sveltekit_shim_app.ts",\ - "declarations": [\ - {\ - "name": "SVELTEKIT_SHIM_APP_PATHS_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "SVELTEKIT_SHIM_APP_ENVIRONMENT_MATCHER",\ - "kind": "variable"\ - },\ - {\ - "name": "sveltekit_shim_app_specifiers",\ - "kind": "variable"\ - },\ - {\ - "name": "render_sveltekit_shim_app_paths",\ - "kind": "function"\ - },\ - {\ - "name": "render_sveltekit_shim_app_environment",\ - "kind": "function"\ - }\ - ]\ - },\ - "./sveltekit_shim_env.js": {\ - "path": "sveltekit_shim_env.ts",\ - "declarations": [\ - {\ - "name": "render_env_shim_module",\ - "kind": "function"\ - }\ - ]\ - },\ - "./sync.task.js": {\ - "path": "sync.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./task_logging.js": {\ - "path": "task_logging.ts",\ - "declarations": [\ - {\ - "name": "log_tasks",\ - "kind": "function"\ - },\ - {\ - "name": "log_error_reasons",\ - "kind": "function"\ - },\ - {\ - "name": "log_task_help",\ - "kind": "function"\ - }\ - ]\ - },\ - "./task.js": {\ - "path": "task.ts",\ - "declarations": [\ - {\ - "name": "Task",\ - "kind": "type"\ - },\ - {\ - "name": "Task_Context",\ - "kind": "type"\ - },\ - {\ - "name": "Invoke_Task",\ - "kind": "type"\ - },\ - {\ - "name": "TASK_FILE_SUFFIX_TS",\ - "kind": "variable"\ - },\ - {\ - "name": "TASK_FILE_SUFFIX_JS",\ - "kind": "variable"\ - },\ - {\ - "name": "TASK_FILE_SUFFIXES",\ - "kind": "variable"\ - },\ - {\ - "name": "is_task_path",\ - "kind": "function"\ - },\ - {\ - "name": "to_task_name",\ - "kind": "function"\ - },\ - {\ - "name": "Task_Error",\ - "kind": "class"\ - },\ - {\ - "name": "Silent_Error",\ - "kind": "class"\ - },\ - {\ - "name": "Found_Task",\ - "kind": "type"\ - },\ - {\ - "name": "Found_Tasks",\ - "kind": "type"\ - },\ - {\ - "name": "Find_Tasks_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Find_Modules_Failure",\ - "kind": "type"\ - },\ - {\ - "name": "find_tasks",\ - "kind": "function"\ - },\ - {\ - "name": "Loaded_Tasks",\ - "kind": "type"\ - },\ - {\ - "name": "Task_Module",\ - "kind": "type"\ - },\ - {\ - "name": "Task_Module_Meta",\ - "kind": "type"\ - },\ - {\ - "name": "Load_Tasks_Result",\ - "kind": "type"\ - },\ - {\ - "name": "Load_Tasks_Failure",\ - "kind": "type"\ - },\ - {\ - "name": "load_tasks",\ - "kind": "function"\ - },\ - {\ - "name": "validate_task_module",\ - "kind": "function"\ - }\ - ]\ - },\ - "./test_helpers.ts": {\ - "path": "test_helpers.ts",\ - "declarations": [\ - {\ - "name": "TEST_TIMEOUT_MD",\ - "kind": "variable"\ - },\ - {\ - "name": "SOME_PUBLIC_ENV_VAR_NAME",\ - "kind": "variable"\ - },\ - {\ - "name": "SOME_PUBLIC_ENV_VAR_VALUE",\ - "kind": "variable"\ - },\ - {\ - "name": "init_test_env",\ - "kind": "function"\ - },\ - {\ - "name": "create_ts_test_env",\ - "kind": "function"\ - }\ - ]\ - },\ - "./test.task.js": {\ - "path": "test.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./typecheck.task.js": {\ - "path": "typecheck.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ - },\ - "./upgrade.task.js": {\ - "path": "upgrade.task.ts",\ - "declarations": [\ - {\ - "name": "Args",\ - "kind": "variable"\ - },\ - {\ - "name": "task",\ - "kind": "variable"\ - }\ - ]\ + "name": "@ryanatkn/fuz_gitops",\ + "version": "0.52.0",\ + "modules": []\ + },\ + "check_runs": {\ + "status": "completed",\ + "conclusion": "failure"\ + },\ + "pull_requests": [\ + {\ + "number": 37,\ + "title": "upgrade deps",\ + "user": {\ + "login": "ryanatkn"\ },\ - "./watch_dir.js": {\ - "path": "watch_dir.ts",\ - "declarations": [\ - {\ - "name": "Watch_Node_Fs",\ - "kind": "type"\ - },\ - {\ - "name": "Watcher_Change",\ - "kind": "type"\ - },\ - {\ - "name": "Watcher_Change_Type",\ - "kind": "type"\ - },\ - {\ - "name": "Watcher_Change_Callback",\ - "kind": "type"\ - },\ - {\ - "name": "Watch_Dir_Options",\ - "kind": "type"\ - },\ - {\ - "name": "watch_dir",\ - "kind": "function"\ - }\ - ]\ - }\ + "draft": false\ }\ + ]\ + },\ + {\ + "package_json": {\ + "name": "webdevladder.net",\ + "version": "0.0.1",\ + "description": "a YouTube channel and blog for realworld webdev with TypeScript and Svelte",\ + "motto": "up ↗",\ + "glyph": "🪜",\ + "logo": "logo.svg",\ + "logo_alt": "a spider web between two rungs of a ladder",\ + "license": "MIT",\ + "public": true,\ + "homepage": "https://www.webdevladder.net/",\ + "repository": "https://github.com/ryanatkn/webdevladder.net",\ + "author": {\ + "name": "Ryan Atkinson",\ + "email": "mail@ryanatkn.com",\ + "url": "https://www.ryanatkn.com/"\ + },\ + "bugs": "https://github.com/ryanatkn/webdevladder.net/issues",\ + "funding": "https://www.ryanatkn.com/funding",\ + "scripts": {\ + "start": "gro dev",\ + "dev": "gro dev",\ + "build": "gro build",\ + "check": "gro check",\ + "test": "gro test",\ + "preview": "vite preview",\ + "deploy": "gro deploy"\ + },\ + "type": "module",\ + "engines": {\ + "node": ">=22.15"\ + },\ + "devDependencies": {\ + "@ryanatkn/belt": "^0.38.0",\ + "@ryanatkn/eslint-config": "^0.9.0",\ + "@ryanatkn/fuz": "^0.159.0",\ + "@ryanatkn/fuz_blog": "^0.16.0",\ + "@ryanatkn/fuz_code": "^0.34.0",\ + "@ryanatkn/fuz_mastodon": "^0.33.0",\ + "@ryanatkn/gro": "^0.174.2",\ + "@ryanatkn/moss": "^0.38.0",\ + "@sveltejs/adapter-static": "^3.0.10",\ + "@sveltejs/kit": "^2.49.0",\ + "@sveltejs/vite-plugin-svelte": "^6.2.1",\ + "eslint": "^9.39.1",\ + "eslint-plugin-svelte": "^3.13.0",\ + "prettier": "^3.6.2",\ + "prettier-plugin-svelte": "^3.4.0",\ + "svelte": "^5.43.14",\ + "svelte-check": "^4.3.4",\ + "tslib": "^2.8.1",\ + "typescript": "^5.9.3",\ + "typescript-eslint": "^8.47.0",\ + "vitest": "^4.0.13"\ + },\ + "prettier": {\ + "plugins": [\ + "prettier-plugin-svelte"\ + ],\ + "useTabs": true,\ + "printWidth": 100,\ + "singleQuote": true,\ + "bracketSpacing": false,\ + "overrides": [\ + {\ + "files": "package.json",\ + "options": {\ + "useTabs": false\ + }\ + }\ + ]\ + },\ + "sideEffects": [\ + "**/*.css"\ + ],\ + "files": [\ + "dist"\ + ]\ + },\ + "src_json": {\ + "name": "webdevladder.net",\ + "version": "0.0.1",\ + "modules": []\ },\ - "name": "@ryanatkn/gro",\ - "repo_name": "gro",\ - "repo_url": "https://github.com/ryanatkn/gro",\ - "owner_name": "ryanatkn",\ - "homepage_url": "https://gro.ryanatkn.com/",\ - "logo_url": "https://gro.ryanatkn.com/logo.svg",\ - "logo_alt": "a pixelated green oak acorn with a glint of sun",\ - "npm_url": "https://www.npmjs.com/package/@ryanatkn/gro",\ - "changelog_url": "https://github.com/ryanatkn/gro/blob/main/CHANGELOG.md",\ - "published": true,\ "check_runs": {\ "status": "completed",\ "conclusion": "success"\ From 97220042eb8ea0dffe93d3ed8236a5236f393d60 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:15:58 -0500 Subject: [PATCH 35/41] wip --- src/lib/gitops_sync.task.ts | 2 +- src/routes/repos.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/gitops_sync.task.ts b/src/lib/gitops_sync.task.ts index dfb0b480..86c8cb57 100644 --- a/src/lib/gitops_sync.task.ts +++ b/src/lib/gitops_sync.task.ts @@ -70,7 +70,7 @@ export const task: Task = { const package_json = load_package_json(); const repo_specifier = package_json.name === '@ryanatkn/fuz_gitops' - ? './repo.svelte.js' + ? '$lib/repo.svelte.js' : '@ryanatkn/fuz_gitops/repo.svelte.js'; log.info('generating ' + outfile); diff --git a/src/routes/repos.ts b/src/routes/repos.ts index 769174ff..2100ffe7 100644 --- a/src/routes/repos.ts +++ b/src/routes/repos.ts @@ -1,5 +1,5 @@ // generated by gitops_sync.task.ts -import type {Repo_Json} from './repo.svelte.js'; +import type {Repo_Json} from '$lib/repo.svelte.js'; export const repos_json: Array = JSON.parse( '[\ From d50e1bbd945dbcab4567c6e54e36fde6b5cb939b Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:28:16 -0500 Subject: [PATCH 36/41] wip --- src/lib/gitops_analyze.task.ts | 3 ++- src/lib/gitops_plan.task.ts | 4 +++- src/lib/gitops_publish.task.ts | 2 ++ src/lib/gitops_sync.task.ts | 3 +++ src/lib/gitops_validate.task.ts | 3 ++- src/routes/+layout.svelte | 5 +++-- src/routes/+page.svelte | 10 +++++----- src/routes/about/+page.svelte | 10 +++++----- src/routes/package.gen.ts | 3 +++ 9 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 src/routes/package.gen.ts diff --git a/src/lib/gitops_analyze.task.ts b/src/lib/gitops_analyze.task.ts index b29f4c7a..60f05d68 100644 --- a/src/lib/gitops_analyze.task.ts +++ b/src/lib/gitops_analyze.task.ts @@ -14,6 +14,7 @@ import { } from './log_helpers.js'; import {format_and_output, type Output_Formatters} from './output_helpers.js'; +/** @nodocs */ export const Args = z.strictObject({ path: z .string() @@ -29,9 +30,9 @@ export const Args = z.strictObject({ .default('stdout'), outfile: z.string().meta({description: 'write output to file instead of logging'}).optional(), }); - export type Args = z.infer; +/** @nodocs */ export const task: Task = { Args, summary: 'analyze dependency structure and relationships across repos', diff --git a/src/lib/gitops_plan.task.ts b/src/lib/gitops_plan.task.ts index 590adc20..1c9522e7 100644 --- a/src/lib/gitops_plan.task.ts +++ b/src/lib/gitops_plan.task.ts @@ -10,6 +10,7 @@ import { } from './publishing_plan.js'; import {format_and_output, type Output_Formatters} from './output_helpers.js'; +/** @nodocs */ export const Args = z.strictObject({ path: z .string() @@ -25,7 +26,6 @@ export const Args = z.strictObject({ .default('stdout'), outfile: z.string().meta({description: 'write output to file instead of logging'}).optional(), }); - export type Args = z.infer; /** @@ -36,6 +36,8 @@ export type Args = z.infer; * gro gitops_plan * gro gitops_plan --dir ../repos * gro gitops_plan --path ./custom.config.ts + * + * @nodocs */ export const task: Task = { summary: 'generate a publishing plan based on changesets', diff --git a/src/lib/gitops_publish.task.ts b/src/lib/gitops_publish.task.ts index 5083c565..eb38b175 100644 --- a/src/lib/gitops_publish.task.ts +++ b/src/lib/gitops_publish.task.ts @@ -12,6 +12,7 @@ import { import {generate_publishing_plan, log_publishing_plan} from './publishing_plan.js'; import {format_and_output, type Output_Formatters} from './output_helpers.js'; +/** @nodocs */ export const Args = z.strictObject({ path: z .string() @@ -51,6 +52,7 @@ export const Args = z.strictObject({ }); export type Args = z.infer; +/** @nodocs */ export const task: Task = { summary: 'publish all repos in dependency order', Args, diff --git a/src/lib/gitops_sync.task.ts b/src/lib/gitops_sync.task.ts index 86c8cb57..d1b6d52b 100644 --- a/src/lib/gitops_sync.task.ts +++ b/src/lib/gitops_sync.task.ts @@ -15,6 +15,7 @@ import {get_gitops_ready} from './gitops_task_helpers.js'; // TODO add flag to ignore or invalidate cache -- no-cache? clean? +/** @nodocs */ export const Args = z.strictObject({ path: z .string() @@ -38,6 +39,8 @@ export type Args = z.infer; /** * This is a task not a `.gen.` file because it makes network calls. + * + * @nodocs */ export const task: Task = { Args, diff --git a/src/lib/gitops_validate.task.ts b/src/lib/gitops_validate.task.ts index 0324241f..bde6b863 100644 --- a/src/lib/gitops_validate.task.ts +++ b/src/lib/gitops_validate.task.ts @@ -9,6 +9,7 @@ import {generate_publishing_plan} from './publishing_plan.js'; import {publish_repos, type Publishing_Options} from './multi_repo_publisher.js'; import {log_dependency_analysis} from './log_helpers.js'; +/** @nodocs */ export const Args = z.strictObject({ path: z .string() @@ -19,9 +20,9 @@ export const Args = z.strictObject({ .meta({description: 'path containing the repos, defaults to the parent of the `path` dir'}) .optional(), }); - export type Args = z.infer; +/** @nodocs */ export const task: Task = { Args, summary: diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index b347ae4d..281f4a1d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -11,12 +11,13 @@ Contextmenu_State, contextmenu_attachment, } from '@ryanatkn/fuz/contextmenu_state.svelte.js'; - import {pkg_context} from '@ryanatkn/fuz/pkg.svelte.js'; + import {Pkg, pkg_context} from '@ryanatkn/fuz/pkg.svelte.js'; import type {Snippet} from 'svelte'; import Settings from '$routes/Settings.svelte'; import {repos_json} from '$routes/repos.js'; import {Repo, type Repo_Json, repos_parse, repos_context} from '$lib/repo.svelte.js'; + import {package_json, src_json} from '$routes/package.js'; interface Props { children: Snippet; @@ -31,7 +32,7 @@ 'https://gitops.fuz.dev/', ); repos_context.set(repos); - pkg_context.set(repos.repo.pkg); + pkg_context.set(new Pkg(package_json, src_json)); let show_settings = $state(false); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index cf1ff797..0d458b55 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,15 +2,15 @@ import Docs_Footer from '@ryanatkn/fuz/Docs_Footer.svelte'; import Card from '@ryanatkn/fuz/Card.svelte'; import {resolve} from '$app/paths'; + import {pkg_context} from '@ryanatkn/fuz/pkg.svelte.js'; import Main_Header from '$routes/Main_Header.svelte'; - import {repos_context} from '$lib/repo.svelte.js'; - const {repo} = repos_context.get(); + const pkg = pkg_context.get(); - {repo.pkg.package_json.name} + {pkg.package_json.name}
    @@ -21,7 +21,7 @@
  • docs{#snippet icon()}{repo.pkg.package_json.glyph}{/snippet}docs{#snippet icon()}{pkg.package_json.glyph}{/snippet}
  • @@ -39,7 +39,7 @@
  • - + {#snippet logo_header()}about{/snippet} {#snippet logo_footer()}fuz.dev{/snippet} diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte index aaab6eda..5fea8e96 100644 --- a/src/routes/about/+page.svelte +++ b/src/routes/about/+page.svelte @@ -1,26 +1,26 @@ - about {repo.pkg.package_json.glyph} {repo.pkg.package_json.name} + about {pkg.package_json.glyph} {pkg.package_json.name}
    - +
    - +
    diff --git a/src/routes/package.gen.ts b/src/routes/package.gen.ts new file mode 100644 index 00000000..a54e27bd --- /dev/null +++ b/src/routes/package.gen.ts @@ -0,0 +1,3 @@ +// this is an optional pattern that makes your `package.json` +// available as `$routes/package.ts` with automatic `const` types +export * from '@ryanatkn/fuz/package.gen.js'; From b95d1dfc13dc562729c1913c86a30b96088d3da7 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:42:15 -0500 Subject: [PATCH 37/41] wip --- package-lock.json | 8 +- package.json | 4 +- src/lib/changeset_generator.ts | 12 +- src/lib/operations.ts | 11 +- src/routes/package.ts | 4389 ++++++++++++++++++++++++++ src/routes/repos.ts | 4 +- src/test/changeset_generator.test.ts | 12 +- 7 files changed, 4410 insertions(+), 30 deletions(-) create mode 100644 src/routes/package.ts diff --git a/package-lock.json b/package-lock.json index d9504254..1c2d686e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@changesets/changelog-git": "^0.2.1", "@ryanatkn/belt": "^0.38.2", "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/fuz": "^0.161.1", + "@ryanatkn/fuz": "^0.161.2", "@ryanatkn/fuz_code": "^0.35.0", "@ryanatkn/gro": "^0.175.0", "@ryanatkn/moss": "^0.38.0", @@ -1470,9 +1470,9 @@ } }, "node_modules/@ryanatkn/fuz": { - "version": "0.161.1", - "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.161.1.tgz", - "integrity": "sha512-1D+BKjJT/JCl59GpD/PTcYWMSOuwbBK7c30nyvosuz174gLJgTaS0WaO0Obe7IFero6cXhxuLKqxPf9rtwoWqA==", + "version": "0.161.2", + "resolved": "https://registry.npmjs.org/@ryanatkn/fuz/-/fuz-0.161.2.tgz", + "integrity": "sha512-tLZ/aBy9rKl2ZbD7hptfRKESJ+EoDqmgB6nw0LULQwJ2tVquTFqkzUckNO6X+Z1pQuix44JasBvT9pKlsRYywQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 8efc4fed..3d0f85f8 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ }, "peerDependencies": { "@ryanatkn/belt": ">=0.38.2", - "@ryanatkn/fuz": ">=0.161.1", + "@ryanatkn/fuz": ">=0.161.2", "@ryanatkn/gro": ">=0.175.0", "@ryanatkn/moss": ">=0.38.0", "@sveltejs/kit": "^2", @@ -42,7 +42,7 @@ "@changesets/changelog-git": "^0.2.1", "@ryanatkn/belt": "^0.38.2", "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/fuz": "^0.161.1", + "@ryanatkn/fuz": "^0.161.2", "@ryanatkn/fuz_code": "^0.35.0", "@ryanatkn/gro": "^0.175.0", "@ryanatkn/moss": "^0.38.0", diff --git a/src/lib/changeset_generator.ts b/src/lib/changeset_generator.ts index 5d82ac29..2160a2a7 100644 --- a/src/lib/changeset_generator.ts +++ b/src/lib/changeset_generator.ts @@ -13,7 +13,7 @@ import type {Local_Repo} from './local_repo.js'; import type {Published_Version} from './multi_repo_publisher.js'; import {strip_version_prefix} from './version_utils.js'; -export interface Dependency_Update { +export interface Dependency_Version_Change { package_name: string; from_version: string; to_version: string; @@ -27,7 +27,7 @@ export interface Dependency_Update { */ export const create_changeset_for_dependency_updates = async ( repo: Local_Repo, - updates: Array, + updates: Array, log?: Logger, ): Promise => { const changesets_dir = join(repo.repo_dir, '.changeset'); @@ -59,7 +59,7 @@ export const create_changeset_for_dependency_updates = async ( const calculate_required_bump = ( repo: Local_Repo, - updates: Array, + updates: Array, ): 'major' | 'minor' | 'patch' => { const current_version = repo.pkg.package_json.version || '0.0.0'; const [major] = current_version.split('.').map(Number); @@ -93,7 +93,7 @@ const calculate_required_bump = ( */ export const generate_changeset_content = ( package_name: string, - updates: Array, + updates: Array, bump_type: 'major' | 'minor' | 'patch', ): string => { // Group updates by type @@ -138,8 +138,8 @@ export const generate_changeset_content = ( export const create_dependency_updates = ( dependencies: Map, published_versions: Map, -): Array => { - const updates: Array = []; +): Array => { + const updates: Array = []; for (const [dep_name, current_version] of dependencies) { const published = published_versions.get(dep_name); diff --git a/src/lib/operations.ts b/src/lib/operations.ts index 89033952..a7d098b0 100644 --- a/src/lib/operations.ts +++ b/src/lib/operations.ts @@ -39,6 +39,7 @@ import type {Local_Repo} from './local_repo.js'; import type {Changeset_Info} from './changeset_reader.js'; import type {Bump_Type} from './semver.js'; import type {Preflight_Options, Preflight_Result} from './preflight_checks.js'; +import type {Wait_Options} from './npm_registry.js'; /** * Changeset operations for reading and predicting versions from `.changeset/*.md` files. @@ -230,16 +231,6 @@ export interface Build_Operations { }) => Promise>; } -/** - * Configuration for exponential backoff when waiting for NPM package availability. - */ -export interface Wait_Options { - max_attempts?: number; - initial_delay?: number; - max_delay?: number; - timeout?: number; -} - /** * NPM registry operations for package availability checks and authentication. * Includes exponential backoff for waiting on package propagation. diff --git a/src/routes/package.ts b/src/routes/package.ts new file mode 100644 index 00000000..f98e54cb --- /dev/null +++ b/src/routes/package.ts @@ -0,0 +1,4389 @@ +// Generated by package.gen.ts +// Do not edit directly - regenerated on build + +import type {Package_Json} from '@ryanatkn/belt/package_json.js'; +import type {Src_Json} from '@ryanatkn/belt/src_json.js'; + +export const package_json: Package_Json = { + name: '@ryanatkn/fuz_gitops', + version: '0.52.0', + description: 'a tool for managing many repos', + glyph: '🪄', + logo: 'logo.svg', + logo_alt: 'a friendly blue spider facing you', + public: true, + license: 'MIT', + homepage: 'https://gitops.fuz.dev/', + repository: 'https://github.com/ryanatkn/fuz_gitops', + author: { + name: 'Ryan Atkinson', + email: 'mail@ryanatkn.com', + url: 'https://www.ryanatkn.com/', + }, + bugs: 'https://github.com/ryanatkn/fuz_gitops/issues', + funding: 'https://www.ryanatkn.com/funding', + scripts: { + start: 'gro dev', + dev: 'gro dev', + build: 'gro build', + check: 'gro check', + test: 'gro test', + preview: 'vite preview', + deploy: 'gro deploy', + }, + type: 'module', + engines: { + node: '>=22.15', + }, + peerDependencies: { + '@ryanatkn/belt': '>=0.38.2', + '@ryanatkn/fuz': '>=0.161.2', + '@ryanatkn/gro': '>=0.175.0', + '@ryanatkn/moss': '>=0.38.0', + '@sveltejs/kit': '^2', + svelte: '^5', + zod: '^4.1.13', + }, + devDependencies: { + '@changesets/changelog-git': '^0.2.1', + '@ryanatkn/belt': '^0.38.2', + '@ryanatkn/eslint-config': '^0.9.0', + '@ryanatkn/fuz': '^0.161.2', + '@ryanatkn/fuz_code': '^0.35.0', + '@ryanatkn/gro': '^0.175.0', + '@ryanatkn/moss': '^0.38.0', + '@sveltejs/adapter-static': '^3.0.10', + '@sveltejs/kit': '^2.49.0', + '@sveltejs/package': '^2.5.6', + '@sveltejs/vite-plugin-svelte': '^6.2.1', + '@types/node': '^24.10.1', + eslint: '^9.39.1', + 'eslint-plugin-svelte': '^3.13.0', + prettier: '^3.6.2', + 'prettier-plugin-svelte': '^3.4.0', + svelte: '^5.43.15', + 'svelte-check': '^4.3.4', + tslib: '^2.8.1', + typescript: '^5.9.3', + 'typescript-eslint': '^8.48.0', + vitest: '^4.0.13', + }, + prettier: { + plugins: ['prettier-plugin-svelte'], + useTabs: true, + printWidth: 100, + singleQuote: true, + bracketSpacing: false, + overrides: [ + { + files: 'package.json', + options: { + useTabs: false, + }, + }, + ], + }, + sideEffects: ['**/*.css'], + files: ['dist', 'src/lib/**/*.ts', '!src/lib/**/*.test.*', '!dist/**/*.test.*'], + exports: { + './package.json': './package.json', + './*.js': { + types: './dist/*.d.ts', + default: './dist/*.js', + }, + './*.ts': { + types: './dist/*.d.ts', + default: './dist/*.js', + }, + './*.svelte': { + types: './dist/*.svelte.d.ts', + svelte: './dist/*.svelte', + default: './dist/*.svelte', + }, + }, +}; + +export const src_json: Src_Json = { + name: '@ryanatkn/fuz_gitops', + version: '0.52.0', + modules: [ + { + path: 'changeset_generator.ts', + identifiers: [ + { + name: 'Dependency_Version_Change', + kind: 'type', + source_line: 16, + type_signature: 'Dependency_Version_Change', + properties: [ + { + name: 'package_name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'from_version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'to_version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'bump_type', + kind: 'variable', + type_signature: "'major' | 'minor' | 'patch'", + }, + { + name: 'breaking', + kind: 'variable', + type_signature: 'boolean', + }, + ], + }, + { + name: 'create_changeset_for_dependency_updates', + kind: 'function', + doc_comment: + 'Creates a changeset file for dependency updates.\nReturns the path to the created changeset file.', + source_line: 28, + type_signature: + '(repo: Local_Repo, updates: Dependency_Version_Change[], log?: Logger | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'repo', + type: 'Local_Repo', + optional: false, + }, + { + name: 'updates', + type: 'Dependency_Version_Change[]', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + { + name: 'generate_changeset_content', + kind: 'function', + doc_comment: + 'Generates markdown changeset content for dependency updates.\n\nCreates properly formatted changeset with YAML frontmatter, summary,\nand categorized list of breaking vs regular updates. Output format\nmatches changesets CLI for consistency.', + source_line: 94, + type_signature: + '(package_name: string, updates: Dependency_Version_Change[], bump_type: "major" | "minor" | "patch"): string', + return_type: 'string', + return_description: 'markdown content ready to write to .changeset/*.md file', + parameters: [ + { + name: 'package_name', + type: 'string', + optional: false, + description: 'package receiving the dependency updates', + }, + { + name: 'updates', + type: 'Dependency_Version_Change[]', + optional: false, + description: 'list of dependency changes with version info', + }, + { + name: 'bump_type', + type: '"major" | "minor" | "patch"', + optional: false, + description: 'required bump type (calculated from breaking changes)', + }, + ], + }, + { + name: 'create_dependency_updates', + kind: 'function', + source_line: 138, + type_signature: + '(dependencies: Map, published_versions: Map): Dependency_Version_Change[]', + return_type: 'Dependency_Version_Change[]', + parameters: [ + { + name: 'dependencies', + type: 'Map', + optional: false, + }, + { + name: 'published_versions', + type: 'Map', + optional: false, + }, + ], + }, + ], + module_comment: + 'Auto-generation of changesets for dependency updates during publishing.\n\nCreates changesets when packages need to republish due to updated dependencies.\nFor parsing existing changesets, see `changeset_reader.ts`.', + dependencies: ['version_utils.ts'], + dependents: ['dependency_updater.ts'], + }, + { + path: 'changeset_reader.ts', + identifiers: [ + { + name: 'Changeset_Info', + kind: 'type', + source_line: 17, + type_signature: 'Changeset_Info', + properties: [ + { + name: 'filename', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'packages', + kind: 'variable', + type_signature: 'Array<{name: string; bump_type: Bump_Type}>', + }, + { + name: 'summary', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'parse_changeset_content', + kind: 'function', + doc_comment: + 'Parses changeset content string from markdown format.\n\nPure function for testability - no file I/O, just string parsing.\nExtracts package names, bump types, and summary from YAML frontmatter format.\nReturns null if format is invalid or no packages found.\n\nExpected format:\n---\n"package-name": patch\n"@scope/package": minor\n---\n\nSummary of changes', + source_line: 42, + type_signature: '(content: string, filename?: string): Changeset_Info | null', + return_type: 'Changeset_Info | null', + return_description: 'parsed changeset info or null if invalid format', + parameters: [ + { + name: 'content', + type: 'string', + optional: false, + description: 'changeset markdown with YAML frontmatter', + }, + { + name: 'filename', + type: 'string', + optional: false, + description: 'optional filename for error reporting context', + default_value: "'changeset.md'", + }, + ], + }, + { + name: 'parse_changeset_file', + kind: 'function', + source_line: 82, + type_signature: + '(filepath: string, log?: Logger | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'filepath', + type: 'string', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + { + name: 'read_changesets', + kind: 'function', + source_line: 103, + type_signature: '(repo: Local_Repo, log?: Logger | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'repo', + type: 'Local_Repo', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + { + name: 'determine_bump_from_changesets', + kind: 'function', + doc_comment: + 'Determines the bump type for a package from its changesets.\n\nWhen multiple changesets exist for the same package, returns the highest\nbump type (major > minor > patch) to ensure the most significant change\nis reflected in the version bump.', + source_line: 139, + type_signature: '(changesets: Changeset_Info[], package_name: string): Bump_Type | null', + return_type: 'Bump_Type | null', + return_description: 'the highest bump type, or null if package has no changesets', + parameters: [ + { + name: 'changesets', + type: 'Changeset_Info[]', + optional: false, + }, + { + name: 'package_name', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'has_changesets', + kind: 'function', + doc_comment: + "Checks if a repo has any changeset files (excluding README.md).\n\nUsed by preflight checks and publishing workflow to determine which packages\nneed to be published. Returns false if .changeset directory doesn't exist\nor contains only README.md.", + source_line: 167, + type_signature: '(repo: Local_Repo): Promise', + return_type: 'Promise', + return_description: 'true if repo has unpublished changesets', + parameters: [ + { + name: 'repo', + type: 'Local_Repo', + optional: false, + }, + ], + }, + { + name: 'predict_next_version', + kind: 'function', + doc_comment: + 'Predicts the next version by analyzing all changesets in a repo.\n\nReads all changesets, determines the highest bump type for the package,\nand calculates the next version. Returns null if no changesets found.\n\nCritical for dry-run mode accuracy - allows simulating publishes without\nactually running `gro publish` which consumes changesets.', + source_line: 193, + type_signature: + '(repo: Local_Repo, log?: Logger | undefined): Promise<{ version: string; bump_type: Bump_Type; } | null>', + return_type: 'Promise<{ version: string; bump_type: Bump_Type; } | null>', + return_description: 'predicted version and bump type, or null if no changesets', + parameters: [ + { + name: 'repo', + type: 'Local_Repo', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + ], + module_comment: + 'Changeset parsing and version prediction from `.changeset/*.md` files.\n\nReads changesets to determine which packages need publishing and their version bumps.\nFor auto-generating changesets during publishing, see `changeset_generator.ts`.', + dependencies: ['version_utils.ts'], + dependents: ['operations_defaults.ts'], + }, + { + path: 'constants.ts', + identifiers: [ + { + name: 'MAX_ITERATIONS', + kind: 'variable', + doc_comment: + 'Maximum number of iterations for fixed-point iteration during publishing.\nUsed in both plan generation and actual publishing to resolve transitive dependency cascades.\n\nIn practice, most repos converge in 2-3 iterations.\nDeep dependency chains may require more iterations.', + source_line: 8, + type_signature: '10', + }, + ], + dependents: ['multi_repo_publisher.ts', 'publishing_plan.ts'], + }, + { + path: 'dependency_graph.ts', + identifiers: [ + { + name: 'DEPENDENCY_TYPE', + kind: 'variable', + source_line: 11, + type_signature: '{ readonly PROD: "prod"; readonly PEER: "peer"; readonly DEV: "dev"; }', + }, + { + name: 'Dependency_Type', + kind: 'type', + source_line: 17, + type_signature: 'Dependency_Type', + }, + { + name: 'Dependency_Spec', + kind: 'type', + source_line: 19, + type_signature: 'Dependency_Spec', + properties: [ + { + name: 'type', + kind: 'variable', + type_signature: 'Dependency_Type', + }, + { + name: 'version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'resolved', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'Dependency_Graph_Json', + kind: 'type', + source_line: 25, + type_signature: 'Dependency_Graph_Json', + properties: [ + { + name: 'nodes', + kind: 'variable', + type_signature: + 'Array<{\n\t\tname: string;\n\t\tversion: string;\n\t\tdependencies: Array<{name: string; spec: Dependency_Spec}>;\n\t\tdependents: Array;\n\t\tpublishable: boolean;\n\t}>', + }, + { + name: 'edges', + kind: 'variable', + type_signature: 'Array<{from: string; to: string}>', + }, + ], + }, + { + name: 'Dependency_Node', + kind: 'type', + source_line: 36, + type_signature: 'Dependency_Node', + properties: [ + { + name: 'name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo', + kind: 'variable', + type_signature: 'Local_Repo', + }, + { + name: 'dependencies', + kind: 'variable', + type_signature: 'Map', + }, + { + name: 'dependents', + kind: 'variable', + type_signature: 'Set', + }, + { + name: 'publishable', + kind: 'variable', + type_signature: 'boolean', + }, + ], + }, + { + name: 'Dependency_Graph', + kind: 'class', + source_line: 45, + members: [ + { + name: 'nodes', + kind: 'variable', + type_signature: 'Map', + }, + { + name: 'edges', + kind: 'variable', + type_signature: 'Map>', + }, + { + name: 'constructor', + kind: 'constructor', + type_signature: '(): Dependency_Graph', + parameters: [], + }, + { + name: 'init_from_repos', + kind: 'function', + modifiers: ['public'], + type_signature: '(repos: Local_Repo[]): void', + return_type: 'void', + parameters: [ + { + name: 'repos', + type: 'Local_Repo[]', + optional: false, + }, + ], + }, + { + name: 'get_node', + kind: 'function', + type_signature: '(name: string): Dependency_Node | undefined', + return_type: 'Dependency_Node | undefined', + parameters: [ + { + name: 'name', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'get_dependents', + kind: 'function', + type_signature: '(name: string): Set', + return_type: 'Set', + parameters: [ + { + name: 'name', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'get_dependencies', + kind: 'function', + type_signature: '(name: string): Map', + return_type: 'Map', + parameters: [ + { + name: 'name', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'topological_sort', + kind: 'function', + doc_comment: + "Computes topological sort order for dependency graph.\n\nUses Kahn's algorithm with alphabetical ordering within tiers for\ndeterministic results. Throws if cycles detected.", + type_signature: '(exclude_dev?: boolean): string[]', + return_type: 'string[]', + return_description: + 'array of package names in dependency order (dependencies before dependents)', + parameters: [ + { + name: 'exclude_dev', + type: 'boolean', + optional: false, + description: + 'if true, excludes dev dependencies to break cycles.\nPublishing uses exclude_dev=true to handle circular dev deps.', + default_value: 'false', + }, + ], + throws: [ + { + type: 'if', + description: 'circular dependencies detected in included dependency types', + }, + ], + }, + { + name: 'detect_cycles', + kind: 'function', + type_signature: '(): string[][]', + return_type: 'string[][]', + parameters: [], + }, + { + name: 'detect_cycles_by_type', + kind: 'function', + doc_comment: + 'Detects circular dependencies, categorized by severity.\n\nProduction/peer cycles prevent publishing (impossible to order packages).\nDev cycles are normal (test utils, shared configs) and safely ignored.\n\nUses DFS traversal with recursion stack to identify back edges.\nDeduplicates cycles using sorted cycle keys.', + type_signature: '(): { production_cycles: string[][]; dev_cycles: string[][]; }', + return_type: '{ production_cycles: string[][]; dev_cycles: string[][]; }', + return_description: 'object with production_cycles (errors) and dev_cycles (info)', + parameters: [], + }, + { + name: 'toJSON', + kind: 'function', + type_signature: '(): Dependency_Graph_Json', + return_type: 'Dependency_Graph_Json', + parameters: [], + }, + ], + }, + { + name: 'Dependency_Graph_Builder', + kind: 'class', + doc_comment: 'Builder for creating and analyzing dependency graphs.', + source_line: 368, + members: [ + { + name: 'build_from_repos', + kind: 'function', + doc_comment: + 'Constructs dependency graph from local repos.\n\nTwo-pass algorithm: first creates nodes, then builds edges (dependents).\nPrioritizes prod/peer deps over dev deps when same package appears in\nmultiple dependency types (stronger constraint wins).', + type_signature: '(repos: Local_Repo[]): Dependency_Graph', + return_type: 'Dependency_Graph', + return_description: 'fully initialized dependency graph with all nodes and edges', + parameters: [ + { + name: 'repos', + type: 'Local_Repo[]', + optional: false, + }, + ], + }, + { + name: 'compute_publishing_order', + kind: 'function', + doc_comment: + 'Computes publishing order using topological sort with dev deps excluded.\n\nExcludes dev dependencies to break circular dev dependency cycles while\npreserving production/peer dependency ordering. This allows patterns like\nshared test utilities that depend on each other for development.', + type_signature: '(graph: Dependency_Graph): string[]', + return_type: 'string[]', + return_description: + 'package names in safe publishing order (dependencies before dependents)', + parameters: [ + { + name: 'graph', + type: 'Dependency_Graph', + optional: false, + }, + ], + throws: [ + { + type: 'if', + description: 'production/peer cycles detected (cannot be resolved by exclusion)', + }, + ], + }, + { + name: 'analyze', + kind: 'function', + type_signature: + '(graph: Dependency_Graph): { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + return_type: + '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + parameters: [ + { + name: 'graph', + type: 'Dependency_Graph', + optional: false, + }, + ], + }, + ], + }, + ], + module_comment: + 'Dependency graph data structure and algorithms for multi-repo publishing.\n\nProvides `Dependency_Graph` class with topological sort and cycle detection.\nFor validation workflow and publishing order computation, see `graph_validation.ts`.', + dependents: ['gitops_analyze.task.ts', 'gitops_validate.task.ts', 'graph_validation.ts'], + }, + { + path: 'dependency_updater.ts', + identifiers: [ + { + name: 'Version_Strategy', + kind: 'type', + source_line: 14, + type_signature: 'Version_Strategy', + }, + { + name: 'update_package_json', + kind: 'function', + doc_comment: + 'Updates package.json dependencies and creates changeset if needed.\n\nWorkflow:\n1. Updates all dependency types (dependencies, devDependencies, peerDependencies)\n2. Writes updated package.json with tabs formatting\n3. Creates auto-changeset if published_versions provided (for transitive updates)\n4. Commits both package.json and changeset with standard message\n\nUses version strategy to determine prefix (exact, caret, tilde) while preserving\nexisting prefixes when possible.', + throws: [ + { + type: 'if', + description: 'file operations or git operations fail', + }, + ], + source_line: 32, + type_signature: + '(repo: Local_Repo, updates: Map, strategy?: Version_Strategy, published_versions?: Map | undefined, log?: Logger | undefined, git_ops?: Git_Operations, fs_ops?: Fs_Operations): Promise<...>', + return_type: 'Promise', + parameters: [ + { + name: 'repo', + type: 'Local_Repo', + optional: false, + }, + { + name: 'updates', + type: 'Map', + optional: false, + }, + { + name: 'strategy', + type: 'Version_Strategy', + optional: false, + description: 'how to format version ranges (default: caret)', + default_value: "'caret'", + }, + { + name: 'published_versions', + type: 'Map | undefined', + optional: true, + description: 'if provided, generates auto-changesets for updates', + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + { + name: 'git_ops', + type: 'Git_Operations', + optional: false, + default_value: 'default_git_operations', + }, + { + name: 'fs_ops', + type: 'Fs_Operations', + optional: false, + default_value: 'default_fs_operations', + }, + ], + }, + { + name: 'update_all_repos', + kind: 'function', + source_line: 165, + type_signature: + '(repos: Local_Repo[], published: Map, strategy?: Version_Strategy, log?: Logger | undefined, git_ops?: Git_Operations, fs_ops?: Fs_Operations): Promise<...>', + return_type: 'Promise<{ updated: number; failed: { repo: string; error: Error; }[]; }>', + parameters: [ + { + name: 'repos', + type: 'Local_Repo[]', + optional: false, + }, + { + name: 'published', + type: 'Map', + optional: false, + }, + { + name: 'strategy', + type: 'Version_Strategy', + optional: false, + default_value: "'caret'", + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + { + name: 'git_ops', + type: 'Git_Operations', + optional: false, + default_value: 'default_git_operations', + }, + { + name: 'fs_ops', + type: 'Fs_Operations', + optional: false, + default_value: 'default_fs_operations', + }, + ], + }, + { + name: 'find_updates_needed', + kind: 'function', + source_line: 223, + type_signature: + '(repo: Local_Repo, published: Map): Map', + return_type: + 'Map', + parameters: [ + { + name: 'repo', + type: 'Local_Repo', + optional: false, + }, + { + name: 'published', + type: 'Map', + optional: false, + }, + ], + }, + ], + dependencies: ['changeset_generator.ts', 'operations_defaults.ts', 'version_utils.ts'], + dependents: ['multi_repo_publisher.ts'], + }, + { + path: 'fetch_repo_data.ts', + identifiers: [ + { + name: 'fetch_repo_data', + kind: 'function', + doc_comment: + 'Fetches GitHub metadata (CI status, PRs) for all repos.\n\nFetches sequentially with delay between requests to respect GitHub API rate limits.\nUses `await_in_loop` intentionally to avoid parallel requests overwhelming the API.\n\nError handling: Logs fetch failures but continues processing remaining repos.\nRepos with failed fetches will have `null` for check_runs or pull_requests.', + source_line: 24, + type_signature: + '(resolved_repos: Local_Repo[], token?: string | undefined, cache?: Map | undefined, log?: Logger | undefined, delay?: number, github_api_version?: string | undefined): Promise<...>', + return_type: 'Promise', + return_description: 'array of Repo objects with GitHub metadata attached', + parameters: [ + { + name: 'resolved_repos', + type: 'Local_Repo[]', + optional: false, + }, + { + name: 'token', + type: 'string | undefined', + optional: true, + }, + { + name: 'cache', + type: 'Map | undefined', + optional: true, + description: "optional cache from belt's fetch.js for response memoization", + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + { + name: 'delay', + type: 'number', + optional: false, + description: 'milliseconds between API requests (default: 33ms)', + default_value: '33', + }, + { + name: 'github_api_version', + type: 'string | undefined', + optional: true, + }, + ], + }, + ], + dependencies: ['github.ts'], + dependents: ['gitops_sync.task.ts'], + }, + { + path: 'fs_fetch_value_cache.ts', + identifiers: [ + { + name: 'Fetch_Cache', + kind: 'type', + source_line: 10, + type_signature: 'Fetch_Cache', + properties: [ + { + name: 'name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'data', + kind: 'variable', + type_signature: 'Fetch_Value_Cache', + }, + { + name: 'save', + kind: 'variable', + type_signature: '() => Promise', + doc_comment: '', + }, + ], + }, + { + name: 'create_fs_fetch_value_cache', + kind: 'function', + doc_comment: + "Creates file-system backed cache for belt's fetch.js API responses.\n\nCache invalidation strategy: If cache file can't be read or parsed, entire\ncache is cleared (delete file) and starts fresh. This handles format changes.\n\nUses `structuredClone` to track changes - only writes to disk if data modified.\nFormatted with Prettier before writing for version control friendliness.", + source_line: 32, + type_signature: '(name: string, dir?: string): Promise', + return_type: 'Promise', + return_description: 'cache object with Map-based data and save() method', + parameters: [ + { + name: 'name', + type: 'string', + optional: false, + description: 'cache filename (without .json extension)', + }, + { + name: 'dir', + type: 'string', + optional: false, + description: 'cache directory (defaults to `.gro/build/fetch/`)', + default_value: "join(paths.build, 'fetch')", + }, + ], + }, + ], + dependents: ['gitops_sync.task.ts'], + }, + { + path: 'git_operations.ts', + identifiers: [ + { + name: 'git_add', + kind: 'function', + doc_comment: 'Adds files to git staging area and throws if anything goes wrong.', + source_line: 16, + type_signature: + '(files: string | string[], options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'files', + type: 'string | string[]', + optional: false, + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_commit', + kind: 'function', + doc_comment: 'Commits staged changes with a message and throws if anything goes wrong.', + source_line: 30, + type_signature: '(message: string, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'message', + type: 'string', + optional: false, + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_add_and_commit', + kind: 'function', + doc_comment: 'Adds files and commits in one operation and throws if anything goes wrong.', + source_line: 40, + type_signature: + '(files: string | string[], message: string, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'files', + type: 'string | string[]', + optional: false, + }, + { + name: 'message', + type: 'string', + optional: false, + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_tag', + kind: 'function', + doc_comment: 'Creates a git tag and throws if anything goes wrong.', + source_line: 52, + type_signature: + '(tag_name: string, message?: string | undefined, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'tag_name', + type: 'string', + optional: false, + }, + { + name: 'message', + type: 'string | undefined', + optional: true, + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_push_tag', + kind: 'function', + doc_comment: 'Pushes a tag to origin and throws if anything goes wrong.', + source_line: 68, + type_signature: + '(tag_name: string, origin?: Git_Origin, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'tag_name', + type: 'string', + optional: false, + }, + { + name: 'origin', + type: 'Git_Origin', + optional: false, + default_value: "'origin' as Git_Origin", + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_has_changes', + kind: 'function', + source_line: 79, + type_signature: '(options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_get_changed_files', + kind: 'function', + doc_comment: 'Returns list of changed files compared to HEAD.', + source_line: 87, + type_signature: '(options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_has_file_changed', + kind: 'function', + source_line: 97, + type_signature: + '(from_commit: string, to_commit: string, file_path: string, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'from_commit', + type: 'string', + optional: false, + }, + { + name: 'to_commit', + type: 'string', + optional: false, + }, + { + name: 'file_path', + type: 'string', + optional: false, + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_stash', + kind: 'function', + doc_comment: 'Stashes current changes and throws if anything goes wrong.', + source_line: 114, + type_signature: + '(message?: string | undefined, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'message', + type: 'string | undefined', + optional: true, + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_stash_pop', + kind: 'function', + doc_comment: 'Applies stashed changes and throws if anything goes wrong.', + source_line: 126, + type_signature: '(options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_switch_branch', + kind: 'function', + doc_comment: + 'Switches to a branch with safety checks and throws if workspace is not clean.', + source_line: 136, + type_signature: + '(branch: Git_Branch, pull?: boolean, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'branch', + type: 'Git_Branch', + optional: false, + }, + { + name: 'pull', + type: 'boolean', + optional: false, + default_value: 'true', + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_current_branch_name_required', + kind: 'function', + doc_comment: "Wrapper for gro's git_current_branch_name that throws if null.", + source_line: 165, + type_signature: '(options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_current_commit_hash_required', + kind: 'function', + doc_comment: "Wrapper for gro's git_current_commit_hash that throws if null.", + source_line: 176, + type_signature: + '(branch?: string | undefined, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'branch', + type: 'string | undefined', + optional: true, + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_check_clean_workspace_as_boolean', + kind: 'function', + doc_comment: "Wrapper for gro's git_check_clean_workspace that returns a boolean.", + source_line: 190, + type_signature: '(options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + { + name: 'git_has_remote', + kind: 'function', + source_line: 197, + type_signature: '(remote?: string, options?: SpawnOptions | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'remote', + type: 'string', + optional: false, + default_value: "'origin'", + }, + { + name: 'options', + type: 'SpawnOptions | undefined', + optional: true, + }, + ], + }, + ], + dependents: ['operations_defaults.ts'], + }, + { + path: 'github_helpers.ts', + identifiers: [ + { + name: 'Filter_Pull_Request', + kind: 'type', + source_line: 6, + type_signature: 'Filter_Pull_Request', + }, + { + name: 'Pull_Request_Meta', + kind: 'type', + source_line: 8, + type_signature: 'Pull_Request_Meta', + properties: [ + { + name: 'repo', + kind: 'variable', + type_signature: 'Repo', + }, + { + name: 'pull_request', + kind: 'variable', + type_signature: 'Github_Pull_Request', + }, + ], + }, + { + name: 'to_pull_requests', + kind: 'function', + source_line: 13, + type_signature: + '(repos: Repo[], filter_pull_request?: Filter_Pull_Request | undefined): Pull_Request_Meta[]', + return_type: 'Pull_Request_Meta[]', + parameters: [ + { + name: 'repos', + type: 'Repo[]', + optional: false, + }, + { + name: 'filter_pull_request', + type: 'Filter_Pull_Request | undefined', + optional: true, + }, + ], + }, + { + name: 'to_pull_url', + kind: 'function', + source_line: 30, + type_signature: + '(repo_url: string, pull: { number: number; title: string; user: { login: string; }; draft: boolean; }): string', + return_type: 'string', + parameters: [ + { + name: 'repo_url', + type: 'string', + optional: false, + }, + { + name: 'pull', + type: '{ number: number; title: string; user: { login: string; }; draft: boolean; }', + optional: false, + }, + ], + }, + ], + dependents: ['Pull_Requests_Detail.svelte', 'Repos_Table.svelte'], + }, + { + path: 'github.ts', + identifiers: [ + { + name: 'Github_Pull_Request', + kind: 'type', + doc_comment: '', + see_also: [ + 'https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#list-pull-requests', + ], + source_line: 9, + type_signature: + 'ZodObject<{ number: ZodNumber; title: ZodString; user: ZodObject<{ login: ZodString; }, $strip>; draft: ZodBoolean; }, $strip>', + }, + { + name: 'Github_Pull_Requests', + kind: 'type', + source_line: 18, + type_signature: + 'ZodArray; draft: ZodBoolean; }, $strip>>', + }, + { + name: 'fetch_github_pull_requests', + kind: 'function', + doc_comment: '', + see_also: [ + 'https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#list-pull-requests', + ], + source_line: 24, + type_signature: + '(pkg: Pkg, cache?: Map | undefined, log?: Logger | undefined, token?: string | undefined, api_version?: string | undefined): Promise<...>', + return_type: + 'Promise<{ number: number; title: string; user: { login: string; }; draft: boolean; }[] | null>', + parameters: [ + { + name: 'pkg', + type: 'Pkg', + optional: false, + }, + { + name: 'cache', + type: 'Map | undefined', + optional: true, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + { + name: 'token', + type: 'string | undefined', + optional: true, + }, + { + name: 'api_version', + type: 'string | undefined', + optional: true, + }, + ], + }, + { + name: 'Github_Check_Runs_Item', + kind: 'type', + doc_comment: '', + see_also: [ + 'https://docs.github.com/en/rest/checks/runs?apiVersion=2022-11-28#list-check-runs-for-a-git-reference', + ], + source_line: 56, + type_signature: + 'ZodObject<{ status: ZodEnum<{ queued: "queued"; in_progress: "in_progress"; completed: "completed"; }>; conclusion: ZodNullable>; }, $strip>', + }, + { + name: 'Github_Check_Runs', + kind: 'type', + source_line: 63, + type_signature: + 'ZodObject<{ total_count: ZodNumber; check_runs: ZodArray; conclusion: ZodNullable>; }, $strip>>; }, $strip>', + }, + { + name: 'fetch_github_check_runs', + kind: 'function', + doc_comment: '', + see_also: [ + 'https://docs.github.com/en/rest/checks/runs?apiVersion=2022-11-28#list-check-runs-for-a-git-reference', + ], + source_line: 72, + type_signature: + '(pkg: Pkg, cache?: Map | undefined, log?: Logger | undefined, token?: string | undefined, api_version?: string | undefined, ref?: string): Promise<...>', + return_type: + 'Promise<{ status: "queued" | "in_progress" | "completed"; conclusion: "success" | "failure" | "neutral" | "cancelled" | "skipped" | "timed_out" | "action_required" | null; } | null>', + parameters: [ + { + name: 'pkg', + type: 'Pkg', + optional: false, + }, + { + name: 'cache', + type: 'Map | undefined', + optional: true, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + { + name: 'token', + type: 'string | undefined', + optional: true, + }, + { + name: 'api_version', + type: 'string | undefined', + optional: true, + }, + { + name: 'ref', + type: 'string', + optional: false, + default_value: "'main'", + }, + ], + }, + ], + dependents: ['fetch_repo_data.ts', 'repo.svelte.ts'], + }, + { + path: 'gitops_analyze.task.ts', + identifiers: [], + dependencies: [ + 'dependency_graph.ts', + 'gitops_task_helpers.ts', + 'graph_validation.ts', + 'log_helpers.ts', + 'output_helpers.ts', + ], + }, + { + path: 'gitops_config.ts', + identifiers: [ + { + name: 'Gitops_Config', + kind: 'type', + source_line: 19, + type_signature: 'Gitops_Config', + properties: [ + { + name: 'repos', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'repos_dir', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'Create_Gitops_Config', + kind: 'type', + source_line: 24, + type_signature: 'Create_Gitops_Config', + }, + { + name: 'Raw_Gitops_Config', + kind: 'type', + source_line: 28, + type_signature: 'Raw_Gitops_Config', + properties: [ + { + name: 'repos', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'repos_dir', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'Gitops_Repo_Config', + kind: 'type', + source_line: 33, + type_signature: 'Gitops_Repo_Config', + properties: [ + { + name: 'repo_url', + kind: 'variable', + type_signature: 'Url', + doc_comment: 'The HTTPS URL to the repo. Does not include a `.git` suffix.', + }, + { + name: 'repo_dir', + kind: 'variable', + type_signature: 'string | null', + doc_comment: + "Relative or absolute path to the repo's local directory.\nIf `null`, the directory is inferred from the URL and cwd.", + }, + { + name: 'branch', + kind: 'variable', + type_signature: 'Git_Branch', + doc_comment: 'The branch name to use when fetching the repo. Defaults to `main`.', + }, + ], + }, + { + name: 'Raw_Gitops_Repo_Config', + kind: 'type', + source_line: 54, + type_signature: 'Raw_Gitops_Repo_Config', + properties: [ + { + name: 'repo_url', + kind: 'variable', + type_signature: 'Url', + }, + { + name: 'repo_dir', + kind: 'variable', + type_signature: 'string | null', + }, + { + name: 'branch', + kind: 'variable', + type_signature: 'Git_Branch', + }, + ], + }, + { + name: 'create_empty_gitops_config', + kind: 'function', + source_line: 60, + type_signature: '(): Gitops_Config', + return_type: 'Gitops_Config', + parameters: [], + }, + { + name: 'normalize_gitops_config', + kind: 'function', + doc_comment: + 'Transforms a `Raw_Gitops_Config` to the more strict `Gitops_Config`.\nThis allows users to provide a more relaxed config.', + source_line: 69, + type_signature: '(raw_config: Raw_Gitops_Config): Gitops_Config', + return_type: 'Gitops_Config', + parameters: [ + { + name: 'raw_config', + type: 'Raw_Gitops_Config', + optional: false, + }, + ], + }, + { + name: 'Gitops_Config_Module', + kind: 'type', + source_line: 92, + type_signature: 'Gitops_Config_Module', + properties: [ + { + name: 'default', + kind: 'variable', + modifiers: ['readonly'], + type_signature: 'Raw_Gitops_Config | Create_Gitops_Config', + }, + ], + }, + { + name: 'load_gitops_config', + kind: 'function', + source_line: 96, + type_signature: '(config_path: string): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'config_path', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'validate_gitops_config_module', + kind: 'function', + source_line: 111, + type_signature: + '(config_module: any, config_path: string): asserts config_module is Gitops_Config_Module', + return_type: 'void', + parameters: [ + { + name: 'config_module', + type: 'any', + optional: false, + }, + { + name: 'config_path', + type: 'string', + optional: false, + }, + ], + }, + ], + module_comment: + 'Configuration types and normalization for gitops multi-repo management.\n\nTwo-phase configuration system:\n- `Raw_Gitops_Config` - User-friendly format with optional fields and flexible types\n- `Gitops_Config` - Internal format with required fields and strict types\n\nThis allows users to provide minimal configs (e.g., just URLs as strings) while\nthe system works with normalized configs internally for type safety.', + dependencies: ['paths.ts'], + dependents: ['gitops_task_helpers.ts'], + }, + { + path: 'gitops_plan.task.ts', + identifiers: [], + dependencies: ['gitops_task_helpers.ts', 'output_helpers.ts', 'publishing_plan.ts'], + }, + { + path: 'gitops_publish.task.ts', + identifiers: [], + dependencies: [ + 'gitops_task_helpers.ts', + 'multi_repo_publisher.ts', + 'output_helpers.ts', + 'publishing_plan.ts', + ], + }, + { + path: 'gitops_sync.task.ts', + identifiers: [], + dependencies: ['fetch_repo_data.ts', 'fs_fetch_value_cache.ts', 'gitops_task_helpers.ts'], + }, + { + path: 'gitops_task_helpers.ts', + identifiers: [ + { + name: 'Get_Gitops_Ready_Options', + kind: 'type', + source_line: 29, + type_signature: 'Get_Gitops_Ready_Options', + properties: [ + { + name: 'path', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'dir', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'download', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'log', + kind: 'variable', + type_signature: 'Logger', + }, + { + name: 'git_ops', + kind: 'variable', + type_signature: 'Git_Operations', + }, + { + name: 'npm_ops', + kind: 'variable', + type_signature: 'Npm_Operations', + }, + ], + }, + { + name: 'get_gitops_ready', + kind: 'function', + doc_comment: + 'Central initialization function for all gitops tasks.\n\nInitialization sequence:\n1. Loads and normalizes config from `gitops.config.ts`\n2. Resolves local repo paths (creates missing with `--download`)\n3. Switches branches and pulls latest changes\n4. Auto-installs deps if package.json changed during pull\n\nPriority for path resolution:\n- `dir` argument (explicit override)\n- Config `repos_dir` setting\n- `DEFAULT_REPOS_DIR` constant', + throws: [ + { + type: 'if', + description: 'config loading or repo resolution fails', + }, + ], + source_line: 57, + type_signature: + '(options: Get_Gitops_Ready_Options): Promise<{ config_path: string; repos_dir: string; gitops_config: Gitops_Config; local_repos: Local_Repo[]; }>', + return_type: + 'Promise<{ config_path: string; repos_dir: string; gitops_config: Gitops_Config; local_repos: Local_Repo[]; }>', + return_description: 'initialized config and fully loaded repos ready for operations', + parameters: [ + { + name: 'options', + type: 'Get_Gitops_Ready_Options', + optional: false, + }, + ], + }, + { + name: 'Resolve_Gitops_Paths_Options', + kind: 'type', + source_line: 96, + type_signature: 'Resolve_Gitops_Paths_Options', + properties: [ + { + name: 'path', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'dir', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'config_repos_dir', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'resolve_gitops_paths', + kind: 'function', + source_line: 102, + type_signature: + '(options: Resolve_Gitops_Paths_Options): { config_path: string; repos_dir: string; }', + return_type: '{ config_path: string; repos_dir: string; }', + parameters: [ + { + name: 'options', + type: 'Resolve_Gitops_Paths_Options', + optional: false, + }, + ], + }, + { + name: 'import_gitops_config', + kind: 'function', + source_line: 120, + type_signature: '(config_path: string): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'config_path', + type: 'string', + optional: false, + }, + ], + }, + ], + module_comment: + 'Shared initialization logic for all gitops tasks.\n\nProvides `get_gitops_ready()` which orchestrates:\n- Config loading and normalization\n- Repo resolution (local path discovery)\n- Branch switching and syncing\n- Dependency installation\n\nUsed by: `gitops_sync.task.ts`, `gitops_analyze.task.ts`, `gitops_plan.task.ts`,\n`gitops_publish.task.ts`, and `gitops_validate.task.ts`.\n\nAccepts `git_ops` and `npm_ops` parameters to support testing via operations pattern\n(see `operations.ts` for dependency injection details).', + dependencies: ['gitops_config.ts', 'local_repo.ts', 'paths.ts', 'resolved_gitops_config.ts'], + dependents: [ + 'gitops_analyze.task.ts', + 'gitops_plan.task.ts', + 'gitops_publish.task.ts', + 'gitops_sync.task.ts', + 'gitops_validate.task.ts', + ], + }, + { + path: 'gitops_validate.task.ts', + identifiers: [], + dependencies: [ + 'dependency_graph.ts', + 'gitops_task_helpers.ts', + 'graph_validation.ts', + 'log_helpers.ts', + 'multi_repo_publisher.ts', + 'publishing_plan.ts', + ], + }, + { + path: 'graph_validation.ts', + identifiers: [ + { + name: 'Graph_Validation_Result', + kind: 'type', + source_line: 21, + type_signature: 'Graph_Validation_Result', + properties: [ + { + name: 'graph', + kind: 'variable', + type_signature: 'Dependency_Graph', + }, + { + name: 'publishing_order', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'production_cycles', + kind: 'variable', + type_signature: 'Array>', + }, + { + name: 'dev_cycles', + kind: 'variable', + type_signature: 'Array>', + }, + { + name: 'sort_error', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'validate_dependency_graph', + kind: 'function', + doc_comment: + 'Shared utility for building dependency graph, detecting cycles, and computing publishing order.\nThis centralizes logic that was duplicated across multi_repo_publisher, publishing_plan, and gitops_analyze.', + throws: [ + { + type: 'if', + description: 'production cycles detected and throw_on_prod_cycles is true', + }, + ], + source_line: 39, + type_signature: + '(repos: Local_Repo[], log?: Logger | undefined, options?: { throw_on_prod_cycles?: boolean | undefined; log_cycles?: boolean | undefined; log_order?: boolean | undefined; }): Graph_Validation_Result', + return_type: 'Graph_Validation_Result', + return_description: + 'graph validation result with graph, publishing order, and detected cycles', + parameters: [ + { + name: 'repos', + type: 'Local_Repo[]', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + { + name: 'options', + type: '{ throw_on_prod_cycles?: boolean | undefined; log_cycles?: boolean | undefined; log_order?: boolean | undefined; }', + optional: false, + default_value: '{}', + }, + ], + }, + ], + module_comment: + 'Shared dependency graph validation logic used across multiple workflows.\n\nConsolidates graph building, cycle detection, and publishing order computation\nthat was duplicated in three places: `multi_repo_publisher.ts`, `publishing_plan.ts`,\nand `gitops_analyze.task.ts`.\n\nOptions pattern supports different behaviors: analyze can tolerate cycles for\nreporting, while publish must throw on production cycles.\n\nSee also: `dependency_graph.ts` for core graph data structure and algorithms.', + dependencies: ['dependency_graph.ts'], + dependents: [ + 'gitops_analyze.task.ts', + 'gitops_validate.task.ts', + 'multi_repo_publisher.ts', + 'publishing_plan.ts', + ], + }, + { + path: 'local_repo.ts', + identifiers: [ + { + name: 'Local_Repo', + kind: 'type', + source_line: 16, + type_signature: 'Local_Repo', + extends: ['Resolved_Local_Repo'], + properties: [ + { + name: 'pkg', + kind: 'variable', + type_signature: 'Pkg', + }, + { + name: 'dependencies', + kind: 'variable', + type_signature: 'Map', + }, + { + name: 'dev_dependencies', + kind: 'variable', + type_signature: 'Map', + }, + { + name: 'peer_dependencies', + kind: 'variable', + type_signature: 'Map', + }, + ], + }, + { + name: 'Maybe_Local_Repo', + kind: 'type', + source_line: 23, + type_signature: 'Maybe_Local_Repo', + }, + { + name: 'Resolved_Local_Repo', + kind: 'type', + source_line: 25, + type_signature: 'Resolved_Local_Repo', + properties: [ + { + name: 'type', + kind: 'variable', + type_signature: "'resolved_local_repo'", + }, + { + name: 'repo_name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo_dir', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo_url', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo_git_ssh_url', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo_config', + kind: 'variable', + type_signature: 'Gitops_Repo_Config', + }, + ], + }, + { + name: 'Unresolved_Local_Repo', + kind: 'type', + source_line: 34, + type_signature: 'Unresolved_Local_Repo', + properties: [ + { + name: 'type', + kind: 'variable', + type_signature: "'unresolved_local_repo'", + }, + { + name: 'repo_name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo_url', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo_git_ssh_url', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'repo_config', + kind: 'variable', + type_signature: 'Gitops_Repo_Config', + }, + ], + }, + { + name: 'load_local_repo', + kind: 'function', + doc_comment: + 'Loads repo data with automatic syncing and dependency management.\n\nWorkflow:\n1. Records current commit hash (for detecting changes)\n2. Switches to target branch if needed (requires clean workspace)\n3. Pulls latest changes from remote (skipped for local-only repos)\n4. Validates workspace is clean after pull\n5. Auto-installs dependencies if package.json changed\n6. Parses package.json and extracts Pkg metadata\n\nThis ensures repos are always in sync with their configured branch\nbefore being used by gitops commands.', + throws: [ + { + type: 'if', + description: 'workspace dirty, branch switch fails, or install fails', + }, + ], + source_line: 58, + type_signature: + '({ resolved_local_repo, log: _log, git_ops, npm_ops, }: { resolved_local_repo: Resolved_Local_Repo; log?: Logger | undefined; git_ops?: Git_Operations | undefined; npm_ops?: Npm_Operations | undefined; }): Promise<...>', + return_type: 'Promise', + parameters: [ + { + name: '__0', + type: '{ resolved_local_repo: Resolved_Local_Repo; log?: Logger | undefined; git_ops?: Git_Operations | undefined; npm_ops?: Npm_Operations | undefined; }', + optional: false, + }, + ], + }, + { + name: 'resolve_local_repos', + kind: 'function', + source_line: 186, + type_signature: + '({ resolved_config, repos_dir, gitops_config, download, log, npm_ops, }: { resolved_config: Resolved_Gitops_Config; repos_dir: string; gitops_config: Gitops_Config; download: boolean; log?: Logger | undefined; npm_ops?: Npm_Operations | undefined; }): Promise<...>', + return_type: 'Promise', + parameters: [ + { + name: '__0', + type: '{ resolved_config: Resolved_Gitops_Config; repos_dir: string; gitops_config: Gitops_Config; download: boolean; log?: Logger | undefined; npm_ops?: Npm_Operations | undefined; }', + optional: false, + }, + ], + }, + { + name: 'load_local_repos', + kind: 'function', + source_line: 236, + type_signature: + '({ resolved_local_repos, log, git_ops, npm_ops, }: { resolved_local_repos: Resolved_Local_Repo[]; log?: Logger | undefined; git_ops?: Git_Operations | undefined; npm_ops?: Npm_Operations | undefined; }): Promise<...>', + return_type: 'Promise', + parameters: [ + { + name: '__0', + type: '{ resolved_local_repos: Resolved_Local_Repo[]; log?: Logger | undefined; git_ops?: Git_Operations | undefined; npm_ops?: Npm_Operations | undefined; }', + optional: false, + }, + ], + }, + { + name: 'resolve_local_repo', + kind: 'function', + source_line: 254, + type_signature: + '({ repo_config, repos_dir, }: { repo_config: Gitops_Repo_Config; repos_dir: string; }): Maybe_Local_Repo', + return_type: 'Maybe_Local_Repo', + parameters: [ + { + name: '__0', + type: '{ repo_config: Gitops_Repo_Config; repos_dir: string; }', + optional: false, + }, + ], + }, + ], + dependencies: ['operations_defaults.ts'], + dependents: ['gitops_task_helpers.ts', 'resolved_gitops_config.ts'], + }, + { + path: 'log_helpers.ts', + identifiers: [ + { + name: 'format_wildcard_dependencies', + kind: 'function', + doc_comment: + 'Formats wildcard dependencies as styled strings.\nReturns array of lines for inclusion in output.', + source_line: 10, + type_signature: + '(analysis: { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }): string[]', + return_type: 'string[]', + parameters: [ + { + name: 'analysis', + type: '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + optional: false, + }, + ], + }, + { + name: 'format_dev_cycles', + kind: 'function', + doc_comment: + 'Formats dev circular dependencies as styled strings.\nReturns array of lines for inclusion in output.', + source_line: 27, + type_signature: + '(analysis: { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }): string[]', + return_type: 'string[]', + parameters: [ + { + name: 'analysis', + type: '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + optional: false, + }, + ], + }, + { + name: 'format_production_cycles', + kind: 'function', + doc_comment: + 'Formats production/peer circular dependencies as styled strings.\nReturns array of lines for inclusion in output.', + source_line: 49, + type_signature: + '(analysis: { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }): string[]', + return_type: 'string[]', + parameters: [ + { + name: 'analysis', + type: '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + optional: false, + }, + ], + }, + { + name: 'log_wildcard_dependencies', + kind: 'function', + doc_comment: + 'Logs wildcard dependencies as warnings.\nWildcard dependencies require attention and should be reviewed.', + source_line: 71, + type_signature: + '(analysis: { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }, log: Logger, indent?: string): void', + return_type: 'void', + parameters: [ + { + name: 'analysis', + type: '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + optional: false, + }, + { + name: 'log', + type: 'Logger', + optional: false, + }, + { + name: 'indent', + type: 'string', + optional: false, + default_value: "''", + }, + ], + }, + { + name: 'log_dev_cycles', + kind: 'function', + doc_comment: + "Logs dev circular dependencies as info.\nDev cycles are normal and non-blocking, so they're informational, not warnings.", + source_line: 86, + type_signature: + '(analysis: { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }, log: Logger, indent?: string): void', + return_type: 'void', + parameters: [ + { + name: 'analysis', + type: '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + optional: false, + }, + { + name: 'log', + type: 'Logger', + optional: false, + }, + { + name: 'indent', + type: 'string', + optional: false, + default_value: "''", + }, + ], + }, + { + name: 'log_production_cycles', + kind: 'function', + doc_comment: + 'Logs production/peer circular dependencies as errors.\nProduction cycles block publishing and must be resolved.', + source_line: 101, + type_signature: + '(analysis: { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }, log: Logger, indent?: string): void', + return_type: 'void', + parameters: [ + { + name: 'analysis', + type: '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + optional: false, + }, + { + name: 'log', + type: 'Logger', + optional: false, + }, + { + name: 'indent', + type: 'string', + optional: false, + default_value: "''", + }, + ], + }, + { + name: 'log_dependency_analysis', + kind: 'function', + doc_comment: + 'Logs all dependency analysis results (wildcards, production cycles, dev cycles).\nConvenience function that calls all three logging functions in order.', + source_line: 116, + type_signature: + '(analysis: { production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }, log: Logger, indent?: string): void', + return_type: 'void', + parameters: [ + { + name: 'analysis', + type: '{ production_cycles: string[][]; dev_cycles: string[][]; wildcard_deps: { pkg: string; dep: string; version: string; }[]; missing_peers: { pkg: string; dep: string; }[]; }', + optional: false, + }, + { + name: 'log', + type: 'Logger', + optional: false, + }, + { + name: 'indent', + type: 'string', + optional: false, + default_value: "''", + }, + ], + }, + { + name: 'log_list', + kind: 'function', + doc_comment: + 'Logs a simple bulleted list with a header.\nCommon pattern for warnings, info messages, and other lists.', + source_line: 130, + type_signature: + '(items: string[], header: string, color: "cyan" | "yellow" | "red" | "dim", log: Logger, log_method?: "info" | "warn" | "error"): void', + return_type: 'void', + parameters: [ + { + name: 'items', + type: 'string[]', + optional: false, + }, + { + name: 'header', + type: 'string', + optional: false, + }, + { + name: 'color', + type: '"cyan" | "yellow" | "red" | "dim"', + optional: false, + }, + { + name: 'log', + type: 'Logger', + optional: false, + }, + { + name: 'log_method', + type: '"info" | "warn" | "error"', + optional: false, + default_value: "'info'", + }, + ], + }, + ], + dependents: ['gitops_analyze.task.ts', 'gitops_validate.task.ts', 'publishing_plan.ts'], + }, + { + path: 'Modules_Detail.svelte', + identifiers: [ + { + name: 'Modules_Detail', + kind: 'component', + props: [ + { + name: 'repos', + type: 'Array', + optional: false, + }, + { + name: 'nav_footer', + type: 'Snippet', + optional: true, + }, + ], + source_line: 1, + }, + ], + dependencies: ['Modules_Nav.svelte'], + dependents: ['Modules_Page.svelte'], + }, + { + path: 'Modules_Nav.svelte', + identifiers: [ + { + name: 'Modules_Nav', + kind: 'component', + props: [ + { + name: 'repos_modules', + type: 'Array<{\n\t\t\trepo: Repo;\n\t\t\tmodules: Array;\n\t\t}>', + optional: false, + }, + ], + source_line: 1, + }, + ], + dependents: ['Modules_Detail.svelte'], + }, + { + path: 'Modules_Page.svelte', + identifiers: [ + { + name: 'Modules_Page', + kind: 'component', + props: [ + { + name: 'repo', + type: 'Repo', + optional: false, + }, + { + name: 'repos', + type: 'Array', + optional: false, + }, + ], + source_line: 1, + }, + ], + dependencies: ['Modules_Detail.svelte', 'Page_Footer.svelte', 'Page_Header.svelte'], + }, + { + path: 'multi_repo_publisher.ts', + identifiers: [ + { + name: 'Publishing_Options', + kind: 'type', + source_line: 18, + type_signature: 'Publishing_Options', + properties: [ + { + name: 'dry_run', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'update_deps', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'version_strategy', + kind: 'variable', + type_signature: 'Version_Strategy', + }, + { + name: 'deploy', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'max_wait', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'skip_install', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'log', + kind: 'variable', + type_signature: 'Logger', + }, + ], + }, + { + name: 'Published_Version', + kind: 'type', + source_line: 28, + type_signature: 'Published_Version', + properties: [ + { + name: 'name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'old_version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'new_version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'bump_type', + kind: 'variable', + type_signature: "'major' | 'minor' | 'patch'", + }, + { + name: 'breaking', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'commit', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'tag', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'Publishing_Result', + kind: 'type', + source_line: 38, + type_signature: 'Publishing_Result', + properties: [ + { + name: 'ok', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'published', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'failed', + kind: 'variable', + type_signature: 'Array<{name: string; error: Error}>', + }, + { + name: 'duration', + kind: 'variable', + type_signature: 'number', + }, + ], + }, + { + name: 'publish_repos', + kind: 'function', + source_line: 45, + type_signature: + '(repos: Local_Repo[], options: Publishing_Options, ops?: Gitops_Operations): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'repos', + type: 'Local_Repo[]', + optional: false, + }, + { + name: 'options', + type: 'Publishing_Options', + optional: false, + }, + { + name: 'ops', + type: 'Gitops_Operations', + optional: false, + default_value: 'default_gitops_operations', + }, + ], + }, + ], + dependencies: [ + 'constants.ts', + 'dependency_updater.ts', + 'graph_validation.ts', + 'npm_install_helpers.ts', + 'operations_defaults.ts', + 'version_utils.ts', + ], + dependents: ['gitops_publish.task.ts', 'gitops_validate.task.ts'], + }, + { + path: 'npm_install_helpers.ts', + identifiers: [ + { + name: 'install_with_cache_healing', + kind: 'function', + doc_comment: + 'Installs npm dependencies with cache healing on ETARGET errors.\n\n**Strategy:**\n1. First attempt: regular `npm install`\n2. On ETARGET error (stale cache): `npm cache clean --force` then retry\n3. On other errors: fail immediately\n\n**Why ETARGET errors occur:**\nAfter publishing a package and waiting for NPM registry propagation,\nnpm\'s local cache may still have stale "404" metadata. This healing\nstrategy clears the cache to force fresh metadata fetch.', + throws: [ + { + type: 'Error', + description: 'if install fails (with details about cache healing attempts)', + }, + ], + source_line: 42, + type_signature: + '(repo: Local_Repo, ops: Gitops_Operations, log?: Logger | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'repo', + type: 'Local_Repo', + optional: false, + description: '- The repository to install dependencies for', + }, + { + name: 'ops', + type: 'Gitops_Operations', + optional: false, + description: '- Gitops operations (for dependency injection)', + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + description: '- Optional logger', + }, + ], + }, + ], + dependents: ['multi_repo_publisher.ts'], + }, + { + path: 'npm_registry.ts', + identifiers: [ + { + name: 'Wait_Options', + kind: 'type', + source_line: 6, + type_signature: 'Wait_Options', + properties: [ + { + name: 'max_attempts', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'initial_delay', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'max_delay', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'timeout', + kind: 'variable', + type_signature: 'number', + }, + ], + }, + { + name: 'Package_Info', + kind: 'type', + source_line: 13, + type_signature: 'Package_Info', + properties: [ + { + name: 'name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'version', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'check_package_available', + kind: 'function', + source_line: 18, + type_signature: + '(pkg: string, version: string, log?: Logger | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'pkg', + type: 'string', + optional: false, + }, + { + name: 'version', + type: 'string', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + { + name: 'wait_for_package', + kind: 'function', + doc_comment: + 'Waits for package version to propagate to NPM registry.\n\nUses exponential backoff with jitter to avoid hammering registry.\nLogs progress every 5 attempts. Respects timeout to avoid infinite waits.\n\nCritical for multi-repo publishing: ensures published packages are available\nbefore updating dependent packages.', + throws: [ + { + type: 'if', + description: 'timeout reached or max attempts exceeded', + }, + ], + source_line: 55, + type_signature: + '(pkg: string, version: string, options?: Wait_Options, log?: Logger | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'pkg', + type: 'string', + optional: false, + }, + { + name: 'version', + type: 'string', + optional: false, + }, + { + name: 'options', + type: 'Wait_Options', + optional: false, + default_value: '{}', + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + { + name: 'get_package_info', + kind: 'function', + doc_comment: + "Fetches package metadata from NPM registry.\n\nReturns name and latest version. Returns null if package doesn't exist\nor registry is unreachable.", + source_line: 112, + type_signature: '(pkg: string, log?: Logger | undefined): Promise', + return_type: 'Promise', + return_description: 'package info or null on error/not found', + parameters: [ + { + name: 'pkg', + type: 'string', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + { + name: 'package_exists', + kind: 'function', + source_line: 131, + type_signature: '(pkg: string, log?: Logger | undefined): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'pkg', + type: 'string', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + ], + }, + ], + dependents: ['operations_defaults.ts'], + }, + { + path: 'operations_defaults.ts', + identifiers: [ + { + name: 'default_changeset_operations', + kind: 'variable', + source_line: 44, + type_signature: 'Changeset_Operations', + }, + { + name: 'default_git_operations', + kind: 'variable', + source_line: 80, + type_signature: 'Git_Operations', + }, + { + name: 'default_process_operations', + kind: 'variable', + source_line: 263, + type_signature: 'Process_Operations', + }, + { + name: 'default_npm_operations', + kind: 'variable', + source_line: 287, + type_signature: 'Npm_Operations', + }, + { + name: 'default_preflight_operations', + kind: 'variable', + source_line: 363, + type_signature: 'Preflight_Operations', + }, + { + name: 'default_fs_operations', + kind: 'variable', + source_line: 369, + type_signature: 'Fs_Operations', + }, + { + name: 'default_build_operations', + kind: 'variable', + source_line: 391, + type_signature: 'Build_Operations', + }, + { + name: 'default_gitops_operations', + kind: 'variable', + doc_comment: 'Combined default operations for all gitops functionality.', + source_line: 415, + type_signature: 'Gitops_Operations', + }, + ], + module_comment: + 'Production implementations of operations interfaces.\n\nProvides real git, npm, fs, and build operations for production use.\nFor interface definitions and dependency injection pattern, see `operations.ts`.', + dependencies: [ + 'changeset_reader.ts', + 'git_operations.ts', + 'npm_registry.ts', + 'preflight_checks.ts', + ], + dependents: [ + 'dependency_updater.ts', + 'local_repo.ts', + 'multi_repo_publisher.ts', + 'preflight_checks.ts', + 'publishing_plan.ts', + ], + }, + { + path: 'operations.ts', + identifiers: [ + { + name: 'Changeset_Operations', + kind: 'type', + doc_comment: + 'Changeset operations for reading and predicting versions from `.changeset/*.md` files.', + source_line: 47, + type_signature: 'Changeset_Operations', + properties: [ + { + name: 'has_changesets', + kind: 'variable', + type_signature: + '(options: {\n\t\trepo: Local_Repo;\n\t}) => Promise>', + doc_comment: + 'Checks if a repo has any changeset files.\nReturns true if changesets exist, false if none found.', + }, + { + name: 'read_changesets', + kind: 'variable', + type_signature: + '(options: {\n\t\trepo: Local_Repo;\n\t\tlog?: Logger;\n\t}) => Promise}, {message: string}>>', + doc_comment: + 'Reads all changeset files from a repo.\nReturns array of changeset info, or error if reading fails.', + }, + { + name: 'predict_next_version', + kind: 'variable', + type_signature: + '(options: {\n\t\trepo: Local_Repo;\n\t\tlog?: Logger;\n\t}) => Promise | null>', + doc_comment: + "Predicts the next version based on changesets.\nReturns null if no changesets found (expected, not an error).\nReturns error Result if changesets exist but can't be read/parsed.", + }, + ], + }, + { + name: 'Git_Operations', + kind: 'type', + doc_comment: + 'Git operations for branch management, commits, tags, and workspace state.\nAll operations return `Result` instead of throwing errors.', + source_line: 80, + type_signature: 'Git_Operations', + properties: [ + { + name: 'current_branch_name', + kind: 'variable', + type_signature: + '(options?: {\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Gets the current branch name.', + }, + { + name: 'current_commit_hash', + kind: 'variable', + type_signature: + '(options?: {\n\t\tbranch?: string;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Gets the current commit hash.', + }, + { + name: 'check_clean_workspace', + kind: 'variable', + type_signature: + '(options?: {\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Checks if the workspace is clean (no uncommitted changes).', + }, + { + name: 'checkout', + kind: 'variable', + type_signature: + '(options: {branch: string; cwd?: string}) => Promise>', + doc_comment: 'Checks out a branch.', + }, + { + name: 'pull', + kind: 'variable', + type_signature: + '(options?: {\n\t\torigin?: string;\n\t\tbranch?: string;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Pulls changes from remote.', + }, + { + name: 'switch_branch', + kind: 'variable', + type_signature: + '(options: {\n\t\tbranch: string;\n\t\tpull?: boolean;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Switches to a branch, optionally pulling.', + }, + { + name: 'has_remote', + kind: 'variable', + type_signature: + '(options?: {\n\t\tremote?: string;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Checks if a remote exists.', + }, + { + name: 'add', + kind: 'variable', + type_signature: + '(options: {\n\t\tfiles: string | Array;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Stages files for commit.', + }, + { + name: 'commit', + kind: 'variable', + type_signature: + '(options: {message: string; cwd?: string}) => Promise>', + doc_comment: 'Creates a commit.', + }, + { + name: 'add_and_commit', + kind: 'variable', + type_signature: + '(options: {\n\t\tfiles: string | Array;\n\t\tmessage: string;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Stages files and creates a commit.', + }, + { + name: 'has_changes', + kind: 'variable', + type_signature: + '(options?: {cwd?: string}) => Promise>', + doc_comment: 'Checks if there are any uncommitted changes.', + }, + { + name: 'get_changed_files', + kind: 'variable', + type_signature: + '(options?: {\n\t\tcwd?: string;\n\t}) => Promise}, {message: string}>>', + doc_comment: 'Gets a list of changed files.', + }, + { + name: 'tag', + kind: 'variable', + type_signature: + '(options: {\n\t\ttag_name: string;\n\t\tmessage?: string;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Creates a git tag.', + }, + { + name: 'push_tag', + kind: 'variable', + type_signature: + '(options: {\n\t\ttag_name: string;\n\t\torigin?: string;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Pushes a tag to remote.', + }, + { + name: 'stash', + kind: 'variable', + type_signature: + '(options?: {message?: string; cwd?: string}) => Promise>', + doc_comment: 'Stashes uncommitted changes.', + }, + { + name: 'stash_pop', + kind: 'variable', + type_signature: + '(options?: {cwd?: string}) => Promise>', + doc_comment: 'Pops the most recent stash.', + }, + { + name: 'has_file_changed', + kind: 'variable', + type_signature: + '(options: {\n\t\tfrom_commit: string;\n\t\tto_commit: string;\n\t\tfile_path: string;\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Checks if a specific file changed between two commits.', + }, + ], + }, + { + name: 'Process_Operations', + kind: 'type', + doc_comment: 'Process spawning operations for running shell commands.', + source_line: 210, + type_signature: 'Process_Operations', + properties: [ + { + name: 'spawn', + kind: 'variable', + type_signature: + '(options: {\n\t\tcmd: string;\n\t\targs: Array;\n\t\tspawn_options?: SpawnOptions;\n\t}) => Promise>', + doc_comment: 'Spawns a child process and waits for completion.', + }, + ], + }, + { + name: 'Build_Operations', + kind: 'type', + doc_comment: 'Build operations for validating packages compile before publishing.', + source_line: 224, + type_signature: 'Build_Operations', + properties: [ + { + name: 'build_package', + kind: 'variable', + type_signature: + '(options: {\n\t\trepo: Local_Repo;\n\t\tlog?: Logger;\n\t}) => Promise>', + doc_comment: 'Builds a package using gro build.', + }, + ], + }, + { + name: 'Npm_Operations', + kind: 'type', + doc_comment: + 'NPM registry operations for package availability checks and authentication.\nIncludes exponential backoff for waiting on package propagation.', + source_line: 238, + type_signature: 'Npm_Operations', + properties: [ + { + name: 'wait_for_package', + kind: 'variable', + type_signature: + '(options: {\n\t\tpkg: string;\n\t\tversion: string;\n\t\twait_options?: Wait_Options;\n\t\tlog?: Logger;\n\t}) => Promise>', + doc_comment: + 'Waits for a package version to be available on NPM.\nUses exponential backoff with configurable timeout.', + }, + { + name: 'check_package_available', + kind: 'variable', + type_signature: + '(options: {\n\t\tpkg: string;\n\t\tversion: string;\n\t\tlog?: Logger;\n\t}) => Promise>', + doc_comment: 'Checks if a package version is available on NPM.', + }, + { + name: 'check_auth', + kind: 'variable', + type_signature: '() => Promise>', + doc_comment: 'Checks npm authentication status.', + }, + { + name: 'check_registry', + kind: 'variable', + type_signature: '() => Promise>', + doc_comment: 'Checks if npm registry is reachable.', + }, + { + name: 'install', + kind: 'variable', + type_signature: + '(options?: {\n\t\tcwd?: string;\n\t}) => Promise>', + doc_comment: 'Installs npm dependencies.', + }, + { + name: 'cache_clean', + kind: 'variable', + type_signature: '() => Promise>', + doc_comment: + 'Cleans the npm cache.\nUses `npm cache clean --force` to clear stale cache entries.', + }, + ], + }, + { + name: 'Preflight_Operations', + kind: 'type', + doc_comment: + 'Preflight validation operations to ensure repos are ready for publishing.\nValidates workspace state, branches, builds, and npm authentication.', + source_line: 287, + type_signature: 'Preflight_Operations', + properties: [ + { + name: 'run_preflight_checks', + kind: 'variable', + type_signature: + '(options: {\n\t\trepos: Array;\n\t\tpreflight_options: Preflight_Options;\n\t\tgit_ops?: Git_Operations;\n\t\tnpm_ops?: Npm_Operations;\n\t\tbuild_ops?: Build_Operations;\n\t\tchangeset_ops?: Changeset_Operations;\n\t}) => Promise', + doc_comment: 'Runs preflight validation checks before publishing.', + }, + ], + }, + { + name: 'Fs_Operations', + kind: 'type', + doc_comment: 'File system operations for reading and writing files.', + source_line: 304, + type_signature: 'Fs_Operations', + properties: [ + { + name: 'readFile', + kind: 'variable', + type_signature: + '(options: {\n\t\tpath: string;\n\t\tencoding: BufferEncoding;\n\t}) => Promise>', + doc_comment: 'Reads a file from the file system.', + }, + { + name: 'writeFile', + kind: 'variable', + type_signature: + '(options: {\n\t\tpath: string;\n\t\tcontent: string;\n\t}) => Promise>', + doc_comment: 'Writes a file to the file system.', + }, + ], + }, + { + name: 'Gitops_Operations', + kind: 'type', + doc_comment: + 'Combined operations interface grouping all gitops functionality.\nThis is the main interface injected into publishing and validation workflows.', + source_line: 326, + type_signature: 'Gitops_Operations', + properties: [ + { + name: 'changeset', + kind: 'variable', + type_signature: 'Changeset_Operations', + }, + { + name: 'git', + kind: 'variable', + type_signature: 'Git_Operations', + }, + { + name: 'process', + kind: 'variable', + type_signature: 'Process_Operations', + }, + { + name: 'npm', + kind: 'variable', + type_signature: 'Npm_Operations', + }, + { + name: 'preflight', + kind: 'variable', + type_signature: 'Preflight_Operations', + }, + { + name: 'fs', + kind: 'variable', + type_signature: 'Fs_Operations', + }, + { + name: 'build', + kind: 'variable', + type_signature: 'Build_Operations', + }, + ], + }, + ], + module_comment: + "Operations interfaces for dependency injection.\n\nThis is the core pattern enabling testability without mocks.\nAll side effects (git, npm, fs, process) are abstracted into interfaces.\n\n**Design principles:**\n- All operations accept a single `options` object parameter\n- All fallible operations return `Result` from `@ryanatkn/belt`\n- Never throw `Error` in operations - return `Result` with `ok: false`\n- Use `null` for expected \"not found\" cases (not errors)\n- Include `log?: Logger` in options where logging is useful\n\n**Production usage:**\n```typescript\nimport {default_gitops_operations} from './operations_defaults.js';\nconst result = await ops.git.current_branch_name({cwd: '/path'});\nif (!result.ok) {\n throw new Task_Error(result.message);\n}\nconst branch = result.value;\n```\n\n**Test usage:**\n```typescript\nconst mock_ops = create_mock_operations();\nconst result = await publish_repos(repos, options, mock_ops);\n// Assert on result without any real git/npm calls\n```\n\nSee `operations_defaults.ts` for real implementations.\nSee test files (*.test.ts) for mock implementations.", + }, + { + path: 'output_helpers.ts', + identifiers: [ + { + name: 'Output_Format', + kind: 'type', + source_line: 4, + type_signature: 'Output_Format', + }, + { + name: 'Output_Options', + kind: 'type', + source_line: 6, + type_signature: 'Output_Options', + properties: [ + { + name: 'format', + kind: 'variable', + type_signature: 'Output_Format', + }, + { + name: 'outfile', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'log', + kind: 'variable', + type_signature: 'Logger', + }, + ], + }, + { + name: 'Output_Formatters', + kind: 'type', + source_line: 12, + type_signature: 'Output_Formatters', + generic_params: [ + { + name: 'T', + }, + ], + properties: [ + { + name: 'json', + kind: 'variable', + type_signature: '(data: T) => string', + }, + { + name: 'markdown', + kind: 'variable', + type_signature: '(data: T) => Array', + }, + { + name: 'stdout', + kind: 'variable', + type_signature: '(data: T, log: Logger) => void', + doc_comment: + 'This function should call log methods directly for colored/styled output.', + }, + ], + }, + { + name: 'format_and_output', + kind: 'function', + doc_comment: + 'Formats data and outputs to file or stdout based on options.\n\nSupports three formats:\n- stdout: Uses logger for colored/styled output (cannot use with --outfile)\n- json: Stringified JSON\n- markdown: Formatted markdown text', + throws: [ + { + type: 'if', + description: 'stdout format used with outfile, or if logger missing for stdout', + }, + ], + source_line: 31, + type_signature: + '(data: T, formatters: Output_Formatters, options: Output_Options): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'data', + type: 'T', + optional: false, + }, + { + name: 'formatters', + type: 'Output_Formatters', + optional: false, + }, + { + name: 'options', + type: 'Output_Options', + optional: false, + }, + ], + }, + ], + dependents: ['gitops_analyze.task.ts', 'gitops_plan.task.ts', 'gitops_publish.task.ts'], + }, + { + path: 'Page_Footer.svelte', + identifiers: [ + { + name: 'Page_Footer', + kind: 'component', + source_line: 1, + }, + ], + dependencies: ['repo.svelte.ts'], + dependents: [ + 'Modules_Page.svelte', + 'Pull_Requests_Page.svelte', + 'Table_Page.svelte', + 'Tree_Item_Page.svelte', + 'Tree_Page.svelte', + ], + }, + { + path: 'Page_Header.svelte', + identifiers: [ + { + name: 'Page_Header', + kind: 'component', + props: [ + { + name: 'pkg', + type: 'Pkg | {url: string; package_json: null}', + optional: false, + }, + { + name: 'nav_attrs', + type: "SvelteHTMLElements['nav']", + optional: true, + }, + { + name: 'attrs', + type: "SvelteHTMLElements['header']", + optional: true, + }, + { + name: 'nav', + type: 'Snippet', + optional: true, + }, + { + name: 'children', + type: 'Snippet', + optional: true, + }, + ], + source_line: 1, + }, + ], + dependents: [ + 'Modules_Page.svelte', + 'Pull_Requests_Page.svelte', + 'Table_Page.svelte', + 'Tree_Item_Page.svelte', + 'Tree_Page.svelte', + ], + }, + { + path: 'paths.ts', + identifiers: [ + { + name: 'GITOPS_OUTPUT_DIR', + kind: 'variable', + doc_comment: 'Base directory for all gitops-generated files.', + source_line: 4, + type_signature: '".gro/fuz_gitops"', + }, + { + name: 'DEFAULT_REPOS_DIR', + kind: 'variable', + doc_comment: + 'Default repos directory relative to gitops config file.\nResolves to the parent of the directory with the config\n(e.g., ~/dev/repo/gitops.config.ts resolves to ~/dev/).', + source_line: 11, + type_signature: '".."', + }, + ], + dependents: ['gitops_config.ts', 'gitops_task_helpers.ts'], + }, + { + path: 'preflight_checks.ts', + identifiers: [ + { + name: 'Preflight_Options', + kind: 'type', + source_line: 20, + type_signature: 'Preflight_Options', + properties: [ + { + name: 'skip_changesets', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'skip_build_validation', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'required_branch', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'check_remote', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'estimate_time', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'log', + kind: 'variable', + type_signature: 'Logger', + }, + ], + }, + { + name: 'Preflight_Result', + kind: 'type', + source_line: 29, + type_signature: 'Preflight_Result', + properties: [ + { + name: 'ok', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'warnings', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'errors', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'repos_with_changesets', + kind: 'variable', + type_signature: 'Set', + }, + { + name: 'repos_without_changesets', + kind: 'variable', + type_signature: 'Set', + }, + { + name: 'estimated_duration', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'npm_username', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'Run_Preflight_Checks_Options', + kind: 'type', + source_line: 39, + type_signature: 'Run_Preflight_Checks_Options', + properties: [ + { + name: 'repos', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'preflight_options', + kind: 'variable', + type_signature: 'Preflight_Options', + }, + { + name: 'git_ops', + kind: 'variable', + type_signature: 'Git_Operations', + }, + { + name: 'npm_ops', + kind: 'variable', + type_signature: 'Npm_Operations', + }, + { + name: 'build_ops', + kind: 'variable', + type_signature: 'Build_Operations', + }, + { + name: 'changeset_ops', + kind: 'variable', + type_signature: 'Changeset_Operations', + }, + ], + }, + { + name: 'run_preflight_checks', + kind: 'function', + doc_comment: + 'Validates all requirements before publishing can proceed.\n\nPerforms comprehensive pre-flight validation:\n- Clean workspaces (100% clean required - no uncommitted changes)\n- Correct branch (usually main)\n- Changesets present (unless skip_changesets=true)\n- Builds successful (fail-fast to prevent broken state)\n- Git remote reachability\n- NPM authentication with username\n- NPM registry connectivity\n\nBuild validation runs BEFORE any publishing to prevent the scenario where\nversion is bumped but build fails, leaving repo in broken state.', + source_line: 65, + type_signature: + '({ repos, preflight_options, git_ops, npm_ops, build_ops, changeset_ops, }: Run_Preflight_Checks_Options): Promise', + return_type: 'Promise', + return_description: + 'result with ok=false if any errors, plus warnings and detailed status', + parameters: [ + { + name: '__0', + type: 'Run_Preflight_Checks_Options', + optional: false, + }, + ], + }, + ], + dependencies: ['operations_defaults.ts'], + dependents: ['operations_defaults.ts'], + }, + { + path: 'publishing_plan.ts', + identifiers: [ + { + name: 'Version_Change', + kind: 'type', + source_line: 18, + type_signature: 'Version_Change', + properties: [ + { + name: 'package_name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'from', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'to', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'bump_type', + kind: 'variable', + type_signature: 'Bump_Type', + }, + { + name: 'breaking', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'has_changesets', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'will_generate_changeset', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'needs_bump_escalation', + kind: 'variable', + type_signature: 'boolean', + }, + { + name: 'existing_bump', + kind: 'variable', + type_signature: 'Bump_Type', + }, + { + name: 'required_bump', + kind: 'variable', + type_signature: 'Bump_Type', + }, + ], + }, + { + name: 'Dependency_Update', + kind: 'type', + source_line: 31, + type_signature: 'Dependency_Update', + properties: [ + { + name: 'dependent_package', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'updated_dependency', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'new_version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'type', + kind: 'variable', + type_signature: "'dependencies' | 'devDependencies' | 'peerDependencies'", + }, + { + name: 'causes_republish', + kind: 'variable', + type_signature: 'boolean', + }, + ], + }, + { + name: 'Publishing_Plan', + kind: 'type', + source_line: 39, + type_signature: 'Publishing_Plan', + properties: [ + { + name: 'publishing_order', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'version_changes', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'dependency_updates', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'breaking_cascades', + kind: 'variable', + type_signature: 'Map>', + }, + { + name: 'warnings', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'info', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'errors', + kind: 'variable', + type_signature: 'Array', + }, + ], + }, + { + name: 'generate_publishing_plan', + kind: 'function', + doc_comment: + 'Generates a publishing plan showing what would happen during publishing.\nShows version changes, dependency updates, and breaking change cascades.\nUses fixed-point iteration to resolve transitive cascades.', + source_line: 170, + type_signature: + '(repos: Local_Repo[], log?: Logger | undefined, ops?: Changeset_Operations): Promise', + return_type: 'Promise', + parameters: [ + { + name: 'repos', + type: 'Local_Repo[]', + optional: false, + }, + { + name: 'log', + type: 'Logger | undefined', + optional: true, + }, + { + name: 'ops', + type: 'Changeset_Operations', + optional: false, + default_value: 'default_changeset_operations', + }, + ], + }, + { + name: 'log_publishing_plan', + kind: 'function', + source_line: 461, + type_signature: '(plan: Publishing_Plan, log: Logger): void', + return_type: 'void', + parameters: [ + { + name: 'plan', + type: 'Publishing_Plan', + optional: false, + }, + { + name: 'log', + type: 'Logger', + optional: false, + }, + ], + }, + ], + dependencies: [ + 'constants.ts', + 'graph_validation.ts', + 'log_helpers.ts', + 'operations_defaults.ts', + 'version_utils.ts', + ], + dependents: ['gitops_plan.task.ts', 'gitops_publish.task.ts', 'gitops_validate.task.ts'], + }, + { + path: 'Pull_Requests_Detail.svelte', + identifiers: [ + { + name: 'Pull_Requests_Detail', + kind: 'component', + props: [ + { + name: 'repos', + type: 'Array', + optional: false, + }, + { + name: 'filter_pull_request', + type: 'Filter_Pull_Request | undefined', + optional: true, + }, + ], + source_line: 1, + }, + ], + dependencies: ['github_helpers.ts'], + dependents: ['Pull_Requests_Page.svelte'], + }, + { + path: 'Pull_Requests_Page.svelte', + identifiers: [ + { + name: 'Pull_Requests_Page', + kind: 'component', + props: [ + { + name: 'repo', + type: 'Repo', + optional: false, + }, + { + name: 'repos', + type: 'Array', + optional: false, + }, + { + name: 'filter_pull_request', + type: 'Filter_Pull_Request | undefined', + optional: true, + }, + ], + source_line: 1, + }, + ], + dependencies: ['Page_Footer.svelte', 'Page_Header.svelte', 'Pull_Requests_Detail.svelte'], + }, + { + path: 'repo.svelte.ts', + identifiers: [ + { + name: 'Repo_Json', + kind: 'type', + doc_comment: 'Serialized repo data as stored in repos.ts (JSON).', + source_line: 11, + type_signature: 'Repo_Json', + properties: [ + { + name: 'package_json', + kind: 'variable', + type_signature: 'Package_Json', + }, + { + name: 'src_json', + kind: 'variable', + type_signature: 'Src_Json', + }, + { + name: 'check_runs', + kind: 'variable', + type_signature: 'Github_Check_Runs_Item | null', + }, + { + name: 'pull_requests', + kind: 'variable', + type_signature: 'Array | null', + }, + ], + }, + { + name: 'Repo', + kind: 'class', + doc_comment: 'Runtime repo with Pkg instance.', + source_line: 21, + members: [ + { + name: 'pkg', + kind: 'variable', + type_signature: 'Pkg', + }, + { + name: 'check_runs', + kind: 'variable', + type_signature: 'Github_Check_Runs_Item | null', + }, + { + name: 'pull_requests', + kind: 'variable', + type_signature: 'Array | null', + }, + { + name: 'constructor', + kind: 'constructor', + type_signature: '(repo_json: Repo_Json): Repo', + parameters: [ + { + name: 'repo_json', + type: 'Repo_Json', + optional: false, + }, + ], + }, + ], + }, + { + name: 'Repos', + kind: 'type', + source_line: 33, + type_signature: 'Repos', + properties: [ + { + name: 'repo', + kind: 'variable', + type_signature: 'Repo', + }, + { + name: 'repos', + kind: 'variable', + type_signature: 'Array', + }, + ], + }, + { + name: 'repos_context', + kind: 'variable', + source_line: 38, + type_signature: + '{ get: (error_message?: string | undefined) => Repos; get_maybe: () => Repos | undefined; set: (value: Repos) => Repos; }', + }, + { + name: 'repos_parse', + kind: 'function', + source_line: 40, + type_signature: '(repos: Repo[], homepage_url: string): Repos', + return_type: 'Repos', + parameters: [ + { + name: 'repos', + type: 'Repo[]', + optional: false, + }, + { + name: 'homepage_url', + type: 'string', + optional: false, + }, + ], + }, + ], + dependencies: ['github.ts'], + dependents: ['Page_Footer.svelte'], + }, + { + path: 'Repos_Table.svelte', + identifiers: [ + { + name: 'Repos_Table', + kind: 'component', + props: [ + { + name: 'repos', + type: 'Array', + optional: false, + }, + { + name: 'deps', + type: 'Array', + optional: true, + }, + ], + source_line: 1, + }, + ], + dependencies: ['github_helpers.ts'], + dependents: ['Table_Page.svelte'], + }, + { + path: 'Repos_Tree_Nav.svelte', + identifiers: [ + { + name: 'Repos_Tree_Nav', + kind: 'component', + props: [ + { + name: 'repos', + type: 'Array', + optional: false, + }, + { + name: 'selected_repo', + type: 'Repo', + optional: true, + }, + { + name: 'children', + type: 'Snippet', + optional: false, + }, + ], + source_line: 1, + }, + ], + dependents: ['Repos_Tree.svelte'], + }, + { + path: 'Repos_Tree.svelte', + identifiers: [ + { + name: 'Repos_Tree', + kind: 'component', + props: [ + { + name: 'repos', + type: 'Array', + optional: false, + }, + { + name: 'selected_repo', + type: 'Repo | undefined', + optional: true, + }, + { + name: 'nav', + type: 'Snippet', + optional: false, + }, + ], + source_line: 1, + }, + ], + dependencies: ['Repos_Tree_Nav.svelte'], + dependents: ['Tree_Item_Page.svelte', 'Tree_Page.svelte'], + }, + { + path: 'resolved_gitops_config.ts', + identifiers: [ + { + name: 'Resolved_Gitops_Config', + kind: 'type', + source_line: 9, + type_signature: 'Resolved_Gitops_Config', + properties: [ + { + name: 'local_repos', + kind: 'variable', + type_signature: 'Array | null', + }, + { + name: 'resolved_local_repos', + kind: 'variable', + type_signature: 'Array | null', + }, + { + name: 'unresolved_local_repos', + kind: 'variable', + type_signature: 'Array | null', + }, + ], + }, + { + name: 'resolve_gitops_config', + kind: 'function', + source_line: 15, + type_signature: + '(gitops_config: Gitops_Config, repos_dir: string): Resolved_Gitops_Config', + return_type: 'Resolved_Gitops_Config', + parameters: [ + { + name: 'gitops_config', + type: 'Gitops_Config', + optional: false, + }, + { + name: 'repos_dir', + type: 'string', + optional: false, + }, + ], + }, + ], + dependencies: ['local_repo.ts'], + dependents: ['gitops_task_helpers.ts'], + }, + { + path: 'semver.ts', + identifiers: [ + { + name: 'Bump_Type', + kind: 'type', + doc_comment: 'Semantic Versioning 2.0.0 utilities', + see_also: ['https://semver.org/'], + source_line: 6, + type_signature: 'Bump_Type', + }, + { + name: 'Semver', + kind: 'type', + source_line: 8, + type_signature: 'Semver', + properties: [ + { + name: 'major', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'minor', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'patch', + kind: 'variable', + type_signature: 'number', + }, + { + name: 'prerelease', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'build', + kind: 'variable', + type_signature: 'string', + }, + ], + }, + { + name: 'semver_compare_versions', + kind: 'function', + doc_comment: + 'Compares two semver versions according to SemVer 2.0.0 spec.\nReturns -1 if a < b, 0 if a === b, 1 if a > b.\nBuild metadata is ignored in precedence comparison.', + source_line: 116, + type_signature: '(a: string, b: string): number', + return_type: 'number', + parameters: [ + { + name: 'a', + type: 'string', + optional: false, + }, + { + name: 'b', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'semver_bump_version', + kind: 'function', + doc_comment: + 'Bumps a version according to the specified type.\nResets lower version numbers per SemVer spec.', + source_line: 143, + type_signature: '(version: string, type: Bump_Type): string', + return_type: 'string', + parameters: [ + { + name: 'version', + type: 'string', + optional: false, + }, + { + name: 'type', + type: 'Bump_Type', + optional: false, + }, + ], + }, + ], + module_comment: 'Semantic Versioning 2.0.0 utilities\n@see https://semver.org/', + }, + { + path: 'serialization_types.ts', + identifiers: [ + { + name: 'Serialized_Node', + kind: 'type', + source_line: 15, + type_signature: 'Serialized_Node', + properties: [ + { + name: 'name', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'version', + kind: 'variable', + type_signature: 'string', + }, + { + name: 'dependencies', + kind: 'variable', + type_signature: + 'Array<{\n\t\tname: string;\n\t\ttype: string;\n\t\tversion: string;\n\t}>', + }, + { + name: 'dependents', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'publishable', + kind: 'variable', + type_signature: 'boolean', + }, + ], + }, + { + name: 'Serialized_Graph', + kind: 'type', + source_line: 27, + type_signature: 'Serialized_Graph', + properties: [ + { + name: 'nodes', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'edges', + kind: 'variable', + type_signature: 'Array<[string, string]>', + }, + ], + }, + { + name: 'Serialized_Publishing_Plan', + kind: 'type', + source_line: 32, + type_signature: 'Serialized_Publishing_Plan', + properties: [ + { + name: 'publishing_order', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'version_changes', + kind: 'variable', + type_signature: + 'Array<{\n\t\tpackage_name: string;\n\t\tfrom: string;\n\t\tto: string;\n\t\tbump_type: string;\n\t\tbreaking: boolean;\n\t\thas_changesets: boolean;\n\t\twill_generate_changeset?: boolean;\n\t\tneeds_bump_escalation?: boolean;\n\t\texisting_bump?: string;\n\t\trequired_bump?: string;\n\t}>', + }, + { + name: 'dependency_updates', + kind: 'variable', + type_signature: + 'Array<{\n\t\tdependent_package: string;\n\t\tupdated_dependency: string;\n\t\tnew_version: string;\n\t\ttype: string;\n\t\tcauses_republish: boolean;\n\t}>', + }, + { + name: 'breaking_cascades', + kind: 'variable', + type_signature: 'Record>', + }, + { + name: 'warnings', + kind: 'variable', + type_signature: 'Array', + }, + { + name: 'errors', + kind: 'variable', + type_signature: 'Array', + }, + ], + }, + { + name: 'serialize_graph', + kind: 'function', + doc_comment: 'Serializes a dependency graph to a JSON-safe format.', + source_line: 61, + type_signature: '(graph: Dependency_Graph): Serialized_Graph', + return_type: 'Serialized_Graph', + parameters: [ + { + name: 'graph', + type: 'Dependency_Graph', + optional: false, + }, + ], + }, + ], + module_comment: + 'JSON-serializable types for command output formats.\n\nGitops commands support `--format json` and `--format markdown` output modes\nin addition to styled terminal output. These types define the JSON schema for:\n- Dependency graph structures (`Serialized_Graph`)\n- Publishing plan predictions (`Serialized_Publishing_Plan`)\n\nUsed by `gitops_analyze`, `gitops_plan`, and `gitops_publish --dry_run` when\n`--format json` or `--outfile` is specified.', + }, + { + path: 'Table_Page.svelte', + identifiers: [ + { + name: 'Table_Page', + kind: 'component', + props: [ + { + name: 'repo', + type: 'Repo', + optional: false, + }, + { + name: 'repos', + type: 'Array', + optional: false, + }, + ], + source_line: 1, + }, + ], + dependencies: ['Page_Footer.svelte', 'Page_Header.svelte', 'Repos_Table.svelte'], + }, + { + path: 'Tree_Item_Page.svelte', + identifiers: [ + { + name: 'Tree_Item_Page', + kind: 'component', + props: [ + { + name: 'repo', + type: 'Repo', + optional: false, + }, + { + name: 'repos', + type: 'Array', + optional: false, + }, + { + name: 'slug', + type: 'string', + optional: false, + }, + ], + source_line: 1, + }, + ], + dependencies: ['Page_Footer.svelte', 'Page_Header.svelte', 'Repos_Tree.svelte'], + }, + { + path: 'Tree_Page.svelte', + identifiers: [ + { + name: 'Tree_Page', + kind: 'component', + props: [ + { + name: 'repo', + type: 'Repo', + optional: false, + }, + { + name: 'repos', + type: 'Array', + optional: false, + }, + ], + source_line: 1, + }, + ], + dependencies: ['Page_Footer.svelte', 'Page_Header.svelte', 'Repos_Tree.svelte'], + }, + { + path: 'version_utils.ts', + identifiers: [ + { + name: 'is_wildcard', + kind: 'function', + source_line: 3, + type_signature: '(version: string): boolean', + return_type: 'boolean', + parameters: [ + { + name: 'version', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'strip_version_prefix', + kind: 'function', + doc_comment: 'Strips version prefix (^, ~, >=, <=, etc) from a version string.', + source_line: 10, + type_signature: '(version: string): string', + return_type: 'string', + parameters: [ + { + name: 'version', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'get_version_prefix', + kind: 'function', + doc_comment: 'Gets the version prefix (^, ~, >=, <=, or empty string).', + source_line: 17, + type_signature: '(version: string): string', + return_type: 'string', + parameters: [ + { + name: 'version', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'normalize_version_for_comparison', + kind: 'function', + doc_comment: + 'Normalizes version string for comparison.\n\nStrips prefixes (^, ~, >=) to get bare version number.\nHandles wildcards as-is. Used by needs_update to compare versions.', + examples: [ + "normalize_version_for_comparison('^1.2.3') // '1.2.3'", + "normalize_version_for_comparison('>=2.0.0') // '2.0.0'", + "normalize_version_for_comparison('*') // '*'", + ], + source_line: 32, + type_signature: '(version: string): string', + return_type: 'string', + parameters: [ + { + name: 'version', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'needs_update', + kind: 'function', + source_line: 45, + type_signature: '(current: string, new_version: string): boolean', + return_type: 'boolean', + parameters: [ + { + name: 'current', + type: 'string', + optional: false, + }, + { + name: 'new_version', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'get_update_prefix', + kind: 'function', + doc_comment: + 'Determines version prefix to use when updating dependencies.\n\nStrategy:\n- Wildcard (*): Use caret (^) as default\n- Has existing prefix: Preserve it (^, ~, >=, <=, etc)\n- No prefix: Use default_strategy\n\nThis preserves user intent while handling wildcard replacements sensibly.', + source_line: 68, + type_signature: + '(current_version: string, default_strategy?: "" | "^" | "~" | ">="): string', + return_type: 'string', + parameters: [ + { + name: 'current_version', + type: 'string', + optional: false, + }, + { + name: 'default_strategy', + type: '"" | "^" | "~" | ">="', + optional: false, + description: 'prefix to use when no existing prefix found', + default_value: "'^'", + }, + ], + }, + { + name: 'is_breaking_change', + kind: 'function', + doc_comment: + 'Determines if a bump is a breaking change based on semver rules.\nPre-1.0: minor bumps are breaking\n1.0+: major bumps are breaking', + source_line: 92, + type_signature: '(old_version: string, bump_type: "major" | "minor" | "patch"): boolean', + return_type: 'boolean', + parameters: [ + { + name: 'old_version', + type: 'string', + optional: false, + }, + { + name: 'bump_type', + type: '"major" | "minor" | "patch"', + optional: false, + }, + ], + }, + { + name: 'detect_bump_type', + kind: 'function', + source_line: 108, + type_signature: '(old_version: string, new_version: string): "major" | "minor" | "patch"', + return_type: '"major" | "minor" | "patch"', + parameters: [ + { + name: 'old_version', + type: 'string', + optional: false, + }, + { + name: 'new_version', + type: 'string', + optional: false, + }, + ], + }, + { + name: 'compare_bump_types', + kind: 'function', + doc_comment: + 'Compares bump types. Returns positive if a > b, negative if a < b, 0 if equal.', + source_line: 123, + type_signature: '(a: Bump_Type, b: Bump_Type): number', + return_type: 'number', + parameters: [ + { + name: 'a', + type: 'Bump_Type', + optional: false, + }, + { + name: 'b', + type: 'Bump_Type', + optional: false, + }, + ], + }, + { + name: 'calculate_next_version', + kind: 'function', + source_line: 132, + type_signature: '(current_version: string, bump_type: Bump_Type): string', + return_type: 'string', + parameters: [ + { + name: 'current_version', + type: 'string', + optional: false, + }, + { + name: 'bump_type', + type: 'Bump_Type', + optional: false, + }, + ], + }, + ], + dependents: [ + 'changeset_generator.ts', + 'changeset_reader.ts', + 'dependency_updater.ts', + 'multi_repo_publisher.ts', + 'publishing_plan.ts', + ], + }, + ], +}; diff --git a/src/routes/repos.ts b/src/routes/repos.ts index 2100ffe7..cfb746b8 100644 --- a/src/routes/repos.ts +++ b/src/routes/repos.ts @@ -1107,8 +1107,8 @@ export const repos_json: Array = JSON.parse( "modules": []\ },\ "check_runs": {\ - "status": "completed",\ - "conclusion": "failure"\ + "status": "in_progress",\ + "conclusion": null\ },\ "pull_requests": [\ {\ diff --git a/src/test/changeset_generator.test.ts b/src/test/changeset_generator.test.ts index 8088fb81..6e7f1c16 100644 --- a/src/test/changeset_generator.test.ts +++ b/src/test/changeset_generator.test.ts @@ -2,14 +2,14 @@ import {describe, it, expect} from 'vitest'; import { generate_changeset_content, create_dependency_updates, - type Dependency_Update, + type Dependency_Version_Change, } from '$lib/changeset_generator.js'; import type {Published_Version} from '$lib/multi_repo_publisher.js'; describe('changeset_generator', () => { describe('generate_changeset_content', () => { it('generates content for patch updates', () => { - const updates: Array = [ + const updates: Array = [ { package_name: 'lib-a', from_version: '1.0.0', @@ -37,7 +37,7 @@ describe('changeset_generator', () => { }); it('generates content for breaking changes', () => { - const updates: Array = [ + const updates: Array = [ { package_name: 'lib-breaking', from_version: '0.5.0', @@ -56,7 +56,7 @@ describe('changeset_generator', () => { }); it('generates content for mixed breaking and regular updates', () => { - const updates: Array = [ + const updates: Array = [ { package_name: 'breaking-lib', from_version: '1.0.0', @@ -93,7 +93,7 @@ describe('changeset_generator', () => { }); it('generates valid changeset format', () => { - const updates: Array = [ + const updates: Array = [ { package_name: 'lib', from_version: '1.0.0', @@ -116,7 +116,7 @@ describe('changeset_generator', () => { }); it('escapes package names in frontmatter', () => { - const updates: Array = []; + const updates: Array = []; const content = generate_changeset_content('@scope/package-name', updates, 'patch'); From be343a23747a62346c8551479d3e82f4ceb2192e Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:42:39 -0500 Subject: [PATCH 38/41] wip --- src/routes/+page.svelte | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0d458b55..0e2c5e22 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -20,9 +20,7 @@
  • - docs{#snippet icon()}{pkg.package_json.glyph}{/snippet} + docs{#snippet icon()}{pkg.package_json.glyph}{/snippet}
  • tree From b91d65f1a1a943daf87300265236a63d19da110e Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:43:55 -0500 Subject: [PATCH 39/41] wip --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 1c2d686e..97aaea88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ }, "peerDependencies": { "@ryanatkn/belt": ">=0.38.2", - "@ryanatkn/fuz": ">=0.161.1", + "@ryanatkn/fuz": ">=0.161.2", "@ryanatkn/gro": ">=0.175.0", "@ryanatkn/moss": ">=0.38.0", "@sveltejs/kit": "^2", From a8e9bd1c634b71255bb61534b1dfaabec953e72d Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:56:55 -0500 Subject: [PATCH 40/41] wip --- .gitignore | 2 +- CLAUDE.md | 24 +++++++++---------- src/routes/+page.svelte | 2 +- src/routes/Main_Header.svelte | 8 +++---- src/routes/moss.css | 11 ++++++--- src/{ => test}/fixtures/check.test.ts | 0 .../configs/basic_publishing.config.ts | 0 .../configs/circular_dev_deps.config.ts | 0 .../circular_prod_deps_error.config.ts | 0 .../fixtures/configs/deep_cascade.config.ts | 0 .../configs/isolated_packages.config.ts | 0 .../fixtures/configs/major_bumps.config.ts | 0 .../configs/multiple_dep_types.config.ts | 0 .../fixtures/configs/peer_deps_only.config.ts | 0 .../configs/private_packages.config.ts | 0 .../configs/three_way_dev_cycle.config.ts | 0 .../fixtures/generate_repos.task.ts | 4 ++-- src/{ => test}/fixtures/generate_repos.ts | 2 +- src/{ => test}/fixtures/helpers.ts | 0 src/{ => test}/fixtures/load_repo_fixtures.ts | 0 .../fixtures/mock_changeset_operations.ts | 0 src/{ => test}/fixtures/mock_operations.ts | 0 src/{ => test}/fixtures/repo_fixture_types.ts | 0 src/{ => test}/fixtures/repo_fixtures.test.ts | 0 .../repo_fixtures/basic_publishing.ts | 0 .../repo_fixtures/circular_dev_deps.ts | 0 .../repo_fixtures/circular_prod_deps_error.ts | 0 .../fixtures/repo_fixtures/deep_cascade.ts | 0 .../repo_fixtures/isolated_packages.ts | 0 .../fixtures/repo_fixtures/major_bumps.ts | 0 .../repo_fixtures/multiple_dep_types.ts | 0 .../fixtures/repo_fixtures/peer_deps_only.ts | 0 .../repo_fixtures/private_packages.ts | 0 .../repo_fixtures/three_way_dev_cycle.ts | 0 src/test/multi_repo_publisher.test.ts | 2 +- 35 files changed, 30 insertions(+), 25 deletions(-) rename src/{ => test}/fixtures/check.test.ts (100%) rename src/{ => test}/fixtures/configs/basic_publishing.config.ts (100%) rename src/{ => test}/fixtures/configs/circular_dev_deps.config.ts (100%) rename src/{ => test}/fixtures/configs/circular_prod_deps_error.config.ts (100%) rename src/{ => test}/fixtures/configs/deep_cascade.config.ts (100%) rename src/{ => test}/fixtures/configs/isolated_packages.config.ts (100%) rename src/{ => test}/fixtures/configs/major_bumps.config.ts (100%) rename src/{ => test}/fixtures/configs/multiple_dep_types.config.ts (100%) rename src/{ => test}/fixtures/configs/peer_deps_only.config.ts (100%) rename src/{ => test}/fixtures/configs/private_packages.config.ts (100%) rename src/{ => test}/fixtures/configs/three_way_dev_cycle.config.ts (100%) rename src/{ => test}/fixtures/generate_repos.task.ts (93%) rename src/{ => test}/fixtures/generate_repos.ts (98%) rename src/{ => test}/fixtures/helpers.ts (100%) rename src/{ => test}/fixtures/load_repo_fixtures.ts (100%) rename src/{ => test}/fixtures/mock_changeset_operations.ts (100%) rename src/{ => test}/fixtures/mock_operations.ts (100%) rename src/{ => test}/fixtures/repo_fixture_types.ts (100%) rename src/{ => test}/fixtures/repo_fixtures.test.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/basic_publishing.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/circular_dev_deps.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/circular_prod_deps_error.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/deep_cascade.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/isolated_packages.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/major_bumps.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/multiple_dep_types.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/peer_deps_only.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/private_packages.ts (100%) rename src/{ => test}/fixtures/repo_fixtures/three_way_dev_cycle.ts (100%) diff --git a/.gitignore b/.gitignore index 6a50a2ef..82228118 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ node_modules /.zzz # Generated test repos -/src/fixtures/repos/ +/src/test/fixtures/repos/ # Env .env* diff --git a/CLAUDE.md b/CLAUDE.md index 0e04c65c..f1f29625 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -367,8 +367,8 @@ gro build # build static site gro deploy # deploy to GitHub Pages # Fixture Management -gro src/fixtures/generate_repos # generate test git repos from fixture data -gro test src/fixtures/check # validate gitops commands against fixture expectations +gro src/test/fixtures/generate_repos # generate test git repos from fixture data +gro test src/test/fixtures/check # validate gitops commands against fixture expectations ``` ## Commands Reference @@ -498,7 +498,7 @@ dependency injection (see above). ```bash gro test # run all tests gro test version_utils # run specific test file -gro test src/fixtures/check # validate command output fixtures +gro test src/test/fixtures/check # validate command output fixtures ``` Core modules tested: @@ -517,10 +517,10 @@ reproducible integration tests: **Generated Test Repos:** -- `src/fixtures/repos/` - Auto-generated from fixture data (gitignored) -- `src/fixtures/repo_fixtures/*.ts` - Source of truth for test repo definitions -- `src/fixtures/generate_repos.ts` - Idempotent repo generation logic -- `src/fixtures/configs/*.config.ts` - Isolated gitops config per fixture +- `src/test/fixtures/repos/` - Auto-generated from fixture data (gitignored) +- `src/test/fixtures/repo_fixtures/*.ts` - Source of truth for test repo definitions +- `src/test/fixtures/generate_repos.ts` - Idempotent repo generation logic +- `src/test/fixtures/configs/*.config.ts` - Isolated gitops config per fixture **Fixture Scenarios (9 total):** @@ -538,19 +538,19 @@ reproducible integration tests: **Structured Validation:** -- `src/fixtures/configs/*.config.ts` - Isolated gitops config per fixture -- `src/fixtures/check.test.ts` - Validates JSON output against fixture +- `src/test/fixtures/configs/*.config.ts` - Isolated gitops config per fixture +- `src/test/fixtures/check.test.ts` - Validates JSON output against fixture `expected_outcomes` -- `src/fixtures/helpers.ts` - JSON command runner and assertion helpers +- `src/test/fixtures/helpers.ts` - JSON command runner and assertion helpers **Workflow:** 1. Define fixture data with expected outcomes in `repo_fixtures/*.ts` -2. Run `gro test src/fixtures/check` to validate commands against expected +2. Run `gro test src/test/fixtures/check` to validate commands against expected outcomes Fixture repos are auto-generated on first test run if missing. To manually -regenerate: `gro src/fixtures/generate_repos` +regenerate: `gro src/test/fixtures/generate_repos` Each fixture runs in isolation with its own config, validating: diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0e2c5e22..6168e75b 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -14,7 +14,7 @@
    -
    +
    diff --git a/src/routes/Main_Header.svelte b/src/routes/Main_Header.svelte index b9b639ea..efadffe4 100644 --- a/src/routes/Main_Header.svelte +++ b/src/routes/Main_Header.svelte @@ -3,9 +3,9 @@ import {fuz_logo} from '@ryanatkn/fuz/logos.js'; -
    -
    -

    fuz_gitops

    +
    +
    +

    fuz_gitops

    - a tool for managing many repos 🪄
    +

    a tool for managing many repos 🪄

    diff --git a/src/routes/moss.css b/src/routes/moss.css index eb92658c..158949f4 100644 --- a/src/routes/moss.css +++ b/src/routes/moss.css @@ -208,6 +208,10 @@ a.chip { font-size: var(--font_size_xl); --font_size: var(--font_size_xl); } +.font_size_xl2 { + font-size: var(--font_size_xl2); + --font_size: var(--font_size_xl2); +} .text_align_center { text-align: center; } @@ -254,9 +258,6 @@ a.chip { .p_xl { padding: var(--space_xl); } -.pt_xl { - padding-top: var(--space_xl); -} .pb_0 { padding-bottom: 0; } @@ -326,5 +327,9 @@ a.chip { .gap_md { gap: var(--space_md); } +.font_weight_400 { + font-weight: 400; + --font_weight: 400; +} /* generated by src/routes/moss.gen.css.ts */ diff --git a/src/fixtures/check.test.ts b/src/test/fixtures/check.test.ts similarity index 100% rename from src/fixtures/check.test.ts rename to src/test/fixtures/check.test.ts diff --git a/src/fixtures/configs/basic_publishing.config.ts b/src/test/fixtures/configs/basic_publishing.config.ts similarity index 100% rename from src/fixtures/configs/basic_publishing.config.ts rename to src/test/fixtures/configs/basic_publishing.config.ts diff --git a/src/fixtures/configs/circular_dev_deps.config.ts b/src/test/fixtures/configs/circular_dev_deps.config.ts similarity index 100% rename from src/fixtures/configs/circular_dev_deps.config.ts rename to src/test/fixtures/configs/circular_dev_deps.config.ts diff --git a/src/fixtures/configs/circular_prod_deps_error.config.ts b/src/test/fixtures/configs/circular_prod_deps_error.config.ts similarity index 100% rename from src/fixtures/configs/circular_prod_deps_error.config.ts rename to src/test/fixtures/configs/circular_prod_deps_error.config.ts diff --git a/src/fixtures/configs/deep_cascade.config.ts b/src/test/fixtures/configs/deep_cascade.config.ts similarity index 100% rename from src/fixtures/configs/deep_cascade.config.ts rename to src/test/fixtures/configs/deep_cascade.config.ts diff --git a/src/fixtures/configs/isolated_packages.config.ts b/src/test/fixtures/configs/isolated_packages.config.ts similarity index 100% rename from src/fixtures/configs/isolated_packages.config.ts rename to src/test/fixtures/configs/isolated_packages.config.ts diff --git a/src/fixtures/configs/major_bumps.config.ts b/src/test/fixtures/configs/major_bumps.config.ts similarity index 100% rename from src/fixtures/configs/major_bumps.config.ts rename to src/test/fixtures/configs/major_bumps.config.ts diff --git a/src/fixtures/configs/multiple_dep_types.config.ts b/src/test/fixtures/configs/multiple_dep_types.config.ts similarity index 100% rename from src/fixtures/configs/multiple_dep_types.config.ts rename to src/test/fixtures/configs/multiple_dep_types.config.ts diff --git a/src/fixtures/configs/peer_deps_only.config.ts b/src/test/fixtures/configs/peer_deps_only.config.ts similarity index 100% rename from src/fixtures/configs/peer_deps_only.config.ts rename to src/test/fixtures/configs/peer_deps_only.config.ts diff --git a/src/fixtures/configs/private_packages.config.ts b/src/test/fixtures/configs/private_packages.config.ts similarity index 100% rename from src/fixtures/configs/private_packages.config.ts rename to src/test/fixtures/configs/private_packages.config.ts diff --git a/src/fixtures/configs/three_way_dev_cycle.config.ts b/src/test/fixtures/configs/three_way_dev_cycle.config.ts similarity index 100% rename from src/fixtures/configs/three_way_dev_cycle.config.ts rename to src/test/fixtures/configs/three_way_dev_cycle.config.ts diff --git a/src/fixtures/generate_repos.task.ts b/src/test/fixtures/generate_repos.task.ts similarity index 93% rename from src/fixtures/generate_repos.task.ts rename to src/test/fixtures/generate_repos.task.ts index 5df93c41..e8221eb8 100644 --- a/src/fixtures/generate_repos.task.ts +++ b/src/test/fixtures/generate_repos.task.ts @@ -30,7 +30,7 @@ const FIXTURES = [ * Run this before fixture tests to ensure repos exist. * * Usage: - * gro src/fixtures/generate_repos + * gro src/test/fixtures/generate_repos */ export const task: Task = { summary: 'generate git repositories from fixture data', @@ -41,7 +41,7 @@ export const task: Task = { await generate_all_fixtures(FIXTURES, log); log.info(st('green', '✅ All fixture repositories generated successfully')); - log.info(' Repos are ready for testing in src/fixtures/repos/'); + log.info(' Repos are ready for testing in src/test/fixtures/repos/'); } catch (error) { log.error(st('red', '❌ Failed to generate fixture repositories')); log.error(` Error: ${error}`); diff --git a/src/fixtures/generate_repos.ts b/src/test/fixtures/generate_repos.ts similarity index 98% rename from src/fixtures/generate_repos.ts rename to src/test/fixtures/generate_repos.ts index 026a5ce0..9dd1eee9 100644 --- a/src/fixtures/generate_repos.ts +++ b/src/test/fixtures/generate_repos.ts @@ -5,7 +5,7 @@ import type {Logger} from '@ryanatkn/belt/log.js'; import type {Repo_Fixture_Set, Repo_Fixture_Data} from './repo_fixture_types.js'; -const FIXTURES_BASE_DIR = 'src/fixtures/repos'; +const FIXTURES_BASE_DIR = 'src/test/fixtures/repos'; /** * Generate all repositories for multiple fixture sets. diff --git a/src/fixtures/helpers.ts b/src/test/fixtures/helpers.ts similarity index 100% rename from src/fixtures/helpers.ts rename to src/test/fixtures/helpers.ts diff --git a/src/fixtures/load_repo_fixtures.ts b/src/test/fixtures/load_repo_fixtures.ts similarity index 100% rename from src/fixtures/load_repo_fixtures.ts rename to src/test/fixtures/load_repo_fixtures.ts diff --git a/src/fixtures/mock_changeset_operations.ts b/src/test/fixtures/mock_changeset_operations.ts similarity index 100% rename from src/fixtures/mock_changeset_operations.ts rename to src/test/fixtures/mock_changeset_operations.ts diff --git a/src/fixtures/mock_operations.ts b/src/test/fixtures/mock_operations.ts similarity index 100% rename from src/fixtures/mock_operations.ts rename to src/test/fixtures/mock_operations.ts diff --git a/src/fixtures/repo_fixture_types.ts b/src/test/fixtures/repo_fixture_types.ts similarity index 100% rename from src/fixtures/repo_fixture_types.ts rename to src/test/fixtures/repo_fixture_types.ts diff --git a/src/fixtures/repo_fixtures.test.ts b/src/test/fixtures/repo_fixtures.test.ts similarity index 100% rename from src/fixtures/repo_fixtures.test.ts rename to src/test/fixtures/repo_fixtures.test.ts diff --git a/src/fixtures/repo_fixtures/basic_publishing.ts b/src/test/fixtures/repo_fixtures/basic_publishing.ts similarity index 100% rename from src/fixtures/repo_fixtures/basic_publishing.ts rename to src/test/fixtures/repo_fixtures/basic_publishing.ts diff --git a/src/fixtures/repo_fixtures/circular_dev_deps.ts b/src/test/fixtures/repo_fixtures/circular_dev_deps.ts similarity index 100% rename from src/fixtures/repo_fixtures/circular_dev_deps.ts rename to src/test/fixtures/repo_fixtures/circular_dev_deps.ts diff --git a/src/fixtures/repo_fixtures/circular_prod_deps_error.ts b/src/test/fixtures/repo_fixtures/circular_prod_deps_error.ts similarity index 100% rename from src/fixtures/repo_fixtures/circular_prod_deps_error.ts rename to src/test/fixtures/repo_fixtures/circular_prod_deps_error.ts diff --git a/src/fixtures/repo_fixtures/deep_cascade.ts b/src/test/fixtures/repo_fixtures/deep_cascade.ts similarity index 100% rename from src/fixtures/repo_fixtures/deep_cascade.ts rename to src/test/fixtures/repo_fixtures/deep_cascade.ts diff --git a/src/fixtures/repo_fixtures/isolated_packages.ts b/src/test/fixtures/repo_fixtures/isolated_packages.ts similarity index 100% rename from src/fixtures/repo_fixtures/isolated_packages.ts rename to src/test/fixtures/repo_fixtures/isolated_packages.ts diff --git a/src/fixtures/repo_fixtures/major_bumps.ts b/src/test/fixtures/repo_fixtures/major_bumps.ts similarity index 100% rename from src/fixtures/repo_fixtures/major_bumps.ts rename to src/test/fixtures/repo_fixtures/major_bumps.ts diff --git a/src/fixtures/repo_fixtures/multiple_dep_types.ts b/src/test/fixtures/repo_fixtures/multiple_dep_types.ts similarity index 100% rename from src/fixtures/repo_fixtures/multiple_dep_types.ts rename to src/test/fixtures/repo_fixtures/multiple_dep_types.ts diff --git a/src/fixtures/repo_fixtures/peer_deps_only.ts b/src/test/fixtures/repo_fixtures/peer_deps_only.ts similarity index 100% rename from src/fixtures/repo_fixtures/peer_deps_only.ts rename to src/test/fixtures/repo_fixtures/peer_deps_only.ts diff --git a/src/fixtures/repo_fixtures/private_packages.ts b/src/test/fixtures/repo_fixtures/private_packages.ts similarity index 100% rename from src/fixtures/repo_fixtures/private_packages.ts rename to src/test/fixtures/repo_fixtures/private_packages.ts diff --git a/src/fixtures/repo_fixtures/three_way_dev_cycle.ts b/src/test/fixtures/repo_fixtures/three_way_dev_cycle.ts similarity index 100% rename from src/fixtures/repo_fixtures/three_way_dev_cycle.ts rename to src/test/fixtures/repo_fixtures/three_way_dev_cycle.ts diff --git a/src/test/multi_repo_publisher.test.ts b/src/test/multi_repo_publisher.test.ts index e13bb6bd..9fb75493 100644 --- a/src/test/multi_repo_publisher.test.ts +++ b/src/test/multi_repo_publisher.test.ts @@ -330,7 +330,7 @@ test('deploys all repos when deploy flag is set (Phase 3)', async () => { test('deploys only repos with changes (skips unchanged repos)', async () => { // This test covers selective deployment including dev dep changes - // Full integration coverage in fixture tests (src/fixtures/check.test.ts) + // Full integration coverage in fixture tests (src/test/fixtures/check.test.ts) const repos: Array = [ create_mock_repo({name: 'lib', version: '1.0.0'}), create_mock_repo({name: 'app-with-dep', version: '1.0.0', deps: {lib: '^1.0.0'}}), From 4a3845852dde17ddfa6f01adc03cc456915e7f8d Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 24 Nov 2025 18:57:32 -0500 Subject: [PATCH 41/41] wip --- src/fixtures/repos/basic_publishing/repo_a | 1 + src/fixtures/repos/basic_publishing/repo_b | 1 + src/fixtures/repos/basic_publishing/repo_c | 1 + src/fixtures/repos/basic_publishing/repo_d | 1 + src/fixtures/repos/basic_publishing/repo_e | 1 + src/fixtures/repos/circular_dev_deps/consumer | 1 + src/fixtures/repos/circular_dev_deps/tool_a | 1 + src/fixtures/repos/circular_dev_deps/tool_b | 1 + src/fixtures/repos/circular_prod_deps_error/pkg_a | 1 + src/fixtures/repos/circular_prod_deps_error/pkg_b | 1 + src/fixtures/repos/deep_cascade/branch | 1 + src/fixtures/repos/deep_cascade/leaf | 1 + src/fixtures/repos/deep_cascade/root | 1 + src/fixtures/repos/deep_cascade/trunk | 1 + src/fixtures/repos/isolated_packages/util_a | 1 + src/fixtures/repos/isolated_packages/util_b | 1 + src/fixtures/repos/isolated_packages/util_c | 1 + src/fixtures/repos/isolated_packages/util_d | 1 + src/fixtures/repos/major_bumps/app_using_stable | 1 + src/fixtures/repos/major_bumps/app_using_unstable | 1 + src/fixtures/repos/major_bumps/complex_app | 1 + src/fixtures/repos/major_bumps/stable | 1 + src/fixtures/repos/major_bumps/unstable | 1 + src/fixtures/repos/multiple_dep_types/adapter | 1 + src/fixtures/repos/multiple_dep_types/core | 1 + src/fixtures/repos/multiple_dep_types/plugin | 1 + src/fixtures/repos/peer_deps_only/adapter | 1 + src/fixtures/repos/peer_deps_only/core | 1 + src/fixtures/repos/peer_deps_only/plugin_a | 1 + src/fixtures/repos/peer_deps_only/plugin_b | 1 + src/fixtures/repos/peer_deps_only/utils | 1 + src/fixtures/repos/private_packages/consumer | 1 + src/fixtures/repos/private_packages/private_tool | 1 + src/fixtures/repos/private_packages/public_lib | 1 + src/fixtures/repos/three_way_dev_cycle/app | 1 + src/fixtures/repos/three_way_dev_cycle/tool_x | 1 + src/fixtures/repos/three_way_dev_cycle/tool_y | 1 + src/fixtures/repos/three_way_dev_cycle/tool_z | 1 + 38 files changed, 38 insertions(+) create mode 160000 src/fixtures/repos/basic_publishing/repo_a create mode 160000 src/fixtures/repos/basic_publishing/repo_b create mode 160000 src/fixtures/repos/basic_publishing/repo_c create mode 160000 src/fixtures/repos/basic_publishing/repo_d create mode 160000 src/fixtures/repos/basic_publishing/repo_e create mode 160000 src/fixtures/repos/circular_dev_deps/consumer create mode 160000 src/fixtures/repos/circular_dev_deps/tool_a create mode 160000 src/fixtures/repos/circular_dev_deps/tool_b create mode 160000 src/fixtures/repos/circular_prod_deps_error/pkg_a create mode 160000 src/fixtures/repos/circular_prod_deps_error/pkg_b create mode 160000 src/fixtures/repos/deep_cascade/branch create mode 160000 src/fixtures/repos/deep_cascade/leaf create mode 160000 src/fixtures/repos/deep_cascade/root create mode 160000 src/fixtures/repos/deep_cascade/trunk create mode 160000 src/fixtures/repos/isolated_packages/util_a create mode 160000 src/fixtures/repos/isolated_packages/util_b create mode 160000 src/fixtures/repos/isolated_packages/util_c create mode 160000 src/fixtures/repos/isolated_packages/util_d create mode 160000 src/fixtures/repos/major_bumps/app_using_stable create mode 160000 src/fixtures/repos/major_bumps/app_using_unstable create mode 160000 src/fixtures/repos/major_bumps/complex_app create mode 160000 src/fixtures/repos/major_bumps/stable create mode 160000 src/fixtures/repos/major_bumps/unstable create mode 160000 src/fixtures/repos/multiple_dep_types/adapter create mode 160000 src/fixtures/repos/multiple_dep_types/core create mode 160000 src/fixtures/repos/multiple_dep_types/plugin create mode 160000 src/fixtures/repos/peer_deps_only/adapter create mode 160000 src/fixtures/repos/peer_deps_only/core create mode 160000 src/fixtures/repos/peer_deps_only/plugin_a create mode 160000 src/fixtures/repos/peer_deps_only/plugin_b create mode 160000 src/fixtures/repos/peer_deps_only/utils create mode 160000 src/fixtures/repos/private_packages/consumer create mode 160000 src/fixtures/repos/private_packages/private_tool create mode 160000 src/fixtures/repos/private_packages/public_lib create mode 160000 src/fixtures/repos/three_way_dev_cycle/app create mode 160000 src/fixtures/repos/three_way_dev_cycle/tool_x create mode 160000 src/fixtures/repos/three_way_dev_cycle/tool_y create mode 160000 src/fixtures/repos/three_way_dev_cycle/tool_z diff --git a/src/fixtures/repos/basic_publishing/repo_a b/src/fixtures/repos/basic_publishing/repo_a new file mode 160000 index 00000000..8f164320 --- /dev/null +++ b/src/fixtures/repos/basic_publishing/repo_a @@ -0,0 +1 @@ +Subproject commit 8f1643204ce13d3a1d48b1a9e3662c856d710fe6 diff --git a/src/fixtures/repos/basic_publishing/repo_b b/src/fixtures/repos/basic_publishing/repo_b new file mode 160000 index 00000000..9d73044d --- /dev/null +++ b/src/fixtures/repos/basic_publishing/repo_b @@ -0,0 +1 @@ +Subproject commit 9d73044d8b3f24f313d0199641a66a4f2aae1050 diff --git a/src/fixtures/repos/basic_publishing/repo_c b/src/fixtures/repos/basic_publishing/repo_c new file mode 160000 index 00000000..c9c7475d --- /dev/null +++ b/src/fixtures/repos/basic_publishing/repo_c @@ -0,0 +1 @@ +Subproject commit c9c7475d56644735791285261ba1cb71d024322e diff --git a/src/fixtures/repos/basic_publishing/repo_d b/src/fixtures/repos/basic_publishing/repo_d new file mode 160000 index 00000000..e3b9e051 --- /dev/null +++ b/src/fixtures/repos/basic_publishing/repo_d @@ -0,0 +1 @@ +Subproject commit e3b9e0512147226ac5a09b50280b8883cbc001ee diff --git a/src/fixtures/repos/basic_publishing/repo_e b/src/fixtures/repos/basic_publishing/repo_e new file mode 160000 index 00000000..41bced63 --- /dev/null +++ b/src/fixtures/repos/basic_publishing/repo_e @@ -0,0 +1 @@ +Subproject commit 41bced6382abeaa2f2b233dc6cb2ccc080c6c724 diff --git a/src/fixtures/repos/circular_dev_deps/consumer b/src/fixtures/repos/circular_dev_deps/consumer new file mode 160000 index 00000000..fa482d78 --- /dev/null +++ b/src/fixtures/repos/circular_dev_deps/consumer @@ -0,0 +1 @@ +Subproject commit fa482d78948938913e16b1fea12b482800f6564f diff --git a/src/fixtures/repos/circular_dev_deps/tool_a b/src/fixtures/repos/circular_dev_deps/tool_a new file mode 160000 index 00000000..8dff8a26 --- /dev/null +++ b/src/fixtures/repos/circular_dev_deps/tool_a @@ -0,0 +1 @@ +Subproject commit 8dff8a2635423426e7c0fb492538a7cb5b1be288 diff --git a/src/fixtures/repos/circular_dev_deps/tool_b b/src/fixtures/repos/circular_dev_deps/tool_b new file mode 160000 index 00000000..3bafcb88 --- /dev/null +++ b/src/fixtures/repos/circular_dev_deps/tool_b @@ -0,0 +1 @@ +Subproject commit 3bafcb881f0dabbd58b5d5b79beeed8c47117d41 diff --git a/src/fixtures/repos/circular_prod_deps_error/pkg_a b/src/fixtures/repos/circular_prod_deps_error/pkg_a new file mode 160000 index 00000000..62197880 --- /dev/null +++ b/src/fixtures/repos/circular_prod_deps_error/pkg_a @@ -0,0 +1 @@ +Subproject commit 62197880d5c273c2fbb3ddeef8fcc206f0069e24 diff --git a/src/fixtures/repos/circular_prod_deps_error/pkg_b b/src/fixtures/repos/circular_prod_deps_error/pkg_b new file mode 160000 index 00000000..6f65a80d --- /dev/null +++ b/src/fixtures/repos/circular_prod_deps_error/pkg_b @@ -0,0 +1 @@ +Subproject commit 6f65a80d9d10dccd37b6aa6ef049ddcb0d05406b diff --git a/src/fixtures/repos/deep_cascade/branch b/src/fixtures/repos/deep_cascade/branch new file mode 160000 index 00000000..6d94c2e2 --- /dev/null +++ b/src/fixtures/repos/deep_cascade/branch @@ -0,0 +1 @@ +Subproject commit 6d94c2e2d967e6cf3b7ea0c3bafbd7fb7975b499 diff --git a/src/fixtures/repos/deep_cascade/leaf b/src/fixtures/repos/deep_cascade/leaf new file mode 160000 index 00000000..84fb63c6 --- /dev/null +++ b/src/fixtures/repos/deep_cascade/leaf @@ -0,0 +1 @@ +Subproject commit 84fb63c663bc205a95afce8b5481bc3c058a0f86 diff --git a/src/fixtures/repos/deep_cascade/root b/src/fixtures/repos/deep_cascade/root new file mode 160000 index 00000000..d9f45304 --- /dev/null +++ b/src/fixtures/repos/deep_cascade/root @@ -0,0 +1 @@ +Subproject commit d9f45304b043fae1597a359a272020983c829459 diff --git a/src/fixtures/repos/deep_cascade/trunk b/src/fixtures/repos/deep_cascade/trunk new file mode 160000 index 00000000..132c128d --- /dev/null +++ b/src/fixtures/repos/deep_cascade/trunk @@ -0,0 +1 @@ +Subproject commit 132c128d958d08a98a8780859e9bb9f32686b15a diff --git a/src/fixtures/repos/isolated_packages/util_a b/src/fixtures/repos/isolated_packages/util_a new file mode 160000 index 00000000..42f3cde0 --- /dev/null +++ b/src/fixtures/repos/isolated_packages/util_a @@ -0,0 +1 @@ +Subproject commit 42f3cde061bf0b70e37e4b70d2c81596ea93f3d5 diff --git a/src/fixtures/repos/isolated_packages/util_b b/src/fixtures/repos/isolated_packages/util_b new file mode 160000 index 00000000..77079e39 --- /dev/null +++ b/src/fixtures/repos/isolated_packages/util_b @@ -0,0 +1 @@ +Subproject commit 77079e392dc7ebaf7398ec1dccc98cfaecf56a01 diff --git a/src/fixtures/repos/isolated_packages/util_c b/src/fixtures/repos/isolated_packages/util_c new file mode 160000 index 00000000..4bf5333c --- /dev/null +++ b/src/fixtures/repos/isolated_packages/util_c @@ -0,0 +1 @@ +Subproject commit 4bf5333c1000d62ebdce9292ccaaea02ebceffb2 diff --git a/src/fixtures/repos/isolated_packages/util_d b/src/fixtures/repos/isolated_packages/util_d new file mode 160000 index 00000000..0c3bb145 --- /dev/null +++ b/src/fixtures/repos/isolated_packages/util_d @@ -0,0 +1 @@ +Subproject commit 0c3bb1453cee60b2d53551936e9eafc5ef3bba00 diff --git a/src/fixtures/repos/major_bumps/app_using_stable b/src/fixtures/repos/major_bumps/app_using_stable new file mode 160000 index 00000000..92e97790 --- /dev/null +++ b/src/fixtures/repos/major_bumps/app_using_stable @@ -0,0 +1 @@ +Subproject commit 92e977901aa284f3d9400513a2e0b1c6e29d3481 diff --git a/src/fixtures/repos/major_bumps/app_using_unstable b/src/fixtures/repos/major_bumps/app_using_unstable new file mode 160000 index 00000000..4fdf11b1 --- /dev/null +++ b/src/fixtures/repos/major_bumps/app_using_unstable @@ -0,0 +1 @@ +Subproject commit 4fdf11b15b1291cbcc9759ec49db7cd35127e83c diff --git a/src/fixtures/repos/major_bumps/complex_app b/src/fixtures/repos/major_bumps/complex_app new file mode 160000 index 00000000..9218e217 --- /dev/null +++ b/src/fixtures/repos/major_bumps/complex_app @@ -0,0 +1 @@ +Subproject commit 9218e217af01391ae8878354fdc8be77cf65efbb diff --git a/src/fixtures/repos/major_bumps/stable b/src/fixtures/repos/major_bumps/stable new file mode 160000 index 00000000..e2e6eff9 --- /dev/null +++ b/src/fixtures/repos/major_bumps/stable @@ -0,0 +1 @@ +Subproject commit e2e6eff910f22c734df3cd0f6b48e2a9b70e61ff diff --git a/src/fixtures/repos/major_bumps/unstable b/src/fixtures/repos/major_bumps/unstable new file mode 160000 index 00000000..a5380412 --- /dev/null +++ b/src/fixtures/repos/major_bumps/unstable @@ -0,0 +1 @@ +Subproject commit a5380412e32e1f644c5e19cb5bb10606edf80b3b diff --git a/src/fixtures/repos/multiple_dep_types/adapter b/src/fixtures/repos/multiple_dep_types/adapter new file mode 160000 index 00000000..533d2932 --- /dev/null +++ b/src/fixtures/repos/multiple_dep_types/adapter @@ -0,0 +1 @@ +Subproject commit 533d2932f5a603b145f260635ad52e54bb024e36 diff --git a/src/fixtures/repos/multiple_dep_types/core b/src/fixtures/repos/multiple_dep_types/core new file mode 160000 index 00000000..c836238e --- /dev/null +++ b/src/fixtures/repos/multiple_dep_types/core @@ -0,0 +1 @@ +Subproject commit c836238e929c06a06f885d04acb82bb3d82b6de1 diff --git a/src/fixtures/repos/multiple_dep_types/plugin b/src/fixtures/repos/multiple_dep_types/plugin new file mode 160000 index 00000000..408f2df3 --- /dev/null +++ b/src/fixtures/repos/multiple_dep_types/plugin @@ -0,0 +1 @@ +Subproject commit 408f2df3548087d2d8a466d0c27bf13f44468436 diff --git a/src/fixtures/repos/peer_deps_only/adapter b/src/fixtures/repos/peer_deps_only/adapter new file mode 160000 index 00000000..5f779b83 --- /dev/null +++ b/src/fixtures/repos/peer_deps_only/adapter @@ -0,0 +1 @@ +Subproject commit 5f779b8308560694e714b18a4f5a5a1fb4477264 diff --git a/src/fixtures/repos/peer_deps_only/core b/src/fixtures/repos/peer_deps_only/core new file mode 160000 index 00000000..f74d7c1c --- /dev/null +++ b/src/fixtures/repos/peer_deps_only/core @@ -0,0 +1 @@ +Subproject commit f74d7c1c074a266dab4e39a0560b3f880f5bab52 diff --git a/src/fixtures/repos/peer_deps_only/plugin_a b/src/fixtures/repos/peer_deps_only/plugin_a new file mode 160000 index 00000000..7eeb06a3 --- /dev/null +++ b/src/fixtures/repos/peer_deps_only/plugin_a @@ -0,0 +1 @@ +Subproject commit 7eeb06a3bfdb13eab881dd239496e4e018716afe diff --git a/src/fixtures/repos/peer_deps_only/plugin_b b/src/fixtures/repos/peer_deps_only/plugin_b new file mode 160000 index 00000000..5e6716a9 --- /dev/null +++ b/src/fixtures/repos/peer_deps_only/plugin_b @@ -0,0 +1 @@ +Subproject commit 5e6716a96a5b626c000b07f1f69fd57d4b15885e diff --git a/src/fixtures/repos/peer_deps_only/utils b/src/fixtures/repos/peer_deps_only/utils new file mode 160000 index 00000000..bc9e652a --- /dev/null +++ b/src/fixtures/repos/peer_deps_only/utils @@ -0,0 +1 @@ +Subproject commit bc9e652a7fc15ea3600c238cf740d9ebfdeaa5a8 diff --git a/src/fixtures/repos/private_packages/consumer b/src/fixtures/repos/private_packages/consumer new file mode 160000 index 00000000..2e9e31a9 --- /dev/null +++ b/src/fixtures/repos/private_packages/consumer @@ -0,0 +1 @@ +Subproject commit 2e9e31a93fb5614f7e4baf0f7536aca0e93efed2 diff --git a/src/fixtures/repos/private_packages/private_tool b/src/fixtures/repos/private_packages/private_tool new file mode 160000 index 00000000..a698e5e9 --- /dev/null +++ b/src/fixtures/repos/private_packages/private_tool @@ -0,0 +1 @@ +Subproject commit a698e5e9d5c9b6cf90fd4b4cb1c47cac4e9dd6e4 diff --git a/src/fixtures/repos/private_packages/public_lib b/src/fixtures/repos/private_packages/public_lib new file mode 160000 index 00000000..da8048c6 --- /dev/null +++ b/src/fixtures/repos/private_packages/public_lib @@ -0,0 +1 @@ +Subproject commit da8048c6fe2c445fb8ce160855a14c42fecf0dfd diff --git a/src/fixtures/repos/three_way_dev_cycle/app b/src/fixtures/repos/three_way_dev_cycle/app new file mode 160000 index 00000000..107e38ec --- /dev/null +++ b/src/fixtures/repos/three_way_dev_cycle/app @@ -0,0 +1 @@ +Subproject commit 107e38ecbeaeb866ccc5d1a077e9d4e50e3a0cea diff --git a/src/fixtures/repos/three_way_dev_cycle/tool_x b/src/fixtures/repos/three_way_dev_cycle/tool_x new file mode 160000 index 00000000..d7da3d11 --- /dev/null +++ b/src/fixtures/repos/three_way_dev_cycle/tool_x @@ -0,0 +1 @@ +Subproject commit d7da3d1185b65597b49feed4dc29209ce5022572 diff --git a/src/fixtures/repos/three_way_dev_cycle/tool_y b/src/fixtures/repos/three_way_dev_cycle/tool_y new file mode 160000 index 00000000..90bd8336 --- /dev/null +++ b/src/fixtures/repos/three_way_dev_cycle/tool_y @@ -0,0 +1 @@ +Subproject commit 90bd833693d4b5b7e20565611b388ea6787e62f1 diff --git a/src/fixtures/repos/three_way_dev_cycle/tool_z b/src/fixtures/repos/three_way_dev_cycle/tool_z new file mode 160000 index 00000000..3070ff2e --- /dev/null +++ b/src/fixtures/repos/three_way_dev_cycle/tool_z @@ -0,0 +1 @@ +Subproject commit 3070ff2e8dafe965171ffe842067b3eb1cf140dc