@trebired/git-host 1.8.0 → 2.1.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 (265) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +184 -1007
  3. package/bin/.gitkeep +1 -0
  4. package/bin/git-host-actions-runner-darwin-arm64 +0 -0
  5. package/bin/git-host-actions-runner-darwin-x64 +0 -0
  6. package/bin/git-host-actions-runner-linux-arm64-gnu +0 -0
  7. package/bin/git-host-actions-runner-linux-x64-gnu +0 -0
  8. package/dist/api/forge/actions.d.ts +17 -0
  9. package/dist/api/forge/actions.d.ts.map +1 -0
  10. package/dist/api/forge/actions.js +272 -0
  11. package/dist/api/forge/actions.js.map +1 -0
  12. package/dist/api/forge/archives.d.ts +5 -0
  13. package/dist/api/forge/archives.d.ts.map +1 -0
  14. package/dist/api/forge/archives.js +63 -0
  15. package/dist/api/forge/archives.js.map +1 -0
  16. package/dist/api/forge/handler.d.ts.map +1 -1
  17. package/dist/api/forge/handler.js +2 -350
  18. package/dist/api/forge/handler.js.map +1 -1
  19. package/dist/api/forge/route.d.ts +33 -0
  20. package/dist/api/forge/route.d.ts.map +1 -1
  21. package/dist/api/forge/route.js +81 -82
  22. package/dist/api/forge/route.js.map +1 -1
  23. package/dist/api/forge/runtime.d.ts +5 -0
  24. package/dist/api/forge/runtime.d.ts.map +1 -0
  25. package/dist/api/forge/runtime.js +181 -0
  26. package/dist/api/forge/runtime.js.map +1 -0
  27. package/dist/api/forge/socket.d.ts +6 -0
  28. package/dist/api/forge/socket.d.ts.map +1 -0
  29. package/dist/api/forge/socket.js +193 -0
  30. package/dist/api/forge/socket.js.map +1 -0
  31. package/dist/api/handler/action.d.ts +1 -1
  32. package/dist/api/handler/action.d.ts.map +1 -1
  33. package/dist/api/handler/action.js +52 -40
  34. package/dist/api/handler/action.js.map +1 -1
  35. package/dist/api/handler/archive.d.ts.map +1 -1
  36. package/dist/api/handler/response.js.map +1 -1
  37. package/dist/api/handler/route.d.ts +3 -16
  38. package/dist/api/handler/route.d.ts.map +1 -1
  39. package/dist/api/handler/route.js +40 -65
  40. package/dist/api/handler/route.js.map +1 -1
  41. package/dist/api/handler/runtime.d.ts +5 -0
  42. package/dist/api/handler/runtime.d.ts.map +1 -0
  43. package/dist/api/handler/runtime.js +187 -0
  44. package/dist/api/handler/runtime.js.map +1 -0
  45. package/dist/api/handler.d.ts.map +1 -1
  46. package/dist/api/handler.js +2 -136
  47. package/dist/api/handler.js.map +1 -1
  48. package/dist/api/routing.d.ts +9 -0
  49. package/dist/api/routing.d.ts.map +1 -0
  50. package/dist/api/routing.js +35 -0
  51. package/dist/api/routing.js.map +1 -0
  52. package/dist/api/socket/events.d.ts +11 -0
  53. package/dist/api/socket/events.d.ts.map +1 -0
  54. package/dist/api/socket/events.js +11 -0
  55. package/dist/api/socket/events.js.map +1 -0
  56. package/dist/api/{socket_server.d.ts → socket/server.d.ts} +3 -3
  57. package/dist/api/socket/server.d.ts.map +1 -0
  58. package/dist/api/{socket_server.js → socket/server.js} +5 -5
  59. package/dist/api/socket/server.js.map +1 -0
  60. package/dist/backend/utils/normalize.d.ts +2 -0
  61. package/dist/backend/utils/normalize.d.ts.map +1 -0
  62. package/dist/backend/utils/normalize.js +4 -0
  63. package/dist/backend/utils/normalize.js.map +1 -0
  64. package/dist/backend/utils/object.d.ts +3 -0
  65. package/dist/backend/utils/object.d.ts.map +1 -0
  66. package/dist/backend/utils/object.js +12 -0
  67. package/dist/backend/utils/object.js.map +1 -0
  68. package/dist/backend/utils/time.d.ts +3 -0
  69. package/dist/backend/utils/time.d.ts.map +1 -0
  70. package/dist/backend/utils/time.js +7 -0
  71. package/dist/backend/utils/time.js.map +1 -0
  72. package/dist/core/actions_runner.d.ts +58 -0
  73. package/dist/core/actions_runner.d.ts.map +1 -0
  74. package/dist/core/actions_runner.js +414 -0
  75. package/dist/core/actions_runner.js.map +1 -0
  76. package/dist/core/actions_workflows.d.ts +22 -0
  77. package/dist/core/actions_workflows.d.ts.map +1 -0
  78. package/dist/core/actions_workflows.js +218 -0
  79. package/dist/core/actions_workflows.js.map +1 -0
  80. package/dist/core/activity.d.ts +11 -0
  81. package/dist/core/activity.d.ts.map +1 -0
  82. package/dist/core/activity.js +206 -0
  83. package/dist/core/activity.js.map +1 -0
  84. package/dist/core/archive.d.ts.map +1 -1
  85. package/dist/core/archive.js.map +1 -1
  86. package/dist/core/archive_cache_filesystem.d.ts.map +1 -1
  87. package/dist/core/create/git/forge.d.ts +4 -0
  88. package/dist/core/create/git/forge.d.ts.map +1 -0
  89. package/dist/core/{create_git_forge.js → create/git/forge.js} +84 -39
  90. package/dist/core/create/git/forge.js.map +1 -0
  91. package/dist/core/create/git/host.d.ts +4 -0
  92. package/dist/core/create/git/host.d.ts.map +1 -0
  93. package/dist/core/{create_git_host.js → create/git/host.js} +16 -16
  94. package/dist/core/create/git/host.js.map +1 -0
  95. package/dist/core/create_git_host/branch_methods.d.ts.map +1 -1
  96. package/dist/core/create_git_host/branch_methods.js.map +1 -1
  97. package/dist/core/create_git_host/content_methods.d.ts.map +1 -1
  98. package/dist/core/create_git_host/content_methods.js.map +1 -1
  99. package/dist/core/create_git_host/remote_methods.d.ts.map +1 -1
  100. package/dist/core/create_git_host/remote_methods.js +60 -0
  101. package/dist/core/create_git_host/remote_methods.js.map +1 -1
  102. package/dist/core/create_git_host/shared.d.ts.map +1 -1
  103. package/dist/core/create_git_host/shared.js.map +1 -1
  104. package/dist/core/create_git_host/working_tree_methods.d.ts.map +1 -1
  105. package/dist/core/create_git_host/working_tree_methods.js.map +1 -1
  106. package/dist/core/forge_actions.d.ts +25 -0
  107. package/dist/core/forge_actions.d.ts.map +1 -0
  108. package/dist/core/forge_actions.js +625 -0
  109. package/dist/core/forge_actions.js.map +1 -0
  110. package/dist/core/git_forge/storage_memory.d.ts.map +1 -1
  111. package/dist/core/git_forge/storage_memory.js +145 -2
  112. package/dist/core/git_forge/storage_memory.js.map +1 -1
  113. package/dist/core/inspect/helpers.d.ts.map +1 -1
  114. package/dist/core/inspect/helpers.js.map +1 -1
  115. package/dist/core/inspect/icon_theme.d.ts.map +1 -1
  116. package/dist/core/inspect/icon_theme.js.map +1 -1
  117. package/dist/core/inspect/linguist_progress.d.ts.map +1 -1
  118. package/dist/core/inspect/linguist_progress.js.map +1 -1
  119. package/dist/core/inspect.d.ts.map +1 -1
  120. package/dist/core/inspect.js.map +1 -1
  121. package/dist/core/inspection.d.ts.map +1 -1
  122. package/dist/core/inspection.js.map +1 -1
  123. package/dist/core/operation_state.d.ts.map +1 -1
  124. package/dist/core/remote.d.ts.map +1 -1
  125. package/dist/core/remote.js.map +1 -1
  126. package/dist/core/repository/parsers.d.ts.map +1 -1
  127. package/dist/core/repository/parsers.js.map +1 -1
  128. package/dist/core/repository.d.ts.map +1 -1
  129. package/dist/core/repository.js.map +1 -1
  130. package/dist/core/run_git/env.d.ts.map +1 -1
  131. package/dist/core/run_git/env.js.map +1 -1
  132. package/dist/core/run_git/process.d.ts.map +1 -1
  133. package/dist/core/run_git/process.js.map +1 -1
  134. package/dist/core/run_git/repository_setup.d.ts.map +1 -1
  135. package/dist/core/run_git/repository_setup.js.map +1 -1
  136. package/dist/core/run_git.d.ts.map +1 -1
  137. package/dist/core/run_git.js.map +1 -1
  138. package/dist/core/working_tree/mutate.d.ts.map +1 -1
  139. package/dist/core/working_tree/mutate.js.map +1 -1
  140. package/dist/core/working_tree/read.d.ts.map +1 -1
  141. package/dist/core/working_tree/read.js.map +1 -1
  142. package/dist/core/working_tree/shared.d.ts.map +1 -1
  143. package/dist/core/working_tree/shared.js.map +1 -1
  144. package/dist/frontend/js/utils/text.d.ts +2 -0
  145. package/dist/frontend/js/utils/text.d.ts.map +1 -0
  146. package/dist/frontend/js/utils/text.js +4 -0
  147. package/dist/frontend/js/utils/text.js.map +1 -0
  148. package/dist/http/handler/helpers.d.ts.map +1 -1
  149. package/dist/http/handler/helpers.js.map +1 -1
  150. package/dist/http/handler.d.ts.map +1 -1
  151. package/dist/http/handler.js +5 -1
  152. package/dist/http/handler.js.map +1 -1
  153. package/dist/index.d.ts +7 -4
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +6 -3
  156. package/dist/index.js.map +1 -1
  157. package/dist/ssh/keys.js.map +1 -1
  158. package/dist/ssh/server/audit.d.ts.map +1 -1
  159. package/dist/ssh/server/shared.d.ts +1 -1
  160. package/dist/ssh/server/shared.d.ts.map +1 -1
  161. package/dist/ssh/server/shared.js.map +1 -1
  162. package/dist/ssh/server.d.ts.map +1 -1
  163. package/dist/ssh/server.js +6 -2
  164. package/dist/ssh/server.js.map +1 -1
  165. package/dist/types/forge.d.ts +224 -7
  166. package/dist/types/forge.d.ts.map +1 -1
  167. package/dist/types/host/archive.d.ts +98 -0
  168. package/dist/types/host/archive.d.ts.map +1 -0
  169. package/dist/types/host/archive.js +2 -0
  170. package/dist/types/host/archive.js.map +1 -0
  171. package/dist/types/host/options.d.ts +203 -0
  172. package/dist/types/host/options.d.ts.map +1 -0
  173. package/dist/types/host/options.js +2 -0
  174. package/dist/types/host/options.js.map +1 -0
  175. package/dist/types/host/service.d.ts +54 -0
  176. package/dist/types/host/service.d.ts.map +1 -0
  177. package/dist/types/host/service.js +2 -0
  178. package/dist/types/host/service.js.map +1 -0
  179. package/dist/types/host.d.ts +3 -343
  180. package/dist/types/host.d.ts.map +1 -1
  181. package/dist/types/index.d.ts +1 -1
  182. package/dist/types/index.d.ts.map +1 -1
  183. package/dist/types/repository/archive.d.ts +37 -0
  184. package/dist/types/repository/archive.d.ts.map +1 -0
  185. package/dist/types/repository/archive.js +2 -0
  186. package/dist/types/repository/archive.js.map +1 -0
  187. package/dist/types/repository/core.d.ts +255 -0
  188. package/dist/types/repository/core.d.ts.map +1 -0
  189. package/dist/types/repository/core.js +2 -0
  190. package/dist/types/repository/core.js.map +1 -0
  191. package/dist/types/repository/inspection.d.ts +118 -0
  192. package/dist/types/repository/inspection.d.ts.map +1 -0
  193. package/dist/types/repository/inspection.js +2 -0
  194. package/dist/types/repository/inspection.js.map +1 -0
  195. package/dist/types/repository.d.ts +3 -403
  196. package/dist/types/repository.d.ts.map +1 -1
  197. package/dist/types/transports.d.ts +4 -1
  198. package/dist/types/transports.d.ts.map +1 -1
  199. package/dist/utils/paths.js.map +1 -1
  200. package/dist/utils/text.d.ts +2 -3
  201. package/dist/utils/text.d.ts.map +1 -1
  202. package/dist/utils/text.js +2 -3
  203. package/dist/utils/text.js.map +1 -1
  204. package/package.json +183 -69
  205. package/dist/api/socket_events.d.ts +0 -7
  206. package/dist/api/socket_events.d.ts.map +0 -1
  207. package/dist/api/socket_events.js +0 -7
  208. package/dist/api/socket_events.js.map +0 -1
  209. package/dist/api/socket_server.d.ts.map +0 -1
  210. package/dist/api/socket_server.js.map +0 -1
  211. package/dist/browser/index.d.ts +0 -65
  212. package/dist/browser/index.d.ts.map +0 -1
  213. package/dist/browser/index.js +0 -799
  214. package/dist/browser/index.js.map +0 -1
  215. package/dist/browser/styles.css +0 -317
  216. package/dist/core/create_git_forge.d.ts +0 -4
  217. package/dist/core/create_git_forge.d.ts.map +0 -1
  218. package/dist/core/create_git_forge.js.map +0 -1
  219. package/dist/core/create_git_host.d.ts +0 -4
  220. package/dist/core/create_git_host.d.ts.map +0 -1
  221. package/dist/core/create_git_host.js.map +0 -1
  222. package/dist/react/client/error.d.ts +0 -14
  223. package/dist/react/client/error.d.ts.map +0 -1
  224. package/dist/react/client/error.js +0 -32
  225. package/dist/react/client/error.js.map +0 -1
  226. package/dist/react/client/helpers.d.ts +0 -12
  227. package/dist/react/client/helpers.d.ts.map +0 -1
  228. package/dist/react/client/helpers.js +0 -45
  229. package/dist/react/client/helpers.js.map +0 -1
  230. package/dist/react/client/types.d.ts +0 -195
  231. package/dist/react/client/types.d.ts.map +0 -1
  232. package/dist/react/client/types.js +0 -2
  233. package/dist/react/client/types.js.map +0 -1
  234. package/dist/react/client.d.ts +0 -6
  235. package/dist/react/client.d.ts.map +0 -1
  236. package/dist/react/client.js +0 -506
  237. package/dist/react/client.js.map +0 -1
  238. package/dist/react/components.d.ts +0 -44412
  239. package/dist/react/components.d.ts.map +0 -1
  240. package/dist/react/components.js +0 -758
  241. package/dist/react/components.js.map +0 -1
  242. package/dist/react/hooks/query.d.ts +0 -14
  243. package/dist/react/hooks/query.d.ts.map +0 -1
  244. package/dist/react/hooks/query.js +0 -139
  245. package/dist/react/hooks/query.js.map +0 -1
  246. package/dist/react/hooks/resources.d.ts +0 -64
  247. package/dist/react/hooks/resources.d.ts.map +0 -1
  248. package/dist/react/hooks/resources.js +0 -438
  249. package/dist/react/hooks/resources.js.map +0 -1
  250. package/dist/react/hooks/types.d.ts +0 -80
  251. package/dist/react/hooks/types.d.ts.map +0 -1
  252. package/dist/react/hooks/types.js +0 -2
  253. package/dist/react/hooks/types.js.map +0 -1
  254. package/dist/react/hooks.d.ts +0 -4
  255. package/dist/react/hooks.d.ts.map +0 -1
  256. package/dist/react/hooks.js +0 -3
  257. package/dist/react/hooks.js.map +0 -1
  258. package/dist/react/index.d.ts +0 -8
  259. package/dist/react/index.d.ts.map +0 -1
  260. package/dist/react/index.js +0 -5
  261. package/dist/react/index.js.map +0 -1
  262. package/dist/react/ui/context.d.ts +0 -1907
  263. package/dist/react/ui/context.d.ts.map +0 -1
  264. package/dist/react/ui/context.js +0 -186
  265. package/dist/react/ui/context.js.map +0 -1
@@ -1,758 +0,0 @@
1
- import { createElement, useEffect, useState, } from "react";
2
- import { applyGitStarOptimisticState, applyGitWatchOptimisticState, useGitBranches, useGitCreateFork, useGitCreateRelease, useGitDeleteRelease, useGitSocialState, useGitStarRepository, useGitSyncFork, useGitTags, useGitUnstarRepository, useGitUnwatchRepository, useGitWatchRepository, } from "./hooks.js";
3
- import { GitRepositoryUiProvider, resolveGitRepositorySlotProps, useGitRepositoryClassName, useGitRepositoryDiagnostics, useGitRepositoryRouteAdapter, useGitRepositoryUi, } from "./ui/context.js";
4
- import { text } from "../utils/text.js";
5
- const h = createElement;
6
- function joinClassNames(...values) {
7
- return values.filter(Boolean).join(" ");
8
- }
9
- function formatDate(value) {
10
- const next = text(value);
11
- if (!next)
12
- return "Unknown";
13
- try {
14
- return new Date(next).toLocaleString("en-US", {
15
- dateStyle: "medium",
16
- timeStyle: "short",
17
- });
18
- }
19
- catch {
20
- return next;
21
- }
22
- }
23
- function useGitRepositorySlots() {
24
- const ui = useGitRepositoryUi();
25
- return (slot, input = {}) => resolveGitRepositorySlotProps(ui, slot, input);
26
- }
27
- function useGitRepositoryRenderState(page, repositoryKey, input) {
28
- const diagnostics = useGitRepositoryDiagnostics();
29
- useEffect(() => {
30
- diagnostics.onViewMount?.({ page, repositoryKey });
31
- }, [diagnostics, page, repositoryKey]);
32
- useEffect(() => {
33
- diagnostics.onRenderStateChange?.({
34
- empty: input.empty === true,
35
- error: Boolean(input.error),
36
- loading: input.loading === true,
37
- page,
38
- repositoryKey,
39
- });
40
- if (input.empty === true) {
41
- diagnostics.onEmptyState?.({
42
- page,
43
- reason: text(input.emptyReason, "empty"),
44
- repositoryKey,
45
- });
46
- }
47
- }, [diagnostics, input.empty, input.emptyReason, input.error, input.loading, page, repositoryKey]);
48
- }
49
- function GitLoadingState(props) {
50
- const ui = useGitRepositoryUi();
51
- const slot = useGitRepositorySlots();
52
- const Override = ui.components.LoadingState;
53
- if (Override)
54
- return h(Override, props);
55
- return h("div", slot("loading-state", {
56
- className: useGitRepositoryClassName("status", props.className),
57
- children: props.message || "Loading repository data...",
58
- }));
59
- }
60
- function GitErrorState(props) {
61
- const ui = useGitRepositoryUi();
62
- const slot = useGitRepositorySlots();
63
- const Override = ui.components.ErrorState;
64
- if (Override)
65
- return h(Override, props);
66
- return h("div", slot("error-state", {
67
- className: useGitRepositoryClassName("status", "is-error", props.className),
68
- children: [
69
- h("div", { key: "message", children: props.error?.message || "This repository view failed to load." }),
70
- props.onRetry
71
- ? h("button", {
72
- ...slot("button", {}),
73
- key: "retry",
74
- onClick: props.onRetry,
75
- type: "button",
76
- children: "Retry",
77
- })
78
- : null,
79
- ],
80
- }));
81
- }
82
- function GitEmptyState(props) {
83
- const ui = useGitRepositoryUi();
84
- const slot = useGitRepositorySlots();
85
- const Override = ui.components.EmptyState;
86
- if (Override)
87
- return h(Override, props);
88
- return h("section", slot("empty-state", {
89
- className: props.className,
90
- children: [
91
- h("h3", slot("empty-title", { key: "title", children: props.title || "Nothing here yet" })),
92
- h("p", slot("note", { key: "message", children: props.message || "This repository section is empty." })),
93
- props.action ? h("div", slot("empty-action", { key: "action", children: props.action })) : null,
94
- ],
95
- }));
96
- }
97
- function GitRepositoryTabs(props) {
98
- const ui = useGitRepositoryUi();
99
- const slot = useGitRepositorySlots();
100
- const routes = useGitRepositoryRouteAdapter();
101
- const activeClassName = useGitRepositoryClassName("button-active");
102
- const items = [
103
- { key: "overview", label: "Overview", to: routes.overview(props.repositoryKey) },
104
- { key: "code", label: "Code", to: routes.code(props.repositoryKey) },
105
- { key: "commits", label: "Commits", to: routes.commits(props.repositoryKey) },
106
- { key: "branches", label: "Branches", to: routes.branches(props.repositoryKey) },
107
- { key: "tags", label: "Tags", to: routes.tags(props.repositoryKey) },
108
- { key: "releases", label: "Releases", to: routes.releases(props.repositoryKey) },
109
- { key: "forks", label: "Forks", to: routes.forks(props.repositoryKey) },
110
- { key: "activity", label: "Activity", to: routes.activity(props.repositoryKey) },
111
- { key: "search", label: "Search", to: routes.search(props.repositoryKey) },
112
- ];
113
- return h("nav", slot("tabs", {
114
- className: props.className,
115
- children: items.map((item) => h("button", {
116
- ...slot("tab-link", {
117
- className: item.key === props.active ? activeClassName : undefined,
118
- }),
119
- key: item.key,
120
- onClick: () => ui.navigate(item.to),
121
- type: "button",
122
- children: item.label,
123
- })),
124
- }));
125
- }
126
- function GitRepositoryStats(props) {
127
- const slot = useGitRepositorySlots();
128
- return h("dl", slot("stats", {
129
- className: useGitRepositoryClassName("definition-grid", props.className),
130
- children: props.stats.flatMap((entry) => ([
131
- h("dt", { key: `${entry.label}:label`, children: entry.label }),
132
- h("dd", { key: `${entry.label}:value`, children: entry.value }),
133
- ])),
134
- }));
135
- }
136
- function GitStarButton(props) {
137
- const [optimistic, setOptimistic] = useState(props.social || null);
138
- const slot = useGitRepositorySlots();
139
- const activeClassName = useGitRepositoryClassName("button-active");
140
- const star = useGitStarRepository(props.repositoryKey, { headers: props.headers });
141
- const unstar = useGitUnstarRepository(props.repositoryKey, { headers: props.headers });
142
- useEffect(() => {
143
- setOptimistic(props.social || null);
144
- }, [props.social]);
145
- return h("button", {
146
- ...slot("button", {
147
- className: optimistic?.viewer_has_starred ? activeClassName : undefined,
148
- }),
149
- disabled: star.loading || unstar.loading,
150
- onClick: async () => {
151
- const next = optimistic?.viewer_has_starred !== true;
152
- setOptimistic(applyGitStarOptimisticState(optimistic, next));
153
- try {
154
- setOptimistic(next ? await star.mutate() : await unstar.mutate());
155
- }
156
- catch {
157
- setOptimistic(props.social || null);
158
- }
159
- },
160
- type: "button",
161
- children: `${optimistic?.viewer_has_starred ? "Starred" : "Star"} ${optimistic?.star_count ?? 0}`,
162
- });
163
- }
164
- function GitWatchButton(props) {
165
- const [optimistic, setOptimistic] = useState(props.social || null);
166
- const slot = useGitRepositorySlots();
167
- const activeClassName = useGitRepositoryClassName("button-active");
168
- const watch = useGitWatchRepository(props.repositoryKey, { headers: props.headers });
169
- const unwatch = useGitUnwatchRepository(props.repositoryKey, { headers: props.headers });
170
- useEffect(() => {
171
- setOptimistic(props.social || null);
172
- }, [props.social]);
173
- return h("button", {
174
- ...slot("button", {
175
- className: optimistic?.viewer_is_watching ? activeClassName : undefined,
176
- }),
177
- disabled: watch.loading || unwatch.loading,
178
- onClick: async () => {
179
- const next = optimistic?.viewer_is_watching !== true;
180
- setOptimistic(applyGitWatchOptimisticState(optimistic, next));
181
- try {
182
- setOptimistic(next ? await watch.mutate() : await unwatch.mutate());
183
- }
184
- catch {
185
- setOptimistic(props.social || null);
186
- }
187
- },
188
- type: "button",
189
- children: `${optimistic?.viewer_is_watching ? "Watching" : "Watch"} ${optimistic?.watcher_count ?? 0}`,
190
- });
191
- }
192
- function GitForkButton(props) {
193
- const mutation = useGitCreateFork(props.repositoryKey, { headers: props.headers });
194
- const slot = useGitRepositorySlots();
195
- return h("button", {
196
- ...slot("button", {
197
- className: useGitRepositoryClassName("button-primary"),
198
- }),
199
- disabled: mutation.loading,
200
- onClick: async () => {
201
- const created = await mutation.mutate();
202
- props.onCreated?.(created);
203
- },
204
- type: "button",
205
- children: mutation.loading ? "Forking..." : "Create Fork",
206
- });
207
- }
208
- function GitSyncForkButton(props) {
209
- const mutation = useGitSyncFork(props.repositoryKey, props.forkId, { headers: props.headers });
210
- const slot = useGitRepositorySlots();
211
- return h("button", {
212
- ...slot("button", {}),
213
- disabled: mutation.loading,
214
- onClick: async () => {
215
- const synced = await mutation.mutate({ strategy: "ff-only" });
216
- props.onSynced?.(synced);
217
- },
218
- type: "button",
219
- children: mutation.loading ? "Syncing..." : "Sync Fork",
220
- });
221
- }
222
- function GitCreateReleaseButton(props) {
223
- const mutation = useGitCreateRelease(props.repositoryKey, { headers: props.headers });
224
- const slot = useGitRepositorySlots();
225
- return h("button", {
226
- ...slot("button", {
227
- className: useGitRepositoryClassName("button-primary"),
228
- }),
229
- disabled: mutation.loading,
230
- onClick: async () => {
231
- const release = await mutation.mutate(props.input);
232
- props.onCreated?.(release);
233
- },
234
- type: "button",
235
- children: mutation.loading ? "Publishing..." : "Create Release",
236
- });
237
- }
238
- function GitEditReleaseButton(props) {
239
- const slot = useGitRepositorySlots();
240
- return h("button", {
241
- ...slot("button", {}),
242
- disabled: props.disabled,
243
- onClick: props.onClick,
244
- type: "button",
245
- children: "Edit Release",
246
- });
247
- }
248
- function GitDeleteReleaseButton(props) {
249
- const mutation = useGitDeleteRelease(props.repositoryKey, props.releaseId, { headers: props.headers });
250
- const slot = useGitRepositorySlots();
251
- return h("button", {
252
- ...slot("button", {}),
253
- disabled: mutation.loading,
254
- onClick: async () => {
255
- await mutation.mutate({ deleteTag: props.deleteTag });
256
- props.onDeleted?.();
257
- },
258
- type: "button",
259
- children: mutation.loading ? "Deleting..." : "Delete Release",
260
- });
261
- }
262
- function GitRepositorySocialButtons(props) {
263
- const social = useGitSocialState(props.repositoryKey, {
264
- headers: props.headers,
265
- initialData: props.social || null,
266
- });
267
- const slot = useGitRepositorySlots();
268
- return h("div", {
269
- ...slot("actions", {}),
270
- children: [
271
- h(GitStarButton, { headers: props.headers, key: "star", repositoryKey: props.repositoryKey, social: social.data }),
272
- h(GitWatchButton, { headers: props.headers, key: "watch", repositoryKey: props.repositoryKey, social: social.data }),
273
- ],
274
- });
275
- }
276
- function GitBranchSelector(props) {
277
- const branches = useGitBranches(props.repositoryKey, { headers: props.headers });
278
- const ui = useGitRepositoryUi();
279
- const slot = useGitRepositorySlots();
280
- const routes = useGitRepositoryRouteAdapter();
281
- return h("select", {
282
- ...slot("input", { className: props.className }),
283
- disabled: branches.loading,
284
- onChange: (event) => {
285
- const branch = text(event.target?.value);
286
- props.onSelect?.(branch);
287
- if (branch)
288
- ui.navigate(routes.code(props.repositoryKey, "", branch));
289
- },
290
- value: props.selectedBranch || "",
291
- children: [
292
- h("option", { key: "empty", value: "", children: branches.loading ? "Loading branches..." : "Branch switcher" }),
293
- ...(branches.data || []).map((branch) => h("option", {
294
- key: branch.name,
295
- value: branch.name,
296
- children: branch.current ? `${branch.name} (current)` : branch.name,
297
- })),
298
- ],
299
- });
300
- }
301
- function GitTagSelector(props) {
302
- const tags = useGitTags(props.repositoryKey, { headers: props.headers });
303
- const ui = useGitRepositoryUi();
304
- const slot = useGitRepositorySlots();
305
- const routes = useGitRepositoryRouteAdapter();
306
- return h("select", {
307
- ...slot("input", { className: props.className }),
308
- disabled: tags.loading,
309
- onChange: (event) => {
310
- const tag = text(event.target?.value);
311
- props.onSelect?.(tag);
312
- if (tag)
313
- ui.navigate(routes.code(props.repositoryKey, "", tag));
314
- },
315
- value: props.selectedTag || "",
316
- children: [
317
- h("option", { key: "empty", value: "", children: tags.loading ? "Loading tags..." : "Tag selector" }),
318
- ...(tags.data || []).map((tag) => h("option", {
319
- key: tag.name,
320
- value: tag.name,
321
- children: tag.name,
322
- })),
323
- ],
324
- });
325
- }
326
- function GitDownloadArchiveButton(props) {
327
- const ui = useGitRepositoryUi();
328
- const slot = useGitRepositorySlots();
329
- const links = ui.client?.getArchiveLinks(props.repositoryKey, {
330
- ref: props.refName,
331
- });
332
- const href = (props.format || "zip") === "zip" ? links?.zip.href : links?.tar_gz.href;
333
- return h("a", {
334
- ...slot("button", {}),
335
- href,
336
- children: props.label || ((props.format || "zip") === "zip" ? "Download ZIP" : "Download TAR.GZ"),
337
- });
338
- }
339
- function GitSourceArchiveLinksRow(props) {
340
- const slot = useGitRepositorySlots();
341
- if (!props.links)
342
- return null;
343
- return h("div", {
344
- ...slot("action-bar", {}),
345
- children: [
346
- h("a", {
347
- ...slot("button", {}),
348
- href: props.links.zip.href,
349
- key: "zip",
350
- children: "Source code (zip)",
351
- }),
352
- h("a", {
353
- ...slot("button", {}),
354
- href: props.links.tar_gz.href,
355
- key: "tar_gz",
356
- children: "Source code (tar.gz)",
357
- }),
358
- ],
359
- });
360
- }
361
- function GitCopyCloneUrlButton(props) {
362
- const ui = useGitRepositoryUi();
363
- const slot = useGitRepositorySlots();
364
- const value = ui.branding.getCloneUrl?.(props.repositoryKey, props.protocol || "http") || "";
365
- return h("button", {
366
- ...slot("button", {}),
367
- disabled: !value,
368
- onClick: async () => {
369
- try {
370
- const clipboard = globalThis.navigator?.clipboard;
371
- if (value && clipboard?.writeText)
372
- await clipboard.writeText(value);
373
- }
374
- catch { }
375
- },
376
- type: "button",
377
- children: "Copy Clone URL",
378
- });
379
- }
380
- function GitRepositoryActionBar(props) {
381
- const slot = useGitRepositorySlots();
382
- return h("div", slot("action-bar", {
383
- className: props.className,
384
- children: props.children,
385
- }));
386
- }
387
- function GitPathBreadcrumbs(props) {
388
- const ui = useGitRepositoryUi();
389
- const slot = useGitRepositorySlots();
390
- const routes = useGitRepositoryRouteAdapter();
391
- const parts = text(props.path).split("/").filter(Boolean);
392
- let current = "";
393
- return h("div", {
394
- ...slot("breadcrumbs", {}),
395
- children: [
396
- h("button", {
397
- ...slot("breadcrumb", {}),
398
- key: "root",
399
- onClick: () => ui.navigate(routes.code(props.repositoryKey, "", props.refName)),
400
- type: "button",
401
- children: props.refName || "root",
402
- }),
403
- ...parts.map((part, index) => {
404
- current = current ? `${current}/${part}` : part;
405
- return h("button", {
406
- ...slot("breadcrumb", {}),
407
- key: `${part}:${index}`,
408
- onClick: () => ui.navigate(routes.code(props.repositoryKey, current, props.refName)),
409
- type: "button",
410
- children: part,
411
- });
412
- }),
413
- ],
414
- });
415
- }
416
- function GitRepositoryHeader(props) {
417
- const ui = useGitRepositoryUi();
418
- const slot = useGitRepositorySlots();
419
- return h("section", slot("header", {
420
- className: joinClassNames(props.className, ui.theme.className),
421
- style: ui.themeStyle,
422
- children: [
423
- h("div", slot("header-top", {
424
- key: "title",
425
- children: [
426
- h("div", slot("title-block", {
427
- key: "block",
428
- children: [
429
- h("div", slot("badge", { key: "badge", children: "Embeddable Forge UI" })),
430
- h("h1", slot("title", {
431
- className: ui.theme.typography?.headingClassName,
432
- key: "title",
433
- children: props.title || props.repositoryKey,
434
- })),
435
- h("p", slot("subtitle", {
436
- className: ui.theme.typography?.bodyClassName,
437
- key: "subtitle",
438
- children: props.subtitle || (typeof ui.branding.subtitle === "string" ? ui.branding.subtitle : "Repository workspace"),
439
- })),
440
- ],
441
- })),
442
- props.actions ? h("div", slot("header-actions", { key: "actions", children: props.actions })) : null,
443
- ],
444
- })),
445
- props.stats?.length ? h(GitRepositoryStats, {
446
- key: "stats",
447
- repositoryKey: props.repositoryKey,
448
- social: props.social,
449
- stats: props.stats,
450
- }) : null,
451
- h(GitRepositoryTabs, {
452
- active: props.page,
453
- key: "tabs",
454
- repositoryKey: props.repositoryKey,
455
- }),
456
- ],
457
- }));
458
- }
459
- function GitRepositoryShell(props) {
460
- useGitRepositoryRenderState(props.page, props.repositoryKey, {
461
- empty: props.empty,
462
- error: props.error,
463
- loading: props.loading,
464
- });
465
- const slot = useGitRepositorySlots();
466
- return h("div", slot("page", {
467
- className: props.className,
468
- children: [
469
- h(GitRepositoryHeader, {
470
- actions: props.actions,
471
- key: "header",
472
- page: props.page,
473
- repositoryKey: props.repositoryKey,
474
- social: props.social,
475
- stats: props.stats,
476
- subtitle: props.subtitle,
477
- title: props.title,
478
- }),
479
- props.loading
480
- ? h(GitLoadingState, { key: "loading" })
481
- : props.error
482
- ? h(GitErrorState, { error: props.error, key: "error", onRetry: props.retry })
483
- : props.empty
484
- ? (props.emptyState || h(GitEmptyState, { key: "empty" }))
485
- : h("div", slot("shell-body", { key: "body", children: props.children })),
486
- ],
487
- }));
488
- }
489
- function GitCommitList(props) {
490
- const ui = useGitRepositoryUi();
491
- const slot = useGitRepositorySlots();
492
- const routes = useGitRepositoryRouteAdapter();
493
- if (!props.commits.length) {
494
- return h(GitEmptyState, { message: props.emptyMessage || "No commits matched this repository view." });
495
- }
496
- return h("ul", {
497
- ...slot("list", {}),
498
- children: props.commits.map((commit) => h("li", {
499
- ...slot("list-item", {}),
500
- key: commit.hash,
501
- children: [
502
- h("button", {
503
- ...slot("list-link", {}),
504
- key: "subject",
505
- onClick: () => ui.navigate(routes.commit(props.repositoryKey, commit.hash)),
506
- type: "button",
507
- children: `${commit.short_hash} · ${commit.subject}`,
508
- }),
509
- h("div", slot("note", { key: "meta", children: `${commit.author_name} · ${formatDate(commit.authored_at)}` })),
510
- ],
511
- })),
512
- });
513
- }
514
- function GitReleaseList(props) {
515
- const ui = useGitRepositoryUi();
516
- const slot = useGitRepositorySlots();
517
- const routes = useGitRepositoryRouteAdapter();
518
- if (!props.releases.length) {
519
- return h(GitEmptyState, { message: props.emptyMessage || "No releases have been published yet." });
520
- }
521
- return h("ul", {
522
- ...slot("list", {}),
523
- children: props.releases.map((release) => h("li", {
524
- ...slot("list-item", {}),
525
- key: release.id,
526
- children: [
527
- h("button", {
528
- ...slot("list-link", {}),
529
- key: "title",
530
- onClick: () => ui.navigate(routes.release(props.repositoryKey, release.id)),
531
- type: "button",
532
- children: `${release.title} · ${release.tag_name}`,
533
- }),
534
- h("div", slot("note", { key: "meta", children: `${release.prerelease ? "Prerelease" : "Release"} · ${formatDate(release.published_at || release.created_at)}` })),
535
- h("p", slot("note", { key: "notes", children: release.notes || "No release notes." })),
536
- h(GitSourceArchiveLinksRow, { key: "archives", links: release.source_archives }),
537
- ],
538
- })),
539
- });
540
- }
541
- function GitForkList(props) {
542
- const slot = useGitRepositorySlots();
543
- if (!props.forks.length) {
544
- return h(GitEmptyState, { message: "No forks exist for this repository yet." });
545
- }
546
- return h("ul", {
547
- ...slot("list", {}),
548
- children: props.forks.map((fork) => h("li", {
549
- ...slot("list-item", {}),
550
- key: fork.fork_repository_id,
551
- children: [
552
- h("strong", { key: "name", children: fork.fork_repository_id }),
553
- h("div", slot("note", { key: "meta", children: `Ahead ${fork.fork_status.ahead} · Behind ${fork.fork_status.behind} · ${fork.fork_status.fork_branch}` })),
554
- h(GitSyncForkButton, { forkId: fork.fork_repository_id, headers: props.headers, key: "sync", repositoryKey: props.repositoryKey }),
555
- ],
556
- })),
557
- });
558
- }
559
- function GitTreeView(props) {
560
- const slot = useGitRepositorySlots();
561
- if (!props.entries.length) {
562
- return h(GitEmptyState, { message: "This tree is empty." });
563
- }
564
- return h("ul", {
565
- ...slot("list", {}),
566
- children: props.entries.map((entry) => h("li", {
567
- ...slot("list-item", {
568
- className: entry.path === props.selectedPath ? "is-selected" : undefined,
569
- }),
570
- key: entry.path,
571
- children: h("button", {
572
- ...slot("list-link", {}),
573
- onClick: () => props.onSelectPath?.(entry.path),
574
- type: "button",
575
- children: `${entry.type === "tree" ? "dir" : "file"} · ${entry.path}${entry.language ? ` · ${entry.language}` : ""}`,
576
- }),
577
- })),
578
- });
579
- }
580
- function GitBlobView(props) {
581
- const slot = useGitRepositorySlots();
582
- return h("section", slot("card", {
583
- children: [
584
- h("div", slot("card-header", {
585
- key: "header",
586
- children: [
587
- h("h2", slot("card-title", { key: "title", children: props.path || "File Preview" })),
588
- props.subtitle ? h("div", slot("card-subtitle", { key: "subtitle", children: props.subtitle })) : null,
589
- ],
590
- })),
591
- props.content
592
- ? h("pre", slot("code-block", { key: "body", children: props.content }))
593
- : h(GitEmptyState, { key: "empty", message: "Select a file to preview its content." }),
594
- ],
595
- }));
596
- }
597
- function GitSearchResults(props) {
598
- const ui = useGitRepositoryUi();
599
- const slot = useGitRepositorySlots();
600
- const routes = useGitRepositoryRouteAdapter();
601
- const files = props.results?.files || [];
602
- if (!files.length) {
603
- return h(GitEmptyState, { message: "No search results matched that query." });
604
- }
605
- return h("ul", {
606
- ...slot("list", {}),
607
- children: files.map((file) => h("li", {
608
- ...slot("list-item", {}),
609
- key: file.path,
610
- children: [
611
- h("button", {
612
- ...slot("list-link", {}),
613
- key: "path",
614
- onClick: () => ui.navigate(routes.code(props.repositoryKey, file.path, props.results?.ref)),
615
- type: "button",
616
- children: `${file.path} · ${file.match_count} matches`,
617
- }),
618
- ...file.matches.slice(0, 5).map((match, index) => h("div", slot("note", {
619
- key: `${file.path}:${index}`,
620
- children: `${match.line_number}: ${match.line}`,
621
- }))),
622
- ],
623
- })),
624
- });
625
- }
626
- function GitActivityList(props) {
627
- const slot = useGitRepositorySlots();
628
- if (!props.activity.length) {
629
- return h(GitEmptyState, { message: "There is no recorded activity yet." });
630
- }
631
- return h("ul", {
632
- ...slot("list", {}),
633
- children: props.activity.map((entry) => h("li", {
634
- ...slot("list-item", {}),
635
- key: entry.id,
636
- children: [
637
- h("strong", { key: "summary", children: entry.summary }),
638
- h("div", slot("note", { key: "meta", children: `${entry.kind} · actor ${entry.actor_id} · ${formatDate(entry.created_at)}` })),
639
- ],
640
- })),
641
- });
642
- }
643
- function GitBranchList(props) {
644
- const ui = useGitRepositoryUi();
645
- const slot = useGitRepositorySlots();
646
- const routes = useGitRepositoryRouteAdapter();
647
- if (!props.branches.length) {
648
- return h(GitEmptyState, { message: "No branches are available." });
649
- }
650
- return h("ul", {
651
- ...slot("list", {}),
652
- children: props.branches.map((branch) => h("li", {
653
- ...slot("list-item", {}),
654
- key: branch.name,
655
- children: [
656
- h("button", {
657
- ...slot("list-link", {}),
658
- key: "branch",
659
- onClick: () => ui.navigate(routes.code(props.repositoryKey, "", branch.name)),
660
- type: "button",
661
- children: branch.current ? `${branch.name} (current)` : branch.name,
662
- }),
663
- h("div", slot("note", { key: "meta", children: `${branch.head_commit.slice(0, 7)}${branch.upstream ? ` · ${branch.upstream}` : ""}` })),
664
- ],
665
- })),
666
- });
667
- }
668
- function GitTagList(props) {
669
- const ui = useGitRepositoryUi();
670
- const slot = useGitRepositorySlots();
671
- const routes = useGitRepositoryRouteAdapter();
672
- if (!props.tags.length) {
673
- return h(GitEmptyState, { message: "No tags exist yet." });
674
- }
675
- return h("ul", {
676
- ...slot("list", {}),
677
- children: props.tags.map((tag) => h("li", {
678
- ...slot("list-item", {}),
679
- key: tag.name,
680
- children: [
681
- h("button", {
682
- ...slot("list-link", {}),
683
- key: "tag",
684
- onClick: () => ui.navigate(routes.code(props.repositoryKey, "", tag.name)),
685
- type: "button",
686
- children: tag.name,
687
- }),
688
- h("div", slot("note", { key: "meta", children: `${tag.short_hash} · ${tag.subject || "No subject"}` })),
689
- h(GitSourceArchiveLinksRow, { key: "archives", links: tag.source_archives }),
690
- ],
691
- })),
692
- });
693
- }
694
- function GitBlameView(props) {
695
- const routes = useGitRepositoryRouteAdapter();
696
- const ui = useGitRepositoryUi();
697
- const slot = useGitRepositorySlots();
698
- if (!props.blame || !props.blame.lines.length) {
699
- return h(GitEmptyState, { message: "No blame lines were available for this file." });
700
- }
701
- return h("div", {
702
- ...slot("blame", {}),
703
- children: props.blame.lines.map((line) => h("div", {
704
- ...slot("blame-row", {}),
705
- key: `${line.line_number}:${line.commit_hash}`,
706
- children: [
707
- h("button", {
708
- ...slot("blame-commit", {}),
709
- key: "commit",
710
- onClick: () => ui.navigate(routes.commit(props.repositoryKey, line.commit_hash)),
711
- type: "button",
712
- children: line.commit_short_hash,
713
- }),
714
- h("div", slot("note", { key: "meta", children: `${line.author_name} · ${formatDate(line.authored_at)}` })),
715
- h("pre", slot("code-inline", { key: "content", children: line.content })),
716
- ],
717
- })),
718
- });
719
- }
720
- function GitDiffView(props) {
721
- const slot = useGitRepositorySlots();
722
- if (!props.diff) {
723
- return h(GitEmptyState, { message: "No comparison data is available." });
724
- }
725
- return h("div", slot("grid", {
726
- children: [
727
- h("section", slot("card", {
728
- key: "summary",
729
- children: [
730
- h("div", slot("card-header", { key: "header", children: h("h2", slot("card-title", { children: "Compare Summary" })) })),
731
- h("dl", slot("definition-grid", {
732
- key: "body",
733
- children: [
734
- h("dt", { key: "base:label", children: "Base" }),
735
- h("dd", { key: "base:value", children: props.diff.base_ref }),
736
- h("dt", { key: "head:label", children: "Head" }),
737
- h("dd", { key: "head:value", children: props.diff.head_ref }),
738
- h("dt", { key: "commits:label", children: "Commits" }),
739
- h("dd", { key: "commits:value", children: String(props.diff.commit_count) }),
740
- h("dt", { key: "files:label", children: "Files" }),
741
- h("dd", { key: "files:value", children: String(props.diff.file_count) }),
742
- ],
743
- })),
744
- ],
745
- })),
746
- h("section", slot("card", {
747
- className: "git-browser-span-2",
748
- key: "diff",
749
- children: [
750
- h("div", slot("card-header", { key: "header", children: h("h2", slot("card-title", { children: "Diff" })) })),
751
- h("pre", slot("code-block", { key: "body", children: props.diff.diff })),
752
- ],
753
- })),
754
- ],
755
- }));
756
- }
757
- export { GitActivityList, GitBlameView, GitBlobView, GitBranchList, GitBranchSelector, GitCommitList, GitCopyCloneUrlButton, GitCreateReleaseButton, GitDeleteReleaseButton, GitDiffView, GitDownloadArchiveButton, GitEditReleaseButton, GitEmptyState, GitErrorState, GitForkButton, GitForkList, GitLoadingState, GitPathBreadcrumbs, GitReleaseList, GitRepositoryActionBar, GitRepositoryHeader, GitRepositoryShell, GitRepositorySocialButtons, GitRepositoryStats, GitRepositoryTabs, GitRepositoryUiProvider, GitSearchResults, GitStarButton, GitSyncForkButton, GitTagList, GitTagSelector, GitTreeView, GitWatchButton, };
758
- //# sourceMappingURL=components.js.map