@wix/origami-site-express 0.1.3 → 0.1.5

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": "@wix/origami-site-express",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Run an exported Wix origami site on Node with Express and Vite.",
5
5
  "type": "module",
6
6
  "files": [
@@ -65,5 +65,5 @@
65
65
  ]
66
66
  }
67
67
  },
68
- "falconPackageHash": "455a5d4751b360861bad538b9622e269cf9952063df493f85de30eb9"
68
+ "falconPackageHash": "6752e2f2177eb2d994c6179584089e00c5367134074ffcb8d5b74572"
69
69
  }
@@ -12,7 +12,7 @@ async function spawnBin(command, root, env) {
12
12
  const { spawn } = await import('node:child_process')
13
13
  const child = spawn(process.execPath, [binPath(root), command], {
14
14
  cwd: root, stdio: ['ignore', 'pipe', 'pipe'],
15
- env: { ...process.env, ...env, ...(command === 'start' ? { NODE_ENV: 'production' } : {}) },
15
+ env: { ...process.env, ...env, ...(command === 'dev' ? {} : { NODE_ENV: 'production' }) },
16
16
  })
17
17
  let output = ''
18
18
  child.stdout.on('data', chunk => { output += chunk })
@@ -5,7 +5,7 @@
5
5
  * Vite's module runner: a linked core (outside node_modules) comes back as a new namespace object after an
6
6
  * edit; an installed one loads once. A failed createSite is retried by the next request.
7
7
  * @param {{ loadCore: () => Promise<any>, create: (core: any) => Promise<OrigamiSite> }} options
8
- * @returns {{ currentSite: () => Promise<OrigamiSite>, site: () => OrigamiSite | undefined,
8
+ * @returns {{ currentSite: () => Promise<OrigamiSite>, site: () => OrigamiSite | undefined, fileChanged: (path: string) => void,
9
9
  * siteTree: { table: () => ReturnType<OrigamiSite['table']>, onTableChange: OrigamiSite['onTableChange'] } }} */
10
10
  export function createCurrentSite({ loadCore, create }) {
11
11
  /** @type {{ core?: unknown, site?: OrigamiSite }} */
@@ -16,6 +16,8 @@ export function createCurrentSite({ loadCore, create }) {
16
16
  const listeners = new Set()
17
17
  /** @type {(() => void) | undefined} */
18
18
  let unsubscribe
19
+ /** Files changed while a site is being created: it may have read them already, or not. */
20
+ const changedWhileCreating = new Set()
19
21
  async function currentSite() {
20
22
  const core = await loadCore()
21
23
  if (core === current.core && current.site) return current.site
@@ -27,6 +29,8 @@ export function createCurrentSite({ loadCore, create }) {
27
29
  current = {}
28
30
  const created = await create(core)
29
31
  current = { core, site: created }
32
+ for (const path of changedWhileCreating) created.fileChanged(path)
33
+ changedWhileCreating.clear()
30
34
  unsubscribe?.()
31
35
  unsubscribe = created.onTableChange(table => { for (const listener of listeners) listener(table) })
32
36
  return created
@@ -37,8 +41,14 @@ export function createCurrentSite({ loadCore, create }) {
37
41
  }
38
42
  return {
39
43
  currentSite,
40
- /** The site already created, if any: for watcher events, which must not create one. */
44
+ /** The site already created, if any: for shutdown, which must not create one. */
41
45
  site: () => current.site,
46
+ /** Watcher events: to the current site, or held for the one being created. Never creates one.
47
+ * @param {string} path */
48
+ fileChanged(path) {
49
+ if (creating) changedWhileCreating.add(path)
50
+ else current.site?.fileChanged(path)
51
+ },
42
52
  /** What origamiVitePlugins reads. It was given once, at Vite startup, so it follows each new site. */
43
53
  siteTree: {
44
54
  table: async () => (await currentSite()).table(),
package/src/server/dev.js CHANGED
@@ -12,12 +12,12 @@ import { createCurrentSite } from './currentSite.js'
12
12
  /** `origami-site-express dev`: Vite in middleware mode, Express, and the core in dev mode, all live.
13
13
  * @param {{ root: string }} options */
14
14
  export async function dev({ root }) {
15
- const env = loadEnv('development', root, ['VITE_', 'ORIGAMI_'])
15
+ const env = loadEnv('development', root, ['VITE_', 'ORIGAMI_', 'PORT', 'HOST'])
16
16
  const { errorResponse, serializePageData } = await importCoreServer(root)
17
17
  const { origamiVitePlugins } = await importCoreBuild(root)
18
18
  const node = await importCoreNode(root)
19
19
  const serverEntry = coreEntry(root, 'server')
20
- const { currentSite, site, siteTree } = createCurrentSite({
20
+ const { currentSite, site, fileChanged, siteTree } = createCurrentSite({
21
21
  loadCore: () => isRunnableDevEnvironment(vite.environments.ssr) ? vite.environments.ssr.runner.import(serverEntry) : vite.ssrLoadModule(serverEntry),
22
22
  create: core => core.createSite({ root, mode: 'dev', ...siteOptions(env) }),
23
23
  })
@@ -35,7 +35,7 @@ export async function dev({ root }) {
35
35
  // where `exports` is not defined. Add any CommonJS package the core starts importing.
36
36
  ssr: { external: ['@wix/origami-types'] },
37
37
  })
38
- vite.watcher.on('all', (_event, path) => site()?.fileChanged(path))
38
+ vite.watcher.on('all', (_event, path) => fileChanged(path))
39
39
  const app = express()
40
40
  app.disable('x-powered-by')
41
41
  app.use(vite.middlewares)
@@ -47,5 +47,5 @@ export async function dev({ root }) {
47
47
  })), resolution.embeds),
48
48
  }))
49
49
  httpServer.on('request', app)
50
- await serve(httpServer, { port: port(), host: host('dev'), onClose: async () => { await vite.close(); await site()?.close() } })
50
+ await serve(httpServer, { port: port(env), host: host('dev', env), onClose: async () => { await vite.close(); await site()?.close() } })
51
51
  }
package/src/server/env.js CHANGED
@@ -7,9 +7,10 @@ export function siteOptions(env) {
7
7
  }
8
8
  }
9
9
 
10
- export const port = () => Number(process.env.PORT ?? 3000)
10
+ /** An empty PORT= means the default, not a random port. @param {Record<string, string | undefined>} [env] */
11
+ export const port = (env = process.env) => Number(env.PORT || 3000)
11
12
 
12
13
  /** Dev serves the site's source through Vite, so it stays on this machine unless HOST says otherwise.
13
14
  * 127.0.0.1, not localhost: on macOS localhost binds only ::1. Start listens on every interface so the deployed site is reachable.
14
- * @param {'dev' | 'prod'} mode */
15
- export const host = mode => process.env.HOST || (mode === 'dev' ? '127.0.0.1' : undefined)
15
+ * @param {'dev' | 'prod'} mode @param {Record<string, string | undefined>} [env] */
16
+ export const host = (mode, env = process.env) => env.HOST || (mode === 'dev' ? '127.0.0.1' : undefined)