@kizenapps/engine 1.9.1-c41e202 → 1.9.2-ce64cf0
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/README.md +136 -120
- package/dist/{chunk-BTPUAPQT.js → chunk-2AJY4I2T.js} +6 -8
- package/dist/chunk-2AJY4I2T.js.map +1 -0
- package/dist/{chunk-OOXUIWRQ.js → chunk-2V75NG3U.js} +3 -3
- package/dist/{chunk-OOXUIWRQ.js.map → chunk-2V75NG3U.js.map} +1 -1
- package/dist/{chunk-4YCXMK3X.js → chunk-5BBUKTOE.js} +3 -3
- package/dist/{chunk-4YCXMK3X.js.map → chunk-5BBUKTOE.js.map} +1 -1
- package/dist/{chunk-KLSFE47Q.js → chunk-G43HJUPD.js} +4 -4
- package/dist/{chunk-KLSFE47Q.js.map → chunk-G43HJUPD.js.map} +1 -1
- package/dist/{chunk-YXUC3W34.js → chunk-REAN7GYY.js} +3 -3
- package/dist/{chunk-YXUC3W34.js.map → chunk-REAN7GYY.js.map} +1 -1
- package/dist/{chunk-PMDBTXZ2.js → chunk-S4WCVWFO.js} +3 -3
- package/dist/{chunk-PMDBTXZ2.js.map → chunk-S4WCVWFO.js.map} +1 -1
- package/dist/{chunk-UF43EXLZ.js → chunk-TLZXIYKG.js} +3 -3
- package/dist/{chunk-UF43EXLZ.js.map → chunk-TLZXIYKG.js.map} +1 -1
- package/dist/{chunk-5MDTL4TJ.js → chunk-TPV5Q6GW.js} +6 -6
- package/dist/{chunk-5MDTL4TJ.js.map → chunk-TPV5Q6GW.js.map} +1 -1
- package/dist/{chunk-BR22X66J.js → chunk-XEZJ3I3F.js} +3 -3
- package/dist/{chunk-BR22X66J.js.map → chunk-XEZJ3I3F.js.map} +1 -1
- package/dist/communication.js +2 -2
- package/dist/contexts/base.js +4 -4
- package/dist/contexts/floatingFrame.js +5 -5
- package/dist/contexts/recordDetail.js +5 -5
- package/dist/index.js +4 -4
- package/dist/react.js +5 -5
- package/dist/util.js +6 -6
- package/dist/workers/calendarSource.worker.js +6 -6
- package/dist/workers/floatingFrame.worker.js +7 -7
- package/dist/workers/generic.worker.js +6 -6
- package/dist/workers/recordDetail.worker.js +7 -7
- package/package.json +21 -3
- package/dist/chunk-BTPUAPQT.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
## Kizen App Engine
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The runtime that powers plugin apps on the Kizen developer platform. It executes plugin JavaScript
|
|
4
|
+
inside sandboxed Web Workers and brokers everything that crosses the worker boundary — network
|
|
5
|
+
requests, rendered UI, modals, toasts, navigation, and file uploads.
|
|
6
|
+
|
|
7
|
+
**If you are writing a plugin,** you want the [plugin developer
|
|
8
|
+
documentation](https://kizen.github.io/app-engine/) (source under [`docs/`](docs/README.md)) and the
|
|
9
|
+
`@kizenapps/cli` app builder. The engine is what your plugin runs _on_ — you do not install it
|
|
10
|
+
yourself.
|
|
11
|
+
|
|
12
|
+
**If you are embedding the engine in a host application,** that is what the rest of this README
|
|
13
|
+
covers.
|
|
4
14
|
|
|
5
15
|
### Installation
|
|
6
16
|
|
|
7
17
|
```
|
|
8
|
-
|
|
18
|
+
pnpm add @kizenapps/engine
|
|
9
19
|
```
|
|
10
20
|
|
|
11
21
|
#### Usage With Vite
|
|
@@ -40,160 +50,137 @@ In order for translated strings to appear, you'll need to pass the app's transla
|
|
|
40
50
|
|
|
41
51
|
### Engine Usage
|
|
42
52
|
|
|
43
|
-
|
|
53
|
+
The engine has two halves:
|
|
54
|
+
|
|
55
|
+
- **Worker side** — the `this.*` API a plugin script calls. Fully documented in [`docs/`](docs/README.md); nothing to configure here.
|
|
56
|
+
- **Host side** — a React provider plus hooks, which is what you integrate.
|
|
57
|
+
|
|
58
|
+
The host side is deliberately unopinionated about your UI. You supply primitives — how to navigate,
|
|
59
|
+
how to show a toast, how to open a modal, how to make an authenticated request — and the engine
|
|
60
|
+
adapts them to the stable API that plugins are written against. That indirection is the point: a
|
|
61
|
+
plugin written once runs in any host that satisfies this contract.
|
|
44
62
|
|
|
45
63
|
#### Context Provider
|
|
46
64
|
|
|
65
|
+
Wrap your application in `AppEngineProvider`.
|
|
66
|
+
|
|
67
|
+
**Required props**
|
|
68
|
+
|
|
69
|
+
| Prop | Type | Purpose |
|
|
70
|
+
| --------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
71
|
+
| `user` | `{ id, crm_client_id }` | The signed-in user. |
|
|
72
|
+
| `teamMember` | `{ id, full_name, first_name, last_name, email, phone, created }` | Team-member profile, exposed to plugins as `this.currentUser.profile`. |
|
|
73
|
+
| `business` | `{ id }` | The active business/tenant. |
|
|
74
|
+
| `appPath` | `string` | Your API base path. |
|
|
75
|
+
| `onNavigate` | `(path: string, options?: { replace?: boolean }) => void` | Hand off to your router. |
|
|
76
|
+
| `performRequest` | `(method, url, payload?, options?) => Promise<{ data } \| undefined>` | Your authenticated HTTP client. Every plugin `this.get/post/patch/delete` is routed through it. |
|
|
77
|
+
| `showToast` | `({ message, variant?, autohide? }) => void` | Your toast implementation. |
|
|
78
|
+
| `clearToasts` | `() => void` | Dismiss all toasts. |
|
|
79
|
+
| `monitoringExceptionHelper` | `(error: Error, extra: { extra }) => void` | Where uncaught plugin errors are reported. |
|
|
80
|
+
| `modal` | `{ showing, show, showPrompt, onConfirm, onHide }` | Your confirm/prompt modal primitives. |
|
|
81
|
+
| `children` | render prop | See the render-prop table below. |
|
|
82
|
+
|
|
83
|
+
**Optional props**
|
|
84
|
+
|
|
85
|
+
| Prop | Type | Notes |
|
|
86
|
+
| ---------------------- | -------------------------------------------------------------- | --------------------------------------------------------------- |
|
|
87
|
+
| `clientObject` | `{ id, objectName }` | Contextual record object, when there is one. |
|
|
88
|
+
| `bootstrapPlugins` | `{ id, api_name }[]` | Plugins to bootstrap on mount. Defaults to `[]`. |
|
|
89
|
+
| `userConfigs` | `{ config, api_name }[]` | Per-user plugin config. Defaults to `[]`. |
|
|
90
|
+
| `onCompleteSetup` | `(pluginApiName, payload, options?) => Promise<unknown>` | Persist a plugin's setup-assistant result. |
|
|
91
|
+
| `createFileId` | `() => string` | Required only if plugins upload files. |
|
|
92
|
+
| `performFileUpload` | `(args) => Promise<unknown>` | Required only if plugins upload files. |
|
|
93
|
+
| `getPendingCacheCount` | `(search: string) => number` | Lets the engine wait on your in-flight cache writes. |
|
|
94
|
+
| `invalidateCache` | `(category: 'timeline' \| 'entity', entityId: string) => void` | Called when a plugin mutates a record. |
|
|
95
|
+
| `hideFramesOnModal` | `boolean` | Hide floating frames while a modal is open. Defaults to `true`. |
|
|
96
|
+
| `t` | `(s: string) => string` | Translation function. Omit for English. |
|
|
97
|
+
|
|
98
|
+
**A minimal integration**
|
|
99
|
+
|
|
47
100
|
```tsx
|
|
48
101
|
import { AppEngineProvider } from '@kizenapps/engine/react';
|
|
49
|
-
import {
|
|
50
|
-
import
|
|
51
|
-
import { useTranslation } from 'react-i18next';
|
|
102
|
+
import { useNavigate } from 'react-router-dom';
|
|
103
|
+
import { useCallback } from 'react';
|
|
52
104
|
|
|
53
|
-
const AppProvider = ({ user, teamMember, business,
|
|
54
|
-
const
|
|
105
|
+
const AppProvider = ({ user, teamMember, business, children }) => {
|
|
106
|
+
const navigate = useNavigate();
|
|
55
107
|
|
|
56
108
|
const onNavigate = useCallback(
|
|
57
|
-
(path: string,
|
|
58
|
-
|
|
59
|
-
history.replace(path);
|
|
60
|
-
} else {
|
|
61
|
-
history.push(path);
|
|
62
|
-
}
|
|
109
|
+
(path: string, options?: { replace?: boolean }) => {
|
|
110
|
+
navigate(path, { replace: Boolean(options?.replace) });
|
|
63
111
|
},
|
|
64
|
-
[
|
|
112
|
+
[navigate],
|
|
65
113
|
);
|
|
66
114
|
|
|
67
|
-
const [showToast, , clearToasts] = useToast();
|
|
68
|
-
|
|
69
|
-
const [integrationModalProps, , integrationModalTriggerProps] = useModal({});
|
|
70
|
-
|
|
71
|
-
const { onConfirm, show, onHide } = integrationModalProps;
|
|
72
|
-
const { show: showPrompt, showing } = integrationModalTriggerProps;
|
|
73
|
-
|
|
74
|
-
const { t } = useTranslation();
|
|
75
|
-
|
|
76
|
-
|
|
77
115
|
return (
|
|
78
116
|
<AppEngineProvider
|
|
79
117
|
user={user}
|
|
80
118
|
teamMember={teamMember}
|
|
81
119
|
business={business}
|
|
82
|
-
|
|
120
|
+
appPath={API_BASE_PATH}
|
|
83
121
|
onNavigate={onNavigate}
|
|
84
|
-
|
|
85
|
-
showToast={
|
|
86
|
-
clearToasts={
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
show,
|
|
90
|
-
onConfirm,
|
|
91
|
-
onHide,
|
|
92
|
-
showPrompt,
|
|
93
|
-
}}
|
|
94
|
-
performRequest={performKizenRequest}
|
|
95
|
-
appPath={import.meta.env.VITE_API_BASE_PATH}
|
|
96
|
-
bootstrapPlugins={pluginApps}
|
|
97
|
-
performFileUpload={FileService.upload}
|
|
98
|
-
getPendingCacheCount={getPendingCacheCount}
|
|
99
|
-
invalidateCache={invalidateCache}
|
|
100
|
-
t={t}
|
|
122
|
+
performRequest={myApiClient.request}
|
|
123
|
+
showToast={myToast.show}
|
|
124
|
+
clearToasts={myToast.clearAll}
|
|
125
|
+
monitoringExceptionHelper={reportError}
|
|
126
|
+
modal={myConfirmModal}
|
|
101
127
|
>
|
|
102
|
-
{({
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
derivedModalState,
|
|
113
|
-
showPluginModal,
|
|
114
|
-
pluginApiName,
|
|
115
|
-
...rest
|
|
116
|
-
}) => {
|
|
117
|
-
return (
|
|
118
|
-
<PluginContext.Provider
|
|
119
|
-
value={{
|
|
120
|
-
isFetched: hasFetchedBootstrap,
|
|
121
|
-
isLoading,
|
|
122
|
-
pluginNames,
|
|
123
|
-
floatingFrames: isLoading ? [] : floatingFrames,
|
|
124
|
-
routablePages,
|
|
125
|
-
dataAdornments,
|
|
126
|
-
calendarSources,
|
|
127
|
-
refetch,
|
|
128
|
-
fullRefetch,
|
|
129
|
-
installedPluginAPINamesToIds,
|
|
130
|
-
plugins: data,
|
|
131
|
-
toolbarItems,
|
|
132
|
-
toolbarItemsByFullId,
|
|
133
|
-
routeScripts,
|
|
134
|
-
automationSteps: isLoading ? [] : automationSteps,
|
|
135
|
-
objectSettingsMenuItems,
|
|
136
|
-
userConfigsByApiName,
|
|
137
|
-
featureFlags,
|
|
138
|
-
refetchFeatureFlags,
|
|
139
|
-
featureFlagsLoading: !hasCalculatedFeatureFlags && !hasFinishedBootstrapping,
|
|
140
|
-
businessPluginAppsByApiName,
|
|
141
|
-
...rest,
|
|
142
|
-
}}
|
|
143
|
-
>
|
|
144
|
-
{showLoadingIndicator ? <StyledLoader loading /> : null}
|
|
145
|
-
{children}
|
|
146
|
-
{showPluginModal ? (
|
|
147
|
-
<PluginModal modalState={derivedModalState} pluginApiName={pluginApiName} />
|
|
148
|
-
) : null}
|
|
149
|
-
{showCreateRecordModal ? (
|
|
150
|
-
<Suspense fallback={null}>
|
|
151
|
-
<CreateRecordModal
|
|
152
|
-
objectId={createRecordModalObjectId}
|
|
153
|
-
onComplete={handleCreateRecordComplete}
|
|
154
|
-
/>
|
|
155
|
-
</Suspense>
|
|
156
|
-
) : null}
|
|
157
|
-
{showCreateRelatedRecordModal ? (
|
|
158
|
-
<Suspense fallback={null}>
|
|
159
|
-
<CreateRelatedRecordModal
|
|
160
|
-
objectId={createRelatedRecordModalObjectId}
|
|
161
|
-
relatedEntityId={createRelatedRecordModalRelatedEntityId}
|
|
162
|
-
onComplete={handleCreateRelatedRecordComplete}
|
|
163
|
-
/>
|
|
164
|
-
</Suspense>
|
|
165
|
-
) : null}
|
|
166
|
-
</PluginContext.Provider>
|
|
167
|
-
);
|
|
168
|
-
}}
|
|
169
|
-
</PluginEngineProvider>
|
|
128
|
+
{({ showLoadingIndicator, showPluginModal, pluginApiName, derivedModalState }) => (
|
|
129
|
+
<>
|
|
130
|
+
{showLoadingIndicator ? <YourSpinner /> : null}
|
|
131
|
+
{children}
|
|
132
|
+
{showPluginModal ? (
|
|
133
|
+
<YourPluginModal modalState={derivedModalState} pluginApiName={pluginApiName} />
|
|
134
|
+
) : null}
|
|
135
|
+
</>
|
|
136
|
+
)}
|
|
137
|
+
</AppEngineProvider>
|
|
170
138
|
);
|
|
171
139
|
};
|
|
172
140
|
```
|
|
173
141
|
|
|
142
|
+
**The render prop**
|
|
143
|
+
|
|
144
|
+
The engine tells you _when_ to render something and _what_ to render it for; you supply the
|
|
145
|
+
component. Alongside the modal callbacks it passes:
|
|
146
|
+
|
|
147
|
+
| Key | Meaning |
|
|
148
|
+
| -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
149
|
+
| `showLoadingIndicator` | A blocking plugin script is running. |
|
|
150
|
+
| `hasFinishedBootstrapping` | All bootstrapped plugins have loaded. |
|
|
151
|
+
| `waitingOnRouteScript` | A route script is still resolving. |
|
|
152
|
+
| `hiddenByModal` | Floating frames are hidden behind a modal. |
|
|
153
|
+
| `showPluginModal`, `pluginApiName`, `derivedModalState` | Render a plugin-owned modal. |
|
|
154
|
+
| `showCreateRecordModal`, `createRecordModalObjectId`, `handleCreateRecordComplete` | A plugin asked for a record-creation modal. Call the handler with the created record. |
|
|
155
|
+
| `showCreateRelatedRecordModal`, `createRelatedRecordModalObjectId`, `createRelatedRecordModalRelatedEntityId`, `handleCreateRelatedRecordComplete` | Same, for a related record. |
|
|
156
|
+
| `handleShowModal`, `handleShowCreateRecordModal`, `handleShowCreateRelatedRecordModal`, `closeCurrentModal` | Imperative modal controls. |
|
|
157
|
+
|
|
174
158
|
#### Running Scripts
|
|
175
159
|
|
|
176
|
-
|
|
177
|
-
import { useGenericPluginCustomScript } from '@kizenapps/engine/react';
|
|
178
|
-
import { useToast } from 'components/ToastProvider';
|
|
160
|
+
Hooks are provided for each surface a plugin script can run on. The generic one:
|
|
179
161
|
|
|
180
|
-
|
|
181
|
-
|
|
162
|
+
```tsx
|
|
163
|
+
import { useGenericAppCustomScript } from '@kizenapps/engine/react';
|
|
182
164
|
|
|
183
|
-
|
|
165
|
+
const ScriptButton = ({ plugin, pluginScript }) => {
|
|
166
|
+
const [executeInline, { pending }] = useGenericAppCustomScript({
|
|
167
|
+
plugin,
|
|
184
168
|
onError: (e) => {
|
|
185
|
-
|
|
169
|
+
myToast.show({
|
|
186
170
|
message: `Script could not be executed: ${e?.message}`,
|
|
187
171
|
variant: 'failure',
|
|
188
172
|
});
|
|
189
173
|
},
|
|
190
|
-
plugin: item,
|
|
191
174
|
});
|
|
192
175
|
|
|
193
|
-
return <button onClick={() => executeInline(pluginScript)} disabled={
|
|
176
|
+
return <button onClick={() => executeInline(pluginScript)} disabled={pending} />;
|
|
194
177
|
};
|
|
195
178
|
```
|
|
196
179
|
|
|
180
|
+
Surface-specific equivalents are exported from `@kizenapps/engine/react` — `useAppPage`,
|
|
181
|
+
`useCustomBlock`, `useFloatingFrame`, `useRecordDetailCustomScript`,
|
|
182
|
+
`useCalendarSourceCustomScript`, and others.
|
|
183
|
+
|
|
197
184
|
#### Worker Runner
|
|
198
185
|
|
|
199
186
|
Some worker calls are coordinated using `@tanstack/react-query`. If your consumer app also uses react-query, the app engine will use your existing query provider. If you aren't already using react-query, the engine provider will be wrapped in its own query context and no additional action is needed.
|
|
@@ -275,3 +262,32 @@ if (context?.unsavedFilter) {
|
|
|
275
262
|
applyUnsavedFilter(context.unsavedFilter);
|
|
276
263
|
}
|
|
277
264
|
```
|
|
265
|
+
|
|
266
|
+
### Development
|
|
267
|
+
|
|
268
|
+
This repo uses pnpm.
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
pnpm install
|
|
272
|
+
pnpm build # extract translations, bundle with tsup, verify worker bundles
|
|
273
|
+
pnpm test # unit tests
|
|
274
|
+
pnpm typecheck
|
|
275
|
+
pnpm lint
|
|
276
|
+
pnpm format:check
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
`pnpm build` finishes by running `scripts/check-worker-bundles.js`, which fails the build if a
|
|
280
|
+
worker bundle pulls in code that must never run inside a worker (`localStorage`, React, and
|
|
281
|
+
similar) or if the worker chunks exceed their size budget.
|
|
282
|
+
|
|
283
|
+
The plugin developer documentation lives in [`docs/`](docs/README.md) and publishes to GitHub Pages
|
|
284
|
+
on merge to `main`. Its static-site generator is a standalone project under `docs/site`, with its
|
|
285
|
+
own lockfile and tests.
|
|
286
|
+
|
|
287
|
+
### License
|
|
288
|
+
|
|
289
|
+
Licensed under the GNU General Public License, version 3. See [LICENSE.md](LICENSE.md) for the full
|
|
290
|
+
text.
|
|
291
|
+
|
|
292
|
+
This matches the other published Kizen developer platform packages, `@kizenapps/cli` and
|
|
293
|
+
`@kizenapps/packager`. Note that the plugins themselves are licensed separately, under GPL 2.0.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { cleanConfig, buildIframeURLWithProxy, serializeConsoleArg } from './chunk-
|
|
2
|
-
import { Communicate } from './chunk-
|
|
3
|
-
import { RESPONSES, ACTIONS, ThirdPartyScript } from './chunk-
|
|
1
|
+
import { cleanConfig, buildIframeURLWithProxy, serializeConsoleArg } from './chunk-2V75NG3U.js';
|
|
2
|
+
import { Communicate } from './chunk-XEZJ3I3F.js';
|
|
3
|
+
import { RESPONSES, ACTIONS, ThirdPartyScript } from './chunk-5BBUKTOE.js';
|
|
4
4
|
|
|
5
5
|
// src/contexts/BaseWorkerContext.ts
|
|
6
6
|
var buildErrorResponse = async (result) => {
|
|
@@ -358,9 +358,7 @@ var BaseWorkerContext = class {
|
|
|
358
358
|
}
|
|
359
359
|
async completeSetup(payload, options) {
|
|
360
360
|
if (!this.pluginApiName) {
|
|
361
|
-
throw new Error(
|
|
362
|
-
"completeSetup is not available for scripts not associated to a plugin"
|
|
363
|
-
);
|
|
361
|
+
throw new Error("completeSetup is not available for scripts not associated to a plugin");
|
|
364
362
|
}
|
|
365
363
|
const candidate = payload;
|
|
366
364
|
if (typeof candidate !== "object" || candidate === null || Array.isArray(candidate)) {
|
|
@@ -812,5 +810,5 @@ ${this.scriptBody}`);
|
|
|
812
810
|
};
|
|
813
811
|
|
|
814
812
|
export { BaseWorkerContext };
|
|
815
|
-
//# sourceMappingURL=chunk-
|
|
816
|
-
//# sourceMappingURL=chunk-
|
|
813
|
+
//# sourceMappingURL=chunk-2AJY4I2T.js.map
|
|
814
|
+
//# sourceMappingURL=chunk-2AJY4I2T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/BaseWorkerContext.ts"],"names":[],"mappings":"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","file":"chunk-2AJY4I2T.js","sourcesContent":["/* eslint-disable @typescript-eslint/only-throw-error */\nimport { Communicate } from '../communication/Communicate.js';\nimport { ACTIONS, INDICATOR_TYPE, RESPONSES } from '../communication/constants.js';\nimport { ThirdPartyScript } from '../communication/ThirdPartyScript.js';\nimport type {\n ConsoleBridge,\n CurrentUser,\n PartialBusiness,\n PartialClientObject,\n PartialLocation,\n PartialTeamMember,\n PartialUser,\n UnknownJSON,\n} from '../types/common.js';\nimport type {\n Args,\n BaseAPI,\n CompleteSetupFn,\n CompleteSetupOptions,\n DataCache,\n ErrorResponse,\n InstallThirdPartyScriptFn,\n Instance,\n InternalSessionData,\n OpenCreateRecordFn,\n OpenCreateRelatedRecordFn,\n PostFormDataFn,\n PromptFn,\n RefreshEntityFn,\n ShowToastOptions,\n StateChangePayload,\n UploadFileFn,\n UserConfig,\n WorkerContextArgs,\n} from '../types/contexts.js';\nimport type {\n DynamicPromptConfig,\n CloseModalFn,\n DynamicPromptFn,\n ModalConfig,\n ShowViewInModalFn,\n ShowViewInModalOptions,\n PromptState,\n UnknownFunction,\n} from '../types/modals.js';\nimport type {\n GetOptions,\n GetReturnValue,\n RequestOptions,\n RequestWithErrorsResponse,\n} from '../types/request.js';\nimport { serializeConsoleArg } from '../util/console.js';\nimport { cleanConfig } from '../workers/util.js';\nimport { buildIframeURLWithProxy, type BuildIframeURLWithProxyOptions } from '../util/frames.js';\n\nconst buildErrorResponse = async (result: Response): Promise<ErrorResponse> => {\n let errorJSON: unknown = null;\n\n try {\n errorJSON = await result.json();\n } catch {\n // If the response is not JSON, we just return the text\n }\n\n const error = {\n status: result.status,\n statusText: result.statusText,\n body: errorJSON,\n };\n\n return error;\n};\n\nconst convertToSelfInvokingFunction = (\n fn: UnknownFunction,\n variable: string,\n args: UnknownJSON = {},\n prepend = '',\n): string => {\n const functionString = fn.toString();\n // Create a self-invoking function that takes in the replacement variable, and additional args as the arguments\n const innner = `(${functionString})({ state: {{${variable}}}, args: ${JSON.stringify(args)}, utils: __kizen_utils })`;\n\n // Wrap the function in a closure that includes any prepended code (like registered utils) and returns the result of the function\n const full = `(function() { ${prepend}\\nreturn ${innner}; })()`;\n\n return full;\n};\n\n/*\n * This is the primary class that exposes the public methods available\n * to our custom scripts. It should only be used in the context of a worker\n * script.\n */\nexport class BaseWorkerContext {\n protected user?: PartialUser;\n protected teamMember?: PartialTeamMember;\n protected business?: PartialBusiness;\n protected clientObject?: PartialClientObject | undefined;\n protected appPath?: string;\n protected dataCache: DataCache<unknown> = new Map();\n protected queryOptions = {};\n private api: BaseAPI;\n public postFormData: PostFormDataFn;\n private executionTimer = 0;\n private setupExecutions = 0;\n private cleanupExecutions = 0;\n protected isDebug = false;\n protected scriptBody: string;\n protected internalState: StateChangePayload = { indicator: INDICATOR_TYPE.NONE };\n protected instance: Instance;\n private breakOnException = false;\n public args: Args;\n public communicate: Communicate;\n private shouldPreserve = false;\n private uploadFileHandler: UploadFileFn;\n private internalSessionData: InternalSessionData;\n private pluginComponentId: string | undefined;\n private installThirdPartyScriptHandler: InstallThirdPartyScriptFn;\n private promptHandler: PromptFn;\n private dynamicPromptHandler: DynamicPromptFn;\n private showViewInModalHandler: ShowViewInModalFn;\n private closeModalHandler: CloseModalFn;\n private refreshEntityHandler: RefreshEntityFn;\n private openCreateRecordHandler: OpenCreateRecordFn;\n private openCreateRelatedRecordHandler: OpenCreateRelatedRecordFn;\n private completeSetupHandler: CompleteSetupFn;\n protected runnerType: 'base' | 'floatingFrame' | 'recordDetail';\n public pluginApiName: string;\n public tempPromptState: PromptState = {};\n private partialLocation: PartialLocation;\n\n constructor({\n user,\n teamMember,\n business,\n clientObject,\n appPath,\n isDebug,\n kizenRequest,\n postFormData,\n scriptBody,\n instance,\n args,\n uploadFile,\n sessionData,\n pluginComponentId,\n installThirdPartyScript,\n prompt,\n refreshEntity,\n openCreateRecord,\n openCreateRelatedRecord,\n pluginApiName,\n dynamicPrompt,\n showViewInModal,\n closeModal,\n completeSetup,\n location,\n }: WorkerContextArgs) {\n this.user = user;\n this.teamMember = teamMember;\n this.business = business;\n this.clientObject = clientObject;\n this.partialLocation = location;\n this.appPath = appPath;\n this.isDebug = isDebug ?? false;\n this.api = {\n get: kizenRequest('get'),\n post: kizenRequest('post'),\n put: kizenRequest('put'),\n delete: kizenRequest('delete'),\n patch: kizenRequest('patch'),\n };\n\n this.postFormData = postFormData;\n this.scriptBody = scriptBody;\n this.instance = instance;\n this.communicate = new Communicate(instance);\n this.uploadFileHandler = uploadFile;\n this.internalSessionData = sessionData ?? {};\n this.pluginComponentId = pluginComponentId;\n this.installThirdPartyScriptHandler = installThirdPartyScript;\n this.promptHandler = prompt;\n this.refreshEntityHandler = refreshEntity;\n this.openCreateRecordHandler = openCreateRecord;\n this.openCreateRelatedRecordHandler = openCreateRelatedRecord;\n this.runnerType = 'base';\n this.pluginApiName = pluginApiName;\n this.dynamicPromptHandler = dynamicPrompt;\n this.showViewInModalHandler = showViewInModal;\n this.closeModalHandler = closeModal;\n this.completeSetupHandler = completeSetup;\n\n try {\n this.args = JSON.parse(args ?? '{}') as Args;\n } catch {\n this.args = {} as Args;\n }\n }\n\n public onError(error?: UnknownJSON | Error): void {\n if (this.breakOnException) {\n debugger;\n }\n\n this.instance.postMessage(\n JSON.stringify({\n action: RESPONSES.ERROR,\n error: error?.message,\n }),\n );\n }\n\n set debug(value: boolean) {\n this.isDebug = value;\n this.breakOnException = value;\n }\n\n set preserve(value: boolean) {\n this.shouldPreserve = value;\n }\n\n get preserve(): boolean {\n return this.shouldPreserve;\n }\n\n parseDate(date: string): string[] {\n return date.split('-');\n }\n\n parsePhone(phone: string): string {\n return phone.replace(/\\+/g, '');\n }\n\n openWindow(url: string, target = '_blank', context?: Record<string, unknown>): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.OPEN_WINDOW,\n url,\n target,\n features: 'noopener noreferrer',\n context,\n }),\n );\n }\n\n authorize(\n serviceName?: string,\n config: { successRedirectPath?: string; errorRedirectPath?: string } = {},\n ): void {\n if (!serviceName) {\n throw new Error('Service name is required to authorize');\n }\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.AUTHORIZE,\n serviceName,\n config: {\n successRedirectPath:\n config.successRedirectPath ?? `/marketplace/${this.pluginApiName}/auth`,\n errorRedirectPath: config.errorRedirectPath ?? `/marketplace/${this.pluginApiName}/auth`,\n },\n }),\n );\n }\n\n getServiceUrl(serviceName: string, path: string): string {\n if (!serviceName) {\n throw new Error('Service name is required to get a service url');\n }\n\n const base = `/external-integrations/proxy/${this.pluginApiName}/${serviceName}`;\n\n if (path.startsWith('/')) {\n return `${base}${path}`;\n }\n\n return `${base}/${path}`;\n }\n\n get currentBusiness(): PartialBusiness | undefined {\n return this.business;\n }\n\n get applicationPath(): string | undefined {\n return this.appPath;\n }\n\n get currentUser(): CurrentUser {\n return {\n profile: {\n id: this.teamMember?.id ?? '',\n full_name: this.teamMember?.full_name ?? '',\n first_name: this.teamMember?.first_name ?? '',\n last_name: this.teamMember?.last_name ?? '',\n email: this.teamMember?.email ?? '',\n phone: this.teamMember?.phone ?? '',\n created: this.teamMember?.created ?? '',\n crm_client_id: this.user?.crm_client_id ?? '',\n },\n };\n }\n\n get sessionData(): InternalSessionData {\n return this.internalSessionData;\n }\n\n get config(): unknown {\n const hasCustomConfig = Boolean(this.args.__kizen_clean_config);\n\n if (!hasCustomConfig) {\n return {};\n }\n\n const manager = new Proxy(this.args.__kizen_clean_config ?? {}, {\n get: (target, name) => {\n if (Reflect.has(target, name)) {\n return Reflect.get(target, name) as unknown;\n }\n\n return undefined;\n },\n });\n\n return manager;\n }\n\n get location(): PartialLocation {\n return new Proxy(this.partialLocation, {\n get: (target, name) => {\n if (name === 'toJSON') {\n return () => {\n return this.partialLocation;\n };\n }\n\n if (Reflect.has(target, name)) {\n return Reflect.get(target, name) as string;\n }\n\n throw new Error(\n `Property ${String(name)} is not available on location object for plugin apps`,\n );\n },\n });\n }\n\n get userConfig(): unknown {\n const customConfig = this.args.__kizen_user_config?.__kizen_clean_config;\n\n if (!customConfig) {\n return {};\n }\n\n const manager = new Proxy(customConfig, {\n get: (target, name) => {\n if (Reflect.has(target, name)) {\n return Reflect.get(target, name) as unknown;\n }\n\n return undefined;\n },\n });\n\n return manager;\n }\n\n setSessionData(update: UnknownJSON): void {\n if (typeof update !== 'object') {\n throw new Error(`Invalid session update with type ${typeof update}`);\n }\n\n if (Array.isArray(update)) {\n throw new Error(`Invalid session update with type array`);\n }\n\n this.internalSessionData = {\n ...this.internalSessionData,\n ...update,\n };\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.UPDATE_SESSION_DATA,\n update,\n }),\n );\n }\n\n async get(url: string, options?: GetOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const cachedResult = this.dataCache.get(url) as GetReturnValue | undefined;\n\n if (cachedResult && !options?.ignoreCache) {\n if (options?.returnErrors) {\n return [cachedResult.data, null];\n }\n\n return cachedResult.data;\n }\n\n const { data } = await this.api.get(url, {\n ...this.queryOptions,\n headers: this.buildHeaders(options?.headers),\n });\n\n this.dataCache.set(url, { ts: Date.now(), data });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'GET',\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n\n throw err;\n }\n\n const json = (await res.json()) as UnknownJSON;\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async getWithErrors(\n url: string,\n options?: Omit<GetOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.get(url, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n async getUserConfig(): Promise<UnknownJSON> {\n if (!this.args.pluginId || !this.pluginComponentId) {\n throw new Error(\n 'User config is not available for scripts not associated to a plugin or plugin component',\n );\n }\n\n const configResult = (await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`, {\n ignoreCache: true,\n })) as UserConfig;\n\n return configResult.config?.[this.pluginComponentId] ?? {};\n }\n\n async setUserConfig(config: UnknownJSON): Promise<unknown> {\n if (!this.args.pluginId || !this.pluginComponentId) {\n throw new Error(\n 'User config is not available for scripts not associated to a plugin or plugin component',\n );\n }\n\n const oldConfig = (await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`, {\n ignoreCache: true,\n })) as UserConfig | undefined;\n\n const mutationResult = await this.post(`/employee/mine/configs/plugins/${this.args.pluginId}`, {\n config: {\n ...oldConfig?.config,\n [this.pluginComponentId]: {\n ...oldConfig?.config?.[this.pluginComponentId],\n ...config,\n },\n },\n });\n\n return mutationResult;\n }\n\n public async completeSetup(payload: UnknownJSON, options?: CompleteSetupOptions): Promise<void> {\n if (!this.pluginApiName) {\n throw new Error('completeSetup is not available for scripts not associated to a plugin');\n }\n\n const candidate: unknown = payload;\n\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n throw new Error('completeSetup requires a configuration object');\n }\n\n const prototype: unknown = Object.getPrototypeOf(candidate);\n\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error('completeSetup requires a plain configuration object');\n }\n\n await this.completeSetupHandler(payload, options);\n }\n\n async patch(url: string, body?: UnknownJSON, options?: RequestOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const { data } = await this.api.patch(url, body, {\n ...this.queryOptions,\n headers: options?.headers,\n });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'PATCH',\n body: body ? JSON.stringify(body) : null,\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n throw err;\n }\n\n const json = (await res.json()) as UnknownJSON;\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async patchWithErrors(\n url: string,\n body: UnknownJSON,\n options?: Omit<RequestOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.patch(url, body, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n async post(url: string, body?: UnknownJSON, options?: RequestOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const { data } = await this.api.post(url, body, {\n ...this.queryOptions,\n headers: this.buildHeaders(options?.headers),\n });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'POST',\n body: body ? JSON.stringify(body) : null,\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n throw err;\n }\n\n const json = (await res.json()) as UnknownJSON;\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async postWithErrors(\n url: string,\n body: UnknownJSON,\n options?: Omit<RequestOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.post(url, body, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n async delete(url: string, options?: RequestOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const { data } = await this.api.delete(url, {\n ...this.queryOptions,\n headers: this.buildHeaders(options?.headers),\n });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'DELETE',\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n throw err;\n }\n\n let json: UnknownJSON | null = null;\n\n if (res.status !== 204) {\n json = (await res.json()) as UnknownJSON;\n }\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async deleteWithErrors(\n url: string,\n options?: Omit<RequestOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.delete(url, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n public async openCreateRecordModal(objectId: string): Promise<unknown> {\n return this.openCreateRecordHandler(objectId);\n }\n\n public async openCreateRelatedRecordModal(\n objectId: string,\n relatedEntityId: string,\n ): Promise<unknown> {\n return this.openCreateRelatedRecordHandler(objectId, relatedEntityId);\n }\n\n public showToast(message: string, toastOptions: ShowToastOptions): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.SHOW_TOAST,\n message,\n toastOptions,\n }),\n );\n }\n\n public clearToasts(): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.CLEAR_TOASTS,\n }),\n );\n }\n\n public outputUI(markup: string, options?: BuildIframeURLWithProxyOptions): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.UI_OUTPUT,\n markup,\n options,\n }),\n );\n }\n\n public runEventScript(scriptName: string, args: UnknownJSON = {}): void {\n if (!scriptName) {\n throw new Error('A script name is required to run an event script');\n }\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.RUN_EVENT_SCRIPT,\n scriptName,\n args,\n }),\n );\n }\n\n public prompt(config: ModalConfig): Promise<unknown> {\n return this.promptHandler(config);\n }\n\n public async showViewInModal(\n id: string,\n config?: { args?: UnknownJSON; options?: ShowViewInModalOptions },\n ): Promise<unknown> {\n return this.showViewInModalHandler(id, config);\n }\n\n public closeModal(values?: UnknownJSON, canceled?: boolean): void {\n this.closeModalHandler(values, canceled);\n }\n\n public async dynamicPrompt(_config: DynamicPromptConfig): Promise<unknown> {\n const replacementVar = '__kizen_state';\n\n let prepend = 'const __kizen_utils = {};\\n';\n\n if (_config.registerUtils) {\n const utils = Object.keys(_config.registerUtils);\n prepend += utils\n .map((u) => {\n const body = _config.registerUtils?.[u];\n\n if (typeof body !== 'function') {\n throw new Error(`Registered util ${u} is not a function, got ${typeof body}`);\n }\n\n return `__kizen_utils[\"${u}\"] = (${body.toString()});`;\n })\n .join('\\n');\n }\n\n const configContentResult = _config.content?.map((f) => {\n let optionMapper = '';\n if ('optionMapper' in f) {\n optionMapper = convertToSelfInvokingFunction(\n f.optionMapper,\n replacementVar,\n f.args,\n prepend,\n );\n }\n\n let getFetchUrl = '';\n if ('getFetchUrl' in f) {\n getFetchUrl = convertToSelfInvokingFunction(f.getFetchUrl, replacementVar, f.args, prepend);\n }\n\n let getHeaders = '';\n if ('getHeaders' in f) {\n getHeaders = convertToSelfInvokingFunction(f.getHeaders, replacementVar, f.args, prepend);\n }\n\n let getBody = '';\n if ('getBody' in f) {\n getBody = convertToSelfInvokingFunction(f.getBody, replacementVar, f.args, prepend);\n }\n\n return {\n ...f,\n optionMapper,\n getFetchUrl,\n getHeaders,\n getBody,\n };\n });\n\n const config = {\n ..._config,\n content: configContentResult,\n } as DynamicPromptConfig;\n\n const setupAssistantConfig = {\n fields: config.content,\n };\n\n const result = await this.dynamicPromptHandler(config);\n\n const cleanConfigValue = cleanConfig(setupAssistantConfig, result.values);\n\n return {\n ...result,\n values: cleanConfigValue,\n };\n }\n\n public outputIframe(\n url: string,\n allow?: string[],\n sandbox?: string[],\n options?: BuildIframeURLWithProxyOptions,\n ): void {\n const { url: formattedUrl, isUsingProxy } = buildIframeURLWithProxy(\n url,\n options,\n allow?.join('; '),\n );\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.IFRAME_OUTPUT,\n url: formattedUrl,\n name: this.pluginApiName,\n allow,\n sandbox,\n preserve: this.preserve,\n isUsingProxy,\n }),\n );\n }\n\n private getBase64EncodedBlob(data: Blob): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.readAsDataURL(data);\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = (error) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(error);\n };\n });\n }\n\n public async uploadFile(data: Blob, fileName?: string, isPublic = false): Promise<unknown> {\n const encoded = await this.getBase64EncodedBlob(data);\n const res = await this.uploadFileHandler({\n file: encoded,\n fileName: fileName ?? 'file_' + String(Date.now()),\n isPublic,\n });\n\n return res;\n }\n\n protected afterSetup(): void {\n /* empty */\n }\n\n protected __setup(): void {\n if (this.setupExecutions !== 0) {\n throw new Error(\n 'Setup must be called exactly once, and should never be called by a script directly.',\n );\n }\n\n if (this.cleanupExecutions !== 0) {\n throw new Error('Setup was called after cleanup');\n }\n\n if (this.isDebug) {\n this.console.log(`Running script:\\n\\n${this.scriptBody}`);\n }\n\n this.setupExecutions++;\n this.executionTimer = performance.now();\n\n this.afterSetup();\n }\n\n protected __cleanup(result?: unknown): void {\n if (this.cleanupExecutions !== 0) {\n throw new Error(\n 'Cleanup must be called exactly once, and should never be called by a script directly.',\n );\n }\n\n if (this.setupExecutions !== 1) {\n throw new Error('Cleanup was called before setup');\n }\n\n this.cleanupExecutions++;\n this.setIndicator(INDICATOR_TYPE.NONE);\n const end = performance.now();\n if (this.isDebug) {\n this.console.log(`Script execution took ${String(end - this.executionTimer)}ms`);\n }\n\n this.done(this.preserve, result);\n }\n\n setIndicator(indicator: StateChangePayload['indicator'] = INDICATOR_TYPE.NONE): void {\n this.internalState.indicator = indicator;\n\n this.setState({ indicator });\n }\n\n wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private done(preserve: boolean, result?: unknown): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.DONE,\n result,\n preserve,\n }),\n );\n }\n\n private setState(state: unknown): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.SETSTATE,\n state,\n }),\n );\n }\n\n protected isRelativeUrl(url: string): boolean {\n return url.startsWith('/');\n }\n\n private buildHeaders(headers: Record<string, string> = {}): Record<string, string> {\n return {\n ...headers,\n 'X-Request-Type': 'kizen-ui-scripting-api',\n };\n }\n\n public refreshTimelineForId(id?: string): void {\n if (id) {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.REFRESH_TIMELINE,\n entityId: id,\n }),\n );\n }\n }\n\n public refreshEntityForId(id?: string): unknown {\n if (id) {\n return this.refreshEntityHandler(id);\n }\n }\n\n public async installThirdPartyScript(scriptUrl: string): Promise<ThirdPartyScript | undefined> {\n try {\n const result = await this.installThirdPartyScriptHandler(scriptUrl, this.args);\n const manager = new ThirdPartyScript(this.instance, result.url);\n\n return manager;\n } catch {\n this.onError(new Error(`Third party script ${scriptUrl} could not be installed.`));\n }\n }\n\n public releaseBlockingScript(): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.RELEASE_BLOCKING_SCRIPT,\n }),\n );\n }\n\n public copyToClipboard(text: string): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.COPY_TO_CLIPBOARD,\n text,\n }),\n );\n }\n\n public createDateObject(dateString: string): Date {\n if (typeof dateString !== 'string') {\n throw new Error(`Invalid date string ${String(dateString)}`);\n }\n\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(dateString)) {\n throw new Error(`Date string ${dateString} is not in the format YYYY-MM-DD`);\n }\n\n const parts = dateString.split('-').map((part) => parseInt(part, 10));\n\n if (parts.length < 3) {\n throw new Error(`Date string ${dateString} could not be parsed into valid date parts`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const dateObj = new Date(parts[0]!, parts[1]! - 1, parts[2]);\n\n return dateObj;\n }\n\n public formatDateForResponse(date: Date): number {\n return date.getTime();\n }\n\n get console(): ConsoleBridge {\n const supported = new Set(['log', 'warn', 'error', 'info', 'debug']);\n return new Proxy({} as ConsoleBridge, {\n get: (_, prop) => {\n const level = supported.has(String(prop)) ? String(prop) : 'log';\n return (...args: unknown[]) => {\n try {\n const serializedArgs = args.map((arg) => {\n try {\n return serializeConsoleArg(arg);\n } catch {\n return null;\n }\n });\n let payload: string;\n try {\n payload = JSON.stringify({\n action: ACTIONS.CONSOLE_LOG,\n level,\n args: serializedArgs,\n });\n } catch {\n payload = JSON.stringify({\n action: ACTIONS.CONSOLE_LOG,\n level,\n args: ['[unserializable log payload]'],\n });\n }\n this.instance.postMessage(payload);\n } catch {\n /* never crash plugin code from logging */\n }\n };\n },\n });\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ACTIONS, RESPONSES } from './chunk-
|
|
1
|
+
import { ACTIONS, RESPONSES } from './chunk-5BBUKTOE.js';
|
|
2
2
|
|
|
3
3
|
// src/util/console.ts
|
|
4
4
|
var UNSERIALIZABLE = (reason) => ({
|
|
@@ -681,5 +681,5 @@ var getParentFrameAllowParam = () => {
|
|
|
681
681
|
};
|
|
682
682
|
|
|
683
683
|
export { KizenRequestError, buildIframeURLWithProxy, cleanConfig, closeModalHandler, completeSetupHandler, deserializeConsoleArg, dynamicPromptHandler, filterAllowList, filterSandboxList, getActionContainerKey, getActionFieldKey, getActionMenuFieldKey, getActionMenuHeadingKey, getAllNestedInputsFromConfig, getFieldFromAction, getParentFrameAllowParam, handleCommonResponse, installThirdPartyScriptHandler, isActionFieldKey, isActionMenuFieldKey, kizenRequestHandler, openCreateRecordHandler, openCreateRelatedRecordHandler, postFormDataHandler, promptHandler, refreshEntityHandler, serializeConsoleArg, showViewInModalHandler, splitActionFieldKey, splitActionMenuFieldKey, unwrapProxyMessage, uploadFileHandler };
|
|
684
|
-
//# sourceMappingURL=chunk-
|
|
685
|
-
//# sourceMappingURL=chunk-
|
|
684
|
+
//# sourceMappingURL=chunk-2V75NG3U.js.map
|
|
685
|
+
//# sourceMappingURL=chunk-2V75NG3U.js.map
|