@woodsportal/hubspot-kit 1.0.34 → 1.0.35

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@woodsportal/hubspot-kit",
3
- "version": "1.0.34",
3
+ "version": "1.0.35",
4
4
  "description": "WoodsCLI — HubSpot CMS dev kit by WoodsPortal. wp CLI, Vite presets, module-config overlay, and theme/module build pipelines.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -51,7 +51,7 @@
51
51
  "build": "tsup",
52
52
  "dev": "tsup --watch",
53
53
  "typecheck": "tsc --noEmit",
54
- "test": "node --import tsx --test 'src/lib/**/*.test.ts' 'src/schema/**/*.test.ts' 'src/vite/**/*.test.ts' 'scripts/portal-build-id.test.mjs' && vitest run src/dev-module-config/__tests__/normalize-repeater-items.test.ts src/dev-module-config/__tests__/module-config-transform.test.ts src/dev-module-config/__tests__/flatten-visible-fields.test.ts",
54
+ "test": "node --import tsx --test 'src/lib/**/*.test.ts' 'src/schema/**/*.test.ts' 'src/vite/**/*.test.ts' 'scripts/portal-build-id.test.mjs' 'scripts/vite/ensure-dev-kit-shims.test.mjs' && vitest run src/dev-module-config/__tests__/normalize-repeater-items.test.ts src/dev-module-config/__tests__/module-config-transform.test.ts src/dev-module-config/__tests__/flatten-visible-fields.test.ts",
55
55
  "test:examples": "node examples/smoke/run-matrix.mjs --tier static",
56
56
  "lint": "eslint src",
57
57
  "verify": "npm run typecheck && npm run test && npm run test:examples && npm run build",
@@ -0,0 +1,20 @@
1
+ /** Current Active LTS — update when Node release schedule changes. */
2
+ export const NODE_LTS_RECOMMENDED = '24'
3
+
4
+ /**
5
+ * @returns {string | null}
6
+ * @see https://github.com/nodejs/node/issues/59366
7
+ */
8
+ export function nodeLoaderInteropWarning() {
9
+ const [major, minor] = process.versions.node.split('.').map(Number)
10
+
11
+ if (major === 22 && minor >= 18) {
12
+ return `Node 22.18+ can fail loading Vite config (getStatus). Upgrade to Node ${NODE_LTS_RECOMMENDED} LTS or the latest Node 22 patch.`
13
+ }
14
+
15
+ if (major === 23 && minor < 4) {
16
+ return `Node 23.0–23.3 can fail loading Vite config (getStatus). Upgrade to Node ${NODE_LTS_RECOMMENDED} LTS.`
17
+ }
18
+
19
+ return null
20
+ }
@@ -3,77 +3,92 @@
3
3
  * Local dev server — loads Vite and plugins from the consumer project's node_modules
4
4
  * (configFile: false) so the kit does not need its own vite install.
5
5
  */
6
- import { createRequire } from 'node:module'
7
- import { dirname, resolve } from 'node:path'
8
- import { pathToFileURL } from 'node:url'
6
+ import { existsSync } from 'node:fs'
7
+ import { resolve } from 'node:path'
9
8
 
9
+ import { importConsumerDep } from './resolve-consumer-dep.mjs'
10
10
  import { findProjectRoot, getKitRoot } from './project-root.mjs'
11
11
 
12
12
  const projectRoot = findProjectRoot()
13
13
  const kitRoot = getKitRoot()
14
- const require = createRequire(pathToFileURL(resolve(projectRoot, 'package.json')))
15
-
16
14
  const port = Number(process.env.WP_HS_DEV_PORT ?? process.argv[2] ?? 3000)
17
15
 
18
- const { createServer } = require('vite')
19
- const viteReact = require('@vitejs/plugin-react')
20
- const { TanStackRouterVite } = require('@tanstack/router-plugin/vite')
21
- const tailwindcss = require('@tailwindcss/vite')
16
+ const [
17
+ { ensureDevKitShims },
18
+ { default: resolveFromProjectRoot },
19
+ { default: sdkLogBridge },
20
+ { default: moduleConfigStore },
21
+ { createDevReactPluginOptions },
22
+ { default: isPrefix },
23
+ { default: bootstrapShimResolver },
24
+ { readWoodsportalConfig },
25
+ { createServer },
26
+ viteReactMod,
27
+ tanstackMod,
28
+ tailwindcssMod,
29
+ ] = await Promise.all([
30
+ import('./vite/ensure-dev-kit-shims.js'),
31
+ import('./vite/resolve-from-project-root.js'),
32
+ import('./vite/sdk-log-bridge.js'),
33
+ import('./vite/module-config-store.js'),
34
+ import('./vite/react-dev-plugin-options.js'),
35
+ import('./tailwind/prefix.env.js'),
36
+ import('./vite/bootstrap-shim-resolver.js'),
37
+ import('./read-woodsportal-config.mjs'),
38
+ importConsumerDep('vite'),
39
+ importConsumerDep('@vitejs/plugin-react'),
40
+ importConsumerDep('@tanstack/router-plugin/vite'),
41
+ importConsumerDep('@tailwindcss/vite'),
42
+ ])
22
43
 
23
- const tailwindPrefixPlugin = (
24
- await import(pathToFileURL(resolve(kitRoot, 'scripts/tailwind/prefix-plugin.js')).href)
25
- ).default
26
- const TailwindContentPlugin = (
27
- await import(pathToFileURL(resolve(kitRoot, 'scripts/tailwind/tailwind-content-plugin.js')).href)
28
- ).default
29
- const sdkLogBridge = (
30
- await import(pathToFileURL(resolve(kitRoot, 'scripts/vite/sdk-log-bridge.js')).href)
31
- ).default
32
- const moduleConfigStore = (
33
- await import(pathToFileURL(resolve(kitRoot, 'scripts/vite/module-config-store.js')).href)
34
- ).default
35
- const resolveFromProjectRoot = (
36
- await import(pathToFileURL(resolve(kitRoot, 'scripts/vite/resolve-from-project-root.js')).href)
37
- ).default
38
- const { createDevReactPluginOptions } = await import(
39
- pathToFileURL(resolve(kitRoot, 'scripts/vite/react-dev-plugin-options.js')).href
40
- )
41
- const { ensureDevKitShims } = await import(
42
- pathToFileURL(resolve(kitRoot, 'scripts/vite/ensure-dev-kit-shims.js')).href
44
+ const viteReact = viteReactMod.default ?? viteReactMod
45
+ const { TanStackRouterVite } = tanstackMod
46
+ const tailwindcss = tailwindcssMod.default ?? tailwindcssMod
47
+
48
+ const { moduleConfigRoot, bootstrapShim, bootstrapGreenfieldShim } = ensureDevKitShims(
49
+ projectRoot,
50
+ kitRoot,
43
51
  )
44
- const isPrefix = (await import(pathToFileURL(resolve(kitRoot, 'scripts/tailwind/prefix.env.js')).href))
45
- .default
52
+ const { config } = readWoodsportalConfig(projectRoot)
53
+ const routesDir = resolve(projectRoot, 'src/routes')
54
+ const hasTanStackRoutes = existsSync(routesDir)
46
55
 
47
- const { moduleConfigRoot, bootstrapShim } = ensureDevKitShims(projectRoot, kitRoot)
56
+ const prefixPlugins = isPrefix('dev')
57
+ ? [
58
+ (await import('./tailwind/prefix-plugin.js')).default(),
59
+ (await import('./tailwind/tailwind-content-plugin.js')).default(),
60
+ ]
61
+ : []
48
62
 
49
63
  const server = await createServer({
50
64
  root: projectRoot,
51
65
  configFile: false,
52
66
  mode: 'dev',
53
67
  plugins: [
68
+ bootstrapShimResolver({ bootstrapShim, bootstrapGreenfieldShim, kitRoot }),
54
69
  resolveFromProjectRoot(projectRoot, kitRoot),
55
70
  sdkLogBridge(),
56
71
  moduleConfigStore(projectRoot),
57
- TanStackRouterVite({ autoCodeSplitting: false }),
58
- viteReact.default?.(createDevReactPluginOptions()) ?? viteReact(createDevReactPluginOptions()),
59
- tailwindcss.default?.() ?? tailwindcss(),
60
- ...(isPrefix('dev') ? [tailwindPrefixPlugin(), TailwindContentPlugin()] : []),
72
+ ...(hasTanStackRoutes ? [TanStackRouterVite({ autoCodeSplitting: false })] : []),
73
+ viteReact(createDevReactPluginOptions()),
74
+ tailwindcss(),
75
+ ...prefixPlugins,
61
76
  ],
62
77
  resolve: {
63
78
  preserveSymlinks: true,
79
+ dedupe: ['react', 'react-dom'],
64
80
  alias: {
65
81
  '@/dev/module-config': moduleConfigRoot,
82
+ '@wphs/bootstrap': bootstrapShim,
83
+ '@wphs/bootstrap-greenfield': bootstrapGreenfieldShim,
66
84
  '@woodsportal/hubspot-kit/dev/bootstrap': bootstrapShim,
85
+ '@woodsportal/hubspot-kit/dev/bootstrap-greenfield': bootstrapGreenfieldShim,
86
+ '@wphs/adapter': resolve(projectRoot, config?.dev?.adapter ?? './wphs.adapter.ts'),
67
87
  '@': resolve(projectRoot, './src'),
68
88
  },
69
89
  },
70
90
  optimizeDeps: {
71
- include: [
72
- 'react/compiler-runtime',
73
- 'react/jsx-dev-runtime',
74
- 'react/jsx-runtime',
75
- 'react-dom/client',
76
- ],
91
+ include: ['react', 'react-dom', 'react/jsx-dev-runtime', 'react/jsx-runtime'],
77
92
  exclude: ['woodsportal-client-sdk', 'woodsportal-client-sdk/auth', 'woodsportal-client-sdk/crm'],
78
93
  },
79
94
  define: {
@@ -1,23 +1,48 @@
1
- import { existsSync, lstatSync, mkdirSync, rmSync, symlinkSync } from 'node:fs'
2
- import { resolve } from 'node:path'
1
+ import { cpSync, existsSync, lstatSync, mkdirSync, rmSync, symlinkSync } from 'node:fs'
2
+ import { dirname, resolve } from 'node:path'
3
+ import { platform } from 'node:os'
3
4
 
4
5
  import { moduleConfigPaths } from '../module-config-dir.mjs'
5
6
 
6
- function ensureSymlink(shimPath, target, { directory }) {
7
+ const isWin = platform() === 'win32'
8
+
9
+ /**
10
+ * Link or copy kit dev sources into `.wphs/` so Vite serves them in-project.
11
+ * Windows: directory junctions (no admin) and file copy fallback — symlinks often fail with EPERM.
12
+ */
13
+ export function ensureKitShim(shimPath, target, { directory }) {
14
+ const targetAbs = resolve(target)
15
+ const shimAbs = resolve(shimPath)
16
+
7
17
  try {
8
- if (existsSync(shimPath)) {
9
- const stat = lstatSync(shimPath)
18
+ if (existsSync(shimAbs)) {
19
+ const stat = lstatSync(shimAbs)
10
20
  if (stat.isSymbolicLink()) {
11
- return shimPath
21
+ return shimAbs
12
22
  }
13
- rmSync(shimPath, { recursive: !directory, force: true })
23
+ rmSync(shimAbs, { recursive: directory, force: true })
14
24
  }
15
25
 
16
- mkdirSync(resolve(shimPath, '..'), { recursive: true })
17
- symlinkSync(target, shimPath, directory ? 'dir' : 'file')
18
- return shimPath
26
+ mkdirSync(dirname(shimAbs), { recursive: true })
27
+
28
+ if (isWin && directory) {
29
+ symlinkSync(targetAbs, shimAbs, 'junction')
30
+ return shimAbs
31
+ }
32
+
33
+ symlinkSync(targetAbs, shimAbs, directory ? 'dir' : 'file')
34
+ return shimAbs
19
35
  } catch {
20
- return target
36
+ try {
37
+ if (existsSync(shimAbs)) {
38
+ rmSync(shimAbs, { recursive: directory, force: true })
39
+ }
40
+ mkdirSync(dirname(shimAbs), { recursive: true })
41
+ cpSync(targetAbs, shimAbs, { recursive: directory, force: true })
42
+ return shimAbs
43
+ } catch {
44
+ return targetAbs
45
+ }
21
46
  }
22
47
  }
23
48
 
@@ -28,19 +53,19 @@ function ensureSymlink(shimPath, target, { directory }) {
28
53
  export function ensureDevKitShims(projectRoot, kitRoot) {
29
54
  const { devDir } = moduleConfigPaths(projectRoot)
30
55
 
31
- const moduleConfigRoot = ensureSymlink(
56
+ const moduleConfigRoot = ensureKitShim(
32
57
  resolve(devDir, '.kit-module-config'),
33
58
  resolve(kitRoot, 'src/dev-module-config'),
34
59
  { directory: true },
35
60
  )
36
61
 
37
- const bootstrapShim = ensureSymlink(
62
+ const bootstrapShim = ensureKitShim(
38
63
  resolve(devDir, '.kit-bootstrap.tsx'),
39
64
  resolve(kitRoot, 'src/dev/bootstrap.tsx'),
40
65
  { directory: false },
41
66
  )
42
67
 
43
- const bootstrapGreenfieldShim = ensureSymlink(
68
+ const bootstrapGreenfieldShim = ensureKitShim(
44
69
  resolve(devDir, '.kit-bootstrap-greenfield.tsx'),
45
70
  resolve(kitRoot, 'src/dev/bootstrap-greenfield.tsx'),
46
71
  { directory: false },
@@ -0,0 +1,47 @@
1
+ import assert from 'node:assert/strict'
2
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
3
+ import { tmpdir } from 'node:os'
4
+ import { join, resolve } from 'node:path'
5
+ import { describe, it } from 'node:test'
6
+
7
+ import { ensureKitShim } from './ensure-dev-kit-shims.js'
8
+
9
+ describe('ensureKitShim', () => {
10
+ it('creates a file shim inside the consumer workspace', () => {
11
+ const root = mkdtempSync(join(tmpdir(), 'wp-kit-shim-file-'))
12
+ try {
13
+ const targetDir = join(root, 'kit', 'src', 'dev')
14
+ mkdirSync(targetDir, { recursive: true })
15
+ const target = join(targetDir, 'bootstrap.tsx')
16
+ writeFileSync(target, 'export {}')
17
+
18
+ const shim = join(root, 'project', '.wphs', '.kit-bootstrap.tsx')
19
+ const result = ensureKitShim(shim, target, { directory: false })
20
+
21
+ assert.equal(result, resolve(shim))
22
+ assert.equal(readFileSync(shim, 'utf8'), 'export {}')
23
+ } finally {
24
+ rmSync(root, { recursive: true, force: true })
25
+ }
26
+ })
27
+
28
+ it('creates a directory shim inside the consumer workspace', () => {
29
+ const root = mkdtempSync(join(tmpdir(), 'wp-kit-shim-dir-'))
30
+ try {
31
+ const targetDir = join(root, 'kit', 'src', 'dev-module-config', 'ui')
32
+ mkdirSync(targetDir, { recursive: true })
33
+ const targetFile = join(targetDir, 'HsFieldLabel.tsx')
34
+ writeFileSync(targetFile, 'export {}')
35
+
36
+ const shim = join(root, 'project', '.wphs', '.kit-module-config')
37
+ const result = ensureKitShim(shim, join(root, 'kit', 'src', 'dev-module-config'), {
38
+ directory: true,
39
+ })
40
+
41
+ assert.equal(result, resolve(shim))
42
+ assert.equal(readFileSync(join(shim, 'ui', 'HsFieldLabel.tsx'), 'utf8'), 'export {}')
43
+ } finally {
44
+ rmSync(root, { recursive: true, force: true })
45
+ }
46
+ })
47
+ })
@@ -4,7 +4,7 @@
4
4
  * but still use the React plugin's Babel JSX pipeline — do not use plugin `exclude`.
5
5
  */
6
6
  const DEV_KIT_UI_RE =
7
- /[/\\]dev-module-config[/\\]|[/\\]\.kit-bootstrap(?:-greenfield)?\.tsx$|[/\\]dev[/\\]bootstrap(?:-greenfield)?\.tsx$/
7
+ /[/\\](?:dev-module-config|\.kit-module-config)[/\\]|[/\\]\.kit-bootstrap(?:-greenfield)?\.tsx$|[/\\]dev[/\\]bootstrap(?:-greenfield)?\.tsx$/
8
8
 
9
9
  export function createDevReactPluginOptions() {
10
10
  return {
@@ -1,29 +1,43 @@
1
- import { existsSync } from 'node:fs'
2
- import { resolve } from 'node:path'
3
-
4
1
  import { importConsumerDep } from '../scripts/resolve-consumer-dep.mjs'
5
- import tailwindPrefixPlugin from '../scripts/tailwind/prefix-plugin.js'
6
- import TailwindContentPlugin from '../scripts/tailwind/tailwind-content-plugin.js'
7
- import sdkLogBridge from '../scripts/vite/sdk-log-bridge.js'
8
- import moduleConfigStore from '../scripts/vite/module-config-store.js'
9
- import resolveFromProjectRoot from '../scripts/vite/resolve-from-project-root.js'
10
- import bootstrapShimResolver from '../scripts/vite/bootstrap-shim-resolver.js'
11
- import { createDevReactPluginOptions } from '../scripts/vite/react-dev-plugin-options.js'
12
- import { ensureDevKitShims } from '../scripts/vite/ensure-dev-kit-shims.js'
13
- import isPrefix from '../scripts/tailwind/prefix.env.js'
14
- import { findProjectRoot, getKitRoot } from '../scripts/project-root.mjs'
15
- import { readWoodsportalConfig } from '../scripts/read-woodsportal-config.mjs'
16
-
17
- const kitRoot = getKitRoot()
18
- const projectRoot = findProjectRoot()
19
- const { moduleConfigRoot, bootstrapShim, bootstrapGreenfieldShim } = ensureDevKitShims(projectRoot, kitRoot)
20
- const { config } = readWoodsportalConfig(projectRoot)
21
- const routesDir = resolve(projectRoot, 'src/routes')
22
- const hasTanStackRoutes = existsSync(routesDir)
23
2
 
24
3
  export default loadDevViteConfig()
25
4
 
26
5
  async function loadDevViteConfig() {
6
+ const [
7
+ { findProjectRoot, getKitRoot },
8
+ { readWoodsportalConfig },
9
+ { ensureDevKitShims },
10
+ { default: bootstrapShimResolver },
11
+ { default: resolveFromProjectRoot },
12
+ { default: sdkLogBridge },
13
+ { default: moduleConfigStore },
14
+ { createDevReactPluginOptions },
15
+ { default: isPrefix },
16
+ ] = await Promise.all([
17
+ import('../scripts/project-root.mjs'),
18
+ import('../scripts/read-woodsportal-config.mjs'),
19
+ import('../scripts/vite/ensure-dev-kit-shims.js'),
20
+ import('../scripts/vite/bootstrap-shim-resolver.js'),
21
+ import('../scripts/vite/resolve-from-project-root.js'),
22
+ import('../scripts/vite/sdk-log-bridge.js'),
23
+ import('../scripts/vite/module-config-store.js'),
24
+ import('../scripts/vite/react-dev-plugin-options.js'),
25
+ import('../scripts/tailwind/prefix.env.js'),
26
+ ])
27
+
28
+ const { existsSync } = await import('node:fs')
29
+ const { resolve } = await import('node:path')
30
+
31
+ const kitRoot = getKitRoot()
32
+ const projectRoot = findProjectRoot()
33
+ const { moduleConfigRoot, bootstrapShim, bootstrapGreenfieldShim } = ensureDevKitShims(
34
+ projectRoot,
35
+ kitRoot,
36
+ )
37
+ const { config } = readWoodsportalConfig(projectRoot)
38
+ const routesDir = resolve(projectRoot, 'src/routes')
39
+ const hasTanStackRoutes = existsSync(routesDir)
40
+
27
41
  // Load vite before plugins: parallel import of vite + @vitejs/plugin-react breaks on Node 20+ (CJS/ESM interop).
28
42
  const { defineConfig } = await importConsumerDep('vite')
29
43
  const [{ default: viteReact }, { TanStackRouterVite }, { default: tailwindcss }] = await Promise.all([
@@ -32,51 +46,62 @@ async function loadDevViteConfig() {
32
46
  importConsumerDep('@tailwindcss/vite'),
33
47
  ])
34
48
 
35
- return defineConfig(({ mode, command }) => ({
36
- root: projectRoot,
37
- plugins: [
38
- bootstrapShimResolver({ bootstrapShim, bootstrapGreenfieldShim, kitRoot }),
39
- resolveFromProjectRoot(projectRoot, kitRoot),
40
- ...(command === 'serve' && mode === 'dev'
41
- ? [sdkLogBridge(), moduleConfigStore(projectRoot)]
42
- : []),
43
- ...(hasTanStackRoutes ? [TanStackRouterVite({ autoCodeSplitting: false })] : []),
44
- viteReact(createDevReactPluginOptions()),
45
- tailwindcss(),
46
- ...(isPrefix(mode) ? [tailwindPrefixPlugin(), TailwindContentPlugin()] : []),
47
- ],
48
- resolve: {
49
- preserveSymlinks: true,
50
- alias: {
51
- '@/dev/module-config': moduleConfigRoot,
52
- '@wphs/bootstrap': bootstrapShim,
53
- '@wphs/bootstrap-greenfield': bootstrapGreenfieldShim,
54
- '@woodsportal/hubspot-kit/dev/bootstrap': bootstrapShim,
55
- '@woodsportal/hubspot-kit/dev/bootstrap-greenfield': bootstrapGreenfieldShim,
56
- '@wphs/adapter': resolve(projectRoot, config?.dev?.adapter ?? './wphs.adapter.ts'),
57
- '@': resolve(projectRoot, './src'),
58
- },
59
- },
60
- optimizeDeps: {
61
- exclude: [
62
- 'woodsportal-client-sdk',
63
- 'woodsportal-client-sdk/auth',
64
- 'woodsportal-client-sdk/crm',
49
+ return defineConfig(async ({ mode, command }) => {
50
+ const prefixPlugins = isPrefix(mode)
51
+ ? [
52
+ (await import('../scripts/tailwind/prefix-plugin.js')).default(),
53
+ (await import('../scripts/tailwind/tailwind-content-plugin.js')).default(),
54
+ ]
55
+ : []
56
+
57
+ return {
58
+ root: projectRoot,
59
+ plugins: [
60
+ bootstrapShimResolver({ bootstrapShim, bootstrapGreenfieldShim, kitRoot }),
61
+ resolveFromProjectRoot(projectRoot, kitRoot),
62
+ ...(command === 'serve' && mode === 'dev'
63
+ ? [sdkLogBridge(), moduleConfigStore(projectRoot)]
64
+ : []),
65
+ ...(hasTanStackRoutes ? [TanStackRouterVite({ autoCodeSplitting: false })] : []),
66
+ viteReact(createDevReactPluginOptions()),
67
+ tailwindcss(),
68
+ ...prefixPlugins,
65
69
  ],
66
- },
67
- define: {
68
- 'import.meta.env.VITE_WPHS_MODULE_NAME': JSON.stringify(
69
- config?.module?.name ?? config?.theme?.name ?? 'module',
70
- ),
71
- 'process.env.NODE_ENV': JSON.stringify(mode === 'dev' ? 'development' : 'production'),
72
- 'process.env': {},
73
- process: JSON.stringify({ env: {} }),
74
- },
75
- server: {
76
- port: 3000,
77
- fs: {
78
- allow: [projectRoot, kitRoot],
70
+ resolve: {
71
+ preserveSymlinks: true,
72
+ dedupe: ['react', 'react-dom'],
73
+ alias: {
74
+ '@/dev/module-config': moduleConfigRoot,
75
+ '@wphs/bootstrap': bootstrapShim,
76
+ '@wphs/bootstrap-greenfield': bootstrapGreenfieldShim,
77
+ '@woodsportal/hubspot-kit/dev/bootstrap': bootstrapShim,
78
+ '@woodsportal/hubspot-kit/dev/bootstrap-greenfield': bootstrapGreenfieldShim,
79
+ '@wphs/adapter': resolve(projectRoot, config?.dev?.adapter ?? './wphs.adapter.ts'),
80
+ '@': resolve(projectRoot, './src'),
81
+ },
82
+ },
83
+ optimizeDeps: {
84
+ include: ['react', 'react-dom', 'react/jsx-dev-runtime', 'react/jsx-runtime'],
85
+ exclude: [
86
+ 'woodsportal-client-sdk',
87
+ 'woodsportal-client-sdk/auth',
88
+ 'woodsportal-client-sdk/crm',
89
+ ],
90
+ },
91
+ define: {
92
+ 'import.meta.env.VITE_WPHS_MODULE_NAME': JSON.stringify(
93
+ config?.module?.name ?? config?.theme?.name ?? 'module',
94
+ ),
95
+ 'process.env.NODE_ENV': JSON.stringify(mode === 'dev' ? 'development' : 'production'),
96
+ 'process.env': {},
97
+ process: JSON.stringify({ env: {} }),
98
+ },
99
+ server: {
100
+ port: 3000,
101
+ fs: {
102
+ allow: [projectRoot, kitRoot],
103
+ },
79
104
  },
80
- },
81
- }))
105
+ }
106
+ })
82
107
  }