storybooker 0.19.4 → 0.22.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +40 -18
  2. package/dist/adapters/_internal/queue.d.mts +127 -0
  3. package/dist/aws-dynamodb.d.mts +22 -0
  4. package/dist/aws-dynamodb.mjs +118 -0
  5. package/dist/aws-dynamodb.mjs.map +1 -0
  6. package/dist/aws-s3.d.mts +20 -0
  7. package/dist/aws-s3.mjs +96 -0
  8. package/dist/aws-s3.mjs.map +1 -0
  9. package/dist/azure-blob-storage.d.mts +20 -0
  10. package/dist/azure-blob-storage.mjs +126 -0
  11. package/dist/azure-blob-storage.mjs.map +1 -0
  12. package/dist/azure-cosmos-db.d.mts +23 -0
  13. package/dist/azure-cosmos-db.mjs +87 -0
  14. package/dist/azure-cosmos-db.mjs.map +1 -0
  15. package/dist/azure-data-tables.d.mts +23 -0
  16. package/dist/azure-data-tables.mjs +127 -0
  17. package/dist/azure-data-tables.mjs.map +1 -0
  18. package/dist/azure-easy-auth.d.mts +50 -0
  19. package/dist/azure-easy-auth.mjs +88 -0
  20. package/dist/azure-easy-auth.mjs.map +1 -0
  21. package/dist/azure-functions.d.mts +62 -0
  22. package/dist/azure-functions.mjs +147 -0
  23. package/dist/azure-functions.mjs.map +1 -0
  24. package/dist/fs.d.mts +37 -0
  25. package/dist/fs.mjs +240 -0
  26. package/dist/fs.mjs.map +1 -0
  27. package/dist/gcp-big-table.d.mts +23 -0
  28. package/dist/gcp-big-table.mjs +92 -0
  29. package/dist/gcp-big-table.mjs.map +1 -0
  30. package/dist/gcp-firestore.d.mts +22 -0
  31. package/dist/gcp-firestore.mjs +87 -0
  32. package/dist/gcp-firestore.mjs.map +1 -0
  33. package/dist/gcp-storage.d.mts +20 -0
  34. package/dist/gcp-storage.mjs +96 -0
  35. package/dist/gcp-storage.mjs.map +1 -0
  36. package/dist/handlers/handle-process-zip.mjs +90 -0
  37. package/dist/handlers/handle-process-zip.mjs.map +1 -0
  38. package/dist/handlers/handle-purge.d.mts +12 -0
  39. package/dist/handlers/handle-purge.mjs +36 -0
  40. package/dist/handlers/handle-purge.mjs.map +1 -0
  41. package/dist/handlers/handle-serve-storybook.mjs +94 -0
  42. package/dist/handlers/handle-serve-storybook.mjs.map +1 -0
  43. package/dist/index.d.mts +28 -0
  44. package/dist/index.mjs +62 -0
  45. package/dist/index.mjs.map +1 -0
  46. package/dist/models/builds-model.mjs +248 -0
  47. package/dist/models/builds-model.mjs.map +1 -0
  48. package/dist/models/builds-schema.d.mts +171 -0
  49. package/dist/models/builds-schema.mjs +67 -0
  50. package/dist/models/builds-schema.mjs.map +1 -0
  51. package/dist/models/projects-model.mjs +122 -0
  52. package/dist/models/projects-model.mjs.map +1 -0
  53. package/dist/models/projects-schema.d.mts +70 -0
  54. package/dist/models/projects-schema.mjs +37 -0
  55. package/dist/models/projects-schema.mjs.map +1 -0
  56. package/dist/models/tags-model.mjs +110 -0
  57. package/dist/models/tags-model.mjs.map +1 -0
  58. package/dist/models/tags-schema.d.mts +76 -0
  59. package/dist/models/tags-schema.mjs +34 -0
  60. package/dist/models/tags-schema.mjs.map +1 -0
  61. package/dist/models/~model.mjs +43 -0
  62. package/dist/models/~model.mjs.map +1 -0
  63. package/dist/models/~shared-schema.d.mts +1 -0
  64. package/dist/models/~shared-schema.mjs +20 -0
  65. package/dist/models/~shared-schema.mjs.map +1 -0
  66. package/dist/mysql.d.mts +39 -0
  67. package/dist/mysql.mjs +151 -0
  68. package/dist/mysql.mjs.map +1 -0
  69. package/dist/redis.d.mts +33 -0
  70. package/dist/redis.mjs +118 -0
  71. package/dist/redis.mjs.map +1 -0
  72. package/dist/routers/account-router.mjs +91 -0
  73. package/dist/routers/account-router.mjs.map +1 -0
  74. package/dist/routers/builds-router.mjs +347 -0
  75. package/dist/routers/builds-router.mjs.map +1 -0
  76. package/dist/routers/projects-router.mjs +236 -0
  77. package/dist/routers/projects-router.mjs.map +1 -0
  78. package/dist/routers/root-router.mjs +108 -0
  79. package/dist/routers/root-router.mjs.map +1 -0
  80. package/dist/routers/tags-router.mjs +269 -0
  81. package/dist/routers/tags-router.mjs.map +1 -0
  82. package/dist/routers/tasks-router.mjs +71 -0
  83. package/dist/routers/tasks-router.mjs.map +1 -0
  84. package/dist/urls.d.mts +47 -0
  85. package/dist/urls.mjs +208 -0
  86. package/dist/urls.mjs.map +1 -0
  87. package/dist/utils/adapter-utils.d.mts +14 -0
  88. package/dist/utils/adapter-utils.mjs +14 -0
  89. package/dist/utils/adapter-utils.mjs.map +1 -0
  90. package/dist/utils/auth.mjs +25 -0
  91. package/dist/utils/auth.mjs.map +1 -0
  92. package/dist/utils/error.d.mts +21 -0
  93. package/dist/utils/error.mjs +109 -0
  94. package/dist/utils/error.mjs.map +1 -0
  95. package/dist/utils/file-utils.mjs +16 -0
  96. package/dist/utils/file-utils.mjs.map +1 -0
  97. package/dist/utils/openapi-utils.mjs +45 -0
  98. package/dist/utils/openapi-utils.mjs.map +1 -0
  99. package/dist/utils/request.mjs +35 -0
  100. package/dist/utils/request.mjs.map +1 -0
  101. package/dist/utils/response.mjs +24 -0
  102. package/dist/utils/response.mjs.map +1 -0
  103. package/dist/utils/store.mjs +54 -0
  104. package/dist/utils/store.mjs.map +1 -0
  105. package/dist/utils/ui-utils.mjs +38 -0
  106. package/dist/utils/ui-utils.mjs.map +1 -0
  107. package/dist/utils/url-utils.d.mts +10 -0
  108. package/dist/utils/url-utils.mjs +54 -0
  109. package/dist/utils/url-utils.mjs.map +1 -0
  110. package/dist/~internal/adapter/auth.d.mts +123 -0
  111. package/dist/~internal/adapter/auth.mjs +20 -0
  112. package/dist/~internal/adapter/auth.mjs.map +1 -0
  113. package/dist/~internal/adapter/database.d.mts +240 -0
  114. package/dist/~internal/adapter/database.mjs +63 -0
  115. package/dist/~internal/adapter/database.mjs.map +1 -0
  116. package/dist/~internal/adapter/logger.d.mts +34 -0
  117. package/dist/~internal/adapter/logger.mjs +13 -0
  118. package/dist/~internal/adapter/logger.mjs.map +1 -0
  119. package/dist/~internal/adapter/storage.d.mts +208 -0
  120. package/dist/~internal/adapter/storage.mjs +63 -0
  121. package/dist/~internal/adapter/storage.mjs.map +1 -0
  122. package/dist/~internal/adapter/ui.d.mts +109 -0
  123. package/dist/~internal/adapter/ui.mjs +1 -0
  124. package/dist/~internal/adapter.d.mts +8 -0
  125. package/dist/~internal/adapter.mjs +6 -0
  126. package/dist/~internal/constants.d.mts +24 -0
  127. package/dist/~internal/constants.mjs +32 -0
  128. package/dist/~internal/constants.mjs.map +1 -0
  129. package/dist/~internal/mimes.d.mts +449 -0
  130. package/dist/~internal/mimes.mjs +454 -0
  131. package/dist/~internal/mimes.mjs.map +1 -0
  132. package/dist/~internal/router.d.mts +1651 -0
  133. package/dist/~internal/router.mjs +39 -0
  134. package/dist/~internal/router.mjs.map +1 -0
  135. package/dist/~internal/types.d.mts +77 -0
  136. package/dist/~internal/types.mjs +1 -0
  137. package/dist/~internal/utils.d.mts +4 -0
  138. package/dist/~internal/utils.mjs +5 -0
  139. package/openapi.json +3162 -0
  140. package/package.json +148 -27
  141. package/src/adapters/_internal/auth.ts +135 -0
  142. package/src/adapters/_internal/database.ts +241 -0
  143. package/src/adapters/_internal/index.ts +8 -0
  144. package/src/adapters/_internal/logger.ts +41 -0
  145. package/src/adapters/_internal/queue.ts +151 -0
  146. package/src/adapters/_internal/storage.ts +197 -0
  147. package/src/adapters/_internal/ui.ts +103 -0
  148. package/src/adapters/aws-dynamodb.ts +201 -0
  149. package/src/adapters/aws-s3.ts +160 -0
  150. package/src/adapters/azure-blob-storage.ts +223 -0
  151. package/src/adapters/azure-cosmos-db.ts +158 -0
  152. package/src/adapters/azure-data-tables.ts +223 -0
  153. package/src/adapters/azure-easy-auth.ts +174 -0
  154. package/src/adapters/azure-functions.ts +242 -0
  155. package/src/adapters/fs.ts +398 -0
  156. package/src/adapters/gcp-big-table.ts +157 -0
  157. package/src/adapters/gcp-firestore.ts +146 -0
  158. package/src/adapters/gcp-storage.ts +141 -0
  159. package/src/adapters/mysql.ts +296 -0
  160. package/src/adapters/redis.ts +242 -0
  161. package/src/handlers/handle-process-zip.ts +117 -0
  162. package/src/handlers/handle-purge.ts +65 -0
  163. package/src/handlers/handle-serve-storybook.ts +101 -0
  164. package/src/index.ts +81 -16
  165. package/src/mocks/mock-auth-service.ts +51 -0
  166. package/src/mocks/mock-store.ts +26 -0
  167. package/src/models/builds-model.ts +373 -0
  168. package/src/models/builds-schema.ts +84 -0
  169. package/src/models/projects-model.ts +177 -0
  170. package/src/models/projects-schema.ts +69 -0
  171. package/src/models/tags-model.ts +138 -0
  172. package/src/models/tags-schema.ts +45 -0
  173. package/src/models/~model.ts +79 -0
  174. package/src/models/~shared-schema.ts +14 -0
  175. package/src/routers/_app-router.ts +57 -0
  176. package/src/routers/account-router.ts +136 -0
  177. package/src/routers/builds-router.ts +464 -0
  178. package/src/routers/projects-router.ts +309 -0
  179. package/src/routers/root-router.ts +127 -0
  180. package/src/routers/tags-router.ts +339 -0
  181. package/src/routers/tasks-router.ts +75 -0
  182. package/src/types.ts +107 -0
  183. package/src/urls.ts +327 -0
  184. package/src/utils/adapter-utils.ts +26 -0
  185. package/src/utils/auth.test.ts +71 -0
  186. package/src/utils/auth.ts +39 -0
  187. package/src/utils/constants.ts +31 -0
  188. package/src/utils/date-utils.ts +10 -0
  189. package/src/utils/error.test.ts +86 -0
  190. package/src/utils/error.ts +140 -0
  191. package/src/utils/file-utils.test.ts +65 -0
  192. package/src/utils/file-utils.ts +43 -0
  193. package/src/utils/index.ts +3 -0
  194. package/src/utils/mime-utils.ts +457 -0
  195. package/src/utils/openapi-utils.ts +49 -0
  196. package/src/utils/request.ts +97 -0
  197. package/src/utils/response.ts +20 -0
  198. package/src/utils/store.ts +85 -0
  199. package/src/utils/story-utils.ts +42 -0
  200. package/src/utils/text-utils.ts +10 -0
  201. package/src/utils/ui-utils.ts +57 -0
  202. package/src/utils/url-utils.ts +113 -0
  203. package/dist/index.js +0 -554
  204. package/src/commands/create.ts +0 -263
  205. package/src/commands/purge.ts +0 -70
  206. package/src/commands/test.ts +0 -42
  207. package/src/service-schema.d.ts +0 -2023
  208. package/src/utils/auth-utils.ts +0 -31
  209. package/src/utils/pkg-utils.ts +0 -37
  210. package/src/utils/sb-build.ts +0 -55
  211. package/src/utils/sb-test.ts +0 -115
  212. package/src/utils/schema-utils.ts +0 -123
  213. package/src/utils/stream-utils.ts +0 -72
  214. package/src/utils/types.ts +0 -4
  215. package/src/utils/zip.ts +0 -77
@@ -0,0 +1,85 @@
1
+ import { SuperHeaders } from "@remix-run/headers";
2
+ import type { MiddlewareHandler } from "hono";
3
+ import { endTime, startTime } from "hono/timing";
4
+ import { AsyncLocalStorage } from "node:async_hooks";
5
+ import {
6
+ createConsoleLoggerAdapter,
7
+ type AuthAdapter,
8
+ type LoggerAdapter,
9
+ } from "../adapters/_internal/index.ts";
10
+ import type { RouterOptions, StoryBookerUser } from "../types.ts";
11
+ import type { ErrorParser } from "../utils/error.ts";
12
+ import { DEFAULT_LOCALE } from "./constants.ts";
13
+
14
+ export interface Store extends RouterOptions<StoryBookerUser> {
15
+ abortSignal: AbortSignal | undefined;
16
+ errorParser?: ErrorParser;
17
+ headers: SuperHeaders;
18
+ locale: string;
19
+ logger: LoggerAdapter;
20
+ prefix: string;
21
+ request: Request;
22
+ url: string;
23
+ user: StoryBookerUser | null | undefined;
24
+ }
25
+
26
+ export const localStore = new AsyncLocalStorage<Store>();
27
+
28
+ export function getStore(): Store {
29
+ const value = localStore.getStore();
30
+ if (!value) {
31
+ throw new Error("Store not found.");
32
+ }
33
+
34
+ return value;
35
+ }
36
+
37
+ export function getStoreOrNull(): Store | null {
38
+ const value = localStore.getStore();
39
+ if (!value) {
40
+ return null;
41
+ }
42
+
43
+ return value;
44
+ }
45
+
46
+ export function setupStore<User extends StoryBookerUser>(
47
+ options: RouterOptions<User>,
48
+ initPromises: Promise<unknown>,
49
+ ): MiddlewareHandler {
50
+ return async (ctx, next) => {
51
+ const logger = options.logger ?? createConsoleLoggerAdapter();
52
+
53
+ startTime(ctx, "init-adapters", "Initialize adapters");
54
+ await initPromises;
55
+ endTime(ctx, "init-adapters");
56
+
57
+ const request = ctx.req.raw;
58
+ const headers = new SuperHeaders(request.headers);
59
+ const locale = headers.acceptLanguage.languages[0] ?? DEFAULT_LOCALE;
60
+
61
+ startTime(ctx, "get-user", "Get user details");
62
+ const user = await options.auth?.getUserDetails({
63
+ logger,
64
+ request: request.clone(),
65
+ });
66
+ endTime(ctx, "get-user");
67
+
68
+ startTime(ctx, "request-handler", "Handle request");
69
+ localStore.enterWith({
70
+ ...options,
71
+ abortSignal: request.signal,
72
+ auth: options.auth as AuthAdapter | undefined,
73
+ headers,
74
+ locale,
75
+ logger,
76
+ prefix: options.config?.prefix ?? "",
77
+ request,
78
+ url: request.url,
79
+ user,
80
+ });
81
+
82
+ await next();
83
+ endTime(ctx, "request-handler");
84
+ };
85
+ }
@@ -0,0 +1,42 @@
1
+ import type { BuildStoryType } from "../models/builds-schema.ts";
2
+
3
+ type GroupedStories = Record<string, Record<string, BuildStoryType[]>>;
4
+
5
+ export function groupStoriesByTitle(stories: BuildStoryType[]): GroupedStories {
6
+ const groupedStories: GroupedStories = {};
7
+
8
+ for (const story of stories) {
9
+ if (story.type === "docs") {
10
+ continue;
11
+ }
12
+
13
+ const titleParts = story.title.split("/").map((part) => part.trim());
14
+
15
+ if (titleParts.length === 1) {
16
+ titleParts.unshift("Others");
17
+ }
18
+
19
+ const [groupTitle, ...storyTitleParts] = titleParts;
20
+ const storyTitle = storyTitleParts.join("/");
21
+
22
+ if (!groupTitle) {
23
+ continue;
24
+ }
25
+
26
+ if (groupedStories[groupTitle]) {
27
+ const group = groupedStories[groupTitle];
28
+
29
+ if (group[storyTitle]) {
30
+ group[storyTitle].push(story);
31
+ } else {
32
+ group[storyTitle] = [story];
33
+ }
34
+ } else {
35
+ groupedStories[groupTitle] = {
36
+ [storyTitle]: [story],
37
+ };
38
+ }
39
+ }
40
+
41
+ return groupedStories;
42
+ }
@@ -0,0 +1,10 @@
1
+ export function toTitleCase(text: string): string {
2
+ return `${text.slice(0, 1).toUpperCase()}${text.slice(1)}`;
3
+ }
4
+
5
+ export function camelCaseToSentenceCase(text: string): string {
6
+ // Insert a space before all uppercase letters
7
+ const result = text.replaceAll(/([A-Z])/g, " $1");
8
+ // Lowercase the entire result and capitalize the first letter
9
+ return result.charAt(0).toUpperCase() + result.slice(1).toLowerCase();
10
+ }
@@ -0,0 +1,57 @@
1
+ import type { Context } from "hono";
2
+ import type { UIAdapterOptions, UIResult } from "../adapters/_internal/ui.ts";
3
+ import { urlBuilderWithoutStore } from "../urls.ts";
4
+ import { getStore } from "./store.ts";
5
+
6
+ export function createUIAdapterOptions(): UIAdapterOptions {
7
+ const { auth, database, storage, ui, locale, logger, url, user } = getStore();
8
+
9
+ return {
10
+ isAuthEnabled: Boolean(auth),
11
+ locale,
12
+ logger,
13
+ url,
14
+ urlBuilder: urlBuilderWithoutStore,
15
+ user,
16
+ adaptersMetadata: {
17
+ auth: auth?.metadata,
18
+ database: database?.metadata,
19
+ logger: logger?.metadata,
20
+ storage: storage?.metadata,
21
+ ui: ui?.metadata,
22
+ },
23
+ };
24
+ }
25
+
26
+ // oxlint-disable-next-line max-params
27
+ export function createUIResultResponse<Props>(
28
+ ctx: Context,
29
+ render: (props: Props, options: UIAdapterOptions) => UIResult,
30
+ props: NoInfer<Props>,
31
+ init?: ResInit,
32
+ ): Promise<Response> {
33
+ return uiResultResponse(ctx, render(props, createUIAdapterOptions()), init);
34
+ }
35
+
36
+ export async function uiResultResponse(
37
+ ctx: Context,
38
+ result: UIResult,
39
+ init?: ResInit,
40
+ ): Promise<Response> {
41
+ if (result instanceof Promise) {
42
+ const awaitedResult = await result;
43
+ if (awaitedResult instanceof Response) {
44
+ return awaitedResult;
45
+ }
46
+
47
+ return ctx.html(awaitedResult);
48
+ }
49
+
50
+ if (result instanceof Response) {
51
+ return result;
52
+ }
53
+
54
+ return ctx.html(result, init);
55
+ }
56
+
57
+ type ResInit = Parameters<Context["html"]>[1];
@@ -0,0 +1,113 @@
1
+ import { hc } from "hono/client";
2
+ import type { AppRouter } from "../routers/_app-router";
3
+
4
+ type HonoClient = ReturnType<typeof hc<AppRouter>>;
5
+
6
+ export function linkRoute(
7
+ link: ((client: HonoClient) => URL) | URL | string,
8
+ options: { baseUrl?: string; searchParams?: URLSearchParams },
9
+ ): string {
10
+ const { baseUrl, searchParams } = options;
11
+
12
+ if (typeof link === "string") {
13
+ if (baseUrl !== undefined) {
14
+ return appendSearchParamsToURL(new URL(link, baseUrl), searchParams).toString();
15
+ }
16
+ return link;
17
+ }
18
+
19
+ if (link instanceof URL) {
20
+ return appendSearchParamsToURL(link, searchParams).toString();
21
+ }
22
+
23
+ if (baseUrl) {
24
+ const client = hc<AppRouter>(baseUrl);
25
+
26
+ return appendSearchParamsToURL(link(client), searchParams).toString();
27
+ }
28
+
29
+ const dummyBaseUrl = "http://host.local";
30
+ const client = hc<AppRouter>(dummyBaseUrl);
31
+ const url = appendSearchParamsToURL(link(client), searchParams).toString();
32
+ return url.replace(dummyBaseUrl, "");
33
+ }
34
+
35
+ function appendSearchParamsToURL(url: URL, searchParams: URLSearchParams | undefined): URL {
36
+ // oxlint-disable-next-line no-array-for-each
37
+ searchParams?.forEach((value, key) => {
38
+ url.searchParams.append(key, value);
39
+ });
40
+
41
+ return url;
42
+ }
43
+
44
+ export function urlSearchParamsToObject(
45
+ query: URLSearchParams | FormData,
46
+ ): Record<string, unknown> {
47
+ const result: Record<string, unknown> = {};
48
+
49
+ for (const key of query.keys()) {
50
+ const values = query.getAll(key);
51
+ // If multiple values for the same key, return array, else single value string
52
+ result[key] = values.length > 1 ? values : values[0];
53
+ }
54
+
55
+ return result;
56
+ }
57
+
58
+ export function generatePrefixFromBaseRoute(baseRoute: string): `/${string}` | undefined {
59
+ if (!baseRoute) {
60
+ return undefined;
61
+ }
62
+ if (baseRoute.startsWith("/")) {
63
+ return baseRoute as `/${string}`;
64
+ }
65
+ return `/${baseRoute}` as const;
66
+ }
67
+
68
+ export function urlJoin(...parts: string[]): string {
69
+ if (parts.length === 0) {
70
+ return "";
71
+ }
72
+ let protocol = "";
73
+ let host = "";
74
+ // Detect protocol + host in the first argument if present
75
+ const match = parts[0]?.match(/^([a-zA-Z][a-zA-Z0-9+\-.]*:)?(\/\/[^/?#]*)?/);
76
+ if (match && (match[1] || match[2])) {
77
+ protocol = match[1] ?? ""; // e.g. "https:"
78
+ host = match[2] ?? ""; // e.g. "//example.com"
79
+ const remainder = parts[0]?.slice((match[0] || "").length);
80
+ parts = remainder ? [remainder, ...parts.slice(1)] : parts.slice(1);
81
+ }
82
+ const segments: string[] = [];
83
+ for (const part of parts) {
84
+ for (const seg of part.split("/")) {
85
+ if (!seg || seg === ".") {
86
+ continue;
87
+ }
88
+ if (seg === "..") {
89
+ // Don't pop past the beginning
90
+ if (segments.length > 0) {
91
+ segments.pop();
92
+ }
93
+ } else {
94
+ segments.push(seg);
95
+ }
96
+ }
97
+ }
98
+ // Build the final URL
99
+ let result = "";
100
+ if (protocol || host) {
101
+ result = protocol + host;
102
+ if (segments.length > 0) {
103
+ // Ensure separator slash between host and path
104
+ result +=
105
+ segments[0]?.startsWith("?") || segments[0]?.startsWith("#")
106
+ ? ""
107
+ : `/${segments.join("/")}`;
108
+ }
109
+ } else {
110
+ result = `/${segments.join("/")}`;
111
+ }
112
+ return result;
113
+ }