@storyshelf/core 0.1.3 → 0.3.2

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.
Files changed (239) hide show
  1. package/README.md +50 -46
  2. package/dist/adapter/auth.d.mts +4 -4
  3. package/dist/adapter/auth.mjs.map +1 -1
  4. package/dist/{adapters → adapter}/capture-queue.d.mts +4 -4
  5. package/dist/adapter/capture-queue.mjs +4 -0
  6. package/dist/adapter/capture-runner.d.mts +7 -7
  7. package/dist/adapter/database.d.mts +20 -9
  8. package/dist/adapter/database.mjs +60 -1
  9. package/dist/adapter/database.mjs.map +1 -0
  10. package/dist/adapter/git-host/comments.d.mts +41 -0
  11. package/dist/adapter/git-host/comments.mjs +54 -0
  12. package/dist/adapter/git-host/comments.mjs.map +1 -0
  13. package/dist/adapter/git-host.d.mts +3 -7
  14. package/dist/adapter/init.d.mts +58 -0
  15. package/dist/adapter/init.mjs +93 -0
  16. package/dist/adapter/init.mjs.map +1 -0
  17. package/dist/adapter/metadata.d.mts +83 -0
  18. package/dist/adapter/metadata.mjs +4 -0
  19. package/dist/adapter/storage.d.mts +15 -4
  20. package/dist/adapters/webhook-events.mjs +12 -4
  21. package/dist/adapters/webhook-events.mjs.map +1 -1
  22. package/dist/capture/adapter.d.mts +5 -1
  23. package/dist/capture/dispatch.mjs +150 -0
  24. package/dist/capture/dispatch.mjs.map +1 -0
  25. package/dist/capture/orchestrator.d.mts +2 -0
  26. package/dist/capture/orchestrator.mjs +5 -44
  27. package/dist/capture/orchestrator.mjs.map +1 -1
  28. package/dist/capture/pipeline.d.mts +4 -1
  29. package/dist/capture/pipeline.mjs +6 -6
  30. package/dist/capture/pipeline.mjs.map +1 -1
  31. package/dist/capture/queue.d.mts +2 -1
  32. package/dist/capture/queue.mjs +2 -1
  33. package/dist/capture/queue.mjs.map +1 -1
  34. package/dist/capture/skip-checks.mjs +76 -0
  35. package/dist/capture/skip-checks.mjs.map +1 -0
  36. package/dist/capture/statics.mjs +124 -0
  37. package/dist/capture/statics.mjs.map +1 -0
  38. package/dist/capture/status-fanout.mjs.map +1 -1
  39. package/dist/capture/storybook.mjs.map +1 -1
  40. package/dist/capture.d.mts +8 -0
  41. package/dist/capture.mjs +9 -0
  42. package/dist/config.d.mts +10 -2
  43. package/dist/config.mjs +14 -2
  44. package/dist/config.mjs.map +1 -1
  45. package/dist/ddl.d.mts +1 -1
  46. package/dist/ddl.mjs +1 -1
  47. package/dist/ddl.mjs.map +1 -1
  48. package/dist/diff/engine.mjs.map +1 -1
  49. package/dist/diff/options.d.mts +3 -1
  50. package/dist/diff.d.mts +5 -0
  51. package/dist/diff.mjs +6 -0
  52. package/dist/index.d.mts +32 -25
  53. package/dist/index.mjs +207 -253
  54. package/dist/index.mjs.map +1 -1
  55. package/dist/logger.d.mts +3 -3
  56. package/dist/middleware/auth-gate.mjs +36 -0
  57. package/dist/middleware/auth-gate.mjs.map +1 -0
  58. package/dist/middleware/csrf.mjs.map +1 -1
  59. package/dist/middleware/request-log.mjs +28 -0
  60. package/dist/middleware/request-log.mjs.map +1 -0
  61. package/dist/middleware/store-scope.mjs +29 -0
  62. package/dist/middleware/store-scope.mjs.map +1 -0
  63. package/dist/models/baseline.mjs +7 -5
  64. package/dist/models/baseline.mjs.map +1 -1
  65. package/dist/models/build.mjs +3 -1
  66. package/dist/models/build.mjs.map +1 -1
  67. package/dist/models/comment.mjs +2 -1
  68. package/dist/models/comment.mjs.map +1 -1
  69. package/dist/models/label.mjs +2 -1
  70. package/dist/models/label.mjs.map +1 -1
  71. package/dist/models/member.mjs +1 -1
  72. package/dist/models/member.mjs.map +1 -1
  73. package/dist/models/project.mjs +1 -1
  74. package/dist/models/project.mjs.map +1 -1
  75. package/dist/models/snapshot.mjs +1 -1
  76. package/dist/models/snapshot.mjs.map +1 -1
  77. package/dist/models/status-config.mjs +1 -1
  78. package/dist/models/status-config.mjs.map +1 -1
  79. package/dist/models/token.mjs +1 -1
  80. package/dist/models/token.mjs.map +1 -1
  81. package/dist/models/webhook.mjs +11 -3
  82. package/dist/models/webhook.mjs.map +1 -1
  83. package/dist/pages/build-detail.mjs +9 -4
  84. package/dist/pages/build-detail.mjs.map +1 -1
  85. package/dist/pages/build-diff-comments.mjs +113 -0
  86. package/dist/pages/build-diff-comments.mjs.map +1 -0
  87. package/dist/pages/build-diff-header.mjs +163 -0
  88. package/dist/pages/build-diff-header.mjs.map +1 -0
  89. package/dist/pages/build-diff-nav.mjs +66 -0
  90. package/dist/pages/build-diff-nav.mjs.map +1 -0
  91. package/dist/pages/build-diff-viewer.mjs +197 -0
  92. package/dist/pages/build-diff-viewer.mjs.map +1 -0
  93. package/dist/pages/build-diff.mjs +65 -413
  94. package/dist/pages/build-diff.mjs.map +1 -1
  95. package/dist/pages/compute-jobs.mjs +1 -1
  96. package/dist/pages/compute-jobs.mjs.map +1 -1
  97. package/dist/pages/label-detail.mjs +4 -3
  98. package/dist/pages/label-detail.mjs.map +1 -1
  99. package/dist/pages/login.mjs.map +1 -1
  100. package/dist/pages/project-builds.mjs +5 -3
  101. package/dist/pages/project-builds.mjs.map +1 -1
  102. package/dist/pages/project-create.mjs.map +1 -1
  103. package/dist/pages/project-settings.mjs.map +1 -1
  104. package/dist/pages/projects.mjs +11 -6
  105. package/dist/pages/projects.mjs.map +1 -1
  106. package/dist/pages/root.mjs +6 -3
  107. package/dist/pages/root.mjs.map +1 -1
  108. package/dist/pages/settings-general.mjs.map +1 -1
  109. package/dist/pages/settings-labels.mjs +1 -1
  110. package/dist/pages/settings-labels.mjs.map +1 -1
  111. package/dist/pages/settings-members.mjs +1 -1
  112. package/dist/pages/settings-members.mjs.map +1 -1
  113. package/dist/pages/settings-status.mjs +2 -1
  114. package/dist/pages/settings-status.mjs.map +1 -1
  115. package/dist/pages/settings-tests.mjs +3 -3
  116. package/dist/pages/settings-tests.mjs.map +1 -1
  117. package/dist/pages/settings-tokens.mjs.map +1 -1
  118. package/dist/pages/settings-webhooks.mjs.map +1 -1
  119. package/dist/pages/storybook.mjs +38 -1
  120. package/dist/pages/storybook.mjs.map +1 -1
  121. package/dist/paths.mjs.map +1 -0
  122. package/dist/retention/purge.mjs +6 -3
  123. package/dist/retention/purge.mjs.map +1 -1
  124. package/dist/routers/admin.mjs +1 -1
  125. package/dist/routers/admin.mjs.map +1 -1
  126. package/dist/routers/assets.mjs.map +1 -1
  127. package/dist/routers/auth.mjs.map +1 -1
  128. package/dist/routers/builds.handlers.mjs +106 -21
  129. package/dist/routers/builds.handlers.mjs.map +1 -1
  130. package/dist/routers/builds.mjs +54 -34
  131. package/dist/routers/builds.mjs.map +1 -1
  132. package/dist/routers/comments.mjs.map +1 -1
  133. package/dist/routers/health.mjs +137 -0
  134. package/dist/routers/health.mjs.map +1 -0
  135. package/dist/routers/helpers.mjs +2 -2
  136. package/dist/routers/helpers.mjs.map +1 -1
  137. package/dist/routers/htmx.mjs.map +1 -1
  138. package/dist/routers/labels.mjs +1 -1
  139. package/dist/routers/labels.mjs.map +1 -1
  140. package/dist/routers/media.mjs +2 -2
  141. package/dist/routers/media.mjs.map +1 -1
  142. package/dist/routers/members.mjs.map +1 -1
  143. package/dist/routers/projects.mjs +1 -1
  144. package/dist/routers/projects.mjs.map +1 -1
  145. package/dist/routers/schemas.mjs.map +1 -1
  146. package/dist/routers/settings-general.mjs +95 -0
  147. package/dist/routers/settings-general.mjs.map +1 -0
  148. package/dist/routers/settings-labels.mjs +49 -0
  149. package/dist/routers/settings-labels.mjs.map +1 -0
  150. package/dist/routers/settings-members.mjs +30 -0
  151. package/dist/routers/settings-members.mjs.map +1 -0
  152. package/dist/routers/settings-status.mjs +73 -0
  153. package/dist/routers/settings-status.mjs.map +1 -0
  154. package/dist/routers/settings-tokens.mjs +40 -0
  155. package/dist/routers/settings-tokens.mjs.map +1 -0
  156. package/dist/routers/settings-webhooks.mjs +63 -0
  157. package/dist/routers/settings-webhooks.mjs.map +1 -0
  158. package/dist/routers/settings.handlers.mjs +93 -0
  159. package/dist/routers/settings.handlers.mjs.map +1 -0
  160. package/dist/routers/settings.mjs +13 -247
  161. package/dist/routers/settings.mjs.map +1 -1
  162. package/dist/routers/snapshots.mjs +1 -1
  163. package/dist/routers/snapshots.mjs.map +1 -1
  164. package/dist/routers/status-configs.mjs +1 -1
  165. package/dist/routers/status-configs.mjs.map +1 -1
  166. package/dist/routers/storybook.mjs +11 -4
  167. package/dist/routers/storybook.mjs.map +1 -1
  168. package/dist/routers/tokens.mjs +1 -1
  169. package/dist/routers/tokens.mjs.map +1 -1
  170. package/dist/routers/ui.mjs +4 -4
  171. package/dist/routers/ui.mjs.map +1 -1
  172. package/dist/routers/webhooks.mjs +6 -6
  173. package/dist/routers/webhooks.mjs.map +1 -1
  174. package/dist/schema/baseline.d.mts +18 -0
  175. package/dist/schema/baseline.mjs +22 -0
  176. package/dist/schema/baseline.mjs.map +1 -0
  177. package/dist/schema/build.d.mts +26 -0
  178. package/dist/schema/build.mjs +29 -0
  179. package/dist/schema/build.mjs.map +1 -0
  180. package/dist/schema/comment.d.mts +19 -0
  181. package/dist/schema/comment.mjs +26 -0
  182. package/dist/schema/comment.mjs.map +1 -0
  183. package/dist/schema/label.d.mts +25 -0
  184. package/dist/schema/label.mjs +30 -0
  185. package/dist/schema/label.mjs.map +1 -0
  186. package/dist/schema/member.d.mts +15 -0
  187. package/dist/schema/member.mjs +19 -0
  188. package/dist/schema/member.mjs.map +1 -0
  189. package/dist/schema/project.d.mts +34 -0
  190. package/dist/schema/project.mjs +25 -0
  191. package/dist/schema/project.mjs.map +1 -0
  192. package/dist/schema/snapshot.d.mts +30 -0
  193. package/dist/schema/snapshot.mjs +34 -0
  194. package/dist/schema/snapshot.mjs.map +1 -0
  195. package/dist/schema/status-config.d.mts +16 -0
  196. package/dist/schema/status-config.mjs +20 -0
  197. package/dist/schema/status-config.mjs.map +1 -0
  198. package/dist/schema/token.d.mts +15 -0
  199. package/dist/schema/token.mjs +19 -0
  200. package/dist/schema/token.mjs.map +1 -0
  201. package/dist/schema/user.d.mts +17 -0
  202. package/dist/schema/user.mjs +19 -0
  203. package/dist/schema/user.mjs.map +1 -0
  204. package/dist/schema/webhook.d.mts +16 -0
  205. package/dist/schema/webhook.mjs +20 -0
  206. package/dist/schema/webhook.mjs.map +1 -0
  207. package/dist/schema.d.mts +13 -168
  208. package/dist/schema.mjs +12 -2
  209. package/dist/schema.mjs.map +1 -1
  210. package/dist/store.mjs.map +1 -1
  211. package/dist/types.d.mts +1 -2
  212. package/dist/types.mjs.map +1 -1
  213. package/dist/ui/document.mjs.map +1 -1
  214. package/dist/ui/feedback.mjs +24 -0
  215. package/dist/ui/feedback.mjs.map +1 -0
  216. package/dist/ui/{components.mjs → forms.mjs} +3 -18
  217. package/dist/ui/forms.mjs.map +1 -0
  218. package/dist/ui/styles.mjs.map +1 -1
  219. package/dist/urls.mjs.map +1 -1
  220. package/package.json +47 -45
  221. package/dist/adapters/metadata.d.mts +0 -24
  222. package/dist/models/baseline.d.mts +0 -21
  223. package/dist/models/build.d.mts +0 -53
  224. package/dist/models/comment.d.mts +0 -22
  225. package/dist/models/label.d.mts +0 -49
  226. package/dist/models/member.d.mts +0 -27
  227. package/dist/models/project.d.mts +0 -43
  228. package/dist/models/snapshot.d.mts +0 -47
  229. package/dist/models/token.d.mts +0 -33
  230. package/dist/models/webhook.d.mts +0 -38
  231. package/dist/retention/purge.d.mts +0 -31
  232. package/dist/schema-tables.mjs +0 -166
  233. package/dist/schema-tables.mjs.map +0 -1
  234. package/dist/ui/components.mjs.map +0 -1
  235. package/dist/ui/document.d.mts +0 -9
  236. package/dist/utils/paths.mjs.map +0 -1
  237. package/dist/utils/ulid.d.mts +0 -10
  238. /package/dist/{utils/paths.d.mts → paths.d.mts} +0 -0
  239. /package/dist/{utils/paths.mjs → paths.mjs} +0 -0
@@ -1,22 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { DatabaseAdapter } from "../adapter/database.mjs";
4
- import { Comment } from "../schema.mjs";
5
- //#region src/models/comment.d.ts
6
- /** Input for creating a review comment. */
7
- interface CommentCreateInput {
8
- body: string;
9
- snapshotId?: string;
10
- parentId?: string;
11
- }
12
- /** Data operations for review comments. */
13
- declare class CommentModel {
14
- private readonly db;
15
- constructor(db: DatabaseAdapter);
16
- listByBuild(buildId: string): Promise<Comment[]>;
17
- create(projectId: string, buildId: string, userId: string, input: CommentCreateInput): Promise<Comment>;
18
- resolve(id: string): Promise<Comment>;
19
- }
20
- //#endregion
21
- export { type Comment, CommentCreateInput, CommentModel };
22
- //# sourceMappingURL=comment.d.mts.map
@@ -1,49 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { DatabaseAdapter } from "../adapter/database.mjs";
4
- import { BuildLabel, LabelType } from "../schema.mjs";
5
- //#region src/models/label.d.ts
6
- /** Data operations for label types and build labels. */
7
- declare class LabelModel {
8
- private readonly db;
9
- /**
10
- * @param db - Database adapter.
11
- */
12
- constructor(db: DatabaseAdapter);
13
- /**
14
- * Seed the default label types for a project if missing.
15
- *
16
- * @param projectId - Project ID.
17
- */
18
- seedFor(projectId: string): Promise<void>;
19
- /** List all label types for a project. */
20
- listTypes(projectId: string): Promise<LabelType[]>;
21
- /** Fetch a label type by key, or null if not found. */
22
- getType(projectId: string, key: string): Promise<LabelType | null>;
23
- /** Create a custom label type for a project. */
24
- createType(projectId: string, input: {
25
- key: string;
26
- name: string;
27
- linkTemplate?: string;
28
- color?: string;
29
- }): Promise<LabelType>;
30
- /** Update a custom label type's name, template or color. */
31
- updateType(projectId: string, key: string, input: {
32
- name?: string;
33
- linkTemplate?: string | null;
34
- color?: string | null;
35
- }): Promise<LabelType | null>;
36
- /** Remove a custom label type, rejecting reserved or persistent types. */
37
- removeType(projectId: string, key: string): Promise<void>;
38
- /** Attach a label value to a build. */
39
- attach(projectId: string, buildId: string, typeKey: string, value: string): Promise<BuildLabel>;
40
- /** List all labels attached to a build. */
41
- listForBuild(buildId: string): Promise<BuildLabel[]>;
42
- /** Return the id of the latest build carrying a given label value, if any. */
43
- latestBuildId(projectId: string, typeKey: string, value: string): Promise<string | null>;
44
- /** Return whether a build is marked as persistent. */
45
- hasPersistent(projectId: string, buildId: string): Promise<boolean>;
46
- }
47
- //#endregion
48
- export { type BuildLabel, LabelModel, type LabelType };
49
- //# sourceMappingURL=label.d.mts.map
@@ -1,27 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { ProjectRole, SiteRole } from "../types.mjs";
4
- import { DatabaseAdapter } from "../adapter/database.mjs";
5
- import { ProjectMember } from "../schema.mjs";
6
- //#region src/models/member.d.ts
7
- /** Data operations for project membership and roles. */
8
- declare class MemberModel {
9
- private readonly db;
10
- /**
11
- * @param db - Database adapter.
12
- */
13
- constructor(db: DatabaseAdapter);
14
- /** List all members of a project. */
15
- list(projectId: string): Promise<ProjectMember[]>;
16
- /** Fetch a project member by project and user id, or null if not found. */
17
- get(projectId: string, userId: string): Promise<ProjectMember | null>;
18
- /** Set a user's role in a project, creating the membership if needed. */
19
- set(projectId: string, userId: string, role: ProjectRole): Promise<ProjectMember>;
20
- /** Remove a user from a project if they are a member. */
21
- remove(projectId: string, userId: string): Promise<void>;
22
- /** Resolve a user's effective project role, honoring site-wide admins. */
23
- effectiveRole(siteRole: SiteRole, projectId: string, userId: string): Promise<ProjectRole | null>;
24
- }
25
- //#endregion
26
- export { MemberModel, type ProjectMember };
27
- //# sourceMappingURL=member.d.mts.map
@@ -1,43 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { DatabaseAdapter } from "../adapter/database.mjs";
4
- import { Project } from "../schema.mjs";
5
- //#region src/models/project.d.ts
6
- /** Input for creating a project. */
7
- interface ProjectCreateInput {
8
- name: string;
9
- gitRepository?: string;
10
- gitDefaultBranch?: string;
11
- storybookMeta?: unknown;
12
- }
13
- /** Data operations for project records. */
14
- declare class ProjectModel {
15
- private readonly db;
16
- /**
17
- * @param db - Database adapter.
18
- */
19
- constructor(db: DatabaseAdapter);
20
- /**
21
- * Create a project with a unique slug.
22
- *
23
- * @param input - Project creation input.
24
- * @returns The created project.
25
- */
26
- create(input: ProjectCreateInput): Promise<Project>;
27
- /** Fetch a project by id, or null if not found. */
28
- get(id: string): Promise<Project | null>;
29
- /** Fetch a project by its slug, or null if not found. */
30
- getBySlug(slug: string): Promise<Project | null>;
31
- /** List all projects. */
32
- list(): Promise<Project[]>;
33
- /** Update mutable fields of a project. */
34
- update(id: string, patch: Partial<Omit<Project, "storybookMeta">> & {
35
- storybookMeta?: unknown;
36
- }): Promise<Project>;
37
- /** Delete a project by id. */
38
- remove(id: string): Promise<void>;
39
- private uniqueSlug;
40
- }
41
- //#endregion
42
- export { type Project, ProjectCreateInput, ProjectModel };
43
- //# sourceMappingURL=project.d.mts.map
@@ -1,47 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { SnapshotStatus } from "../types.mjs";
4
- import { DatabaseAdapter } from "../adapter/database.mjs";
5
- import { Snapshot } from "../schema.mjs";
6
- //#region src/models/snapshot.d.ts
7
- /** Input for creating a snapshot. */
8
- interface SnapshotCreateInput {
9
- storyId: string;
10
- storyName: string;
11
- storyTitle: string;
12
- storyImportPath?: string;
13
- viewportName: string;
14
- viewportWidth: number;
15
- viewportHeight: number;
16
- screenshotPath: string;
17
- }
18
- /** Data operations for snapshot records. */
19
- declare class SnapshotModel {
20
- private readonly db;
21
- /**
22
- * @param db - Database adapter.
23
- */
24
- constructor(db: DatabaseAdapter);
25
- /**
26
- * Create a snapshot for a story within a build.
27
- *
28
- * @param projectId - Project ID.
29
- * @param buildId - Build ID.
30
- * @param input - Snapshot creation input.
31
- * @returns The created snapshot.
32
- */
33
- create(projectId: string, buildId: string, input: SnapshotCreateInput): Promise<Snapshot>;
34
- /** List all snapshots belonging to a build. */
35
- listByBuild(buildId: string): Promise<Snapshot[]>;
36
- /** Fetch a snapshot by id, or null if not found. */
37
- get(id: string): Promise<Snapshot | null>;
38
- /** Update mutable fields of a snapshot. */
39
- update(id: string, patch: Partial<Snapshot>): Promise<Snapshot>;
40
- /** Set the status of a snapshot. */
41
- setStatus(id: string, status: SnapshotStatus): Promise<Snapshot>;
42
- /** Record a reviewer's decision on a snapshot. */
43
- review(id: string, status: SnapshotStatus, userId: string): Promise<Snapshot>;
44
- }
45
- //#endregion
46
- export { type Snapshot, SnapshotCreateInput, SnapshotModel };
47
- //# sourceMappingURL=snapshot.d.mts.map
@@ -1,33 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { DatabaseAdapter } from "../adapter/database.mjs";
4
- import { Token } from "../schema.mjs";
5
- //#region src/models/token.d.ts
6
- /** Data operations for CI tokens. */
7
- declare class TokenModel {
8
- private readonly db;
9
- /**
10
- * @param db - Database adapter.
11
- */
12
- constructor(db: DatabaseAdapter);
13
- /**
14
- * Create a token record storing its hash.
15
- *
16
- * @param projectId - Project ID.
17
- * @param name - Token name.
18
- * @param hash - Hashed token value.
19
- * @returns The created token.
20
- */
21
- create(projectId: string, name: string, hash: string): Promise<Token>;
22
- /** List all tokens for a project. */
23
- list(projectId: string): Promise<Token[]>;
24
- /** Fetch a token by id within a project, or null if not found. */
25
- get(projectId: string, id: string): Promise<Token | null>;
26
- /** Fetch a token by its hashed value, or null if not found. */
27
- findByHash(hash: string): Promise<Token | null>;
28
- /** Delete a token by id. */
29
- remove(id: string): Promise<void>;
30
- }
31
- //#endregion
32
- export { type Token, TokenModel };
33
- //# sourceMappingURL=token.d.mts.map
@@ -1,38 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { DatabaseAdapter } from "../adapter/database.mjs";
4
- import { Webhook } from "../schema.mjs";
5
- //#region src/models/webhook.d.ts
6
- /** Input for creating a webhook subscription. */
7
- interface WebhookCreateInput {
8
- url: string;
9
- events?: string[];
10
- secret: string;
11
- }
12
- /** Data operations for webhook subscriptions. */
13
- declare class WebhookModel {
14
- private readonly db;
15
- /**
16
- * @param db - Database adapter.
17
- */
18
- constructor(db: DatabaseAdapter);
19
- /** List all webhooks for a project. */
20
- list(projectId: string): Promise<Webhook[]>;
21
- /**
22
- * Create a webhook subscription for a project.
23
- *
24
- * @param projectId - Project ID.
25
- * @param input - Webhook creation input.
26
- * @returns The created webhook.
27
- */
28
- create(projectId: string, input: WebhookCreateInput): Promise<Webhook>;
29
- /** Fetch a webhook by id scoped to a project, or null if not found. */
30
- get(projectId: string, id: string): Promise<Webhook | null>;
31
- /** Remove a webhook if it belongs to the given project. */
32
- remove(projectId: string, id: string): Promise<void>;
33
- /** Decode the JSON-serialized event list of a webhook. */
34
- static eventsOf(webhook: Webhook): string[];
35
- }
36
- //#endregion
37
- export { type Webhook, WebhookCreateInput, WebhookModel };
38
- //# sourceMappingURL=webhook.d.mts.map
@@ -1,31 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import { DatabaseAdapter } from "../adapter/database.mjs";
4
- import { StorageAdapter } from "../adapter/storage.mjs";
5
- import { Project } from "../schema.mjs";
6
- import { Logger } from "pino";
7
- //#region src/retention/purge.d.ts
8
- /** Options controlling which builds a retention purge removes. */
9
- interface PurgeOptions {
10
- ttlDays: number;
11
- keepLatestPerBranch: boolean;
12
- }
13
- /** Counts of builds and files removed by a retention purge. */
14
- interface PurgeResult {
15
- removedBuilds: number;
16
- removedFiles: number;
17
- }
18
- /** Removes expired transient builds while keeping baselines and persistent builds. */
19
- declare class Retention {
20
- private readonly db;
21
- private readonly storage;
22
- private readonly logger?;
23
- constructor(db: DatabaseAdapter, storage: StorageAdapter, logger?: Logger | undefined);
24
- purge(project: Project, options: PurgeOptions): Promise<PurgeResult>;
25
- private removeBuild;
26
- private latestPerBranch;
27
- private deleteBuildFiles;
28
- }
29
- //#endregion
30
- export { PurgeOptions, PurgeResult, Retention };
31
- //# sourceMappingURL=purge.d.mts.map
@@ -1,166 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { index, integer, real, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core";
5
- //#region src/schema-tables.ts
6
- /**
7
- * Narrow Drizzle table definitions for StoryShelf.
8
- *
9
- * Kept in this internal module (not a package entrypoint) so models and
10
- * query code keep exact column types. The `schema` entrypoint re-exports
11
- * explicitly annotated aliases; row types are hand-written in `schema.ts`
12
- * and pinned to these definitions by `schema-types.test.ts`.
13
- */
14
- /** Narrow `projects` table definition. */
15
- const projects = sqliteTable("projects", {
16
- id: text("id").primaryKey(),
17
- name: text("name").notNull(),
18
- slug: text("slug").notNull(),
19
- gitRepository: text("git_repository"),
20
- gitDefaultBranch: text("git_default_branch").notNull().default("main"),
21
- pixelThreshold: real("pixel_threshold").notNull().default(.1),
22
- maxDiffRatio: real("max_diff_ratio").notNull().default(.01),
23
- publicBranchRegex: text("public_branch_regex"),
24
- storybookMeta: text("storybook_meta").$type().default(null),
25
- executePlay: integer("execute_play", { mode: "boolean" }).notNull().default(false),
26
- playTimeoutMs: integer("play_timeout_ms").notNull().default(1e4),
27
- createdAt: text("created_at").notNull(),
28
- updatedAt: text("updated_at").notNull()
29
- });
30
- /** Narrow `project_status_configs` table definition. */
31
- const projectStatusConfigs = sqliteTable("project_status_configs", {
32
- id: text("id").primaryKey(),
33
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
34
- provider: text("provider").notNull(),
35
- config: text("config").notNull(),
36
- tokenEncrypted: text("token_encrypted").notNull(),
37
- createdAt: text("created_at").notNull(),
38
- updatedAt: text("updated_at").notNull()
39
- });
40
- /** Narrow `builds` table definition. */
41
- const builds = sqliteTable("builds", {
42
- id: text("id").primaryKey(),
43
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
44
- gitSha: text("git_sha").notNull(),
45
- gitBranch: text("git_branch").notNull(),
46
- isDefault: integer("is_default", { mode: "boolean" }).notNull().default(false),
47
- authorEmail: text("author_email"),
48
- authorName: text("author_name"),
49
- message: text("message"),
50
- public: integer("public", { mode: "boolean" }).notNull().default(false),
51
- status: text("status").$type().notNull().default("pending"),
52
- snapshotCount: integer("snapshot_count").notNull().default(0),
53
- changedCount: integer("changed_count").notNull().default(0),
54
- approvedCount: integer("approved_count").notNull().default(0),
55
- rejectedCount: integer("rejected_count").notNull().default(0),
56
- createdAt: text("created_at").notNull(),
57
- updatedAt: text("updated_at").notNull()
58
- }, (t) => [uniqueIndex("builds_project_gitsha_idx").on(t.projectId, t.gitSha), index("builds_git_branch_idx").on(t.gitBranch)]);
59
- /** Narrow `snapshots` table definition. */
60
- const snapshots = sqliteTable("snapshots", {
61
- id: text("id").primaryKey(),
62
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
63
- buildId: text("build_id").notNull().references(() => builds.id, { onDelete: "cascade" }),
64
- storyId: text("story_id").notNull(),
65
- storyName: text("story_name").notNull(),
66
- storyTitle: text("story_title").notNull(),
67
- storyImportPath: text("story_import_path"),
68
- viewportName: text("viewport_name").notNull().default("desktop"),
69
- viewportWidth: integer("viewport_width").notNull().default(1280),
70
- viewportHeight: integer("viewport_height").notNull().default(720),
71
- screenshotPath: text("screenshot_path").notNull(),
72
- diffPath: text("diff_path"),
73
- diffPixels: integer("diff_pixels"),
74
- diffRatio: real("diff_ratio"),
75
- diffPassed: integer("diff_passed", { mode: "boolean" }),
76
- status: text("status").$type().notNull().default("pending"),
77
- reviewedBy: text("reviewed_by"),
78
- reviewedAt: text("reviewed_at"),
79
- createdAt: text("created_at").notNull(),
80
- updatedAt: text("updated_at").notNull()
81
- }, (t) => [uniqueIndex("snapshots_build_story_viewport_idx").on(t.buildId, t.storyId, t.viewportName), index("snapshots_build_id_idx").on(t.buildId)]);
82
- /** Narrow `baselines` table definition. */
83
- const baselines = sqliteTable("baselines", {
84
- id: text("id").primaryKey(),
85
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
86
- storyId: text("story_id").notNull(),
87
- viewportName: text("viewport_name").notNull().default("desktop"),
88
- branch: text("branch").notNull(),
89
- snapshotId: text("snapshot_id"),
90
- screenshotPath: text("screenshot_path").notNull(),
91
- createdAt: text("created_at").notNull(),
92
- updatedAt: text("updated_at").notNull()
93
- }, (t) => [uniqueIndex("baselines_project_story_viewport_branch_idx").on(t.projectId, t.storyId, t.viewportName, t.branch), index("baselines_project_story_idx").on(t.projectId, t.storyId)]);
94
- /** Narrow `comments` table definition. */
95
- const comments = sqliteTable("comments", {
96
- id: text("id").primaryKey(),
97
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
98
- buildId: text("build_id").notNull().references(() => builds.id, { onDelete: "cascade" }),
99
- snapshotId: text("snapshot_id").references(() => snapshots.id, { onDelete: "cascade" }),
100
- userId: text("user_id").notNull().references(() => users.id, { onDelete: "cascade" }),
101
- body: text("body").notNull(),
102
- parentId: text("parent_id"),
103
- resolved: integer("resolved", { mode: "boolean" }).notNull().default(false),
104
- createdAt: text("created_at").notNull(),
105
- updatedAt: text("updated_at").notNull()
106
- }, (t) => [index("comments_build_id_idx").on(t.buildId)]);
107
- /** Narrow `label_types` table definition. */
108
- const labelTypes = sqliteTable("label_types", {
109
- id: text("id").primaryKey(),
110
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
111
- key: text("key").notNull(),
112
- name: text("name").notNull(),
113
- linkTemplate: text("link_template"),
114
- color: text("color"),
115
- createdAt: text("created_at").notNull()
116
- }, (t) => [uniqueIndex("label_types_project_key_idx").on(t.projectId, t.key)]);
117
- /** Narrow `build_labels` table definition. */
118
- const buildLabels = sqliteTable("build_labels", {
119
- id: text("id").primaryKey(),
120
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
121
- buildId: text("build_id").notNull().references(() => builds.id, { onDelete: "cascade" }),
122
- typeKey: text("type_key").notNull(),
123
- value: text("value").notNull(),
124
- createdAt: text("created_at").notNull()
125
- }, (t) => [uniqueIndex("build_labels_build_type_value_idx").on(t.buildId, t.typeKey, t.value)]);
126
- /** Narrow `tokens` table definition. */
127
- const tokens = sqliteTable("tokens", {
128
- id: text("id").primaryKey(),
129
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
130
- name: text("name").notNull(),
131
- hash: text("hash").notNull(),
132
- lastUsedAt: text("last_used_at"),
133
- createdAt: text("created_at").notNull()
134
- });
135
- /** Narrow `webhooks` table definition. */
136
- const webhooks = sqliteTable("webhooks", {
137
- id: text("id").primaryKey(),
138
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
139
- url: text("url").notNull(),
140
- secret: text("secret").notNull(),
141
- events: text("events"),
142
- createdAt: text("created_at").notNull(),
143
- updatedAt: text("updated_at").notNull()
144
- });
145
- /** Narrow `users` table definition. */
146
- const users = sqliteTable("users", {
147
- id: text("id").primaryKey(),
148
- email: text("email").notNull(),
149
- name: text("name").notNull(),
150
- avatarUrl: text("avatar_url"),
151
- role: text("role").$type().notNull().default("member"),
152
- lastLoginAt: text("last_login_at"),
153
- createdAt: text("created_at").notNull()
154
- });
155
- /** Narrow `project_members` table definition. */
156
- const projectMembers = sqliteTable("project_members", {
157
- id: text("id").primaryKey(),
158
- projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
159
- userId: text("user_id").notNull().references(() => users.id, { onDelete: "cascade" }),
160
- role: text("role").$type().notNull().default("viewer"),
161
- createdAt: text("created_at").notNull()
162
- }, (t) => [uniqueIndex("project_members_project_user_idx").on(t.projectId, t.userId)]);
163
- //#endregion
164
- export { baselines, buildLabels, builds, comments, labelTypes, projectMembers, projectStatusConfigs, projects, snapshots, tokens, users, webhooks };
165
-
166
- //# sourceMappingURL=schema-tables.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-tables.mjs","names":[],"sources":["../src/schema-tables.ts"],"sourcesContent":["import { index, integer, real, sqliteTable, text, uniqueIndex } from \"drizzle-orm/sqlite-core\";\n\nimport type { BuildStatus, ProjectRole, SiteRole, SnapshotStatus } from \"./types.ts\";\n\n/**\n * Narrow Drizzle table definitions for StoryShelf.\n *\n * Kept in this internal module (not a package entrypoint) so models and\n * query code keep exact column types. The `schema` entrypoint re-exports\n * explicitly annotated aliases; row types are hand-written in `schema.ts`\n * and pinned to these definitions by `schema-types.test.ts`.\n */\n\n/** Narrow `projects` table definition. */\nexport const projects = sqliteTable(\"projects\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n slug: text(\"slug\").notNull(),\n gitRepository: text(\"git_repository\"),\n gitDefaultBranch: text(\"git_default_branch\").notNull().default(\"main\"),\n pixelThreshold: real(\"pixel_threshold\").notNull().default(0.1),\n maxDiffRatio: real(\"max_diff_ratio\").notNull().default(0.01),\n publicBranchRegex: text(\"public_branch_regex\"),\n storybookMeta: text(\"storybook_meta\").$type<string | null | undefined>().default(null),\n executePlay: integer(\"execute_play\", { mode: \"boolean\" }).notNull().default(false),\n playTimeoutMs: integer(\"play_timeout_ms\").notNull().default(10_000),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n});\n\n/** Narrow `project_status_configs` table definition. */\nexport const projectStatusConfigs = sqliteTable(\"project_status_configs\", {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n config: text(\"config\").notNull(),\n tokenEncrypted: text(\"token_encrypted\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n});\n\n/** Narrow `builds` table definition. */\nexport const builds = sqliteTable(\n \"builds\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n gitSha: text(\"git_sha\").notNull(),\n gitBranch: text(\"git_branch\").notNull(),\n isDefault: integer(\"is_default\", { mode: \"boolean\" }).notNull().default(false),\n authorEmail: text(\"author_email\"),\n authorName: text(\"author_name\"),\n message: text(\"message\"),\n public: integer(\"public\", { mode: \"boolean\" }).notNull().default(false),\n status: text(\"status\").$type<BuildStatus>().notNull().default(\"pending\"),\n snapshotCount: integer(\"snapshot_count\").notNull().default(0),\n changedCount: integer(\"changed_count\").notNull().default(0),\n approvedCount: integer(\"approved_count\").notNull().default(0),\n rejectedCount: integer(\"rejected_count\").notNull().default(0),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n uniqueIndex(\"builds_project_gitsha_idx\").on(t.projectId, t.gitSha),\n index(\"builds_git_branch_idx\").on(t.gitBranch),\n ],\n);\n\n/** Narrow `snapshots` table definition. */\nexport const snapshots = sqliteTable(\n \"snapshots\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n buildId: text(\"build_id\")\n .notNull()\n .references(() => builds.id, { onDelete: \"cascade\" }),\n storyId: text(\"story_id\").notNull(),\n storyName: text(\"story_name\").notNull(),\n storyTitle: text(\"story_title\").notNull(),\n storyImportPath: text(\"story_import_path\"),\n viewportName: text(\"viewport_name\").notNull().default(\"desktop\"),\n viewportWidth: integer(\"viewport_width\").notNull().default(1280),\n viewportHeight: integer(\"viewport_height\").notNull().default(720),\n screenshotPath: text(\"screenshot_path\").notNull(),\n diffPath: text(\"diff_path\"),\n diffPixels: integer(\"diff_pixels\"),\n diffRatio: real(\"diff_ratio\"),\n diffPassed: integer(\"diff_passed\", { mode: \"boolean\" }),\n status: text(\"status\").$type<SnapshotStatus>().notNull().default(\"pending\"),\n reviewedBy: text(\"reviewed_by\"),\n reviewedAt: text(\"reviewed_at\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n uniqueIndex(\"snapshots_build_story_viewport_idx\").on(t.buildId, t.storyId, t.viewportName),\n index(\"snapshots_build_id_idx\").on(t.buildId),\n ],\n);\n\n/** Narrow `baselines` table definition. */\nexport const baselines = sqliteTable(\n \"baselines\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n storyId: text(\"story_id\").notNull(),\n viewportName: text(\"viewport_name\").notNull().default(\"desktop\"),\n branch: text(\"branch\").notNull(),\n snapshotId: text(\"snapshot_id\"),\n screenshotPath: text(\"screenshot_path\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n uniqueIndex(\"baselines_project_story_viewport_branch_idx\").on(t.projectId, t.storyId, t.viewportName, t.branch),\n index(\"baselines_project_story_idx\").on(t.projectId, t.storyId),\n ],\n);\n\n/** Narrow `comments` table definition. */\nexport const comments = sqliteTable(\n \"comments\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n buildId: text(\"build_id\")\n .notNull()\n .references(() => builds.id, { onDelete: \"cascade\" }),\n snapshotId: text(\"snapshot_id\").references(() => snapshots.id, { onDelete: \"cascade\" }),\n userId: text(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n body: text(\"body\").notNull(),\n parentId: text(\"parent_id\"),\n resolved: integer(\"resolved\", { mode: \"boolean\" }).notNull().default(false),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [index(\"comments_build_id_idx\").on(t.buildId)],\n);\n\n/** Narrow `label_types` table definition. */\nexport const labelTypes = sqliteTable(\n \"label_types\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n key: text(\"key\").notNull(),\n name: text(\"name\").notNull(),\n linkTemplate: text(\"link_template\"),\n color: text(\"color\"),\n createdAt: text(\"created_at\").notNull(),\n },\n (t) => [uniqueIndex(\"label_types_project_key_idx\").on(t.projectId, t.key)],\n);\n\n/** Narrow `build_labels` table definition. */\nexport const buildLabels = sqliteTable(\n \"build_labels\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n buildId: text(\"build_id\")\n .notNull()\n .references(() => builds.id, { onDelete: \"cascade\" }),\n typeKey: text(\"type_key\").notNull(),\n value: text(\"value\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n },\n (t) => [uniqueIndex(\"build_labels_build_type_value_idx\").on(t.buildId, t.typeKey, t.value)],\n);\n\n/** Narrow `tokens` table definition. */\nexport const tokens = sqliteTable(\"tokens\", {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n hash: text(\"hash\").notNull(),\n lastUsedAt: text(\"last_used_at\"),\n createdAt: text(\"created_at\").notNull(),\n});\n\n/** Narrow `webhooks` table definition. */\nexport const webhooks = sqliteTable(\"webhooks\", {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n url: text(\"url\").notNull(),\n secret: text(\"secret\").notNull(),\n events: text(\"events\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n});\n\n/** Narrow `users` table definition. */\nexport const users = sqliteTable(\"users\", {\n id: text(\"id\").primaryKey(),\n email: text(\"email\").notNull(),\n name: text(\"name\").notNull(),\n avatarUrl: text(\"avatar_url\"),\n role: text(\"role\").$type<SiteRole>().notNull().default(\"member\"),\n lastLoginAt: text(\"last_login_at\"),\n createdAt: text(\"created_at\").notNull(),\n});\n\n/** Narrow `project_members` table definition. */\nexport const projectMembers = sqliteTable(\n \"project_members\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n userId: text(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n role: text(\"role\").$type<ProjectRole>().notNull().default(\"viewer\"),\n createdAt: text(\"created_at\").notNull(),\n },\n (t) => [uniqueIndex(\"project_members_project_user_idx\").on(t.projectId, t.userId)],\n);\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"components.mjs","names":[],"sources":["../../src/ui/components.tsx"],"sourcesContent":["import type { FC } from \"hono/jsx\";\n\n/* eslint-disable promise-function-async -- Hono JSX components return HtmlEscapedString | Promise<HtmlEscapedString> */\n\ntype ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype BadgeTone = \"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\";\n\n/** Button or link styled as a button (renders an anchor when `href` is set). */\nexport const Button: FC<{\n variant?: ButtonVariant;\n type?: \"button\" | \"submit\" | \"reset\";\n href?: string;\n disabled?: boolean;\n children?: unknown;\n [key: string]: unknown;\n}> = ({ variant = \"primary\", type = \"button\", href, disabled, children, ...rest }) => {\n const className = `btn btn--${variant}`;\n if (href) {\n return (\n <a class={className} href={href} aria-disabled={disabled ? \"true\" : undefined} {...rest}>\n {children}\n </a>\n );\n }\n return (\n <button class={className} type={type} disabled={disabled} {...rest}>\n {children}\n </button>\n );\n};\n\n/** Small status pill with a color tone. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const Badge: FC<{ tone?: BadgeTone; children?: unknown }> = ({ tone = \"neutral\", children }) => {\n return <span class={`badge badge--${tone}`}>{children}</span>;\n};\n\n/** Map a build or snapshot status string to its badge tone. */\nexport function statusTone(status: string): BadgeTone {\n if (status === \"approved\" || status === \"unchanged\") {\n return \"success\";\n }\n if (status === \"rejected\" || status === \"failed\") {\n return \"danger\";\n }\n if (status === \"changed\" || status === \"new\" || status === \"reviewing\") {\n return \"warning\";\n }\n if (status === \"capturing\" || status === \"comparing\" || status === \"pending\") {\n return \"info\";\n }\n return \"neutral\";\n}\n\n/** Card container, padded by default. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const Card: FC<{ children?: unknown; padded?: boolean }> = ({ children, padded = true }) => {\n return <div class={padded ? \"card card--padded\" : \"card\"}>{children}</div>;\n};\n\n/** Alert banner with an optional title. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const Alert: FC<{ tone?: BadgeTone; title?: string; children?: unknown }> = ({ tone = \"info\", title, children }) => {\n return (\n <div class={`alert alert--${tone}`} role=\"alert\">\n {title ? <strong class=\"alert__title\">{title}</strong> : null}\n <div class=\"alert__body\">{children}</div>\n </div>\n );\n};\n\n// eslint-disable-next-line promise-function-async -- Hono JSX components return HtmlEscapedString | Promise<HtmlEscapedString>\nconst FieldAssistant: FC<{ name: string; error: string | undefined; hint: string | undefined }> = ({ name, error, hint }) => {\n if (error) {\n return (\n <p class=\"field__error\" id={`${name}-error`} role=\"alert\">\n {error}\n </p>\n );\n }\n if (hint) {\n return (\n <p class=\"field__hint\" id={`${name}-hint`}>\n {hint}\n </p>\n );\n }\n return null;\n};\n\nfunction fieldDescribedBy(name: string, error: string | undefined, hint: string | undefined): string | undefined {\n if (error) {\n return `${name}-error`;\n }\n if (hint) {\n return `${name}-hint`;\n }\n return undefined;\n}\n\n/** Labeled text input with error and hint states. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const Field: FC<{\n label: string;\n name: string;\n type?: string;\n value?: string;\n placeholder?: string;\n required?: boolean;\n error?: string;\n hint?: string;\n autocomplete?: string;\n}> = ({ label, name, type = \"text\", value, placeholder, required, error, hint, autocomplete }) => {\n return (\n <div class=\"field\">\n <label class=\"field__label\" for={name}>\n {label}\n {required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n <input\n class={`field__input ${error ? \"field__input--error\" : \"\"}`}\n id={name}\n name={name}\n type={type}\n value={value}\n placeholder={placeholder}\n required={required}\n aria-invalid={error ? \"true\" : undefined}\n aria-describedby={fieldDescribedBy(name, error, hint)}\n autocomplete={autocomplete}\n />\n <FieldAssistant name={name} error={error} hint={hint} />\n </div>\n );\n};\n\n/** Labeled textarea with error and hint states. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const TextareaField: FC<{\n label: string;\n name: string;\n value?: string;\n placeholder?: string;\n rows?: number;\n hint?: string;\n error?: string;\n}> = ({ label, name, value, placeholder, rows = 3, hint, error }) => {\n return (\n <div class=\"field\">\n <label class=\"field__label\" for={name}>\n {label}\n </label>\n <textarea\n class={`field__input field__input--textarea ${error ? \"field__input--error\" : \"\"}`}\n id={name}\n name={name}\n placeholder={placeholder}\n rows={rows}\n aria-invalid={error ? \"true\" : undefined}\n aria-describedby={fieldDescribedBy(name, error, hint)}\n >\n {value}\n </textarea>\n <FieldAssistant name={name} error={error} hint={hint} />\n </div>\n );\n};\n\n/** Labeled select dropdown with an optional hint. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const SelectField: FC<{\n label: string;\n name: string;\n value?: string;\n options: { value: string; label: string }[];\n hint?: string;\n}> = ({ label, name, value, options, hint }) => {\n return (\n <div class=\"field\">\n <label class=\"field__label\" for={name}>\n {label}\n </label>\n <select class=\"field__input\" id={name} name={name} aria-describedby={hint ? `${name}-hint` : undefined}>\n {options.map((opt) => (\n <option value={opt.value} selected={opt.value === value}>\n {opt.label}\n </option>\n ))}\n </select>\n {hint ? (\n <p class=\"field__hint\" id={`${name}-hint`}>\n {hint}\n </p>\n ) : null}\n </div>\n );\n};\n\n/** Page header with breadcrumbs, title, description, and actions. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const PageHeader: FC<{\n title: string;\n description?: string;\n actions?: unknown;\n breadcrumbs?: { label: string; href?: string }[];\n}> = ({ title, description, actions, breadcrumbs }) => {\n return (\n <div class=\"page-header\">\n {breadcrumbs && breadcrumbs.length > 0 ? (\n <nav class=\"breadcrumbs\" aria-label=\"Breadcrumb\">\n <ol>\n {breadcrumbs.map((crumb, index) => (\n <li key={String(index)}>\n {crumb.href ? <a href={crumb.href}>{crumb.label}</a> : <span aria-current=\"page\">{crumb.label}</span>}\n </li>\n ))}\n </ol>\n </nav>\n ) : null}\n <div class=\"page-header__row\">\n <div>\n <h1 class=\"page-header__title\">{title}</h1>\n {description ? <p class=\"page-header__desc\">{description}</p> : null}\n </div>\n {actions ? <div class=\"page-header__actions\">{actions}</div> : null}\n </div>\n </div>\n );\n};\n\n/** Centered empty state with an optional call-to-action. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const EmptyState: FC<{ title: string; description?: string; action?: unknown }> = ({ title, description, action }) => {\n return (\n <div class=\"empty\">\n <h2 class=\"empty__title\">{title}</h2>\n {description ? <p class=\"empty__desc\">{description}</p> : null}\n {action ? <div class=\"empty__action\">{action}</div> : null}\n </div>\n );\n};\n\n/** Tab navigation bar for section switching. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const Tabs: FC<{\n tabs: { label: string; href: string; active?: boolean }[];\n}> = ({ tabs }) => {\n return (\n <nav class=\"tabs\" aria-label=\"Sections\">\n {tabs.map((tab) => (\n <a class={`tabs__link ${tab.active ? \"tabs__link--active\" : \"\"}`} href={tab.href} aria-current={tab.active ? \"page\" : undefined}>\n {tab.label}\n </a>\n ))}\n </nav>\n );\n};\n\n/** Centered statistic value with a label. */\n// eslint-disable-next-line promise-function-async -- JSX component return type\nexport const Stat: FC<{ label: string; value: string | number }> = ({ label, value }) => {\n return (\n <div class=\"stat\">\n <div class=\"stat__value\">{String(value)}</div>\n <div class=\"stat__label\">{label}</div>\n </div>\n );\n};\n"],"mappings":";;;;;;AAiCA,MAAa,SAAuD,EAAE,OAAO,WAAW,eAAe;CACrG,OAAO,oBAAC,QAAD;EAAM,OAAO,gBAAgB;EAAS;CAAe,CAAA;AAC9D;;AAGA,SAAgB,WAAW,QAA2B;CACpD,IAAI,WAAW,cAAc,WAAW,aACtC,OAAO;CAET,IAAI,WAAW,cAAc,WAAW,UACtC,OAAO;CAET,IAAI,WAAW,aAAa,WAAW,SAAS,WAAW,aACzD,OAAO;CAET,IAAI,WAAW,eAAe,WAAW,eAAe,WAAW,WACjE,OAAO;CAET,OAAO;AACT;AAoBA,MAAM,kBAA6F,EAAE,MAAM,OAAO,WAAW;CAC3H,IAAI,OACF,OACE,oBAAC,KAAD;EAAG,OAAM;EAAe,IAAI,GAAG,KAAK;EAAS,MAAK;EAC/C,UAAA;CACA,CAAA;CAGP,IAAI,MACF,OACE,oBAAC,KAAD;EAAG,OAAM;EAAc,IAAI,GAAG,KAAK;EAChC,UAAA;CACA,CAAA;CAGP,OAAO;AACT;AAEA,SAAS,iBAAiB,MAAc,OAA2B,MAA8C;CAC/G,IAAI,OACF,OAAO,GAAG,KAAK;CAEjB,IAAI,MACF,OAAO,GAAG,KAAK;AAGnB;;AAIA,MAAa,SAUP,EAAE,OAAO,MAAM,OAAO,QAAQ,OAAO,aAAa,UAAU,OAAO,MAAM,mBAAmB;CAChG,OACE,qBAAC,OAAD;EAAK,OAAM;EAAX,UAAA;GACE,qBAAC,SAAD;IAAO,OAAM;IAAe,KAAK;IAAjC,UAAA,CACG,OACA,WAAW,oBAAC,QAAD;KAAM,eAAY;KAAO,UAAA;IAAQ,CAAA,IAAI,IAC5C;;GACP,oBAAC,SAAD;IACE,OAAO,gBAAgB,QAAQ,wBAAwB;IACvD,IAAI;IACE;IACA;IACC;IACM;IACH;IACV,gBAAc,QAAQ,SAAS,KAAA;IAC/B,oBAAkB,iBAAiB,MAAM,OAAO,IAAI;IACtC;GACf,CAAA;GACD,oBAAC,gBAAD;IAAsB;IAAa;IAAa;GAAO,CAAA;EACpD;;AAET;;AAIA,MAAa,iBAQP,EAAE,OAAO,MAAM,OAAO,aAAa,OAAO,GAAG,MAAM,YAAY;CACnE,OACE,qBAAC,OAAD;EAAK,OAAM;EAAX,UAAA;GACE,oBAAC,SAAD;IAAO,OAAM;IAAe,KAAK;IAC9B,UAAA;GACI,CAAA;GACP,oBAAC,YAAD;IACE,OAAO,uCAAuC,QAAQ,wBAAwB;IAC9E,IAAI;IACE;IACO;IACP;IACN,gBAAc,QAAQ,SAAS,KAAA;IAC/B,oBAAkB,iBAAiB,MAAM,OAAO,IAAI;IAEnD,UAAA;GACO,CAAA;GACV,oBAAC,gBAAD;IAAsB;IAAa;IAAa;GAAO,CAAA;EACpD;;AAET;;AAIA,MAAa,eAMP,EAAE,OAAO,MAAM,OAAO,SAAS,WAAW;CAC9C,OACE,qBAAC,OAAD;EAAK,OAAM;EAAX,UAAA;GACE,oBAAC,SAAD;IAAO,OAAM;IAAe,KAAK;IAC9B,UAAA;GACI,CAAA;GACP,oBAAC,UAAD;IAAQ,OAAM;IAAe,IAAI;IAAY;IAAM,oBAAkB,OAAO,GAAG,KAAK,SAAS,KAAA;IAC1F,UAAA,QAAQ,KAAK,QACZ,oBAAC,UAAD;KAAQ,OAAO,IAAI;KAAO,UAAU,IAAI,UAAU;KAC/C,UAAA,IAAI;IACC,CAAA,CACT;GACK,CAAA;GACP,OACC,oBAAC,KAAD;IAAG,OAAM;IAAc,IAAI,GAAG,KAAK;IAChC,UAAA;GACA,CAAA,IACD;EACD;;AAET"}
@@ -1,9 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- import "hono/jsx";
4
- //#region src/ui/document.d.ts
5
- /** Rendered HTML content returned by page components. */
6
- type RenderedContent = string | Promise<string>;
7
- //#endregion
8
- export { RenderedContent };
9
- //# sourceMappingURL=document.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.mjs","names":[],"sources":["../../src/utils/paths.ts"],"sourcesContent":["/** Storage path for a captured snapshot screenshot. */\nexport function screenshotPath(projectId: string, buildId: string, storyId: string, viewport: string): string {\n return `${projectId}/builds/${buildId}/screenshots/${storyId}/${viewport}.png`;\n}\n\n/** Storage path for a snapshot diff overlay image. */\nexport function diffPath(projectId: string, buildId: string, storyId: string, viewport: string): string {\n return `${projectId}/builds/${buildId}/diffs/${storyId}/${viewport}.png`;\n}\n\n/** Storage path for a branch baseline screenshot. */\nexport function baselinePath(projectId: string, branch: string, storyId: string, viewport: string): string {\n return `${projectId}/baselines/${branch}/${storyId}/${viewport}.png`;\n}\n\n/** Storage prefix for an extracted published Storybook. */\nexport function storybookDir(projectId: string, buildId: string): string {\n return `${projectId}/builds/${buildId}/storybook`;\n}\n\n/** Storage path for an uploaded Storybook zip. */\nexport function storybookZipPath(projectId: string, buildId: string): string {\n return `${projectId}/builds/${buildId}/storybook.zip`;\n}\n"],"mappings":";;;;;AACA,SAAgB,eAAe,WAAmB,SAAiB,SAAiB,UAA0B;CAC5G,OAAO,GAAG,UAAU,UAAU,QAAQ,eAAe,QAAQ,GAAG,SAAS;AAC3E;;AAGA,SAAgB,SAAS,WAAmB,SAAiB,SAAiB,UAA0B;CACtG,OAAO,GAAG,UAAU,UAAU,QAAQ,SAAS,QAAQ,GAAG,SAAS;AACrE;;AAGA,SAAgB,aAAa,WAAmB,QAAgB,SAAiB,UAA0B;CACzG,OAAO,GAAG,UAAU,aAAa,OAAO,GAAG,QAAQ,GAAG,SAAS;AACjE;;AAGA,SAAgB,aAAa,WAAmB,SAAyB;CACvE,OAAO,GAAG,UAAU,UAAU,QAAQ;AACxC;;AAGA,SAAgB,iBAAiB,WAAmB,SAAyB;CAC3E,OAAO,GAAG,UAAU,UAAU,QAAQ;AACxC"}
@@ -1,10 +0,0 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
- //#region src/utils/ulid.d.ts
4
- /** Generate a sortable, collision-resistant ULID. */
5
- declare function ulid(): string;
6
- /** Convert a name to a URL-safe slug of at most 63 characters. */
7
- declare function slugify(value: string): string;
8
- //#endregion
9
- export { slugify, ulid };
10
- //# sourceMappingURL=ulid.d.mts.map
File without changes
File without changes