@storyshelf/core 0.3.2 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -31
- package/dist/adapter/capture-queue.d.mts +29 -1
- package/dist/adapter/capture-runner.d.mts +18 -2
- package/dist/adapter/capture-runner.mjs +12 -1
- package/dist/adapter/capture-runner.mjs.map +1 -0
- package/dist/adapter/database.d.mts +67 -17
- package/dist/adapter/database.mjs +22 -55
- package/dist/adapter/database.mjs.map +1 -1
- package/dist/adapter/email-sender.d.mts +27 -0
- package/dist/adapter/email-sender.mjs +4 -0
- package/dist/adapter/metadata.d.mts +21 -15
- package/dist/adapter/notifier.d.mts +7 -0
- package/dist/adapter/notifier.mjs +6 -0
- package/dist/adapter/setup.d.mts +61 -0
- package/dist/adapter/setup.mjs +29 -0
- package/dist/adapter/setup.mjs.map +1 -0
- package/dist/adapter/webhook-events.d.mts +29 -0
- package/dist/adapter/webhook-events.mjs +83 -0
- package/dist/adapter/webhook-events.mjs.map +1 -0
- package/dist/adapters/notifier/events.d.mts +26 -0
- package/dist/adapters/notifier/events.mjs +66 -0
- package/dist/adapters/notifier/events.mjs.map +1 -0
- package/dist/adapters/notifier/format.d.mts +14 -0
- package/dist/adapters/notifier/format.mjs +96 -0
- package/dist/adapters/notifier/format.mjs.map +1 -0
- package/dist/adapters/notifier/provider.d.mts +32 -0
- package/dist/adapters/notifier/types.d.mts +56 -0
- package/dist/adapters/setup-runner.d.mts +23 -0
- package/dist/adapters/setup-runner.mjs +149 -0
- package/dist/adapters/setup-runner.mjs.map +1 -0
- package/dist/adapters/validate.d.mts +30 -0
- package/dist/adapters/validate.mjs +313 -0
- package/dist/adapters/validate.mjs.map +1 -0
- package/dist/auth.d.mts +94 -0
- package/dist/auth.mjs +4 -0
- package/dist/brand-packs.d.mts +16 -0
- package/dist/brand-packs.mjs +130 -0
- package/dist/brand-packs.mjs.map +1 -0
- package/dist/capture/adapter.d.mts +51 -1
- package/dist/capture/adapter.mjs.map +1 -1
- package/dist/capture/affected.d.mts +16 -0
- package/dist/capture/affected.mjs +64 -0
- package/dist/capture/affected.mjs.map +1 -0
- package/dist/capture/diff-record.mjs +30 -0
- package/dist/capture/diff-record.mjs.map +1 -0
- package/dist/capture/dispatch.d.mts +36 -0
- package/dist/capture/dispatch.mjs +88 -31
- package/dist/capture/dispatch.mjs.map +1 -1
- package/dist/capture/guards.mjs +31 -0
- package/dist/capture/guards.mjs.map +1 -0
- package/dist/capture/orchestrator.d.mts +41 -6
- package/dist/capture/orchestrator.mjs +151 -28
- package/dist/capture/orchestrator.mjs.map +1 -1
- package/dist/capture/pipeline.d.mts +30 -16
- package/dist/capture/pipeline.mjs +143 -39
- package/dist/capture/pipeline.mjs.map +1 -1
- package/dist/capture/recovery.d.mts +21 -0
- package/dist/capture/recovery.mjs +83 -0
- package/dist/capture/recovery.mjs.map +1 -0
- package/dist/capture/rediff.d.mts +35 -0
- package/dist/capture/rediff.mjs +77 -0
- package/dist/capture/rediff.mjs.map +1 -0
- package/dist/capture/sizing.d.mts +58 -0
- package/dist/capture/sizing.mjs +119 -0
- package/dist/capture/sizing.mjs.map +1 -0
- package/dist/capture/skip-checks.mjs +3 -3
- package/dist/capture/skip-checks.mjs.map +1 -1
- package/dist/capture/statics.d.mts +38 -0
- package/dist/capture/statics.mjs +38 -4
- package/dist/capture/statics.mjs.map +1 -1
- package/dist/capture/status-fanout.mjs +7 -2
- package/dist/capture/status-fanout.mjs.map +1 -1
- package/dist/capture/storybook.d.mts +31 -2
- package/dist/capture/storybook.mjs +77 -2
- package/dist/capture/storybook.mjs.map +1 -1
- package/dist/capture.d.mts +10 -4
- package/dist/capture.mjs +7 -2
- package/dist/config.d.mts +121 -4
- package/dist/config.mjs +55 -8
- package/dist/config.mjs.map +1 -1
- package/dist/index.d.mts +5 -56
- package/dist/index.mjs +4 -284
- package/dist/logger.d.mts +26 -17
- package/dist/logger.mjs +10 -5
- package/dist/logger.mjs.map +1 -1
- package/dist/models/baseline-status.d.mts +29 -0
- package/dist/models/baseline-status.mjs +26 -0
- package/dist/models/baseline-status.mjs.map +1 -0
- package/dist/models/baseline.d.mts +33 -0
- package/dist/models/baseline.mjs +35 -13
- package/dist/models/baseline.mjs.map +1 -1
- package/dist/models/build.d.mts +87 -0
- package/dist/models/build.mjs +83 -35
- package/dist/models/build.mjs.map +1 -1
- package/dist/models/capture-attempt.d.mts +40 -0
- package/dist/models/capture-attempt.mjs +85 -0
- package/dist/models/capture-attempt.mjs.map +1 -0
- package/dist/models/capture-log.d.mts +21 -0
- package/dist/models/capture-log.mjs +44 -0
- package/dist/models/capture-log.mjs.map +1 -0
- package/dist/models/comment.d.mts +29 -0
- package/dist/models/comment.mjs +11 -8
- package/dist/models/comment.mjs.map +1 -1
- package/dist/models/content-ref.d.mts +21 -0
- package/dist/models/content-ref.mjs +49 -0
- package/dist/models/content-ref.mjs.map +1 -0
- package/dist/models/credentials.d.mts +36 -0
- package/dist/models/credentials.mjs +103 -0
- package/dist/models/credentials.mjs.map +1 -0
- package/dist/models/label.d.mts +58 -0
- package/dist/models/label.mjs +32 -27
- package/dist/models/label.mjs.map +1 -1
- package/dist/models/member.d.mts +34 -0
- package/dist/models/member.mjs +20 -11
- package/dist/models/member.mjs.map +1 -1
- package/dist/models/notification-channel.d.mts +52 -0
- package/dist/models/notification-channel.mjs +93 -0
- package/dist/models/notification-channel.mjs.map +1 -0
- package/dist/models/notification-subscription.d.mts +44 -0
- package/dist/models/notification-subscription.mjs +89 -0
- package/dist/models/notification-subscription.mjs.map +1 -0
- package/dist/models/project-group-mapping.d.mts +30 -0
- package/dist/models/project-group-mapping.mjs +46 -0
- package/dist/models/project-group-mapping.mjs.map +1 -0
- package/dist/models/project.d.mts +54 -0
- package/dist/models/project.mjs +15 -11
- package/dist/models/project.mjs.map +1 -1
- package/dist/models/snapshot.d.mts +58 -0
- package/dist/models/snapshot.mjs +13 -7
- package/dist/models/snapshot.mjs.map +1 -1
- package/dist/models/status-config.d.mts +38 -0
- package/dist/models/status-config.mjs +12 -11
- package/dist/models/status-config.mjs.map +1 -1
- package/dist/models/token.d.mts +44 -0
- package/dist/models/token.mjs +18 -15
- package/dist/models/token.mjs.map +1 -1
- package/dist/models/user.d.mts +42 -0
- package/dist/models/user.mjs +65 -0
- package/dist/models/user.mjs.map +1 -0
- package/dist/models/webhook.d.mts +50 -0
- package/dist/models/webhook.mjs +12 -10
- package/dist/models/webhook.mjs.map +1 -1
- package/dist/models.d.mts +22 -0
- package/dist/models.mjs +23 -0
- package/dist/paths.mjs +29 -0
- package/dist/paths.mjs.map +1 -1
- package/dist/retention.d.mts +45 -0
- package/dist/retention.mjs +145 -0
- package/dist/retention.mjs.map +1 -0
- package/dist/schema/baseline.d.mts +1 -0
- package/dist/schema/build.d.mts +8 -0
- package/dist/schema/capture-attempt.d.mts +38 -0
- package/dist/schema/comment.d.mts +1 -1
- package/dist/schema/content-ref.d.mts +13 -0
- package/dist/schema/member.d.mts +2 -0
- package/dist/schema/notification.d.mts +35 -0
- package/dist/schema/project-group-mapping.d.mts +15 -0
- package/dist/schema/project.d.mts +4 -0
- package/dist/schema/snapshot.d.mts +7 -0
- package/dist/schema/token.d.mts +2 -0
- package/dist/schema/user.d.mts +11 -1
- package/dist/schema.d.mts +9 -46
- package/dist/schema.mjs +1 -55
- package/dist/test-helpers/create-project.d.mts +15 -0
- package/dist/test-helpers/create-project.mjs +28 -0
- package/dist/test-helpers/create-project.mjs.map +1 -0
- package/dist/test-helpers/database-contract.d.mts +13 -0
- package/dist/test-helpers/database-contract.mjs +58 -0
- package/dist/test-helpers/database-contract.mjs.map +1 -0
- package/dist/test-helpers/fake-adapters.d.mts +14 -0
- package/dist/test-helpers/fake-adapters.mjs +20 -0
- package/dist/test-helpers/fake-adapters.mjs.map +1 -0
- package/dist/test-helpers/fake-database.d.mts +11 -0
- package/dist/test-helpers/fake-database.mjs +104 -0
- package/dist/test-helpers/fake-database.mjs.map +1 -0
- package/dist/test-helpers/fake-storage.d.mts +14 -0
- package/dist/test-helpers/fake-storage.mjs +49 -0
- package/dist/test-helpers/fake-storage.mjs.map +1 -0
- package/dist/test-helpers/fake-tables.mjs +276 -0
- package/dist/test-helpers/fake-tables.mjs.map +1 -0
- package/dist/test-helpers/git-contract.d.mts +11 -0
- package/dist/test-helpers/git-contract.mjs +34 -0
- package/dist/test-helpers/git-contract.mjs.map +1 -0
- package/dist/test-helpers/notifier-contract.d.mts +11 -0
- package/dist/test-helpers/notifier-contract.mjs +34 -0
- package/dist/test-helpers/notifier-contract.mjs.map +1 -0
- package/dist/test-helpers/queue-contract.d.mts +11 -0
- package/dist/test-helpers/queue-contract.mjs +64 -0
- package/dist/test-helpers/queue-contract.mjs.map +1 -0
- package/dist/test-helpers/runner-contract.d.mts +11 -0
- package/dist/test-helpers/runner-contract.mjs +32 -0
- package/dist/test-helpers/runner-contract.mjs.map +1 -0
- package/dist/test-helpers/sql-chunks.mjs +138 -0
- package/dist/test-helpers/sql-chunks.mjs.map +1 -0
- package/dist/test-helpers/storage-contract.d.mts +11 -0
- package/dist/test-helpers/storage-contract.mjs +87 -0
- package/dist/test-helpers/storage-contract.mjs.map +1 -0
- package/dist/test-helpers.d.mts +13 -0
- package/dist/test-helpers.mjs +14 -0
- package/dist/tracing.mjs +63 -0
- package/dist/tracing.mjs.map +1 -0
- package/dist/types.d.mts +38 -5
- package/dist/types.mjs +18 -5
- package/dist/types.mjs.map +1 -1
- package/dist/urls.d.mts +12 -1
- package/dist/urls.mjs +22 -3
- package/dist/urls.mjs.map +1 -1
- package/dist/utils/encrypt.d.mts +48 -0
- package/dist/utils/encrypt.mjs +67 -13
- package/dist/utils/encrypt.mjs.map +1 -1
- package/dist/utils/hash.d.mts +17 -0
- package/dist/utils/hash.mjs +8 -2
- package/dist/utils/hash.mjs.map +1 -1
- package/dist/utils/http.d.mts +58 -0
- package/dist/utils/http.mjs +147 -0
- package/dist/utils/http.mjs.map +1 -0
- package/dist/utils/mime.d.mts +9 -0
- package/dist/utils/mime.mjs +33 -0
- package/dist/utils/mime.mjs.map +1 -0
- package/dist/utils/path-security.d.mts +12 -0
- package/dist/utils/path-security.mjs +24 -0
- package/dist/utils/path-security.mjs.map +1 -0
- package/dist/utils/redact.d.mts +17 -0
- package/dist/utils/redact.mjs +42 -0
- package/dist/utils/redact.mjs.map +1 -0
- package/dist/utils/timing.d.mts +19 -0
- package/dist/utils/timing.mjs +46 -0
- package/dist/utils/timing.mjs.map +1 -0
- package/dist/utils/ulid.d.mts +10 -0
- package/dist/utils/ulid.mjs +8 -8
- package/dist/utils/ulid.mjs.map +1 -1
- package/dist/utils.d.mts +12 -0
- package/dist/utils.mjs +13 -0
- package/package.json +69 -28
- package/dist/adapter/auth.d.mts +0 -50
- package/dist/adapter/auth.mjs +0 -10
- package/dist/adapter/auth.mjs.map +0 -1
- package/dist/adapter/init.d.mts +0 -58
- package/dist/adapter/init.mjs +0 -93
- package/dist/adapter/init.mjs.map +0 -1
- package/dist/adapters/webhook-events.mjs +0 -55
- package/dist/adapters/webhook-events.mjs.map +0 -1
- package/dist/ddl.d.mts +0 -8
- package/dist/ddl.mjs +0 -158
- package/dist/ddl.mjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/middleware/auth-gate.mjs +0 -36
- package/dist/middleware/auth-gate.mjs.map +0 -1
- package/dist/middleware/csrf.mjs +0 -40
- package/dist/middleware/csrf.mjs.map +0 -1
- package/dist/middleware/rate-limit.mjs +0 -39
- package/dist/middleware/rate-limit.mjs.map +0 -1
- package/dist/middleware/request-log.mjs +0 -28
- package/dist/middleware/request-log.mjs.map +0 -1
- package/dist/middleware/store-scope.mjs +0 -29
- package/dist/middleware/store-scope.mjs.map +0 -1
- package/dist/pages/build-detail.mjs +0 -339
- package/dist/pages/build-detail.mjs.map +0 -1
- package/dist/pages/build-diff-comments.mjs +0 -113
- package/dist/pages/build-diff-comments.mjs.map +0 -1
- package/dist/pages/build-diff-header.mjs +0 -163
- package/dist/pages/build-diff-header.mjs.map +0 -1
- package/dist/pages/build-diff-nav.mjs +0 -66
- package/dist/pages/build-diff-nav.mjs.map +0 -1
- package/dist/pages/build-diff-viewer.mjs +0 -197
- package/dist/pages/build-diff-viewer.mjs.map +0 -1
- package/dist/pages/build-diff.mjs +0 -90
- package/dist/pages/build-diff.mjs.map +0 -1
- package/dist/pages/compute-jobs.mjs +0 -198
- package/dist/pages/compute-jobs.mjs.map +0 -1
- package/dist/pages/label-detail.mjs +0 -228
- package/dist/pages/label-detail.mjs.map +0 -1
- package/dist/pages/login.mjs +0 -78
- package/dist/pages/login.mjs.map +0 -1
- package/dist/pages/project-builds.mjs +0 -231
- package/dist/pages/project-builds.mjs.map +0 -1
- package/dist/pages/project-create.mjs +0 -169
- package/dist/pages/project-create.mjs.map +0 -1
- package/dist/pages/project-settings.mjs +0 -102
- package/dist/pages/project-settings.mjs.map +0 -1
- package/dist/pages/projects.mjs +0 -184
- package/dist/pages/projects.mjs.map +0 -1
- package/dist/pages/root.mjs +0 -94
- package/dist/pages/root.mjs.map +0 -1
- package/dist/pages/settings-general.mjs +0 -192
- package/dist/pages/settings-general.mjs.map +0 -1
- package/dist/pages/settings-labels.mjs +0 -150
- package/dist/pages/settings-labels.mjs.map +0 -1
- package/dist/pages/settings-members.mjs +0 -125
- package/dist/pages/settings-members.mjs.map +0 -1
- package/dist/pages/settings-status.mjs +0 -152
- package/dist/pages/settings-status.mjs.map +0 -1
- package/dist/pages/settings-tests.mjs +0 -149
- package/dist/pages/settings-tests.mjs.map +0 -1
- package/dist/pages/settings-tokens.mjs +0 -96
- package/dist/pages/settings-tokens.mjs.map +0 -1
- package/dist/pages/settings-webhooks.mjs +0 -150
- package/dist/pages/settings-webhooks.mjs.map +0 -1
- package/dist/pages/storybook.mjs +0 -96
- package/dist/pages/storybook.mjs.map +0 -1
- package/dist/retention/purge.mjs +0 -70
- package/dist/retention/purge.mjs.map +0 -1
- package/dist/routers/admin.mjs +0 -42
- package/dist/routers/admin.mjs.map +0 -1
- package/dist/routers/assets.mjs +0 -25
- package/dist/routers/assets.mjs.map +0 -1
- package/dist/routers/auth.mjs +0 -78
- package/dist/routers/auth.mjs.map +0 -1
- package/dist/routers/builds.handlers.mjs +0 -184
- package/dist/routers/builds.handlers.mjs.map +0 -1
- package/dist/routers/builds.mjs +0 -185
- package/dist/routers/builds.mjs.map +0 -1
- package/dist/routers/comments.mjs +0 -90
- package/dist/routers/comments.mjs.map +0 -1
- package/dist/routers/health.mjs +0 -137
- package/dist/routers/health.mjs.map +0 -1
- package/dist/routers/helpers.mjs +0 -82
- package/dist/routers/helpers.mjs.map +0 -1
- package/dist/routers/htmx.mjs +0 -20
- package/dist/routers/htmx.mjs.map +0 -1
- package/dist/routers/labels.mjs +0 -110
- package/dist/routers/labels.mjs.map +0 -1
- package/dist/routers/media.mjs +0 -55
- package/dist/routers/media.mjs.map +0 -1
- package/dist/routers/members.mjs +0 -102
- package/dist/routers/members.mjs.map +0 -1
- package/dist/routers/projects.mjs +0 -122
- package/dist/routers/projects.mjs.map +0 -1
- package/dist/routers/schemas.mjs +0 -224
- package/dist/routers/schemas.mjs.map +0 -1
- package/dist/routers/settings-general.mjs +0 -95
- package/dist/routers/settings-general.mjs.map +0 -1
- package/dist/routers/settings-labels.mjs +0 -49
- package/dist/routers/settings-labels.mjs.map +0 -1
- package/dist/routers/settings-members.mjs +0 -30
- package/dist/routers/settings-members.mjs.map +0 -1
- package/dist/routers/settings-status.mjs +0 -73
- package/dist/routers/settings-status.mjs.map +0 -1
- package/dist/routers/settings-tokens.mjs +0 -40
- package/dist/routers/settings-tokens.mjs.map +0 -1
- package/dist/routers/settings-webhooks.mjs +0 -63
- package/dist/routers/settings-webhooks.mjs.map +0 -1
- package/dist/routers/settings.handlers.mjs +0 -93
- package/dist/routers/settings.handlers.mjs.map +0 -1
- package/dist/routers/settings.mjs +0 -23
- package/dist/routers/settings.mjs.map +0 -1
- package/dist/routers/snapshots.mjs +0 -144
- package/dist/routers/snapshots.mjs.map +0 -1
- package/dist/routers/status-configs.mjs +0 -101
- package/dist/routers/status-configs.mjs.map +0 -1
- package/dist/routers/storybook.mjs +0 -120
- package/dist/routers/storybook.mjs.map +0 -1
- package/dist/routers/tokens.mjs +0 -81
- package/dist/routers/tokens.mjs.map +0 -1
- package/dist/routers/ui.mjs +0 -165
- package/dist/routers/ui.mjs.map +0 -1
- package/dist/routers/webhooks.mjs +0 -90
- package/dist/routers/webhooks.mjs.map +0 -1
- package/dist/schema/baseline.mjs +0 -22
- package/dist/schema/baseline.mjs.map +0 -1
- package/dist/schema/build.mjs +0 -29
- package/dist/schema/build.mjs.map +0 -1
- package/dist/schema/comment.mjs +0 -26
- package/dist/schema/comment.mjs.map +0 -1
- package/dist/schema/label.mjs +0 -30
- package/dist/schema/label.mjs.map +0 -1
- package/dist/schema/member.mjs +0 -19
- package/dist/schema/member.mjs.map +0 -1
- package/dist/schema/project.mjs +0 -25
- package/dist/schema/project.mjs.map +0 -1
- package/dist/schema/snapshot.mjs +0 -34
- package/dist/schema/snapshot.mjs.map +0 -1
- package/dist/schema/status-config.mjs +0 -20
- package/dist/schema/status-config.mjs.map +0 -1
- package/dist/schema/token.mjs +0 -19
- package/dist/schema/token.mjs.map +0 -1
- package/dist/schema/user.mjs +0 -19
- package/dist/schema/user.mjs.map +0 -1
- package/dist/schema/webhook.mjs +0 -20
- package/dist/schema/webhook.mjs.map +0 -1
- package/dist/schema.mjs.map +0 -1
- package/dist/store.mjs +0 -20
- package/dist/store.mjs.map +0 -1
- package/dist/ui/document.mjs +0 -348
- package/dist/ui/document.mjs.map +0 -1
- package/dist/ui/feedback.mjs +0 -24
- package/dist/ui/feedback.mjs.map +0 -1
- package/dist/ui/forms.mjs +0 -117
- package/dist/ui/forms.mjs.map +0 -1
- package/dist/ui/styles.mjs +0 -174
- package/dist/ui/styles.mjs.map +0 -1
- package/dist/ui/theme.mjs +0 -44
- package/dist/ui/theme.mjs.map +0 -1
package/dist/routers/labels.mjs
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { getStore } from "../store.mjs";
|
|
5
|
-
import { LabelModel } from "../models/label.mjs";
|
|
6
|
-
import { resolveAuthorizedProject } from "./helpers.mjs";
|
|
7
|
-
import { labelTypeCreateSchema, labelTypeSchema, labelTypeUpdateSchema, notFound, unauthorized } from "./schemas.mjs";
|
|
8
|
-
import { createRoute, z } from "@hono/zod-openapi";
|
|
9
|
-
import { HTTPException } from "hono/http-exception";
|
|
10
|
-
//#region src/routers/labels.ts
|
|
11
|
-
const VIEW_ROLES = [
|
|
12
|
-
"viewer",
|
|
13
|
-
"developer",
|
|
14
|
-
"approver",
|
|
15
|
-
"admin"
|
|
16
|
-
];
|
|
17
|
-
const ADMIN_ROLES = ["admin"];
|
|
18
|
-
const listLabelsRoute = createRoute({
|
|
19
|
-
method: "get",
|
|
20
|
-
path: "/api/v1/projects/{slug}/label-types",
|
|
21
|
-
request: { params: z.object({ slug: z.string() }) },
|
|
22
|
-
responses: {
|
|
23
|
-
200: {
|
|
24
|
-
content: { "application/json": { schema: labelTypeSchema.array() } },
|
|
25
|
-
description: "List label types"
|
|
26
|
-
},
|
|
27
|
-
...notFound,
|
|
28
|
-
...unauthorized
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
const createLabelRoute = createRoute({
|
|
32
|
-
method: "post",
|
|
33
|
-
path: "/api/v1/projects/{slug}/label-types",
|
|
34
|
-
request: {
|
|
35
|
-
params: z.object({ slug: z.string() }),
|
|
36
|
-
body: { content: { "application/json": { schema: labelTypeCreateSchema } } }
|
|
37
|
-
},
|
|
38
|
-
responses: {
|
|
39
|
-
201: {
|
|
40
|
-
content: { "application/json": { schema: labelTypeSchema } },
|
|
41
|
-
description: "Created label type"
|
|
42
|
-
},
|
|
43
|
-
...notFound
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
const deleteLabelRoute = createRoute({
|
|
47
|
-
method: "delete",
|
|
48
|
-
path: "/api/v1/projects/{slug}/label-types/{key}",
|
|
49
|
-
request: { params: z.object({
|
|
50
|
-
slug: z.string(),
|
|
51
|
-
key: z.string()
|
|
52
|
-
}) },
|
|
53
|
-
responses: {
|
|
54
|
-
204: { description: "Deleted label type" },
|
|
55
|
-
...notFound
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
const updateLabelRoute = createRoute({
|
|
59
|
-
method: "patch",
|
|
60
|
-
path: "/api/v1/projects/{slug}/label-types/{key}",
|
|
61
|
-
request: {
|
|
62
|
-
params: z.object({
|
|
63
|
-
slug: z.string(),
|
|
64
|
-
key: z.string()
|
|
65
|
-
}),
|
|
66
|
-
body: { content: { "application/json": { schema: labelTypeUpdateSchema } } }
|
|
67
|
-
},
|
|
68
|
-
responses: {
|
|
69
|
-
200: {
|
|
70
|
-
content: { "application/json": { schema: labelTypeSchema } },
|
|
71
|
-
description: "Updated label type"
|
|
72
|
-
},
|
|
73
|
-
...notFound
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
/** Register the project label-type list, create, update, and delete endpoints. */
|
|
77
|
-
function registerLabels(app) {
|
|
78
|
-
app.openapi(listLabelsRoute, async (c) => {
|
|
79
|
-
const project = await resolveAuthorizedProject(c, c.req.valid("param").slug, ...VIEW_ROLES);
|
|
80
|
-
return c.json(await new LabelModel(getStore().db).listTypes(project.id));
|
|
81
|
-
});
|
|
82
|
-
app.openapi(createLabelRoute, async (c) => {
|
|
83
|
-
const project = await resolveAuthorizedProject(c, c.req.valid("param").slug, ...ADMIN_ROLES);
|
|
84
|
-
const body = c.req.valid("json");
|
|
85
|
-
return c.json(await new LabelModel(getStore().db).createType(project.id, body), 201);
|
|
86
|
-
});
|
|
87
|
-
app.openapi(deleteLabelRoute, async (c) => {
|
|
88
|
-
const { slug, key } = c.req.valid("param");
|
|
89
|
-
const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);
|
|
90
|
-
await new LabelModel(getStore().db).removeType(project.id, key);
|
|
91
|
-
return c.body(null, 204);
|
|
92
|
-
});
|
|
93
|
-
app.openapi(updateLabelRoute, async (c) => {
|
|
94
|
-
const { slug, key } = c.req.valid("param");
|
|
95
|
-
const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);
|
|
96
|
-
const body = c.req.valid("json");
|
|
97
|
-
try {
|
|
98
|
-
const updated = await new LabelModel(getStore().db).updateType(project.id, key, body);
|
|
99
|
-
if (!updated) throw new HTTPException(404, { message: "Label type not found" });
|
|
100
|
-
return c.json(updated);
|
|
101
|
-
} catch (error) {
|
|
102
|
-
if (error instanceof HTTPException) throw error;
|
|
103
|
-
throw new HTTPException(400, { message: error instanceof Error ? error.message : "Cannot update label type" });
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
//#endregion
|
|
108
|
-
export { registerLabels };
|
|
109
|
-
|
|
110
|
-
//# sourceMappingURL=labels.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"labels.mjs","names":[],"sources":["../../src/routers/labels.ts"],"sourcesContent":["import { createRoute, z } from \"@hono/zod-openapi\";\nimport { HTTPException } from \"hono/http-exception\";\nimport type { ShelfApp } from \"../index.tsx\";\nimport { LabelModel } from \"../models/label.ts\";\nimport { getStore } from \"../store.ts\";\nimport type { ProjectRole } from \"../types.ts\";\nimport { resolveAuthorizedProject } from \"./helpers.ts\";\nimport {\n labelTypeCreateSchema,\n labelTypeSchema,\n labelTypeUpdateSchema,\n notFound,\n unauthorized,\n} from \"./schemas.ts\";\n\nconst VIEW_ROLES: readonly ProjectRole[] = [\"viewer\", \"developer\", \"approver\", \"admin\"];\nconst ADMIN_ROLES: readonly ProjectRole[] = [\"admin\"];\n\nconst listLabelsRoute = createRoute({\n method: \"get\",\n path: \"/api/v1/projects/{slug}/label-types\",\n request: { params: z.object({ slug: z.string() }) },\n responses: {\n 200: {\n content: { \"application/json\": { schema: labelTypeSchema.array() } },\n description: \"List label types\",\n },\n ...notFound,\n ...unauthorized,\n },\n});\n\nconst createLabelRoute = createRoute({\n method: \"post\",\n path: \"/api/v1/projects/{slug}/label-types\",\n request: {\n params: z.object({ slug: z.string() }),\n body: { content: { \"application/json\": { schema: labelTypeCreateSchema } } },\n },\n responses: {\n 201: {\n content: { \"application/json\": { schema: labelTypeSchema } },\n description: \"Created label type\",\n },\n ...notFound,\n },\n});\n\nconst deleteLabelRoute = createRoute({\n method: \"delete\",\n path: \"/api/v1/projects/{slug}/label-types/{key}\",\n request: { params: z.object({ slug: z.string(), key: z.string() }) },\n responses: {\n 204: { description: \"Deleted label type\" },\n ...notFound,\n },\n});\n\nconst updateLabelRoute = createRoute({\n method: \"patch\",\n path: \"/api/v1/projects/{slug}/label-types/{key}\",\n request: {\n params: z.object({ slug: z.string(), key: z.string() }),\n body: { content: { \"application/json\": { schema: labelTypeUpdateSchema } } },\n },\n responses: {\n 200: {\n content: { \"application/json\": { schema: labelTypeSchema } },\n description: \"Updated label type\",\n },\n ...notFound,\n },\n});\n\n/** Register the project label-type list, create, update, and delete endpoints. */\nexport function registerLabels(app: ShelfApp): void {\n app.openapi(listLabelsRoute, async (c) => {\n const project = await resolveAuthorizedProject(c, c.req.valid(\"param\").slug, ...VIEW_ROLES);\n return c.json(await new LabelModel(getStore().db).listTypes(project.id));\n });\n\n app.openapi(createLabelRoute, async (c) => {\n const project = await resolveAuthorizedProject(c, c.req.valid(\"param\").slug, ...ADMIN_ROLES);\n const body = c.req.valid(\"json\");\n return c.json(await new LabelModel(getStore().db).createType(project.id, body), 201);\n });\n\n app.openapi(deleteLabelRoute, async (c) => {\n const { slug, key } = c.req.valid(\"param\");\n const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);\n await new LabelModel(getStore().db).removeType(project.id, key);\n return c.body(null, 204);\n });\n\n app.openapi(updateLabelRoute, async (c) => {\n const { slug, key } = c.req.valid(\"param\");\n const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);\n const body = c.req.valid(\"json\");\n try {\n const updated = await new LabelModel(getStore().db).updateType(project.id, key, body);\n if (!updated) {\n throw new HTTPException(404, { message: \"Label type not found\" });\n }\n return c.json(updated);\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n throw new HTTPException(400, {\n message: error instanceof Error ? error.message : \"Cannot update label type\",\n });\n }\n });\n}\n"],"mappings":"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"}
|
package/dist/routers/media.mjs
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { BuildModel } from "../models/build.mjs";
|
|
5
|
-
import { BaselineModel } from "../models/baseline.mjs";
|
|
6
|
-
import { SnapshotModel } from "../models/snapshot.mjs";
|
|
7
|
-
import { getStore } from "../store.mjs";
|
|
8
|
-
import { notFound, resolveAuthorizedProject } from "./helpers.mjs";
|
|
9
|
-
//#region src/routers/media.ts
|
|
10
|
-
const VIEW_ROLES = [
|
|
11
|
-
"viewer",
|
|
12
|
-
"developer",
|
|
13
|
-
"approver",
|
|
14
|
-
"admin"
|
|
15
|
-
];
|
|
16
|
-
const PNG = "image/png";
|
|
17
|
-
function imageResponse(buffer) {
|
|
18
|
-
return new Response(new Uint8Array(buffer), { headers: {
|
|
19
|
-
"content-type": PNG,
|
|
20
|
-
"cache-control": "private, max-age=3600"
|
|
21
|
-
} });
|
|
22
|
-
}
|
|
23
|
-
/** Register the PNG image, diff, and baseline media endpoints for snapshots. */
|
|
24
|
-
function registerMedia(app) {
|
|
25
|
-
app.get("/api/v1/projects/:slug/builds/:buildId/snapshots/:snapshotId/image", async (c) => {
|
|
26
|
-
const project = await resolveAuthorizedProject(c, c.req.param("slug"), ...VIEW_ROLES);
|
|
27
|
-
const snapshot = await findSnapshot(c.req.param("buildId"), c.req.param("snapshotId"), project.id);
|
|
28
|
-
return imageResponse(await getStore().storage.read(snapshot.screenshotPath));
|
|
29
|
-
});
|
|
30
|
-
app.get("/api/v1/projects/:slug/builds/:buildId/snapshots/:snapshotId/diff", async (c) => {
|
|
31
|
-
const project = await resolveAuthorizedProject(c, c.req.param("slug"), ...VIEW_ROLES);
|
|
32
|
-
const snapshot = await findSnapshot(c.req.param("buildId"), c.req.param("snapshotId"), project.id);
|
|
33
|
-
if (!snapshot.diffPath) notFound("No diff for this snapshot");
|
|
34
|
-
return imageResponse(await getStore().storage.read(snapshot.diffPath));
|
|
35
|
-
});
|
|
36
|
-
app.get("/api/v1/projects/:slug/builds/:buildId/snapshots/:snapshotId/baseline", async (c) => {
|
|
37
|
-
const project = await resolveAuthorizedProject(c, c.req.param("slug"), ...VIEW_ROLES);
|
|
38
|
-
const snapshot = await findSnapshot(c.req.param("buildId"), c.req.param("snapshotId"), project.id);
|
|
39
|
-
const build = await new BuildModel(getStore().db).get(snapshot.buildId);
|
|
40
|
-
if (!build) notFound("Build not found");
|
|
41
|
-
const baselines = new BaselineModel(getStore().db, getStore().storage);
|
|
42
|
-
const baseline = await baselines.resolve(project.id, snapshot.storyId, snapshot.viewportName, build.gitBranch, project.gitDefaultBranch);
|
|
43
|
-
if (!baseline) notFound("No baseline for this snapshot");
|
|
44
|
-
return imageResponse(await baselines.read(baseline));
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
async function findSnapshot(buildId, snapshotId, projectId) {
|
|
48
|
-
const snapshot = await new SnapshotModel(getStore().db).get(snapshotId);
|
|
49
|
-
if (!snapshot || snapshot.buildId !== buildId || snapshot.projectId !== projectId) notFound("Snapshot not found");
|
|
50
|
-
return snapshot;
|
|
51
|
-
}
|
|
52
|
-
//#endregion
|
|
53
|
-
export { registerMedia };
|
|
54
|
-
|
|
55
|
-
//# sourceMappingURL=media.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media.mjs","names":[],"sources":["../../src/routers/media.ts"],"sourcesContent":["import type { ShelfApp } from \"../index.tsx\";\nimport { BaselineModel } from \"../models/baseline.ts\";\nimport { BuildModel } from \"../models/build.ts\";\nimport { SnapshotModel } from \"../models/snapshot.ts\";\nimport type { Snapshot } from \"../schema/snapshot.ts\";\nimport { getStore } from \"../store.ts\";\nimport type { ProjectRole } from \"../types.ts\";\nimport { notFound, resolveAuthorizedProject } from \"./helpers.ts\";\n\nconst VIEW_ROLES: readonly ProjectRole[] = [\"viewer\", \"developer\", \"approver\", \"admin\"];\n\nconst PNG = \"image/png\";\n\nfunction imageResponse(buffer: Buffer): Response {\n return new Response(new Uint8Array(buffer), {\n headers: { \"content-type\": PNG, \"cache-control\": \"private, max-age=3600\" },\n });\n}\n\n/** Register the PNG image, diff, and baseline media endpoints for snapshots. */\nexport function registerMedia(app: ShelfApp): void {\n app.get(\"/api/v1/projects/:slug/builds/:buildId/snapshots/:snapshotId/image\", async (c) => {\n const project = await resolveAuthorizedProject(c, c.req.param(\"slug\"), ...VIEW_ROLES);\n const snapshot = await findSnapshot(\n c.req.param(\"buildId\"),\n c.req.param(\"snapshotId\"),\n project.id,\n );\n return imageResponse(await getStore().storage.read(snapshot.screenshotPath));\n });\n\n app.get(\"/api/v1/projects/:slug/builds/:buildId/snapshots/:snapshotId/diff\", async (c) => {\n const project = await resolveAuthorizedProject(c, c.req.param(\"slug\"), ...VIEW_ROLES);\n const snapshot = await findSnapshot(\n c.req.param(\"buildId\"),\n c.req.param(\"snapshotId\"),\n project.id,\n );\n if (!snapshot.diffPath) {\n notFound(\"No diff for this snapshot\");\n }\n return imageResponse(await getStore().storage.read(snapshot.diffPath));\n });\n\n app.get(\"/api/v1/projects/:slug/builds/:buildId/snapshots/:snapshotId/baseline\", async (c) => {\n const project = await resolveAuthorizedProject(c, c.req.param(\"slug\"), ...VIEW_ROLES);\n const snapshot = await findSnapshot(\n c.req.param(\"buildId\"),\n c.req.param(\"snapshotId\"),\n project.id,\n );\n const build = await new BuildModel(getStore().db).get(snapshot.buildId);\n if (!build) {\n notFound(\"Build not found\");\n }\n const baselines = new BaselineModel(getStore().db, getStore().storage);\n const baseline = await baselines.resolve(\n project.id,\n snapshot.storyId,\n snapshot.viewportName,\n build.gitBranch,\n project.gitDefaultBranch,\n );\n if (!baseline) {\n notFound(\"No baseline for this snapshot\");\n }\n return imageResponse(await baselines.read(baseline));\n });\n}\n\nasync function findSnapshot(\n buildId: string,\n snapshotId: string,\n projectId: string,\n): Promise<Snapshot> {\n const snapshot = await new SnapshotModel(getStore().db).get(snapshotId);\n if (!snapshot || snapshot.buildId !== buildId || snapshot.projectId !== projectId) {\n notFound(\"Snapshot not found\");\n }\n return snapshot;\n}\n"],"mappings":";;;;;;;;;AASA,MAAM,aAAqC;CAAC;CAAU;CAAa;CAAY;AAAO;AAEtF,MAAM,MAAM;AAEZ,SAAS,cAAc,QAA0B;CAC/C,OAAO,IAAI,SAAS,IAAI,WAAW,MAAM,GAAG,EAC1C,SAAS;EAAE,gBAAgB;EAAK,iBAAiB;CAAwB,EAC3E,CAAC;AACH;;AAGA,SAAgB,cAAc,KAAqB;CACjD,IAAI,IAAI,sEAAsE,OAAO,MAAM;EACzF,MAAM,UAAU,MAAM,yBAAyB,GAAG,EAAE,IAAI,MAAM,MAAM,GAAG,GAAG,UAAU;EACpF,MAAM,WAAW,MAAM,aACrB,EAAE,IAAI,MAAM,SAAS,GACrB,EAAE,IAAI,MAAM,YAAY,GACxB,QAAQ,EACV;EACA,OAAO,cAAc,MAAM,SAAS,CAAC,CAAC,QAAQ,KAAK,SAAS,cAAc,CAAC;CAC7E,CAAC;CAED,IAAI,IAAI,qEAAqE,OAAO,MAAM;EACxF,MAAM,UAAU,MAAM,yBAAyB,GAAG,EAAE,IAAI,MAAM,MAAM,GAAG,GAAG,UAAU;EACpF,MAAM,WAAW,MAAM,aACrB,EAAE,IAAI,MAAM,SAAS,GACrB,EAAE,IAAI,MAAM,YAAY,GACxB,QAAQ,EACV;EACA,IAAI,CAAC,SAAS,UACZ,SAAS,2BAA2B;EAEtC,OAAO,cAAc,MAAM,SAAS,CAAC,CAAC,QAAQ,KAAK,SAAS,QAAQ,CAAC;CACvE,CAAC;CAED,IAAI,IAAI,yEAAyE,OAAO,MAAM;EAC5F,MAAM,UAAU,MAAM,yBAAyB,GAAG,EAAE,IAAI,MAAM,MAAM,GAAG,GAAG,UAAU;EACpF,MAAM,WAAW,MAAM,aACrB,EAAE,IAAI,MAAM,SAAS,GACrB,EAAE,IAAI,MAAM,YAAY,GACxB,QAAQ,EACV;EACA,MAAM,QAAQ,MAAM,IAAI,WAAW,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,OAAO;EACtE,IAAI,CAAC,OACH,SAAS,iBAAiB;EAE5B,MAAM,YAAY,IAAI,cAAc,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,OAAO;EACrE,MAAM,WAAW,MAAM,UAAU,QAC/B,QAAQ,IACR,SAAS,SACT,SAAS,cACT,MAAM,WACN,QAAQ,gBACV;EACA,IAAI,CAAC,UACH,SAAS,+BAA+B;EAE1C,OAAO,cAAc,MAAM,UAAU,KAAK,QAAQ,CAAC;CACrD,CAAC;AACH;AAEA,eAAe,aACb,SACA,YACA,WACmB;CACnB,MAAM,WAAW,MAAM,IAAI,cAAc,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU;CACtE,IAAI,CAAC,YAAY,SAAS,YAAY,WAAW,SAAS,cAAc,WACtE,SAAS,oBAAoB;CAE/B,OAAO;AACT"}
|
package/dist/routers/members.mjs
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { getStore } from "../store.mjs";
|
|
5
|
-
import { MemberModel } from "../models/member.mjs";
|
|
6
|
-
import { resolveAuthorizedProject } from "./helpers.mjs";
|
|
7
|
-
import { memberRoleSchema, memberSchema, memberSetSchema, notFound, unauthorized } from "./schemas.mjs";
|
|
8
|
-
import { createRoute, z } from "@hono/zod-openapi";
|
|
9
|
-
//#region src/routers/members.ts
|
|
10
|
-
const VIEW_ROLES = [
|
|
11
|
-
"viewer",
|
|
12
|
-
"developer",
|
|
13
|
-
"approver",
|
|
14
|
-
"admin"
|
|
15
|
-
];
|
|
16
|
-
const ADMIN_ROLES = ["admin"];
|
|
17
|
-
const listMembersRoute = createRoute({
|
|
18
|
-
method: "get",
|
|
19
|
-
path: "/api/v1/projects/{slug}/members",
|
|
20
|
-
request: { params: z.object({ slug: z.string() }) },
|
|
21
|
-
responses: {
|
|
22
|
-
200: {
|
|
23
|
-
content: { "application/json": { schema: memberSchema.array() } },
|
|
24
|
-
description: "List project members"
|
|
25
|
-
},
|
|
26
|
-
...notFound,
|
|
27
|
-
...unauthorized
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
const setMemberRoute = createRoute({
|
|
31
|
-
method: "post",
|
|
32
|
-
path: "/api/v1/projects/{slug}/members",
|
|
33
|
-
request: {
|
|
34
|
-
params: z.object({ slug: z.string() }),
|
|
35
|
-
body: { content: { "application/json": { schema: memberSetSchema } } }
|
|
36
|
-
},
|
|
37
|
-
responses: {
|
|
38
|
-
201: {
|
|
39
|
-
content: { "application/json": { schema: memberSchema } },
|
|
40
|
-
description: "Added or updated member"
|
|
41
|
-
},
|
|
42
|
-
...notFound
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
const updateMemberRoute = createRoute({
|
|
46
|
-
method: "patch",
|
|
47
|
-
path: "/api/v1/projects/{slug}/members/{userId}",
|
|
48
|
-
request: {
|
|
49
|
-
params: z.object({
|
|
50
|
-
slug: z.string(),
|
|
51
|
-
userId: z.string()
|
|
52
|
-
}),
|
|
53
|
-
body: { content: { "application/json": { schema: memberRoleSchema } } }
|
|
54
|
-
},
|
|
55
|
-
responses: {
|
|
56
|
-
200: {
|
|
57
|
-
content: { "application/json": { schema: memberSchema } },
|
|
58
|
-
description: "Updated member role"
|
|
59
|
-
},
|
|
60
|
-
...notFound
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
const deleteMemberRoute = createRoute({
|
|
64
|
-
method: "delete",
|
|
65
|
-
path: "/api/v1/projects/{slug}/members/{userId}",
|
|
66
|
-
request: { params: z.object({
|
|
67
|
-
slug: z.string(),
|
|
68
|
-
userId: z.string()
|
|
69
|
-
}) },
|
|
70
|
-
responses: {
|
|
71
|
-
204: { description: "Removed member" },
|
|
72
|
-
...notFound
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
/** Register the project member list, upsert, and removal endpoints. */
|
|
76
|
-
function registerMembers(app) {
|
|
77
|
-
app.openapi(listMembersRoute, async (c) => {
|
|
78
|
-
const project = await resolveAuthorizedProject(c, c.req.valid("param").slug, ...VIEW_ROLES);
|
|
79
|
-
return c.json(await new MemberModel(getStore().db).list(project.id));
|
|
80
|
-
});
|
|
81
|
-
app.openapi(setMemberRoute, async (c) => {
|
|
82
|
-
const project = await resolveAuthorizedProject(c, c.req.valid("param").slug, ...ADMIN_ROLES);
|
|
83
|
-
const body = c.req.valid("json");
|
|
84
|
-
return c.json(await new MemberModel(getStore().db).set(project.id, body.userId, body.role), 201);
|
|
85
|
-
});
|
|
86
|
-
app.openapi(updateMemberRoute, async (c) => {
|
|
87
|
-
const { slug, userId } = c.req.valid("param");
|
|
88
|
-
const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);
|
|
89
|
-
const body = c.req.valid("json");
|
|
90
|
-
return c.json(await new MemberModel(getStore().db).set(project.id, userId, body.role));
|
|
91
|
-
});
|
|
92
|
-
app.openapi(deleteMemberRoute, async (c) => {
|
|
93
|
-
const { slug, userId } = c.req.valid("param");
|
|
94
|
-
const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);
|
|
95
|
-
await new MemberModel(getStore().db).remove(project.id, userId);
|
|
96
|
-
return c.body(null, 204);
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
//#endregion
|
|
100
|
-
export { registerMembers };
|
|
101
|
-
|
|
102
|
-
//# sourceMappingURL=members.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"members.mjs","names":[],"sources":["../../src/routers/members.ts"],"sourcesContent":["import { createRoute, z } from \"@hono/zod-openapi\";\nimport type { ShelfApp } from \"../index.tsx\";\nimport { MemberModel } from \"../models/member.ts\";\nimport { getStore } from \"../store.ts\";\nimport type { ProjectRole } from \"../types.ts\";\nimport { resolveAuthorizedProject } from \"./helpers.ts\";\nimport {\n memberRoleSchema,\n memberSchema,\n memberSetSchema,\n notFound,\n unauthorized,\n} from \"./schemas.ts\";\n\nconst VIEW_ROLES: readonly ProjectRole[] = [\"viewer\", \"developer\", \"approver\", \"admin\"];\nconst ADMIN_ROLES: readonly ProjectRole[] = [\"admin\"];\n\nconst listMembersRoute = createRoute({\n method: \"get\",\n path: \"/api/v1/projects/{slug}/members\",\n request: { params: z.object({ slug: z.string() }) },\n responses: {\n 200: {\n content: { \"application/json\": { schema: memberSchema.array() } },\n description: \"List project members\",\n },\n ...notFound,\n ...unauthorized,\n },\n});\n\nconst setMemberRoute = createRoute({\n method: \"post\",\n path: \"/api/v1/projects/{slug}/members\",\n request: {\n params: z.object({ slug: z.string() }),\n body: { content: { \"application/json\": { schema: memberSetSchema } } },\n },\n responses: {\n 201: {\n content: { \"application/json\": { schema: memberSchema } },\n description: \"Added or updated member\",\n },\n ...notFound,\n },\n});\n\nconst updateMemberRoute = createRoute({\n method: \"patch\",\n path: \"/api/v1/projects/{slug}/members/{userId}\",\n request: {\n params: z.object({ slug: z.string(), userId: z.string() }),\n body: { content: { \"application/json\": { schema: memberRoleSchema } } },\n },\n responses: {\n 200: {\n content: { \"application/json\": { schema: memberSchema } },\n description: \"Updated member role\",\n },\n ...notFound,\n },\n});\n\nconst deleteMemberRoute = createRoute({\n method: \"delete\",\n path: \"/api/v1/projects/{slug}/members/{userId}\",\n request: { params: z.object({ slug: z.string(), userId: z.string() }) },\n responses: {\n 204: { description: \"Removed member\" },\n ...notFound,\n },\n});\n\n/** Register the project member list, upsert, and removal endpoints. */\nexport function registerMembers(app: ShelfApp): void {\n app.openapi(listMembersRoute, async (c) => {\n const project = await resolveAuthorizedProject(c, c.req.valid(\"param\").slug, ...VIEW_ROLES);\n return c.json(await new MemberModel(getStore().db).list(project.id));\n });\n\n app.openapi(setMemberRoute, async (c) => {\n const project = await resolveAuthorizedProject(c, c.req.valid(\"param\").slug, ...ADMIN_ROLES);\n const body = c.req.valid(\"json\");\n return c.json(\n await new MemberModel(getStore().db).set(project.id, body.userId, body.role),\n 201,\n );\n });\n\n app.openapi(updateMemberRoute, async (c) => {\n const { slug, userId } = c.req.valid(\"param\");\n const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);\n const body = c.req.valid(\"json\");\n return c.json(await new MemberModel(getStore().db).set(project.id, userId, body.role));\n });\n\n app.openapi(deleteMemberRoute, async (c) => {\n const { slug, userId } = c.req.valid(\"param\");\n const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);\n await new MemberModel(getStore().db).remove(project.id, userId);\n return c.body(null, 204);\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { ProjectModel } from "../models/project.mjs";
|
|
5
|
-
import { getStore } from "../store.mjs";
|
|
6
|
-
import { LabelModel } from "../models/label.mjs";
|
|
7
|
-
import { forbidden, requireSiteAdmin, resolveAuthorizedProject } from "./helpers.mjs";
|
|
8
|
-
import { badRequest, forbidden as forbidden$1, notFound, projectCreateSchema, projectSchema, projectUpdateSchema, unauthorized } from "./schemas.mjs";
|
|
9
|
-
import { createRoute, z } from "@hono/zod-openapi";
|
|
10
|
-
//#region src/routers/projects.ts
|
|
11
|
-
const VIEW_ROLES = [
|
|
12
|
-
"viewer",
|
|
13
|
-
"developer",
|
|
14
|
-
"approver",
|
|
15
|
-
"admin"
|
|
16
|
-
];
|
|
17
|
-
const ADMIN_ROLES = ["admin"];
|
|
18
|
-
function requireSessionUser() {
|
|
19
|
-
if (!getStore().authEnabled) return;
|
|
20
|
-
if (!getStore().user) forbidden();
|
|
21
|
-
}
|
|
22
|
-
const listProjectsRoute = createRoute({
|
|
23
|
-
method: "get",
|
|
24
|
-
path: "/api/v1/projects",
|
|
25
|
-
responses: {
|
|
26
|
-
200: {
|
|
27
|
-
content: { "application/json": { schema: projectSchema.array() } },
|
|
28
|
-
description: "List projects"
|
|
29
|
-
},
|
|
30
|
-
...unauthorized
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
const createProjectRoute = createRoute({
|
|
34
|
-
method: "post",
|
|
35
|
-
path: "/api/v1/projects",
|
|
36
|
-
request: { body: { content: { "application/json": { schema: projectCreateSchema } } } },
|
|
37
|
-
responses: {
|
|
38
|
-
201: {
|
|
39
|
-
content: { "application/json": { schema: projectSchema } },
|
|
40
|
-
description: "Created project"
|
|
41
|
-
},
|
|
42
|
-
...badRequest,
|
|
43
|
-
...forbidden$1,
|
|
44
|
-
...unauthorized
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
const getProjectRoute = createRoute({
|
|
48
|
-
method: "get",
|
|
49
|
-
path: "/api/v1/projects/{slug}",
|
|
50
|
-
request: { params: z.object({ slug: z.string() }) },
|
|
51
|
-
responses: {
|
|
52
|
-
200: {
|
|
53
|
-
content: { "application/json": { schema: projectSchema } },
|
|
54
|
-
description: "Fetch a project"
|
|
55
|
-
},
|
|
56
|
-
...notFound,
|
|
57
|
-
...unauthorized
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
const updateProjectRoute = createRoute({
|
|
61
|
-
method: "patch",
|
|
62
|
-
path: "/api/v1/projects/{slug}",
|
|
63
|
-
request: {
|
|
64
|
-
params: z.object({ slug: z.string() }),
|
|
65
|
-
body: { content: { "application/json": { schema: projectUpdateSchema } } }
|
|
66
|
-
},
|
|
67
|
-
responses: {
|
|
68
|
-
200: {
|
|
69
|
-
content: { "application/json": { schema: projectSchema } },
|
|
70
|
-
description: "Updated project"
|
|
71
|
-
},
|
|
72
|
-
...forbidden$1,
|
|
73
|
-
...notFound
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
const deleteProjectRoute = createRoute({
|
|
77
|
-
method: "delete",
|
|
78
|
-
path: "/api/v1/projects/{slug}",
|
|
79
|
-
request: { params: z.object({ slug: z.string() }) },
|
|
80
|
-
responses: {
|
|
81
|
-
204: { description: "Deleted project" },
|
|
82
|
-
...forbidden$1,
|
|
83
|
-
...notFound
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
/** Register the project list, create, fetch, update, and delete endpoints. */
|
|
87
|
-
function registerProjects(app) {
|
|
88
|
-
app.openapi(listProjectsRoute, async (c) => {
|
|
89
|
-
requireSessionUser();
|
|
90
|
-
const projects = new ProjectModel(getStore().db);
|
|
91
|
-
return c.json(await projects.list());
|
|
92
|
-
});
|
|
93
|
-
app.openapi(createProjectRoute, async (c) => {
|
|
94
|
-
requireSiteAdmin();
|
|
95
|
-
const body = c.req.valid("json");
|
|
96
|
-
const project = await new ProjectModel(getStore().db).create(body);
|
|
97
|
-
await new LabelModel(getStore().db).seedFor(project.id);
|
|
98
|
-
return c.json(project, 201);
|
|
99
|
-
});
|
|
100
|
-
app.openapi(getProjectRoute, async (c) => {
|
|
101
|
-
const { slug } = c.req.valid("param");
|
|
102
|
-
const project = await resolveAuthorizedProject(c, slug, ...VIEW_ROLES);
|
|
103
|
-
return c.json(project);
|
|
104
|
-
});
|
|
105
|
-
app.openapi(updateProjectRoute, async (c) => {
|
|
106
|
-
const { slug } = c.req.valid("param");
|
|
107
|
-
const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);
|
|
108
|
-
const updated = await new ProjectModel(getStore().db).update(project.id, c.req.valid("json"));
|
|
109
|
-
return c.json(updated);
|
|
110
|
-
});
|
|
111
|
-
app.openapi(deleteProjectRoute, async (c) => {
|
|
112
|
-
requireSiteAdmin();
|
|
113
|
-
const { slug } = c.req.valid("param");
|
|
114
|
-
const project = await resolveAuthorizedProject(c, slug, ...VIEW_ROLES);
|
|
115
|
-
await new ProjectModel(getStore().db).remove(project.id);
|
|
116
|
-
return c.body(null, 204);
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
//#endregion
|
|
120
|
-
export { registerProjects };
|
|
121
|
-
|
|
122
|
-
//# sourceMappingURL=projects.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projects.mjs","names":["forbiddenResponse"],"sources":["../../src/routers/projects.ts"],"sourcesContent":["import { createRoute, z } from \"@hono/zod-openapi\";\nimport type { ShelfApp } from \"../index.tsx\";\nimport { LabelModel } from \"../models/label.ts\";\nimport { ProjectModel } from \"../models/project.ts\";\nimport { getStore } from \"../store.ts\";\nimport type { ProjectRole } from \"../types.ts\";\nimport { forbidden, requireSiteAdmin, resolveAuthorizedProject } from \"./helpers.ts\";\nimport {\n badRequest,\n forbidden as forbiddenResponse,\n notFound,\n projectCreateSchema,\n projectSchema,\n projectUpdateSchema,\n unauthorized,\n} from \"./schemas.ts\";\n\nconst VIEW_ROLES: readonly ProjectRole[] = [\"viewer\", \"developer\", \"approver\", \"admin\"];\nconst ADMIN_ROLES: readonly ProjectRole[] = [\"admin\"];\n\nfunction requireSessionUser(): void {\n if (!getStore().authEnabled) {\n return;\n }\n if (!getStore().user) {\n forbidden();\n }\n}\n\nconst listProjectsRoute = createRoute({\n method: \"get\",\n path: \"/api/v1/projects\",\n responses: {\n 200: {\n content: { \"application/json\": { schema: projectSchema.array() } },\n description: \"List projects\",\n },\n ...unauthorized,\n },\n});\n\nconst createProjectRoute = createRoute({\n method: \"post\",\n path: \"/api/v1/projects\",\n request: { body: { content: { \"application/json\": { schema: projectCreateSchema } } } },\n responses: {\n 201: {\n content: { \"application/json\": { schema: projectSchema } },\n description: \"Created project\",\n },\n ...badRequest,\n ...forbiddenResponse,\n ...unauthorized,\n },\n});\n\nconst getProjectRoute = createRoute({\n method: \"get\",\n path: \"/api/v1/projects/{slug}\",\n request: { params: z.object({ slug: z.string() }) },\n responses: {\n 200: {\n content: { \"application/json\": { schema: projectSchema } },\n description: \"Fetch a project\",\n },\n ...notFound,\n ...unauthorized,\n },\n});\n\nconst updateProjectRoute = createRoute({\n method: \"patch\",\n path: \"/api/v1/projects/{slug}\",\n request: {\n params: z.object({ slug: z.string() }),\n body: { content: { \"application/json\": { schema: projectUpdateSchema } } },\n },\n responses: {\n 200: {\n content: { \"application/json\": { schema: projectSchema } },\n description: \"Updated project\",\n },\n ...forbiddenResponse,\n ...notFound,\n },\n});\n\nconst deleteProjectRoute = createRoute({\n method: \"delete\",\n path: \"/api/v1/projects/{slug}\",\n request: { params: z.object({ slug: z.string() }) },\n responses: {\n 204: { description: \"Deleted project\" },\n ...forbiddenResponse,\n ...notFound,\n },\n});\n\n/** Register the project list, create, fetch, update, and delete endpoints. */\nexport function registerProjects(app: ShelfApp): void {\n app.openapi(listProjectsRoute, async (c) => {\n requireSessionUser();\n const projects = new ProjectModel(getStore().db);\n return c.json(await projects.list());\n });\n\n app.openapi(createProjectRoute, async (c) => {\n requireSiteAdmin();\n const body = c.req.valid(\"json\");\n const projects = new ProjectModel(getStore().db);\n const project = await projects.create(body);\n await new LabelModel(getStore().db).seedFor(project.id);\n return c.json(project, 201);\n });\n\n app.openapi(getProjectRoute, async (c) => {\n const { slug } = c.req.valid(\"param\");\n const project = await resolveAuthorizedProject(c, slug, ...VIEW_ROLES);\n return c.json(project);\n });\n\n app.openapi(updateProjectRoute, async (c) => {\n const { slug } = c.req.valid(\"param\");\n const project = await resolveAuthorizedProject(c, slug, ...ADMIN_ROLES);\n const updated = await new ProjectModel(getStore().db).update(project.id, c.req.valid(\"json\"));\n return c.json(updated);\n });\n\n app.openapi(deleteProjectRoute, async (c) => {\n requireSiteAdmin();\n const { slug } = c.req.valid(\"param\");\n const project = await resolveAuthorizedProject(c, slug, ...VIEW_ROLES);\n await new ProjectModel(getStore().db).remove(project.id);\n return c.body(null, 204);\n });\n}\n"],"mappings":"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"}
|
package/dist/routers/schemas.mjs
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { BUILD_STATUSES, PROJECT_ROLES, SNAPSHOT_STATUSES } from "../types.mjs";
|
|
5
|
-
import { z } from "@hono/zod-openapi";
|
|
6
|
-
//#region src/routers/schemas.ts
|
|
7
|
-
const storybookMetaSchema = z.record(z.string(), z.unknown()).nullable().optional();
|
|
8
|
-
/** OpenAPI schema for a project record. */
|
|
9
|
-
const projectSchema = z.object({
|
|
10
|
-
id: z.string(),
|
|
11
|
-
name: z.string(),
|
|
12
|
-
slug: z.string(),
|
|
13
|
-
gitRepository: z.string().nullable(),
|
|
14
|
-
gitDefaultBranch: z.string(),
|
|
15
|
-
pixelThreshold: z.number(),
|
|
16
|
-
maxDiffRatio: z.number(),
|
|
17
|
-
publicBranchRegex: z.string().nullable(),
|
|
18
|
-
storybookMeta: z.string().nullable().optional(),
|
|
19
|
-
executePlay: z.boolean(),
|
|
20
|
-
playTimeoutMs: z.number(),
|
|
21
|
-
createdAt: z.string(),
|
|
22
|
-
updatedAt: z.string()
|
|
23
|
-
}).openapi("Project");
|
|
24
|
-
/** OpenAPI schema for creating a project. */
|
|
25
|
-
const projectCreateSchema = z.object({
|
|
26
|
-
name: z.string().min(1),
|
|
27
|
-
gitRepository: z.string().optional(),
|
|
28
|
-
gitDefaultBranch: z.string().optional(),
|
|
29
|
-
storybookMeta: storybookMetaSchema,
|
|
30
|
-
executePlay: z.boolean().optional(),
|
|
31
|
-
playTimeoutMs: z.number().int().min(1e3).max(3e4).optional()
|
|
32
|
-
}).openapi("ProjectCreateInput");
|
|
33
|
-
/** OpenAPI schema for patching a project. */
|
|
34
|
-
const projectUpdateSchema = z.object({
|
|
35
|
-
name: z.string().optional(),
|
|
36
|
-
gitRepository: z.string().optional(),
|
|
37
|
-
gitDefaultBranch: z.string().optional(),
|
|
38
|
-
pixelThreshold: z.number().optional(),
|
|
39
|
-
maxDiffRatio: z.number().optional(),
|
|
40
|
-
publicBranchRegex: z.string().nullable().optional(),
|
|
41
|
-
storybookMeta: storybookMetaSchema,
|
|
42
|
-
executePlay: z.boolean().optional(),
|
|
43
|
-
playTimeoutMs: z.number().int().min(1e3).max(3e4).optional()
|
|
44
|
-
}).openapi("ProjectUpdateInput");
|
|
45
|
-
/** OpenAPI schema for a build record. */
|
|
46
|
-
const buildSchema = z.object({
|
|
47
|
-
id: z.string(),
|
|
48
|
-
projectId: z.string(),
|
|
49
|
-
gitSha: z.string(),
|
|
50
|
-
gitBranch: z.string(),
|
|
51
|
-
isDefault: z.boolean(),
|
|
52
|
-
authorEmail: z.string().nullable(),
|
|
53
|
-
authorName: z.string().nullable(),
|
|
54
|
-
message: z.string().nullable(),
|
|
55
|
-
public: z.boolean(),
|
|
56
|
-
status: z.enum(BUILD_STATUSES),
|
|
57
|
-
snapshotCount: z.number(),
|
|
58
|
-
changedCount: z.number(),
|
|
59
|
-
approvedCount: z.number(),
|
|
60
|
-
rejectedCount: z.number(),
|
|
61
|
-
createdAt: z.string(),
|
|
62
|
-
updatedAt: z.string()
|
|
63
|
-
}).openapi("Build");
|
|
64
|
-
/** OpenAPI schema for a snapshot record. */
|
|
65
|
-
const snapshotSchema = z.object({
|
|
66
|
-
id: z.string(),
|
|
67
|
-
projectId: z.string(),
|
|
68
|
-
buildId: z.string(),
|
|
69
|
-
storyId: z.string(),
|
|
70
|
-
storyName: z.string(),
|
|
71
|
-
storyTitle: z.string(),
|
|
72
|
-
storyImportPath: z.string().nullable(),
|
|
73
|
-
viewportName: z.string(),
|
|
74
|
-
viewportWidth: z.number(),
|
|
75
|
-
viewportHeight: z.number(),
|
|
76
|
-
screenshotPath: z.string(),
|
|
77
|
-
diffPath: z.string().nullable(),
|
|
78
|
-
diffPixels: z.number().nullable(),
|
|
79
|
-
diffRatio: z.number().nullable(),
|
|
80
|
-
diffPassed: z.boolean().nullable(),
|
|
81
|
-
status: z.enum(SNAPSHOT_STATUSES),
|
|
82
|
-
reviewedBy: z.string().nullable(),
|
|
83
|
-
reviewedAt: z.string().nullable(),
|
|
84
|
-
createdAt: z.string(),
|
|
85
|
-
updatedAt: z.string()
|
|
86
|
-
}).openapi("Snapshot");
|
|
87
|
-
/** OpenAPI schema for a build comment. */
|
|
88
|
-
const commentSchema = z.object({
|
|
89
|
-
id: z.string(),
|
|
90
|
-
projectId: z.string(),
|
|
91
|
-
buildId: z.string(),
|
|
92
|
-
snapshotId: z.string().nullable(),
|
|
93
|
-
userId: z.string(),
|
|
94
|
-
body: z.string(),
|
|
95
|
-
parentId: z.string().nullable(),
|
|
96
|
-
resolved: z.boolean(),
|
|
97
|
-
createdAt: z.string(),
|
|
98
|
-
updatedAt: z.string()
|
|
99
|
-
}).openapi("Comment");
|
|
100
|
-
/** OpenAPI schema for creating a build comment. */
|
|
101
|
-
const commentCreateSchema = z.object({
|
|
102
|
-
body: z.string().min(1),
|
|
103
|
-
snapshotId: z.string().optional(),
|
|
104
|
-
parentId: z.string().optional()
|
|
105
|
-
}).openapi("CommentCreateInput");
|
|
106
|
-
/** OpenAPI schema for a project label type. */
|
|
107
|
-
const labelTypeSchema = z.object({
|
|
108
|
-
id: z.string(),
|
|
109
|
-
projectId: z.string(),
|
|
110
|
-
key: z.string(),
|
|
111
|
-
name: z.string(),
|
|
112
|
-
linkTemplate: z.string().nullable(),
|
|
113
|
-
color: z.string().nullable(),
|
|
114
|
-
createdAt: z.string()
|
|
115
|
-
}).openapi("LabelType");
|
|
116
|
-
/** OpenAPI schema for creating a label type. */
|
|
117
|
-
const labelTypeCreateSchema = z.object({
|
|
118
|
-
key: z.string().min(1),
|
|
119
|
-
name: z.string().min(1),
|
|
120
|
-
linkTemplate: z.string().optional(),
|
|
121
|
-
color: z.string().optional()
|
|
122
|
-
}).openapi("LabelTypeCreateInput");
|
|
123
|
-
/** OpenAPI schema for patching a label type. */
|
|
124
|
-
const labelTypeUpdateSchema = z.object({
|
|
125
|
-
name: z.string().min(1).optional(),
|
|
126
|
-
linkTemplate: z.string().nullable().optional(),
|
|
127
|
-
color: z.string().nullable().optional()
|
|
128
|
-
}).openapi("LabelTypeUpdateInput");
|
|
129
|
-
/** OpenAPI schema for a public API token (hash omitted). */
|
|
130
|
-
const tokenPublicSchema = z.object({
|
|
131
|
-
id: z.string(),
|
|
132
|
-
projectId: z.string(),
|
|
133
|
-
name: z.string(),
|
|
134
|
-
lastUsedAt: z.string().nullable(),
|
|
135
|
-
createdAt: z.string()
|
|
136
|
-
}).openapi("Token");
|
|
137
|
-
/** OpenAPI schema for creating an API token. */
|
|
138
|
-
const tokenCreateSchema = z.object({ name: z.string().min(1) }).openapi("TokenCreateInput");
|
|
139
|
-
/** OpenAPI schema for a newly created token including its secret value. */
|
|
140
|
-
const tokenCreatedSchema = z.object({
|
|
141
|
-
name: z.string(),
|
|
142
|
-
token: z.string()
|
|
143
|
-
}).openapi("TokenCreated");
|
|
144
|
-
/** OpenAPI schema for a project member record. */
|
|
145
|
-
const memberSchema = z.object({
|
|
146
|
-
id: z.string(),
|
|
147
|
-
projectId: z.string(),
|
|
148
|
-
userId: z.string(),
|
|
149
|
-
role: z.enum(PROJECT_ROLES),
|
|
150
|
-
createdAt: z.string()
|
|
151
|
-
}).openapi("ProjectMember");
|
|
152
|
-
/** OpenAPI schema for updating a member's role. */
|
|
153
|
-
const memberRoleSchema = z.object({ role: z.enum(PROJECT_ROLES) }).openapi("MemberRoleInput");
|
|
154
|
-
/** OpenAPI schema for adding a member to a project. */
|
|
155
|
-
const memberSetSchema = z.object({
|
|
156
|
-
userId: z.string().min(1),
|
|
157
|
-
role: z.enum(PROJECT_ROLES)
|
|
158
|
-
}).openapi("MemberSetInput");
|
|
159
|
-
/** OpenAPI schema for a public webhook (secret omitted). */
|
|
160
|
-
const webhookPublicSchema = z.object({
|
|
161
|
-
id: z.string(),
|
|
162
|
-
url: z.string(),
|
|
163
|
-
events: z.array(z.string())
|
|
164
|
-
}).openapi("Webhook");
|
|
165
|
-
/** OpenAPI schema for creating a webhook. */
|
|
166
|
-
const webhookCreateSchema = z.object({
|
|
167
|
-
url: z.string().url(),
|
|
168
|
-
events: z.array(z.string().min(1)).optional()
|
|
169
|
-
}).openapi("WebhookCreateInput");
|
|
170
|
-
/** OpenAPI schema for a newly created webhook including its signing secret. */
|
|
171
|
-
const webhookCreatedSchema = z.object({
|
|
172
|
-
id: z.string(),
|
|
173
|
-
url: z.string(),
|
|
174
|
-
events: z.array(z.string()),
|
|
175
|
-
secret: z.string()
|
|
176
|
-
}).openapi("WebhookCreated");
|
|
177
|
-
/** OpenAPI schema for a git status-check configuration. */
|
|
178
|
-
const statusConfigSchema = z.object({
|
|
179
|
-
id: z.string(),
|
|
180
|
-
projectId: z.string(),
|
|
181
|
-
provider: z.string(),
|
|
182
|
-
config: z.record(z.string(), z.unknown()),
|
|
183
|
-
hasToken: z.boolean(),
|
|
184
|
-
createdAt: z.string(),
|
|
185
|
-
updatedAt: z.string()
|
|
186
|
-
}).openapi("StatusConfig");
|
|
187
|
-
/** OpenAPI schema for creating a git status-check configuration. */
|
|
188
|
-
const statusConfigCreateSchema = z.object({
|
|
189
|
-
provider: z.string().min(1),
|
|
190
|
-
config: z.record(z.string(), z.unknown()),
|
|
191
|
-
token: z.string().min(1)
|
|
192
|
-
}).openapi("StatusConfigCreateInput");
|
|
193
|
-
/** OpenAPI schema for a generic `{ ok: true }` acknowledgement. */
|
|
194
|
-
const okSchema = z.object({ ok: z.boolean() }).openapi("Ok");
|
|
195
|
-
/** OpenAPI schema for an error response message. */
|
|
196
|
-
const errorSchema = z.object({ message: z.string() }).openapi("Error");
|
|
197
|
-
/** OpenAPI schema for the retention purge result. */
|
|
198
|
-
const purgeSchema = z.object({ removedBuilds: z.number() }).openapi("PurgeResult");
|
|
199
|
-
/** OpenAPI schema for the retention purge input. */
|
|
200
|
-
const purgeInputSchema = z.object({ ttlDays: z.number().optional() }).openapi("PurgeInput");
|
|
201
|
-
/** Shared response spec for a 400 Bad Request. */
|
|
202
|
-
const badRequest = { 400: {
|
|
203
|
-
content: { "application/json": { schema: errorSchema } },
|
|
204
|
-
description: "Bad request"
|
|
205
|
-
} };
|
|
206
|
-
/** Shared response spec for a 401 Unauthorized. */
|
|
207
|
-
const unauthorized = { 401: {
|
|
208
|
-
content: { "application/json": { schema: errorSchema } },
|
|
209
|
-
description: "Unauthorized"
|
|
210
|
-
} };
|
|
211
|
-
/** Shared response spec for a 403 Forbidden. */
|
|
212
|
-
const forbidden = { 403: {
|
|
213
|
-
content: { "application/json": { schema: errorSchema } },
|
|
214
|
-
description: "Forbidden"
|
|
215
|
-
} };
|
|
216
|
-
/** Shared response spec for a 404 Not Found. */
|
|
217
|
-
const notFound = { 404: {
|
|
218
|
-
content: { "application/json": { schema: errorSchema } },
|
|
219
|
-
description: "Not found"
|
|
220
|
-
} };
|
|
221
|
-
//#endregion
|
|
222
|
-
export { badRequest, buildSchema, commentCreateSchema, commentSchema, errorSchema, forbidden, labelTypeCreateSchema, labelTypeSchema, labelTypeUpdateSchema, memberRoleSchema, memberSchema, memberSetSchema, notFound, okSchema, projectCreateSchema, projectSchema, projectUpdateSchema, purgeInputSchema, purgeSchema, snapshotSchema, statusConfigCreateSchema, statusConfigSchema, tokenCreateSchema, tokenCreatedSchema, tokenPublicSchema, unauthorized, webhookCreateSchema, webhookCreatedSchema, webhookPublicSchema };
|
|
223
|
-
|
|
224
|
-
//# sourceMappingURL=schemas.mjs.map
|