From 1ece2821cf851db04b7e1e4277557f2e6c2953a7 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sat, 3 Jan 2026 08:00:00 -0500 Subject: [PATCH 01/20] wip --- package-lock.json | 44 ++++++++ package.json | 1 + src/lib/library_json.ts | 124 --------------------- src/lib/source_json.ts | 216 ------------------------------------- src/routes/library.gen.ts | 3 +- src/routes/library_json.ts | 2 - src/routes/source_json.ts | 2 - 7 files changed, 47 insertions(+), 345 deletions(-) delete mode 100644 src/lib/library_json.ts delete mode 100644 src/lib/source_json.ts delete mode 100644 src/routes/library_json.ts delete mode 100644 src/routes/source_json.ts diff --git a/package-lock.json b/package-lock.json index a0986dc7..b0ed2024 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { + "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", "@types/node": "^24", "esm-env": "^1.2.2", "zod": "^4.0.14" @@ -58,6 +59,45 @@ } } }, + "../svelte-docinfo": { + "name": "@fuzdev/svelte-docinfo", + "version": "0.0.1", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "svelte2tsx": "^0.7.30", + "typescript": "^5.9.3", + "zod": "^4.1.12" + }, + "devDependencies": { + "@fuzdev/fuz_code": "^0.38.0", + "@fuzdev/fuz_css": "^0.43.0", + "@fuzdev/fuz_ui": "^0.177.0", + "@fuzdev/fuz_util": "^0.45.1", + "@ryanatkn/eslint-config": "^0.9.0", + "@ryanatkn/gro": "^0.184.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.1", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.1", + "svelte": "^5.45.6", + "svelte-check": "^4.3.4", + "tslib": "^2.8.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vitest": "^4.0.15" + }, + "engines": { + "node": ">=22.15" + }, + "peerDependencies": { + "@fuzdev/fuz_util": "^0.45.0", + "svelte": "^5.0.0" + } + }, "node_modules/@changesets/changelog-git": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", @@ -849,6 +889,10 @@ } } }, + "node_modules/@fuzdev/svelte-docinfo": { + "resolved": "../svelte-docinfo", + "link": true + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", diff --git a/package.json b/package.json index 167a1b0f..06957371 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "web" ], "peerDependencies": { + "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", "@types/node": "^24", "esm-env": "^1.2.2", "zod": "^4.0.14" diff --git a/src/lib/library_json.ts b/src/lib/library_json.ts deleted file mode 100644 index eee12c45..00000000 --- a/src/lib/library_json.ts +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Library metadata combining package.json with analyzed source. - * - * @module - */ - -import {ensure_end, strip_end, strip_start} from './string.js'; -import type {PackageJson} from './package_json.js'; -import type {SourceJson} from './source_json.js'; -import type {Url} from './url.js'; - -/** - * A library's package.json and source metadata with computed properties. - */ -export interface LibraryJson { - /** Package name, e.g. `@fuzdev/fuz_ui`. */ - name: string; - /** Name without scope, e.g. `fuz`. */ - repo_name: string; - /** GitHub repo URL, e.g. `https://github.com/fuzdev/fuz_ui`. */ - repo_url: Url; - /** GitHub user/org, e.g. `ryanatkn`. */ - owner_name: string | null; - homepage_url: Url | null; - /** Logo URL, falls back to `favicon.png`. */ - logo_url: Url | null; - logo_alt: string; - npm_url: Url | null; - changelog_url: Url | null; - /** True if has exports and version is not `0.0.1`. */ - published: boolean; - package_json: PackageJson; - source_json: SourceJson; -} - -/** - * Creates a `LibraryJson` with computed properties from package.json and source metadata. - */ -export const library_json_parse = ( - package_json: PackageJson, - source_json: SourceJson, -): LibraryJson => { - const {name} = package_json; - - // TODO hacky - const parse_repo = (r: string | null | undefined) => { - if (!r) return null; - return strip_end(strip_start(strip_end(r, '.git'), 'git+'), '/'); - }; - - const repo_url = parse_repo( - package_json.repository - ? typeof package_json.repository === 'string' - ? package_json.repository - : package_json.repository.url - : null, - ); - if (!repo_url) { - throw Error('failed to parse library_json - `repo_url` is required in package_json'); - } - - const homepage_url = package_json.homepage ?? null; - - const published = - !package_json.private && !!package_json.exports && package_json.version !== '0.0.1'; - - // TODO generic registries - const npm_url = published ? 'https://www.npmjs.com/package/' + package_json.name : null; - - const changelog_url = published && repo_url ? repo_url + '/blob/main/CHANGELOG.md' : null; - - const repo_name = library_repo_name_parse(name); - - const owner_name = repo_url ? strip_start(repo_url, 'https://github.com/').split('/')[0]! : null; - - const logo_url = homepage_url - ? ensure_end(homepage_url, '/') + - (package_json.logo ? strip_start(package_json.logo, '/') : 'favicon.png') - : null; - - const logo_alt = package_json.logo_alt ?? `logo for ${repo_name}`; - - return { - name, - repo_name, - repo_url, - owner_name, - homepage_url, - logo_url, - logo_alt, - npm_url, - changelog_url, - published, - package_json, - source_json, - }; -}; - -/** - * Extracts repo name from a package name, e.g. `@fuzdev/fuz_ui` → `fuz`. - */ -export const library_repo_name_parse = (name: string): string => { - if (name[0] === '@') { - const parts = name.split('/'); - if (parts.length < 2) { - throw new Error(`invalid scoped package name: "${name}" (expected format: @org/package)`); - } - return parts[1]!; - } - return name; -}; - -/** - * Extracts GitHub org URL from a library, e.g. `https://github.com/ryanatkn`. - */ -export const library_org_url_parse = (library: LibraryJson): string | null => { - const {repo_name, repo_url} = library; - if (!repo_url) return null; - const suffix = '/' + repo_name; - if (repo_url.endsWith(suffix)) { - return strip_end(repo_url, suffix); - } - return null; -}; diff --git a/src/lib/source_json.ts b/src/lib/source_json.ts deleted file mode 100644 index 77cafa96..00000000 --- a/src/lib/source_json.ts +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Metadata types for library source code analysis. - * - * These types represent the structure of `src/lib/` exports, - * extracted at build time via TypeScript compiler analysis. - * Used for generating API documentation and enabling code search. - * - * Hierarchy: SourceJson → ModuleJson → DeclarationJson - * - * @module - */ - -import {z} from 'zod'; - -/** - * The kind of exported declaration. - */ -export const DeclarationKind = z.enum([ - 'type', - 'function', - 'variable', - 'class', - 'constructor', - 'component', - 'json', - 'css', -]); -export type DeclarationKind = z.infer; - -/** - * Generic type parameter information. - */ -export const GenericParamInfo = z.looseObject({ - /** Parameter name like `T`. */ - name: z.string(), - /** Constraint like `string` from `T extends string`. */ - constraint: z.string().optional(), - /** Default type like `unknown` from `T = unknown`. */ - default_type: z.string().optional(), -}); -export type GenericParamInfo = z.infer; - -/** - * Parameter information for functions and methods. - * - * Kept distinct from ComponentPropInfo despite structural similarity. - * Function parameters form a tuple with positional semantics: - * calling order matters (`fn(a, b)` vs `fn(b, a)`), - * may include rest parameters and destructuring patterns. - */ -export const ParameterInfo = z.looseObject({ - name: z.string(), - type: z.string(), - optional: z.boolean().optional(), - description: z.string().optional(), - default_value: z.string().optional(), -}); -export type ParameterInfo = z.infer; - -/** - * Component prop information for Svelte components. - * - * Kept distinct from ParameterInfo despite structural similarity. - * Component props are named attributes with different semantics: - * no positional order when passing (`` = ``), - * support two-way binding via `$bindable` rune. - */ -export const ComponentPropInfo = z.looseObject({ - name: z.string(), - type: z.string(), - optional: z.boolean().optional(), - description: z.string().optional(), - default_value: z.string().optional(), - bindable: z.boolean().optional(), -}); -export type ComponentPropInfo = z.infer; - -/** - * Metadata for an exported declaration (function, type, class, component, etc.). - * - * Extracted from TypeScript source and JSDoc/TSDoc comments at build time. - */ -export const DeclarationJson = z.looseObject({ - /** The exported name. */ - name: z.string(), - kind: DeclarationKind, - /** JSDoc/TSDoc comment in mdz format. */ - doc_comment: z.string().optional(), - /** Full TypeScript type signature. */ - type_signature: z.string().optional(), - /** TypeScript modifiers like `readonly`, `private`, or `static`. */ - modifiers: z.array(z.string()).optional(), - /** 1-indexed line number in source file. */ - source_line: z.number().optional(), - /** Function/method parameters. */ - parameters: z.array(ParameterInfo).optional(), - /** Function/method return type. */ - return_type: z.string().optional(), - /** Return value description from `@returns` tag. */ - return_description: z.string().optional(), - /** Generic type parameters like ``. */ - generic_params: z.array(GenericParamInfo).optional(), - /** Code examples from `@example` tags. */ - examples: z.array(z.string()).optional(), - /** Deprecation message from `@deprecated` tag. */ - deprecated_message: z.string().optional(), - /** Related items from `@see` tags, in raw TSDoc format. */ - see_also: z.array(z.string()).optional(), - /** Exceptions from `@throws` tags. */ - throws: z.array(z.looseObject({type: z.string().optional(), description: z.string()})).optional(), - /** Version introduced, from `@since` tag. */ - since: z.string().optional(), - /** Extended classes/interfaces. */ - extends: z.array(z.string()).optional(), - /** Implemented interfaces. */ - implements: z.array(z.string()).optional(), - /** Class or interface members (recursive). */ - get members() { - return z.array(DeclarationJson).optional(); - }, - /** Type/interface properties (recursive). */ - get properties() { - return z.array(DeclarationJson).optional(); - }, - /** Svelte component props. */ - props: z.array(ComponentPropInfo).optional(), - /** - * Module paths (relative to src/lib) that re-export this declaration. - * The canonical location is this module's `declarations` array. - */ - also_exported_from: z.array(z.string()).optional(), - /** - * For renamed re-exports (`export {foo as bar}`), the original declaration. - */ - alias_of: z - .object({ - module: z.string(), - name: z.string(), - }) - .optional(), -}); -export type DeclarationJson = z.infer; - -/** - * A source file in `src/lib/` with its exported declarations. - */ -export const ModuleJson = z.looseObject({ - /** Path relative to src/lib (e.g., `helpers.ts`). */ - path: z.string(), - declarations: z.array(DeclarationJson).optional(), - /** File-level JSDoc comment. */ - module_comment: z.string().optional(), - /** Modules this imports (paths relative to src/lib). */ - dependencies: z.array(z.string()).optional(), - /** Modules that import this (paths relative to src/lib). */ - dependents: z.array(z.string()).optional(), - /** - * Modules fully re-exported via `export * from './module'`. - * Paths are relative to src/lib. - */ - star_exports: z.array(z.string()).optional(), -}); -export type ModuleJson = z.infer; - -/** - * Metadata for a library's `src/lib/` exports. - */ -export const SourceJson = z.looseObject({ - name: z.string(), - version: z.string(), - modules: z.array(ModuleJson).optional(), -}); -export type SourceJson = z.infer; - -/** - * Format declaration name with generic parameters for display. - * @example declaration_get_display_name({name: 'Map', kind: 'type', generic_params: [{name: 'K'}, {name: 'V'}]}) - * // => 'Map' - */ -export const declaration_get_display_name = (declaration: DeclarationJson): string => { - if (!declaration.generic_params?.length) return declaration.name; - const params = declaration.generic_params.map((p) => { - let param = p.name; - if (p.constraint) param += ` extends ${p.constraint}`; - if (p.default_type) param += ` = ${p.default_type}`; - return param; - }); - return `${declaration.name}<${params.join(', ')}>`; -}; - -/** - * Generate TypeScript import statement for a declaration. - * @example declaration_generate_import({name: 'Foo', kind: 'type'}, 'foo.ts', '@pkg/lib') - * // => "import type {Foo} from '@pkg/lib/foo.js';" - */ -export const declaration_generate_import = ( - declaration: DeclarationJson, - module_path: string, - library_name: string, -): string => { - const js_path = module_path.replace(/\.ts$/, '.js'); - const specifier = `${library_name}/${js_path}`; - - // Handle default exports by converting module name to PascalCase - if (declaration.name === 'default') { - const module_name = module_path.replace(/\.(js|ts|svelte)$/, ''); - const pascal_case = module_name - .split(/[-_]/) - .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) - .join(''); - return `import ${pascal_case} from '${specifier}';`; - } - - const import_keyword = declaration.kind === 'type' ? 'import type' : 'import'; - return `${import_keyword} {${declaration.name}} from '${specifier}';`; -}; diff --git a/src/routes/library.gen.ts b/src/routes/library.gen.ts index d95ebfc0..7efb4fde 100644 --- a/src/routes/library.gen.ts +++ b/src/routes/library.gen.ts @@ -1,4 +1,5 @@ import {library_gen} from '@fuzdev/fuz_ui/library_gen.js'; -import {library_throw_on_duplicates} from '@fuzdev/fuz_ui/library_generate.js'; +// TODO BLOCK move to fuz_ui/library_gen.ts? +import {library_throw_on_duplicates} from '@fuzdev/svelte-docinfo'; export const gen = library_gen({on_duplicates: library_throw_on_duplicates}); diff --git a/src/routes/library_json.ts b/src/routes/library_json.ts deleted file mode 100644 index 56967bcd..00000000 --- a/src/routes/library_json.ts +++ /dev/null @@ -1,2 +0,0 @@ -// TODO @many maybe rework src/routes/library.gen.ts so this is unnecessary -export * from '$lib/library_json.js'; diff --git a/src/routes/source_json.ts b/src/routes/source_json.ts deleted file mode 100644 index aa55011a..00000000 --- a/src/routes/source_json.ts +++ /dev/null @@ -1,2 +0,0 @@ -// TODO @many maybe rework src/routes/library.gen.ts so this is unnecessary -export * from '$lib/source_json.js'; From 6eca6f002a4cc2ad16f2778e744c41207ebe16ae Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sat, 3 Jan 2026 09:32:35 -0500 Subject: [PATCH 02/20] wip --- src/routes/library.gen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/library.gen.ts b/src/routes/library.gen.ts index 7efb4fde..6b70306e 100644 --- a/src/routes/library.gen.ts +++ b/src/routes/library.gen.ts @@ -1,5 +1,5 @@ import {library_gen} from '@fuzdev/fuz_ui/library_gen.js'; // TODO BLOCK move to fuz_ui/library_gen.ts? -import {library_throw_on_duplicates} from '@fuzdev/svelte-docinfo'; +import {library_throw_on_duplicates} from '@fuzdev/svelte-docinfo/library_generate.js'; export const gen = library_gen({on_duplicates: library_throw_on_duplicates}); From 9ea3f4aa10fe83c0078ae6502548c0009654410d Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sat, 3 Jan 2026 09:34:22 -0500 Subject: [PATCH 03/20] wip --- package-lock.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package-lock.json b/package-lock.json index b0ed2024..3321a2b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,7 +78,9 @@ "@ryanatkn/gro": "^0.184.0", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.49.1", + "@sveltejs/package": "^2.5.7", "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@types/node": "^24.10.4", "eslint": "^9.39.1", "eslint-plugin-svelte": "^3.13.1", "prettier": "^3.7.4", From 0c63afda11a2a1375ae787bc6c3403ed1b0de5ad Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 5 Jan 2026 07:34:36 -0500 Subject: [PATCH 04/20] wip --- package-lock.json | 112 +++++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 74 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3321a2b2..f88e2cd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.38.0", "@fuzdev/fuz_css": "^0.43.0", - "@fuzdev/fuz_ui": "^0.177.0", + "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", "@ryanatkn/eslint-config": "^0.9.0", "@ryanatkn/gro": "^0.184.0", "@sveltejs/adapter-static": "^3.0.10", @@ -42,7 +43,6 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", "@types/node": "^24", "esm-env": "^1.2.2", "zod": "^4.0.14" @@ -59,10 +59,77 @@ } } }, + "../fuz_ui": { + "name": "@fuzdev/fuz_ui", + "version": "0.177.0", + "dev": true, + "license": "MIT", + "devDependencies": { + "@changesets/changelog-git": "^0.2.1", + "@fuzdev/fuz_code": "^0.38.0", + "@fuzdev/fuz_css": "^0.42.1", + "@fuzdev/fuz_util": "^0.45.1", + "@jridgewell/trace-mapping": "^0.3.31", + "@ryanatkn/eslint-config": "^0.9.0", + "@ryanatkn/gro": "^0.183.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/package": "^2.5.7", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@types/node": "^24.10.1", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.1", + "esm-env": "^1.2.2", + "jsdom": "^27.2.0", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.1", + "svelte": "^5.46.1", + "svelte-check": "^4.3.5", + "svelte2tsx": "^0.7.46", + "tslib": "^2.8.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vitest": "^4.0.15", + "zod": "^4.1.13" + }, + "engines": { + "node": ">=22.15" + }, + "funding": { + "url": "https://www.ryanatkn.com/funding" + }, + "peerDependencies": { + "@fuzdev/fuz_code": ">=0.37.0", + "@fuzdev/fuz_css": ">=0.40.0", + "@fuzdev/fuz_util": ">=0.42.0", + "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", + "@jridgewell/trace-mapping": "^0.3", + "@ryanatkn/gro": ">=0.183.0", + "@sveltejs/kit": "^2.47.3", + "esm-env": "^1", + "svelte": "^5", + "svelte2tsx": "^0.7.45", + "zod": "^4.1.12" + }, + "peerDependenciesMeta": { + "@fuzdev/fuz_code": { + "optional": true + }, + "@jridgewell/trace-mapping": { + "optional": true + }, + "@ryanatkn/gro": { + "optional": true + }, + "esm-env": { + "optional": true + } + } + }, "../svelte-docinfo": { "name": "@fuzdev/svelte-docinfo", "version": "0.0.1", - "peer": true, + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "svelte2tsx": "^0.7.30", @@ -823,43 +890,8 @@ } }, "node_modules/@fuzdev/fuz_ui": { - "version": "0.177.0", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_ui/-/fuz_ui-0.177.0.tgz", - "integrity": "sha512-b9LEzjL78NHtEI0yDOCTz/XyUjm/sdrCDSQ4jNHOtpANOF8cRijemldXWcfs9UEoexnIK8wDg8WV4OnpD5Hvqw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://www.ryanatkn.com/funding" - }, - "peerDependencies": { - "@fuzdev/fuz_code": ">=0.37.0", - "@fuzdev/fuz_css": ">=0.40.0", - "@fuzdev/fuz_util": ">=0.42.0", - "@jridgewell/trace-mapping": "^0.3", - "@ryanatkn/gro": ">=0.183.0", - "@sveltejs/kit": "^2.47.3", - "esm-env": "^1", - "svelte": "^5", - "svelte2tsx": "^0.7.45", - "zod": "^4.1.12" - }, - "peerDependenciesMeta": { - "@fuzdev/fuz_code": { - "optional": true - }, - "@jridgewell/trace-mapping": { - "optional": true - }, - "@ryanatkn/gro": { - "optional": true - }, - "esm-env": { - "optional": true - } - } + "resolved": "../fuz_ui", + "link": true }, "node_modules/@fuzdev/fuz_util": { "version": "0.45.1", diff --git a/package.json b/package.json index 06957371..b3f5cbfc 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "web" ], "peerDependencies": { - "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", "@types/node": "^24", "esm-env": "^1.2.2", "zod": "^4.0.14" @@ -64,7 +63,8 @@ "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.38.0", "@fuzdev/fuz_css": "^0.43.0", - "@fuzdev/fuz_ui": "^0.177.0", + "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", "@ryanatkn/eslint-config": "^0.9.0", "@ryanatkn/gro": "^0.184.0", "@sveltejs/adapter-static": "^3.0.10", From 7fd10382e2a4d1f5d678cf455321056f76db9835 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 5 Jan 2026 07:37:48 -0500 Subject: [PATCH 05/20] wip --- src/lib/library_json.ts | 124 +++++++++++++++++++++ src/lib/source_json.ts | 216 +++++++++++++++++++++++++++++++++++++ src/routes/library_json.ts | 2 + src/routes/source_json.ts | 2 + 4 files changed, 344 insertions(+) create mode 100644 src/lib/library_json.ts create mode 100644 src/lib/source_json.ts create mode 100644 src/routes/library_json.ts create mode 100644 src/routes/source_json.ts diff --git a/src/lib/library_json.ts b/src/lib/library_json.ts new file mode 100644 index 00000000..eee12c45 --- /dev/null +++ b/src/lib/library_json.ts @@ -0,0 +1,124 @@ +/** + * Library metadata combining package.json with analyzed source. + * + * @module + */ + +import {ensure_end, strip_end, strip_start} from './string.js'; +import type {PackageJson} from './package_json.js'; +import type {SourceJson} from './source_json.js'; +import type {Url} from './url.js'; + +/** + * A library's package.json and source metadata with computed properties. + */ +export interface LibraryJson { + /** Package name, e.g. `@fuzdev/fuz_ui`. */ + name: string; + /** Name without scope, e.g. `fuz`. */ + repo_name: string; + /** GitHub repo URL, e.g. `https://github.com/fuzdev/fuz_ui`. */ + repo_url: Url; + /** GitHub user/org, e.g. `ryanatkn`. */ + owner_name: string | null; + homepage_url: Url | null; + /** Logo URL, falls back to `favicon.png`. */ + logo_url: Url | null; + logo_alt: string; + npm_url: Url | null; + changelog_url: Url | null; + /** True if has exports and version is not `0.0.1`. */ + published: boolean; + package_json: PackageJson; + source_json: SourceJson; +} + +/** + * Creates a `LibraryJson` with computed properties from package.json and source metadata. + */ +export const library_json_parse = ( + package_json: PackageJson, + source_json: SourceJson, +): LibraryJson => { + const {name} = package_json; + + // TODO hacky + const parse_repo = (r: string | null | undefined) => { + if (!r) return null; + return strip_end(strip_start(strip_end(r, '.git'), 'git+'), '/'); + }; + + const repo_url = parse_repo( + package_json.repository + ? typeof package_json.repository === 'string' + ? package_json.repository + : package_json.repository.url + : null, + ); + if (!repo_url) { + throw Error('failed to parse library_json - `repo_url` is required in package_json'); + } + + const homepage_url = package_json.homepage ?? null; + + const published = + !package_json.private && !!package_json.exports && package_json.version !== '0.0.1'; + + // TODO generic registries + const npm_url = published ? 'https://www.npmjs.com/package/' + package_json.name : null; + + const changelog_url = published && repo_url ? repo_url + '/blob/main/CHANGELOG.md' : null; + + const repo_name = library_repo_name_parse(name); + + const owner_name = repo_url ? strip_start(repo_url, 'https://github.com/').split('/')[0]! : null; + + const logo_url = homepage_url + ? ensure_end(homepage_url, '/') + + (package_json.logo ? strip_start(package_json.logo, '/') : 'favicon.png') + : null; + + const logo_alt = package_json.logo_alt ?? `logo for ${repo_name}`; + + return { + name, + repo_name, + repo_url, + owner_name, + homepage_url, + logo_url, + logo_alt, + npm_url, + changelog_url, + published, + package_json, + source_json, + }; +}; + +/** + * Extracts repo name from a package name, e.g. `@fuzdev/fuz_ui` → `fuz`. + */ +export const library_repo_name_parse = (name: string): string => { + if (name[0] === '@') { + const parts = name.split('/'); + if (parts.length < 2) { + throw new Error(`invalid scoped package name: "${name}" (expected format: @org/package)`); + } + return parts[1]!; + } + return name; +}; + +/** + * Extracts GitHub org URL from a library, e.g. `https://github.com/ryanatkn`. + */ +export const library_org_url_parse = (library: LibraryJson): string | null => { + const {repo_name, repo_url} = library; + if (!repo_url) return null; + const suffix = '/' + repo_name; + if (repo_url.endsWith(suffix)) { + return strip_end(repo_url, suffix); + } + return null; +}; diff --git a/src/lib/source_json.ts b/src/lib/source_json.ts new file mode 100644 index 00000000..77cafa96 --- /dev/null +++ b/src/lib/source_json.ts @@ -0,0 +1,216 @@ +/** + * Metadata types for library source code analysis. + * + * These types represent the structure of `src/lib/` exports, + * extracted at build time via TypeScript compiler analysis. + * Used for generating API documentation and enabling code search. + * + * Hierarchy: SourceJson → ModuleJson → DeclarationJson + * + * @module + */ + +import {z} from 'zod'; + +/** + * The kind of exported declaration. + */ +export const DeclarationKind = z.enum([ + 'type', + 'function', + 'variable', + 'class', + 'constructor', + 'component', + 'json', + 'css', +]); +export type DeclarationKind = z.infer; + +/** + * Generic type parameter information. + */ +export const GenericParamInfo = z.looseObject({ + /** Parameter name like `T`. */ + name: z.string(), + /** Constraint like `string` from `T extends string`. */ + constraint: z.string().optional(), + /** Default type like `unknown` from `T = unknown`. */ + default_type: z.string().optional(), +}); +export type GenericParamInfo = z.infer; + +/** + * Parameter information for functions and methods. + * + * Kept distinct from ComponentPropInfo despite structural similarity. + * Function parameters form a tuple with positional semantics: + * calling order matters (`fn(a, b)` vs `fn(b, a)`), + * may include rest parameters and destructuring patterns. + */ +export const ParameterInfo = z.looseObject({ + name: z.string(), + type: z.string(), + optional: z.boolean().optional(), + description: z.string().optional(), + default_value: z.string().optional(), +}); +export type ParameterInfo = z.infer; + +/** + * Component prop information for Svelte components. + * + * Kept distinct from ParameterInfo despite structural similarity. + * Component props are named attributes with different semantics: + * no positional order when passing (`` = ``), + * support two-way binding via `$bindable` rune. + */ +export const ComponentPropInfo = z.looseObject({ + name: z.string(), + type: z.string(), + optional: z.boolean().optional(), + description: z.string().optional(), + default_value: z.string().optional(), + bindable: z.boolean().optional(), +}); +export type ComponentPropInfo = z.infer; + +/** + * Metadata for an exported declaration (function, type, class, component, etc.). + * + * Extracted from TypeScript source and JSDoc/TSDoc comments at build time. + */ +export const DeclarationJson = z.looseObject({ + /** The exported name. */ + name: z.string(), + kind: DeclarationKind, + /** JSDoc/TSDoc comment in mdz format. */ + doc_comment: z.string().optional(), + /** Full TypeScript type signature. */ + type_signature: z.string().optional(), + /** TypeScript modifiers like `readonly`, `private`, or `static`. */ + modifiers: z.array(z.string()).optional(), + /** 1-indexed line number in source file. */ + source_line: z.number().optional(), + /** Function/method parameters. */ + parameters: z.array(ParameterInfo).optional(), + /** Function/method return type. */ + return_type: z.string().optional(), + /** Return value description from `@returns` tag. */ + return_description: z.string().optional(), + /** Generic type parameters like ``. */ + generic_params: z.array(GenericParamInfo).optional(), + /** Code examples from `@example` tags. */ + examples: z.array(z.string()).optional(), + /** Deprecation message from `@deprecated` tag. */ + deprecated_message: z.string().optional(), + /** Related items from `@see` tags, in raw TSDoc format. */ + see_also: z.array(z.string()).optional(), + /** Exceptions from `@throws` tags. */ + throws: z.array(z.looseObject({type: z.string().optional(), description: z.string()})).optional(), + /** Version introduced, from `@since` tag. */ + since: z.string().optional(), + /** Extended classes/interfaces. */ + extends: z.array(z.string()).optional(), + /** Implemented interfaces. */ + implements: z.array(z.string()).optional(), + /** Class or interface members (recursive). */ + get members() { + return z.array(DeclarationJson).optional(); + }, + /** Type/interface properties (recursive). */ + get properties() { + return z.array(DeclarationJson).optional(); + }, + /** Svelte component props. */ + props: z.array(ComponentPropInfo).optional(), + /** + * Module paths (relative to src/lib) that re-export this declaration. + * The canonical location is this module's `declarations` array. + */ + also_exported_from: z.array(z.string()).optional(), + /** + * For renamed re-exports (`export {foo as bar}`), the original declaration. + */ + alias_of: z + .object({ + module: z.string(), + name: z.string(), + }) + .optional(), +}); +export type DeclarationJson = z.infer; + +/** + * A source file in `src/lib/` with its exported declarations. + */ +export const ModuleJson = z.looseObject({ + /** Path relative to src/lib (e.g., `helpers.ts`). */ + path: z.string(), + declarations: z.array(DeclarationJson).optional(), + /** File-level JSDoc comment. */ + module_comment: z.string().optional(), + /** Modules this imports (paths relative to src/lib). */ + dependencies: z.array(z.string()).optional(), + /** Modules that import this (paths relative to src/lib). */ + dependents: z.array(z.string()).optional(), + /** + * Modules fully re-exported via `export * from './module'`. + * Paths are relative to src/lib. + */ + star_exports: z.array(z.string()).optional(), +}); +export type ModuleJson = z.infer; + +/** + * Metadata for a library's `src/lib/` exports. + */ +export const SourceJson = z.looseObject({ + name: z.string(), + version: z.string(), + modules: z.array(ModuleJson).optional(), +}); +export type SourceJson = z.infer; + +/** + * Format declaration name with generic parameters for display. + * @example declaration_get_display_name({name: 'Map', kind: 'type', generic_params: [{name: 'K'}, {name: 'V'}]}) + * // => 'Map' + */ +export const declaration_get_display_name = (declaration: DeclarationJson): string => { + if (!declaration.generic_params?.length) return declaration.name; + const params = declaration.generic_params.map((p) => { + let param = p.name; + if (p.constraint) param += ` extends ${p.constraint}`; + if (p.default_type) param += ` = ${p.default_type}`; + return param; + }); + return `${declaration.name}<${params.join(', ')}>`; +}; + +/** + * Generate TypeScript import statement for a declaration. + * @example declaration_generate_import({name: 'Foo', kind: 'type'}, 'foo.ts', '@pkg/lib') + * // => "import type {Foo} from '@pkg/lib/foo.js';" + */ +export const declaration_generate_import = ( + declaration: DeclarationJson, + module_path: string, + library_name: string, +): string => { + const js_path = module_path.replace(/\.ts$/, '.js'); + const specifier = `${library_name}/${js_path}`; + + // Handle default exports by converting module name to PascalCase + if (declaration.name === 'default') { + const module_name = module_path.replace(/\.(js|ts|svelte)$/, ''); + const pascal_case = module_name + .split(/[-_]/) + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(''); + return `import ${pascal_case} from '${specifier}';`; + } + + const import_keyword = declaration.kind === 'type' ? 'import type' : 'import'; + return `${import_keyword} {${declaration.name}} from '${specifier}';`; +}; diff --git a/src/routes/library_json.ts b/src/routes/library_json.ts new file mode 100644 index 00000000..56967bcd --- /dev/null +++ b/src/routes/library_json.ts @@ -0,0 +1,2 @@ +// TODO @many maybe rework src/routes/library.gen.ts so this is unnecessary +export * from '$lib/library_json.js'; diff --git a/src/routes/source_json.ts b/src/routes/source_json.ts new file mode 100644 index 00000000..aa55011a --- /dev/null +++ b/src/routes/source_json.ts @@ -0,0 +1,2 @@ +// TODO @many maybe rework src/routes/library.gen.ts so this is unnecessary +export * from '$lib/source_json.js'; From 639170aa52a21d24658debb0329b7971d6ebc9cc Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 5 Jan 2026 07:45:47 -0500 Subject: [PATCH 06/20] wip --- src/routes/library.gen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/library.gen.ts b/src/routes/library.gen.ts index 6b70306e..f31947da 100644 --- a/src/routes/library.gen.ts +++ b/src/routes/library.gen.ts @@ -1,5 +1,5 @@ import {library_gen} from '@fuzdev/fuz_ui/library_gen.js'; // TODO BLOCK move to fuz_ui/library_gen.ts? -import {library_throw_on_duplicates} from '@fuzdev/svelte-docinfo/library_generate.js'; +import {library_throw_on_duplicates} from '@fuzdev/svelte-docinfo/library_analyze.js'; export const gen = library_gen({on_duplicates: library_throw_on_duplicates}); From 4d21d01c7e86495bdfbe554dd68e30b56ff122de Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 5 Jan 2026 07:56:25 -0500 Subject: [PATCH 07/20] wip --- CLAUDE.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index d5683b1d..7b0a3c81 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -73,6 +73,17 @@ See `docs/benchmark.md` for full documentation. `.well-known/src.json` metadata (shared by gro for generation and fuz for UI) - `pkg_json.ts` - `PkgJson` enriched package representation combining `PackageJson` and `SrcJson` +- `source_json.ts` - Library documentation metadata types shared across Fuz projects: + - `SourceJson` - package metadata + analyzed modules + - `ModuleJson` - source file metadata (declarations, dependencies, comments) + - `DeclarationJson` - exported declaration metadata (functions, types, classes, components) + - Supporting types: `ParameterInfo`, `ComponentPropInfo`, `GenericParamInfo` + - Used by `@fuzdev/svelte-docinfo` (analysis) and `@fuzdev/fuz_ui` (documentation UI) +- `library_json.ts` - Opinionated library metadata wrapping: + - `LibraryJson` - combines `SourceJson` with GitHub/npm metadata + - `library_json_parse()` - generates URLs, logo paths, published flags + - `library_repo_name_parse()`, `library_org_url_parse()` - helpers + - Used by `@fuzdev/fuz_ui` for documentation generation - `result.ts` - Result type pattern - `error.ts` - error utilities From 719178ecdf0663664cd48501b8478b786502472f Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 5 Jan 2026 08:15:16 -0500 Subject: [PATCH 08/20] wip --- src/routes/library.gen.ts | 6 +- src/routes/library.json | 178 ++++++++++++++++++++++---------------- src/routes/library.ts | 2 +- 3 files changed, 108 insertions(+), 78 deletions(-) diff --git a/src/routes/library.gen.ts b/src/routes/library.gen.ts index f31947da..e6c07d84 100644 --- a/src/routes/library.gen.ts +++ b/src/routes/library.gen.ts @@ -1,5 +1,7 @@ import {library_gen} from '@fuzdev/fuz_ui/library_gen.js'; -// TODO BLOCK move to fuz_ui/library_gen.ts? import {library_throw_on_duplicates} from '@fuzdev/svelte-docinfo/library_analyze.js'; -export const gen = library_gen({on_duplicates: library_throw_on_duplicates}); +// Use `as any` to bypass type portability check. The inferred type references fuz_ui's +// @ryanatkn/gro which differs from fuz_util's instance. This is correct at runtime but +// TypeScript cannot express the type portably across separate node_modules boundaries. +export const gen = library_gen({on_duplicates: library_throw_on_duplicates}) as any; diff --git a/src/routes/library.json b/src/routes/library.json index 11fea00d..5a9fbb7a 100644 --- a/src/routes/library.json +++ b/src/routes/library.json @@ -69,7 +69,8 @@ "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.38.0", "@fuzdev/fuz_css": "^0.43.0", - "@fuzdev/fuz_ui": "^0.177.0", + "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/svelte-docinfo": "file:../svelte-docinfo", "@ryanatkn/eslint-config": "^0.9.0", "@ryanatkn/gro": "^0.184.0", "@sveltejs/adapter-static": "^3.0.10", @@ -124,6 +125,7 @@ "source_json": { "name": "@fuzdev/fuz_util", "version": "0.45.1", + "repository": "git+https://github.com/fuzdev/fuz_util.git", "modules": [ { "path": "array.ts", @@ -152,6 +154,9 @@ "name": "remove_unordered", "kind": "function", "doc_comment": "Removes an element from `array` at `index` in an unordered manner.", + "mutates": { + "array": "swaps element at index with last element, then removes last element" + }, "source_line": 14, "type_signature": "(array: any[], index: number): void", "return_type": "void", @@ -519,12 +524,12 @@ { "name": "results", "type": "BenchmarkResult[]", - "description": "- Benchmark results to save" + "description": "Benchmark results to save" }, { "name": "options", "type": "BenchmarkBaselineSaveOptions", - "description": "- Save options", + "description": "Save options", "default_value": "{}" } ] @@ -544,7 +549,7 @@ { "name": "options", "type": "BenchmarkBaselineLoadOptions", - "description": "- Load options", + "description": "Load options", "default_value": "{}" } ] @@ -564,12 +569,12 @@ { "name": "results", "type": "BenchmarkResult[]", - "description": "- Current benchmark results" + "description": "Current benchmark results" }, { "name": "options", "type": "BenchmarkBaselineCompareOptions", - "description": "- Comparison options including regression threshold and staleness warning", + "description": "Comparison options including regression threshold and staleness warning", "default_value": "{}" } ] @@ -586,7 +591,7 @@ { "name": "result", "type": "BenchmarkBaselineComparisonResult", - "description": "- Comparison result from benchmark_baseline_compare" + "description": "Comparison result from benchmark_baseline_compare" } ] }, @@ -602,12 +607,12 @@ { "name": "result", "type": "BenchmarkBaselineComparisonResult", - "description": "- Comparison result from benchmark_baseline_compare" + "description": "Comparison result from benchmark_baseline_compare" }, { "name": "options", "type": "{ pretty?: boolean | undefined; }", - "description": "- Formatting options", + "description": "Formatting options", "default_value": "{}" } ] @@ -634,13 +639,13 @@ { "name": "results", "type": "BenchmarkResult[]", - "description": "- Array of benchmark results" + "description": "Array of benchmark results" }, { "name": "baseline", "type": "string | undefined", "optional": true, - "description": "- Optional task name to use as baseline for comparison (defaults to fastest)" + "description": "Optional task name to use as baseline for comparison (defaults to fastest)" } ] }, @@ -659,13 +664,13 @@ { "name": "results", "type": "BenchmarkResult[]", - "description": "- Array of benchmark results" + "description": "Array of benchmark results" }, { "name": "baseline", "type": "string | undefined", "optional": true, - "description": "- Optional task name to use as baseline for comparison (defaults to fastest)" + "description": "Optional task name to use as baseline for comparison (defaults to fastest)" } ] }, @@ -684,12 +689,12 @@ { "name": "results", "type": "BenchmarkResult[]", - "description": "- Array of benchmark results" + "description": "Array of benchmark results" }, { "name": "groups", "type": "BenchmarkGroup[]", - "description": "- Array of group definitions" + "description": "Array of group definitions" } ] }, @@ -728,13 +733,13 @@ { "name": "results", "type": "BenchmarkResult[]", - "description": "- Array of benchmark results" + "description": "Array of benchmark results" }, { "name": "options", "type": "BenchmarkFormatJsonOptions | undefined", "optional": true, - "description": "- Formatting options" + "description": "Formatting options" } ] }, @@ -753,12 +758,12 @@ { "name": "results", "type": "BenchmarkResult[]", - "description": "- Array of benchmark results" + "description": "Array of benchmark results" }, { "name": "groups", "type": "BenchmarkGroup[]", - "description": "- Array of group definitions" + "description": "Array of group definitions" } ] }, @@ -1046,18 +1051,18 @@ { "name": "a", "type": "BenchmarkStatsComparable", - "description": "- First benchmark stats (or any object with required properties)" + "description": "First benchmark stats (or any object with required properties)" }, { "name": "b", "type": "BenchmarkStatsComparable", - "description": "- Second benchmark stats (or any object with required properties)" + "description": "Second benchmark stats (or any object with required properties)" }, { "name": "options", "type": "BenchmarkCompareOptions | undefined", "optional": true, - "description": "- Comparison options" + "description": "Comparison options" } ] } @@ -1284,18 +1289,18 @@ { "name": "fn", "type": "() => unknown", - "description": "- Function to warmup (sync or async)" + "description": "Function to warmup (sync or async)" }, { "name": "iterations", "type": "number", - "description": "- Number of warmup iterations" + "description": "Number of warmup iterations" }, { "name": "async_hint", "type": "boolean | undefined", "optional": true, - "description": "- If provided, use this instead of detecting" + "description": "If provided, use this instead of detecting" } ] }, @@ -1328,12 +1333,12 @@ { "name": "name", "type": "string", - "description": "- Task name or full task object" + "description": "Task name or full task object" }, { "name": "fn", "type": "() => unknown", - "description": "- Function to benchmark (if name is string). Return values are ignored." + "description": "Function to benchmark (if name is string). Return values are ignored." } ] }, @@ -1380,7 +1385,7 @@ { "name": "name", "type": "string", - "description": "- Name of the task to remove" + "description": "Name of the task to remove" } ], "throws": [ @@ -1401,7 +1406,7 @@ { "name": "name", "type": "string", - "description": "- Name of the task to skip" + "description": "Name of the task to skip" } ], "throws": [ @@ -1422,7 +1427,7 @@ { "name": "name", "type": "string", - "description": "- Name of the task to run exclusively" + "description": "Name of the task to run exclusively" } ], "throws": [ @@ -1453,7 +1458,7 @@ "name": "options", "type": "BenchmarkFormatTableOptions | undefined", "optional": true, - "description": "- Formatting options" + "description": "Formatting options" } ] }, @@ -1469,7 +1474,7 @@ "name": "options", "type": "BenchmarkFormatTableOptions | undefined", "optional": true, - "description": "- Formatting options (groups for organized output with optional baselines)" + "description": "Formatting options (groups for organized output with optional baselines)" } ] }, @@ -1485,7 +1490,7 @@ "name": "options", "type": "BenchmarkFormatJsonOptions | undefined", "optional": true, - "description": "- Formatting options (pretty, include_timings)" + "description": "Formatting options (pretty, include_timings)" } ] }, @@ -1939,6 +1944,9 @@ "name": "swallow", "kind": "function", "doc_comment": "Stops an event from bubbling and doing default behavior.", + "mutates": { + "event": "calls preventDefault(), stopPropagation(), or stopImmediatePropagation()" + }, "source_line": 69, "type_signature": ">(event: T, immediate?: boolean, preventDefault?: boolean): T", "return_type": "T", @@ -1965,6 +1973,9 @@ "name": "handle_target_value", "kind": "function", "doc_comment": "Handles the value of an event's target and invokes a callback.\nDefaults to swallowing the event to prevent default actions and propagation.", + "mutates": { + "event": "calls `swallow()` which mutates the event if `swallow_event` is true" + }, "source_line": 91, "type_signature": "(cb: (value: any, event: any) => void, swallow_event?: boolean): (e: any) => void", "return_type": "(e: any) => void", @@ -2523,7 +2534,7 @@ { "name": "stdout", "type": "string | null", - "description": "- The raw output from `git status --porcelain -z`" + "description": "The raw output from `git status --porcelain -z`" } ] }, @@ -2996,16 +3007,14 @@ "kind": "type", "source_line": 5, "type_signature": "JsonObject", - "extends": ["Record"], - "properties": [] + "extends": ["Record"] }, { "name": "JsonArray", "kind": "type", "source_line": 7, "type_signature": "JsonArray", - "extends": ["Array"], - "properties": [] + "extends": ["Array"] }, { "name": "JsonType", @@ -3815,12 +3824,12 @@ { "name": "obj", "type": "any", - "description": "- any object with enumerable properties" + "description": "any object with enumerable properties" }, { "name": "cb", "type": "(key: string, value: any, obj: any) => void", - "description": "- receives the key, value, and `obj` for every enumerable property on `obj` and its descendents" + "description": "receives the key, value, and `obj` for every enumerable property on `obj` and its descendents" } ] }, @@ -4014,6 +4023,9 @@ "name": "slugify", "kind": "function", "doc_comment": "Converts a string into a URL-compatible slug.", + "mutates": { + "special_char_mappers": "calls `get_special_char_mappers()` which lazily initializes the module-level array if `map_special_characters` is true" + }, "source_line": 103, "type_signature": "(str: string, map_special_characters?: boolean): string", "return_type": "string", @@ -4063,6 +4075,9 @@ "name": "configure_print_colors", "kind": "function", "doc_comment": "Configures the module-level styling function for colored output.", + "mutates": { + "st": "assigns the module-level `st` variable" + }, "source_line": 12, "type_signature": "(s: ((format: ForegroundColors | BackgroundColors | Modifiers | (ForegroundColors | BackgroundColors | Modifiers)[], text: string, options?: StyleTextOptions | undefined) => string) | null | undefined): (format: ForegroundColors | ... 2 more ... | (ForegroundColors | ... 1 more ... | Modifiers)[], text: string, options?: StyleTextOptions | undefined) => string", "return_type": "(format: ForegroundColors | BackgroundColors | Modifiers | (ForegroundColors | BackgroundColors | Modifiers)[], text: string, options?: StyleTextOptions | undefined) => string", @@ -4358,6 +4373,9 @@ "name": "spawn_process", "kind": "function", "doc_comment": "Wraps the normal Node `childProcess.spawn` with graceful child shutdown behavior.\nAlso returns a convenient `closed` promise.\nIf you only need `closed`, prefer the shorthand function `spawn`.", + "mutates": { + "global_spawn": "calls `register_global_spawn()` which adds to the module-level Set" + }, "source_line": 70, "type_signature": "(command: string, args?: readonly string[], options?: SpawnOptions | undefined): SpawnedProcess", "return_type": "SpawnedProcess", @@ -4402,6 +4420,9 @@ "name": "register_global_spawn", "kind": "function", "doc_comment": "Returns a function that unregisters the `child`.", + "mutates": { + "global_spawn": "adds child to the module-level Set, and the returned function removes it" + }, "source_line": 101, "type_signature": "(child: ChildProcess): () => void", "return_type": "() => void", @@ -4432,6 +4453,9 @@ "name": "despawn_all", "kind": "function", "doc_comment": "Kills all globally registered child processes.", + "mutates": { + "global_spawn": "indirectly removes processes through `despawn()` calls" + }, "source_line": 132, "type_signature": "(): Promise", "return_type": "Promise", @@ -4449,13 +4473,13 @@ "name": "to_error_label", "type": "((err: Error, origin: UncaughtExceptionOrigin) => string | null) | undefined", "optional": true, - "description": "- Customize the error label or return `null` for the default `origin`." + "description": "Customize the error label or return `null` for the default `origin`." }, { "name": "map_error_text", "type": "((err: Error, origin: UncaughtExceptionOrigin) => string | null) | undefined", "optional": true, - "description": "- Customize the error text. Return `''` to silence, or `null` for the default `print_error(err)`." + "description": "Customize the error text. Return `''` to silence, or `null` for the default `print_error(err)`." }, { "name": "handle_error", @@ -4685,6 +4709,9 @@ "name": "shuffle", "kind": "function", "doc_comment": "Mutates `array` with random ordering.", + "mutates": { + "array": "randomly reorders elements in place using Fisher-Yates shuffle" + }, "source_line": 34, "type_signature": ">(array: T, random?: ((min: number, max: number, random?: () => number) => number) | undefined): T", "return_type": "T", @@ -4723,6 +4750,9 @@ "name": "reset_regexp", "kind": "function", "doc_comment": "Reset a RegExp's lastIndex to 0 for global and sticky patterns.\nEnsures consistent behavior by clearing state that affects subsequent matches.", + "mutates": { + "regexp": "sets lastIndex to 0 if regexp is global or sticky" + }, "source_line": 12, "type_signature": "(regexp: T): T", "return_type": "T", @@ -5034,12 +5064,12 @@ { "name": "values", "type": "number[]", - "description": "- Array of numbers" + "description": "Array of numbers" }, { "name": "p", "type": "number", - "description": "- Percentile (0-1, e.g., 0.95 for 95th percentile)" + "description": "Percentile (0-1, e.g., 0.95 for 95th percentile)" } ] }, @@ -5269,13 +5299,13 @@ { "name": "values", "type": "number[]", - "description": "- Array of numbers" + "description": "Array of numbers" }, { "name": "options", "type": "StatsConfidenceIntervalOptions | undefined", "optional": true, - "description": "- Configuration options" + "description": "Configuration options" } ] }, @@ -5291,23 +5321,23 @@ { "name": "mean", "type": "number", - "description": "- Mean of the data" + "description": "Mean of the data" }, { "name": "std_dev", "type": "number", - "description": "- Standard deviation of the data" + "description": "Standard deviation of the data" }, { "name": "sample_size", "type": "number", - "description": "- Number of samples" + "description": "Number of samples" }, { "name": "options", "type": "StatsConfidenceIntervalOptions | undefined", "optional": true, - "description": "- Configuration options" + "description": "Configuration options" } ] }, @@ -5343,32 +5373,32 @@ { "name": "mean1", "type": "number", - "description": "- Mean of first sample" + "description": "Mean of first sample" }, { "name": "std1", "type": "number", - "description": "- Standard deviation of first sample" + "description": "Standard deviation of first sample" }, { "name": "n1", "type": "number", - "description": "- Size of first sample" + "description": "Size of first sample" }, { "name": "mean2", "type": "number", - "description": "- Mean of second sample" + "description": "Mean of second sample" }, { "name": "std2", "type": "number", - "description": "- Standard deviation of second sample" + "description": "Standard deviation of second sample" }, { "name": "n2", "type": "number", - "description": "- Size of second sample" + "description": "Size of second sample" } ] }, @@ -5434,12 +5464,12 @@ { "name": "t", "type": "number", - "description": "- Absolute value of t-statistic" + "description": "Absolute value of t-statistic" }, { "name": "df", "type": "number", - "description": "- Degrees of freedom" + "description": "Degrees of freedom" } ] } @@ -5875,7 +5905,7 @@ { "name": "values_ns", "type": "number[]", - "description": "- Array of times in nanoseconds" + "description": "Array of times in nanoseconds" } ] }, @@ -5891,17 +5921,17 @@ { "name": "ns", "type": "number", - "description": "- Time in nanoseconds" + "description": "Time in nanoseconds" }, { "name": "unit", "type": "TimeUnit", - "description": "- Unit to use ('ns', 'us', 'ms', 's')" + "description": "Unit to use ('ns', 'us', 'ms', 's')" }, { "name": "decimals", "type": "number", - "description": "- Number of decimal places (default: 2)", + "description": "Number of decimal places (default: 2)", "default_value": "2" } ] @@ -5921,12 +5951,12 @@ { "name": "ns", "type": "number", - "description": "- Time in nanoseconds" + "description": "Time in nanoseconds" }, { "name": "decimals", "type": "number", - "description": "- Number of decimal places (default: 2)", + "description": "Number of decimal places (default: 2)", "default_value": "2" } ] @@ -5985,12 +6015,12 @@ { "name": "fn", "type": "() => Promise", - "description": "- Async function to time" + "description": "Async function to time" }, { "name": "timer", "type": "Timer", - "description": "- Timer to use (defaults to timer_default)", + "description": "Timer to use (defaults to timer_default)", "default_value": "timer_default" } ] @@ -6010,12 +6040,12 @@ { "name": "fn", "type": "() => T", - "description": "- Sync function to time" + "description": "Sync function to time" }, { "name": "timer", "type": "Timer", - "description": "- Timer to use (defaults to timer_default)", + "description": "Timer to use (defaults to timer_default)", "default_value": "timer_default" } ] @@ -6035,17 +6065,17 @@ { "name": "fn", "type": "() => unknown", - "description": "- Function to measure (sync or async)" + "description": "Function to measure (sync or async)" }, { "name": "iterations", "type": "number", - "description": "- Number of times to execute" + "description": "Number of times to execute" }, { "name": "timer", "type": "Timer", - "description": "- Timer to use (defaults to timer_default)", + "description": "Timer to use (defaults to timer_default)", "default_value": "timer_default" } ] @@ -6351,8 +6381,7 @@ { "name": "T" } - ], - "properties": [] + ] }, { "name": "Branded", @@ -6377,8 +6406,7 @@ { "name": "T" } - ], - "properties": [] + ] } ] }, diff --git a/src/routes/library.ts b/src/routes/library.ts index 46bac42e..a5c50262 100644 --- a/src/routes/library.ts +++ b/src/routes/library.ts @@ -1,6 +1,6 @@ // generated by library.gen.ts - do not edit -import type {LibraryJson} from './library_json.js'; +import type {LibraryJson} from '@fuzdev/fuz_util/library_json.js'; import json from './library.json' with {type: 'json'}; From 2fe1bc1f63e25ee19426f8254694c05fd63764cc Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sat, 14 Feb 2026 04:01:54 -0500 Subject: [PATCH 09/20] wip --- package-lock.json | 14 +++++++------- package.json | 2 +- src/routes/library.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3aebecfe..47300d20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.0", - "@fuzdev/fuz_css": "^0.50.0", + "@fuzdev/fuz_css": "^0.51.0", "@fuzdev/fuz_ui": "^0.183.1", "@fuzdev/gro": "^0.192.1", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", @@ -153,11 +153,11 @@ "svelte-docinfo": "dist/main.js" }, "devDependencies": { - "@fuzdev/fuz_code": "^0.45.0", + "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.50.0", - "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/fuz_ui": "^0.183.1", "@fuzdev/fuz_util": "^0.51.0", - "@fuzdev/gro": "^0.192.1", + "@fuzdev/gro": "^0.194.0", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.9.0", "@sveltejs/adapter-static": "^3.0.10", @@ -989,9 +989,9 @@ } }, "node_modules/@fuzdev/fuz_css": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_css/-/fuz_css-0.50.0.tgz", - "integrity": "sha512-X2Lm8IBdqEhnyoVlp0S/gkaqnV0aaZ01KfSVk+psno9fl1V7C5x2EM85TX4miufWrO6A1hu5E4eKTFcTBR0wRg==", + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@fuzdev/fuz_css/-/fuz_css-0.51.0.tgz", + "integrity": "sha512-vSpPgsREdO59ChhnfdBOttHFRnDxTt04KjEvGn4pyi9NU/pDTbASQwyfIyJRFEMJdFaxTPfeuj4PrPz9ArIcNQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 5718a8f0..09fb8ed4 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.0", - "@fuzdev/fuz_css": "^0.50.0", + "@fuzdev/fuz_css": "^0.51.0", "@fuzdev/fuz_ui": "^0.183.1", "@fuzdev/gro": "^0.192.1", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", diff --git a/src/routes/library.json b/src/routes/library.json index 98527b62..1925146d 100644 --- a/src/routes/library.json +++ b/src/routes/library.json @@ -76,7 +76,7 @@ "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.0", - "@fuzdev/fuz_css": "^0.50.0", + "@fuzdev/fuz_css": "^0.51.0", "@fuzdev/fuz_ui": "^0.183.1", "@fuzdev/gro": "^0.192.1", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", From 4b39b133b55001dccd27132f1a0d83e101c8ef40 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Wed, 25 Feb 2026 10:02:20 -0500 Subject: [PATCH 10/20] wip --- package-lock.json | 67 ++++++++++++++++++++++++----------------------- package.json | 8 +++--- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47300d20..63a464fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@fuzdev/fuz_code": "^0.45.0", - "@fuzdev/fuz_css": "^0.51.0", - "@fuzdev/fuz_ui": "^0.183.1", - "@fuzdev/gro": "^0.192.1", + "@fuzdev/fuz_code": "^0.45.1", + "@fuzdev/fuz_css": "^0.54.0", + "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/gro": "^0.196.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.9.0", @@ -144,6 +144,7 @@ "name": "@fuzdev/svelte-docinfo", "version": "0.0.1", "dev": true, + "license": "MIT", "dependencies": { "commander": "^14.0.2", "typescript": "^5.9.3", @@ -154,10 +155,10 @@ }, "devDependencies": { "@fuzdev/fuz_code": "^0.45.1", - "@fuzdev/fuz_css": "^0.50.0", - "@fuzdev/fuz_ui": "^0.183.1", - "@fuzdev/fuz_util": "^0.51.0", - "@fuzdev/gro": "^0.194.0", + "@fuzdev/fuz_css": "^0.54.0", + "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/fuz_util": "^0.52.1", + "@fuzdev/gro": "^0.196.0", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.9.0", "@sveltejs/adapter-static": "^3.0.10", @@ -188,12 +189,12 @@ "node": ">=22.15" }, "peerDependencies": { - "@fuzdev/fuz_util": "^0.51.0", + "@fuzdev/fuz_util": "^0.52.0", "@jridgewell/trace-mapping": "^0.3.25", - "es-module-lexer": "^1.5.4", + "es-module-lexer": "^2.0.0", "svelte": "^5.0.0", "svelte2tsx": "^0.7.30", - "tinyglobby": "^0.3.1" + "tinyglobby": "^0.2.15" }, "peerDependenciesMeta": { "@jridgewell/trace-mapping": { @@ -951,9 +952,9 @@ } }, "node_modules/@fuzdev/fuz_code": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_code/-/fuz_code-0.45.0.tgz", - "integrity": "sha512-Ihg0B2gbfkthn/dfjdB/EM4x8xEYevu/2wKJslHnTuLwZj5miw0XNs5mXZwXKpAUeiFI2zIUtg/NyOYirm4T+g==", + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@fuzdev/fuz_code/-/fuz_code-0.45.1.tgz", + "integrity": "sha512-aVWWJHJ3U/bV9ZqooBuZ1XQrFgKdbSgRgs4NQOXDHl20JmmoR0jf7BkxQM/lxhtT/WU5kFJhiaGFYZCSmSgUuw==", "dev": true, "license": "MIT", "engines": { @@ -989,9 +990,9 @@ } }, "node_modules/@fuzdev/fuz_css": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_css/-/fuz_css-0.51.0.tgz", - "integrity": "sha512-vSpPgsREdO59ChhnfdBOttHFRnDxTt04KjEvGn4pyi9NU/pDTbASQwyfIyJRFEMJdFaxTPfeuj4PrPz9ArIcNQ==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@fuzdev/fuz_css/-/fuz_css-0.54.0.tgz", + "integrity": "sha512-lP/kK5WOKOH5ocIhlG2nK03Ro5akxJqZXbExWPsXbIxdQsSvGQifa3qxsLZzOyosAzfcMsm6HU3txgOiydxhwQ==", "dev": true, "license": "MIT", "engines": { @@ -1001,8 +1002,8 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@fuzdev/fuz_util": ">=0.50.1", - "@fuzdev/gro": ">=0.192.1", + "@fuzdev/fuz_util": ">=0.52.0", + "@fuzdev/gro": ">=0.195.0", "@sveltejs/acorn-typescript": "^1", "@webref/css": "^8", "acorn-jsx": "^5", @@ -1034,9 +1035,9 @@ } }, "node_modules/@fuzdev/fuz_ui": { - "version": "0.183.1", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_ui/-/fuz_ui-0.183.1.tgz", - "integrity": "sha512-G4UVc18ayUr/KBje/c43FEniTuDPREuI4dhBxt9mJ0mObDrkAze8AqDM1Dkux1MWW6J8CVaJRqHCk/ew1qmMAA==", + "version": "0.185.2", + "resolved": "https://registry.npmjs.org/@fuzdev/fuz_ui/-/fuz_ui-0.185.2.tgz", + "integrity": "sha512-ZeGeYxgYEemjdpAeEZO7bOzUkDDy+hKnvwUB8jKc4Ow1mBMJyDoQRMoZuzpX26zIW2AwH1hHQIu09m2Qn9WvZg==", "dev": true, "license": "MIT", "engines": { @@ -1046,10 +1047,10 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@fuzdev/fuz_code": ">=0.45.0", - "@fuzdev/fuz_css": ">=0.47.0", - "@fuzdev/fuz_util": ">=0.50.1", - "@fuzdev/gro": ">=0.192.0", + "@fuzdev/fuz_code": ">=0.45.1", + "@fuzdev/fuz_css": ">=0.53.0", + "@fuzdev/fuz_util": ">=0.52.0", + "@fuzdev/gro": ">=0.195.0", "@jridgewell/trace-mapping": "^0.3", "@sveltejs/kit": "^2.47.3", "@types/estree": "^1", @@ -1086,9 +1087,9 @@ } }, "node_modules/@fuzdev/fuz_util": { - "version": "0.50.1", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_util/-/fuz_util-0.50.1.tgz", - "integrity": "sha512-ZPo69EcGt/nrWx5F/5A4rj5CfD9Mpr23jg4m0/6ns/dsaMOqlV/Z+8d1wgVF1UzuPQ2/gNBRST0rVRKcrBLuqA==", + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@fuzdev/fuz_util/-/fuz_util-0.52.1.tgz", + "integrity": "sha512-kOqhYkMi3liA9hd69/TGgUiBElfSwnijkxYg31Pea6YyLGqL0pd9uNj7mSHsCaVBUuV5hmVF1FbaBMO5fIeHxg==", "dev": true, "license": "MIT", "peer": true, @@ -1124,9 +1125,9 @@ } }, "node_modules/@fuzdev/gro": { - "version": "0.192.1", - "resolved": "https://registry.npmjs.org/@fuzdev/gro/-/gro-0.192.1.tgz", - "integrity": "sha512-1mPHVuF0dwaXYjc+2D1bLx+Me4xxUdkqDjk3jp9Hypb2PxvihCAppfx1G9E21VIJnNog9xUUYBBacxO2aa5yVg==", + "version": "0.196.0", + "resolved": "https://registry.npmjs.org/@fuzdev/gro/-/gro-0.196.0.tgz", + "integrity": "sha512-6UnuzcJ6HxR+CeML5vA6Yfc9Uhy7pkwvLHyfJGeM8TTK5GmL9ALvfKLRWGBb5ClVx9TIdRb790fJj2OTWpWuCg==", "dev": true, "license": "MIT", "dependencies": { @@ -1153,7 +1154,7 @@ "vitest": "^3 || ^4" }, "peerDependencies": { - "@fuzdev/fuz_util": ">=0.49.2", + "@fuzdev/fuz_util": ">=0.52.1", "@sveltejs/kit": "^2", "esbuild": "^0.27.0", "svelte": "^5", diff --git a/package.json b/package.json index 09fb8ed4..61dc1253 100644 --- a/package.json +++ b/package.json @@ -69,10 +69,10 @@ }, "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@fuzdev/fuz_code": "^0.45.0", - "@fuzdev/fuz_css": "^0.51.0", - "@fuzdev/fuz_ui": "^0.183.1", - "@fuzdev/gro": "^0.192.1", + "@fuzdev/fuz_code": "^0.45.1", + "@fuzdev/fuz_css": "^0.54.0", + "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/gro": "^0.196.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.9.0", From 44578abb40f2962ce8a22f5b442ae3de898f03b5 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Fri, 27 Feb 2026 11:25:27 -0500 Subject: [PATCH 11/20] wip --- package-lock.json | 104 ++++++++++++++-------------------------- package.json | 2 +- src/routes/library.json | 2 +- 3 files changed, 38 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fe72128..075b4767 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.54.0", - "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/fuz_ui": "file:../fuz_ui", "@fuzdev/gro": "^0.196.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", @@ -75,37 +75,40 @@ }, "../fuz_ui": { "name": "@fuzdev/fuz_ui", - "version": "0.179.0", - "extraneous": true, + "version": "0.185.2", + "dev": true, "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", - "@fuzdev/fuz_code": "^0.40.0", - "@fuzdev/fuz_css": "^0.44.1", - "@fuzdev/fuz_util": "^0.45.3", + "@fuzdev/fuz_code": "^0.45.1", + "@fuzdev/fuz_css": "^0.53.0", + "@fuzdev/fuz_util": "^0.52.0", + "@fuzdev/gro": "^0.195.0", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/gro": "^0.186.0", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.49.1", + "@sveltejs/kit": "^2.50.1", "@sveltejs/package": "^2.5.7", - "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@types/estree": "^1.0.8", "@types/node": "^24.10.1", "@webref/css": "^8.2.0", "eslint": "^9.39.1", "eslint-plugin-svelte": "^3.13.1", "esm-env": "^1.2.2", "jsdom": "^27.2.0", + "magic-string": "^0.30.21", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.1", - "svelte": "^5.46.1", - "svelte-check": "^4.3.5", - "svelte2tsx": "^0.7.46", + "svelte": "^5.49.1", + "svelte-check": "^4.3.6", + "svelte2tsx": "^0.7.47", "tslib": "^2.8.1", "typescript": "^5.9.3", "typescript-eslint": "^8.48.1", "vitest": "^4.0.15", - "zod": "^4.1.13" + "zimmerframe": "^1.1.4", + "zod": "^4.3.6" }, "engines": { "node": ">=22.15" @@ -114,12 +117,13 @@ "url": "https://www.ryanatkn.com/funding" }, "peerDependencies": { - "@fuzdev/fuz_code": ">=0.40.0", - "@fuzdev/fuz_css": ">=0.44.1", - "@fuzdev/fuz_util": ">=0.45.3", + "@fuzdev/fuz_code": ">=0.45.1", + "@fuzdev/fuz_css": ">=0.53.0", + "@fuzdev/fuz_util": ">=0.52.0", + "@fuzdev/gro": ">=0.195.0", "@jridgewell/trace-mapping": "^0.3", - "@ryanatkn/gro": ">=0.186.0", "@sveltejs/kit": "^2.47.3", + "@types/estree": "^1", "esm-env": "^1", "svelte": "^5", "svelte2tsx": "^0.7.45", @@ -129,14 +133,26 @@ "@fuzdev/fuz_code": { "optional": true }, + "@fuzdev/fuz_util": { + "optional": true + }, + "@fuzdev/gro": { + "optional": true + }, "@jridgewell/trace-mapping": { "optional": true }, - "@ryanatkn/gro": { + "@types/estree": { "optional": true }, "esm-env": { "optional": true + }, + "svelte2tsx": { + "optional": true + }, + "zod": { + "optional": true } } }, @@ -1035,56 +1051,8 @@ } }, "node_modules/@fuzdev/fuz_ui": { - "version": "0.185.2", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_ui/-/fuz_ui-0.185.2.tgz", - "integrity": "sha512-ZeGeYxgYEemjdpAeEZO7bOzUkDDy+hKnvwUB8jKc4Ow1mBMJyDoQRMoZuzpX26zIW2AwH1hHQIu09m2Qn9WvZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://www.ryanatkn.com/funding" - }, - "peerDependencies": { - "@fuzdev/fuz_code": ">=0.45.1", - "@fuzdev/fuz_css": ">=0.53.0", - "@fuzdev/fuz_util": ">=0.52.0", - "@fuzdev/gro": ">=0.195.0", - "@jridgewell/trace-mapping": "^0.3", - "@sveltejs/kit": "^2.47.3", - "@types/estree": "^1", - "esm-env": "^1", - "svelte": "^5", - "svelte2tsx": "^0.7.45", - "zod": "^4.1.12" - }, - "peerDependenciesMeta": { - "@fuzdev/fuz_code": { - "optional": true - }, - "@fuzdev/fuz_util": { - "optional": true - }, - "@fuzdev/gro": { - "optional": true - }, - "@jridgewell/trace-mapping": { - "optional": true - }, - "@types/estree": { - "optional": true - }, - "esm-env": { - "optional": true - }, - "svelte2tsx": { - "optional": true - }, - "zod": { - "optional": true - } - } + "resolved": "../fuz_ui", + "link": true }, "node_modules/@fuzdev/fuz_util": { "version": "0.52.1", diff --git a/package.json b/package.json index ac7f405c..cc46c834 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.54.0", - "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/fuz_ui": "file:../fuz_ui", "@fuzdev/gro": "^0.196.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", diff --git a/src/routes/library.json b/src/routes/library.json index 7d7978a1..0d3ec485 100644 --- a/src/routes/library.json +++ b/src/routes/library.json @@ -77,7 +77,7 @@ "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.54.0", - "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/fuz_ui": "file:../fuz_ui", "@fuzdev/gro": "^0.196.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", From 1948e6c15902f5c40687b83f96d2ca79d6a5efbe Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sat, 28 Feb 2026 07:40:04 -0500 Subject: [PATCH 12/20] wip --- package-lock.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 075b4767..72014dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,9 +81,10 @@ "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.1", - "@fuzdev/fuz_css": "^0.53.0", - "@fuzdev/fuz_util": "^0.52.0", - "@fuzdev/gro": "^0.195.0", + "@fuzdev/fuz_css": "^0.54.0", + "@fuzdev/fuz_util": "^0.52.1", + "@fuzdev/gro": "^0.196.0", + "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.9.0", "@sveltejs/adapter-static": "^3.0.10", @@ -119,7 +120,7 @@ "peerDependencies": { "@fuzdev/fuz_code": ">=0.45.1", "@fuzdev/fuz_css": ">=0.53.0", - "@fuzdev/fuz_util": ">=0.52.0", + "@fuzdev/fuz_util": ">0.52.1", "@fuzdev/gro": ">=0.195.0", "@jridgewell/trace-mapping": "^0.3", "@sveltejs/kit": "^2.47.3", From 24bbfe2ad0818241fc6d70f0a60c1c431208256e Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Mon, 2 Mar 2026 16:41:40 -0500 Subject: [PATCH 13/20] wip --- svelte.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svelte.config.js b/svelte.config.js index a8abb797..9d272667 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -12,7 +12,7 @@ export default { vitePlugin: {inspector: true}, kit: { adapter: adapter(), - paths: {relative: false}, // use root-absolute paths for SSR path comparison: https://kit.svelte.dev/docs/configuration#paths + paths: {relative: false}, // use root-absolute paths for SSR path comparison: https://svelte.dev/docs/kit/configuration#paths alias: { $routes: 'src/routes', '@fuzdev/fuz_util': 'src/lib', From 039edb7c2bf07e3213a14e67b2c463a6ff40c6be Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Thu, 5 Mar 2026 18:53:42 -0500 Subject: [PATCH 14/20] wip --- package-lock.json | 152 ++++++++++++++++++---------------------------- 1 file changed, 58 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e12acb8..85247d01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,90 +78,6 @@ } } }, - "../fuz_ui": { - "name": "@fuzdev/fuz_ui", - "version": "0.185.2", - "dev": true, - "license": "MIT", - "devDependencies": { - "@changesets/changelog-git": "^0.2.1", - "@fuzdev/fuz_code": "^0.45.1", - "@fuzdev/fuz_css": "^0.54.0", - "@fuzdev/fuz_util": "^0.52.1", - "@fuzdev/gro": "^0.196.0", - "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", - "@jridgewell/trace-mapping": "^0.3.31", - "@ryanatkn/eslint-config": "^0.9.0", - "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.50.1", - "@sveltejs/package": "^2.5.7", - "@sveltejs/vite-plugin-svelte": "^6.2.4", - "@types/estree": "^1.0.8", - "@types/node": "^24.10.1", - "@webref/css": "^8.2.0", - "eslint": "^9.39.1", - "eslint-plugin-svelte": "^3.13.1", - "esm-env": "^1.2.2", - "jsdom": "^27.2.0", - "magic-string": "^0.30.21", - "prettier": "^3.7.4", - "prettier-plugin-svelte": "^3.4.1", - "svelte": "^5.49.1", - "svelte-check": "^4.3.6", - "svelte2tsx": "^0.7.47", - "tslib": "^2.8.1", - "typescript": "^5.9.3", - "typescript-eslint": "^8.48.1", - "vitest": "^4.0.15", - "zimmerframe": "^1.1.4", - "zod": "^4.3.6" - }, - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://www.ryanatkn.com/funding" - }, - "peerDependencies": { - "@fuzdev/fuz_code": ">=0.45.1", - "@fuzdev/fuz_css": ">=0.53.0", - "@fuzdev/fuz_util": ">0.52.1", - "@fuzdev/gro": ">=0.195.0", - "@jridgewell/trace-mapping": "^0.3", - "@sveltejs/kit": "^2.47.3", - "@types/estree": "^1", - "esm-env": "^1", - "svelte": "^5", - "svelte2tsx": "^0.7.45", - "zod": "^4.1.12" - }, - "peerDependenciesMeta": { - "@fuzdev/fuz_code": { - "optional": true - }, - "@fuzdev/fuz_util": { - "optional": true - }, - "@fuzdev/gro": { - "optional": true - }, - "@jridgewell/trace-mapping": { - "optional": true - }, - "@types/estree": { - "optional": true - }, - "esm-env": { - "optional": true - }, - "svelte2tsx": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "../private_svelte-docinfo": { "name": "@fuzdev/svelte-docinfo", "version": "0.0.1", @@ -177,14 +93,14 @@ }, "devDependencies": { "@fuzdev/fuz_code": "^0.45.1", - "@fuzdev/fuz_css": "^0.54.0", - "@fuzdev/fuz_ui": "^0.185.2", - "@fuzdev/fuz_util": "^0.52.1", - "@fuzdev/gro": "^0.196.0", + "@fuzdev/fuz_css": "^0.55.0", + "@fuzdev/fuz_ui": "^0.186.0", + "@fuzdev/fuz_util": "^0.53.2", + "@fuzdev/gro": "^0.197.0", "@jridgewell/trace-mapping": "^0.3.31", - "@ryanatkn/eslint-config": "^0.9.0", + "@ryanatkn/eslint-config": "^0.10.0", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.50.1", + "@sveltejs/kit": "^2.53.4", "@sveltejs/package": "^2.5.7", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@types/estree": "^1.0.8", @@ -197,7 +113,7 @@ "magic-string": "^0.30.21", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.1", - "svelte": "^5.49.1", + "svelte": "^5.53.7", "svelte-check": "^4.3.5", "svelte2tsx": "^0.7.47", "tinyglobby": "^0.2.15", @@ -211,7 +127,7 @@ "node": ">=22.15" }, "peerDependencies": { - "@fuzdev/fuz_util": "^0.52.0", + "@fuzdev/fuz_util": "^0.53.2", "@jridgewell/trace-mapping": "^0.3.25", "es-module-lexer": "^2.0.0", "svelte": "^5.0.0", @@ -1074,8 +990,56 @@ } }, "node_modules/@fuzdev/fuz_ui": { - "resolved": "../fuz_ui", - "link": true + "version": "0.185.2", + "resolved": "https://registry.npmjs.org/@fuzdev/fuz_ui/-/fuz_ui-0.185.2.tgz", + "integrity": "sha512-ZeGeYxgYEemjdpAeEZO7bOzUkDDy+hKnvwUB8jKc4Ow1mBMJyDoQRMoZuzpX26zIW2AwH1hHQIu09m2Qn9WvZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.15" + }, + "funding": { + "url": "https://www.ryanatkn.com/funding" + }, + "peerDependencies": { + "@fuzdev/fuz_code": ">=0.45.1", + "@fuzdev/fuz_css": ">=0.53.0", + "@fuzdev/fuz_util": ">=0.52.0", + "@fuzdev/gro": ">=0.195.0", + "@jridgewell/trace-mapping": "^0.3", + "@sveltejs/kit": "^2.47.3", + "@types/estree": "^1", + "esm-env": "^1", + "svelte": "^5", + "svelte2tsx": "^0.7.45", + "zod": "^4.1.12" + }, + "peerDependenciesMeta": { + "@fuzdev/fuz_code": { + "optional": true + }, + "@fuzdev/fuz_util": { + "optional": true + }, + "@fuzdev/gro": { + "optional": true + }, + "@jridgewell/trace-mapping": { + "optional": true + }, + "@types/estree": { + "optional": true + }, + "esm-env": { + "optional": true + }, + "svelte2tsx": { + "optional": true + }, + "zod": { + "optional": true + } + } }, "node_modules/@fuzdev/fuz_util": { "version": "0.53.0", From be48f772937c4060e74c9481e9583db64a8d538a Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Fri, 6 Mar 2026 08:28:38 -0500 Subject: [PATCH 15/20] wip --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 038a1e94..f72775c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@fuzdev/gro": "^0.197.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", - "@ryanatkn/eslint-config": "^0.10.0", + "@ryanatkn/eslint-config": "^0.10.1", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.50.1", "@sveltejs/package": "^2.5.7", @@ -1864,9 +1864,9 @@ ] }, "node_modules/@ryanatkn/eslint-config": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@ryanatkn/eslint-config/-/eslint-config-0.10.0.tgz", - "integrity": "sha512-+kOz6a4BqCDuprN5LpirM9ww6huE7rqhonSA3nxbw8Jsy3Vj8fd9q27TJLTjJyxoxC3twsINpMr92vWpKffuUA==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@ryanatkn/eslint-config/-/eslint-config-0.10.1.tgz", + "integrity": "sha512-fHQ5PyFriflVj/fiF9m4SoUnipyK/Of522HL3+YA5TD2lKdJueA5c4wxucxkuFanuZ1FvsCBjGN/wMHO94HNHA==", "dev": true, "license": "Unlicense", "dependencies": { diff --git a/package.json b/package.json index d9824e03..fe443893 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "@fuzdev/gro": "^0.197.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", - "@ryanatkn/eslint-config": "^0.10.0", + "@ryanatkn/eslint-config": "^0.10.1", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.50.1", "@sveltejs/package": "^2.5.7", From 51e1efa1cb48e29894da0f506b9aab3208e46148 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sun, 8 Mar 2026 10:39:14 -0400 Subject: [PATCH 16/20] wip --- package-lock.json | 1361 +++++++-------------------------------- package.json | 4 +- src/routes/library.json | 4 +- 3 files changed, 236 insertions(+), 1133 deletions(-) diff --git a/package-lock.json b/package-lock.json index f72775c4..702898cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,8 @@ "@fuzdev/blake3_wasm": "^0.1.0", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.55.0", - "@fuzdev/fuz_ui": "^0.185.2", - "@fuzdev/gro": "^0.197.0", + "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/gro": "file:../gro", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.10.1", @@ -78,125 +78,221 @@ } } }, - "../private_svelte-docinfo": { - "name": "@fuzdev/svelte-docinfo", - "version": "0.0.1", + "../fuz_ui": { + "name": "@fuzdev/fuz_ui", + "version": "0.186.0", "dev": true, "license": "MIT", - "dependencies": { - "commander": "^14.0.2", - "typescript": "^5.9.3", - "zod": "^4.3.6" - }, - "bin": { - "svelte-docinfo": "dist/main.js" - }, "devDependencies": { + "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.1", - "@fuzdev/fuz_css": "^0.55.0", - "@fuzdev/fuz_ui": "^0.186.0", - "@fuzdev/fuz_util": "^0.53.2", - "@fuzdev/gro": "^0.197.0", + "@fuzdev/fuz_css": "^0.54.0", + "@fuzdev/fuz_util": "file:../fuz_util", + "@fuzdev/gro": "file:../gro", + "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", - "@ryanatkn/eslint-config": "^0.10.0", + "@ryanatkn/eslint-config": "^0.9.0", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.53.4", + "@sveltejs/kit": "^2.50.1", "@sveltejs/package": "^2.5.7", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@types/estree": "^1.0.8", - "@types/node": "^24.10.4", + "@types/node": "^24.10.1", "@webref/css": "^8.2.0", - "es-module-lexer": "^2.0.0", "eslint": "^9.39.1", "eslint-plugin-svelte": "^3.13.1", "esm-env": "^1.2.2", + "jsdom": "^27.2.0", "magic-string": "^0.30.21", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.1", - "svelte": "^5.53.7", - "svelte-check": "^4.3.5", + "svelte": "^5.49.1", + "svelte-check": "^4.3.6", "svelte2tsx": "^0.7.47", - "tinyglobby": "^0.2.15", "tslib": "^2.8.1", "typescript": "^5.9.3", "typescript-eslint": "^8.48.1", "vitest": "^4.0.15", - "zimmerframe": "^1.1.4" + "zimmerframe": "^1.1.4", + "zod": "^4.3.6" }, "engines": { "node": ">=22.15" }, + "funding": { + "url": "https://www.ryanatkn.com/funding" + }, "peerDependencies": { - "@fuzdev/fuz_util": "^0.53.2", - "@jridgewell/trace-mapping": "^0.3.25", - "es-module-lexer": "^2.0.0", - "svelte": "^5.0.0", - "svelte2tsx": "^0.7.30", - "tinyglobby": "^0.2.15" + "@fuzdev/fuz_code": ">=0.45.1", + "@fuzdev/fuz_css": ">=0.53.0", + "@fuzdev/fuz_util": "file:../fuz_util", + "@fuzdev/gro": "file:../gro", + "@jridgewell/trace-mapping": "^0.3", + "@sveltejs/kit": "^2.47.3", + "@types/estree": "^1", + "esm-env": "^1", + "svelte": "^5", + "svelte2tsx": "^0.7.45", + "zod": "^4.1.12" }, "peerDependenciesMeta": { + "@fuzdev/fuz_code": { + "optional": true + }, + "@fuzdev/fuz_util": { + "optional": true + }, + "@fuzdev/gro": { + "optional": true + }, "@jridgewell/trace-mapping": { "optional": true }, - "es-module-lexer": { + "@types/estree": { + "optional": true + }, + "esm-env": { "optional": true }, "svelte2tsx": { "optional": true }, - "tinyglobby": { + "zod": { "optional": true } } }, - "../svelte-docinfo": { + "../gro": { + "name": "@fuzdev/gro", + "version": "0.197.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", + "chokidar": "^5.0.0", + "dotenv": "^17.2.3", + "esm-env": "^1.2.2", + "oxc-parser": "^0.99.0", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.1", + "ts-blank-space": "^0.6.2", + "tslib": "^2.8.1", + "zod": "^4.3.6" + }, + "bin": { + "gro": "dist/gro.js" + }, + "devDependencies": { + "@changesets/changelog-git": "^0.2.1", + "@changesets/types": "^6.1.0", + "@fuzdev/blake3_wasm": "^0.1.0", + "@fuzdev/fuz_code": "^0.45.1", + "@fuzdev/fuz_css": "^0.55.0", + "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/fuz_util": "file:../fuz_util", + "@jridgewell/trace-mapping": "^0.3.31", + "@ryanatkn/eslint-config": "^0.10.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.53.0", + "@sveltejs/package": "^2.5.7", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@types/estree": "^1.0.8", + "@types/node": "^24.10.1", + "@webref/css": "^8.2.0", + "esbuild": "^0.27.1", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.1", + "magic-string": "^0.30.21", + "svelte": "^5.53.1", + "svelte-check": "^4.4.3", + "svelte2tsx": "^0.7.51", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vitest": "^4.0.15", + "zimmerframe": "^1.1.4" + }, + "engines": { + "node": ">=22.15" + }, + "funding": { + "url": "https://www.ryanatkn.com/funding" + }, + "optionalDependencies": { + "vitest": "^3 || ^4" + }, + "peerDependencies": { + "@fuzdev/blake3_wasm": "^0.1.0", + "@fuzdev/fuz_util": "file:../fuz_util", + "@sveltejs/kit": "^2", + "esbuild": "^0.27.0", + "svelte": "^5", + "typescript": "^5", + "vitest": "^3 || ^4" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "../private_svelte-docinfo": { "name": "@fuzdev/svelte-docinfo", "version": "0.0.1", - "extraneous": true, + "dev": true, + "license": "MIT", "dependencies": { "commander": "^14.0.2", "typescript": "^5.9.3", - "zod": "^4.1.12" + "zod": "^4.3.6" }, "bin": { - "svelte-docinfo": "dist/svelte_docinfo_cli.js" + "svelte-docinfo": "dist/main.js" }, "devDependencies": { - "@fuzdev/fuz_code": "^0.40.0", - "@fuzdev/fuz_css": "^0.44.1", - "@fuzdev/fuz_ui": "^0.179.0", - "@fuzdev/fuz_util": "^0.45.3", - "@ryanatkn/eslint-config": "^0.9.0", - "@ryanatkn/gro": "^0.186.0", + "@fuzdev/fuz_code": "^0.45.1", + "@fuzdev/fuz_css": "^0.55.0", + "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/fuz_util": "file:../fuz_util", + "@fuzdev/gro": "^0.197.0", + "@jridgewell/trace-mapping": "^0.3.31", + "@ryanatkn/eslint-config": "^0.10.0", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.49.1", + "@sveltejs/kit": "^2.53.4", "@sveltejs/package": "^2.5.7", - "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@types/estree": "^1.0.8", "@types/node": "^24.10.4", "@webref/css": "^8.2.0", "es-module-lexer": "^2.0.0", "eslint": "^9.39.1", "eslint-plugin-svelte": "^3.13.1", + "esm-env": "^1.2.2", + "magic-string": "^0.30.21", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.1", - "svelte": "^5.45.6", - "svelte-check": "^4.3.4", + "svelte": "^5.53.7", + "svelte-check": "^4.3.5", + "svelte2tsx": "^0.7.47", "tinyglobby": "^0.2.15", "tslib": "^2.8.1", "typescript": "^5.9.3", "typescript-eslint": "^8.48.1", - "vitest": "^4.0.15" + "vitest": "^4.0.15", + "zimmerframe": "^1.1.4" }, "engines": { "node": ">=22.15" }, "peerDependencies": { - "@fuzdev/fuz_util": "^0.45.3", + "@fuzdev/fuz_util": "file:../fuz_util", "@jridgewell/trace-mapping": "^0.3.25", - "es-module-lexer": "^1.5.4", + "es-module-lexer": "^2.0.0", "svelte": "^5.0.0", "svelte2tsx": "^0.7.30", - "tinyglobby": "^0.3.1" + "tinyglobby": "^0.2.15" }, "peerDependenciesMeta": { "@jridgewell/trace-mapping": { @@ -205,533 +301,98 @@ "es-module-lexer": { "optional": true }, - "svelte2tsx": { + "svelte": { "optional": true }, - "tinyglobby": { - "optional": true - } - } - }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", - "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0" - } - }, - "node_modules/@changesets/types": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" + "svelte2tsx": { + "optional": true + }, + "tinyglobby": { + "optional": true + } } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "../svelte-docinfo": { + "name": "@fuzdev/svelte-docinfo", + "version": "0.0.1", + "extraneous": true, + "dependencies": { + "commander": "^14.0.2", + "typescript": "^5.9.3", + "zod": "^4.1.12" + }, + "bin": { + "svelte-docinfo": "dist/svelte_docinfo_cli.js" + }, + "devDependencies": { + "@fuzdev/fuz_code": "^0.40.0", + "@fuzdev/fuz_css": "^0.44.1", + "@fuzdev/fuz_ui": "^0.179.0", + "@fuzdev/fuz_util": "^0.45.3", + "@ryanatkn/eslint-config": "^0.9.0", + "@ryanatkn/gro": "^0.186.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/package": "^2.5.7", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@types/node": "^24.10.4", + "@webref/css": "^8.2.0", + "es-module-lexer": "^2.0.0", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.1", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.1", + "svelte": "^5.45.6", + "svelte-check": "^4.3.4", + "tinyglobby": "^0.2.15", + "tslib": "^2.8.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vitest": "^4.0.15" + }, "engines": { - "node": ">=18" + "node": ">=22.15" + }, + "peerDependencies": { + "@fuzdev/fuz_util": "^0.45.3", + "@jridgewell/trace-mapping": "^0.3.25", + "es-module-lexer": "^1.5.4", + "svelte": "^5.0.0", + "svelte2tsx": "^0.7.30", + "tinyglobby": "^0.3.1" + }, + "peerDependenciesMeta": { + "@jridgewell/trace-mapping": { + "optional": true + }, + "es-module-lexer": { + "optional": true + }, + "svelte2tsx": { + "optional": true + }, + "tinyglobby": { + "optional": true + } } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], + "node_modules/@changesets/changelog-git": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", + "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "@changesets/types": "^6.1.0" } }, + "node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -990,175 +651,12 @@ } }, "node_modules/@fuzdev/fuz_ui": { - "version": "0.185.2", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_ui/-/fuz_ui-0.185.2.tgz", - "integrity": "sha512-ZeGeYxgYEemjdpAeEZO7bOzUkDDy+hKnvwUB8jKc4Ow1mBMJyDoQRMoZuzpX26zIW2AwH1hHQIu09m2Qn9WvZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://www.ryanatkn.com/funding" - }, - "peerDependencies": { - "@fuzdev/fuz_code": ">=0.45.1", - "@fuzdev/fuz_css": ">=0.53.0", - "@fuzdev/fuz_util": ">=0.52.0", - "@fuzdev/gro": ">=0.195.0", - "@jridgewell/trace-mapping": "^0.3", - "@sveltejs/kit": "^2.47.3", - "@types/estree": "^1", - "esm-env": "^1", - "svelte": "^5", - "svelte2tsx": "^0.7.45", - "zod": "^4.1.12" - }, - "peerDependenciesMeta": { - "@fuzdev/fuz_code": { - "optional": true - }, - "@fuzdev/fuz_util": { - "optional": true - }, - "@fuzdev/gro": { - "optional": true - }, - "@jridgewell/trace-mapping": { - "optional": true - }, - "@types/estree": { - "optional": true - }, - "esm-env": { - "optional": true - }, - "svelte2tsx": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/@fuzdev/fuz_util": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@fuzdev/fuz_util/-/fuz_util-0.53.0.tgz", - "integrity": "sha512-ydiB85grq38hoktAAm4Ci4y3z++WRv1EuxsN0M774V5u3gRfvz9vTAOpwqTwfxEJDCrTrTPyGSVCNmfMpoBt5w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://www.ryanatkn.com/funding" - }, - "peerDependencies": { - "@fuzdev/blake3_wasm": "^0.1.0", - "@types/estree": "^1", - "@types/node": "^24", - "esm-env": "^1.2.2", - "svelte": "^5", - "zod": "^4.0.14" - }, - "peerDependenciesMeta": { - "@fuzdev/blake3_wasm": { - "optional": true - }, - "@types/estree": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "esm-env": { - "optional": true - }, - "svelte": { - "optional": true - }, - "zod": { - "optional": true - } - } + "resolved": "../fuz_ui", + "link": true }, "node_modules/@fuzdev/gro": { - "version": "0.197.0", - "resolved": "https://registry.npmjs.org/@fuzdev/gro/-/gro-0.197.0.tgz", - "integrity": "sha512-8su6n1a7UCOJUWIwRPIr88hmLlP1lKwEdQJieP0T8lVLKdrP/wMA7TrkMUPOxxKzfKcONx6eWO6hrCNrPrVPKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "dotenv": "^17.2.3", - "esm-env": "^1.2.2", - "oxc-parser": "^0.99.0", - "prettier": "^3.7.4", - "prettier-plugin-svelte": "^3.4.1", - "ts-blank-space": "^0.6.2", - "tslib": "^2.8.1", - "zod": "^4.3.6" - }, - "bin": { - "gro": "dist/gro.js" - }, - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://www.ryanatkn.com/funding" - }, - "optionalDependencies": { - "vitest": "^3 || ^4" - }, - "peerDependencies": { - "@fuzdev/blake3_wasm": "^0.1.0", - "@fuzdev/fuz_util": ">=0.53.0", - "@sveltejs/kit": "^2", - "esbuild": "^0.27.0", - "svelte": "^5", - "typescript": "^5", - "vitest": "^3 || ^4" - }, - "peerDependenciesMeta": { - "@sveltejs/kit": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@fuzdev/gro/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@fuzdev/gro/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "resolved": "../gro", + "link": true }, "node_modules/@fuzdev/svelte-docinfo": { "resolved": "../private_svelte-docinfo", @@ -1266,288 +764,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.99.0.tgz", - "integrity": "sha512-V4jhmKXgQQdRnm73F+r3ZY4pUEsijQeSraFeaCGng7abSNJGs76X6l82wHnmjLGFAeY00LWtjcELs7ZmbJ9+lA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.99.0.tgz", - "integrity": "sha512-Rp41nf9zD5FyLZciS9l1GfK8PhYqrD5kEGxyTOA2esTLeAy37rZxetG2E3xteEolAkeb2WDkVrlxPtibeAncMg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.99.0.tgz", - "integrity": "sha512-WVonp40fPPxo5Gs0POTI57iEFv485TvNKOHMwZRhigwZRhZY2accEAkYIhei9eswF4HN5B44Wybkz7Gd1Qr/5Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.99.0.tgz", - "integrity": "sha512-H30bjOOttPmG54gAqu6+HzbLEzuNOYO2jZYrIq4At+NtLJwvNhXz28Hf5iEAFZIH/4hMpLkM4VN7uc+5UlNW3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.99.0.tgz", - "integrity": "sha512-0Z/Th0SYqzSRDPs6tk5lQdW0i73UCupnim3dgq2oW0//UdLonV/5wIZCArfKGC7w9y4h8TxgXpgtIyD1kKzzlQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.99.0.tgz", - "integrity": "sha512-xo0wqNd5bpbzQVNpAIFbHk1xa+SaS/FGBABCd942SRTnrpxl6GeDj/s1BFaGcTl8MlwlKVMwOcyKrw/2Kdfquw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.99.0.tgz", - "integrity": "sha512-u26I6LKoLTPTd4Fcpr0aoAtjnGf5/ulMllo+QUiBhupgbVCAlaj4RyXH/mvcjcsl2bVBv9E/gYJZz2JjxQWXBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.99.0.tgz", - "integrity": "sha512-qhftDo2D37SqCEl3ZTa367NqWSZNb1Ddp34CTmShLKFrnKdNiUn55RdokLnHtf1AL5ssaQlYDwBECX7XiBWOhw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.99.0.tgz", - "integrity": "sha512-zxn/xkf519f12FKkpL5XwJipsylfSSnm36h6c1zBDTz4fbIDMGyIhHfWfwM7uUmHo9Aqw1pLxFpY39Etv398+Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.99.0.tgz", - "integrity": "sha512-Y1eSDKDS5E4IVC7Oxw+NbYAKRmJPMJTIjW+9xOWwteDHkFqpocKe0USxog+Q1uhzalD9M0p9eXWEWdGQCMDBMQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.99.0.tgz", - "integrity": "sha512-YVJMfk5cFWB8i2/nIrbk6n15bFkMHqWnMIWkVx7r2KwpTxHyFMfu2IpeVKo1ITDSmt5nBrGdLHD36QRlu2nDLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.99.0.tgz", - "integrity": "sha512-2+SDPrie5f90A1b9EirtVggOgsqtsYU5raZwkDYKyS1uvJzjqHCDhG/f4TwQxHmIc5YkczdQfwvN91lwmjsKYQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.99.0.tgz", - "integrity": "sha512-DKA4j0QerUWSMADziLM5sAyM7V53Fj95CV9SjP77bPfEfT7MnvFKnneaRMqPK1cpzjAGiQF52OBUIKyk0dwOQA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.7" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.99.0.tgz", - "integrity": "sha512-EaB3AvsxqdNUhh9FOoAxRZ2L4PCRwDlDb//QXItwyOJrX7XS+uGK9B1KEUV4FZ/7rDhHsWieLt5e07wl2Ti5AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.99.0.tgz", - "integrity": "sha512-sJN1Q8h7ggFOyDn0zsHaXbP/MklAVUvhrbq0LA46Qum686P3SZQHjbATqJn9yaVEvaSKXCshgl0vQ1gWkGgpcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.99.0.tgz", - "integrity": "sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", @@ -2046,17 +1262,6 @@ "vite": "^6.3.0 || ^7.0.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -2797,19 +2002,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dotenv": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", @@ -2817,49 +2009,6 @@ "dev": true, "license": "MIT" }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3551,39 +2700,6 @@ "node": ">= 0.8.0" } }, - "node_modules/oxc-parser": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.99.0.tgz", - "integrity": "sha512-MpS1lbd2vR0NZn1v0drpgu7RUFu3x9Rd0kxExObZc2+F+DIrV0BOMval/RO3BYGwssIOerII6iS8EbbpCCZQpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "^0.99.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-parser/binding-android-arm64": "0.99.0", - "@oxc-parser/binding-darwin-arm64": "0.99.0", - "@oxc-parser/binding-darwin-x64": "0.99.0", - "@oxc-parser/binding-freebsd-x64": "0.99.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.99.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.99.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.99.0", - "@oxc-parser/binding-linux-arm64-musl": "0.99.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.99.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.99.0", - "@oxc-parser/binding-linux-x64-gnu": "0.99.0", - "@oxc-parser/binding-linux-x64-musl": "0.99.0", - "@oxc-parser/binding-wasm32-wasi": "0.99.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.99.0", - "@oxc-parser/binding-win32-x64-msvc": "0.99.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4217,19 +3333,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-blank-space": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ts-blank-space/-/ts-blank-space-0.6.2.tgz", - "integrity": "sha512-hZjcHdHrveEKI67v8OzI90a1bizgoDkY7ekE4fH89qJhZgxvmjfBOv98aibCU7OpKbvV3R9p/qd3DrzZqT1cFQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "typescript": "5.1.6 - 5.9.x" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", diff --git a/package.json b/package.json index fe443893..12c6af32 100644 --- a/package.json +++ b/package.json @@ -78,8 +78,8 @@ "@fuzdev/blake3_wasm": "^0.1.0", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.55.0", - "@fuzdev/fuz_ui": "^0.185.2", - "@fuzdev/gro": "^0.197.0", + "@fuzdev/fuz_ui": "file:../fuz_ui", + "@fuzdev/gro": "file:../gro", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.10.1", diff --git a/src/routes/library.json b/src/routes/library.json index 88450b8b..16209011 100644 --- a/src/routes/library.json +++ b/src/routes/library.json @@ -84,11 +84,11 @@ "@fuzdev/blake3_wasm": "^0.1.0", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.55.0", - "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/fuz_ui": "file:../fuz_ui", "@fuzdev/gro": "^0.197.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", - "@ryanatkn/eslint-config": "^0.10.0", + "@ryanatkn/eslint-config": "^0.10.1", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.50.1", "@sveltejs/package": "^2.5.7", From f21e9abebfbcd9d697ed3743a16993e747167d6a Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sun, 8 Mar 2026 17:14:09 -0400 Subject: [PATCH 17/20] wip --- CLAUDE.md | 2 +- package-lock.json | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 149e7e3e..b2205808 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -43,7 +43,7 @@ fuz_util is a **foundational utility library**: - `iterator.ts` - iterator helpers - `bytes.ts` - binary data conversion (`to_bytes`) - `hex.ts` - hex encoding (`to_hex`) -- `hash_blake3.ts` - BLAKE3 hashing (`hash_blake3`, sync, 64-char hex, via +- `hash_blake3.ts` - BLAKE3 hashing (`hash_blake3`, sync, 64-char hex; `Blake3Hash` Zod schema, via `@fuzdev/blake3_wasm`) - `hash.ts` - `hash_sha256` (Web Crypto SHA-256, async), `hash_insecure` (DJB2 for non-security uses) diff --git a/package-lock.json b/package-lock.json index 702898cb..1aa7d07f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@fuzdev/fuz_util", - "version": "0.53.3", + "version": "0.53.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@fuzdev/fuz_util", - "version": "0.53.3", + "version": "0.53.4", "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", @@ -86,12 +86,12 @@ "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.1", - "@fuzdev/fuz_css": "^0.54.0", - "@fuzdev/fuz_util": "file:../fuz_util", - "@fuzdev/gro": "file:../gro", + "@fuzdev/fuz_css": "^0.55.0", + "@fuzdev/fuz_util": "^0.53.3", + "@fuzdev/gro": "^0.197.0", "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", - "@ryanatkn/eslint-config": "^0.9.0", + "@ryanatkn/eslint-config": "^0.10.1", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.50.1", "@sveltejs/package": "^2.5.7", @@ -168,7 +168,6 @@ "dev": true, "license": "MIT", "dependencies": { - "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "chokidar": "^5.0.0", "dotenv": "^17.2.3", "esm-env": "^1.2.2", @@ -188,8 +187,8 @@ "@fuzdev/blake3_wasm": "^0.1.0", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.55.0", - "@fuzdev/fuz_ui": "file:../fuz_ui", - "@fuzdev/fuz_util": "file:../fuz_util", + "@fuzdev/fuz_ui": "^0.185.2", + "@fuzdev/fuz_util": "^0.53.0", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.10.0", "@sveltejs/adapter-static": "^3.0.10", @@ -222,7 +221,7 @@ }, "peerDependencies": { "@fuzdev/blake3_wasm": "^0.1.0", - "@fuzdev/fuz_util": "file:../fuz_util", + "@fuzdev/fuz_util": ">=0.53.0", "@sveltejs/kit": "^2", "esbuild": "^0.27.0", "svelte": "^5", From 70b8bd108dd8b5f2c9ff9c12e065165276cde5ed Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Tue, 10 Mar 2026 12:53:07 -0400 Subject: [PATCH 18/20] wip --- package-lock.json | 48 +++++++++++++---------------------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1aa7d07f..21dcbb57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,20 +80,19 @@ }, "../fuz_ui": { "name": "@fuzdev/fuz_ui", - "version": "0.186.0", + "version": "0.187.1", "dev": true, "license": "MIT", "devDependencies": { "@changesets/changelog-git": "^0.2.1", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.55.0", - "@fuzdev/fuz_util": "^0.53.3", + "@fuzdev/fuz_util": "^0.53.4", "@fuzdev/gro": "^0.197.0", - "@fuzdev/svelte-docinfo": "file:../private_svelte-docinfo", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.10.1", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.50.1", + "@sveltejs/kit": "^2.53.4", "@sveltejs/package": "^2.5.7", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@types/estree": "^1.0.8", @@ -106,8 +105,8 @@ "magic-string": "^0.30.21", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.1", - "svelte": "^5.49.1", - "svelte-check": "^4.3.6", + "svelte": "^5.53.7", + "svelte-check": "^4.4.5", "svelte2tsx": "^0.7.47", "tslib": "^2.8.1", "typescript": "^5.9.3", @@ -125,8 +124,8 @@ "peerDependencies": { "@fuzdev/fuz_code": ">=0.45.1", "@fuzdev/fuz_css": ">=0.53.0", - "@fuzdev/fuz_util": "file:../fuz_util", - "@fuzdev/gro": "file:../gro", + "@fuzdev/fuz_util": ">=0.52.0", + "@fuzdev/gro": ">=0.195.0", "@jridgewell/trace-mapping": "^0.3", "@sveltejs/kit": "^2.47.3", "@types/estree": "^1", @@ -243,7 +242,10 @@ "dev": true, "license": "MIT", "dependencies": { - "commander": "^14.0.2", + "@jridgewell/trace-mapping": "^0.3.25", + "commander": "^14.0.3", + "es-module-lexer": "^2.0.0", + "tinyglobby": "^0.2.15", "typescript": "^5.9.3", "zod": "^4.3.6" }, @@ -255,8 +257,7 @@ "@fuzdev/fuz_css": "^0.55.0", "@fuzdev/fuz_ui": "file:../fuz_ui", "@fuzdev/fuz_util": "file:../fuz_util", - "@fuzdev/gro": "^0.197.0", - "@jridgewell/trace-mapping": "^0.3.31", + "@fuzdev/gro": "file:../gro", "@ryanatkn/eslint-config": "^0.10.0", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.53.4", @@ -265,7 +266,6 @@ "@types/estree": "^1.0.8", "@types/node": "^24.10.4", "@webref/css": "^8.2.0", - "es-module-lexer": "^2.0.0", "eslint": "^9.39.1", "eslint-plugin-svelte": "^3.13.1", "esm-env": "^1.2.2", @@ -275,9 +275,7 @@ "svelte": "^5.53.7", "svelte-check": "^4.3.5", "svelte2tsx": "^0.7.47", - "tinyglobby": "^0.2.15", "tslib": "^2.8.1", - "typescript": "^5.9.3", "typescript-eslint": "^8.48.1", "vitest": "^4.0.15", "zimmerframe": "^1.1.4" @@ -287,28 +285,8 @@ }, "peerDependencies": { "@fuzdev/fuz_util": "file:../fuz_util", - "@jridgewell/trace-mapping": "^0.3.25", - "es-module-lexer": "^2.0.0", "svelte": "^5.0.0", - "svelte2tsx": "^0.7.30", - "tinyglobby": "^0.2.15" - }, - "peerDependenciesMeta": { - "@jridgewell/trace-mapping": { - "optional": true - }, - "es-module-lexer": { - "optional": true - }, - "svelte": { - "optional": true - }, - "svelte2tsx": { - "optional": true - }, - "tinyglobby": { - "optional": true - } + "svelte2tsx": "^0.7.30" } }, "../svelte-docinfo": { From f55dd66b9196249a81a88011b3b54fc88295cbf0 Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sun, 5 Apr 2026 07:24:09 -0400 Subject: [PATCH 19/20] wip --- package-lock.json | 93 ++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- src/routes/library.json | 14 +------ 3 files changed, 95 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8895716d..d4ff754f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@fuzdev/blake3_wasm": "^0.1.0", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.58.0", - "@fuzdev/fuz_ui": "^0.191.3", + "@fuzdev/fuz_ui": "^0.191.4", "@fuzdev/gro": "^0.197.2", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.10.1", @@ -80,6 +80,97 @@ } } }, + "../fuz_ui": { + "name": "@fuzdev/fuz_ui", + "version": "0.190.0", + "extraneous": true, + "license": "MIT", + "devDependencies": { + "@changesets/changelog-git": "^0.2.1", + "@fuzdev/blake3_wasm": "^0.1.0", + "@fuzdev/fuz_code": "^0.45.1", + "@fuzdev/fuz_css": "^0.56.0", + "@fuzdev/fuz_util": "^0.54.0", + "@fuzdev/gro": "^0.197.0", + "@jridgewell/trace-mapping": "^0.3.31", + "@ryanatkn/eslint-config": "^0.10.1", + "@sveltejs/acorn-typescript": "^1.0.9", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.55.0", + "@sveltejs/package": "^2.5.7", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@types/estree": "^1.0.8", + "@types/node": "^24.10.1", + "@webref/css": "^8.2.0", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.1", + "esm-env": "^1.2.2", + "jsdom": "^27.2.0", + "magic-string": "^0.30.21", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.1", + "svelte": "^5.53.12", + "svelte-check": "^4.4.5", + "svelte-docinfo": "file:../private_svelte-docinfo", + "svelte2tsx": "^0.7.47", + "tslib": "^2.8.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vite": "^7.3.1", + "vitest": "^4.0.15", + "zimmerframe": "^1.1.4", + "zod": "^4.3.6" + }, + "engines": { + "node": ">=22.15" + }, + "funding": { + "url": "https://www.ryanatkn.com/funding" + }, + "peerDependencies": { + "@fuzdev/fuz_code": ">=0.45.1", + "@fuzdev/fuz_css": ">=0.53.0", + "@fuzdev/fuz_util": "file:../fuz_util", + "@fuzdev/gro": "file:../gro", + "@jridgewell/trace-mapping": "^0.3", + "@sveltejs/kit": "^2.47.3", + "@types/estree": "^1", + "esm-env": "^1", + "svelte": "^5", + "svelte2tsx": "^0.7.45", + "vite": ">=6", + "zod": "^4.1.12" + }, + "peerDependenciesMeta": { + "@fuzdev/fuz_code": { + "optional": true + }, + "@fuzdev/fuz_util": { + "optional": true + }, + "@fuzdev/gro": { + "optional": true + }, + "@jridgewell/trace-mapping": { + "optional": true + }, + "@types/estree": { + "optional": true + }, + "esm-env": { + "optional": true + }, + "svelte2tsx": { + "optional": true + }, + "vite": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "../gro": { "name": "@fuzdev/gro", "version": "0.197.2", diff --git a/package.json b/package.json index 434848c8..c9d2a8f3 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "@fuzdev/blake3_wasm": "^0.1.0", "@fuzdev/fuz_code": "^0.45.1", "@fuzdev/fuz_css": "^0.58.0", - "@fuzdev/fuz_ui": "^0.191.3", + "@fuzdev/fuz_ui": "^0.191.4", "@fuzdev/gro": "^0.197.2", "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.10.1", diff --git a/src/routes/library.json b/src/routes/library.json index 007099be..a26c8489 100644 --- a/src/routes/library.json +++ b/src/routes/library.json @@ -83,20 +83,9 @@ "@changesets/changelog-git": "^0.2.1", "@fuzdev/blake3_wasm": "^0.1.0", "@fuzdev/fuz_code": "^0.45.1", -<<<<<<< HEAD - "@fuzdev/fuz_css": "^0.55.0", - "@fuzdev/fuz_ui": "file:../fuz_ui", - "@fuzdev/gro": "^0.197.0", - "svelte-docinfo": "file:../private_svelte-docinfo", -||||||| d2261a9 - "@fuzdev/fuz_css": "^0.56.0", - "@fuzdev/fuz_ui": "^0.190.0", - "@fuzdev/gro": "^0.197.0", -======= "@fuzdev/fuz_css": "^0.58.0", - "@fuzdev/fuz_ui": "^0.191.3", + "@fuzdev/fuz_ui": "^0.191.4", "@fuzdev/gro": "^0.197.2", ->>>>>>> main "@jridgewell/trace-mapping": "^0.3.31", "@ryanatkn/eslint-config": "^0.10.1", "@sveltejs/acorn-typescript": "^1.0.9", @@ -117,6 +106,7 @@ "prettier-plugin-svelte": "^3.4.1", "svelte": "^5.55.0", "svelte-check": "^4.3.6", + "svelte-docinfo": "file:../private_svelte-docinfo", "svelte2tsx": "^0.7.47", "tslib": "^2.8.1", "typescript": "^5.9.3", From c9a34e2ac44b3bc73b624172b6f78176186d60fd Mon Sep 17 00:00:00 2001 From: Ryan Atkinson Date: Sun, 5 Apr 2026 18:40:33 -0400 Subject: [PATCH 20/20] wip --- src/lib/time.ts | 2 +- src/routes/library.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/time.ts b/src/lib/time.ts index dcc9a415..228131a0 100644 --- a/src/lib/time.ts +++ b/src/lib/time.ts @@ -223,7 +223,7 @@ export interface TimeResult { * @example * ```ts * const {result, timing} = await time_async(async () => { - * await fetch('https://api.example.com/data'); + * await fetch('https://api.fuz.dev/data'); * return 42; * }); * console.log(`Result: ${result}, took ${time_format_adaptive(timing.elapsed_ns)}`); diff --git a/src/routes/library.json b/src/routes/library.json index a26c8489..5a0947ee 100644 --- a/src/routes/library.json +++ b/src/routes/library.json @@ -7800,7 +7800,7 @@ "kind": "function", "doc_comment": "Time an asynchronous function execution.", "examples": [ - "```ts\nconst {result, timing} = await time_async(async () => {\n await fetch('https://api.example.com/data');\n return 42;\n});\nconsole.log(`Result: ${result}, took ${time_format_adaptive(timing.elapsed_ns)}`);\n```" + "```ts\nconst {result, timing} = await time_async(async () => {\n await fetch('https://api.fuz.dev/data');\n return 42;\n});\nconsole.log(`Result: ${result}, took ${time_format_adaptive(timing.elapsed_ns)}`);\n```" ], "source_line": 232, "type_signature": "(fn: () => Promise, timer?: Timer): Promise<{ result: T; timing: TimeResult; }>",