@hitch42/applet 0.1.0-beta.10

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 (193) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_internal/client.d.ts +7 -0
  3. package/dist/_internal/client.js +169 -0
  4. package/dist/_internal/server.d.ts +92 -0
  5. package/dist/_internal/server.js +181 -0
  6. package/dist/applet.d.ts +1 -0
  7. package/dist/applet.js +184 -0
  8. package/dist/batch-Qa4B4-Yp.d.ts +30 -0
  9. package/dist/build-BlmLiKro.js +90 -0
  10. package/dist/build-CcT-wNN9.js +2 -0
  11. package/dist/ci-0Q2mUh53.js +68 -0
  12. package/dist/client.d.ts +48 -0
  13. package/dist/client.js +38 -0
  14. package/dist/contract-QUvEGiRI.d.ts +23 -0
  15. package/dist/deploy-BbL3GObV.js +2579 -0
  16. package/dist/email-DBTVhNB_.js +62 -0
  17. package/dist/generate-XB-72Fzj.js +537 -0
  18. package/dist/generate-wIN3IYqL.js +2 -0
  19. package/dist/index.d.ts +185 -0
  20. package/dist/index.js +251 -0
  21. package/dist/init-DwsXRUk-.js +244 -0
  22. package/dist/lazy-client-x0DCI98S.js +64 -0
  23. package/dist/load-config-OKZU3UKn.js +27 -0
  24. package/dist/login-BBO74hPC.js +12 -0
  25. package/dist/logs-XvK6Zs5Y.js +183 -0
  26. package/dist/manifest-4ZAc6HUk.js +191 -0
  27. package/dist/manifest-I-9s8R36.d.ts +88 -0
  28. package/dist/me-BW7Paary.js +32 -0
  29. package/dist/project-B0qNXnFu.js +536 -0
  30. package/dist/prompt-ChS-grYO.js +29 -0
  31. package/dist/query-cache-CXmAyLv3.js +82 -0
  32. package/dist/react.d.ts +37 -0
  33. package/dist/react.js +515 -0
  34. package/dist/schedules-BkWZsbSs.js +42 -0
  35. package/dist/server.d.ts +46 -0
  36. package/dist/server.js +104 -0
  37. package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
  38. package/dist/telephony.d.ts +77 -0
  39. package/dist/telephony.js +607 -0
  40. package/dist/upload-DKZzz5kW.d.ts +112 -0
  41. package/dist/upload-DRbVhuDm.js +114 -0
  42. package/dist/variables-0tjnAeut.js +108 -0
  43. package/dist/vite.d.ts +63 -0
  44. package/dist/vite.js +816 -0
  45. package/dist/workflow-CTo2kZF1.js +51 -0
  46. package/dist/workflow-DurM6Fwx.d.ts +28 -0
  47. package/dist/workflow-engine-MogejNfF.js +117 -0
  48. package/dist/workspace-DruAZPmV.js +390 -0
  49. package/package.json +112 -0
  50. package/scaffold/.agents/skills/hitch-applets/SKILL.md +163 -0
  51. package/scaffold/.agents/skills/hitch-applets/references/client.md +73 -0
  52. package/scaffold/.agents/skills/hitch-applets/references/email-tracking.md +49 -0
  53. package/scaffold/.agents/skills/hitch-applets/references/files.md +109 -0
  54. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +198 -0
  55. package/scaffold/.agents/skills/hitch-applets/references/markdown.md +37 -0
  56. package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
  57. package/scaffold/.agents/skills/hitch-applets/references/records.md +176 -0
  58. package/scaffold/.agents/skills/hitch-applets/references/schedules.md +91 -0
  59. package/scaffold/.agents/skills/hitch-applets/references/server.md +95 -0
  60. package/scaffold/.agents/skills/hitch-applets/references/workflows.md +81 -0
  61. package/scaffold/.agents/skills/hitch-cli/SKILL.md +129 -0
  62. package/scaffold/.agents/skills/hitch-data/SKILL.md +52 -0
  63. package/scaffold/.agents/skills/hitch-data/references/attributes.md +127 -0
  64. package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
  65. package/scaffold/.agents/skills/hitch-theory/SKILL.md +151 -0
  66. package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
  67. package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
  68. package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  69. package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  70. package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  71. package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  72. package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
  73. package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
  74. package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
  75. package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
  76. package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
  77. package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
  78. package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
  79. package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
  80. package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
  81. package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
  82. package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
  83. package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  84. package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
  85. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
  86. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  87. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
  88. package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  89. package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
  90. package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
  91. package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  92. package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
  93. package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
  94. package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  95. package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
  96. package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  97. package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  98. package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
  99. package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  100. package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
  101. package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  102. package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  103. package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
  104. package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
  105. package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  106. package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
  107. package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  108. package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  109. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  110. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  111. package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
  112. package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  113. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  114. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
  115. package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  116. package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
  117. package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  118. package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  119. package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  120. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  121. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  122. package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
  123. package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
  124. package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
  125. package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
  126. package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
  127. package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
  128. package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
  129. package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
  130. package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
  131. package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
  132. package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
  133. package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
  134. package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
  135. package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
  136. package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
  137. package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
  138. package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
  139. package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
  140. package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
  141. package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
  142. package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
  143. package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
  144. package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
  145. package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
  146. package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
  147. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
  148. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
  149. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
  150. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
  151. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
  152. package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
  153. package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
  154. package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
  155. package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
  156. package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
  157. package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
  158. package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
  159. package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
  160. package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
  161. package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
  162. package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
  163. package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
  164. package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
  165. package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
  166. package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
  167. package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
  168. package/scaffold/.github/workflows/hitch.yml +15 -0
  169. package/scaffold/AGENTS.md +38 -0
  170. package/scaffold/applet/components.json +25 -0
  171. package/scaffold/applet/src/client/components/ui/alert.tsx +73 -0
  172. package/scaffold/applet/src/client/components/ui/avatar.tsx +100 -0
  173. package/scaffold/applet/src/client/components/ui/badge.tsx +55 -0
  174. package/scaffold/applet/src/client/components/ui/button.tsx +90 -0
  175. package/scaffold/applet/src/client/components/ui/card.tsx +85 -0
  176. package/scaffold/applet/src/client/components/ui/checkbox.tsx +35 -0
  177. package/scaffold/applet/src/client/components/ui/dialog.tsx +164 -0
  178. package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +235 -0
  179. package/scaffold/applet/src/client/components/ui/input-group.tsx +144 -0
  180. package/scaffold/applet/src/client/components/ui/input.tsx +22 -0
  181. package/scaffold/applet/src/client/components/ui/label.tsx +29 -0
  182. package/scaffold/applet/src/client/components/ui/popover.tsx +74 -0
  183. package/scaffold/applet/src/client/components/ui/select.tsx +243 -0
  184. package/scaffold/applet/src/client/components/ui/separator.tsx +25 -0
  185. package/scaffold/applet/src/client/components/ui/sheet.tsx +177 -0
  186. package/scaffold/applet/src/client/components/ui/skeleton.tsx +13 -0
  187. package/scaffold/applet/src/client/components/ui/spinner.tsx +17 -0
  188. package/scaffold/applet/src/client/components/ui/switch.tsx +41 -0
  189. package/scaffold/applet/src/client/components/ui/table.tsx +114 -0
  190. package/scaffold/applet/src/client/components/ui/tabs.tsx +78 -0
  191. package/scaffold/applet/src/client/components/ui/textarea.tsx +23 -0
  192. package/scaffold/applet/src/client/lib/utils.ts +1 -0
  193. package/scaffold/applet/src/client/styles/globals.css +136 -0
@@ -0,0 +1,30 @@
1
+ import { AnyContractRouter } from "@orpc/contract";
2
+ //#region src/hitch/batch.d.ts
3
+ type BatchVerb = "create" | "update" | "delete" | "updateWhere";
4
+ type BatchTxRecords<Records> = { [Code in keyof Records]: { [Verb in keyof Records[Code] & BatchVerb]: Records[Code][Verb] extends ((...args: infer Args) => unknown) ? (input: Args[0]) => void : never; }; };
5
+ type BatchTx<T> = T extends {
6
+ records: infer Records;
7
+ } ? BatchTxRecords<Records> : never;
8
+ type BatchRecorderOptions = {
9
+ dryRun?: boolean;
10
+ idempotencyKey?: string;
11
+ };
12
+ type BatchRecorderCall<T, Batch> = Batch extends ((...args: infer _Args) => infer Result) ? (record: (tx: BatchTx<T>) => void | Promise<void>, options?: BatchRecorderOptions) => Result : never;
13
+ type WithBatchRecorder<T> = T extends {
14
+ records: unknown;
15
+ batch: infer Batch;
16
+ } ? Omit<T, "batch"> & {
17
+ /**
18
+ * Record record writes inside `record` and send them as one atomic batch.
19
+ *
20
+ * The callback receives a `tx` whose `create` / `update` / `updateWhere` /
21
+ * `delete` calls are buffered, not sent immediately; the whole batch runs
22
+ * in a single transaction when the callback resolves.
23
+ *
24
+ * @remarks A batch may contain at most **100** requests. More than that is
25
+ * rejected with a `400` before any write runs.
26
+ */
27
+ batch: BatchRecorderCall<T, Batch> & Batch;
28
+ } : T;
29
+ //#endregion
30
+ export { WithBatchRecorder as t };
@@ -0,0 +1,90 @@
1
+ import { i as prepareAppletProjects, r as prepareAppletProject } from "./project-B0qNXnFu.js";
2
+ import { rm } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { createInterface } from "node:readline";
6
+ //#region src/build.ts
7
+ function isMissingFile(error) {
8
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
9
+ }
10
+ async function runPnpm(args, cwd) {
11
+ await new Promise((resolveRun, rejectRun) => {
12
+ let finished = false;
13
+ const child = spawn("pnpm", args, {
14
+ cwd,
15
+ stdio: "inherit",
16
+ shell: process.platform === "win32"
17
+ });
18
+ child.once("error", (error) => {
19
+ finished = true;
20
+ rejectRun(isMissingFile(error) ? /* @__PURE__ */ new Error("pnpm was not found. Install pnpm, then run applet build again.") : error);
21
+ });
22
+ child.once("close", (code) => {
23
+ if (finished) return;
24
+ finished = true;
25
+ if (code === 0) {
26
+ resolveRun();
27
+ return;
28
+ }
29
+ rejectRun(/* @__PURE__ */ new Error(`pnpm ${args.join(" ")} failed${code === null ? "." : ` with exit code ${code}.`}`));
30
+ });
31
+ });
32
+ }
33
+ async function buildApplet(appletRoot, outDir = ".hitch/dist") {
34
+ await runPnpm(["install"], await prepareAppletProject(appletRoot));
35
+ await buildPreparedApplet(appletRoot, outDir);
36
+ }
37
+ async function prepareWorkspaceBuild(workspaceRoot, appletRoots) {
38
+ await prepareAppletProjects(workspaceRoot, appletRoots);
39
+ await runPnpm(["install"], workspaceRoot);
40
+ }
41
+ async function buildPreparedApplet(appletRoot, outDir = ".hitch/dist", logPrefix = "") {
42
+ await rm(resolve(appletRoot, ".hitch"), {
43
+ force: true,
44
+ recursive: true
45
+ });
46
+ await new Promise((resolveBuild, rejectBuild) => {
47
+ let finished = false;
48
+ const child = spawn("pnpm", [
49
+ "exec",
50
+ "vite",
51
+ "build",
52
+ "--outDir",
53
+ outDir
54
+ ], {
55
+ cwd: appletRoot,
56
+ stdio: logPrefix === "" ? "inherit" : [
57
+ "ignore",
58
+ "pipe",
59
+ "pipe"
60
+ ],
61
+ shell: process.platform === "win32"
62
+ });
63
+ if (child.stdout) createInterface({
64
+ input: child.stdout,
65
+ crlfDelay: Infinity
66
+ }).on("line", (line) => console.log(`${logPrefix}${line}`));
67
+ if (child.stderr) createInterface({
68
+ input: child.stderr,
69
+ crlfDelay: Infinity
70
+ }).on("line", (line) => console.error(`${logPrefix}${line}`));
71
+ child.once("error", (error) => {
72
+ finished = true;
73
+ rejectBuild(isMissingFile(error) ? /* @__PURE__ */ new Error("pnpm was not found. Install pnpm, then run applet build again.") : error);
74
+ });
75
+ child.once("close", (code) => {
76
+ if (finished) return;
77
+ finished = true;
78
+ if (code === 0) {
79
+ resolveBuild();
80
+ return;
81
+ }
82
+ rejectBuild(/* @__PURE__ */ new Error(`pnpm exec vite build failed${code === null ? "." : ` with exit code ${code}.`}`));
83
+ });
84
+ });
85
+ }
86
+ async function runBuild() {
87
+ await buildApplet(process.cwd());
88
+ }
89
+ //#endregion
90
+ export { runBuild as i, buildPreparedApplet as n, prepareWorkspaceBuild as r, buildApplet as t };
@@ -0,0 +1,2 @@
1
+ import { i as runBuild } from "./build-BlmLiKro.js";
2
+ export { runBuild };
@@ -0,0 +1,68 @@
1
+ import { f as resolveInstanceUrl } from "./workspace-DruAZPmV.js";
2
+ //#region src/ci.ts
3
+ function githubActionsContext(env = process.env) {
4
+ if (env.GITHUB_ACTIONS !== "true" || env.HITCH_API_KEY) return void 0;
5
+ const requestUrl = env.ACTIONS_ID_TOKEN_REQUEST_URL;
6
+ const requestToken = env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
7
+ if (!requestUrl || !requestToken) throw new Error("GitHub Actions did not provide an OIDC token. Grant the job the id-token: write permission, or set HITCH_API_KEY.");
8
+ return {
9
+ requestUrl,
10
+ requestToken
11
+ };
12
+ }
13
+ async function hitchResponseError(response, summary) {
14
+ let details = "";
15
+ try {
16
+ const body = await response.json();
17
+ if (body !== null && typeof body === "object") details = ["code" in body && typeof body.code === "string" ? body.code : void 0, "message" in body && typeof body.message === "string" ? body.message : void 0].filter((value) => value !== void 0).join(": ");
18
+ } catch {
19
+ details = "";
20
+ }
21
+ return /* @__PURE__ */ new Error(`${summary} (${response.status})${details ? `: ${details}` : ""}.`);
22
+ }
23
+ async function githubActionsToken(context, instanceUrl, fetcher) {
24
+ const url = new URL(context.requestUrl);
25
+ url.searchParams.set("audience", new URL(instanceUrl).origin);
26
+ const response = await fetcher(url, { headers: { Authorization: `bearer ${context.requestToken}` } });
27
+ if (!response.ok) throw new Error(`GitHub did not issue an OIDC token (${response.status}).`);
28
+ const body = await response.json();
29
+ if (body === null || typeof body !== "object" || !("value" in body)) throw new Error("GitHub returned an OIDC token response without a value.");
30
+ if (typeof body.value !== "string") throw new Error("GitHub returned an OIDC token response without a value.");
31
+ return body.value;
32
+ }
33
+ async function fetchWithGitHubActions(context, options, request) {
34
+ const instanceUrl = await resolveInstanceUrl(void 0, options.store);
35
+ return request(instanceUrl, await githubActionsToken(context, instanceUrl, options.fetch ?? globalThis.fetch));
36
+ }
37
+ async function loadGitHubActionsBuildInputs(context, options, requiresChangeset) {
38
+ const fetcher = options.fetch ?? globalThis.fetch;
39
+ const query = requiresChangeset === void 0 ? "" : `?changeset_id=${encodeURIComponent(requiresChangeset)}`;
40
+ const response = await fetchWithGitHubActions(context, options, (instanceUrl, accessToken) => fetcher(`${instanceUrl}/api/ci/v1/build-inputs${query}`, {
41
+ method: "POST",
42
+ headers: { Authorization: `Bearer ${accessToken}` }
43
+ }));
44
+ if (!response.ok) throw await hitchResponseError(response, "Failed to load the CI build inputs");
45
+ const body = await response.json();
46
+ if (body === null || typeof body !== "object" || !("openapi" in body) || !("theme" in body) || typeof body.theme !== "string") throw new Error("The CI build inputs must contain an openapi document and a theme string.");
47
+ return {
48
+ openapi: body.openapi,
49
+ theme: body.theme
50
+ };
51
+ }
52
+ async function loadGitHubActionsSources(context, options) {
53
+ const fetcher = options.fetch ?? globalThis.fetch;
54
+ const response = await fetchWithGitHubActions(context, options, (instanceUrl, accessToken) => fetcher(`${instanceUrl}/api/ci/v1/applets`, { headers: { Authorization: `Bearer ${accessToken}` } }));
55
+ if (!response.ok) throw await hitchResponseError(response, "Failed to load the CI applets");
56
+ const body = await response.json();
57
+ if (body === null || typeof body !== "object" || !("data" in body) || !Array.isArray(body.data)) throw new Error("The CI applets response must contain a data array.");
58
+ return body.data.map((source) => {
59
+ if (source === null || typeof source !== "object" || !("code" in source) || typeof source.code !== "string" || !("source_directory" in source) || typeof source.source_directory !== "string" || !("git_sha" in source) || source.git_sha !== null && typeof source.git_sha !== "string") throw new Error("Each CI applet must contain code, source_directory, and git_sha fields.");
60
+ return {
61
+ code: source.code,
62
+ sourceDirectory: source.source_directory,
63
+ gitSha: source.git_sha
64
+ };
65
+ });
66
+ }
67
+ //#endregion
68
+ export { loadGitHubActionsSources as a, loadGitHubActionsBuildInputs as i, githubActionsContext as n, hitchResponseError as r, fetchWithGitHubActions as t };
@@ -0,0 +1,48 @@
1
+ import { f as RegisteredContract, m as RegisteredRouter, p as RegisteredManifest } from "./manifest-I-9s8R36.js";
2
+ import { t as NarrowContract } from "./contract-QUvEGiRI.js";
3
+ import { t as WithBatchRecorder } from "./batch-Qa4B4-Yp.js";
4
+ import { o as WithFilesUpload } from "./upload-DKZzz5kW.js";
5
+ import { RouterClient } from "@orpc/server";
6
+ import { ContractRouterClient } from "@orpc/contract";
7
+ import { NestedClient } from "@orpc/client";
8
+ import { RouterUtils } from "@orpc/tanstack-query";
9
+ //#region src/query-utils.d.ts
10
+ type Exact<Expected, Actual> = Actual extends symbol ? Actual : Actual extends Expected ? Actual extends readonly unknown[] ? Actual : Actual extends object ? NonNullable<Expected> extends object ? { [Key in keyof Actual]: Key extends keyof NonNullable<Expected> ? Exact<NonNullable<Expected>[Key], Actual[Key]> : never; } : Actual : Actual : never;
11
+ type QueryOptionsFunction<Utils> = Extract<Utils extends {
12
+ queryOptions: infer Function;
13
+ } ? Function : never, (...args: never[]) => unknown>;
14
+ type QueryOptionsArgument<Utils> = NonNullable<Parameters<QueryOptionsFunction<Utils>>[0]>;
15
+ type ExactOptions<Input, Options> = Options extends {
16
+ input: infer Actual;
17
+ } ? Options & {
18
+ input: Exact<Input, Actual>;
19
+ } : Options extends {
20
+ input?: infer Actual;
21
+ } ? Options & {
22
+ input?: Exact<Input, Actual>;
23
+ } : Options;
24
+ type QueryOptionsResult<Utils, Options> = Options & Omit<ReturnType<QueryOptionsFunction<Utils>>, keyof Options>;
25
+ type ExactQueryOptions<Utils, Input> = <Options extends QueryOptionsArgument<Utils> = QueryOptionsArgument<Utils>>(...rest: undefined extends Input ? [options?: ExactOptions<Input, Options>] : [options: ExactOptions<Input, Options>]) => QueryOptionsResult<Utils, Options>;
26
+ type ClientTree = NestedClient<Record<never, never>>;
27
+ type ExactRouterUtils<Client extends ClientTree> = Client extends ((...args: infer Arguments) => unknown) ? Omit<RouterUtils<Client>, "queryOptions"> & {
28
+ queryOptions: ExactQueryOptions<RouterUtils<Client>, Arguments[0]>;
29
+ } : Omit<RouterUtils<Client>, keyof Client> & { [Key in keyof Client]: Client[Key] extends ClientTree ? ExactRouterUtils<Client[Key]> : never; };
30
+ //#endregion
31
+ //#region src/author/client.d.ts
32
+ type AuthorContract = NarrowContract<RegisteredContract, RegisteredManifest>;
33
+ type BaseHitchClient = ContractRouterClient<AuthorContract>;
34
+ type AuthorHitchClient = WithBatchRecorder<BaseHitchClient>;
35
+ type BaseHitchUtils = ExactRouterUtils<BaseHitchClient>;
36
+ type AuthorHitchUtils = AuthorHitchClient extends {
37
+ batch: infer Batch;
38
+ } ? BaseHitchUtils extends {
39
+ batch: infer BatchUtils;
40
+ } ? Omit<BaseHitchUtils, "batch"> & {
41
+ batch: Omit<BatchUtils, "call"> & {
42
+ call: Batch;
43
+ };
44
+ } : BaseHitchUtils : BaseHitchUtils;
45
+ declare const hitch: WithFilesUpload<AuthorHitchUtils>;
46
+ declare const api: ExactRouterUtils<RouterClient<RegisteredRouter>>;
47
+ //#endregion
48
+ export { api, hitch };
package/dist/client.js ADDED
@@ -0,0 +1,38 @@
1
+ import { n as withFilesUpload, r as getRegisteredHitchContract } from "./upload-DRbVhuDm.js";
2
+ import { n as withBatchRecorder, t as createLazyClientProxy } from "./lazy-client-x0DCI98S.js";
3
+ import { createORPCClient } from "@orpc/client";
4
+ import { OpenAPILink } from "@orpc/openapi-client/fetch";
5
+ import { createTanstackQueryUtils } from "@orpc/tanstack-query";
6
+ import { RPCLink } from "@orpc/client/fetch";
7
+ //#region src/hitch/browser.ts
8
+ function createHitchClient(contract) {
9
+ return createLazyClientProxy(() => createORPCClient(new OpenAPILink(contract, {
10
+ url: `${location.origin}/api`,
11
+ fetch: (request, init) => globalThis.fetch(request, init)
12
+ })));
13
+ }
14
+ //#endregion
15
+ //#region src/client.ts
16
+ function createClient(...[options]) {
17
+ const clientOptions = options;
18
+ return createLazyClientProxy(() => {
19
+ const base = clientOptions?.base ?? `${import.meta.env.BASE_URL}api`;
20
+ const origin = typeof location === "undefined" ? "http://localhost" : location.origin;
21
+ return createORPCClient(new RPCLink({
22
+ url: new URL(base, origin),
23
+ fetch: (request, init) => (clientOptions?.fetch ?? globalThis.fetch)(request, init)
24
+ }));
25
+ });
26
+ }
27
+ //#endregion
28
+ //#region src/author/client.ts
29
+ function buildClientHitch() {
30
+ const contract = getRegisteredHitchContract();
31
+ if (contract === void 0) throw new Error("`hitch` is unavailable: run `applet generate` first. The framework imports your .hitch automatically at build; in plain node import your .hitch once before calling hitch.");
32
+ return withBatchRecorder(createHitchClient(contract), contract);
33
+ }
34
+ const hitchClient = createLazyClientProxy(buildClientHitch);
35
+ const hitch = withFilesUpload(createTanstackQueryUtils(hitchClient), () => hitchClient.files);
36
+ const api = createTanstackQueryUtils(createClient());
37
+ //#endregion
38
+ export { api, hitch };
@@ -0,0 +1,23 @@
1
+ import { n as AppletManifest } from "./manifest-I-9s8R36.js";
2
+ import { AnyContractRouter } from "@orpc/contract";
3
+ //#region src/hitch/contract.d.ts
4
+ type ManifestObjectFor<Manifest, Code> = Manifest extends {
5
+ objects: readonly (infer Object)[];
6
+ } ? Object extends {
7
+ code: infer ObjectCode;
8
+ } ? Code extends ObjectCode ? Object : never : never : never;
9
+ type ManifestObjectCodes<Manifest> = Manifest extends {
10
+ objects: readonly (infer Object)[];
11
+ } ? Object extends {
12
+ code: infer Code extends PropertyKey;
13
+ } ? Code : never : never;
14
+ type Capability<ManifestObject, Key extends "canCreate" | "canDelete" | "readWrite"> = ManifestObject extends Record<Key, infer Value> ? Value : never;
15
+ type NarrowProcedures<Procedures, ManifestObject> = Omit<Procedures, (true extends Capability<ManifestObject, "canCreate"> ? never : "create") | (true extends Capability<ManifestObject, "canDelete"> ? never : "delete") | (Capability<ManifestObject, "readWrite"> extends readonly [] ? "update" | "updateWhere" : never)>;
16
+ type NarrowContract<Contract, Manifest> = Contract extends {
17
+ records: infer Records;
18
+ } ? Omit<Contract, "records"> & {
19
+ records: { [Code in keyof Records & ManifestObjectCodes<Manifest>]: NarrowProcedures<Records[Code], ManifestObjectFor<Manifest, Code>>; };
20
+ } : Contract;
21
+ declare function pruneContract<const Contract extends AnyContractRouter, const Manifest extends AppletManifest>(contract: Contract, manifest: Manifest): NarrowContract<Contract, Manifest>;
22
+ //#endregion
23
+ export { pruneContract as n, NarrowContract as t };