@shoper/cli 0.8.3-0 → 0.8.3-1

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.
@@ -18,7 +18,8 @@ export class Browser {
18
18
  this.#onInfo?.(`Launching browser...`);
19
19
  this.#browser = await puppeteer.launch({
20
20
  headless: false,
21
- defaultViewport: null
21
+ defaultViewport: null,
22
+ args: process.platform === 'linux' ? ['--no-sandbox'] : []
22
23
  });
23
24
  this.#browser.on('disconnected', () => {
24
25
  this.#onDisconnected?.('Browser disconnected');
@@ -69,6 +70,10 @@ export class Browser {
69
70
  throw error;
70
71
  }
71
72
  }
73
+ async refreshAll() {
74
+ const openTabs = this.getOpenTabs();
75
+ await Promise.allSettled(openTabs.map((tabId) => this.refresh(tabId)));
76
+ }
72
77
  async closeTab(tabId) {
73
78
  const tab = this.#tabs.get(tabId);
74
79
  if (!tab) {
@@ -2,7 +2,7 @@ import { AppLog } from '../../../../../cli/utilities/features/logger/logs/app_lo
2
2
  import chokidar from 'chokidar';
3
3
  import { APP_LOGS_TYPES } from '../../../../../cli/utilities/features/logger/logs/app_logs_constants.js';
4
4
  import { relative } from '../../../../../utils/path_utils.js';
5
- import { SHOP_BROWSER_TAB_ID, THEME_BATCH_DELAY_MS } from '../theme_watch_constants.js';
5
+ import { SHOP_BROWSER_TAB_ID, STORE_FRONT_BROWSER_TAB_ID, THEME_BATCH_DELAY_MS } from '../theme_watch_constants.js';
6
6
  import { FILE_STATES } from '../../../../../utils/fs/fs_constants.js';
7
7
  export class ThemeWatchService {
8
8
  #themePushApi;
@@ -14,6 +14,7 @@ export class ThemeWatchService {
14
14
  #changedFiles = new Set();
15
15
  #watcher = null;
16
16
  #urlForWatchedTheme = null;
17
+ #storeFrontUrl = null;
17
18
  constructor({ themePushApi, browserClient }) {
18
19
  this.#themePushApi = themePushApi;
19
20
  this.#browserApi = new browserClient({
@@ -26,9 +27,11 @@ export class ThemeWatchService {
26
27
  this.#onMessage = onMessage || null;
27
28
  const themePath = executionContext.themeRootDir;
28
29
  this.#urlForWatchedTheme = `${credentials.shopUrl}/admin/configSkins/skin-preview/id/${executionContext.themeId}`;
30
+ this.#storeFrontUrl = credentials.shopUrl;
29
31
  if (openBrowser) {
30
32
  await this.#browserApi.launch();
31
33
  await this.#browserApi.openTab(this.#urlForWatchedTheme, SHOP_BROWSER_TAB_ID);
34
+ await this.#browserApi.openTab(this.#storeFrontUrl, STORE_FRONT_BROWSER_TAB_ID);
32
35
  }
33
36
  this._onInfoMessage(`Watching for changes in: ${themePath}`);
34
37
  this.#watcher = chokidar.watch(themePath, {
@@ -82,21 +85,30 @@ export class ThemeWatchService {
82
85
  .on('ready', () => this._onInfoMessage('Initial scan complete. Ready for changes.'));
83
86
  }
84
87
  async ensureBrowserTabOpen() {
85
- if (!this.#urlForWatchedTheme)
88
+ if (!this.#urlForWatchedTheme || !this.#storeFrontUrl)
86
89
  return;
87
90
  if (!this.#browserApi.isBrowserOpen()) {
88
91
  this._onInfoMessage(`Browser is not open, launching...`);
89
92
  await this.#browserApi.launch();
90
93
  await this.#browserApi.openTab(this.#urlForWatchedTheme, SHOP_BROWSER_TAB_ID);
91
- this._onInfoMessage(`Browser opened with new tab`);
94
+ await this.#browserApi.openTab(this.#storeFrontUrl, STORE_FRONT_BROWSER_TAB_ID);
95
+ this._onInfoMessage(`Browser opened with new tabs`);
92
96
  return;
93
97
  }
98
+ let reopened = false;
94
99
  if (!this.#browserApi.isTabOpen(SHOP_BROWSER_TAB_ID)) {
95
- this._onInfoMessage(`Tab was closed, reopening...`);
100
+ this._onInfoMessage(`Admin preview tab was closed, reopening...`);
96
101
  await this.#browserApi.openTab(this.#urlForWatchedTheme, SHOP_BROWSER_TAB_ID);
97
- return;
102
+ reopened = true;
103
+ }
104
+ if (!this.#browserApi.isTabOpen(STORE_FRONT_BROWSER_TAB_ID)) {
105
+ this._onInfoMessage(`Store front tab was closed, reopening...`);
106
+ await this.#browserApi.openTab(this.#storeFrontUrl, STORE_FRONT_BROWSER_TAB_ID);
107
+ reopened = true;
108
+ }
109
+ if (!reopened) {
110
+ this._onInfoMessage(`Browser and tabs already open`);
98
111
  }
99
- this._onInfoMessage(`Browser and tab already open`);
100
112
  }
101
113
  async stopWatching() {
102
114
  this._onInfoMessage('Shutting down...');
@@ -105,6 +117,7 @@ export class ThemeWatchService {
105
117
  await this.#watcher?.close();
106
118
  await this.#browserApi.close();
107
119
  this.#urlForWatchedTheme = null;
120
+ this.#storeFrontUrl = null;
108
121
  }
109
122
  _clearQueuedBatch() {
110
123
  if (this.#batchTimeout) {
@@ -112,13 +125,14 @@ export class ThemeWatchService {
112
125
  this.#batchTimeout = null;
113
126
  }
114
127
  }
115
- async _refreshBrowserTab() {
116
- if (!SHOP_BROWSER_TAB_ID || !this.#browserApi.isTabOpen(SHOP_BROWSER_TAB_ID))
128
+ async _refreshBrowserTabs() {
129
+ const openTabs = this.#browserApi.getOpenTabs();
130
+ if (openTabs.length === 0)
117
131
  return;
118
132
  try {
119
- this._onInfoMessage(`Refreshing browser tab...`);
120
- await this.#browserApi.refresh(SHOP_BROWSER_TAB_ID);
121
- this._onInfoMessage(`Browser tab refreshed`);
133
+ this._onInfoMessage(`Refreshing browser tabs...`);
134
+ await this.#browserApi.refreshAll();
135
+ this._onInfoMessage(`Browser tabs refreshed`);
122
136
  }
123
137
  catch (error) {
124
138
  this._onErrorMessage(`Error refreshing browser:`, error);
@@ -132,7 +146,7 @@ export class ThemeWatchService {
132
146
  this._onInfoMessage(`Pushing theme...`);
133
147
  await this.#themePushApi.partialPush(params);
134
148
  this._onSuccessMessage(`Theme pushed successfully`);
135
- await this._refreshBrowserTab();
149
+ await this._refreshBrowserTabs();
136
150
  if (this.#pendingPush) {
137
151
  this._onInfoMessage(`Executing queued push...`);
138
152
  this.#isPushing = false;
@@ -2,3 +2,4 @@ export const THEME_WATCH_FEATURE_NAME = 'ThemeWatch';
2
2
  export const THEME_WATCH_API_NAME = 'ThemeWatchApi';
3
3
  export const THEME_BATCH_DELAY_MS = 750;
4
4
  export const SHOP_BROWSER_TAB_ID = 'shop-page';
5
+ export const STORE_FRONT_BROWSER_TAB_ID = 'store-front';
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@shoper/cli",
3
3
  "packageManager": "yarn@3.2.0",
4
4
  "sideEffects": false,
5
- "version": "0.8.3-0",
5
+ "version": "0.8.3-1",
6
6
  "description": "CLI tool for Shoper",
7
7
  "author": "Joanna Firek",
8
8
  "license": "MIT",