@hitch42/applet 0.1.1-beta.1 → 0.1.1-beta.11
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.d.ts +14 -1
- package/dist/_internal/server.js +122 -118
- package/dist/applet.js +53 -29
- package/dist/build-Bh_S5BUv.js +2 -0
- package/dist/{build-Rk3xDZV7.js → build-CEfFoIZZ.js} +30 -14
- package/dist/ci-BKw14X2h.js +69 -0
- package/dist/client.d.ts +3 -3
- package/dist/{contract-DMrpbaLJ.d.ts → contract-CsUpTBe0.d.ts} +1 -1
- package/dist/{deploy-D3BGDqgC.js → deploy-wGYjwXrx.js} +249 -35
- package/dist/email-DBTVhNB_.js +62 -0
- package/dist/{generate-CH0VQmUi.js → generate-BEIYs17x.js} +79 -25
- package/dist/generate-Dox-OYt6.js +2 -0
- package/dist/headers-DkNr9MLJ.js +17 -0
- package/dist/index.d.ts +123 -11
- package/dist/index.js +142 -26
- package/dist/{init-BS1Y-eNL.js → init-6oGPM46R.js} +17 -18
- package/dist/load-config-xEdTXs0y.js +27 -0
- package/dist/log-context-zu8U9Sjm.js +73 -0
- package/dist/login-CUx3TmFQ.js +12 -0
- package/dist/{logs-m00pzr_O.js → logs-DSjuEN0Q.js} +20 -22
- package/dist/{manifest-BQCAxATS.d.ts → manifest-C6_F4bL8.d.ts} +9 -0
- package/dist/{manifest-DyoJ1MIL.js → manifest-CJSL9GuC.js} +25 -3
- package/dist/me-BW7Paary.js +32 -0
- package/dist/{project-CxN-Dtc7.js → project-BRZGd6xq.js} +227 -34
- package/dist/prompt-ChS-grYO.js +29 -0
- package/dist/query-cache-CXmAyLv3.js +82 -0
- package/dist/react.d.ts +3 -2
- package/dist/react.js +98 -80
- package/dist/schedules-C8_Svr4h.js +42 -0
- package/dist/server.d.ts +9 -4
- package/dist/server.js +29 -8
- package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
- package/dist/telephony.d.ts +97 -0
- package/dist/telephony.js +726 -0
- package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
- package/dist/{variables-CP7Ce3Np.js → variables-DT5RyHdH.js} +14 -39
- package/dist/vite.d.ts +3 -60
- package/dist/vite.js +503 -34
- package/dist/workflow-engine-BOTzURKM.js +111 -0
- package/dist/{auth-DaVK0k5R.js → workspace-D0dnnlxL.js} +75 -40
- package/package.json +19 -6
- package/scaffold/.agents/skills/hitch-applets/SKILL.md +60 -15
- package/scaffold/.agents/skills/hitch-applets/references/email-tracking.md +49 -0
- package/scaffold/.agents/skills/hitch-applets/references/files.md +3 -3
- package/scaffold/.agents/skills/hitch-applets/references/manifest.md +29 -2
- package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
- package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
- package/scaffold/.agents/skills/hitch-applets/references/records.md +32 -8
- package/scaffold/.agents/skills/hitch-applets/references/schedules.md +7 -2
- package/scaffold/.agents/skills/hitch-applets/references/server.md +0 -3
- package/scaffold/.agents/skills/hitch-applets/references/workflows.md +11 -3
- package/scaffold/.agents/skills/hitch-cli/SKILL.md +129 -0
- package/scaffold/.agents/skills/hitch-data/SKILL.md +52 -0
- package/scaffold/.agents/skills/hitch-data/references/attributes.md +127 -0
- package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
- package/scaffold/.agents/skills/hitch-theory/SKILL.md +151 -0
- 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 +15 -0
- 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-CEku1lyb.js +0 -2
- package/dist/generate-6Nbt7uii.js +0 -2
- package/dist/load-config-BnxocLAQ.js +0 -56
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 };
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { t as AnyWorkflowDefinition } from "../workflow-DurM6Fwx.js";
|
|
2
|
+
import { d as listEmailTrackersInputSchema, i as createEmailPixelInputSchema, p as markEmailTrackerSentBodySchema, t as TelephonyMessageReceivedEvent } from "../telephony-protocol-D-nf3Gca.js";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
//#region src/server/entry.d.ts
|
|
4
5
|
declare function createWorkerEntry(server: {
|
|
5
6
|
router: object;
|
|
6
7
|
workflows?: Record<string, AnyWorkflowDefinition>;
|
|
8
|
+
telephony?: {
|
|
9
|
+
onMessageReceived?: (event: TelephonyMessageReceivedEvent) => void | Promise<void>;
|
|
10
|
+
};
|
|
7
11
|
}, options: {
|
|
8
12
|
code: string;
|
|
9
13
|
}): {
|
|
@@ -76,4 +80,13 @@ type ErrorOutcome = {
|
|
|
76
80
|
declare const workflowOutcomeSchema: z.ZodType<StepOutcome | SleepOutcome | StepErrorOutcome | DoneOutcome | ErrorOutcome>;
|
|
77
81
|
type WorkflowOutcome = z.infer<typeof workflowOutcomeSchema>;
|
|
78
82
|
//#endregion
|
|
79
|
-
|
|
83
|
+
//#region src/server/workflow-engine.d.ts
|
|
84
|
+
type Engine = {
|
|
85
|
+
invoke<T>(name: string, fn: () => Promise<T>): Promise<T>;
|
|
86
|
+
sleepUntil(name: string, until: Date): Promise<void>;
|
|
87
|
+
sleep(name: string, milliseconds: number): Promise<void>;
|
|
88
|
+
};
|
|
89
|
+
declare class WorkflowFailedError extends Error {}
|
|
90
|
+
declare function runWorkflowJournal(engine: Engine, invoke: (journal: JournalEntry[]) => Promise<WorkflowOutcome>): Promise<unknown>;
|
|
91
|
+
//#endregion
|
|
92
|
+
export { type Engine, type JournalEntry, WorkflowFailedError, type WorkflowInvocationRequest, type WorkflowOutcome, createEmailPixelInputSchema, createWorkerEntry, journalEntrySchema, listEmailTrackersInputSchema, markEmailTrackerSentBodySchema, runWorkflowJournal, workflowInvocationRequestSchema, workflowOutcomeSchema };
|
package/dist/_internal/server.js
CHANGED
|
@@ -1,80 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as listEmailTrackersInputSchema, t as createEmailPixelInputSchema, u as markEmailTrackerSentBodySchema } from "../email-DBTVhNB_.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";
|
|
2
6
|
import { z } from "zod";
|
|
3
7
|
import { RPCHandler } from "@orpc/server/fetch";
|
|
4
|
-
//#region src/
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const journalEntrySchema = z.discriminatedUnion("kind", [
|
|
12
|
-
z.object({
|
|
13
|
-
kind: z.literal("step"),
|
|
14
|
-
id: z.string(),
|
|
15
|
-
name: z.string(),
|
|
16
|
-
result: z.unknown()
|
|
17
|
-
}),
|
|
18
|
-
z.object({
|
|
19
|
-
kind: z.literal("sleep"),
|
|
20
|
-
id: z.string(),
|
|
21
|
-
name: z.string(),
|
|
22
|
-
until: z.number()
|
|
23
|
-
}),
|
|
24
|
-
z.object({
|
|
25
|
-
kind: z.literal("attempt"),
|
|
26
|
-
id: z.string(),
|
|
27
|
-
name: z.string(),
|
|
28
|
-
error: z.string()
|
|
29
|
-
}),
|
|
30
|
-
z.object({
|
|
31
|
-
kind: z.literal("failed"),
|
|
32
|
-
id: z.string(),
|
|
33
|
-
name: z.string(),
|
|
34
|
-
error: z.string()
|
|
35
|
-
})
|
|
36
|
-
]);
|
|
37
|
-
const workflowInvocationRequestSchema = z.object({
|
|
38
|
-
payload: z.unknown(),
|
|
39
|
-
journal: z.array(journalEntrySchema)
|
|
8
|
+
//#region src/server/telephony-protocol.ts
|
|
9
|
+
const telephonyMessageReceivedEventSchema = z.object({
|
|
10
|
+
eventId: z.string(),
|
|
11
|
+
type: z.literal("message.received"),
|
|
12
|
+
messageId: z.string(),
|
|
13
|
+
numberId: z.string(),
|
|
14
|
+
occurredAt: z.iso.datetime()
|
|
40
15
|
});
|
|
41
|
-
const workflowOutcomeSchema = z.discriminatedUnion("kind", [
|
|
42
|
-
z.object({
|
|
43
|
-
kind: z.literal("step"),
|
|
44
|
-
id: z.string(),
|
|
45
|
-
name: z.string(),
|
|
46
|
-
result: z.unknown()
|
|
47
|
-
}),
|
|
48
|
-
z.object({
|
|
49
|
-
kind: z.literal("sleep"),
|
|
50
|
-
id: z.string(),
|
|
51
|
-
name: z.string(),
|
|
52
|
-
until: z.number()
|
|
53
|
-
}),
|
|
54
|
-
z.object({
|
|
55
|
-
kind: z.literal("step_error"),
|
|
56
|
-
id: z.string(),
|
|
57
|
-
name: z.string(),
|
|
58
|
-
message: z.string(),
|
|
59
|
-
retries: z.object({
|
|
60
|
-
limit: z.number(),
|
|
61
|
-
delayMs: z.number(),
|
|
62
|
-
backoff: z.enum([
|
|
63
|
-
"constant",
|
|
64
|
-
"linear",
|
|
65
|
-
"exponential"
|
|
66
|
-
])
|
|
67
|
-
})
|
|
68
|
-
}),
|
|
69
|
-
z.object({
|
|
70
|
-
kind: z.literal("done"),
|
|
71
|
-
result: z.unknown()
|
|
72
|
-
}),
|
|
73
|
-
z.object({
|
|
74
|
-
kind: z.literal("error"),
|
|
75
|
-
message: z.string()
|
|
76
|
-
})
|
|
77
|
-
]);
|
|
78
16
|
//#endregion
|
|
79
17
|
//#region src/server/workflow-run.ts
|
|
80
18
|
const MAX_RESULT_SIZE = 1048576;
|
|
@@ -180,53 +118,119 @@ function jsonError(status, error) {
|
|
|
180
118
|
function createWorkerEntry(server, options) {
|
|
181
119
|
const candidate = server;
|
|
182
120
|
if (typeof candidate !== "object" || candidate === null || !("router" in candidate)) throw new Error(SERVER_EXPORT_ERROR);
|
|
183
|
-
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
|
+
}] });
|
|
184
133
|
return { async fetch(request, env) {
|
|
185
|
-
const
|
|
186
|
-
const
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
sessionToken
|
|
193
|
-
} : appletId !== null && token !== null ? {
|
|
194
|
-
kind: "applet",
|
|
195
|
-
appletId,
|
|
196
|
-
token
|
|
197
|
-
} : void 0;
|
|
198
|
-
if (identity === void 0) return jsonError(401, "missing_identity");
|
|
199
|
-
const bindings = typeof env === "object" && env !== null ? env : {};
|
|
200
|
-
if (typeof bindings.HITCH_API_URL !== "string") return jsonError(500, "missing_api_binding");
|
|
201
|
-
const service = typeof bindings.HITCH === "object" && bindings.HITCH !== null ? bindings.HITCH : void 0;
|
|
202
|
-
const apiFetch = typeof service?.fetch === "function" ? service.fetch.bind(bindings.HITCH) : globalThis.fetch.bind(globalThis);
|
|
203
|
-
return runWithRequestContext({
|
|
204
|
-
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",
|
|
205
141
|
appletCode: options.code,
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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 });
|
|
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)
|
|
228
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
|
+
}
|
|
210
|
+
}
|
|
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 });
|
|
228
|
+
});
|
|
229
|
+
} catch (error) {
|
|
230
|
+
publishNote(requestId, errorNote(error), APP_CONTEXT_CHANNEL);
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
229
233
|
} };
|
|
230
234
|
}
|
|
231
235
|
//#endregion
|
|
232
|
-
export { createWorkerEntry, journalEntrySchema, workflowInvocationRequestSchema, workflowOutcomeSchema };
|
|
236
|
+
export { WorkflowFailedError, createEmailPixelInputSchema, createWorkerEntry, journalEntrySchema, listEmailTrackersInputSchema, markEmailTrackerSentBodySchema, runWorkflowJournal, workflowInvocationRequestSchema, workflowOutcomeSchema };
|
package/dist/applet.js
CHANGED
|
@@ -2,17 +2,22 @@
|
|
|
2
2
|
import { parseArgs } from "node:util";
|
|
3
3
|
//#region bin/applet.ts
|
|
4
4
|
const usage = `Usage:
|
|
5
|
+
applet login [--no-browser]
|
|
5
6
|
applet init <org> [--no-commit | --no-git] [--no-install]
|
|
6
7
|
applet bootstrap [--no-install]
|
|
7
8
|
applet new <code> [--client-only | --server-only] [--no-install]
|
|
8
|
-
applet generate
|
|
9
|
-
applet build
|
|
10
|
-
applet deploy
|
|
9
|
+
applet generate
|
|
10
|
+
applet build
|
|
11
|
+
applet deploy
|
|
11
12
|
applet logs [code] [--since <duration>] [--limit <count>]
|
|
12
13
|
[--search <text>] [--level <level>] [--filter <json>] [--run <id>] [--live]
|
|
13
14
|
applet variables set <KEY> [value] [--secret] [-y | --yes]
|
|
14
15
|
applet variables list
|
|
15
16
|
applet variables delete <KEY> [-y | --yes]
|
|
17
|
+
applet schedules run <code> [-y | --yes]
|
|
18
|
+
|
|
19
|
+
Login options:
|
|
20
|
+
--no-browser Print the sign-in URL without opening a browser.
|
|
16
21
|
|
|
17
22
|
Init options:
|
|
18
23
|
--no-commit Do not create the initial commit
|
|
@@ -27,14 +32,14 @@ New options:
|
|
|
27
32
|
Bootstrap options:
|
|
28
33
|
--no-install Do not run pnpm install
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
Schema changesets:
|
|
36
|
+
Set requiresChangeset in applet.manifest.ts to generate, build, and deploy
|
|
37
|
+
against a pending changeset. The release goes live when the changeset
|
|
38
|
+
applies in Hitch. After it applies, the field uses the live schema.
|
|
33
39
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
when the changeset applies. Manifest mismatches warn.
|
|
40
|
+
Run applet deploy in the workspace root to deploy every applet. In GitHub
|
|
41
|
+
Actions it skips an applet when neither its folder nor any file outside
|
|
42
|
+
applets/ changed since its current CI release.
|
|
38
43
|
|
|
39
44
|
Logs options:
|
|
40
45
|
--since <duration> Show logs from this period. Default: 1h. Maximum: 7d.
|
|
@@ -51,18 +56,25 @@ Variables options:
|
|
|
51
56
|
--secret Store the value as a secret.
|
|
52
57
|
-y, --yes Skip the live applet confirmation.
|
|
53
58
|
|
|
54
|
-
|
|
59
|
+
Schedules options:
|
|
60
|
+
-y, --yes Skip the schedule confirmation.
|
|
61
|
+
|
|
62
|
+
Login: applet login selects the organization from hitch.config.ts and shares
|
|
63
|
+
credentials with hitch login.
|
|
64
|
+
CI: set HITCH_API_KEY (and HITCH_API_URL for a non-default instance).
|
|
65
|
+
GitHub Actions: generate, build, and deploy use the job's OIDC token instead of
|
|
66
|
+
a key. Grant the job id-token: write.`;
|
|
55
67
|
async function main() {
|
|
56
68
|
const { positionals, values } = parseArgs({
|
|
57
69
|
allowPositionals: true,
|
|
58
70
|
options: {
|
|
59
|
-
changeset: { type: "string" },
|
|
60
71
|
"client-only": { type: "boolean" },
|
|
61
72
|
filter: { type: "string" },
|
|
62
73
|
run: { type: "string" },
|
|
63
74
|
level: { type: "string" },
|
|
64
75
|
limit: { type: "string" },
|
|
65
76
|
live: { type: "boolean" },
|
|
77
|
+
"no-browser": { type: "boolean" },
|
|
66
78
|
"no-commit": { type: "boolean" },
|
|
67
79
|
"no-git": { type: "boolean" },
|
|
68
80
|
"no-install": { type: "boolean" },
|
|
@@ -77,36 +89,41 @@ async function main() {
|
|
|
77
89
|
},
|
|
78
90
|
strict: true
|
|
79
91
|
});
|
|
92
|
+
if (positionals.length === 1 && positionals[0] === "login" && Object.keys(values).every((key) => key === "no-browser")) {
|
|
93
|
+
await (await import("./login-CUx3TmFQ.js")).runLogin({ noBrowser: values["no-browser"] });
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (values["no-browser"] !== void 0) throw new Error(usage);
|
|
80
97
|
const noGitFlags = values["no-commit"] === void 0 && values["no-git"] === void 0;
|
|
81
98
|
const noVariableFlags = values.secret === void 0 && values.yes === void 0;
|
|
82
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;
|
|
83
100
|
const noModeFlags = values["client-only"] === void 0 && values["server-only"] === void 0;
|
|
84
|
-
if (positionals.length === 1 && positionals[0] === "bootstrap" &&
|
|
85
|
-
await (await import("./init-
|
|
101
|
+
if (positionals.length === 1 && positionals[0] === "bootstrap" && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
102
|
+
await (await import("./init-6oGPM46R.js")).runBootstrap({ install: values["no-install"] !== true });
|
|
86
103
|
return;
|
|
87
104
|
}
|
|
88
105
|
if (positionals.length === 1 && positionals[0] === "generate" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
89
|
-
await (await import("./generate-
|
|
106
|
+
await (await import("./generate-Dox-OYt6.js")).runGenerate();
|
|
90
107
|
return;
|
|
91
108
|
}
|
|
92
109
|
if (positionals.length === 1 && positionals[0] === "build" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
93
|
-
await (await import("./build-
|
|
110
|
+
await (await import("./build-Bh_S5BUv.js")).runBuild();
|
|
94
111
|
return;
|
|
95
112
|
}
|
|
96
113
|
if (positionals.length === 1 && positionals[0] === "deploy" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags && noLogFlags) {
|
|
97
|
-
await (await import("./deploy-
|
|
114
|
+
await (await import("./deploy-wGYjwXrx.js")).runDeploy({});
|
|
98
115
|
return;
|
|
99
116
|
}
|
|
100
|
-
if (positionals.length === 2 && positionals[0] === "init" &&
|
|
101
|
-
await (await import("./init-
|
|
117
|
+
if (positionals.length === 2 && positionals[0] === "init" && noModeFlags && noVariableFlags && noLogFlags) {
|
|
118
|
+
await (await import("./init-6oGPM46R.js")).runInit(positionals[1], {
|
|
102
119
|
commit: values["no-commit"] !== true,
|
|
103
120
|
git: values["no-git"] !== true,
|
|
104
121
|
install: values["no-install"] !== true
|
|
105
122
|
});
|
|
106
123
|
return;
|
|
107
124
|
}
|
|
108
|
-
if (positionals.length === 2 && positionals[0] === "new" &&
|
|
109
|
-
await (await import("./init-
|
|
125
|
+
if (positionals.length === 2 && positionals[0] === "new" && noGitFlags && noVariableFlags && noLogFlags) {
|
|
126
|
+
await (await import("./init-6oGPM46R.js")).runNew({
|
|
110
127
|
code: positionals[1],
|
|
111
128
|
clientOnly: values["client-only"],
|
|
112
129
|
install: values["no-install"] !== true,
|
|
@@ -114,8 +131,8 @@ async function main() {
|
|
|
114
131
|
});
|
|
115
132
|
return;
|
|
116
133
|
}
|
|
117
|
-
if ((positionals.length === 1 || positionals.length === 2) && positionals[0] === "logs" && values
|
|
118
|
-
await (await import("./logs-
|
|
134
|
+
if ((positionals.length === 1 || positionals.length === 2) && positionals[0] === "logs" && values["no-install"] === void 0 && noModeFlags && noGitFlags && noVariableFlags) {
|
|
135
|
+
await (await import("./logs-DSjuEN0Q.js")).runLogs({
|
|
119
136
|
code: positionals[1],
|
|
120
137
|
filter: values.filter,
|
|
121
138
|
run: values.run,
|
|
@@ -127,8 +144,15 @@ async function main() {
|
|
|
127
144
|
});
|
|
128
145
|
return;
|
|
129
146
|
}
|
|
130
|
-
if (
|
|
131
|
-
await (await import("./
|
|
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-C8_Svr4h.js")).runSchedule({
|
|
149
|
+
code: positionals[2],
|
|
150
|
+
yes: values.yes
|
|
151
|
+
});
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
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-DT5RyHdH.js")).runVariablesSet({
|
|
132
156
|
key: positionals[2],
|
|
133
157
|
secret: values.secret,
|
|
134
158
|
value: positionals[3],
|
|
@@ -136,12 +160,12 @@ async function main() {
|
|
|
136
160
|
});
|
|
137
161
|
return;
|
|
138
162
|
}
|
|
139
|
-
if (positionals.length === 2 && positionals[0] === "variables" &&
|
|
140
|
-
await (await import("./variables-
|
|
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-DT5RyHdH.js")).runVariablesList();
|
|
141
165
|
return;
|
|
142
166
|
}
|
|
143
|
-
if (positionals.length === 3 && positionals[0] === "variables" &&
|
|
144
|
-
await (await import("./variables-
|
|
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-DT5RyHdH.js")).runVariablesDelete({
|
|
145
169
|
key: positionals[2],
|
|
146
170
|
yes: values.yes
|
|
147
171
|
});
|