From 0ef184daa8088c31918133639b36950a28a7e4e0 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 19 Jun 2026 23:07:41 -0700 Subject: [PATCH 1/7] chore: move clients to virtual modules --- coldspa/vite/plugin.js | 50 ++++++++++++++++++++++++++------------ coldspa/vite/ssr-server.js | 0 2 files changed, 34 insertions(+), 16 deletions(-) mode change 100644 => 100755 coldspa/vite/ssr-server.js diff --git a/coldspa/vite/plugin.js b/coldspa/vite/plugin.js index 0064b1c..8c0ae66 100644 --- a/coldspa/vite/plugin.js +++ b/coldspa/vite/plugin.js @@ -41,20 +41,28 @@ function normalizeViteId(id) { return cleanId.startsWith('/@fs/') ? cleanId.slice('/@fs/'.length) : cleanId; } -function toViteFsId(path) { - return `/@fs/${path.split('\\').join('/')}`; -} - const FRAMEWORK_CLIENTS = { vue: toViteId(resolve(__dirname, 'clients/vue-client.js')), react: toViteId(resolve(__dirname, 'clients/react-client.js')) }; -const FRAMEWORK_CLIENT_URLS = { - '/coldspa/vite/clients/vue-client.js': FRAMEWORK_CLIENTS.vue, - '/coldspa/vite/clients/react-client.js': FRAMEWORK_CLIENTS.react +const FRAMEWORK_CLIENT_MODULES = { + '/coldspa/vite/clients/vue-client.js': { + framework: 'vue', + path: FRAMEWORK_CLIENTS.vue, + virtualId: '\0coldspa:vue-client' + }, + '/coldspa/vite/clients/react-client.js': { + framework: 'react', + path: FRAMEWORK_CLIENTS.react, + virtualId: '\0coldspa:react-client' + } }; +const VIRTUAL_CLIENT_MODULES = Object.fromEntries( + Object.values(FRAMEWORK_CLIENT_MODULES).map((entry) => [entry.virtualId, entry]) +); + // SSR entries -- one per framework that supports server rendering. const FRAMEWORK_SSR = { vue: toViteId(resolve(__dirname, 'clients/vue-ssr.js')), @@ -183,6 +191,11 @@ export default function coldspa(options = {}) { input[`${fw}-client`] = clientPath; globsByClientPath[clientPath] = userGlobs[fw] ?? DEFAULT_GLOBS[fw]; + const virtualClient = Object.values(FRAMEWORK_CLIENT_MODULES).find((entry) => entry.framework === fw); + if (virtualClient) { + globsByClientPath[virtualClient.virtualId] = userGlobs[fw] ?? DEFAULT_GLOBS[fw]; + } + // SSR entry (if framework supports it). Same glob applies. if (FRAMEWORK_SSR[fw]) { const ssrPath = FRAMEWORK_SSR[fw]; @@ -234,6 +247,11 @@ export default function coldspa(options = {}) { // placeholder and bails. These files are entry points // anyway -- they don't belong in the optimized deps cache. optimizeDeps: { + include: frameworks.flatMap((fw) => { + if (fw === 'react') return ['react', 'react-dom', 'react-dom/client']; + if (fw === 'vue') return ['vue']; + return []; + }), entries: [], exclude: Object.values(FRAMEWORK_CLIENTS).concat( Object.values(FRAMEWORK_SSR) @@ -250,15 +268,15 @@ export default function coldspa(options = {}) { }; }, - configureServer(server) { - server.middlewares.use((req, _res, next) => { - const parsed = new URL(req.url || '/', 'http://coldspa.local'); - const clientPath = FRAMEWORK_CLIENT_URLS[parsed.pathname]; - if (clientPath) { - req.url = `${toViteFsId(clientPath)}${parsed.search}`; - } - next(); - }); + resolveId(id) { + const cleanId = id.split('?')[0]; + const entry = FRAMEWORK_CLIENT_MODULES[cleanId]; + return entry ? entry.virtualId : null; + }, + + load(id) { + const entry = VIRTUAL_CLIENT_MODULES[id]; + return entry ? readFileSync(entry.path, 'utf8') : null; }, // Replace the glob placeholder in our client entries with the diff --git a/coldspa/vite/ssr-server.js b/coldspa/vite/ssr-server.js old mode 100644 new mode 100755 -- 2.51.2 From 8fab41bd545cc98603c3d5030e3a79ceb0aedb2f Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 19 Jun 2026 23:12:10 -0700 Subject: [PATCH 2/7] feat: allow user to import plugin manually in Vite config --- AGENTS.md | 4 +-- README.md | 7 +++-- coldspa/vite/plugin.js | 47 +++++++++++++----------------- docs/getting-started.md | 15 ++++++---- package-lock.json | 8 ----- package.json | 5 ---- vite.config.js | 5 +++- vite.config.react.js | 2 ++ vite.config.vue.js | 2 ++ website/src/content/docs/index.mdx | 3 +- 10 files changed, 45 insertions(+), 53 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 296ca2b..99bca4c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,7 +82,7 @@ CF custom tag resolution. `` requires a file literally named `Island. └──────────────────────────────────────┘ ▲ │ Vite plugin (coldspa/vite/plugin.js) - │ owns: framework sub-plugins, client-entry shims, + │ owns: client-entry shims, │ manifest, allowed hosts, hmr.host ▼ Vite dev server (or built dist/) @@ -96,7 +96,7 @@ CF custom tag resolution. `` requires a file literally named `Island. 2. **One bootstrap entry point.** All CFML-side side effects (config, process spawn, reload hooks) live in [coldspa/Bootstrap.cfc](coldspa/Bootstrap.cfc). `Application.cfc` (consumers') and `ModuleConfig.cfc` (ColdBox) should only *delegate* to it. Don't fork the logic. -3. **Optional peer deps.** Every framework package (`vue`, `react`, `react-dom`, `@vitejs/plugin-vue`, `@vitejs/plugin-react`) is declared as an *optional* peer dependency. The Vite plugin and SSR sidecar must `await import(...)` them lazily and only fail when the consumer actually opts into that framework. +3. **Optional peer deps.** Runtime framework packages (`vue`, `react`, `react-dom`) are declared as *optional* peer dependencies. The Vite plugin must not auto-import `@vitejs/plugin-vue` or `@vitejs/plugin-react`; consumers import and configure those in their own Vite configs. The SSR sidecar must `await import(...)` runtime framework packages lazily and only fail when the consumer actually opts into that framework. 4. **No Node inside the CF container.** Common Docker setup: CF in one container, Node in another (or on the host). `ProcessManager` probes for `npm` on PATH and silently skips spawning if it's missing, so `Bootstrap.onApplicationStart` is safe to call inside the CF container. The escape hatch for supervised setups is `COLDSPA_NO_BOOTSTRAP=1`. See [docs/docker.md](docs/docker.md). diff --git a/README.md b/README.md index d65c28f..36406c9 100644 --- a/README.md +++ b/README.md @@ -68,18 +68,22 @@ ColdBox users can skip this — the bundled `ModuleConfig.cfc` registers the cus ```js // vite.config.js import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; import coldspa from 'coldspa/vite'; export default defineConfig({ plugins: [ + vue(), coldspa({ - frameworks: ['vue'], // or ['vue', 'react'] + frameworks: ['vue'], globs: { vue: '/src/**/*.vue' } // where your components live }) ] }); ``` +Use the normal framework Vite plugin for every framework you enable. For React, install and add `@vitejs/plugin-react`; for mixed Vue + React configs, include both `vue()` and `react()` before `coldspa(...)`. + ## Use it from CFML ```cfml @@ -108,4 +112,3 @@ That's it — start your CF server and load the page. `coldspa.Bootstrap` auto-s - [Slots](docs/slots.md) — default + named slots, `cf_Slot`, gotchas - [Configuration](docs/configuration.md) — `coldspa.config.json`, env vars - [Docker & cross-host setups](docs/docker.md) — running CF and Vite on different hosts - diff --git a/coldspa/vite/plugin.js b/coldspa/vite/plugin.js index 8c0ae66..83f0999 100644 --- a/coldspa/vite/plugin.js +++ b/coldspa/vite/plugin.js @@ -1,23 +1,34 @@ // Coldspa Vite plugin. // // Encapsulates everything Vite needs to support cf_Island: -// - Loads framework sub-plugins (@vitejs/plugin-vue, @vitejs/plugin-react) // - Registers the matching client-entry shims as build inputs // - Sets manifest output, base path, dev server port/CORS for the CF integration // - Forces preserveEntrySignatures so the entry chunks aren't tree-shaken away // - Substitutes the user's component glob into the client entries at transform time // // Usage (simple): -// coldspa({ frameworks: ['vue'] }) +// import vue from '@vitejs/plugin-vue'; +// +// plugins: [ +// vue(), +// coldspa({ frameworks: ['vue'] }) +// ] // // Usage (custom component locations): -// coldspa({ -// frameworks: ['vue', 'react'], -// globs: { -// vue: '/app/**/*.vue', -// react: ['/app/**/*.jsx', '/app/**/*.tsx'] -// } -// }) +// import vue from '@vitejs/plugin-vue'; +// import react from '@vitejs/plugin-react'; +// +// plugins: [ +// vue(), +// react(), +// coldspa({ +// frameworks: ['vue', 'react'], +// globs: { +// vue: '/app/**/*.vue', +// react: ['/app/**/*.jsx', '/app/**/*.tsx'] +// } +// }) +// ] // // Options: // frameworks string[] default ['vue'] @@ -76,21 +87,6 @@ const DEFAULT_GLOBS = { const GLOB_PLACEHOLDER = '__COLDSPA_GLOB__'; -async function loadFrameworkPlugin(name) { - switch (name) { - case 'vue': { - const mod = await import('@vitejs/plugin-vue'); - return mod.default(); - } - case 'react': { - const mod = await import('@vitejs/plugin-react'); - return mod.default(); - } - default: - throw new Error(`[coldspa] Unknown framework "${name}". Supported: vue, react.`); - } -} - // Renders a glob option as the literal source text of an import.meta.glob argument: // "/src/**/*.vue" -> '/src/**/*.vue' // ["/a/**", "/b/**"] -> ["/a/**","/b/**"] @@ -208,10 +204,7 @@ export default function coldspa(options = {}) { // unhashed flat files into dist-ssr/ so the Node sidecar can require them. const isSsrBuild = process.env.COLDSPA_SSR === '1'; - const subPluginsPromise = Promise.all(frameworks.map(loadFrameworkPlugin)); - return [ - subPluginsPromise.then(plugins => plugins), { name: 'coldspa', diff --git a/docs/getting-started.md b/docs/getting-started.md index 6a7afc0..ae25f1d 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -68,34 +68,37 @@ Logs from the spawned processes land in `WEB-INF/coldspa-logs/{vite,ssr,manager} Coldspa uses Vite for asset bundling and a small Node sidecar for server-side rendering. ```bash -npm install coldspa vite vue # Vue +npm install coldspa vite vue @vitejs/plugin-vue # Vue # or npm install coldspa vite react react-dom @vitejs/plugin-react # React ``` -Coldspa lists every framework package as an **optional peer dependency**, so you only install what you actually use. +Coldspa lists every runtime framework package as an **optional peer dependency**, so you only install what you actually use. Install the matching Vite framework plugin in your app because your Vite config owns that setup. ## 4. Configure Vite ```js // vite.config.js import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; import coldspa from 'coldspa/vite'; export default defineConfig({ plugins: [ + vue(), coldspa({ - frameworks: ['vue'], // or ['vue', 'react'] + frameworks: ['vue'], globs: { - vue: '/src/**/*.vue', - react: '/src/**/*.{jsx,tsx}' + vue: '/src/**/*.vue' } }) ] }); ``` -The plugin handles framework sub-plugins, client-entry shims, manifest output, and dev-server host binding for you. +For React, import `react` from `@vitejs/plugin-react`, add `react()` to `plugins`, and set `frameworks: ['react']`. For mixed Vue + React configs, include both framework plugins before `coldspa(...)`. + +The Coldspa plugin handles client-entry shims, manifest output, and dev-server host binding for you. ## 5. Add `package.json` scripts diff --git a/package-lock.json b/package-lock.json index 2f587d4..76fb6df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,20 +24,12 @@ "vue": "^3.4.0" }, "peerDependencies": { - "@vitejs/plugin-react": "^4.0.0", - "@vitejs/plugin-vue": "^5.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "vite": "^5.0.0 || ^6.0.0", "vue": "^3.4.0" }, "peerDependenciesMeta": { - "@vitejs/plugin-react": { - "optional": true - }, - "@vitejs/plugin-vue": { - "optional": true - }, "react": { "optional": true }, diff --git a/package.json b/package.json index 2788292..dbf32b0 100644 --- a/package.json +++ b/package.json @@ -55,16 +55,12 @@ "website:build": "cd website && astro build" }, "peerDependencies": { - "@vitejs/plugin-react": "^4.0.0", - "@vitejs/plugin-vue": "^5.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "vite": "^5.0.0 || ^6.0.0", "vue": "^3.4.0" }, "peerDependenciesMeta": { - "@vitejs/plugin-react": { "optional": true }, - "@vitejs/plugin-vue": { "optional": true }, "react": { "optional": true }, "react-dom": { "optional": true }, "vue": { "optional": true } @@ -82,4 +78,3 @@ "vue": "^3.4.0" } } - diff --git a/vite.config.js b/vite.config.js index dc543e0..04c294d 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,10 +4,14 @@ // For a single-framework dev server, use vite.config.vue.js or // vite.config.react.js via `npm run vite:vue` / `npm run vite:react`. import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import react from '@vitejs/plugin-react'; import coldspa from 'coldspa/vite'; export default defineConfig({ plugins: [ + vue(), + react(), coldspa({ frameworks: ['vue', 'react'], globs: { @@ -17,4 +21,3 @@ export default defineConfig({ }) ] }); - diff --git a/vite.config.react.js b/vite.config.react.js index 3475402..6776e10 100644 --- a/vite.config.react.js +++ b/vite.config.react.js @@ -1,10 +1,12 @@ // React-only Vite config for the demos/react island demo. // Run with: npm run vite:react import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; import coldspa from 'coldspa/vite'; export default defineConfig({ plugins: [ + react(), coldspa({ frameworks: ['react'], globs: { diff --git a/vite.config.vue.js b/vite.config.vue.js index 20c8ce5..395d287 100644 --- a/vite.config.vue.js +++ b/vite.config.vue.js @@ -1,10 +1,12 @@ // Vue-only Vite config for the demos/vue island demo. // Run with: npm run vite:vue import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; import coldspa from 'coldspa/vite'; export default defineConfig({ plugins: [ + vue(), coldspa({ frameworks: ['vue'], globs: { diff --git a/website/src/content/docs/index.mdx b/website/src/content/docs/index.mdx index 24d6021..c6fce44 100644 --- a/website/src/content/docs/index.mdx +++ b/website/src/content/docs/index.mdx @@ -33,7 +33,7 @@ Mount Vue or React components into CFML pages with server-side rendering and pro Choose `load`, `idle`, `visible`, or `client` per island. Below-the-fold widgets stay dormant until the user scrolls. - HMR in dev, hashed bundles + manifest in prod. One Vite plugin (`coldspa/vite`) wires up component globs, client entries, and the SSR build. + HMR in dev, hashed bundles + manifest in prod. `coldspa/vite` wires up component globs, client entries, and the SSR build alongside your normal framework plugins. Both frameworks supported out of the box, and you can mix them on the same page. @@ -42,4 +42,3 @@ Mount Vue or React components into CFML pages with server-side rendering and pro Default and named slots come from CFML markup -- including `` queries, ``, and conditionals. - -- 2.51.2 From 7890a310eb549b0eb95556be670acb504141c419 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 19 Jun 2026 23:22:32 -0700 Subject: [PATCH 3/7] docs: point the user to coldspa-ssr binary --- docs/getting-started.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index ae25f1d..f31f8b0 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -106,14 +106,14 @@ The Coldspa plugin handles client-entry shims, manifest output, and dev-server h { "scripts": { "dev": "vite", - "ssr": "node node_modules/coldspa/coldspa/vite/ssr-server.js", + "ssr": "coldspa-ssr", "build": "vite build && cross-env COLDSPA_SSR=1 vite build", - "ssr:prod": "cross-env NODE_ENV=production node node_modules/coldspa/coldspa/vite/ssr-server.js" + "ssr:prod": "cross-env NODE_ENV=production coldspa-ssr" } } ``` -The `ssr` script can also be invoked via the `coldspa-ssr` bin shipped in the npm package. +`coldspa-ssr` is the SSR sidecar binary shipped in the npm package. Keeping it behind an `ssr` script lets `coldspa.Bootstrap` start the sidecar automatically with `npm run ssr`. ## 6. Configure runtime URLs (optional) -- 2.51.2 From 6a514e97eb0e60b8a33ca795edbdc4750889e985 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 19 Jun 2026 23:24:27 -0700 Subject: [PATCH 4/7] feat: add ability to run `coldspa-ssr --prod` --- coldspa/vite/ssr-server.js | 7 +++++++ docs/getting-started.md | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/coldspa/vite/ssr-server.js b/coldspa/vite/ssr-server.js index 2f24d6d..f53fd8c 100755 --- a/coldspa/vite/ssr-server.js +++ b/coldspa/vite/ssr-server.js @@ -22,11 +22,18 @@ // COLDSPA_SSR_PORT default 5174 // COLDSPA_SSR_HOST default 0.0.0.0 // NODE_ENV 'production' switches to prod mode +// +// Flags: +// --prod switches to prod mode import { createServer as createHttpServer } from 'http'; import { fileURLToPath, pathToFileURL } from 'url'; import { dirname, resolve } from 'path'; +if (process.argv.includes('--prod')) { + process.env.NODE_ENV = 'production'; +} + const __dirname = dirname(fileURLToPath(import.meta.url)); const PROJECT_ROOT = resolve(process.cwd()); const PORT = Number(process.env.COLDSPA_SSR_PORT || 5174); diff --git a/docs/getting-started.md b/docs/getting-started.md index f31f8b0..aba2f4a 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -108,7 +108,7 @@ The Coldspa plugin handles client-entry shims, manifest output, and dev-server h "dev": "vite", "ssr": "coldspa-ssr", "build": "vite build && cross-env COLDSPA_SSR=1 vite build", - "ssr:prod": "cross-env NODE_ENV=production coldspa-ssr" + "ssr:prod": "coldspa-ssr --prod" } } ``` diff --git a/package.json b/package.json index dbf32b0..d6c7a4d 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "vite:vue": "vite --config vite.config.vue.js", "vite:react": "vite --config vite.config.react.js", "ssr": "node coldspa/vite/ssr-server.js", - "ssr:prod": "cross-env NODE_ENV=production node coldspa/vite/ssr-server.js", + "ssr:prod": "node coldspa/vite/ssr-server.js --prod", "build": "vite build && cross-env COLDSPA_SSR=1 vite build", "build:client": "vite build", "build:ssr": "cross-env COLDSPA_SSR=1 vite build", -- 2.51.2 From 15829cbf2ad393e09b849a385d728c24f1cae01c Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 19 Jun 2026 23:27:27 -0700 Subject: [PATCH 5/7] feat: add ability to force dep optimizer for SSR sidecar --- coldspa/vite/ssr-server.js | 4 ++++ docs/getting-started.md | 2 ++ 2 files changed, 6 insertions(+) diff --git a/coldspa/vite/ssr-server.js b/coldspa/vite/ssr-server.js index f53fd8c..346a070 100755 --- a/coldspa/vite/ssr-server.js +++ b/coldspa/vite/ssr-server.js @@ -25,6 +25,7 @@ // // Flags: // --prod switches to prod mode +// --force passes Vite's dependency optimizer force option in dev import { createServer as createHttpServer } from 'http'; import { fileURLToPath, pathToFileURL } from 'url'; @@ -34,6 +35,8 @@ if (process.argv.includes('--prod')) { process.env.NODE_ENV = 'production'; } +const FORCE_OPTIMIZE_DEPS = process.argv.includes('--force'); + const __dirname = dirname(fileURLToPath(import.meta.url)); const PROJECT_ROOT = resolve(process.cwd()); const PORT = Number(process.env.COLDSPA_SSR_PORT || 5174); @@ -73,6 +76,7 @@ async function getRenderer(framework) { viteDevServer = await createServer({ root: PROJECT_ROOT, server: { middlewareMode: true }, + optimizeDeps: FORCE_OPTIMIZE_DEPS ? { force: true } : undefined, appType: 'custom' }); } diff --git a/docs/getting-started.md b/docs/getting-started.md index aba2f4a..d671e10 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -115,6 +115,8 @@ The Coldspa plugin handles client-entry shims, manifest output, and dev-server h `coldspa-ssr` is the SSR sidecar binary shipped in the npm package. Keeping it behind an `ssr` script lets `coldspa.Bootstrap` start the sidecar automatically with `npm run ssr`. +If Vite's dependency optimizer cache needs to be rebuilt during development, run the sidecar with `coldspa-ssr --force` or `npm run ssr -- --force`. + ## 6. Configure runtime URLs (optional) For local single-host dev, the defaults are fine. Otherwise create a `coldspa.config.json` at the webroot: -- 2.51.2 From 18daf90d2bba4729561e92f3d8125ac23c9a0b94 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 19 Jun 2026 23:28:26 -0700 Subject: [PATCH 6/7] chore: add React dedupe --- coldspa/vite/plugin.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/coldspa/vite/plugin.js b/coldspa/vite/plugin.js index 83f0999..dec632b 100644 --- a/coldspa/vite/plugin.js +++ b/coldspa/vite/plugin.js @@ -170,6 +170,7 @@ export default function coldspa(options = {}) { const outDir = options.outDir ?? 'dist'; const baseProd = options.base ?? '/dist/'; const userGlobs = options.globs ?? {}; + const usesReact = frameworks.includes('react'); for (const fw of frameworks) { if (!(fw in FRAMEWORK_CLIENTS)) { @@ -209,8 +210,18 @@ export default function coldspa(options = {}) { name: 'coldspa', config(_userConfig, { command }) { + const sharedConfig = usesReact ? { + resolve: { + dedupe: ['react', 'react-dom'] + }, + esbuild: { + jsx: 'automatic' + } + } : {}; + if (isSsrBuild) { return { + ...sharedConfig, // SSR builds don't need a public base path; output is // consumed by Node, not the browser. build: { @@ -232,6 +243,7 @@ export default function coldspa(options = {}) { }; } return { + ...sharedConfig, base: command === 'build' ? baseProd : '/', server: serverConfig(vitePort, _userConfig.root || process.cwd()), // Exclude our client entries from Vite's dep pre-scan. -- 2.51.2 From 0d69b2034e1069e97320a6309053cb647e2f449a Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 19 Jun 2026 23:29:07 -0700 Subject: [PATCH 7/7] chore: bump to 0.4.0 --- ModuleConfig.cfc | 2 +- box.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ModuleConfig.cfc b/ModuleConfig.cfc index 8aad951..0e956c4 100644 --- a/ModuleConfig.cfc +++ b/ModuleConfig.cfc @@ -16,7 +16,7 @@ component { this.author = "crutchcorn"; this.webURL = "https://github.com/crutchcorn/coldspa"; this.description = "Give your CFML a spa day. The Islands Architecture for ColdFusion."; - this.version = "0.3.0"; + this.version = "0.4.0"; this.autoMapping = true; this.entryPoint = "coldspa"; this.modelNamespace = "coldspa"; diff --git a/box.json b/box.json index facb728..f1ac13c 100644 --- a/box.json +++ b/box.json @@ -1,7 +1,7 @@ { "name":"Coldspa", "slug":"coldspa", - "version":"0.3.0", + "version":"0.4.0", "author":"crutchcorn", "location":"ForgeboxStorage", "private":false, diff --git a/package-lock.json b/package-lock.json index 76fb6df..2bcf924 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coldspa", - "version": "0.3.0", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coldspa", - "version": "0.3.0", + "version": "0.4.0", "license": "MIT", "bin": { "coldspa-ssr": "coldspa/vite/ssr-server.js" diff --git a/package.json b/package.json index d6c7a4d..7260931 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coldspa", - "version": "0.3.2", + "version": "0.4.0", "description": "Give your CFML a spa day. The Islands Architecture for ColdFusion.", "type": "module", "license": "MIT", -- 2.51.2