@hitch42/applet 0.1.0-beta.9 → 0.1.1-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.
- package/dist/_internal/client.js +120 -11
- package/dist/_internal/log-context.d.ts +34 -0
- package/dist/_internal/log-context.js +2 -0
- package/dist/_internal/server.js +112 -57
- package/dist/applet.js +12 -12
- package/dist/build-Bh_S5BUv.js +2 -0
- package/dist/{build-CAb26kMY.js → build-CEfFoIZZ.js} +1 -1
- package/dist/{ci-5qWl7lT3.js → ci-BKw14X2h.js} +14 -13
- package/dist/client.d.ts +2 -2
- package/dist/{contract-rP_eV9PK.d.ts → contract-CsUpTBe0.d.ts} +1 -1
- package/dist/{deploy-D_OFJ6-Q.js → deploy-wGYjwXrx.js} +139 -88
- package/dist/{generate-CBPnHoqX.js → generate-BEIYs17x.js} +54 -22
- package/dist/generate-Dox-OYt6.js +2 -0
- package/dist/headers-DkNr9MLJ.js +17 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/{init-tfzwuYnk.js → init-6oGPM46R.js} +10 -15
- package/dist/{load-config-BYSxDVAl.js → load-config-xEdTXs0y.js} +2 -2
- package/dist/log-context-zu8U9Sjm.js +73 -0
- package/dist/{login-C7RKmmTe.js → login-CUx3TmFQ.js} +1 -1
- package/dist/{logs-DgjgAxj2.js → logs-DSjuEN0Q.js} +20 -22
- package/dist/{manifest-DD_SGkS6.d.ts → manifest-C6_F4bL8.d.ts} +5 -1
- package/dist/{manifest-Bp87Uz0a.js → manifest-CJSL9GuC.js} +20 -4
- package/dist/{project-D6XHllmC.js → project-BRZGd6xq.js} +197 -16
- package/dist/query-cache-CXmAyLv3.js +82 -0
- package/dist/react.d.ts +2 -1
- package/dist/react.js +59 -39
- package/dist/{schedules-dhU1yyFr.js → schedules-C8_Svr4h.js} +1 -1
- package/dist/server.d.ts +8 -3
- package/dist/server.js +29 -8
- package/dist/telephony.d.ts +24 -4
- package/dist/telephony.js +135 -16
- package/dist/{variables-Bwnr7oxf.js → variables-DT5RyHdH.js} +13 -13
- package/dist/vite.d.ts +3 -60
- package/dist/vite.js +50 -15
- package/dist/{workflow-engine-MogejNfF.js → workflow-engine-BOTzURKM.js} +1 -7
- package/dist/{workspace-XVtM12ZC.js → workspace-D0dnnlxL.js} +33 -38
- package/package.json +13 -6
- package/scaffold/.agents/skills/hitch-applets/SKILL.md +29 -3
- package/scaffold/.agents/skills/hitch-applets/references/manifest.md +8 -0
- package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
- package/scaffold/.agents/skills/hitch-applets/references/records.md +2 -0
- package/scaffold/.agents/skills/hitch-data/SKILL.md +2 -1
- package/scaffold/.agents/skills/hitch-data/references/attributes.md +7 -1
- package/scaffold/.agents/skills/hitch-data/references/limits.md +13 -13
- package/scaffold/.agents/skills/hitch-theory/SKILL.md +3 -2
- package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
- package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
- package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
- package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
- package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
- package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
- package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
- package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
- package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
- package/scaffold/.github/workflows/hitch.yml +1 -1
- package/scaffold/AGENTS.md +2 -2
- package/scaffold/applet/src/client/components/ui/alert.tsx +1 -1
- package/scaffold/applet/src/client/components/ui/button.tsx +1 -1
- package/scaffold/applet/src/client/components/ui/checkbox.tsx +1 -1
- package/scaffold/applet/src/client/components/ui/dialog.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/input-group.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/select.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/sheet.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/spinner.tsx +2 -1
- package/scaffold/applet/src/client/components/ui/tabs.tsx +1 -1
- package/scaffold/applet/src/client/lib/utils.ts +1 -6
- package/scaffold/applet/src/client/styles/globals.css +2 -0
- package/dist/build-BfbTbt_r.js +0 -2
- package/dist/generate-BgepN4-b.js +0 -2
package/dist/_internal/client.js
CHANGED
|
@@ -1,15 +1,112 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as openCacheDatabase, n as clearAppletQueryCaches, o as sweepExpiredQueryCaches, r as indexedDbPersister, t as cacheTabId } from "../query-cache-CXmAyLv3.js";
|
|
2
2
|
import { QueryClientProvider } from "@tanstack/react-query";
|
|
3
3
|
import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
|
|
4
4
|
import { RouterProvider } from "@tanstack/react-router";
|
|
5
|
-
import { createElement } from "react";
|
|
5
|
+
import { createElement, useEffect } from "react";
|
|
6
6
|
import { createRoot } from "react-dom/client";
|
|
7
|
+
import { RotateCcw } from "lucide-react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/internal/error-page.tsx
|
|
10
|
+
const STYLES = `
|
|
11
|
+
.hitch-error {
|
|
12
|
+
position: relative;
|
|
13
|
+
display: flex;
|
|
14
|
+
min-height: 100dvh;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
padding: 3rem 1.5rem;
|
|
19
|
+
background:
|
|
20
|
+
radial-gradient(ellipse 80% 50% at 50% -20%, color-mix(in oklch, var(--primary) 12%, transparent), transparent),
|
|
21
|
+
var(--background);
|
|
22
|
+
color: var(--foreground);
|
|
23
|
+
font-family: "Inter Variable", Inter, ui-sans-serif, system-ui, sans-serif;
|
|
24
|
+
}
|
|
25
|
+
.hitch-error__content { width: 100%; max-width: 28rem; text-align: center; }
|
|
26
|
+
.hitch-error__title { margin: 0 0 0.75rem; font-size: 1.875rem; font-weight: 600; letter-spacing: -0.025em; }
|
|
27
|
+
.hitch-error__text { margin: 0 0 2rem; color: var(--muted-foreground); line-height: 1.625; text-wrap: balance; }
|
|
28
|
+
.hitch-error__button {
|
|
29
|
+
display: inline-flex;
|
|
30
|
+
width: 100%;
|
|
31
|
+
align-items: center;
|
|
32
|
+
justify-content: center;
|
|
33
|
+
gap: 0.5rem;
|
|
34
|
+
border: 0;
|
|
35
|
+
border-radius: calc(var(--radius, 0.625rem) + 4px);
|
|
36
|
+
padding: 0.75rem 1.5rem;
|
|
37
|
+
background: var(--primary);
|
|
38
|
+
color: var(--primary-foreground);
|
|
39
|
+
font: inherit;
|
|
40
|
+
font-weight: 500;
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
transition: background 150ms;
|
|
43
|
+
}
|
|
44
|
+
.hitch-error__button:hover { background: color-mix(in oklch, var(--primary) 90%, transparent); }
|
|
45
|
+
.hitch-error__button:focus-visible { outline: 2px solid var(--ring, var(--primary)); outline-offset: 2px; }
|
|
46
|
+
.hitch-error__hint { margin: 1rem 0 0; color: var(--muted-foreground); font-size: 0.875rem; }
|
|
47
|
+
.hitch-error__details { margin-top: 1.5rem; color: var(--muted-foreground); font-size: 0.875rem; text-align: left; }
|
|
48
|
+
.hitch-error__details summary { cursor: pointer; text-align: center; }
|
|
49
|
+
.hitch-error__details pre {
|
|
50
|
+
max-height: 12rem;
|
|
51
|
+
margin: 0.75rem 0 0;
|
|
52
|
+
padding: 1rem;
|
|
53
|
+
overflow: auto;
|
|
54
|
+
border: 1px solid var(--border);
|
|
55
|
+
border-radius: var(--radius, 0.625rem);
|
|
56
|
+
font: 0.75rem/1.5 ui-monospace, monospace;
|
|
57
|
+
white-space: pre;
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
function AppletErrorPage({ error, onReload }) {
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
console.error("The applet failed to render.", error);
|
|
63
|
+
}, [error]);
|
|
64
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
65
|
+
className: "hitch-error",
|
|
66
|
+
role: "alert",
|
|
67
|
+
children: [/* @__PURE__ */ jsx("style", { children: STYLES }), /* @__PURE__ */ jsxs("div", {
|
|
68
|
+
className: "hitch-error__content",
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ jsx("h1", {
|
|
71
|
+
className: "hitch-error__title",
|
|
72
|
+
children: "We hit a snag"
|
|
73
|
+
}),
|
|
74
|
+
/* @__PURE__ */ jsx("p", {
|
|
75
|
+
className: "hitch-error__text",
|
|
76
|
+
children: "This applet ran into an unexpected error. Reload to try again."
|
|
77
|
+
}),
|
|
78
|
+
/* @__PURE__ */ jsxs("button", {
|
|
79
|
+
type: "button",
|
|
80
|
+
className: "hitch-error__button",
|
|
81
|
+
onClick: onReload,
|
|
82
|
+
children: [/* @__PURE__ */ jsx(RotateCcw, {
|
|
83
|
+
size: 16,
|
|
84
|
+
"aria-hidden": true
|
|
85
|
+
}), "Reload applet"]
|
|
86
|
+
}),
|
|
87
|
+
/* @__PURE__ */ jsx("p", {
|
|
88
|
+
className: "hitch-error__hint",
|
|
89
|
+
children: "If this keeps happening, let your admin know."
|
|
90
|
+
}),
|
|
91
|
+
import.meta.env.DEV && /* @__PURE__ */ jsxs("details", {
|
|
92
|
+
className: "hitch-error__details",
|
|
93
|
+
children: [/* @__PURE__ */ jsx("summary", { children: "Error details" }), /* @__PURE__ */ jsx("pre", { children: error instanceof Error ? error.stack ?? error.message : String(error) })]
|
|
94
|
+
})
|
|
95
|
+
]
|
|
96
|
+
})]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
7
100
|
//#region src/internal/client.ts
|
|
8
101
|
const CACHE_MAX_AGE = 3e5;
|
|
9
102
|
const CACHE_SCOPE_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
10
103
|
async function appletQueryPersistence(appletCode) {
|
|
11
104
|
const contextPromise = window.__hitchCacheContext;
|
|
12
105
|
if (!contextPromise) return void 0;
|
|
106
|
+
const databaseReady = openCacheDatabase().then(() => true, (error) => {
|
|
107
|
+
console.error("Could not open the applet query cache.", error);
|
|
108
|
+
return false;
|
|
109
|
+
});
|
|
13
110
|
let context;
|
|
14
111
|
try {
|
|
15
112
|
context = await contextPromise;
|
|
@@ -20,16 +117,10 @@ async function appletQueryPersistence(appletCode) {
|
|
|
20
117
|
const cacheScope = typeof context === "object" && context !== null && "cacheScope" in context && typeof context.cacheScope === "string" ? context.cacheScope.trim() : void 0;
|
|
21
118
|
const cacheBuster = typeof context === "object" && context !== null && "cacheBuster" in context && typeof context.cacheBuster === "string" ? context.cacheBuster.trim() : void 0;
|
|
22
119
|
if (!cacheScope || !CACHE_SCOPE_PATTERN.test(cacheScope) || !cacheBuster || !CACHE_SCOPE_PATTERN.test(cacheBuster)) return;
|
|
120
|
+
if (!await databaseReady) return void 0;
|
|
23
121
|
try {
|
|
24
122
|
return {
|
|
25
|
-
persister:
|
|
26
|
-
storage: window.sessionStorage,
|
|
27
|
-
key: `hitch:query:${appletCode}:${cacheScope}`,
|
|
28
|
-
throttleTime: 100,
|
|
29
|
-
retry: ({ error }) => {
|
|
30
|
-
console.error("Could not persist the applet query cache.", error);
|
|
31
|
-
}
|
|
32
|
-
}),
|
|
123
|
+
persister: indexedDbPersister(`${appletCode}:${cacheScope}:${cacheTabId()}`),
|
|
33
124
|
maxAge: CACHE_MAX_AGE,
|
|
34
125
|
buster: cacheBuster,
|
|
35
126
|
dehydrateOptions: { shouldDehydrateMutation: () => false }
|
|
@@ -44,12 +135,30 @@ function mountApplet(router, appletCode) {
|
|
|
44
135
|
if (!queryClient) throw new Error("getRouter must provide a QueryClient via createRouter({ context: { queryClient } }).");
|
|
45
136
|
const root = document.getElementById("root");
|
|
46
137
|
if (root === null) throw new Error("Missing #root element in index.html.");
|
|
138
|
+
router.options.defaultErrorComponent ??= ({ error }) => createElement(AppletErrorPage, {
|
|
139
|
+
error,
|
|
140
|
+
onReload: () => {
|
|
141
|
+
queryClient.clear();
|
|
142
|
+
clearAppletQueryCaches(appletCode).catch((error) => console.error("Could not clear the applet query cache.", error)).finally(() => window.location.reload());
|
|
143
|
+
}
|
|
144
|
+
});
|
|
47
145
|
const applet = createElement(RouterProvider, { router });
|
|
146
|
+
const sweepWhenIdle = () => {
|
|
147
|
+
const sweep = () => {
|
|
148
|
+
sweepExpiredQueryCaches(CACHE_MAX_AGE).catch((error) => console.error("Could not clear expired applet query caches.", error));
|
|
149
|
+
};
|
|
150
|
+
if ("requestIdleCallback" in window) requestIdleCallback(sweep);
|
|
151
|
+
else setTimeout(sweep, 1e3);
|
|
152
|
+
};
|
|
48
153
|
appletQueryPersistence(appletCode).then((persistence) => {
|
|
49
154
|
createRoot(root).render(persistence ? createElement(PersistQueryClientProvider, {
|
|
50
155
|
client: queryClient,
|
|
51
156
|
persistOptions: persistence,
|
|
52
|
-
|
|
157
|
+
onSuccess: sweepWhenIdle,
|
|
158
|
+
onError: () => {
|
|
159
|
+
console.error("Could not restore the applet query cache.");
|
|
160
|
+
sweepWhenIdle();
|
|
161
|
+
}
|
|
53
162
|
}, applet) : createElement(QueryClientProvider, { client: queryClient }, applet));
|
|
54
163
|
}).catch((error) => {
|
|
55
164
|
console.error("Could not initialize the applet query cache.", error);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/server/log-context.d.ts
|
|
2
|
+
declare const REQUEST_CONTEXT_CHANNEL = "hitch.request.context";
|
|
3
|
+
declare const APP_CONTEXT_CHANNEL = "hitch.request.app";
|
|
4
|
+
declare const isUuid: (value: string | null | undefined) => value is string;
|
|
5
|
+
declare function requestIdFrom(headers: Headers): string;
|
|
6
|
+
declare function publishNote(requestId: string, fields: Record<string, unknown>, channelName?: string): void;
|
|
7
|
+
declare function errorNote(error: unknown): {
|
|
8
|
+
error: {
|
|
9
|
+
name: string;
|
|
10
|
+
message: string;
|
|
11
|
+
stack?: string;
|
|
12
|
+
cause?: {
|
|
13
|
+
name: string;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
declare function cloudflareRequestFields(request: Request): {
|
|
19
|
+
cfRay: string | undefined;
|
|
20
|
+
traceparent: string | undefined;
|
|
21
|
+
colo: string | undefined;
|
|
22
|
+
country: string | undefined;
|
|
23
|
+
asn: number | undefined;
|
|
24
|
+
};
|
|
25
|
+
type NoteLog = {
|
|
26
|
+
set(fields: Record<string, unknown>): void;
|
|
27
|
+
error(error: unknown): void;
|
|
28
|
+
getContext(): Record<string, unknown>;
|
|
29
|
+
};
|
|
30
|
+
declare function createNoteLog(initial: {
|
|
31
|
+
requestId: string;
|
|
32
|
+
} & Record<string, unknown>): NoteLog;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { APP_CONTEXT_CHANNEL, NoteLog, REQUEST_CONTEXT_CHANNEL, cloudflareRequestFields, createNoteLog, errorNote, isUuid, publishNote, requestIdFrom };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as errorNote, c as requestIdFrom, i as createNoteLog, n as REQUEST_CONTEXT_CHANNEL, o as isUuid, r as cloudflareRequestFields, s as publishNote, t as APP_CONTEXT_CHANNEL } from "../log-context-zu8U9Sjm.js";
|
|
2
|
+
export { APP_CONTEXT_CHANNEL, REQUEST_CONTEXT_CHANNEL, cloudflareRequestFields, createNoteLog, errorNote, isUuid, publishNote, requestIdFrom };
|
package/dist/_internal/server.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { c as listEmailTrackersInputSchema, t as createEmailPixelInputSchema, u as markEmailTrackerSentBodySchema } from "../email-DBTVhNB_.js";
|
|
2
|
-
import { a as
|
|
3
|
-
import { o as runWithRequestContext, r as toMilliseconds, t as MAX_DURATION_MS } from "../workflow-CTo2kZF1.js";
|
|
2
|
+
import { a as HITCH_ORG_CODE_HEADER, c as HITCH_SCHEDULE_HEADER, d as HITCH_USER_HEADER, f as HITCH_WORKFLOW_HEADER, i as HITCH_ORGANIZATION_HEADER, l as HITCH_SCHEDULE_RUN_HEADER, m as HITCH_WORKFLOW_RUN_HEADER, n as HITCH_APPLET_HEADER, o as HITCH_RELEASE_HEADER, p as HITCH_WORKFLOW_INVOCATION_HEADER, r as HITCH_APPLET_TOKEN_HEADER, u as HITCH_SESSION_HEADER } from "../headers-DkNr9MLJ.js";
|
|
3
|
+
import { a as getRequestContext, o as runWithRequestContext, r as toMilliseconds, t as MAX_DURATION_MS } from "../workflow-CTo2kZF1.js";
|
|
4
|
+
import { a as errorNote, c as requestIdFrom, i as createNoteLog, r as cloudflareRequestFields, s as publishNote, t as APP_CONTEXT_CHANNEL } from "../log-context-zu8U9Sjm.js";
|
|
5
|
+
import { a as workflowOutcomeSchema, i as workflowInvocationRequestSchema, n as runWorkflowJournal, r as journalEntrySchema, t as WorkflowFailedError } from "../workflow-engine-BOTzURKM.js";
|
|
4
6
|
import { z } from "zod";
|
|
5
7
|
import { RPCHandler } from "@orpc/server/fetch";
|
|
6
8
|
//#region src/server/telephony-protocol.ts
|
|
@@ -116,65 +118,118 @@ function jsonError(status, error) {
|
|
|
116
118
|
function createWorkerEntry(server, options) {
|
|
117
119
|
const candidate = server;
|
|
118
120
|
if (typeof candidate !== "object" || candidate === null || !("router" in candidate)) throw new Error(SERVER_EXPORT_ERROR);
|
|
119
|
-
const handler = new RPCHandler(server.router)
|
|
121
|
+
const handler = new RPCHandler(server.router, { clientInterceptors: [async (options) => {
|
|
122
|
+
getRequestContext().log.set({
|
|
123
|
+
route: `/api/${options.path.join("/")}`,
|
|
124
|
+
procedure: options.path.join("/")
|
|
125
|
+
});
|
|
126
|
+
try {
|
|
127
|
+
return await options.next();
|
|
128
|
+
} catch (error) {
|
|
129
|
+
publishNote(getRequestContext().requestId, errorNote(error), APP_CONTEXT_CHANNEL);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}] });
|
|
120
133
|
return { async fetch(request, env) {
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
sessionToken
|
|
129
|
-
} : appletId !== null && token !== null ? {
|
|
130
|
-
kind: "applet",
|
|
131
|
-
appletId,
|
|
132
|
-
token
|
|
133
|
-
} : void 0;
|
|
134
|
-
if (identity === void 0) return jsonError(401, "missing_identity");
|
|
135
|
-
const bindings = typeof env === "object" && env !== null ? env : {};
|
|
136
|
-
if (typeof bindings.HITCH_API_URL !== "string") return jsonError(500, "missing_api_binding");
|
|
137
|
-
const service = typeof bindings.HITCH === "object" && bindings.HITCH !== null ? bindings.HITCH : void 0;
|
|
138
|
-
const apiFetch = typeof service?.fetch === "function" ? service.fetch.bind(bindings.HITCH) : globalThis.fetch.bind(globalThis);
|
|
139
|
-
return runWithRequestContext({
|
|
140
|
-
identity,
|
|
134
|
+
const url = new URL(request.url);
|
|
135
|
+
const requestId = requestIdFrom(request.headers);
|
|
136
|
+
const log = createNoteLog({
|
|
137
|
+
requestId,
|
|
138
|
+
service: "hitch-applet",
|
|
139
|
+
operation: "http.request",
|
|
140
|
+
callerType: "anonymous",
|
|
141
141
|
appletCode: options.code,
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
142
|
+
host: request.headers.get("x-hitch-request-host") ?? url.host,
|
|
143
|
+
orgCode: request.headers.get(HITCH_ORG_CODE_HEADER),
|
|
144
|
+
hitchOrganization: request.headers.get(HITCH_ORGANIZATION_HEADER),
|
|
145
|
+
hitchApplet: request.headers.get(HITCH_APPLET_HEADER),
|
|
146
|
+
hitchRelease: request.headers.get(HITCH_RELEASE_HEADER),
|
|
147
|
+
scheduleCode: request.headers.get(HITCH_SCHEDULE_HEADER),
|
|
148
|
+
hitchRun: request.headers.get(HITCH_WORKFLOW_RUN_HEADER),
|
|
149
|
+
workflowCode: request.headers.get(HITCH_WORKFLOW_HEADER),
|
|
150
|
+
workflowInvocation: request.headers.get(HITCH_WORKFLOW_INVOCATION_HEADER),
|
|
151
|
+
userAgent: request.headers.get("user-agent"),
|
|
152
|
+
contentType: request.headers.get("content-type"),
|
|
153
|
+
method: request.method,
|
|
154
|
+
...cloudflareRequestFields(request)
|
|
155
|
+
});
|
|
156
|
+
try {
|
|
157
|
+
const userId = request.headers.get(HITCH_USER_HEADER);
|
|
158
|
+
const sessionToken = request.headers.get(HITCH_SESSION_HEADER);
|
|
159
|
+
const appletId = request.headers.get(HITCH_APPLET_HEADER);
|
|
160
|
+
const token = request.headers.get(HITCH_APPLET_TOKEN_HEADER);
|
|
161
|
+
const identity = userId !== null && sessionToken !== null ? {
|
|
162
|
+
kind: "user",
|
|
163
|
+
userId,
|
|
164
|
+
sessionToken
|
|
165
|
+
} : appletId !== null && token !== null ? {
|
|
166
|
+
kind: "applet",
|
|
167
|
+
appletId,
|
|
168
|
+
token
|
|
169
|
+
} : void 0;
|
|
170
|
+
if (identity === void 0) return jsonError(401, "missing_identity");
|
|
171
|
+
log.set({
|
|
172
|
+
callerType: identity.kind,
|
|
173
|
+
callerId: identity.kind === "user" ? `user:${identity.userId}` : `applet:${identity.appletId}`
|
|
174
|
+
});
|
|
175
|
+
const bindings = typeof env === "object" && env !== null ? env : {};
|
|
176
|
+
if (typeof bindings.HITCH_API_URL !== "string") return jsonError(500, "missing_api_binding");
|
|
177
|
+
const service = typeof bindings.HITCH === "object" && bindings.HITCH !== null ? bindings.HITCH : void 0;
|
|
178
|
+
const apiFetch = typeof service?.fetch === "function" ? service.fetch.bind(bindings.HITCH) : globalThis.fetch.bind(globalThis);
|
|
179
|
+
const invocationId = identity.kind === "applet" ? request.headers.get(HITCH_SCHEDULE_RUN_HEADER) : null;
|
|
180
|
+
if (invocationId) log.set({
|
|
181
|
+
operation: "applet.schedule.procedure",
|
|
182
|
+
hitchType: "schedule",
|
|
183
|
+
hitchInvocation: invocationId
|
|
184
|
+
});
|
|
185
|
+
return await runWithRequestContext({
|
|
186
|
+
identity,
|
|
187
|
+
appletCode: options.code,
|
|
188
|
+
api: {
|
|
189
|
+
baseUrl: bindings.HITCH_API_URL,
|
|
190
|
+
fetch: apiFetch
|
|
191
|
+
},
|
|
192
|
+
log,
|
|
193
|
+
requestId
|
|
194
|
+
}, async () => {
|
|
195
|
+
const pathname = new URL(request.url).pathname;
|
|
196
|
+
if (pathname === "/api/__hitch/telephony/message-received" && request.method === "POST") {
|
|
197
|
+
log.set({ route: "/api/__hitch/telephony/message-received" });
|
|
198
|
+
if (identity.kind !== "applet") return jsonError(403, "applet_identity_required");
|
|
199
|
+
const parsed = await request.json().then((body) => telephonyMessageReceivedEventSchema.safeParse(body)).catch(() => void 0);
|
|
200
|
+
if (!parsed?.success) return jsonError(400, "malformed_request");
|
|
201
|
+
const onMessageReceived = server.telephony?.onMessageReceived;
|
|
202
|
+
if (!onMessageReceived) return jsonError(404, "no_telephony_handler");
|
|
203
|
+
try {
|
|
204
|
+
await onMessageReceived(parsed.data);
|
|
205
|
+
return Response.json({ ok: true });
|
|
206
|
+
} catch (error) {
|
|
207
|
+
publishNote(requestId, errorNote(error), APP_CONTEXT_CHANNEL);
|
|
208
|
+
return jsonError(500, error instanceof Error ? error.message : String(error));
|
|
209
|
+
}
|
|
159
210
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
211
|
+
if (pathname.startsWith(WORKFLOW_PATH_PREFIX)) {
|
|
212
|
+
log.set({ route: `${WORKFLOW_PATH_PREFIX}:code` });
|
|
213
|
+
const parsed = await request.json().then((body) => workflowInvocationRequestSchema.safeParse(body)).catch(() => void 0);
|
|
214
|
+
if (parsed === void 0 || !parsed.success) return jsonError(400, "malformed_request");
|
|
215
|
+
const code = decodeURIComponent(pathname.slice(23));
|
|
216
|
+
const workflows = server.workflows ?? {};
|
|
217
|
+
const definition = Object.hasOwn(workflows, code) ? workflows[code] : void 0;
|
|
218
|
+
return Response.json(definition === void 0 ? {
|
|
219
|
+
kind: "error",
|
|
220
|
+
message: `Unknown workflow "${code}".`
|
|
221
|
+
} : await runWorkflowInvocation(definition, parsed.data));
|
|
222
|
+
}
|
|
223
|
+
const result = await handler.handle(request, {
|
|
224
|
+
context: {},
|
|
225
|
+
prefix: "/api"
|
|
226
|
+
});
|
|
227
|
+
return result.matched ? result.response : new Response(null, { status: 404 });
|
|
175
228
|
});
|
|
176
|
-
|
|
177
|
-
|
|
229
|
+
} catch (error) {
|
|
230
|
+
publishNote(requestId, errorNote(error), APP_CONTEXT_CHANNEL);
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
178
233
|
} };
|
|
179
234
|
}
|
|
180
235
|
//#endregion
|
package/dist/applet.js
CHANGED
|
@@ -90,7 +90,7 @@ async function main() {
|
|
|
90
90
|
strict: true
|
|
91
91
|
});
|
|
92
92
|
if (positionals.length === 1 && positionals[0] === "login" && Object.keys(values).every((key) => key === "no-browser")) {
|
|
93
|
-
await (await import("./login-
|
|
93
|
+
await (await import("./login-CUx3TmFQ.js")).runLogin({ noBrowser: values["no-browser"] });
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
96
96
|
if (values["no-browser"] !== void 0) throw new Error(usage);
|
|
@@ -99,23 +99,23 @@ async function main() {
|
|
|
99
99
|
const noLogFlags = values.run === void 0 && values.filter === void 0 && values.level === void 0 && values.limit === void 0 && values.live === void 0 && values.search === void 0 && values.since === void 0;
|
|
100
100
|
const noModeFlags = values["client-only"] === void 0 && values["server-only"] === void 0;
|
|
101
101
|
if (positionals.length === 1 && positionals[0] === "bootstrap" && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
102
|
-
await (await import("./init-
|
|
102
|
+
await (await import("./init-6oGPM46R.js")).runBootstrap({ install: values["no-install"] !== true });
|
|
103
103
|
return;
|
|
104
104
|
}
|
|
105
105
|
if (positionals.length === 1 && positionals[0] === "generate" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
106
|
-
await (await import("./generate-
|
|
106
|
+
await (await import("./generate-Dox-OYt6.js")).runGenerate();
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
109
|
if (positionals.length === 1 && positionals[0] === "build" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
110
|
-
await (await import("./build-
|
|
110
|
+
await (await import("./build-Bh_S5BUv.js")).runBuild();
|
|
111
111
|
return;
|
|
112
112
|
}
|
|
113
113
|
if (positionals.length === 1 && positionals[0] === "deploy" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
114
|
-
await (await import("./deploy-
|
|
114
|
+
await (await import("./deploy-wGYjwXrx.js")).runDeploy({});
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
117
|
if (positionals.length === 2 && positionals[0] === "init" && noModeFlags && noVariableFlags && noLogFlags) {
|
|
118
|
-
await (await import("./init-
|
|
118
|
+
await (await import("./init-6oGPM46R.js")).runInit(positionals[1], {
|
|
119
119
|
commit: values["no-commit"] !== true,
|
|
120
120
|
git: values["no-git"] !== true,
|
|
121
121
|
install: values["no-install"] !== true
|
|
@@ -123,7 +123,7 @@ async function main() {
|
|
|
123
123
|
return;
|
|
124
124
|
}
|
|
125
125
|
if (positionals.length === 2 && positionals[0] === "new" && noGitFlags && noVariableFlags && noLogFlags) {
|
|
126
|
-
await (await import("./init-
|
|
126
|
+
await (await import("./init-6oGPM46R.js")).runNew({
|
|
127
127
|
code: positionals[1],
|
|
128
128
|
clientOnly: values["client-only"],
|
|
129
129
|
install: values["no-install"] !== true,
|
|
@@ -132,7 +132,7 @@ async function main() {
|
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
134
134
|
if ((positionals.length === 1 || positionals.length === 2) && positionals[0] === "logs" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags) {
|
|
135
|
-
await (await import("./logs-
|
|
135
|
+
await (await import("./logs-DSjuEN0Q.js")).runLogs({
|
|
136
136
|
code: positionals[1],
|
|
137
137
|
filter: values.filter,
|
|
138
138
|
run: values.run,
|
|
@@ -145,14 +145,14 @@ async function main() {
|
|
|
145
145
|
return;
|
|
146
146
|
}
|
|
147
147
|
if (positionals.length === 3 && positionals[0] === "schedules" && positionals[1] === "run" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noLogFlags && values.secret === void 0) {
|
|
148
|
-
await (await import("./schedules-
|
|
148
|
+
await (await import("./schedules-C8_Svr4h.js")).runSchedule({
|
|
149
149
|
code: positionals[2],
|
|
150
150
|
yes: values.yes
|
|
151
151
|
});
|
|
152
152
|
return;
|
|
153
153
|
}
|
|
154
154
|
if ((positionals.length === 3 || positionals.length === 4) && positionals[0] === "variables" && positionals[1] === "set" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noLogFlags) {
|
|
155
|
-
await (await import("./variables-
|
|
155
|
+
await (await import("./variables-DT5RyHdH.js")).runVariablesSet({
|
|
156
156
|
key: positionals[2],
|
|
157
157
|
secret: values.secret,
|
|
158
158
|
value: positionals[3],
|
|
@@ -161,11 +161,11 @@ async function main() {
|
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
163
163
|
if (positionals.length === 2 && positionals[0] === "variables" && positionals[1] === "list" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
164
|
-
await (await import("./variables-
|
|
164
|
+
await (await import("./variables-DT5RyHdH.js")).runVariablesList();
|
|
165
165
|
return;
|
|
166
166
|
}
|
|
167
167
|
if (positionals.length === 3 && positionals[0] === "variables" && positionals[1] === "delete" && values["no-install"] === void 0 && noModeFlags && noGitFlags && values.secret === void 0 && noLogFlags) {
|
|
168
|
-
await (await import("./variables-
|
|
168
|
+
await (await import("./variables-DT5RyHdH.js")).runVariablesDelete({
|
|
169
169
|
key: positionals[2],
|
|
170
170
|
yes: values.yes
|
|
171
171
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as prepareAppletProjects, r as prepareAppletProject } from "./project-
|
|
1
|
+
import { i as prepareAppletProjects, r as prepareAppletProject } from "./project-BRZGd6xq.js";
|
|
2
2
|
import { rm } from "node:fs/promises";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { f as resolveInstanceUrl } from "./workspace-D0dnnlxL.js";
|
|
2
2
|
//#region src/ci.ts
|
|
3
|
-
function githubActionsContext(
|
|
3
|
+
function githubActionsContext() {
|
|
4
|
+
const env = process.env;
|
|
4
5
|
if (env.GITHUB_ACTIONS !== "true" || env.HITCH_API_KEY) return void 0;
|
|
5
6
|
const requestUrl = env.ACTIONS_ID_TOKEN_REQUEST_URL;
|
|
6
7
|
const requestToken = env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
|
|
@@ -30,14 +31,14 @@ async function githubActionsToken(context, instanceUrl, fetcher) {
|
|
|
30
31
|
if (typeof body.value !== "string") throw new Error("GitHub returned an OIDC token response without a value.");
|
|
31
32
|
return body.value;
|
|
32
33
|
}
|
|
33
|
-
async function fetchWithGitHubActions(context,
|
|
34
|
-
const instanceUrl = await resolveInstanceUrl(
|
|
35
|
-
return request(instanceUrl, await githubActionsToken(context, instanceUrl,
|
|
34
|
+
async function fetchWithGitHubActions(context, request) {
|
|
35
|
+
const instanceUrl = await resolveInstanceUrl();
|
|
36
|
+
return request(instanceUrl, await githubActionsToken(context, instanceUrl, globalThis.fetch));
|
|
36
37
|
}
|
|
37
|
-
async function loadGitHubActionsBuildInputs(context,
|
|
38
|
-
const fetcher =
|
|
38
|
+
async function loadGitHubActionsBuildInputs(context, requiresChangeset) {
|
|
39
|
+
const fetcher = globalThis.fetch;
|
|
39
40
|
const query = requiresChangeset === void 0 ? "" : `?changeset_id=${encodeURIComponent(requiresChangeset)}`;
|
|
40
|
-
const response = await fetchWithGitHubActions(context,
|
|
41
|
+
const response = await fetchWithGitHubActions(context, (instanceUrl, accessToken) => fetcher(`${instanceUrl}/api/ci/v1/build-inputs${query}`, {
|
|
41
42
|
method: "POST",
|
|
42
43
|
headers: { Authorization: `Bearer ${accessToken}` }
|
|
43
44
|
}));
|
|
@@ -49,18 +50,18 @@ async function loadGitHubActionsBuildInputs(context, options, requiresChangeset)
|
|
|
49
50
|
theme: body.theme
|
|
50
51
|
};
|
|
51
52
|
}
|
|
52
|
-
async function loadGitHubActionsSources(context
|
|
53
|
-
const fetcher =
|
|
54
|
-
const response = await fetchWithGitHubActions(context,
|
|
53
|
+
async function loadGitHubActionsSources(context) {
|
|
54
|
+
const fetcher = globalThis.fetch;
|
|
55
|
+
const response = await fetchWithGitHubActions(context, (instanceUrl, accessToken) => fetcher(`${instanceUrl}/api/ci/v1/applets`, { headers: { Authorization: `Bearer ${accessToken}` } }));
|
|
55
56
|
if (!response.ok) throw await hitchResponseError(response, "Failed to load the CI applets");
|
|
56
57
|
const body = await response.json();
|
|
57
58
|
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
59
|
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" || !("
|
|
60
|
+
if (source === null || typeof source !== "object" || !("code" in source) || typeof source.code !== "string" || !("source_directory" in source) || typeof source.source_directory !== "string" || !("source_hash" in source) || source.source_hash !== null && typeof source.source_hash !== "string") throw new Error("Each CI applet must contain code, source_directory, and source_hash fields.");
|
|
60
61
|
return {
|
|
61
62
|
code: source.code,
|
|
62
63
|
sourceDirectory: source.source_directory,
|
|
63
|
-
|
|
64
|
+
sourceHash: source.source_hash
|
|
64
65
|
};
|
|
65
66
|
});
|
|
66
67
|
}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { f as RegisteredContract, m as RegisteredRouter, p as RegisteredManifest } from "./manifest-
|
|
2
|
-
import { t as NarrowContract } from "./contract-
|
|
1
|
+
import { f as RegisteredContract, m as RegisteredRouter, p as RegisteredManifest } from "./manifest-C6_F4bL8.js";
|
|
2
|
+
import { t as NarrowContract } from "./contract-CsUpTBe0.js";
|
|
3
3
|
import { t as WithBatchRecorder } from "./batch-Qa4B4-Yp.js";
|
|
4
4
|
import { o as WithFilesUpload } from "./upload-DKZzz5kW.js";
|
|
5
5
|
import { RouterClient } from "@orpc/server";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as AppletManifest } from "./manifest-
|
|
1
|
+
import { n as AppletManifest } from "./manifest-C6_F4bL8.js";
|
|
2
2
|
import { AnyContractRouter } from "@orpc/contract";
|
|
3
3
|
//#region src/hitch/contract.d.ts
|
|
4
4
|
type ManifestObjectFor<Manifest, Code> = Manifest extends {
|