@package-broker/ui 2.0.0-rc.3 → 2.0.0-rc.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/dist/.tsbuildinfo +1 -1
- package/dist/api-types.d.ts +8185 -2807
- package/dist/api-types.d.ts.map +1 -1
- package/dist/api.d.ts +1 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +10 -0
- package/dist/api.js.map +1 -1
- package/dist/app-path.d.ts +2 -0
- package/dist/app-path.d.ts.map +1 -0
- package/dist/app-path.js +2 -0
- package/dist/app-path.js.map +1 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +16 -3
- package/dist/app.js.map +1 -1
- package/dist/assets/access.62e9484517a0.js +1 -0
- package/dist/assets/app.45b156168495.css +2 -0
- package/dist/assets/{app.e8434f3343de.js → app.c064670cdc0d.js} +5 -5
- package/dist/assets/audit.b7c40b9dc998.js +1 -0
- package/dist/assets/{chunk.3704953b4a66.js → chunk.28a4d8aab337.js} +1 -1
- package/dist/assets/chunk.3fcd6998795a.js +1 -0
- package/dist/assets/chunk.51497edc7697.js +4 -0
- package/dist/assets/chunk.56d473a1587d.js +1 -0
- package/dist/assets/chunk.675b635d9462.js +1 -0
- package/dist/assets/{chunk.bb25fc845269.js → chunk.6ea6bdcaa465.js} +1 -1
- package/dist/assets/{chunk.f922af39a279.js → chunk.741aec8d1ff9.js} +1 -1
- package/dist/assets/chunk.815f9a91c741.js +1 -0
- package/dist/assets/chunk.8442124f6802.js +1 -0
- package/dist/assets/{chunk.862544cf5835.js → chunk.965b76812604.js} +1 -1
- package/dist/assets/{chunk.bf48b04e6a00.js → chunk.a6d755a9789f.js} +1 -1
- package/dist/assets/chunk.d18497920e4d.js +1 -0
- package/dist/assets/{chunk.ce96495b8b55.js → chunk.d813fefb410d.js} +1 -1
- package/dist/assets/chunk.e3b0c44298fc.js +0 -0
- package/dist/assets/{chunk.7cb6f6b4daaa.js → chunk.f54ea1378c8c.js} +1 -1
- package/dist/assets/chunk.fd375c54b526.js +1 -0
- package/dist/assets/import.e7a1e5834631.js +1 -0
- package/dist/assets/index.html +9 -6
- package/dist/assets/manifest.json +66 -38
- package/dist/assets/notifications.19225fe12044.js +1 -0
- package/dist/assets/npm-login.e059678af13d.js +1 -0
- package/dist/assets/packages.ab5ab25b1c75.js +2 -0
- package/dist/assets/projects.927fe18c785c.js +1 -0
- package/dist/assets/setup.8e977608d413.js +1 -0
- package/dist/assets/setup.html +2 -2
- package/dist/assets/sources.ae50f239f80f.js +1 -0
- package/dist/assets/tokens.6b86d8d97e07.js +4 -0
- package/dist/auth.d.ts +22 -3
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +129 -19
- package/dist/auth.js.map +1 -1
- package/dist/components/ui/status-badge.d.ts +5 -0
- package/dist/components/ui/status-badge.d.ts.map +1 -1
- package/dist/components/ui/status-badge.js +10 -0
- package/dist/components/ui/status-badge.js.map +1 -1
- package/dist/package-limits.d.ts +3 -0
- package/dist/package-limits.d.ts.map +1 -0
- package/dist/package-limits.js +3 -0
- package/dist/package-limits.js.map +1 -0
- package/dist/page-hash.d.ts +1 -1
- package/dist/page-hash.d.ts.map +1 -1
- package/dist/page-hash.js.map +1 -1
- package/dist/pages/access/grant-form.d.ts.map +1 -1
- package/dist/pages/access/grant-form.js +1 -1
- package/dist/pages/access/grant-form.js.map +1 -1
- package/dist/pages/audit.d.ts.map +1 -1
- package/dist/pages/notification-actions.d.ts +41 -0
- package/dist/pages/notification-actions.d.ts.map +1 -0
- package/dist/pages/notification-actions.js +187 -0
- package/dist/pages/notification-actions.js.map +1 -0
- package/dist/pages/notification-draft.d.ts +13 -0
- package/dist/pages/notification-draft.d.ts.map +1 -0
- package/dist/pages/notification-draft.js +75 -0
- package/dist/pages/notification-draft.js.map +1 -0
- package/dist/pages/notification-form.d.ts +35 -0
- package/dist/pages/notification-form.d.ts.map +1 -0
- package/dist/pages/notification-form.js +167 -0
- package/dist/pages/notification-form.js.map +1 -0
- package/dist/pages/notifications-controller.d.ts +41 -0
- package/dist/pages/notifications-controller.d.ts.map +1 -0
- package/dist/pages/notifications-controller.js +184 -0
- package/dist/pages/notifications-controller.js.map +1 -0
- package/dist/pages/notifications.d.ts +10 -0
- package/dist/pages/notifications.d.ts.map +1 -0
- package/dist/pages/notifications.js +301 -0
- package/dist/pages/notifications.js.map +1 -0
- package/dist/pages/npm-login.d.ts +2 -0
- package/dist/pages/npm-login.d.ts.map +1 -0
- package/dist/pages/npm-login.js +62 -0
- package/dist/pages/npm-login.js.map +1 -0
- package/dist/pages/packages/npm-workflow.d.ts +31 -0
- package/dist/pages/packages/npm-workflow.d.ts.map +1 -0
- package/dist/pages/packages/npm-workflow.js +381 -0
- package/dist/pages/packages/npm-workflow.js.map +1 -0
- package/dist/pages/packages/package-detail.d.ts +9 -0
- package/dist/pages/packages/package-detail.d.ts.map +1 -0
- package/dist/pages/packages/package-detail.js +242 -0
- package/dist/pages/packages/package-detail.js.map +1 -0
- package/dist/pages/packages/source-actions.d.ts +2 -1
- package/dist/pages/packages/source-actions.d.ts.map +1 -1
- package/dist/pages/packages/source-actions.js +8 -1
- package/dist/pages/packages/source-actions.js.map +1 -1
- package/dist/pages/packages.d.ts +15 -4
- package/dist/pages/packages.d.ts.map +1 -1
- package/dist/pages/packages.js +136 -19
- package/dist/pages/packages.js.map +1 -1
- package/dist/pages/projects/project-form.js +1 -1
- package/dist/pages/projects/project-form.js.map +1 -1
- package/dist/pages/projects.d.ts.map +1 -1
- package/dist/pages/projects.js +1 -1
- package/dist/pages/projects.js.map +1 -1
- package/dist/pages/sources/source-form.d.ts +3 -2
- package/dist/pages/sources/source-form.d.ts.map +1 -1
- package/dist/pages/sources/source-form.js +22 -12
- package/dist/pages/sources/source-form.js.map +1 -1
- package/dist/pages/sources.d.ts +9 -3
- package/dist/pages/sources.d.ts.map +1 -1
- package/dist/pages/sources.js +55 -11
- package/dist/pages/sources.js.map +1 -1
- package/dist/pages/tokens/issue-token-form.js +1 -1
- package/dist/pages/tokens/issue-token-form.js.map +1 -1
- package/dist/pages/tokens/principal-form.d.ts.map +1 -1
- package/dist/pages/tokens/principal-form.js +4 -0
- package/dist/pages/tokens/principal-form.js.map +1 -1
- package/dist/pages/tokens/trusted-publishers-controller.d.ts +42 -0
- package/dist/pages/tokens/trusted-publishers-controller.d.ts.map +1 -0
- package/dist/pages/tokens/trusted-publishers-controller.js +202 -0
- package/dist/pages/tokens/trusted-publishers-controller.js.map +1 -0
- package/dist/pages/tokens/trusted-publishers.d.ts +6 -0
- package/dist/pages/tokens/trusted-publishers.d.ts.map +1 -0
- package/dist/pages/tokens/trusted-publishers.js +116 -0
- package/dist/pages/tokens/trusted-publishers.js.map +1 -0
- package/dist/pages/tokens.d.ts +53 -0
- package/dist/pages/tokens.d.ts.map +1 -1
- package/dist/pages/tokens.js +9 -2
- package/dist/pages/tokens.js.map +1 -1
- package/dist/setup.d.ts +3 -2
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +66 -9
- package/dist/setup.js.map +1 -1
- package/package.json +3 -3
- package/dist/assets/access.6859f43998ca.js +0 -1
- package/dist/assets/app.f15f8f21f88b.css +0 -2
- package/dist/assets/audit.576009342714.js +0 -1
- package/dist/assets/chunk.297a2d571f9c.js +0 -4
- package/dist/assets/chunk.6e23a75a1324.js +0 -1
- package/dist/assets/chunk.855a50f45830.js +0 -1
- package/dist/assets/chunk.976a2ff4338e.js +0 -1
- package/dist/assets/import.e2a1e35fcb8d.js +0 -1
- package/dist/assets/packages.a8726e5144de.js +0 -1
- package/dist/assets/projects.711deb86b7c9.js +0 -1
- package/dist/assets/setup.dfed30ecfbad.js +0 -1
- package/dist/assets/sources.d0ba0048bd96.js +0 -1
- package/dist/assets/tokens.f48d235e8d25.js +0 -4
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
|
|
3
|
+
import { useServices } from '../auth.js';
|
|
4
|
+
import { Button } from '../components/ui/button.js';
|
|
5
|
+
import { ConfirmAction } from '../components/ui/confirm-action.js';
|
|
6
|
+
import { ListState } from '../components/ui/list-state.js';
|
|
7
|
+
import { RowActions } from '../components/ui/row-actions.js';
|
|
8
|
+
import { Select } from '../components/ui/select.js';
|
|
9
|
+
import { StatusBadge } from '../components/ui/status-badge.js';
|
|
10
|
+
import { DataTable } from '../components/ui/table.js';
|
|
11
|
+
import { Time } from '../components/ui/time.js';
|
|
12
|
+
import { createEndpoint, deleteEndpoint, deliveryOutcome, eventLabel, setEnabled, stateSentence, updateEndpoint, } from './notification-actions.js';
|
|
13
|
+
import { takeNotificationDraft } from './notification-draft.js';
|
|
14
|
+
import { NotificationForm } from './notification-form.js';
|
|
15
|
+
import { createNotificationsController, } from './notifications-controller.js';
|
|
16
|
+
const MAX_ENDPOINTS = 20;
|
|
17
|
+
const FILTERS = [
|
|
18
|
+
{ value: 'all', label: 'All deliveries' },
|
|
19
|
+
{ value: 'pending', label: 'Waiting' },
|
|
20
|
+
{ value: 'sending', label: 'Sending' },
|
|
21
|
+
{ value: 'delivered', label: 'Delivered' },
|
|
22
|
+
{ value: 'failed', label: 'Failed' },
|
|
23
|
+
{ value: 'cancelled', label: 'Cancelled' },
|
|
24
|
+
];
|
|
25
|
+
function useProjectSlug() {
|
|
26
|
+
const hash = useSyncExternalStore((listener) => {
|
|
27
|
+
window.addEventListener('hashchange', listener);
|
|
28
|
+
return () => window.removeEventListener('hashchange', listener);
|
|
29
|
+
}, () => window.location.hash, () => '');
|
|
30
|
+
const query = new URLSearchParams(hash.split('?')[1] ?? '');
|
|
31
|
+
const project = query.get('project');
|
|
32
|
+
return project !== null && /^[A-Za-z0-9._-]{1,64}$/.test(project) ? project : null;
|
|
33
|
+
}
|
|
34
|
+
export function NotificationsView(props) {
|
|
35
|
+
const { services, controller, project } = props;
|
|
36
|
+
const state = useSyncExternalStore(controller.subscribe, controller.snapshot, controller.snapshot);
|
|
37
|
+
const [form, setForm] = useState(null);
|
|
38
|
+
const restoredDraft = useRef(null);
|
|
39
|
+
const [restored, setRestored] = useState(null);
|
|
40
|
+
const [message, setMessage] = useState(null);
|
|
41
|
+
const [failure, setFailure] = useState(null);
|
|
42
|
+
const [stale, setStale] = useState(false);
|
|
43
|
+
const [busy, setBusy] = useState(null);
|
|
44
|
+
const [deleting, setDeleting] = useState(null);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
setForm(null);
|
|
47
|
+
setRestored(null);
|
|
48
|
+
setBusy(null);
|
|
49
|
+
setDeleting(null);
|
|
50
|
+
setMessage(null);
|
|
51
|
+
setFailure(null);
|
|
52
|
+
setStale(false);
|
|
53
|
+
void controller.load(project);
|
|
54
|
+
const isCurrent = controller.mutationScope();
|
|
55
|
+
if (restoredDraft.current?.project !== project)
|
|
56
|
+
restoredDraft.current = {
|
|
57
|
+
project,
|
|
58
|
+
value: project === null ? null : takeNotificationDraft(project),
|
|
59
|
+
};
|
|
60
|
+
const draft = restoredDraft.current.value;
|
|
61
|
+
if (draft !== null) {
|
|
62
|
+
const restore = (endpoint) => {
|
|
63
|
+
if (!isCurrent())
|
|
64
|
+
return;
|
|
65
|
+
setForm(endpoint);
|
|
66
|
+
setRestored(draft.options);
|
|
67
|
+
setMessage('Draft restored. Review it and enter the delivery settings again before saving.');
|
|
68
|
+
if (endpoint !== 'new' && endpoint.revision !== draft.endpoint?.revision) {
|
|
69
|
+
setStale(true);
|
|
70
|
+
setFailure('This endpoint changed while you were editing. Reload the latest settings before saving.');
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
if (draft.endpoint === null)
|
|
74
|
+
restore('new');
|
|
75
|
+
else
|
|
76
|
+
void services.client
|
|
77
|
+
.request('get', '/_pb/projects/{project}/notifications/{id}', {
|
|
78
|
+
params: { project: draft.project, id: draft.endpoint.id },
|
|
79
|
+
})
|
|
80
|
+
.then((result) => {
|
|
81
|
+
if (result.ok)
|
|
82
|
+
restore(result.data);
|
|
83
|
+
else if (isCurrent())
|
|
84
|
+
setFailure('The draft endpoint could not be loaded. Reload the list.');
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return () => controller.dispose();
|
|
88
|
+
}, [controller, project, services]);
|
|
89
|
+
const projectLabel = props.projectName ?? project ?? '';
|
|
90
|
+
const settle = (id, outcome) => {
|
|
91
|
+
if (outcome.ok) {
|
|
92
|
+
if (outcome.endpoint !== null)
|
|
93
|
+
controller.replace(outcome.endpoint.id, outcome.endpoint);
|
|
94
|
+
else if (id !== null)
|
|
95
|
+
controller.replace(id, null);
|
|
96
|
+
setMessage(outcome.message);
|
|
97
|
+
setFailure(null);
|
|
98
|
+
setStale(false);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
setMessage(null);
|
|
102
|
+
setFailure(outcome.message);
|
|
103
|
+
setStale(outcome.stale);
|
|
104
|
+
}
|
|
105
|
+
return outcome;
|
|
106
|
+
};
|
|
107
|
+
const act = async (endpoint, run) => {
|
|
108
|
+
if (busy !== null || project === null)
|
|
109
|
+
return;
|
|
110
|
+
const isCurrent = controller.mutationScope();
|
|
111
|
+
setBusy(endpoint.id);
|
|
112
|
+
const outcome = await run(isCurrent);
|
|
113
|
+
if (!isCurrent())
|
|
114
|
+
return;
|
|
115
|
+
settle(endpoint.id, outcome);
|
|
116
|
+
setBusy(null);
|
|
117
|
+
};
|
|
118
|
+
const selected = state.items.find((item) => item.id === state.selected) ?? null;
|
|
119
|
+
if (project === null)
|
|
120
|
+
return (_jsxs("section", { className: "space-y-4", children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Notifications" }), _jsx(ListState, { kind: "placeholder", title: "Choose a project to manage its notifications.", children: _jsx("p", { children: "Notification endpoints belong to one project. Pick it in the Scope menu." }) })] }));
|
|
121
|
+
return (_jsxs("section", { className: "space-y-4", children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Notifications" }), _jsx("p", { children: `Project ${projectLabel} · Send a signed request to your own HTTPS receiver when a package in this project is published, released, removed, deprecated or re-tagged. Delivery is retried for up to 24 hours and is not guaranteed.` }), _jsx("div", { role: "status", "aria-live": "polite", children: message }), failure === null ? null : (_jsxs("div", { role: "alert", className: "space-y-2 text-red-700", children: [_jsx("p", { children: failure }), stale ? (_jsx(Button, { type: "button", variant: "outline", className: "min-h-11", onClick: () => {
|
|
122
|
+
setStale(false);
|
|
123
|
+
setFailure(null);
|
|
124
|
+
setForm(null);
|
|
125
|
+
void controller.load();
|
|
126
|
+
}, children: "Reload latest settings" })) : null] })), state.blocked === 'denied' ? (_jsx(ListState, { kind: "error", title: "You cannot manage notifications in this project.", children: _jsx("p", { children: "Changing project settings in a signed-in session is required." }) })) : state.blocked === 'unavailable' ? (_jsx(ListState, { kind: "placeholder", title: "Notifications are not available.", children: _jsx("p", { children: "This broker has notifications turned off, or the project is archived or not visible to you." }) })) : state.blocked === 'error' ? (_jsx(ListState, { kind: "error", title: "Notification endpoints could not be loaded. Try again.", children: _jsx(Button, { type: "button", className: "min-h-11", onClick: () => void controller.load(), children: "Try again" }) })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap gap-2", children: [form === null ? (_jsx(Button, { type: "button", className: "min-h-11 w-full sm:w-auto", disabled: state.loading || state.items.length >= MAX_ENDPOINTS, "aria-describedby": state.items.length >= MAX_ENDPOINTS ? 'notification-limit' : undefined, onClick: () => {
|
|
127
|
+
setMessage(null);
|
|
128
|
+
setFailure(null);
|
|
129
|
+
setRestored(null);
|
|
130
|
+
setForm('new');
|
|
131
|
+
}, children: "Add endpoint" })) : null, _jsx(Button, { type: "button", variant: "outline", className: "min-h-11 w-full sm:w-auto", disabled: state.loading, onClick: () => void controller.load(), children: "Reload" })] }), state.items.length >= MAX_ENDPOINTS ? (_jsx("p", { id: "notification-limit", children: "A project can have at most 20 endpoints." })) : null, form === null ? null : (_jsx(NotificationForm, { projectName: projectLabel, endpoint: form === 'new' ? null : form, disabled: stale, ...(restored === null ? {} : { restoredOptions: restored, requireSecret: true }), onCancel: () => setForm(null), onSubmit: async (change) => {
|
|
132
|
+
const isCurrent = controller.mutationScope();
|
|
133
|
+
const outcome = form === 'new'
|
|
134
|
+
? await createEndpoint(services, project, change.options, change.secret, isCurrent)
|
|
135
|
+
: await updateEndpoint(services, project, form, change, isCurrent);
|
|
136
|
+
if (!isCurrent())
|
|
137
|
+
return outcome;
|
|
138
|
+
settle(null, outcome);
|
|
139
|
+
if (outcome.ok)
|
|
140
|
+
setForm(null);
|
|
141
|
+
return outcome;
|
|
142
|
+
} }, `${project}/${form === 'new' ? 'new' : form.id}`)), state.loading ? (_jsx(ListState, { kind: "loading", title: "Loading notification endpoints\u2026" })) : state.items.length === 0 ? (_jsx(ListState, { kind: "empty", title: state.hasPrevious
|
|
143
|
+
? 'No endpoints on this page.'
|
|
144
|
+
: 'No notification endpoints yet. Add one to tell another system about package changes.' })) : (_jsx(DataTable, { label: `Notification endpoints in ${projectLabel}`, items: state.items, ...(state.selected === null ? {} : { selectedId: state.selected }), columns: [
|
|
145
|
+
{
|
|
146
|
+
key: 'name',
|
|
147
|
+
label: 'Endpoint',
|
|
148
|
+
value: (item) => item.name,
|
|
149
|
+
render: (item) => (_jsxs("div", { className: "break-words", children: [_jsx("strong", { children: item.name }), _jsxs("p", { className: "text-sm text-neutral-600", children: [item.method, " \u00B7 signed", item.headersConfigured ? ' · custom headers' : '', item.templateConfigured ? ' · body template' : ''] })] })),
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
key: 'events',
|
|
153
|
+
label: 'Events and packages',
|
|
154
|
+
value: (item) => item.events.length,
|
|
155
|
+
render: (item) => (_jsxs("div", { className: "break-words", children: [_jsx("p", { children: item.events.map(eventLabel).join(', ') }), _jsx("p", { className: "font-mono text-sm", children: item.packagePattern })] })),
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
key: 'state',
|
|
159
|
+
label: 'Status',
|
|
160
|
+
value: (item) => item.state,
|
|
161
|
+
render: (item) => (_jsxs("div", { className: "space-y-1", children: [_jsx(StatusBadge, { status: item.state }), _jsx("p", { className: "text-sm", children: stateSentence(item) }), item.failureStreak > 0 ? (_jsx("p", { className: "text-sm", children: `${item.failureStreak} failed ${item.failureStreak === 1 ? 'delivery' : 'deliveries'} in a row.` })) : null] })),
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
key: 'updated',
|
|
165
|
+
label: 'Changed',
|
|
166
|
+
value: (item) => item.updatedAt,
|
|
167
|
+
priority: 2,
|
|
168
|
+
render: (item) => _jsx(Time, { value: item.updatedAt }),
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
key: 'actions',
|
|
172
|
+
label: 'Actions',
|
|
173
|
+
value: () => '',
|
|
174
|
+
sortable: false,
|
|
175
|
+
render: (item) => (_jsx(RowActions, { entityLabel: item.name, actions: [
|
|
176
|
+
{
|
|
177
|
+
id: 'history',
|
|
178
|
+
label: 'Delivery history',
|
|
179
|
+
onSelect: () => void controller.select(item.id),
|
|
180
|
+
},
|
|
181
|
+
], overflow: [
|
|
182
|
+
{
|
|
183
|
+
id: 'edit',
|
|
184
|
+
label: 'Edit',
|
|
185
|
+
disabled: busy !== null || stale,
|
|
186
|
+
onSelect: () => {
|
|
187
|
+
setMessage(null);
|
|
188
|
+
setFailure(null);
|
|
189
|
+
setRestored(null);
|
|
190
|
+
setForm(item);
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
item.state === 'enabled'
|
|
194
|
+
? {
|
|
195
|
+
id: 'disable',
|
|
196
|
+
label: 'Disable',
|
|
197
|
+
pending: busy === item.id,
|
|
198
|
+
disabled: stale,
|
|
199
|
+
onSelect: () => void act(item, (isCurrent) => setEnabled(services, project, item, false, isCurrent)),
|
|
200
|
+
}
|
|
201
|
+
: {
|
|
202
|
+
id: 'enable',
|
|
203
|
+
label: 'Enable',
|
|
204
|
+
pending: busy === item.id,
|
|
205
|
+
disabled: stale,
|
|
206
|
+
onSelect: () => void act(item, (isCurrent) => setEnabled(services, project, item, true, isCurrent)),
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: 'delete',
|
|
210
|
+
label: 'Remove',
|
|
211
|
+
variant: 'destructive',
|
|
212
|
+
disabled: busy !== null || stale,
|
|
213
|
+
onSelect: () => setDeleting(item),
|
|
214
|
+
},
|
|
215
|
+
] })),
|
|
216
|
+
},
|
|
217
|
+
] })), _jsx("p", { children: `${state.items.length} ${state.items.length === 1 ? 'endpoint' : 'endpoints'} on this page` }), state.hasPrevious || state.next !== null ? (_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { type: "button", variant: "outline", className: "min-h-11", disabled: state.loading || !state.hasPrevious, onClick: () => void controller.previousPage(), children: "Previous endpoints" }), _jsx(Button, { type: "button", variant: "outline", className: "min-h-11", disabled: state.loading || state.next === null, onClick: () => void controller.nextPage(), children: "Next endpoints" })] })) : null, deleting === null ? null : (_jsx(ConfirmAction, { action: "Remove endpoint", target: deleting.name, scope: `Project ${projectLabel}`, description: "No further events are sent to this receiver and deliveries still waiting are cancelled. A request already on its way cannot be recalled. Removing it needs a recent sign-in and cannot be undone.", open: true, hideTrigger: true, onOpenChange: (open) => {
|
|
218
|
+
if (!open)
|
|
219
|
+
setDeleting(null);
|
|
220
|
+
}, onConfirm: () => {
|
|
221
|
+
const target = deleting;
|
|
222
|
+
setDeleting(null);
|
|
223
|
+
void act(target, (isCurrent) => deleteEndpoint(services, project, target, isCurrent));
|
|
224
|
+
} })), selected === null ? null : _jsx(History, { controller: controller, name: selected.name })] }))] }));
|
|
225
|
+
}
|
|
226
|
+
function attemptText(attempt) {
|
|
227
|
+
const outcome = attempt.outcome === 'started'
|
|
228
|
+
? 'started, result not recorded yet'
|
|
229
|
+
: deliveryOutcome({
|
|
230
|
+
state: attempt.outcome === 'delivered' ? 'delivered' : 'failed',
|
|
231
|
+
outcomeCode: attempt.outcomeCode,
|
|
232
|
+
});
|
|
233
|
+
return `${outcome}${attempt.status === null ? '' : ` (HTTP ${attempt.status})`}${attempt.durationMs === null ? '' : `, ${attempt.durationMs} ms`}`;
|
|
234
|
+
}
|
|
235
|
+
function History({ controller, name }) {
|
|
236
|
+
const state = useSyncExternalStore(controller.subscribe, controller.snapshot, controller.snapshot);
|
|
237
|
+
return (_jsxs("section", { "aria-labelledby": "delivery-history", className: "space-y-4", children: [_jsx("h2", { id: "delivery-history", className: "text-lg font-semibold", children: `Delivery history: ${name}` }), _jsx("p", { children: "Finished deliveries are kept for seven days. Request and response bodies, addresses and headers are never stored." }), _jsxs("div", { className: "flex flex-wrap items-end gap-2", children: [_jsxs("label", { className: "grid gap-1", children: ["Show", _jsx(Select, { value: state.filter, onChange: (event) => void controller.filterHistory(event.target.value), children: FILTERS.map((filter) => (_jsx("option", { value: filter.value, children: filter.label }, filter.value))) })] }), _jsx(Button, { type: "button", variant: "outline", className: "min-h-11", disabled: state.deliveriesLoading, onClick: () => void controller.reloadHistory(), children: "Reload history" }), _jsx(Button, { type: "button", variant: "outline", className: "min-h-11", onClick: () => void controller.select(null), children: "Close history" })] }), state.deliveriesLoading ? (_jsx(ListState, { kind: "loading", title: "Loading deliveries\u2026" })) : state.deliveriesError ? (_jsx(ListState, { kind: "error", title: "Deliveries could not be loaded. Try again.", children: _jsx(Button, { type: "button", className: "min-h-11", onClick: () => void controller.reloadHistory(), children: "Try again" }) })) : state.deliveries.length === 0 ? (_jsx(ListState, { kind: state.filter === 'all' ? 'empty' : 'filtered-empty', title: state.filter === 'all'
|
|
238
|
+
? 'No deliveries yet. Events committed while the endpoint is enabled appear here.'
|
|
239
|
+
: 'No deliveries match this filter on this page.' })) : (_jsx(DataTable, { label: `Deliveries to ${name}`, items: state.deliveries, columns: [
|
|
240
|
+
{
|
|
241
|
+
key: 'event',
|
|
242
|
+
label: 'Event',
|
|
243
|
+
value: (item) => item.eventType,
|
|
244
|
+
render: (item) => eventLabel(item.eventType),
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
key: 'created',
|
|
248
|
+
label: 'Created',
|
|
249
|
+
value: (item) => item.createdAt,
|
|
250
|
+
render: (item) => _jsx(Time, { value: item.createdAt }),
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
key: 'result',
|
|
254
|
+
label: 'Result',
|
|
255
|
+
value: (item) => item.state,
|
|
256
|
+
render: (item) => (_jsxs("div", { className: "space-y-1", children: [_jsx(StatusBadge, { status: item.state }), _jsx("p", { className: "text-sm", children: `${deliveryOutcome(item)}${item.lastStatus === null ? '' : ` (HTTP ${item.lastStatus})`}` }), item.nextAttemptAt === null ? null : (_jsxs("p", { className: "text-sm", children: ["Next attempt ", _jsx(Time, { value: item.nextAttemptAt })] }))] })),
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
key: 'attempts',
|
|
260
|
+
label: 'Attempts',
|
|
261
|
+
value: (item) => item.attempts,
|
|
262
|
+
render: (item) => `${item.attempts} of 8`,
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
key: 'actions',
|
|
266
|
+
label: 'Actions',
|
|
267
|
+
value: () => '',
|
|
268
|
+
sortable: false,
|
|
269
|
+
render: (item) => (_jsx(RowActions, { entityLabel: `${eventLabel(item.eventType)} delivery`, actions: [
|
|
270
|
+
{
|
|
271
|
+
id: 'attempts',
|
|
272
|
+
label: 'Show attempts',
|
|
273
|
+
onSelect: () => void controller.openDelivery(item.id),
|
|
274
|
+
},
|
|
275
|
+
] })),
|
|
276
|
+
},
|
|
277
|
+
] })), state.deliveriesHasPrevious || state.deliveriesNext !== null ? (_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { type: "button", variant: "outline", className: "min-h-11", disabled: state.deliveriesLoading || !state.deliveriesHasPrevious, onClick: () => void controller.previousHistory(), children: "Newer deliveries" }), _jsx(Button, { type: "button", variant: "outline", className: "min-h-11", disabled: state.deliveriesLoading || state.deliveriesNext === null, onClick: () => void controller.nextHistory(), children: "Older deliveries" })] })) : null, state.detailError ? (_jsx("p", { role: "alert", children: "The attempts of this delivery could not be loaded." })) : state.detail === null ? null : (_jsxs("section", { "aria-labelledby": "delivery-attempts", className: "space-y-2", children: [_jsx("h3", { id: "delivery-attempts", className: "font-semibold", children: `Attempts for the ${eventLabel(state.detail.eventType)} delivery` }), state.detail.history.length === 0 ? (_jsx("p", { children: "No attempt has started." })) : (_jsx("ol", { className: "list-decimal space-y-1 pl-6", children: state.detail.history.map((attempt) => (_jsxs("li", { children: [_jsx(Time, { value: attempt.startedAt }), `: ${attemptText(attempt)}`] }, attempt.attempt))) }))] }))] }));
|
|
278
|
+
}
|
|
279
|
+
export function NotificationsPage() {
|
|
280
|
+
const services = useServices();
|
|
281
|
+
const controller = useMemo(() => createNotificationsController(services), [services]);
|
|
282
|
+
const project = useProjectSlug();
|
|
283
|
+
const [projectName, setProjectName] = useState(null);
|
|
284
|
+
useEffect(() => {
|
|
285
|
+
setProjectName(null);
|
|
286
|
+
if (project === null)
|
|
287
|
+
return;
|
|
288
|
+
let live = true;
|
|
289
|
+
void services.client
|
|
290
|
+
.request('get', '/_pb/projects/{project}', { params: { project } })
|
|
291
|
+
.then((result) => {
|
|
292
|
+
if (live && result.ok)
|
|
293
|
+
setProjectName(result.data.name);
|
|
294
|
+
});
|
|
295
|
+
return () => {
|
|
296
|
+
live = false;
|
|
297
|
+
};
|
|
298
|
+
}, [services, project]);
|
|
299
|
+
return (_jsx(NotificationsView, { services: services, controller: controller, project: project, projectName: projectName }));
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/pages/notifications.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-login.d.ts","sourceRoot":"","sources":["../../src/pages/npm-login.tsx"],"names":[],"mappings":"AASA,wBAAgB,YAAY,gCAG3B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { useServices } from '../auth.js';
|
|
4
|
+
import { Button } from '../components/ui/button.js';
|
|
5
|
+
import { Label } from '../components/ui/label.js';
|
|
6
|
+
import { Select } from '../components/ui/select.js';
|
|
7
|
+
import { Alert, AlertDescription } from '../components/ui/alert.js';
|
|
8
|
+
import { Time } from '../components/ui/time.js';
|
|
9
|
+
export function NpmLoginPage() {
|
|
10
|
+
const selector = /^#\/npm-login\/([A-Za-z0-9_-]{43})$/.exec(window.location.hash)?.[1] ?? '';
|
|
11
|
+
return _jsx(NpmLoginConfirmation, { selector: selector }, selector);
|
|
12
|
+
}
|
|
13
|
+
function NpmLoginConfirmation({ selector }) {
|
|
14
|
+
const { client } = useServices();
|
|
15
|
+
const [request, setRequest] = useState(null);
|
|
16
|
+
const [write, setWrite] = useState(false);
|
|
17
|
+
const [scope, setScope] = useState('read');
|
|
18
|
+
const [state, setState] = useState('loading');
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
let active = true;
|
|
21
|
+
void client
|
|
22
|
+
.request('get', '/_pb/me/npm-login/{selector}', { params: { selector } })
|
|
23
|
+
.then(async (result) => {
|
|
24
|
+
if (!active)
|
|
25
|
+
return;
|
|
26
|
+
if (!result.ok) {
|
|
27
|
+
setState(result.code === 'reauth_required' ? 'reauth' : 'error');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
setRequest(result.data);
|
|
31
|
+
setState('ready');
|
|
32
|
+
const permissions = await client.request('get', '/_pb/projects/{project}/permissions', {
|
|
33
|
+
params: { project: result.data.project.slug },
|
|
34
|
+
});
|
|
35
|
+
if (active)
|
|
36
|
+
setWrite(permissions.ok && permissions.data.project.includes('project:packages:write'));
|
|
37
|
+
});
|
|
38
|
+
return () => {
|
|
39
|
+
active = false;
|
|
40
|
+
};
|
|
41
|
+
}, [client, selector]);
|
|
42
|
+
async function confirm(event) {
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
if ((state !== 'ready' && state !== 'failed') || request === null)
|
|
45
|
+
return;
|
|
46
|
+
setState('busy');
|
|
47
|
+
const result = await client.request('post', '/_pb/me/npm-login/{selector}', {
|
|
48
|
+
params: { selector },
|
|
49
|
+
body: { scope: scope === 'write' ? 'write' : 'read' },
|
|
50
|
+
});
|
|
51
|
+
setState(result.ok
|
|
52
|
+
? 'done'
|
|
53
|
+
: result.code === 'reauth_required'
|
|
54
|
+
? 'reauth'
|
|
55
|
+
: result.code === 'conflict'
|
|
56
|
+
? 'conflict'
|
|
57
|
+
: 'failed');
|
|
58
|
+
}
|
|
59
|
+
return (_jsxs("section", { className: "max-w-2xl space-y-4", children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Confirm npm login" }), _jsx(Alert, { children: _jsx(AlertDescription, { children: "Only continue if you ran npm login yourself a moment ago. Someone else may have sent you this link to gain access through your account." }) }), state === 'loading' && _jsx("p", { role: "status", children: "Loading login request\u2026" }), state === 'reauth' && (_jsxs("p", { children: ["Confirm your identity before reviewing this request.", ' ', _jsx("a", { className: "underline", href: `#/reauth?return=${encodeURIComponent(`/npm-login/${selector}`)}`, children: "Reauthenticate" })] })), ['error', 'conflict'].includes(state) && (_jsx("p", { role: "alert", children: "This login request is unavailable or has already been confirmed. Run npm login again." })), state === 'done' ? (_jsx("p", { role: "status", children: "Login approved. Return to your terminal to collect the token." })) : (request !== null &&
|
|
60
|
+
state !== 'reauth' && (_jsxs("form", { onSubmit: (event) => void confirm(event), className: "space-y-4", children: [_jsxs("dl", { className: "space-y-2 break-words", children: [_jsx("dt", { children: "Project" }), _jsxs("dd", { children: [request.project.name, " (", request.project.slug, ")"] }), _jsx("dt", { children: "CLI hostname" }), _jsx("dd", { children: request.cliHostname ?? 'Unavailable' }), _jsx("dt", { children: "Source IP" }), _jsx("dd", { children: request.sourceIp ?? 'Unavailable' }), _jsx("dt", { children: "Requested" }), _jsx("dd", { children: _jsx(Time, { value: request.createdAt }) }), _jsx("dt", { children: "Request expires" }), _jsx("dd", { children: _jsx(Time, { value: request.expiresAt }) })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "npm-login-scope", children: "Token access" }), _jsxs(Select, { id: "npm-login-scope", value: scope, onChange: (event) => setScope(event.target.value), disabled: state === 'busy', children: [_jsx("option", { value: "read", children: "Install and download" }), write && _jsx("option", { value: "write", children: "Install, download and publish" })] })] }), _jsx("p", { children: "This creates a personal token for this project with the organization\u2019s default lifetime. It carries only permissions you currently hold." }), state === 'failed' && (_jsx("p", { role: "alert", children: "Login could not be approved. Review the request before trying again." })), _jsx(Button, { type: "submit", disabled: state !== 'ready' && state !== 'failed', className: "min-h-11 w-full sm:w-auto", children: state === 'busy' ? 'Approving login…' : 'Approve login' }), state === 'failed' && (_jsx(Button, { type: "button", onClick: () => setState('ready'), children: "Review again" }))] })))] }));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=npm-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-login.js","sourceRoot":"","sources":["../../src/pages/npm-login.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { operations } from '../../api-types.js';
|
|
2
|
+
import type { ShellServices } from '../../auth.js';
|
|
3
|
+
type Result<K extends keyof operations> = operations[K] extends {
|
|
4
|
+
responses: {
|
|
5
|
+
200: {
|
|
6
|
+
content: {
|
|
7
|
+
'application/json': infer T;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
} ? T : never;
|
|
12
|
+
type Publish = Result<'listPublishes'>['items'][number];
|
|
13
|
+
export type AccessChoice = 'available' | 'request' | 'unavailable';
|
|
14
|
+
export declare function accessSetting(choice: AccessChoice): {
|
|
15
|
+
visibleToNewProjects: boolean;
|
|
16
|
+
newProjectAccessMode: "request" | "none";
|
|
17
|
+
};
|
|
18
|
+
export declare function canEditAccess(owner: string | null, organization: readonly string[], permissions: readonly string[], projectId: string | null): boolean;
|
|
19
|
+
export declare function decisionHeaders(revision: number): {
|
|
20
|
+
'If-Match': string;
|
|
21
|
+
};
|
|
22
|
+
export declare function decisionAllowed(authorized: boolean, busy: boolean, stale: boolean, state: string): boolean;
|
|
23
|
+
type PublishAction = 'approve' | 'reject' | 'rescan';
|
|
24
|
+
export declare function publishActions(item: Pick<Publish, 'approvalState' | 'scanState' | 'holdScan'>): PublishAction[];
|
|
25
|
+
export declare function validReason(reason: string, required: boolean): boolean;
|
|
26
|
+
export declare function PackageWorkflow({ services, project, }: {
|
|
27
|
+
services: ShellServices;
|
|
28
|
+
project: string | null;
|
|
29
|
+
}): import("react").JSX.Element | null;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=npm-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-workflow.d.ts","sourceRoot":"","sources":["../../../src/pages/packages/npm-workflow.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAcnD,KAAK,MAAM,CAAC,CAAC,SAAS,MAAM,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS;IAC9D,SAAS,EAAE;QAAE,GAAG,EAAE;YAAE,OAAO,EAAE;gBAAE,kBAAkB,EAAE,MAAM,CAAC,CAAA;aAAE,CAAA;SAAE,CAAA;KAAE,CAAC;CAClE,GACG,CAAC,GACD,KAAK,CAAC;AACV,KAAK,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAGxD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;AACnE,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY;;;EAKjD;AACD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,WAKzB;AACD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM;;EAE/C;AACD,wBAAgB,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAEhG;AACD,KAAK,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACrD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,GAAG,UAAU,CAAC,GAC9D,aAAa,EAAE,CAejB;AACD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,WAS5D;AAwBD,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,sCAsiBA"}
|