From abb6d4dd2274a2249d4ee0a7e044826698668482 Mon Sep 17 00:00:00 2001 From: Nycolaide Date: Sat, 24 Oct 2026 11:29:40 +0200 Subject: [PATCH 1/3] connect api local api lapikit to website --- src/lib/server/npm.ts | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/lib/server/npm.ts b/src/lib/server/npm.ts index 63a95ed..efbf5cd 100644 --- a/src/lib/server/npm.ts +++ b/src/lib/server/npm.ts @@ -3,9 +3,6 @@ import type { NpmStats } from '$lib/@types'; const CACHE_TTL = 15 * 60 * 1000; const RETRY_DELAY = 60 * 1000; const FETCH_TIMEOUT = 5000; -const FIRST_PUBLISH_DATE = '2025-04-19'; -const DOWNLOADS_WINDOW_DAYS = 365; -const DAY_MS = 24 * 60 * 60 * 1000; export const emptyNpmStats: NpmStats = { version: { latest: '', insiders: '' }, @@ -22,23 +19,6 @@ function formatDownloads(n: number): string { return String(n); } -function toIsoDate(timestamp: number) { - return new Date(timestamp).toISOString().slice(0, 10); -} - -function getDownloadRanges(from: string, to: number) { - const ranges: string[] = []; - let start = Date.parse(`${from}T00:00:00Z`); - - while (start <= to) { - const end = Math.min(start + (DOWNLOADS_WINDOW_DAYS - 1) * DAY_MS, to); - ranges.push(`${toIsoDate(start)}:${toIsoDate(end)}`); - start = end + DAY_MS; - } - - return ranges; -} - async function fetchJson(url: string) { const response = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT) }); if (!response.ok) throw new Error(`${response.status} ${url}`); @@ -46,20 +26,14 @@ async function fetchJson(url: string) { } async function collectStats(): Promise { - const ranges = getDownloadRanges(FIRST_PUBLISH_DATE, Date.now()); - const [packument, ...downloadPoints] = await Promise.all([ + const [packument, downloadStats] = await Promise.all([ fetchJson('https://registry.npmjs.org/lapikit'), - ...ranges.map((range) => fetchJson(`https://api.npmjs.org/downloads/point/${range}/lapikit`)) + fetchJson('https://api.lapikit.dev/lapikit/nbDll') ]); const distTagLatest = packument['dist-tags']?.latest; const distTagInsider = packument['dist-tags']?.insiders; - const totalDownloads = downloadPoints.reduce( - (total: number, point: { downloads?: number }) => total + (point.downloads ?? 0), - 0 - ); - return { version: { latest: distTagLatest ? `v${distTagLatest}` : '', @@ -69,7 +43,7 @@ async function collectStats(): Promise { latest: packument.time?.[distTagLatest] ?? '', insiders: packument.time?.[distTagInsider] ?? '' }, - downloads: formatDownloads(totalDownloads) + downloads: formatDownloads(downloadStats.downloads ?? 0) }; } From 53fd2403b594dc81abe3984786b5d3a72d2009ff Mon Sep 17 00:00:00 2001 From: Nycolaide Date: Sat, 24 Oct 2026 11:40:09 +0200 Subject: [PATCH 2/3] udpate documantation witj lapikit 0.7.4 --- bun.lock | 4 ++-- package.json | 2 +- src/content/docs/components/field.md | 14 ++++++++++++++ .../examples/components/field/preview.svelte | 9 +++------ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/bun.lock b/bun.lock index 5c86925..81e0160 100644 --- a/bun.lock +++ b/bun.lock @@ -25,7 +25,7 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^3.20.0", "globals": "^17.7.0", - "lapikit": "^0.0.0-insiders.a294d65", + "lapikit": "^0.7.4", "mdsvex": "^0.12.7", "prettier": "^3.9.3", "prettier-plugin-svelte": "^3.5.2", @@ -518,7 +518,7 @@ "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], - "lapikit": ["lapikit@0.0.0-insiders.a294d65", "", { "peerDependencies": { "svelte": "^5.20.0" }, "bin": { "lapikit": "bin/index.js" } }, "sha512-5DhQf76RMNZFOdDGHHj0bQirdc4Vnz40YoHNHzyKvcie1e8EeN7lVHWYo9YB3gQEIdq3jzjnbtmV8SqpXGS72g=="], + "lapikit": ["lapikit@0.7.4", "", { "peerDependencies": { "svelte": "^5.20.0" }, "bin": { "lapikit": "bin/index.js" } }, "sha512-fu78+b9HRmAHyEQduE2V0HFpECCusZnfkWp9kq/B2Za10BrD7MdR131SksE6dXpjKJAGYJPlq/5sQlpfUWjXJQ=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], diff --git a/package.json b/package.json index daece77..bb9708c 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^3.20.0", "globals": "^17.7.0", - "lapikit": "^0.0.0-insiders.a294d65", + "lapikit": "^0.7.4", "mdsvex": "^0.12.7", "prettier": "^3.9.3", "prettier-plugin-svelte": "^3.5.2", diff --git a/src/content/docs/components/field.md b/src/content/docs/components/field.md index f038f9f..8c08632 100644 --- a/src/content/docs/components/field.md +++ b/src/content/docs/components/field.md @@ -42,6 +42,20 @@ The `children` snippet receives the attributes to spread on the control: ``` +In TypeScript, type the parameter with `FieldControlProps`: + +```svelte + + + + {#snippet children(control: FieldControlProps)} + + {/snippet} + +``` + The field does not know the value of the control: pass `dirty` to show the clear button, `onclear` to empty the value, and `counter` for the text at the end of the message line. ### Without preprocess Lapikit diff --git a/src/content/examples/components/field/preview.svelte b/src/content/examples/components/field/preview.svelte index c299e3e..3f9117c 100644 --- a/src/content/examples/components/field/preview.svelte +++ b/src/content/examples/components/field/preview.svelte @@ -1,4 +1,6 @@ @@ -11,12 +13,7 @@ dirty={country !== ''} onclear={() => (country = '')} > - {#snippet children(control: { - id: string; - 'aria-describedby': string | undefined; - 'aria-invalid': true | undefined; - disabled: boolean; - })} + {#snippet children(control: FieldControlProps)}