@coraltravelcenter/b2c-landing-builder 2.11.0 → 2.12.0

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 CHANGED
@@ -30,7 +30,8 @@ b2c-landing-vite update
30
30
  ```
31
31
 
32
32
  - `check` проверяет конфигурацию, `order.json` и контракт JS-блоков.
33
- - `dev` запускает Vite и userscript для Tampermonkey.
33
+ - `dev` запускает Vite и отдельный userscript с названием проекта для
34
+ Tampermonkey.
34
35
  - `build` создаёт CMS-файлы в `@CMS/` и переписывает пути ассетов на CDN.
35
36
  - `deploy` собирает проект, проверяет ассеты на CDN и разворачивает CMS-виджеты.
36
37
  - `deploy --section <key>` разворачивает только выбранную CMS-секцию, не изменяя
@@ -144,6 +145,15 @@ Monkey URL, контейнер и CDN prefix не задаются вручну
144
145
  - контейнер: `#monkey-app`;
145
146
  - CDN prefix: `landing-pages/<project.name>`.
146
147
 
148
+ Dev-сервер начинает с `127.0.0.1:5173` и автоматически выбирает следующий
149
+ свободный порт, поэтому несколько проектов можно запускать одновременно. Если
150
+ задан `B2C_PORT`, порт считается обязательным и занятое значение завершает
151
+ команду ошибкой.
152
+
153
+ Userscript ограничен доменом выбранного бренда и дополнительно проверяет hostname
154
+ перед монтированием. Namespace также содержит бренд, поэтому Coral и Sunmar не
155
+ конфликтуют даже при одинаковом названии проекта.
156
+
147
157
  Для Coral и Sunmar настроены отдельные production CDN. Команда `build`
148
158
  автоматически выбирает CDN по `site.preset`.
149
159
 
@@ -219,7 +229,8 @@ build; дополнительные контейнеры builder не созда
219
229
  }
220
230
  ```
221
231
 
222
- В dev пути направляются на `http://127.0.0.1:5173`. При production build они
232
+ В dev пути направляются на фактический origin текущего Vite-сервера. При
233
+ production build они
223
234
  преобразуются в `<assetsBase>/landing-pages/<folder>/...`. Builder
224
235
  переписывает только изображения `jpg`, `jpeg`, `png`, `webp`, `avif`, `gif` и
225
236
  `svg`; остальные root-relative ресурсы не изменяются.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@coraltravelcenter/b2c-landing-builder",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@coraltravelcenter/b2c-landing-builder",
9
- "version": "2.11.0",
9
+ "version": "2.12.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@babel/parser": "7.28.6",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coraltravelcenter/b2c-landing-builder",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "CLI and build toolkit for B2C landing projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,6 +30,9 @@ function waitForContainer() {
30
30
  });
31
31
  }
32
32
 
33
- const container = await waitForContainer();
34
- mount(container, parts);
35
- setupLocalCdnAssetRewrite({root: container, cdnBase: "http://127.0.0.1:5173"});
33
+ if (window.location.hostname === __B2C_TARGET_HOST__) {
34
+ const container = await waitForContainer();
35
+ mount(container, parts);
36
+ const devOrigin = new URL("/", import.meta.url).origin;
37
+ setupLocalCdnAssetRewrite({root: container, cdnBase: devOrigin});
38
+ }
@@ -18,6 +18,18 @@ export function toViteFsUrl(filePath) {
18
18
  const clientEntryUrl = toViteFsUrl(clientEntry);
19
19
  let monkeyPlugin;
20
20
 
21
+ export function resolveDevServerPort(env = process.env) {
22
+ const explicitPort = env.B2C_PORT;
23
+ if (explicitPort === undefined || explicitPort === "") {
24
+ return {port: 5173, strictPort: false};
25
+ }
26
+ const port = Number(explicitPort);
27
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
28
+ throw new Error("B2C_PORT must be an integer between 1 and 65535");
29
+ }
30
+ return {port, strictPort: true};
31
+ }
32
+
21
33
  async function loadMonkeyPlugin() {
22
34
  if (monkeyPlugin) return monkeyPlugin;
23
35
 
@@ -36,6 +48,7 @@ export async function createViteConfig(root = process.cwd()) {
36
48
  const preset = resolvePreset(config.site.preset);
37
49
  const monkey = await loadMonkeyPlugin();
38
50
  const shouldOpen = process.env.B2C_NO_OPEN !== "1";
51
+ const devPort = resolveDevServerPort();
39
52
  const vue = resolveScriptStack(config.stack.script).vue
40
53
  ? await loadProjectVuePlugin(root)
41
54
  : null;
@@ -45,8 +58,7 @@ export async function createViteConfig(root = process.cwd()) {
45
58
  configFile: false,
46
59
  server: {
47
60
  host: "127.0.0.1",
48
- port: Number(process.env.B2C_PORT || 5173),
49
- strictPort: true,
61
+ ...devPort,
50
62
  cors: true,
51
63
  open: shouldOpen ? "/__vite-plugin-monkey.install.user.js" : false,
52
64
  fs: {allow: [root, builderRoot]},
@@ -59,13 +71,16 @@ export async function createViteConfig(root = process.cwd()) {
59
71
  server: {open: shouldOpen, prefix: false},
60
72
  userscript: {
61
73
  name: config.project.name,
62
- namespace: "b2c-landing-builder",
74
+ namespace: `b2c-landing-builder:${preset.id}`,
63
75
  match: [`https://${preset.domain}/monkey/*`],
64
76
  grant: "none",
65
77
  "run-at": "document-idle",
66
78
  },
67
79
  }),
68
80
  ].filter(Boolean),
81
+ define: {
82
+ __B2C_TARGET_HOST__: JSON.stringify(preset.domain),
83
+ },
69
84
  };
70
85
  }
71
86