@pro-laico/payload-dev-tools 0.0.0 → 0.2.0
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/dist/components/DevToolbar.d.ts.map +1 -1
- package/dist/components/DevToolbar.js +7 -3
- package/dist/components/DevToolbar.js.map +1 -1
- package/dist/components/DevToolbarClient.d.ts.map +1 -1
- package/dist/components/DevToolbarClient.js +91 -1
- package/dist/components/DevToolbarClient.js.map +1 -1
- package/dist/components/styles.d.ts +1 -1
- package/dist/components/styles.d.ts.map +1 -1
- package/dist/components/styles.js +13 -0
- package/dist/components/styles.js.map +1 -1
- package/dist/endpoints/activateIconSet.d.ts.map +1 -1
- package/dist/endpoints/activateIconSet.js +2 -0
- package/dist/endpoints/activateIconSet.js.map +1 -1
- package/dist/endpoints/draft.d.ts +12 -0
- package/dist/endpoints/draft.d.ts.map +1 -0
- package/dist/endpoints/draft.js +66 -0
- package/dist/endpoints/draft.js.map +1 -0
- package/dist/lib/snapshot.d.ts +15 -0
- package/dist/lib/snapshot.d.ts.map +1 -1
- package/dist/lib/snapshot.js +16 -1
- package/dist/lib/snapshot.js.map +1 -1
- package/dist/next/client.d.ts +5 -0
- package/dist/next/client.d.ts.map +1 -1
- package/dist/next/client.js +80 -0
- package/dist/next/client.js.map +1 -1
- package/dist/next/createDevPage.d.ts.map +1 -1
- package/dist/next/createDevPage.js +10 -1
- package/dist/next/createDevPage.js.map +1 -1
- package/dist/next/pageStyles.d.ts +1 -1
- package/dist/next/pageStyles.d.ts.map +1 -1
- package/dist/next/pageStyles.js +17 -0
- package/dist/next/pageStyles.js.map +1 -1
- package/dist/next/revalidatePanel.d.ts +81 -0
- package/dist/next/revalidatePanel.d.ts.map +1 -0
- package/dist/next/revalidatePanel.js +1094 -0
- package/dist/next/revalidatePanel.js.map +1 -0
- package/dist/next/views.d.ts +6 -0
- package/dist/next/views.d.ts.map +1 -1
- package/dist/next/views.js +16 -0
- package/dist/next/views.js.map +1 -1
- package/dist/plugin.d.ts +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +3 -0
- package/dist/plugin.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/next/revalidatePanel.tsx"],"sourcesContent":["'use client'\n\nimport '@xyflow/react/dist/style.css'\n\nimport dagre from '@dagrejs/dagre'\nimport {\n Background,\n Handle,\n Position,\n ReactFlow,\n type Edge as FlowEdge,\n type Node as FlowNode,\n type NodeProps,\n type NodeTypes,\n} from '@xyflow/react'\nimport { useMemo, useState } from 'react'\nimport { BustTagCard } from './client'\n\n/** The live-inspection shape payload-revalidate stashes on its shared symbol slot\n * (structural — no import; the server view reads the slot and passes plain data in). */\nexport type RevalidateInspection = {\n graph: {\n collections: string[]\n globals: string[]\n edges: { from: string; to: string; via: string; kind: string; polymorphic?: boolean }[]\n }\n prefix: string\n observing: boolean\n rules: { on: string; bust: string[]; whenFields?: string[] }[]\n settings: Record<string, { idField: string | false; lists: Record<string, string[]>; extraTags: string[]; fields: string[] }>\n getters: {\n helper: 'cacheDoc' | 'cacheIds' | 'cacheGlobal'\n slug: string\n list?: string\n label?: string\n getter?: string\n file: string\n line: number\n }[]\n reads: {\n kind: string\n collection?: string\n global?: string\n as?: string | number\n list?: string\n undeclared?: boolean\n draft: boolean\n label?: string\n staticTags: string[]\n depTags: string[]\n bakedIn: { tag: string; via: string; kind: string }[]\n capped: boolean\n lastAt: string\n count: number\n }[]\n events: {\n at: string\n source: string\n trigger: { slug: string; id?: string | number; operation: string; lane: string }\n busted: { tag: string; reason: string }[]\n }[]\n}\n\ntype Read = RevalidateInspection['reads'][number]\n\nconst RICH_TEXT_NODE = '*'\nconst clock = (iso: string): string => iso.slice(11, 19)\nconst label = (node: string): string => (node === RICH_TEXT_NODE ? 'richText embeds' : node)\nconst readName = (read: Read): string =>\n read.label ??\n `${read.kind}:${read.collection ?? read.global ?? '?'}${read.as !== undefined ? `:${read.as}` : ''}${read.list ? `:${read.list}` : ''}${read.draft ? ' (draft)' : ''}`\n\n/** Which node a read belongs to, and which collection a tag points at (prefix-aware). */\nconst readNode = (read: Read): string | null => read.collection ?? (read.global ? `global:${read.global}` : null)\nconst tagCollection = (tag: string, prefix: string): string => {\n const bare = prefix && tag.startsWith(`${prefix}:`) ? tag.slice(prefix.length + 1) : tag\n return bare.split(':')[0] ?? bare\n}\n\n/** Observed bake-ins as `edited -> renderer` pairs — colors the schema edges by real usage. */\nconst bakedPairs = (reads: Read[], prefix: string): Set<string> => {\n const pairs = new Set<string>()\n for (const read of reads) {\n const renderer = readNode(read)\n if (!renderer) continue\n for (const embed of read.bakedIn) pairs.add(`${tagCollection(embed.tag, prefix)}->${renderer}`)\n }\n return pairs\n}\n\n// ---------------------------------------------------------------------------\n// Explore tab — the React Flow dependency graph\n// ---------------------------------------------------------------------------\n\ntype GraphNodeData = { title: string; kind: 'collection' | 'global' | 'richText'; reads: number; baked: number; selected: boolean }\n\nfunction GraphNode({ data }: NodeProps<FlowNode<GraphNodeData>>) {\n return (\n <div className={`pdtp-flow-node ${data.selected ? 'pdtp-flow-node-active' : ''}`}>\n <Handle type=\"target\" position={Position.Left} className=\"pdtp-flow-handle\" />\n <span className=\"pdtp-mono\">{data.title}</span>\n <span className=\"pdtp-flow-badges\">\n {data.kind !== 'collection' ? <em>{data.kind === 'global' ? 'global' : 'per-doc'}</em> : null}\n {data.reads ? <em>{data.reads} reads</em> : null}\n {data.baked ? <em className=\"pdtp-flow-warn\">{data.baked} baked ⚠</em> : null}\n </span>\n <Handle type=\"source\" position={Position.Right} className=\"pdtp-flow-handle\" />\n </div>\n )\n}\n\nconst nodeTypes: NodeTypes = { pdtp: GraphNode }\n\n/** Left→right layered layout: sources are the things you EDIT, targets the surfaces that\n * go stale. Sized by label so dagre spaces long slugs correctly. */\nconst layout = (nodes: FlowNode<GraphNodeData>[], edges: FlowEdge[]): FlowNode<GraphNodeData>[] => {\n const g = new dagre.graphlib.Graph()\n g.setGraph({ rankdir: 'LR', nodesep: 24, ranksep: 120 })\n g.setDefaultEdgeLabel(() => ({}))\n for (const node of nodes) g.setNode(node.id, { width: 30 + node.data.title.length * 8 + (node.data.reads ? 60 : 0), height: 40 })\n for (const edge of edges) g.setEdge(edge.source, edge.target)\n dagre.layout(g)\n return nodes.map((node) => {\n const pos = g.node(node.id)\n return { ...node, position: { x: pos.x - pos.width / 2, y: pos.y - pos.height / 2 } }\n })\n}\n\nfunction ExploreTab({\n data,\n selected,\n onSelect,\n}: {\n data: RevalidateInspection\n selected: string | null\n onSelect: (n: string | null) => void\n}) {\n const { nodes, edges } = useMemo(() => {\n const baked = bakedPairs(data.reads, data.prefix)\n const readCounts = new Map<string, number>()\n const bakedCounts = new Map<string, number>()\n for (const read of data.reads) {\n const node = readNode(read)\n if (!node) continue\n readCounts.set(node, (readCounts.get(node) ?? 0) + 1)\n if (read.bakedIn.length) bakedCounts.set(node, (bakedCounts.get(node) ?? 0) + 1)\n }\n\n const ids = [...data.graph.collections, ...data.graph.globals.map((g) => `global:${g}`)]\n const hasRichText = data.graph.edges.some((e) => e.to === RICH_TEXT_NODE)\n const allIds = hasRichText ? [...ids, RICH_TEXT_NODE] : ids\n\n const flowNodes: FlowNode<GraphNodeData>[] = allIds.map((id) => ({\n id,\n type: 'pdtp',\n position: { x: 0, y: 0 },\n data: {\n title: label(id),\n kind: id === RICH_TEXT_NODE ? 'richText' : id.startsWith('global:') ? 'global' : 'collection',\n reads: readCounts.get(id) ?? 0,\n baked: bakedCounts.get(id) ?? 0,\n selected: selected === id,\n },\n }))\n\n // Direction of staleness: editing `edge.to` makes `edge.from` stale — source is the\n // edited side so the graph reads left (cause) → right (effect).\n const flowEdges: FlowEdge[] = data.graph.edges.map((edge) => {\n const isBaked = baked.has(`${edge.to}->${edge.from}`)\n const active = selected !== null && (edge.to === selected || edge.from === selected)\n const dimmed = selected !== null && !active\n return {\n id: `${edge.from}|${edge.via}|${edge.to}`,\n source: edge.to,\n target: edge.from,\n animated: isBaked && !dimmed,\n label: active ? `${edge.via} (${edge.kind})` : undefined,\n style: {\n stroke: isBaked ? 'var(--pdtp-warn)' : 'oklch(1 0 0 / 30%)',\n strokeWidth: active ? 2 : 1.25,\n strokeDasharray: edge.kind === 'richText' || edge.to === RICH_TEXT_NODE ? '5 5' : undefined,\n opacity: dimmed ? 0.15 : 1,\n },\n labelStyle: { fill: 'var(--pdtp-fg)', fontSize: 11 },\n labelBgStyle: { fill: 'var(--pdtp-card)' },\n }\n })\n\n return { nodes: layout(flowNodes, flowEdges), edges: flowEdges }\n }, [data, selected])\n\n return (\n <>\n <div className=\"pdtp-flow\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n colorMode=\"dark\"\n fitView\n minZoom={0.3}\n nodesDraggable\n nodesConnectable={false}\n proOptions={{ hideAttribution: true }}\n onNodeClick={(_, node) => onSelect(selected === node.id ? null : node.id)}\n onPaneClick={() => onSelect(null)}\n >\n <Background gap={24} />\n </ReactFlow>\n </div>\n <p className=\"pdtp-note\" style={{ marginTop: 8 }}>\n Left → right: editing a node makes its right-hand neighbors stale. <span className=\"pdtp-warn\">Amber animated</span> edges are OBSERVED\n bake-ins (populated content — the anti-pattern); grey edges are id-references or not yet observed; dashed = richText (per-doc). Click a\n node for its full story.\n </p>\n\n {selected ? <NodeDetail node={selected} data={data} /> : null}\n </>\n )\n}\n\n/**\n * The focused, evidence-based answer for one node — three layers, never conflated:\n *\n * 1. **What a write here busts** — tags, by event kind. Facts from the decision table.\n * 2. **What observably purges right now** — the cached entries that actually carry those\n * tags. This is the truth of \"what happens if I edit/create a doc here today\".\n * 3. **Potential coupling** — schema edges. A reference alone never propagates a purge\n * (ids are stable); an edge only becomes real when a getter is OBSERVED baking the\n * content in. Each edge is labeled accordingly.\n */\nfunction NodeDetail({ node, data }: { node: string; data: RevalidateInspection }) {\n const { graph, rules, reads, prefix } = data\n const p = prefix ? `${prefix}:` : ''\n const isGlobal = node.startsWith('global:')\n const slug = isGlobal ? node.slice('global:'.length) : node\n const settings = data.settings[slug]\n const baked = bakedPairs(reads, prefix)\n\n const makesStale = graph.edges.filter((e) => e.to === node)\n const staleWhen = graph.edges.filter((e) => e.from === node)\n const ownRules = rules.filter((r) => r.on === slug)\n const scopes = Object.entries(settings?.lists ?? {})\n\n // Observed: entries carrying this collection's DOC tags (own entries + bake-ins)…\n const docTagCarriers = new Map<string, { name: string; baked: boolean }[]>()\n // …and entries carrying its LIST tags (what membership events actually purge).\n const listCarriers = reads.filter((read) => read.kind === 'ids' && read.collection === slug)\n if (!isGlobal && node !== RICH_TEXT_NODE) {\n for (const read of reads) {\n for (const tag of [...read.staticTags, ...read.depTags]) {\n if (!tag.startsWith(`${p}${slug}:`) || tag.startsWith(`${p}${slug}:list:`) || tag.endsWith(':draft')) continue\n const isBaked = read.bakedIn.some((b) => b.tag === tag)\n docTagCarriers.set(tag, [...(docTagCarriers.get(tag) ?? []), { name: readName(read), baked: isBaked }])\n }\n }\n }\n\n if (node === RICH_TEXT_NODE) {\n return (\n <div className=\"pdtp-card\" style={{ marginTop: 16 }}>\n <h2>\n richText embeds <span className=\"pdtp-kind\">per-doc</span>\n </h2>\n <p className=\"pdtp-note\" style={{ margin: 0 }}>\n Upload/relationship nodes inside rich text resolve per document at read time. Populated nodes bake content in and tag the entry (shown\n as bake-ins on the owning read); id-only nodes are references — render them through id-keyed getters.\n </p>\n </div>\n )\n }\n\n // The getters the CODE declares for this node (live source scan), matched against\n // runtime observation so each shows whether it has materialized yet.\n const helperKind = { cacheDoc: 'doc', cacheIds: 'ids', cacheGlobal: 'global' } as const\n const nodeGetters = data.getters\n .filter((g) => g.slug === slug && (isGlobal ? g.helper === 'cacheGlobal' : g.helper !== 'cacheGlobal'))\n .map((g) => {\n const observed = reads.find(\n (read) =>\n (read.collection ?? read.global) === slug &&\n read.kind === helperKind[g.helper] &&\n (read.list ?? undefined) === (g.list ?? undefined) &&\n (g.label === undefined || read.label === g.label),\n )\n return { ...g, observed }\n })\n\n const vocabulary = isGlobal\n ? [`${p}global:${slug}`, `${p}global:${slug}:draft`]\n : [\n `${p}${slug}:{id}`,\n ...(settings?.idField ? [`${p}${slug}:{${settings.idField}}`] : []),\n `${p}${slug}`,\n ...scopes.map(([scope]) => `${p}${slug}:list:${scope}`),\n '+ :draft variants',\n ]\n\n return (\n <div className=\"pdtp-card\" style={{ marginTop: 16 }}>\n <h2>\n {label(node)} <span className=\"pdtp-kind\">{isGlobal ? 'global' : 'collection'}</span>\n </h2>\n\n {/* 0 — the tag vocabulary this node lives under */}\n <p className=\"pdtp-note\" style={{ margin: '0 0 12px' }}>\n Tags:{' '}\n {vocabulary.map((tag) => (\n <span key={tag} className=\"pdtp-code\" style={{ marginRight: 6 }}>\n {tag}\n </span>\n ))}\n </p>\n\n {/* 1 — the facts: which write busts which tags */}\n <h3 className=\"pdtp-rev-subhead\">A write here busts…</h3>\n <ul className=\"pdtp-rev-list\">\n {isGlobal ? (\n <li>\n any save → <span className=\"pdtp-code\">{`${p}global:${slug}`}</span>\n </li>\n ) : (\n <>\n <li>\n editing a doc → <span className=\"pdtp-code\">{`${p}${slug}:{id}`}</span>\n {settings?.idField ? (\n <>\n {' '}\n + <span className=\"pdtp-code\">{`${p}${slug}:{${settings.idField}}`}</span>\n </>\n ) : null}{' '}\n <span className=\"pdtp-muted\">— that one doc, nothing else</span>\n </li>\n <li>\n create / delete / publish / unpublish → also <span className=\"pdtp-code\">{`${p}${slug}`}</span>\n {scopes.map(([scope]) => (\n <span key={scope}>\n {' '}\n + <span className=\"pdtp-code\">{`${p}${slug}:list:${scope}`}</span>\n </span>\n ))}{' '}\n <span className=\"pdtp-muted\">— membership changed</span>\n </li>\n {scopes.map(([scope, fields]) => (\n <li key={scope}>\n editing <span className=\"pdtp-mono\">{fields.join(' / ')}</span> → also{' '}\n <span className=\"pdtp-code\">{`${p}${slug}:list:${scope}`}</span> <span className=\"pdtp-muted\">— order/filter changed</span>\n </li>\n ))}\n {settings?.extraTags.length ? (\n <li>\n every published write → also <span className=\"pdtp-mono\">{settings.extraTags.join(', ')}</span>\n </li>\n ) : null}\n {ownRules.length ? (\n <li>\n rules → also <span className=\"pdtp-mono\">{ownRules.flatMap((r) => r.bust).join(', ')}</span>\n </li>\n ) : null}\n </>\n )}\n </ul>\n\n {/* 2 — the observed reality: which entries those tags actually purge today */}\n <h3 className=\"pdtp-rev-subhead\" style={{ marginTop: 14 }}>\n …which currently purges (observed)\n </h3>\n {docTagCarriers.size ? (\n <ul className=\"pdtp-rev-list\">\n {[...docTagCarriers.entries()].slice(0, 10).map(([tag, carriers]) => (\n <li key={tag}>\n <span className=\"pdtp-code\">{tag}</span> →{' '}\n {carriers.map((c, i) => (\n <span key={c.name}>\n {i > 0 ? ', ' : ''}\n {c.name}\n {c.baked ? <span className=\"pdtp-warn\"> (baked-in ⚠)</span> : <span className=\"pdtp-muted\"> (own entry ✓)</span>}\n </span>\n ))}\n </li>\n ))}\n </ul>\n ) : !isGlobal ? (\n <p className=\"pdtp-muted\" style={{ margin: 0 }}>\n No cached entries carry {slug} doc tags yet — editing a {slug} doc right now purges nothing (its entry materializes, tagged, on first\n read).\n </p>\n ) : null}\n {!isGlobal ? (\n <p className=\"pdtp-note\">\n {listCarriers.length ? (\n <>\n Membership events purge: {listCarriers.map((read) => readName(read)).join(', ')}\n {' — '}the id-lists re-query; every unchanged card entry survives.\n </>\n ) : (\n <>\n Membership events currently purge <strong>nothing</strong> — no id-list read carries{' '}\n <span className=\"pdtp-code\">{`${p}${slug}`}</span> or a scope yet. Creating or deleting a {slug} doc is invisible to the cache\n until a `cacheIds` read exists.\n </>\n )}\n </p>\n ) : null}\n\n {/* 2b — the getters the code declares for this node (source scan + runtime match) */}\n {nodeGetters.length ? (\n <div style={{ marginTop: 14 }}>\n <h3 className=\"pdtp-rev-subhead\">Getters in your code</h3>\n <ul className=\"pdtp-rev-list\">\n {nodeGetters.map((g) => (\n <li key={`${g.file}:${g.line}`}>\n <strong>{g.getter ? `${g.getter}()` : (g.label ?? g.helper)}</strong>{' '}\n <span className=\"pdtp-mono pdtp-muted\">\n {g.helper}\n {g.list ? ` · list:${g.list}` : ''} · {g.file}:{g.line}\n </span>{' '}\n {g.observed ? (\n <span className=\"pdtp-muted\">\n materialized ×{g.observed.count}\n {g.observed.bakedIn.length ? <span className=\"pdtp-warn\"> · {g.observed.bakedIn.length} baked-in ⚠</span> : null}\n {g.observed.undeclared ? <span className=\"pdtp-warn\"> · undeclared scope!</span> : null}\n </span>\n ) : (\n <span className=\"pdtp-muted\">not yet observed</span>\n )}\n </li>\n ))}\n </ul>\n <p className=\"pdtp-note\">Found by scanning your source for cache-helper calls (literal slugs only) — the payload-icons pattern.</p>\n </div>\n ) : null}\n\n {/* 3 — potential coupling: schema edges, real only when observed baked */}\n <div className=\"pdtp-rev-cols\" style={{ marginTop: 14 }}>\n <div>\n <h3 className=\"pdtp-rev-subhead\">Can be referenced by (schema)</h3>\n {makesStale.length ? (\n <ul className=\"pdtp-rev-list\">\n {makesStale.map((edge) => {\n const observedBaked = baked.has(`${node}->${edge.from}`)\n return (\n <li key={`${edge.from}-${edge.via}`}>\n <strong>{edge.from}</strong>{' '}\n <span className=\"pdtp-mono pdtp-muted\">\n via {edge.via} ({edge.kind})\n </span>{' '}\n {observedBaked ? (\n <span className=\"pdtp-warn\">baked-in ⚠ — edits here DO purge those entries</span>\n ) : (\n <span className=\"pdtp-muted\">reference only — no purge propagation</span>\n )}\n </li>\n )\n })}\n </ul>\n ) : (\n <p className=\"pdtp-muted\" style={{ margin: 0 }}>\n No schema field references it.\n </p>\n )}\n </div>\n <div>\n <h3 className=\"pdtp-rev-subhead\">References (schema)</h3>\n {staleWhen.length ? (\n <ul className=\"pdtp-rev-list\">\n {staleWhen.map((edge) => {\n const observedBaked = baked.has(`${edge.to}->${node}`)\n return (\n <li key={`${edge.to}-${edge.via}`}>\n <strong>{label(edge.to)}</strong>{' '}\n <span className=\"pdtp-mono pdtp-muted\">\n via {edge.via} ({edge.kind})\n </span>{' '}\n {observedBaked ? (\n <span className=\"pdtp-warn\">baked-in ⚠ — its edits purge {slug} entries</span>\n ) : (\n <span className=\"pdtp-muted\">id only — its edits never touch {slug} entries</span>\n )}\n </li>\n )\n })}\n </ul>\n ) : (\n <p className=\"pdtp-muted\" style={{ margin: 0 }}>\n References nothing.\n </p>\n )}\n </div>\n </div>\n\n <p className=\"pdtp-note\">\n A reference (id) never couples two entries — the id is stable, and the referenced doc's freshness lives in its own id-keyed entry. Only{' '}\n <span className=\"pdtp-warn\">baked-in ⚠</span> rows propagate purges; refactor those getters to shrink the blast radius.\n </p>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Fields tab — the per-field blast-radius table\n// ---------------------------------------------------------------------------\n\nfunction FieldsTab({ data }: { data: RevalidateInspection }) {\n const entries = Object.entries(data.settings)\n if (!entries.length) return <p className=\"pdtp-muted\">No collections registered.</p>\n\n return (\n <>\n {entries.map(([slug, s]) => (\n <div key={slug} className=\"pdtp-card\" style={{ marginBottom: 14 }}>\n <h2>\n {slug}{' '}\n <span className=\"pdtp-kind\">{Object.keys(s.lists).length ? `lists: ${Object.keys(s.lists).join(', ')}` : 'no declared lists'}</span>\n </h2>\n <table className=\"pdtp-table\">\n <thead>\n <tr>\n <th>editing field…</th>\n <th>busts</th>\n </tr>\n </thead>\n <tbody>\n {s.fields.map((field) => {\n const scopes = Object.entries(s.lists)\n .filter(([, fields]) => fields.includes(field))\n .map(([scope]) => scope)\n return (\n <tr key={field}>\n <td className=\"pdtp-mono\">{field}</td>\n <td className=\"pdtp-mono\">\n doc\n {field === s.idField ? ' + alias (old & new)' : ''}\n {scopes.length ? ` + ${scopes.map((scope) => `list:${scope}`).join(' + ')}` : ''}\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n <p className=\"pdtp-note\">\n Create / delete / publish / unpublish additionally bust <span className=\"pdtp-code\">{slug}</span>\n {Object.keys(s.lists).map((scope) => (\n <span key={scope}>\n {' '}\n + <span className=\"pdtp-code\">{`${slug}:list:${scope}`}</span>\n </span>\n ))}\n {s.extraTags.length ? <> · every published write also busts {s.extraTags.join(', ')}</> : null}\n </p>\n </div>\n ))}\n\n {data.rules.length ? (\n <div className=\"pdtp-section\">\n <h2>\n Manual rules <span className=\"pdtp-kind\">{data.rules.length}</span>\n </h2>\n <table className=\"pdtp-table\">\n <tbody>\n {data.rules.map((rule) => (\n <tr key={`${rule.on}-${rule.bust.join(',')}`}>\n <td className=\"pdtp-code\">{rule.on}</td>\n <td className=\"pdtp-mono\">busts {rule.bust.join(', ')}</td>\n <td className=\"pdtp-muted\">{rule.whenFields ? `when ${rule.whenFields.join(', ')} change` : 'always'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : null}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Reads + Events tabs\n// ---------------------------------------------------------------------------\n\nfunction ReadsTab({ data }: { data: RevalidateInspection }) {\n return data.reads.length ? (\n <>\n <table className=\"pdtp-table\">\n <thead>\n <tr>\n <th>read</th>\n <th>tags</th>\n <th>health</th>\n <th>seen</th>\n <th>last</th>\n </tr>\n </thead>\n <tbody>\n {data.reads.map((read) => {\n const all = [...read.staticTags, ...read.depTags]\n return (\n <tr key={readName(read)}>\n <td className=\"pdtp-code\">{readName(read)}</td>\n <td className=\"pdtp-mono\" title={all.join('\\n')}>\n {all.length}\n </td>\n <td>\n {read.undeclared ? <span className=\"pdtp-warn\">undeclared scope! </span> : null}\n {read.bakedIn.length ? (\n <span className=\"pdtp-warn\" title={read.bakedIn.map((b) => `${b.via} → ${b.tag}`).join('\\n')}>\n {read.bakedIn.length} baked-in ⚠\n </span>\n ) : null}\n {read.capped ? <span className=\"pdtp-warn\"> capped!</span> : null}\n {!read.undeclared && !read.bakedIn.length && !read.capped ? <span className=\"pdtp-muted\">atomic ✓</span> : null}\n </td>\n <td className=\"pdtp-mono\">×{read.count}</td>\n <td className=\"pdtp-mono\">{clock(read.lastAt)}</td>\n </tr>\n )\n })}\n </tbody>\n </table>\n <p className=\"pdtp-note\">\n Hover a tag count for the full list, a baked-in badge for the field paths. Reads record on cache miss (a hit never re-executes the\n getter).\n </p>\n </>\n ) : (\n <p className=\"pdtp-muted\">Nothing materialized yet — reads appear here the first time a cacheDoc/cacheIds/cacheGlobal getter runs.</p>\n )\n}\n\nfunction EventsTab({ data, endpointPath }: { data: RevalidateInspection; endpointPath: string | null }) {\n return (\n <>\n {data.events.length ? (\n <table className=\"pdtp-table\">\n <thead>\n <tr>\n <th>at</th>\n <th>trigger</th>\n <th>busted</th>\n </tr>\n </thead>\n <tbody>\n {data.events.map((event) => (\n <tr key={`${event.at}-${event.trigger.slug}-${event.trigger.id ?? ''}`}>\n <td className=\"pdtp-mono\">{clock(event.at)}</td>\n <td>\n <span className=\"pdtp-code\">\n {event.trigger.operation} {event.trigger.slug}\n {event.trigger.id !== undefined ? `:${event.trigger.id}` : ''}\n </span>\n {event.trigger.lane === 'draft' ? <span className=\"pdtp-muted\"> draft</span> : null}\n </td>\n <td className=\"pdtp-mono\" title={event.busted.map((b) => `${b.tag} (${b.reason})`).join('\\n')}>\n {event.busted\n .slice(0, 4)\n .map((b) => b.tag)\n .join(', ')}\n {event.busted.length > 4 ? ` +${event.busted.length - 4}` : ''}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n ) : (\n <p className=\"pdtp-muted\">No busts recorded yet — edit something in the admin panel.</p>\n )}\n {endpointPath ? <BustTagCard endpointPath={endpointPath} /> : null}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The tabbed panel\n// ---------------------------------------------------------------------------\n\nconst TABS = [\n { key: 'explore', title: 'Explore' },\n { key: 'fields', title: 'Fields' },\n { key: 'reads', title: 'Reads' },\n { key: 'events', title: 'Events' },\n] as const\n\ntype TabKey = (typeof TABS)[number]['key']\n\n/** The `/dev/revalidate` panel — tabbed so a grown project stays navigable: Explore (the\n * interactive dependency graph + per-node lookup), Fields (the per-field blast-radius\n * tables), Reads (observed cache entries with atomic-health badges), Events (the bust\n * log + manual bust box). */\nexport function RevalidatePanel({ data, endpointPath }: { data: RevalidateInspection; endpointPath: string | null }) {\n const [tab, setTab] = useState<TabKey>('explore')\n const [selected, setSelected] = useState<string | null>(null)\n\n return (\n <>\n {!data.observing ? (\n <p className=\"pdtp-warn\" style={{ marginTop: 0 }}>\n Observation is off (`observe: false`) — the graph is static config analysis only; reads and events aren't recorded.\n </p>\n ) : null}\n\n <div className=\"pdtp-seg\" style={{ marginBottom: 20 }}>\n {TABS.map(({ key, title }) => (\n <button key={key} type=\"button\" className={tab === key ? 'pdtp-active' : ''} onClick={() => setTab(key)}>\n {title}\n {key === 'reads' && data.reads.length ? ` · ${data.reads.length}` : ''}\n {key === 'events' && data.events.length ? ` · ${data.events.length}` : ''}\n </button>\n ))}\n </div>\n\n {tab === 'explore' ? <ExploreTab data={data} selected={selected} onSelect={setSelected} /> : null}\n {tab === 'fields' ? <FieldsTab data={data} /> : null}\n {tab === 'reads' ? <ReadsTab data={data} /> : null}\n {tab === 'events' ? <EventsTab data={data} endpointPath={endpointPath} /> : null}\n\n <p className=\"pdtp-note\">\n Machine-readable: <span className=\"pdtp-code\">GET {endpointPath ?? '/api/revalidate-map'}</span> serves all of this as JSON\n {data.prefix ? (\n <>\n {' '}\n · tag prefix <span className=\"pdtp-code\">{data.prefix}</span>\n </>\n ) : null}\n </p>\n </>\n )\n}\n"],"names":["dagre","Background","Handle","Position","ReactFlow","useMemo","useState","BustTagCard","RICH_TEXT_NODE","clock","iso","slice","label","node","readName","read","kind","collection","global","as","undefined","list","draft","readNode","tagCollection","tag","prefix","bare","startsWith","length","split","bakedPairs","reads","pairs","Set","renderer","embed","bakedIn","add","GraphNode","data","div","className","selected","type","position","Left","span","title","em","baked","Right","nodeTypes","pdtp","layout","nodes","edges","g","graphlib","Graph","setGraph","rankdir","nodesep","ranksep","setDefaultEdgeLabel","setNode","id","width","height","edge","setEdge","source","target","map","pos","x","y","ExploreTab","onSelect","readCounts","Map","bakedCounts","set","get","ids","graph","collections","globals","hasRichText","some","e","to","allIds","flowNodes","flowEdges","isBaked","has","from","active","dimmed","via","animated","style","stroke","strokeWidth","strokeDasharray","opacity","labelStyle","fill","fontSize","labelBgStyle","colorMode","fitView","minZoom","nodesDraggable","nodesConnectable","proOptions","hideAttribution","onNodeClick","_","onPaneClick","gap","p","marginTop","NodeDetail","rules","isGlobal","slug","settings","makesStale","filter","staleWhen","ownRules","r","on","scopes","Object","entries","lists","docTagCarriers","listCarriers","staticTags","depTags","endsWith","b","name","h2","margin","helperKind","cacheDoc","cacheIds","cacheGlobal","nodeGetters","getters","helper","observed","find","vocabulary","idField","scope","marginRight","h3","ul","li","fields","join","extraTags","flatMap","bust","size","carriers","c","i","strong","getter","file","line","count","undeclared","observedBaked","FieldsTab","s","marginBottom","keys","table","thead","tr","th","tbody","field","includes","td","rule","whenFields","ReadsTab","all","capped","lastAt","EventsTab","endpointPath","events","event","at","trigger","operation","lane","busted","reason","TABS","key","RevalidatePanel","tab","setTab","setSelected","observing","button","onClick"],"mappings":"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"}
|
package/dist/next/views.d.ts
CHANGED
|
@@ -23,6 +23,12 @@ export declare function ImagesView({ payload, snapshot, searchParams, }: {
|
|
|
23
23
|
snapshot: DevSnapshot;
|
|
24
24
|
searchParams?: Record<string, string | string[] | undefined>;
|
|
25
25
|
}): Promise<import("react").JSX.Element>;
|
|
26
|
+
/** `/dev/revalidate` — the dependency map, rendered by the tabbed client panel (Explore /
|
|
27
|
+
* Map / Reads / Events). All data comes live off payload-revalidate's inspection slot,
|
|
28
|
+
* read here (server side, structural — no import) and passed down as plain props. */
|
|
29
|
+
export declare function RevalidateView({ snapshot }: {
|
|
30
|
+
snapshot: DevSnapshot;
|
|
31
|
+
}): import("react").JSX.Element;
|
|
26
32
|
/** `/dev/mux` — the videos with their persisted ingest status. */
|
|
27
33
|
export declare function MuxView({ payload, snapshot }: {
|
|
28
34
|
payload: Payload;
|
package/dist/next/views.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/next/views.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,OAAO,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/next/views.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,OAAO,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAKlD;sDACsD;AACtD,wBAAsB,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,wCA2EjG;AAID;;;yDAGyD;AACzD,wBAAsB,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,wCAyDjG;AAKD;;;gEAGgE;AAChE,wBAAsB,UAAU,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,YAAiB,GAClB,EAAE;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,WAAW,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CAC7D,wCAqFA;AAED;;sFAEsF;AACtF,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,+BASrE;AASD,kEAAkE;AAClE,wBAAsB,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,wCAsC/F"}
|
package/dist/next/views.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import Link from "next/link";
|
|
3
3
|
import { FontSpecimen, IconSetSwitcher } from "./client.js";
|
|
4
|
+
import { RevalidatePanel } from "./revalidatePanel.js";
|
|
4
5
|
import { facesToStyles } from "./specimen.js";
|
|
5
6
|
/** `/dev/icons` — every set as a switcher button (activating one re-skins the site), the active
|
|
6
7
|
* set's glyphs as a grid, and any runtime misses. */ export async function IconsView({ payload, snapshot }) {
|
|
@@ -355,6 +356,21 @@ const capitalize = (key)=>key.charAt(0).toUpperCase() + key.slice(1);
|
|
|
355
356
|
]
|
|
356
357
|
});
|
|
357
358
|
}
|
|
359
|
+
/** `/dev/revalidate` — the dependency map, rendered by the tabbed client panel (Explore /
|
|
360
|
+
* Map / Reads / Events). All data comes live off payload-revalidate's inspection slot,
|
|
361
|
+
* read here (server side, structural — no import) and passed down as plain props. */ export function RevalidateView({ snapshot }) {
|
|
362
|
+
const meta = snapshot.revalidate;
|
|
363
|
+
const inspect = globalThis[Symbol.for('pro-laico.payload-revalidate.inspect')];
|
|
364
|
+
const data = inspect?.();
|
|
365
|
+
if (!meta || !data) return /*#__PURE__*/ _jsx("p", {
|
|
366
|
+
className: "pdtp-muted",
|
|
367
|
+
children: "payload-revalidate isn't active in this process."
|
|
368
|
+
});
|
|
369
|
+
return /*#__PURE__*/ _jsx(RevalidatePanel, {
|
|
370
|
+
data: data,
|
|
371
|
+
endpointPath: meta.endpointPath
|
|
372
|
+
});
|
|
373
|
+
}
|
|
358
374
|
const formatDuration = (seconds)=>{
|
|
359
375
|
if (!seconds && seconds !== 0) return '—';
|
|
360
376
|
const m = Math.floor(seconds / 60);
|
package/dist/next/views.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/views.tsx"],"sourcesContent":["import Link from 'next/link'\nimport type { CollectionSlug, GlobalSlug, Payload } from 'payload'\nimport type { DevSnapshot } from '../lib/snapshot'\nimport { FontSpecimen, IconSetSwitcher } from './client'\nimport { facesToStyles, type OptimizedFace } from './specimen'\n\n/** `/dev/icons` — every set as a switcher button (activating one re-skins the site), the active\n * set's glyphs as a grid, and any runtime misses. */\nexport async function IconsView({ payload, snapshot }: { payload: Payload; snapshot: DevSnapshot }) {\n const icons = snapshot.icons\n if (!icons?.iconSetSlug) {\n return <p className=\"pdtp-muted\">payload-icons isn't installed (or runs without its iconSet collection).</p>\n }\n\n const res = await payload.find({\n collection: icons.iconSetSlug as CollectionSlug,\n depth: 1,\n limit: 50,\n overrideAccess: true,\n pagination: false,\n })\n const sets = (\n res.docs as {\n id: string | number\n title?: string\n active?: boolean\n iconsArray?: { name?: string; icon?: { svgString?: string } | string | number | null }[]\n }[]\n ).map((doc) => ({\n id: doc.id,\n title: doc.title ?? String(doc.id),\n active: !!doc.active,\n rows: (doc.iconsArray ?? []).flatMap((row) => {\n const svg = row.icon && typeof row.icon === 'object' ? row.icon.svgString : undefined\n return row.name && svg ? [{ name: row.name, svg }] : []\n }),\n }))\n const active = sets.find((s) => s.active)\n\n return (\n <>\n <div className=\"pdtp-section\">\n <h2>Sets</h2>\n {sets.length ? (\n <IconSetSwitcher sets={sets.map(({ id, title, active: a }) => ({ id, title, active: a }))} />\n ) : (\n <p className=\"pdtp-muted\">No icon sets yet.</p>\n )}\n <p className=\"pdtp-note\">Activating a set publishes it as the single active set — the whole site re-skins on refresh.</p>\n </div>\n\n <div className=\"pdtp-section\">\n <h2>{active ? `Active set — ${active.title} (${active.rows.length})` : 'Active set'}</h2>\n {active?.rows.length ? (\n <div className=\"pdtp-icon-grid\">\n {active.rows.map((row) => (\n <figure key={row.name} className=\"pdtp-icon-cell\" style={{ margin: 0 }}>\n {/* dangerouslySetInnerHTML: svgString is sanitized by payload-icons on save */}\n <span dangerouslySetInnerHTML={{ __html: row.svg }} />\n <figcaption>{row.name}</figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <p className=\"pdtp-muted\">{active ? 'The active set has no icons.' : 'No set is active — activate one above.'}</p>\n )}\n </div>\n\n {icons.misses.length ? (\n <div className=\"pdtp-section\">\n <h2>Runtime misses</h2>\n <p className=\"pdtp-warn\">\n {icons.misses.map((m) => (\n <span key={m.name} className=\"pdtp-code\" style={{ marginRight: 8 }}>\n {m.name} ×{m.count}\n </span>\n ))}\n </p>\n <p className=\"pdtp-note\">Names requested in code that didn't resolve through the active set.</p>\n </div>\n ) : null}\n </>\n )\n}\n\nconst capitalize = (key: string): string => key.charAt(0).toUpperCase() + key.slice(1)\n\n/** `/dev/fonts` — one interactive specimen per family slot, rendered in the family's own\n * `--font-set*` variable so the page shows the actual served fonts (the host layout loads them\n * via extractFonts / DevFonts). The weight/style controls are built from the `fontOptimized`\n * docs, so only faces that really exist are offered. */\nexport async function FontsView({ payload, snapshot }: { payload: Payload; snapshot: DevSnapshot }) {\n const fonts = snapshot.fonts\n if (!fonts) return <p className=\"pdtp-muted\">payload-fonts isn't installed.</p>\n\n // Which typeface fills each slot (ids), then every served face of those typefaces.\n const slotIds: Record<string, string | number | null> = {}\n if (fonts.fontSetSlug) {\n try {\n const set = (await payload.findGlobal({ slug: fonts.fontSetSlug as GlobalSlug, depth: 0, overrideAccess: true })) as unknown as Record<\n string,\n unknown\n >\n for (const key of fonts.familyKeys) {\n const value = set[key]\n slotIds[key] = typeof value === 'string' || typeof value === 'number' ? value : null\n }\n } catch {}\n }\n\n const ids = Object.values(slotIds).filter((id): id is string | number => id !== null && id !== undefined)\n let faces: OptimizedFace[] = []\n if (fonts.fontOptimizedSlug && ids.length) {\n try {\n const res = await payload.find({\n collection: fonts.fontOptimizedSlug as CollectionSlug,\n where: { font: { in: ids } },\n depth: 0,\n limit: 200,\n overrideAccess: true,\n pagination: false,\n })\n faces = res.docs as OptimizedFace[]\n } catch {}\n }\n\n return (\n <>\n {fonts.familyKeys.map((key) => {\n const id = slotIds[key]\n const styles = id != null ? facesToStyles(faces.filter((f) => f.font === id)) : []\n return (\n <FontSpecimen\n key={key}\n familyKey={key}\n title={fonts.slots[key] ?? null}\n cssVar={`var(--font-set${capitalize(key)})`}\n styles={styles}\n />\n )\n })}\n <p className=\"pdtp-note\">\n Only weights and styles the typeface actually serves are offered (from the{' '}\n <span className=\"pdtp-code\">{fonts.fontOptimizedSlug ?? 'fontOptimized'}</span> collection); a variable face exposes stops across its\n range. Slots come from the <span className=\"pdtp-code\">{fonts.fontSetSlug ?? 'fontSet'}</span> global.\n </p>\n </>\n )\n}\n\n/** The where-clause for docs with no folder — the pattern Payload's own folder views use. */\nconst UNFILED_WHERE = { or: [{ folder: { exists: false } }, { folder: { equals: null } }] }\n\n/** `/dev/images` — every original through the on-demand transform endpoint (`?w=320`), so the\n * grid itself exercises payload-images end-to-end. When the collection has Payload folders\n * enabled, the folders render as filter chips (`?folder=<id>`, `?folder=none` for unfiled) so\n * you can click through the library the way it's organized. */\nexport async function ImagesView({\n payload,\n snapshot,\n searchParams = {},\n}: {\n payload: Payload\n snapshot: DevSnapshot\n searchParams?: Record<string, string | string[] | undefined>\n}) {\n const images = snapshot.images\n if (!images) return <p className=\"pdtp-muted\">payload-images isn't installed.</p>\n\n const base = snapshot.devRoute\n const sourceSlug = images.sourceSlug as CollectionSlug\n\n // Folder chips — only when the root folders feature is on (a collection opted in).\n const foldersConfig = payload.config.folders\n const foldersSlug = foldersConfig ? (foldersConfig.slug ?? 'payload-folders') : null\n const folders: { id: string | number; name: string; count: number }[] = []\n let unfiled = 0\n if (foldersSlug) {\n try {\n const res = await payload.find({ collection: foldersSlug as CollectionSlug, depth: 0, limit: 100, overrideAccess: true, sort: 'name' })\n for (const doc of res.docs as { id: string | number; name?: string }[]) {\n const { totalDocs } = await payload.count({ collection: sourceSlug, where: { folder: { equals: doc.id } }, overrideAccess: true })\n if (totalDocs > 0) folders.push({ id: doc.id, name: doc.name ?? String(doc.id), count: totalDocs })\n }\n unfiled = (await payload.count({ collection: sourceSlug, where: UNFILED_WHERE, overrideAccess: true })).totalDocs\n } catch {}\n }\n\n const selected = typeof searchParams.folder === 'string' ? searchParams.folder : undefined\n const where =\n selected === 'none' && folders.length\n ? UNFILED_WHERE\n : selected && folders.some((f) => String(f.id) === selected)\n ? { folder: { equals: selected } }\n : undefined\n\n const res = await payload.find({\n collection: sourceSlug,\n depth: 0,\n limit: 60,\n overrideAccess: true,\n sort: '-createdAt',\n ...(where ? { where } : {}),\n })\n const docs = res.docs as { id: string | number; filename?: string; alt?: string }[]\n\n return (\n <>\n {folders.length ? (\n <div className=\"pdtp-chips\" style={{ marginBottom: 20 }}>\n <Link href={`${base}/images`} className={`pdtp-chip ${!where ? 'pdtp-active' : ''}`}>\n All · {images.sourceCount ?? '?'}\n </Link>\n {folders.map((folder) => (\n <Link\n key={folder.id}\n href={`${base}/images?folder=${folder.id}`}\n className={`pdtp-chip ${selected === String(folder.id) ? 'pdtp-active' : ''}`}\n >\n {folder.name} · {folder.count}\n </Link>\n ))}\n {unfiled > 0 ? (\n <Link href={`${base}/images?folder=none`} className={`pdtp-chip ${selected === 'none' ? 'pdtp-active' : ''}`}>\n Unfiled · {unfiled}\n </Link>\n ) : null}\n </div>\n ) : null}\n\n {docs.length ? (\n <div className=\"pdtp-img-grid\">\n {docs.map((doc) => (\n <figure key={doc.id} className=\"pdtp-img-cell\" style={{ margin: 0 }}>\n {/* biome-ignore lint/performance/noImgElement: dev page — exercising the plugin's own transform endpoint, not next/image */}\n <img src={`${images.basePath}/${doc.id}?w=320`} alt={doc.alt ?? doc.filename ?? String(doc.id)} loading=\"lazy\" />\n <figcaption title={doc.alt}>{doc.filename ?? doc.id}</figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <p className=\"pdtp-muted\">No images{where ? ' in this folder' : ' yet'}.</p>\n )}\n <p className=\"pdtp-note\">\n {docs.length} originals rendered through <span className=\"pdtp-code\">{images.basePath}/:id?w=320</span>\n {res.totalDocs > docs.length ? ` (showing ${docs.length} of ${res.totalDocs})` : ''} · {images.variantCount ?? 0} cached variants so far\n {folders.length ? ' · folders via Payload folders' : ''}\n </p>\n </>\n )\n}\n\nconst formatDuration = (seconds?: number | null): string => {\n if (!seconds && seconds !== 0) return '—'\n const m = Math.floor(seconds / 60)\n const s = Math.round(seconds % 60)\n return `${m}:${String(s).padStart(2, '0')}`\n}\n\n/** `/dev/mux` — the videos with their persisted ingest status. */\nexport async function MuxView({ payload, snapshot }: { payload: Payload; snapshot: DevSnapshot }) {\n const mux = snapshot.mux\n if (!mux) return <p className=\"pdtp-muted\">payload-mux isn't installed.</p>\n\n const res = await payload.find({ collection: mux.slug as CollectionSlug, depth: 0, limit: 50, overrideAccess: true, sort: '-createdAt' })\n const docs = res.docs as { id: string | number; title?: string; status?: string; duration?: number }[]\n\n return (\n <>\n {!mux.credentialed ? (\n <p className=\"pdtp-warn\" style={{ marginTop: 0 }}>\n MUX_TOKEN_ID / MUX_TOKEN_SECRET are not set — uploads and ingest will fail.\n </p>\n ) : null}\n {docs.length ? (\n <table className=\"pdtp-table\">\n <thead>\n <tr>\n <th>title</th>\n <th>status</th>\n <th>duration</th>\n </tr>\n </thead>\n <tbody>\n {docs.map((doc) => (\n <tr key={doc.id}>\n <td>{doc.title ?? doc.id}</td>\n <td className={doc.status === 'errored' ? 'pdtp-warn' : undefined}>{doc.status ?? '—'}</td>\n <td className=\"pdtp-mono\">{formatDuration(doc.duration)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n ) : (\n <p className=\"pdtp-muted\">No videos yet.</p>\n )}\n </>\n )\n}\n"],"names":["Link","FontSpecimen","IconSetSwitcher","facesToStyles","IconsView","payload","snapshot","icons","iconSetSlug","p","className","res","find","collection","depth","limit","overrideAccess","pagination","sets","docs","map","doc","id","title","String","active","rows","iconsArray","flatMap","row","svg","icon","svgString","undefined","name","s","div","h2","length","a","figure","style","margin","span","dangerouslySetInnerHTML","__html","figcaption","misses","m","marginRight","count","capitalize","key","charAt","toUpperCase","slice","FontsView","fonts","slotIds","fontSetSlug","set","findGlobal","slug","familyKeys","value","ids","Object","values","filter","faces","fontOptimizedSlug","where","font","in","styles","f","familyKey","slots","cssVar","UNFILED_WHERE","or","folder","exists","equals","ImagesView","searchParams","images","base","devRoute","sourceSlug","foldersConfig","config","folders","foldersSlug","unfiled","sort","totalDocs","push","selected","some","marginBottom","href","sourceCount","img","src","basePath","alt","filename","loading","variantCount","formatDuration","seconds","Math","floor","round","padStart","MuxView","mux","credentialed","marginTop","table","thead","tr","th","tbody","td","status","duration"],"mappings":";AAAA,OAAOA,UAAU,YAAW;AAG5B,SAASC,YAAY,EAAEC,eAAe,QAAQ,cAAU;AACxD,SAASC,aAAa,QAA4B,gBAAY;AAE9D;oDACoD,GACpD,OAAO,eAAeC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,EAA+C;IAChG,MAAMC,QAAQD,SAASC,KAAK;IAC5B,IAAI,CAACA,OAAOC,aAAa;QACvB,qBAAO,KAACC;YAAEC,WAAU;sBAAa;;IACnC;IAEA,MAAMC,MAAM,MAAMN,QAAQO,IAAI,CAAC;QAC7BC,YAAYN,MAAMC,WAAW;QAC7BM,OAAO;QACPC,OAAO;QACPC,gBAAgB;QAChBC,YAAY;IACd;IACA,MAAMC,OAAO,AACXP,IAAIQ,IAAI,CAMRC,GAAG,CAAC,CAACC,MAAS,CAAA;YACdC,IAAID,IAAIC,EAAE;YACVC,OAAOF,IAAIE,KAAK,IAAIC,OAAOH,IAAIC,EAAE;YACjCG,QAAQ,CAAC,CAACJ,IAAII,MAAM;YACpBC,MAAM,AAACL,CAAAA,IAAIM,UAAU,IAAI,EAAE,AAAD,EAAGC,OAAO,CAAC,CAACC;gBACpC,MAAMC,MAAMD,IAAIE,IAAI,IAAI,OAAOF,IAAIE,IAAI,KAAK,WAAWF,IAAIE,IAAI,CAACC,SAAS,GAAGC;gBAC5E,OAAOJ,IAAIK,IAAI,IAAIJ,MAAM;oBAAC;wBAAEI,MAAML,IAAIK,IAAI;wBAAEJ;oBAAI;iBAAE,GAAG,EAAE;YACzD;QACF,CAAA;IACA,MAAML,SAASP,KAAKN,IAAI,CAAC,CAACuB,IAAMA,EAAEV,MAAM;IAExC,qBACE;;0BACE,MAACW;gBAAI1B,WAAU;;kCACb,KAAC2B;kCAAG;;oBACHnB,KAAKoB,MAAM,iBACV,KAACpC;wBAAgBgB,MAAMA,KAAKE,GAAG,CAAC,CAAC,EAAEE,EAAE,EAAEC,KAAK,EAAEE,QAAQc,CAAC,EAAE,GAAM,CAAA;gCAAEjB;gCAAIC;gCAAOE,QAAQc;4BAAE,CAAA;uCAEtF,KAAC9B;wBAAEC,WAAU;kCAAa;;kCAE5B,KAACD;wBAAEC,WAAU;kCAAY;;;;0BAG3B,MAAC0B;gBAAI1B,WAAU;;kCACb,KAAC2B;kCAAIZ,SAAS,CAAC,aAAa,EAAEA,OAAOF,KAAK,CAAC,EAAE,EAAEE,OAAOC,IAAI,CAACY,MAAM,CAAC,CAAC,CAAC,GAAG;;oBACtEb,QAAQC,KAAKY,uBACZ,KAACF;wBAAI1B,WAAU;kCACZe,OAAOC,IAAI,CAACN,GAAG,CAAC,CAACS,oBAChB,MAACW;gCAAsB9B,WAAU;gCAAiB+B,OAAO;oCAAEC,QAAQ;gCAAE;;kDAEnE,KAACC;wCAAKC,yBAAyB;4CAAEC,QAAQhB,IAAIC,GAAG;wCAAC;;kDACjD,KAACgB;kDAAYjB,IAAIK,IAAI;;;+BAHVL,IAAIK,IAAI;uCAQzB,KAACzB;wBAAEC,WAAU;kCAAce,SAAS,iCAAiC;;;;YAIxElB,MAAMwC,MAAM,CAACT,MAAM,iBAClB,MAACF;gBAAI1B,WAAU;;kCACb,KAAC2B;kCAAG;;kCACJ,KAAC5B;wBAAEC,WAAU;kCACVH,MAAMwC,MAAM,CAAC3B,GAAG,CAAC,CAAC4B,kBACjB,MAACL;gCAAkBjC,WAAU;gCAAY+B,OAAO;oCAAEQ,aAAa;gCAAE;;oCAC9DD,EAAEd,IAAI;oCAAC;oCAAGc,EAAEE,KAAK;;+BADTF,EAAEd,IAAI;;kCAKrB,KAACzB;wBAAEC,WAAU;kCAAY;;;iBAEzB;;;AAGV;AAEA,MAAMyC,aAAa,CAACC,MAAwBA,IAAIC,MAAM,CAAC,GAAGC,WAAW,KAAKF,IAAIG,KAAK,CAAC;AAEpF;;;uDAGuD,GACvD,OAAO,eAAeC,UAAU,EAAEnD,OAAO,EAAEC,QAAQ,EAA+C;IAChG,MAAMmD,QAAQnD,SAASmD,KAAK;IAC5B,IAAI,CAACA,OAAO,qBAAO,KAAChD;QAAEC,WAAU;kBAAa;;IAE7C,mFAAmF;IACnF,MAAMgD,UAAkD,CAAC;IACzD,IAAID,MAAME,WAAW,EAAE;QACrB,IAAI;YACF,MAAMC,MAAO,MAAMvD,QAAQwD,UAAU,CAAC;gBAAEC,MAAML,MAAME,WAAW;gBAAgB7C,OAAO;gBAAGE,gBAAgB;YAAK;YAI9G,KAAK,MAAMoC,OAAOK,MAAMM,UAAU,CAAE;gBAClC,MAAMC,QAAQJ,GAAG,CAACR,IAAI;gBACtBM,OAAO,CAACN,IAAI,GAAG,OAAOY,UAAU,YAAY,OAAOA,UAAU,WAAWA,QAAQ;YAClF;QACF,EAAE,OAAM,CAAC;IACX;IAEA,MAAMC,MAAMC,OAAOC,MAAM,CAACT,SAASU,MAAM,CAAC,CAAC9C,KAA8BA,OAAO,QAAQA,OAAOW;IAC/F,IAAIoC,QAAyB,EAAE;IAC/B,IAAIZ,MAAMa,iBAAiB,IAAIL,IAAI3B,MAAM,EAAE;QACzC,IAAI;YACF,MAAM3B,MAAM,MAAMN,QAAQO,IAAI,CAAC;gBAC7BC,YAAY4C,MAAMa,iBAAiB;gBACnCC,OAAO;oBAAEC,MAAM;wBAAEC,IAAIR;oBAAI;gBAAE;gBAC3BnD,OAAO;gBACPC,OAAO;gBACPC,gBAAgB;gBAChBC,YAAY;YACd;YACAoD,QAAQ1D,IAAIQ,IAAI;QAClB,EAAE,OAAM,CAAC;IACX;IAEA,qBACE;;YACGsC,MAAMM,UAAU,CAAC3C,GAAG,CAAC,CAACgC;gBACrB,MAAM9B,KAAKoC,OAAO,CAACN,IAAI;gBACvB,MAAMsB,SAASpD,MAAM,OAAOnB,cAAckE,MAAMD,MAAM,CAAC,CAACO,IAAMA,EAAEH,IAAI,KAAKlD,OAAO,EAAE;gBAClF,qBACE,KAACrB;oBAEC2E,WAAWxB;oBACX7B,OAAOkC,MAAMoB,KAAK,CAACzB,IAAI,IAAI;oBAC3B0B,QAAQ,CAAC,cAAc,EAAE3B,WAAWC,KAAK,CAAC,CAAC;oBAC3CsB,QAAQA;mBAJHtB;YAOX;0BACA,MAAC3C;gBAAEC,WAAU;;oBAAY;oBACoD;kCAC3E,KAACiC;wBAAKjC,WAAU;kCAAa+C,MAAMa,iBAAiB,IAAI;;oBAAuB;kCACpD,KAAC3B;wBAAKjC,WAAU;kCAAa+C,MAAME,WAAW,IAAI;;oBAAiB;;;;;AAItG;AAEA,2FAA2F,GAC3F,MAAMoB,gBAAgB;IAAEC,IAAI;QAAC;YAAEC,QAAQ;gBAAEC,QAAQ;YAAM;QAAE;QAAG;YAAED,QAAQ;gBAAEE,QAAQ;YAAK;QAAE;KAAE;AAAC;AAE1F;;;8DAG8D,GAC9D,OAAO,eAAeC,WAAW,EAC/B/E,OAAO,EACPC,QAAQ,EACR+E,eAAe,CAAC,CAAC,EAKlB;IACC,MAAMC,SAAShF,SAASgF,MAAM;IAC9B,IAAI,CAACA,QAAQ,qBAAO,KAAC7E;QAAEC,WAAU;kBAAa;;IAE9C,MAAM6E,OAAOjF,SAASkF,QAAQ;IAC9B,MAAMC,aAAaH,OAAOG,UAAU;IAEpC,mFAAmF;IACnF,MAAMC,gBAAgBrF,QAAQsF,MAAM,CAACC,OAAO;IAC5C,MAAMC,cAAcH,gBAAiBA,cAAc5B,IAAI,IAAI,oBAAqB;IAChF,MAAM8B,UAAkE,EAAE;IAC1E,IAAIE,UAAU;IACd,IAAID,aAAa;QACf,IAAI;YACF,MAAMlF,MAAM,MAAMN,QAAQO,IAAI,CAAC;gBAAEC,YAAYgF;gBAA+B/E,OAAO;gBAAGC,OAAO;gBAAKC,gBAAgB;gBAAM+E,MAAM;YAAO;YACrI,KAAK,MAAM1E,OAAOV,IAAIQ,IAAI,CAA8C;gBACtE,MAAM,EAAE6E,SAAS,EAAE,GAAG,MAAM3F,QAAQ6C,KAAK,CAAC;oBAAErC,YAAY4E;oBAAYlB,OAAO;wBAAEU,QAAQ;4BAAEE,QAAQ9D,IAAIC,EAAE;wBAAC;oBAAE;oBAAGN,gBAAgB;gBAAK;gBAChI,IAAIgF,YAAY,GAAGJ,QAAQK,IAAI,CAAC;oBAAE3E,IAAID,IAAIC,EAAE;oBAAEY,MAAMb,IAAIa,IAAI,IAAIV,OAAOH,IAAIC,EAAE;oBAAG4B,OAAO8C;gBAAU;YACnG;YACAF,UAAU,AAAC,CAAA,MAAMzF,QAAQ6C,KAAK,CAAC;gBAAErC,YAAY4E;gBAAYlB,OAAOQ;gBAAe/D,gBAAgB;YAAK,EAAC,EAAGgF,SAAS;QACnH,EAAE,OAAM,CAAC;IACX;IAEA,MAAME,WAAW,OAAOb,aAAaJ,MAAM,KAAK,WAAWI,aAAaJ,MAAM,GAAGhD;IACjF,MAAMsC,QACJ2B,aAAa,UAAUN,QAAQtD,MAAM,GACjCyC,gBACAmB,YAAYN,QAAQO,IAAI,CAAC,CAACxB,IAAMnD,OAAOmD,EAAErD,EAAE,MAAM4E,YAC/C;QAAEjB,QAAQ;YAAEE,QAAQe;QAAS;IAAE,IAC/BjE;IAER,MAAMtB,MAAM,MAAMN,QAAQO,IAAI,CAAC;QAC7BC,YAAY4E;QACZ3E,OAAO;QACPC,OAAO;QACPC,gBAAgB;QAChB+E,MAAM;QACN,GAAIxB,QAAQ;YAAEA;QAAM,IAAI,CAAC,CAAC;IAC5B;IACA,MAAMpD,OAAOR,IAAIQ,IAAI;IAErB,qBACE;;YACGyE,QAAQtD,MAAM,iBACb,MAACF;gBAAI1B,WAAU;gBAAa+B,OAAO;oBAAE2D,cAAc;gBAAG;;kCACpD,MAACpG;wBAAKqG,MAAM,GAAGd,KAAK,OAAO,CAAC;wBAAE7E,WAAW,CAAC,UAAU,EAAE,CAAC6D,QAAQ,gBAAgB,IAAI;;4BAAE;4BAC5Ee,OAAOgB,WAAW,IAAI;;;oBAE9BV,QAAQxE,GAAG,CAAC,CAAC6D,uBACZ,MAACjF;4BAECqG,MAAM,GAAGd,KAAK,eAAe,EAAEN,OAAO3D,EAAE,EAAE;4BAC1CZ,WAAW,CAAC,UAAU,EAAEwF,aAAa1E,OAAOyD,OAAO3D,EAAE,IAAI,gBAAgB,IAAI;;gCAE5E2D,OAAO/C,IAAI;gCAAC;gCAAI+C,OAAO/B,KAAK;;2BAJxB+B,OAAO3D,EAAE;oBAOjBwE,UAAU,kBACT,MAAC9F;wBAAKqG,MAAM,GAAGd,KAAK,mBAAmB,CAAC;wBAAE7E,WAAW,CAAC,UAAU,EAAEwF,aAAa,SAAS,gBAAgB,IAAI;;4BAAE;4BACjGJ;;yBAEX;;iBAEJ;YAEH3E,KAAKmB,MAAM,iBACV,KAACF;gBAAI1B,WAAU;0BACZS,KAAKC,GAAG,CAAC,CAACC,oBACT,MAACmB;wBAAoB9B,WAAU;wBAAgB+B,OAAO;4BAAEC,QAAQ;wBAAE;;0CAEhE,KAAC6D;gCAAIC,KAAK,GAAGlB,OAAOmB,QAAQ,CAAC,CAAC,EAAEpF,IAAIC,EAAE,CAAC,MAAM,CAAC;gCAAEoF,KAAKrF,IAAIqF,GAAG,IAAIrF,IAAIsF,QAAQ,IAAInF,OAAOH,IAAIC,EAAE;gCAAGsF,SAAQ;;0CACxG,KAAC9D;gCAAWvB,OAAOF,IAAIqF,GAAG;0CAAGrF,IAAIsF,QAAQ,IAAItF,IAAIC,EAAE;;;uBAHxCD,IAAIC,EAAE;+BAQvB,MAACb;gBAAEC,WAAU;;oBAAa;oBAAU6D,QAAQ,oBAAoB;oBAAO;;;0BAEzE,MAAC9D;gBAAEC,WAAU;;oBACVS,KAAKmB,MAAM;oBAAC;kCAA4B,MAACK;wBAAKjC,WAAU;;4BAAa4E,OAAOmB,QAAQ;4BAAC;;;oBACrF9F,IAAIqF,SAAS,GAAG7E,KAAKmB,MAAM,GAAG,CAAC,UAAU,EAAEnB,KAAKmB,MAAM,CAAC,IAAI,EAAE3B,IAAIqF,SAAS,CAAC,CAAC,CAAC,GAAG;oBAAG;oBAAIV,OAAOuB,YAAY,IAAI;oBAAE;oBAChHjB,QAAQtD,MAAM,GAAG,mCAAmC;;;;;AAI7D;AAEA,MAAMwE,iBAAiB,CAACC;IACtB,IAAI,CAACA,WAAWA,YAAY,GAAG,OAAO;IACtC,MAAM/D,IAAIgE,KAAKC,KAAK,CAACF,UAAU;IAC/B,MAAM5E,IAAI6E,KAAKE,KAAK,CAACH,UAAU;IAC/B,OAAO,GAAG/D,EAAE,CAAC,EAAExB,OAAOW,GAAGgF,QAAQ,CAAC,GAAG,MAAM;AAC7C;AAEA,gEAAgE,GAChE,OAAO,eAAeC,QAAQ,EAAE/G,OAAO,EAAEC,QAAQ,EAA+C;IAC9F,MAAM+G,MAAM/G,SAAS+G,GAAG;IACxB,IAAI,CAACA,KAAK,qBAAO,KAAC5G;QAAEC,WAAU;kBAAa;;IAE3C,MAAMC,MAAM,MAAMN,QAAQO,IAAI,CAAC;QAAEC,YAAYwG,IAAIvD,IAAI;QAAoBhD,OAAO;QAAGC,OAAO;QAAIC,gBAAgB;QAAM+E,MAAM;IAAa;IACvI,MAAM5E,OAAOR,IAAIQ,IAAI;IAErB,qBACE;;YACG,CAACkG,IAAIC,YAAY,iBAChB,KAAC7G;gBAAEC,WAAU;gBAAY+B,OAAO;oBAAE8E,WAAW;gBAAE;0BAAG;iBAGhD;YACHpG,KAAKmB,MAAM,iBACV,MAACkF;gBAAM9G,WAAU;;kCACf,KAAC+G;kCACC,cAAA,MAACC;;8CACC,KAACC;8CAAG;;8CACJ,KAACA;8CAAG;;8CACJ,KAACA;8CAAG;;;;;kCAGR,KAACC;kCACEzG,KAAKC,GAAG,CAAC,CAACC,oBACT,MAACqG;;kDACC,KAACG;kDAAIxG,IAAIE,KAAK,IAAIF,IAAIC,EAAE;;kDACxB,KAACuG;wCAAGnH,WAAWW,IAAIyG,MAAM,KAAK,YAAY,cAAc7F;kDAAYZ,IAAIyG,MAAM,IAAI;;kDAClF,KAACD;wCAAGnH,WAAU;kDAAaoG,eAAezF,IAAI0G,QAAQ;;;+BAH/C1G,IAAIC,EAAE;;;+BASrB,KAACb;gBAAEC,WAAU;0BAAa;;;;AAIlC"}
|
|
1
|
+
{"version":3,"sources":["../../src/next/views.tsx"],"sourcesContent":["import Link from 'next/link'\nimport type { CollectionSlug, GlobalSlug, Payload } from 'payload'\nimport type { DevSnapshot } from '../lib/snapshot'\nimport { FontSpecimen, IconSetSwitcher } from './client'\nimport { RevalidatePanel, type RevalidateInspection } from './revalidatePanel'\nimport { facesToStyles, type OptimizedFace } from './specimen'\n\n/** `/dev/icons` — every set as a switcher button (activating one re-skins the site), the active\n * set's glyphs as a grid, and any runtime misses. */\nexport async function IconsView({ payload, snapshot }: { payload: Payload; snapshot: DevSnapshot }) {\n const icons = snapshot.icons\n if (!icons?.iconSetSlug) {\n return <p className=\"pdtp-muted\">payload-icons isn't installed (or runs without its iconSet collection).</p>\n }\n\n const res = await payload.find({\n collection: icons.iconSetSlug as CollectionSlug,\n depth: 1,\n limit: 50,\n overrideAccess: true,\n pagination: false,\n })\n const sets = (\n res.docs as {\n id: string | number\n title?: string\n active?: boolean\n iconsArray?: { name?: string; icon?: { svgString?: string } | string | number | null }[]\n }[]\n ).map((doc) => ({\n id: doc.id,\n title: doc.title ?? String(doc.id),\n active: !!doc.active,\n rows: (doc.iconsArray ?? []).flatMap((row) => {\n const svg = row.icon && typeof row.icon === 'object' ? row.icon.svgString : undefined\n return row.name && svg ? [{ name: row.name, svg }] : []\n }),\n }))\n const active = sets.find((s) => s.active)\n\n return (\n <>\n <div className=\"pdtp-section\">\n <h2>Sets</h2>\n {sets.length ? (\n <IconSetSwitcher sets={sets.map(({ id, title, active: a }) => ({ id, title, active: a }))} />\n ) : (\n <p className=\"pdtp-muted\">No icon sets yet.</p>\n )}\n <p className=\"pdtp-note\">Activating a set publishes it as the single active set — the whole site re-skins on refresh.</p>\n </div>\n\n <div className=\"pdtp-section\">\n <h2>{active ? `Active set — ${active.title} (${active.rows.length})` : 'Active set'}</h2>\n {active?.rows.length ? (\n <div className=\"pdtp-icon-grid\">\n {active.rows.map((row) => (\n <figure key={row.name} className=\"pdtp-icon-cell\" style={{ margin: 0 }}>\n {/* dangerouslySetInnerHTML: svgString is sanitized by payload-icons on save */}\n <span dangerouslySetInnerHTML={{ __html: row.svg }} />\n <figcaption>{row.name}</figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <p className=\"pdtp-muted\">{active ? 'The active set has no icons.' : 'No set is active — activate one above.'}</p>\n )}\n </div>\n\n {icons.misses.length ? (\n <div className=\"pdtp-section\">\n <h2>Runtime misses</h2>\n <p className=\"pdtp-warn\">\n {icons.misses.map((m) => (\n <span key={m.name} className=\"pdtp-code\" style={{ marginRight: 8 }}>\n {m.name} ×{m.count}\n </span>\n ))}\n </p>\n <p className=\"pdtp-note\">Names requested in code that didn't resolve through the active set.</p>\n </div>\n ) : null}\n </>\n )\n}\n\nconst capitalize = (key: string): string => key.charAt(0).toUpperCase() + key.slice(1)\n\n/** `/dev/fonts` — one interactive specimen per family slot, rendered in the family's own\n * `--font-set*` variable so the page shows the actual served fonts (the host layout loads them\n * via extractFonts / DevFonts). The weight/style controls are built from the `fontOptimized`\n * docs, so only faces that really exist are offered. */\nexport async function FontsView({ payload, snapshot }: { payload: Payload; snapshot: DevSnapshot }) {\n const fonts = snapshot.fonts\n if (!fonts) return <p className=\"pdtp-muted\">payload-fonts isn't installed.</p>\n\n // Which typeface fills each slot (ids), then every served face of those typefaces.\n const slotIds: Record<string, string | number | null> = {}\n if (fonts.fontSetSlug) {\n try {\n const set = (await payload.findGlobal({ slug: fonts.fontSetSlug as GlobalSlug, depth: 0, overrideAccess: true })) as unknown as Record<\n string,\n unknown\n >\n for (const key of fonts.familyKeys) {\n const value = set[key]\n slotIds[key] = typeof value === 'string' || typeof value === 'number' ? value : null\n }\n } catch {}\n }\n\n const ids = Object.values(slotIds).filter((id): id is string | number => id !== null && id !== undefined)\n let faces: OptimizedFace[] = []\n if (fonts.fontOptimizedSlug && ids.length) {\n try {\n const res = await payload.find({\n collection: fonts.fontOptimizedSlug as CollectionSlug,\n where: { font: { in: ids } },\n depth: 0,\n limit: 200,\n overrideAccess: true,\n pagination: false,\n })\n faces = res.docs as OptimizedFace[]\n } catch {}\n }\n\n return (\n <>\n {fonts.familyKeys.map((key) => {\n const id = slotIds[key]\n const styles = id != null ? facesToStyles(faces.filter((f) => f.font === id)) : []\n return (\n <FontSpecimen\n key={key}\n familyKey={key}\n title={fonts.slots[key] ?? null}\n cssVar={`var(--font-set${capitalize(key)})`}\n styles={styles}\n />\n )\n })}\n <p className=\"pdtp-note\">\n Only weights and styles the typeface actually serves are offered (from the{' '}\n <span className=\"pdtp-code\">{fonts.fontOptimizedSlug ?? 'fontOptimized'}</span> collection); a variable face exposes stops across its\n range. Slots come from the <span className=\"pdtp-code\">{fonts.fontSetSlug ?? 'fontSet'}</span> global.\n </p>\n </>\n )\n}\n\n/** The where-clause for docs with no folder — the pattern Payload's own folder views use. */\nconst UNFILED_WHERE = { or: [{ folder: { exists: false } }, { folder: { equals: null } }] }\n\n/** `/dev/images` — every original through the on-demand transform endpoint (`?w=320`), so the\n * grid itself exercises payload-images end-to-end. When the collection has Payload folders\n * enabled, the folders render as filter chips (`?folder=<id>`, `?folder=none` for unfiled) so\n * you can click through the library the way it's organized. */\nexport async function ImagesView({\n payload,\n snapshot,\n searchParams = {},\n}: {\n payload: Payload\n snapshot: DevSnapshot\n searchParams?: Record<string, string | string[] | undefined>\n}) {\n const images = snapshot.images\n if (!images) return <p className=\"pdtp-muted\">payload-images isn't installed.</p>\n\n const base = snapshot.devRoute\n const sourceSlug = images.sourceSlug as CollectionSlug\n\n // Folder chips — only when the root folders feature is on (a collection opted in).\n const foldersConfig = payload.config.folders\n const foldersSlug = foldersConfig ? (foldersConfig.slug ?? 'payload-folders') : null\n const folders: { id: string | number; name: string; count: number }[] = []\n let unfiled = 0\n if (foldersSlug) {\n try {\n const res = await payload.find({ collection: foldersSlug as CollectionSlug, depth: 0, limit: 100, overrideAccess: true, sort: 'name' })\n for (const doc of res.docs as { id: string | number; name?: string }[]) {\n const { totalDocs } = await payload.count({ collection: sourceSlug, where: { folder: { equals: doc.id } }, overrideAccess: true })\n if (totalDocs > 0) folders.push({ id: doc.id, name: doc.name ?? String(doc.id), count: totalDocs })\n }\n unfiled = (await payload.count({ collection: sourceSlug, where: UNFILED_WHERE, overrideAccess: true })).totalDocs\n } catch {}\n }\n\n const selected = typeof searchParams.folder === 'string' ? searchParams.folder : undefined\n const where =\n selected === 'none' && folders.length\n ? UNFILED_WHERE\n : selected && folders.some((f) => String(f.id) === selected)\n ? { folder: { equals: selected } }\n : undefined\n\n const res = await payload.find({\n collection: sourceSlug,\n depth: 0,\n limit: 60,\n overrideAccess: true,\n sort: '-createdAt',\n ...(where ? { where } : {}),\n })\n const docs = res.docs as { id: string | number; filename?: string; alt?: string }[]\n\n return (\n <>\n {folders.length ? (\n <div className=\"pdtp-chips\" style={{ marginBottom: 20 }}>\n <Link href={`${base}/images`} className={`pdtp-chip ${!where ? 'pdtp-active' : ''}`}>\n All · {images.sourceCount ?? '?'}\n </Link>\n {folders.map((folder) => (\n <Link\n key={folder.id}\n href={`${base}/images?folder=${folder.id}`}\n className={`pdtp-chip ${selected === String(folder.id) ? 'pdtp-active' : ''}`}\n >\n {folder.name} · {folder.count}\n </Link>\n ))}\n {unfiled > 0 ? (\n <Link href={`${base}/images?folder=none`} className={`pdtp-chip ${selected === 'none' ? 'pdtp-active' : ''}`}>\n Unfiled · {unfiled}\n </Link>\n ) : null}\n </div>\n ) : null}\n\n {docs.length ? (\n <div className=\"pdtp-img-grid\">\n {docs.map((doc) => (\n <figure key={doc.id} className=\"pdtp-img-cell\" style={{ margin: 0 }}>\n {/* biome-ignore lint/performance/noImgElement: dev page — exercising the plugin's own transform endpoint, not next/image */}\n <img src={`${images.basePath}/${doc.id}?w=320`} alt={doc.alt ?? doc.filename ?? String(doc.id)} loading=\"lazy\" />\n <figcaption title={doc.alt}>{doc.filename ?? doc.id}</figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <p className=\"pdtp-muted\">No images{where ? ' in this folder' : ' yet'}.</p>\n )}\n <p className=\"pdtp-note\">\n {docs.length} originals rendered through <span className=\"pdtp-code\">{images.basePath}/:id?w=320</span>\n {res.totalDocs > docs.length ? ` (showing ${docs.length} of ${res.totalDocs})` : ''} · {images.variantCount ?? 0} cached variants so far\n {folders.length ? ' · folders via Payload folders' : ''}\n </p>\n </>\n )\n}\n\n/** `/dev/revalidate` — the dependency map, rendered by the tabbed client panel (Explore /\n * Map / Reads / Events). All data comes live off payload-revalidate's inspection slot,\n * read here (server side, structural — no import) and passed down as plain props. */\nexport function RevalidateView({ snapshot }: { snapshot: DevSnapshot }) {\n const meta = snapshot.revalidate\n const inspect = (globalThis as Record<symbol, unknown>)[Symbol.for('pro-laico.payload-revalidate.inspect')] as\n | (() => RevalidateInspection)\n | undefined\n const data = inspect?.()\n if (!meta || !data) return <p className=\"pdtp-muted\">payload-revalidate isn't active in this process.</p>\n\n return <RevalidatePanel data={data} endpointPath={meta.endpointPath} />\n}\n\nconst formatDuration = (seconds?: number | null): string => {\n if (!seconds && seconds !== 0) return '—'\n const m = Math.floor(seconds / 60)\n const s = Math.round(seconds % 60)\n return `${m}:${String(s).padStart(2, '0')}`\n}\n\n/** `/dev/mux` — the videos with their persisted ingest status. */\nexport async function MuxView({ payload, snapshot }: { payload: Payload; snapshot: DevSnapshot }) {\n const mux = snapshot.mux\n if (!mux) return <p className=\"pdtp-muted\">payload-mux isn't installed.</p>\n\n const res = await payload.find({ collection: mux.slug as CollectionSlug, depth: 0, limit: 50, overrideAccess: true, sort: '-createdAt' })\n const docs = res.docs as { id: string | number; title?: string; status?: string; duration?: number }[]\n\n return (\n <>\n {!mux.credentialed ? (\n <p className=\"pdtp-warn\" style={{ marginTop: 0 }}>\n MUX_TOKEN_ID / MUX_TOKEN_SECRET are not set — uploads and ingest will fail.\n </p>\n ) : null}\n {docs.length ? (\n <table className=\"pdtp-table\">\n <thead>\n <tr>\n <th>title</th>\n <th>status</th>\n <th>duration</th>\n </tr>\n </thead>\n <tbody>\n {docs.map((doc) => (\n <tr key={doc.id}>\n <td>{doc.title ?? doc.id}</td>\n <td className={doc.status === 'errored' ? 'pdtp-warn' : undefined}>{doc.status ?? '—'}</td>\n <td className=\"pdtp-mono\">{formatDuration(doc.duration)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n ) : (\n <p className=\"pdtp-muted\">No videos yet.</p>\n )}\n </>\n )\n}\n"],"names":["Link","FontSpecimen","IconSetSwitcher","RevalidatePanel","facesToStyles","IconsView","payload","snapshot","icons","iconSetSlug","p","className","res","find","collection","depth","limit","overrideAccess","pagination","sets","docs","map","doc","id","title","String","active","rows","iconsArray","flatMap","row","svg","icon","svgString","undefined","name","s","div","h2","length","a","figure","style","margin","span","dangerouslySetInnerHTML","__html","figcaption","misses","m","marginRight","count","capitalize","key","charAt","toUpperCase","slice","FontsView","fonts","slotIds","fontSetSlug","set","findGlobal","slug","familyKeys","value","ids","Object","values","filter","faces","fontOptimizedSlug","where","font","in","styles","f","familyKey","slots","cssVar","UNFILED_WHERE","or","folder","exists","equals","ImagesView","searchParams","images","base","devRoute","sourceSlug","foldersConfig","config","folders","foldersSlug","unfiled","sort","totalDocs","push","selected","some","marginBottom","href","sourceCount","img","src","basePath","alt","filename","loading","variantCount","RevalidateView","meta","revalidate","inspect","globalThis","Symbol","for","data","endpointPath","formatDuration","seconds","Math","floor","round","padStart","MuxView","mux","credentialed","marginTop","table","thead","tr","th","tbody","td","status","duration"],"mappings":"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"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type { DevToolsPluginOptions } from './options';
|
|
|
7
7
|
* with per-plugin panels (seed status, icon misses, font slots, mux readiness), and doc counts
|
|
8
8
|
* for every collection. Browsers are redirected to the dev pages (`devRoute`).
|
|
9
9
|
* - `GET /api/dev/stage` — sets/clears the test-stage cookie via URL, for scripted staging.
|
|
10
|
+
* - `GET /api/dev/draft` — reports/toggles Next.js draft mode (the toolbar's Draft mode switch).
|
|
10
11
|
* - `POST /api/dev/icons/activate` — switch the active icon set (the `/dev/icons` switcher).
|
|
11
12
|
*
|
|
12
13
|
* Pairs with two frontend pieces from `@pro-laico/payload-dev-tools/toolbar` and `/next`:
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;AAM7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM,CAkB1E;AAED,eAAe,cAAc,CAAA"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createActivateIconSetEndpoint } from "./endpoints/activateIconSet.js";
|
|
2
2
|
import { createDevEndpoint } from "./endpoints/dev.js";
|
|
3
|
+
import { createDraftEndpoint } from "./endpoints/draft.js";
|
|
3
4
|
import { createStageEndpoint } from "./endpoints/stage.js";
|
|
4
5
|
import { stashConfig } from "./lib/getPayloadClient.js";
|
|
5
6
|
/**
|
|
@@ -9,6 +10,7 @@ import { stashConfig } from "./lib/getPayloadClient.js";
|
|
|
9
10
|
* with per-plugin panels (seed status, icon misses, font slots, mux readiness), and doc counts
|
|
10
11
|
* for every collection. Browsers are redirected to the dev pages (`devRoute`).
|
|
11
12
|
* - `GET /api/dev/stage` — sets/clears the test-stage cookie via URL, for scripted staging.
|
|
13
|
+
* - `GET /api/dev/draft` — reports/toggles Next.js draft mode (the toolbar's Draft mode switch).
|
|
12
14
|
* - `POST /api/dev/icons/activate` — switch the active icon set (the `/dev/icons` switcher).
|
|
13
15
|
*
|
|
14
16
|
* Pairs with two frontend pieces from `@pro-laico/payload-dev-tools/toolbar` and `/next`:
|
|
@@ -36,6 +38,7 @@ import { stashConfig } from "./lib/getPayloadClient.js";
|
|
|
36
38
|
enabled: options.enabled,
|
|
37
39
|
devRoute: options.devRoute ?? '/dev'
|
|
38
40
|
}),
|
|
41
|
+
createDraftEndpoint(options.enabled),
|
|
39
42
|
createActivateIconSetEndpoint(options.enabled)
|
|
40
43
|
],
|
|
41
44
|
onInit: async (payload)=>{
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Plugin } from 'payload'\nimport { createActivateIconSetEndpoint } from './endpoints/activateIconSet'\nimport { createDevEndpoint } from './endpoints/dev'\nimport { createStageEndpoint } from './endpoints/stage'\nimport { stashConfig } from './lib/getPayloadClient'\nimport type { DevToolsPluginOptions } from './options'\n\n/**\n * The dev-tools plugin. Registers dev-only endpoints (all 404 outside dev):\n *\n * - `GET /api/dev` — the machine-readable app snapshot: environment, detected @pro-laico plugins\n * with per-plugin panels (seed status, icon misses, font slots, mux readiness), and doc counts\n * for every collection. Browsers are redirected to the dev pages (`devRoute`).\n * - `GET /api/dev/stage` — sets/clears the test-stage cookie via URL, for scripted staging.\n * - `POST /api/dev/icons/activate` — switch the active icon set (the `/dev/icons` switcher).\n *\n * Pairs with two frontend pieces from `@pro-laico/payload-dev-tools/toolbar` and `/next`:\n * the floating `<DevToolbar>` (one line in your layout) and `createDevPage` (one catch-all file\n * that serves the `/dev` pages). Both feed themselves — no other wiring.\n *\n * plugins: [devToolsPlugin()]\n */\nexport function devToolsPlugin(options: DevToolsPluginOptions = {}): Plugin {\n return (config: Config): Config => ({\n ...config,\n custom: { ...config.custom, payloadDevTools: { options, devRoute: options.devRoute ?? '/dev' } },\n endpoints: [\n ...(config.endpoints ?? []),\n createDevEndpoint({ enabled: options.enabled, devRoute: options.devRoute ?? '/dev' }),\n createStageEndpoint({ enabled: options.enabled, devRoute: options.devRoute ?? '/dev' }),\n createActivateIconSetEndpoint(options.enabled),\n ],\n onInit: async (payload) => {\n await config.onInit?.(payload)\n // Remember the app's config so the dev pages resolve it from globalThis — no\n // `@payload-config` alias (and thus no transpilePackages) required once Payload has booted.\n stashConfig(payload.config)\n },\n })\n}\n\nexport default devToolsPlugin\n"],"names":["createActivateIconSetEndpoint","createDevEndpoint","createStageEndpoint","stashConfig","devToolsPlugin","options","config","custom","payloadDevTools","devRoute","endpoints","enabled","onInit","payload"],"mappings":"AACA,SAASA,6BAA6B,QAAQ,iCAA6B;AAC3E,SAASC,iBAAiB,QAAQ,qBAAiB;AACnD,SAASC,mBAAmB,QAAQ,uBAAmB;AACvD,SAASC,WAAW,QAAQ,4BAAwB;AAGpD
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Plugin } from 'payload'\nimport { createActivateIconSetEndpoint } from './endpoints/activateIconSet'\nimport { createDevEndpoint } from './endpoints/dev'\nimport { createDraftEndpoint } from './endpoints/draft'\nimport { createStageEndpoint } from './endpoints/stage'\nimport { stashConfig } from './lib/getPayloadClient'\nimport type { DevToolsPluginOptions } from './options'\n\n/**\n * The dev-tools plugin. Registers dev-only endpoints (all 404 outside dev):\n *\n * - `GET /api/dev` — the machine-readable app snapshot: environment, detected @pro-laico plugins\n * with per-plugin panels (seed status, icon misses, font slots, mux readiness), and doc counts\n * for every collection. Browsers are redirected to the dev pages (`devRoute`).\n * - `GET /api/dev/stage` — sets/clears the test-stage cookie via URL, for scripted staging.\n * - `GET /api/dev/draft` — reports/toggles Next.js draft mode (the toolbar's Draft mode switch).\n * - `POST /api/dev/icons/activate` — switch the active icon set (the `/dev/icons` switcher).\n *\n * Pairs with two frontend pieces from `@pro-laico/payload-dev-tools/toolbar` and `/next`:\n * the floating `<DevToolbar>` (one line in your layout) and `createDevPage` (one catch-all file\n * that serves the `/dev` pages). Both feed themselves — no other wiring.\n *\n * plugins: [devToolsPlugin()]\n */\nexport function devToolsPlugin(options: DevToolsPluginOptions = {}): Plugin {\n return (config: Config): Config => ({\n ...config,\n custom: { ...config.custom, payloadDevTools: { options, devRoute: options.devRoute ?? '/dev' } },\n endpoints: [\n ...(config.endpoints ?? []),\n createDevEndpoint({ enabled: options.enabled, devRoute: options.devRoute ?? '/dev' }),\n createStageEndpoint({ enabled: options.enabled, devRoute: options.devRoute ?? '/dev' }),\n createDraftEndpoint(options.enabled),\n createActivateIconSetEndpoint(options.enabled),\n ],\n onInit: async (payload) => {\n await config.onInit?.(payload)\n // Remember the app's config so the dev pages resolve it from globalThis — no\n // `@payload-config` alias (and thus no transpilePackages) required once Payload has booted.\n stashConfig(payload.config)\n },\n })\n}\n\nexport default devToolsPlugin\n"],"names":["createActivateIconSetEndpoint","createDevEndpoint","createDraftEndpoint","createStageEndpoint","stashConfig","devToolsPlugin","options","config","custom","payloadDevTools","devRoute","endpoints","enabled","onInit","payload"],"mappings":"AACA,SAASA,6BAA6B,QAAQ,iCAA6B;AAC3E,SAASC,iBAAiB,QAAQ,qBAAiB;AACnD,SAASC,mBAAmB,QAAQ,uBAAmB;AACvD,SAASC,mBAAmB,QAAQ,uBAAmB;AACvD,SAASC,WAAW,QAAQ,4BAAwB;AAGpD;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASC,eAAeC,UAAiC,CAAC,CAAC;IAChE,OAAO,CAACC,SAA4B,CAAA;YAClC,GAAGA,MAAM;YACTC,QAAQ;gBAAE,GAAGD,OAAOC,MAAM;gBAAEC,iBAAiB;oBAAEH;oBAASI,UAAUJ,QAAQI,QAAQ,IAAI;gBAAO;YAAE;YAC/FC,WAAW;mBACLJ,OAAOI,SAAS,IAAI,EAAE;gBAC1BV,kBAAkB;oBAAEW,SAASN,QAAQM,OAAO;oBAAEF,UAAUJ,QAAQI,QAAQ,IAAI;gBAAO;gBACnFP,oBAAoB;oBAAES,SAASN,QAAQM,OAAO;oBAAEF,UAAUJ,QAAQI,QAAQ,IAAI;gBAAO;gBACrFR,oBAAoBI,QAAQM,OAAO;gBACnCZ,8BAA8BM,QAAQM,OAAO;aAC9C;YACDC,QAAQ,OAAOC;gBACb,MAAMP,OAAOM,MAAM,GAAGC;gBACtB,6EAA6E;gBAC7E,4FAA4F;gBAC5FV,YAAYU,QAAQP,MAAM;YAC5B;QACF,CAAA;AACF;AAEA,eAAeF,eAAc"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pro-laico/payload-dev-tools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A utility to help you build Payload CMS projects faster: a floating dev toolbar, /dev pages inside your app, and a machine-readable app snapshot for AI agents.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -65,6 +65,10 @@
|
|
|
65
65
|
"engines": {
|
|
66
66
|
"node": ">=18"
|
|
67
67
|
},
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"@dagrejs/dagre": "3.0.0",
|
|
70
|
+
"@xyflow/react": "12.11.1"
|
|
71
|
+
},
|
|
68
72
|
"scripts": {
|
|
69
73
|
"build": "pnpm clean && pnpm build:types && pnpm build:swc",
|
|
70
74
|
"clean": "rimraf dist tsconfig.tsbuildinfo",
|