youiyoux 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/chunks/{chunk-S7UV34H5.js → chunk-42YJX3W5.js} +1 -3
- package/dist/chunks/{chunk-FUB7B3VK.js → chunk-4BBYLTZX.js} +10 -10
- package/dist/chunks/chunk-52KOKYY6.js +8710 -0
- package/dist/chunks/chunk-FJZFCAL5.js +129 -0
- package/dist/chunks/chunk-FVVL5JCY.js +24 -0
- package/dist/chunks/{chunk-UHPK62Q5.js → chunk-M5XZWCPS.js} +240 -60
- package/dist/chunks/{chunk-ZLRFD5JI.js → chunk-NYDJYMID.js} +263 -16
- package/dist/chunks/{src-7ENJHYG4.js → chunk-RDTHHRZN.js} +319 -165
- package/dist/chunks/{chunk-E4HNK7VF.js → chunk-WNTS7ZO4.js} +1 -1
- package/dist/chunks/chunk-XAEMVEYX.js +188 -0
- package/dist/chunks/{chunk-CLNMVQZJ.js → chunk-YFCMTTXS.js} +708 -494
- package/dist/chunks/chunk-YJ7WMBTT.js +13761 -0
- package/dist/chunks/src-5IP4NGKT.js +115 -0
- package/dist/chunks/src-6CJR547Y.js +124 -0
- package/dist/chunks/{src-WQWYJ6IQ.js → src-BPETAFLW.js} +175 -76
- package/dist/chunks/{src-B742AYFC.js → src-LLV7IY6W.js} +55 -16
- package/dist/chunks/src-RHNZELGE.js +306 -0
- package/dist/chunks/{src-4KFNL3MY.js → src-SFKFERZ2.js} +18 -8
- package/dist/chunks/{src-VEHGMKYV.js → src-VL2ZYO6X.js} +4 -4
- package/dist/hub/assets/Badge-CUJUit4d.js +1 -0
- package/dist/hub/assets/CandidatePanel-CnbK4S0j.js +1 -0
- package/dist/hub/assets/CatalogScreen-B5OVL-AR.js +1 -0
- package/dist/hub/assets/ChangesScreen-GwGqJwxN.js +1 -0
- package/dist/hub/assets/CheatSheet-BLSOq-xa.js +1 -0
- package/dist/hub/assets/CodeBlock-CsiGFgvI.js +1 -0
- package/dist/hub/assets/CommandPalette-CAWQfdXJ.js +1 -0
- package/dist/hub/assets/CopyButton-DE8drl4P.js +1 -0
- package/dist/hub/assets/Disclosure-B1kTgPgk.js +1 -0
- package/dist/hub/assets/DiscoverScreen-Tl_Z6mgY.js +2 -0
- package/dist/hub/assets/DraftEditor-yIDapXTs.js +5 -0
- package/dist/hub/assets/Field-LwrJXoOs.js +1 -0
- package/dist/hub/assets/GapsScreen-DXZAlm6v.js +1 -0
- package/dist/hub/assets/HomeScreen-CEpiVhOa.js +1 -0
- package/dist/hub/assets/InventoryScreen-CEG3Pmw_.js +1 -0
- package/dist/hub/assets/KindIcon-BJ6bz-ny.js +1 -0
- package/dist/hub/assets/LibraryScreen-IaVnxrX9.js +1 -0
- package/dist/hub/assets/LicenceBadge-CLCUMMHE.js +1 -0
- package/dist/hub/assets/Opened-DJyf4Hnj.js +1 -0
- package/dist/hub/assets/Preview-C069zVMP.js +1 -0
- package/dist/hub/assets/RuleDetail-B4g2-TRe.js +3 -0
- package/dist/hub/assets/RulesScreen-CAaXIWjO.js +3 -0
- package/dist/hub/assets/ScreenImage-DcI7_G3O.js +1 -0
- package/dist/hub/assets/ScreensScreen-DwczCjZD.js +1 -0
- package/dist/hub/assets/SearchField-DaCpNAj6.js +1 -0
- package/dist/hub/assets/Section-BTnvUq_W.js +1 -0
- package/dist/hub/assets/Segmented-Dzi1x49S.js +1 -0
- package/dist/hub/assets/ServiceDown-Bv-BPXro.js +1 -0
- package/dist/hub/assets/SpecimenCapture-DlsjshVE.js +1 -0
- package/dist/hub/assets/Specimens-C-lHp7sr.js +2 -0
- package/dist/hub/assets/StackScreen-DkmELsqR.js +1 -0
- package/dist/hub/assets/StubScreens-Bt7lWLVK.js +1 -0
- package/dist/hub/assets/StyleScreen-tq1tbRBo.js +1 -0
- package/dist/hub/assets/Swatch-KDz4qxdM.js +1 -0
- package/dist/hub/assets/Tabs-1QQDS0I6.js +1 -0
- package/dist/hub/assets/TokenDetail-DvCw6GqC.js +1 -0
- package/dist/hub/assets/TokenValue-CsPRc2ai.js +1 -0
- package/dist/hub/assets/TokensScreen-DoENV8Xy.js +1 -0
- package/dist/hub/assets/arrow-right-DcbNDzqs.js +1 -0
- package/dist/hub/assets/bot-B3gC9oUR.js +1 -0
- package/dist/hub/assets/button-6mvMVtpb.js +1 -0
- package/dist/hub/assets/button.demo-DuU0DQbv.js +1 -0
- package/dist/hub/assets/card.demo-CufAxMAA.js +1 -0
- package/dist/hub/assets/chevron-down-CzN07vMi.js +1 -0
- package/dist/hub/assets/circle-alert-DT2LC4yf.js +1 -0
- package/dist/hub/assets/circle-check-DkwBMT62.js +1 -0
- package/dist/hub/assets/client-D7whEyep.js +1 -0
- package/dist/hub/assets/clsx-DB0hHKMi.js +1 -0
- package/dist/hub/assets/compass-BkKOZPYe.js +1 -0
- package/dist/hub/assets/contrast-BkNHUAPa.js +1 -0
- package/dist/hub/assets/createLucideIcon-CGDJWtKO.js +1 -0
- package/dist/hub/assets/discover-XjJEViwk.js +1 -0
- package/dist/hub/assets/dist-BYQYaPBV.js +1 -0
- package/dist/hub/assets/dist-Bk4srtDn.js +41 -0
- package/dist/hub/assets/dist-BogNzeK9.js +1 -0
- package/dist/hub/assets/dist-D0z7Bvsy.js +1 -0
- package/dist/hub/assets/download-BQI-Si9R.js +1 -0
- package/dist/hub/assets/engine-CMmt9yEz.js +1 -0
- package/dist/hub/assets/esm-NPpg23M8.js +1 -0
- package/dist/hub/assets/family-tiles-CyTdy_cP.js +1 -0
- package/dist/hub/assets/format-DxAYNTN_.js +1 -0
- package/dist/hub/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/hub/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/hub/assets/geist-latin-core-vkBVTr4s.woff2 +0 -0
- package/dist/hub/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/hub/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/hub/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/dist/hub/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/dist/hub/assets/geist-mono-latin-core-DccGGzmg.woff2 +0 -0
- package/dist/hub/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/dist/hub/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/hub/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/dist/hub/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/dist/hub/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/hub/assets/git-pull-request-arrow-RqUUIRCU.js +1 -0
- package/dist/hub/assets/input.demo-238gqWpz.js +1 -0
- package/dist/hub/assets/inventory-BI8QBdar.js +1 -0
- package/dist/hub/assets/inventory-source-lZYzcA8O.js +1 -0
- package/dist/hub/assets/jsx-runtime-D6zNwnaE.js +9 -0
- package/dist/hub/assets/layers-DfzdK_wG.js +1 -0
- package/dist/hub/assets/layout-grid-xFY9L9Oc.js +1 -0
- package/dist/hub/assets/library-W5R8GwvG.js +1 -0
- package/dist/hub/assets/main-7snyIdoi.css +2 -0
- package/dist/hub/assets/main-B9CIkk5m.js +2 -0
- package/dist/hub/assets/minus-BDifFhOo.js +1 -0
- package/dist/hub/assets/monitor-X_lELkcU.js +1 -0
- package/dist/hub/assets/mouse-pointer-click-CVJ6hWg8.js +1 -0
- package/dist/hub/assets/paintbrush-DOkEgSTO.js +1 -0
- package/dist/hub/assets/plural-BbGQPQKA.js +1 -0
- package/dist/hub/assets/preview-BA8CPsKb.css +2 -0
- package/dist/hub/assets/preview-DUm13vr1.js +3 -0
- package/dist/hub/assets/protocol-caP6umNL.js +1 -0
- package/dist/hub/assets/react-DB-4Zxce.js +1 -0
- package/dist/hub/assets/shield-check-0ka0kQct.js +1 -0
- package/dist/hub/assets/trash-B7aEfJps.js +1 -0
- package/dist/hub/assets/triangle-alert-Dkdi9eDR.js +1 -0
- package/dist/hub/assets/try-live-zX3CSd3P.js +1 -0
- package/dist/hub/assets/utils-BoaXfs8y.js +1 -0
- package/dist/hub/assets/values-DzxR_TlI.js +1 -0
- package/dist/hub/assets/worker-Bh-wSp42.js +1 -0
- package/dist/hub/assets/workflow-jpV8wh-U.js +1 -0
- package/dist/hub/assets/x-MLbFVa4v.js +1 -0
- package/dist/hub/favicon.svg +1 -0
- package/dist/hub/index.html +35 -0
- package/dist/hub/kit/candidates.json +1 -0
- package/dist/hub/kit/chunks/chunk-2NYFUOIV.js +14 -0
- package/dist/hub/kit/chunks/chunk-DCANE7XH.js +1 -0
- package/dist/hub/kit/chunks/chunk-FTGHCY4I.js +14 -0
- package/dist/hub/kit/chunks/chunk-IBF3UTJF.js +33 -0
- package/dist/hub/kit/chunks/chunk-LLXY4VSH.js +1 -0
- package/dist/hub/kit/chunks/chunk-PUPZMW4P.js +14 -0
- package/dist/hub/kit/chunks/chunk-PWLNZQET.js +1 -0
- package/dist/hub/kit/chunks/chunk-ULXWVOKJ.js +1 -0
- package/dist/hub/kit/chunks/chunk-WM4BGGMK.js +1 -0
- package/dist/hub/kit/chunks/chunk-ZQUNRK72.js +1 -0
- package/dist/hub/kit/class-variance-authority.js +1 -0
- package/dist/hub/kit/clsx.js +1 -0
- package/dist/hub/kit/fonts/geist-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/hub/kit/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
- package/dist/hub/kit/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
- package/dist/hub/kit/fonts/geist-latin-wght-normal.woff2 +0 -0
- package/dist/hub/kit/fonts/geist-vietnamese-wght-normal.woff2 +0 -0
- package/dist/hub/kit/frame.css.src +73 -0
- package/dist/hub/kit/frame.js +2 -0
- package/dist/hub/kit/lucide-react.js +1878 -0
- package/dist/hub/kit/preview.html +13 -0
- package/dist/hub/kit/radix-ui-react-dialog.js +41 -0
- package/dist/hub/kit/radix-ui-react-label.js +1 -0
- package/dist/hub/kit/radix-ui-react-separator.js +1 -0
- package/dist/hub/kit/radix-ui-react-slot.js +1 -0
- package/dist/hub/kit/radix-ui-react-switch.js +1 -0
- package/dist/hub/kit/radix-ui-react-tabs.js +1 -0
- package/dist/hub/kit/react-dom-client.js +1 -0
- package/dist/hub/kit/react-dom.js +1 -0
- package/dist/hub/kit/react-jsx-runtime.js +1 -0
- package/dist/hub/kit/react.js +1 -0
- package/dist/hub/kit/tailwind-merge.js +1 -0
- package/dist/hub/kit/tailwindcss/index.css +950 -0
- package/dist/hub/kit/tailwindcss/preflight.css +398 -0
- package/dist/hub/kit/tailwindcss/theme.css +510 -0
- package/dist/hub/kit/tailwindcss/utilities.css +1 -0
- package/dist/hub-demo/frame/button.demo.js +1 -0
- package/dist/hub-demo/frame/card.demo.js +1 -0
- package/dist/hub-demo/frame/demos.js +6 -0
- package/dist/hub-demo/frame/frame.css +770 -0
- package/dist/hub-demo/frame/input.demo.js +1 -0
- package/dist/hub-demo/preview/components/button.demo.tsx +47 -0
- package/dist/hub-demo/preview/components/button.tsx +31 -0
- package/dist/hub-demo/preview/components/card.demo.tsx +26 -0
- package/dist/hub-demo/preview/components/card.tsx +20 -0
- package/dist/hub-demo/preview/components/input.demo.tsx +39 -0
- package/dist/hub-demo/preview/components/input.tsx +19 -0
- package/dist/hub-demo/preview/components/utils.ts +5 -0
- package/dist/hub-demo/preview/system.css +161 -0
- package/dist/hub-demo/public/data/demo-app.usage.bedd9c82fe.json +1 -0
- package/dist/hub-demo/public/data/demo.catalog.a605de2281.json +1 -0
- package/dist/hub-demo/public/data/gaps.129a93538d.json +1 -0
- package/dist/hub-demo/public/data/inventory.165a4f6408.json +1 -0
- package/dist/hub-demo/public/data/inventory.console.badge.ad0238784e.json +1 -0
- package/dist/hub-demo/public/data/inventory.console.button.3249daff35.json +1 -0
- package/dist/hub-demo/public/data/inventory.console.card.9ea88708ac.json +1 -0
- package/dist/hub-demo/public/data/inventory.console.dialog.8b6574d93a.json +1 -0
- package/dist/hub-demo/public/data/inventory.console.input.bdffb756a7.json +1 -0
- package/dist/hub-demo/public/data/inventory.console.link-as-button.1ce7faa1f3.json +1 -0
- package/dist/hub-demo/public/data/inventory.console.tabs.813e694c44.json +1 -0
- package/dist/hub-demo/public/data/inventory.extras.e5d06c6ff4.json +1 -0
- package/dist/hub-demo/public/data/inventory.site.badge.047a68f644.json +1 -0
- package/dist/hub-demo/public/data/inventory.site.button.720938384e.json +1 -0
- package/dist/hub-demo/public/data/inventory.site.card.d8df5f6873.json +1 -0
- package/dist/hub-demo/public/data/inventory.site.link-as-button.9c1f8a55bf.json +1 -0
- package/dist/hub-demo/public/data/inventory.site.tabs.59bd0200b9.json +1 -0
- package/dist/hub-demo/public/data/manifest.json +39 -0
- package/dist/hub-demo/public/data/specimens.console.dark.046471907d.css +786 -0
- package/dist/hub-demo/public/data/specimens.console.light.aaffa2d213.css +786 -0
- package/dist/hub-demo/public/data/specimens.site.dark.94a6706908.css +92 -0
- package/dist/hub-demo/public/data/specimens.site.light.3ddbc8d28d.css +92 -0
- package/dist/hub-demo/public/previews/button.dark.webp +0 -0
- package/dist/hub-demo/public/previews/button.light.webp +0 -0
- package/dist/hub-demo/public/previews/card.dark.webp +0 -0
- package/dist/hub-demo/public/previews/card.light.webp +0 -0
- package/dist/hub-demo/public/previews/input.dark.webp +0 -0
- package/dist/hub-demo/public/previews/input.light.webp +0 -0
- package/dist/hub-previews.js +173 -0
- package/dist/hub-server.js +6329 -0
- package/dist/hub-snapshot.js +573 -0
- package/dist/schema/youi.gaps.schema.json +235 -0
- package/dist/schema/youi.request.schema.json +229 -0
- package/dist/tailwind-worker.js +3 -3
- package/dist/youi.js +10 -8
- package/dist/youiyoux.js +10 -8
- package/package.json +4 -4
- package/dist/chunks/chunk-3ZHGONNA.js +0 -21797
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { createRequire as __youiRequire } from "node:module"; import { dirname as __youiDir } from "node:path"; import { fileURLToPath as __youiPath } from "node:url"; const require = __youiRequire(import.meta.url); const __youiDirname = __youiDir(__youiPath(import.meta.url));
|
|
2
|
+
import {
|
|
3
|
+
isLocalHost,
|
|
4
|
+
loadPackage,
|
|
5
|
+
readTryIndex,
|
|
6
|
+
send
|
|
7
|
+
} from "./chunk-XAEMVEYX.js";
|
|
8
|
+
import {
|
|
9
|
+
writeFileAtomic
|
|
10
|
+
} from "./chunk-NYDJYMID.js";
|
|
11
|
+
|
|
12
|
+
// ../../apps/web/scripts/discover-thumbs.ts
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { readdir, rm } from "node:fs/promises";
|
|
15
|
+
import { join, resolve } from "node:path";
|
|
16
|
+
var THUMBS_PATH = "/__youi/discover-thumbs";
|
|
17
|
+
var THUMBS_DIR = "thumbs";
|
|
18
|
+
var THUMBS_INDEX = "index.json";
|
|
19
|
+
var THUMBS_SCHEMA = "youiyoux.discover-thumbs/v1";
|
|
20
|
+
var THUMB_SCHEMES = ["light", "dark"];
|
|
21
|
+
var PROJECT = /^[a-z0-9][a-z0-9._-]{0,80}$/i;
|
|
22
|
+
var PICTURE = /^([0-9a-f]{16})\.(light|dark)\.webp$/;
|
|
23
|
+
var safeProject = (project) => PROJECT.test(project) && project !== "." && project !== ".." ? project : null;
|
|
24
|
+
function thumbsDir(cache, project) {
|
|
25
|
+
const safe = safeProject(project);
|
|
26
|
+
if (!safe) throw new Error(`refused: "${project.slice(0, 60)}" is not a project id`);
|
|
27
|
+
return join(resolve(cache), THUMBS_DIR, safe);
|
|
28
|
+
}
|
|
29
|
+
var emptyIndex = (project) => ({ schema: THUMBS_SCHEMA, project, items: {}, failed: {} });
|
|
30
|
+
function readThumbIndex(cache, project) {
|
|
31
|
+
const file = join(thumbsDir(cache, project), THUMBS_INDEX);
|
|
32
|
+
if (!existsSync(file)) return emptyIndex(project);
|
|
33
|
+
try {
|
|
34
|
+
const value = JSON.parse(readFileSync(file, "utf8"));
|
|
35
|
+
if (value.schema !== THUMBS_SCHEMA) return emptyIndex(project);
|
|
36
|
+
return { schema: THUMBS_SCHEMA, project, items: { ...value.items }, failed: { ...value.failed } };
|
|
37
|
+
} catch {
|
|
38
|
+
return emptyIndex(project);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function writeThumbIndex(cache, index) {
|
|
42
|
+
await writeFileAtomic(join(thumbsDir(cache, index.project), THUMBS_INDEX), `${JSON.stringify(index, null, 1)}
|
|
43
|
+
`);
|
|
44
|
+
}
|
|
45
|
+
function needsCapture(index, id, sha, force = false) {
|
|
46
|
+
return force || index.items[id]?.sha !== sha && index.failed[id]?.sha !== sha;
|
|
47
|
+
}
|
|
48
|
+
function currentThumbs(index, current, url) {
|
|
49
|
+
const items = {};
|
|
50
|
+
for (const [id, thumb] of Object.entries(index.items)) {
|
|
51
|
+
if (current.get(id) !== thumb.sha || !/^[0-9a-f]{16}$/.test(thumb.key)) continue;
|
|
52
|
+
items[id] = { light: url(`${thumb.key}.light.webp`), dark: url(`${thumb.key}.dark.webp`), width: thumb.width, height: thumb.height, capturedAt: thumb.capturedAt };
|
|
53
|
+
}
|
|
54
|
+
const failed = {};
|
|
55
|
+
for (const [id, failure] of Object.entries(index.failed)) if (current.get(id) === failure.sha && !items[id]) failed[id] = failure.reason;
|
|
56
|
+
return { project: index.project, items, failed };
|
|
57
|
+
}
|
|
58
|
+
async function prunePictures(cache, index) {
|
|
59
|
+
const dir = thumbsDir(cache, index.project);
|
|
60
|
+
const keep = new Set(Object.values(index.items).map((t) => t.key));
|
|
61
|
+
let removed = 0;
|
|
62
|
+
for (const name of await readdir(dir).catch(() => [])) {
|
|
63
|
+
const match = PICTURE.exec(name);
|
|
64
|
+
if (!match || keep.has(match[1])) continue;
|
|
65
|
+
await rm(join(dir, name), { force: true });
|
|
66
|
+
removed++;
|
|
67
|
+
}
|
|
68
|
+
return removed;
|
|
69
|
+
}
|
|
70
|
+
function selectCandidates(entries, selection) {
|
|
71
|
+
const chosen = entries.filter((e) => {
|
|
72
|
+
if (e.source.kind !== "shadcn-registry" || !e.source.ref || typeof e.provenance?.sha256 !== "string") return false;
|
|
73
|
+
if (selection.registry && !e.source.ref.startsWith(`${selection.registry}/`)) return false;
|
|
74
|
+
return !selection.role || (e.categories ?? []).includes(selection.role) || e.source.ref.endsWith(`/${selection.role}`);
|
|
75
|
+
});
|
|
76
|
+
return selection.limit === null ? chosen : chosen.slice(0, selection.limit);
|
|
77
|
+
}
|
|
78
|
+
function listingDigests(cache) {
|
|
79
|
+
const digests = /* @__PURE__ */ new Map();
|
|
80
|
+
for (const name of ["index.json", "index-all.json"]) {
|
|
81
|
+
const file = join(cache, name);
|
|
82
|
+
if (!existsSync(file)) continue;
|
|
83
|
+
try {
|
|
84
|
+
const value = JSON.parse(readFileSync(file, "utf8"));
|
|
85
|
+
for (const entry of value.entries ?? []) if (typeof entry.id === "string" && typeof entry.provenance?.sha256 === "string") digests.set(entry.id, entry.provenance.sha256);
|
|
86
|
+
} catch {
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return digests;
|
|
90
|
+
}
|
|
91
|
+
function discoverThumbsMiddleware(snapshot, base = "/", options = {}, cacheDir = async () => (await loadPackage("discover")).discoverCacheDir(void 0, options.env ?? process.env)) {
|
|
92
|
+
const projects = () => Object.keys(readTryIndex(snapshot)?.projects ?? {});
|
|
93
|
+
return async (req, res, next) => {
|
|
94
|
+
const url = new URL((req.url ?? "/").replace(base, "/"), "http://hub.local");
|
|
95
|
+
if (!url.pathname.startsWith(THUMBS_PATH) || req.method !== "GET") return next();
|
|
96
|
+
if (!isLocalHost(req.headers.host)) return send(res, 403, { error: "Thumbnails answer this machine only (Host must be localhost)." });
|
|
97
|
+
const cache = resolve(options.cache ?? await cacheDir());
|
|
98
|
+
const picture = /^\/__youi\/discover-thumbs\/([^/]+)\/([^/]+)$/.exec(url.pathname);
|
|
99
|
+
if (picture) {
|
|
100
|
+
const project2 = safeProject(decodeURIComponent(picture[1]));
|
|
101
|
+
if (!project2 || !PICTURE.test(picture[2])) return send(res, 400, { error: "not a thumbnail" });
|
|
102
|
+
const file = join(thumbsDir(cache, project2), picture[2]);
|
|
103
|
+
if (!existsSync(file)) return send(res, 404, { error: "no such thumbnail" });
|
|
104
|
+
res.setHeader("Content-Type", "image/webp");
|
|
105
|
+
res.setHeader("Cache-Control", "public, max-age=31536000, immutable");
|
|
106
|
+
res.end(readFileSync(file));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (url.pathname !== THUMBS_PATH) return send(res, 404, { error: "not found" });
|
|
110
|
+
const known = projects();
|
|
111
|
+
const wanted = url.searchParams.get("project");
|
|
112
|
+
const project = wanted ? known.includes(wanted) ? wanted : null : known[0] ?? null;
|
|
113
|
+
if (!project || !safeProject(project)) return send(res, 404, { error: wanted ? `The hub has no project "${wanted.slice(0, 60)}".` : "The hub has no project: open it with youiyoux ui --project." });
|
|
114
|
+
const index = readThumbIndex(cache, project);
|
|
115
|
+
send(res, 200, currentThumbs(index, listingDigests(cache), (file) => `${base}${THUMBS_PATH.slice(1)}/${encodeURIComponent(project)}/${file}`));
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export {
|
|
120
|
+
THUMBS_PATH,
|
|
121
|
+
THUMB_SCHEMES,
|
|
122
|
+
thumbsDir,
|
|
123
|
+
readThumbIndex,
|
|
124
|
+
writeThumbIndex,
|
|
125
|
+
needsCapture,
|
|
126
|
+
prunePictures,
|
|
127
|
+
selectCandidates,
|
|
128
|
+
discoverThumbsMiddleware
|
|
129
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createRequire as __youiRequire } from "node:module"; import { dirname as __youiDir } from "node:path"; import { fileURLToPath as __youiPath } from "node:url"; const require = __youiRequire(import.meta.url); const __youiDirname = __youiDir(__youiPath(import.meta.url));
|
|
2
|
+
|
|
3
|
+
// src/node20.js
|
|
4
|
+
if (!Map.groupBy) {
|
|
5
|
+
Map.groupBy = (items, key) => {
|
|
6
|
+
const groups = /* @__PURE__ */ new Map();
|
|
7
|
+
let i = 0;
|
|
8
|
+
for (const item of items) {
|
|
9
|
+
const k = key(item, i++);
|
|
10
|
+
const list = groups.get(k);
|
|
11
|
+
if (list) list.push(item);
|
|
12
|
+
else groups.set(k, [item]);
|
|
13
|
+
}
|
|
14
|
+
return groups;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (!Object.groupBy) Object.groupBy = (items, key) => Object.fromEntries(Map.groupBy(items, key));
|
|
18
|
+
if (!Promise.withResolvers) {
|
|
19
|
+
Promise.withResolvers = () => {
|
|
20
|
+
let resolve, reject;
|
|
21
|
+
const promise = new Promise((yes, no) => (resolve = yes, reject = no));
|
|
22
|
+
return { promise, resolve, reject };
|
|
23
|
+
};
|
|
24
|
+
}
|