dynim-react 1.0.49 → 1.0.51

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DynimProvider.d.ts","sourceRoot":"","sources":["../src/DynimProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAc,EAQZ,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EAKV,WAAW,EAEZ,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;IACzC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,qBAAqB;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,yBAAyB;IACzB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,oCAAoC;IACpC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,yDAAyD;IACzD,WAAW,EAAE,WAAW,CAAC;IACzB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,gCAAgC;IAChC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAW,GACZ,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAwYlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C"}
1
+ {"version":3,"file":"DynimProvider.d.ts","sourceRoot":"","sources":["../src/DynimProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAc,EAQZ,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAWf,OAAO,KAAK,EAKV,WAAW,EAGZ,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;IACzC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,qBAAqB;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,yBAAyB;IACzB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,oCAAoC;IACpC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,yDAAyD;IACzD,WAAW,EAAE,WAAW,CAAC;IACzB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,gCAAgC;IAChC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAW,GACZ,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CA+alC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C"}
@@ -9,7 +9,7 @@ import { jsxs as _jsxs, Fragment as _Fragment, jsx as _jsx } from "react/jsx-run
9
9
  */
10
10
  import React, { createContext, useContext, useEffect, useRef, useCallback, useMemo, useState, } from 'react';
11
11
  import ReactDOM from 'react-dom';
12
- import { createBuilderClient, createBuilder, createCodeClient, createBundleLoader, BundleNotFoundError, BundleAuthError, } from 'dynim-core';
12
+ import { createBuilderClient, createBuilder, createCodeClient, createBundleLoader, createCSSLoader, BundleNotFoundError, BundleAuthError, } from 'dynim-core';
13
13
  import { createSharedContext, updateSharedContext, isSharedContextReady } from './inference/sharedContext';
14
14
  import { generateThemeCSS } from './theme';
15
15
  const DynimContext = createContext(null);
@@ -30,6 +30,7 @@ export function DynimProvider({ children, config = {}, }) {
30
30
  const builderRef = useRef(null);
31
31
  const codeClientRef = useRef(null);
32
32
  const bundleLoaderRef = useRef(null);
33
+ const cssLoaderRef = useRef(null);
33
34
  // Track when we're exiting to prevent auto-load from re-triggering
34
35
  const isExitingRef = useRef(false);
35
36
  const hasAttemptedInitialLoadRef = useRef(false);
@@ -154,6 +155,8 @@ export function DynimProvider({ children, config = {}, }) {
154
155
  });
155
156
  return () => {
156
157
  builderRef.current?.destroy();
158
+ // Clean up CSS link element on unmount
159
+ cssLoaderRef.current?.unload();
157
160
  };
158
161
  }, []);
159
162
  // Initialize builder client (only once on mount)
@@ -181,8 +184,20 @@ export function DynimProvider({ children, config = {}, }) {
181
184
  }
182
185
  return bundleLoaderRef.current;
183
186
  }, [getAuthToken]);
184
- // Load bundle
185
- const loadBundle = useCallback(async (bundleUrl) => {
187
+ // Get CSS loader
188
+ const getCSSLoader = useCallback(() => {
189
+ if (!cssLoaderRef.current) {
190
+ cssLoaderRef.current = createCSSLoader({
191
+ linkId: 'dynim-bundle-css',
192
+ onError: (error) => {
193
+ console.warn('[DynimProvider] CSS load failed:', error);
194
+ },
195
+ });
196
+ }
197
+ return cssLoaderRef.current;
198
+ }, []);
199
+ // Load bundle (JS + CSS)
200
+ const loadBundle = useCallback(async (bundleUrl, loadCSS = true) => {
186
201
  const loader = getBundleLoader();
187
202
  if (loader.isLoading())
188
203
  return;
@@ -193,12 +208,28 @@ export function DynimProvider({ children, config = {}, }) {
193
208
  setTenantApp(() => App);
194
209
  setIsBundleLoaded(true);
195
210
  cleanup();
211
+ // Load CSS alongside JS bundle
212
+ if (loadCSS) {
213
+ const cssLoader = getCSSLoader();
214
+ const isTemp = bundleUrl.includes('temp=true');
215
+ const cssUrl = isTemp ? '/api/code/css?temp=true' : '/api/code/css';
216
+ if (isTemp) {
217
+ // Temp/preview CSS - bust cache to get latest
218
+ cssLoader.loadWithCacheBust(cssUrl);
219
+ }
220
+ else {
221
+ // Saved CSS - let browser cache
222
+ cssLoader.load(cssUrl);
223
+ }
224
+ }
196
225
  }
197
226
  catch (error) {
198
227
  // 404 = no bundle, 401 = not authenticated - show children
199
228
  if (error instanceof BundleNotFoundError || error instanceof BundleAuthError) {
200
229
  setTenantApp(null);
201
230
  setIsBundleLoaded(false);
231
+ // Also unload any CSS
232
+ getCSSLoader().unload();
202
233
  return;
203
234
  }
204
235
  setBundleError(error);
@@ -206,7 +237,7 @@ export function DynimProvider({ children, config = {}, }) {
206
237
  finally {
207
238
  setIsBundleLoading(false);
208
239
  }
209
- }, [getBundleLoader]);
240
+ }, [getBundleLoader, getCSSLoader]);
210
241
  // Keep ref updated
211
242
  useEffect(() => {
212
243
  loadBundleRef.current = loadBundle;
@@ -272,7 +303,8 @@ export function DynimProvider({ children, config = {}, }) {
272
303
  }, [fetchTheme]);
273
304
  // Load saved bundle
274
305
  const loadSavedBundle = useCallback(async () => {
275
- await loadBundle('/api/code/bundle');
306
+ // Note: CSS is loaded separately by saveCode/abandonCode with cache busting
307
+ await loadBundle('/api/code/bundle', false);
276
308
  }, [loadBundle]);
277
309
  // Watch for bundleReady
278
310
  useEffect(() => {
@@ -283,7 +315,7 @@ export function DynimProvider({ children, config = {}, }) {
283
315
  }
284
316
  }
285
317
  }, [codeMessage.bundleReady, codeMessage.projectId]);
286
- // Load temp bundle on signal
318
+ // Load temp bundle on signal (JS + CSS with cache busting)
287
319
  useEffect(() => {
288
320
  if (bundleLoadSignal === 0)
289
321
  return;
@@ -292,8 +324,9 @@ export function DynimProvider({ children, config = {}, }) {
292
324
  pendingBundleProjectIdRef.current = null;
293
325
  return;
294
326
  }
327
+ // Load JS bundle with cache busting
295
328
  const bundleUrl = `/api/code/bundle?temp=true&_t=${Date.now()}`;
296
- loadBundleRef.current?.(bundleUrl);
329
+ loadBundleRef.current?.(bundleUrl, true); // true = also load CSS
297
330
  pendingBundleProjectIdRef.current = null;
298
331
  }, [bundleLoadSignal]);
299
332
  // Public methods
@@ -315,11 +348,15 @@ export function DynimProvider({ children, config = {}, }) {
315
348
  const saveCode = useCallback(async () => {
316
349
  await codeClientRef.current?.saveCode();
317
350
  await loadSavedBundle();
318
- }, [loadSavedBundle]);
351
+ // Force reload CSS with cache bust since saved CSS has changed
352
+ getCSSLoader().loadWithCacheBust('/api/code/css');
353
+ }, [loadSavedBundle, getCSSLoader]);
319
354
  const abandonCode = useCallback(async () => {
320
355
  await codeClientRef.current?.abandonCode();
321
356
  await loadSavedBundle();
322
- }, [loadSavedBundle]);
357
+ // Reload saved CSS (may have been showing temp CSS)
358
+ getCSSLoader().loadWithCacheBust('/api/code/css');
359
+ }, [loadSavedBundle, getCSSLoader]);
323
360
  const contextValue = useMemo(() => ({
324
361
  enterBuilder,
325
362
  exitBuilder,
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Vite plugin for Dynim package exposure
3
+ */
4
+ export { dynimPackages, type DynimPackagesOptions, default } from './plugin.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/vite/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Vite plugin for Dynim package exposure
3
+ */
4
+ export { dynimPackages, default } from './plugin.js';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Vite plugin for dynim-react
2
+ * Vite plugin for Dynim package exposure
3
3
  *
4
4
  * Generates a virtual module that exports all specified packages,
5
5
  * so you don't have to manually import and map each one.
@@ -21,10 +21,10 @@
21
21
  * ```
22
22
  *
23
23
  * Then in your app:
24
- * ```ts
24
+ * ```tsx
25
25
  * import packages from 'virtual:dynim-packages'
26
26
  *
27
- * <BuilderProvider config={{ packages }}>
27
+ * <DynimProvider config={{ packages }}>
28
28
  * ```
29
29
  */
30
30
  import type { Plugin } from 'vite';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/vite/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAKlC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,iBAAiB,EAAE,MAAM,EAAE,GAAG,oBAAoB,GACjD,MAAM,CAwCR;AAED,eAAe,aAAa,CAAA"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Vite plugin for dynim-react
2
+ * Vite plugin for Dynim package exposure
3
3
  *
4
4
  * Generates a virtual module that exports all specified packages,
5
5
  * so you don't have to manually import and map each one.
@@ -21,10 +21,10 @@
21
21
  * ```
22
22
  *
23
23
  * Then in your app:
24
- * ```ts
24
+ * ```tsx
25
25
  * import packages from 'virtual:dynim-packages'
26
26
  *
27
- * <BuilderProvider config={{ packages }}>
27
+ * <DynimProvider config={{ packages }}>
28
28
  * ```
29
29
  */
30
30
  const VIRTUAL_MODULE_ID = 'virtual:dynim-packages';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dynim-react",
3
- "version": "1.0.49",
3
+ "version": "1.0.51",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -10,12 +10,16 @@
10
10
  "import": "./dist/index.js"
11
11
  },
12
12
  "./vite": {
13
- "types": "./dist/vite/index.d.ts",
14
- "import": "./dist/vite/index.js"
13
+ "types": "./dist/plugins/vite/index.d.ts",
14
+ "import": "./dist/plugins/vite/index.js"
15
+ },
16
+ "./vite/virtual-module": {
17
+ "types": "./src/plugins/vite/virtual-module.d.ts"
15
18
  }
16
19
  },
17
20
  "files": [
18
21
  "dist",
22
+ "src/plugins/vite/virtual-module.d.ts",
19
23
  "README.md"
20
24
  ],
21
25
  "scripts": {
@@ -23,17 +27,24 @@
23
27
  "dev": "tsc --watch"
24
28
  },
25
29
  "dependencies": {
26
- "dynim-core": "^1.0.7"
30
+ "dynim-core": "^1.0.25"
27
31
  },
28
32
  "peerDependencies": {
29
33
  "react": ">=17.0.0",
30
- "react-dom": ">=17.0.0"
34
+ "react-dom": ">=17.0.0",
35
+ "vite": ">=4.0.0"
36
+ },
37
+ "peerDependenciesMeta": {
38
+ "vite": {
39
+ "optional": true
40
+ }
31
41
  },
32
42
  "devDependencies": {
33
43
  "@types/react": "^18.3.27",
34
44
  "@types/react-dom": "^18.3.7",
35
45
  "react": "^19.2.3",
36
46
  "react-dom": "^19.2.3",
47
+ "vite": "^5.0.11",
37
48
  "typescript": "^5.9.3"
38
49
  },
39
50
  "license": "MIT"
package/src/README.md ADDED
@@ -0,0 +1,16 @@
1
+ # dynim-react Source
2
+
3
+ React components and hooks.
4
+
5
+ ## Modules
6
+
7
+ - [builder](./builder) - Visual page editing
8
+ - [inference](./inference) - Tenant bundle loading
9
+
10
+ ## Documentation
11
+
12
+ See [SDK React Documentation](../../../utils/docs/sdk/REACT.md)
13
+
14
+ Related:
15
+ - [UI Builder](../../../utils/docs/ui-builder/README.md)
16
+ - [Inference Server](../../../utils/docs/inference-server/README.md)
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Type declarations for the virtual:dynim-packages module.
3
+ *
4
+ * To use these types, add to your tsconfig.json:
5
+ * {
6
+ * "compilerOptions": {
7
+ * "types": ["dynim-react/vite/virtual-module"]
8
+ * }
9
+ * }
10
+ *
11
+ * Or add a reference in a .d.ts file:
12
+ * /// <reference types="dynim-react/vite/virtual-module" />
13
+ */
14
+
15
+ declare module 'virtual:dynim-packages' {
16
+ /**
17
+ * Object mapping package names to their exports.
18
+ * The actual shape depends on which packages you configured
19
+ * in the dynimPackages() plugin.
20
+ */
21
+ const packages: Record<string, unknown>
22
+ export default packages
23
+ export { packages }
24
+ }
@@ -1,6 +0,0 @@
1
- /**
2
- * Vite integration for dynim-react
3
- */
4
- export { dynimPackages, type DynimPackagesOptions } from './plugin.js';
5
- export { dynimPackages as default } from './plugin.js';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Vite integration for dynim-react
3
- */
4
- export { dynimPackages } from './plugin.js';
5
- export { dynimPackages as default } from './plugin.js';
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/vite/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAKlC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,iBAAiB,EAAE,MAAM,EAAE,GAAG,oBAAoB,GACjD,MAAM,CAwCR;AAED,eAAe,aAAa,CAAA"}