Skip to content

Commit 9da243a

Browse files
authored
feat: STRF-13448 Support --port for stencil start (#1288)
1 parent aae9a29 commit 9da243a

File tree

3 files changed

+67
-11
lines changed

3 files changed

+67
-11
lines changed

bin/stencil-start.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ program
2323
.option(
2424
'-cu, --channelUrl [channelUrl]',
2525
'Set a custom domain url to bypass dns/proxy protection',
26-
);
26+
)
27+
.option('-p --port [portnumber]', 'Set port number to listen dev server');
2728
const cliOptions = prepareCommand(program);
2829
const options = {
2930
open: cliOptions.open,
@@ -33,6 +34,7 @@ const options = {
3334
tunnel: cliOptions.tunnel,
3435
cache: cliOptions.cache,
3536
channelUrl: cliOptions.channelUrl,
37+
port: cliOptions.port,
3638
};
3739

3840
async function run() {

lib/stencil-start.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class StencilStart {
5757
}
5858
const initialStencilConfig = await this._stencilConfigManager.read();
5959
// Use initial (before updates) port for BrowserSync
60-
const browserSyncPort = initialStencilConfig.port;
60+
const browserSyncPort = cliOptions.port || initialStencilConfig.port;
6161
const channelUrl = await this.getChannelUrl(initialStencilConfig, cliOptions);
6262
const storeInfoFromAPI = await this._themeApiClient.checkCliVersion({
6363
storeUrl: channelUrl,
@@ -72,7 +72,7 @@ class StencilStart {
7272
);
7373
await this.startLocalServer(cliOptions, updatedStencilConfig);
7474
this._logger.log(this.getStartUpInfo(updatedStencilConfig));
75-
await this.startBrowserSync(cliOptions, updatedStencilConfig, browserSyncPort);
75+
await this.startBrowserSync(cliOptions, browserSyncPort);
7676
}
7777

7878
async getStoreSettingsLocale(cliOptions, stencilConfig) {
@@ -131,7 +131,6 @@ class StencilStart {
131131
...stencilConfig,
132132
storeUrl: storeInfoFromAPI.sslUrl,
133133
normalStoreUrl: storeInfoFromAPI.baseUrl,
134-
port: Number(stencilConfig.port) + 1,
135134
};
136135
}
137136

@@ -151,7 +150,7 @@ class StencilStart {
151150
});
152151
}
153152

154-
async startBrowserSync(cliOptions, stencilConfig, browserSyncPort) {
153+
async startBrowserSync(cliOptions, browserSyncPort) {
155154
const DEFAULT_WATCH_FILES = ['/assets', '/templates', '/lang', '/.config'];
156155
const DEFAULT_WATCH_IGNORED = ['/assets/scss', '/assets/css'];
157156
const { themePath, configPath } = this._themeConfigManager;
@@ -218,7 +217,7 @@ class StencilStart {
218217
ignoreInitial: true,
219218
ignored: watchIgnored.map((val) => path.join(themePath, val)),
220219
},
221-
proxy: `localhost:${stencilConfig.port}`,
220+
proxy: `localhost:${Number(browserSyncPort) + 1}`,
222221
tunnel,
223222
});
224223
// Handle manual reloading of browsers by typing 'rs';

lib/stencil-start.spec.js

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,30 @@ describe('StencilStart unit tests', () => {
1010
init: jest.fn(),
1111
});
1212
const getThemeApiClientStub = () => ({
13-
checkCliVersion: jest.fn(),
13+
checkCliVersion: jest.fn().mockResolvedValue({
14+
baseUrl: 'example.com',
15+
sslUrl: 'https://example.com',
16+
}),
17+
getStoreHash: jest.fn().mockResolvedValue('storeHash_value'),
18+
getStoreChannels: jest
19+
.fn()
20+
.mockResolvedValue([{ channel_id: 5, url: 'https://www.example.com' }]),
1421
});
1522
const getFsUtilsStub = () => ({
16-
existsSync: jest.fn(),
17-
parseJsonFile: jest.fn(),
23+
existsSync: jest.fn().mockReturnValue(true),
24+
parseJsonFile: jest.fn().mockResolvedValue({}),
1825
recursiveReadDir: jest.fn(),
1926
});
2027
const getCliCommonStub = () => ({
2128
checkNodeVersion: jest.fn(),
2229
});
23-
const getThemeConfigManagerStub = () => ({});
24-
const getStencilConfigManagerStub = () => ({});
30+
const getThemeConfigManagerStub = () => ({
31+
themePath: '/some/absolute/config/path',
32+
configPath: '/some/absolute/config/path',
33+
});
34+
const getStencilConfigManagerStub = (config = {}) => ({
35+
read: jest.fn().mockResolvedValue(config),
36+
});
2537
const getBuildConfigManagerStub = () => ({});
2638
const getTemplateAssemblerStub = () => ({});
2739
const getCyclesDetectorConstructorStub = () => jest.fn();
@@ -32,6 +44,9 @@ describe('StencilStart unit tests', () => {
3244
log: jest.fn(),
3345
error: jest.fn(),
3446
});
47+
const getStoreSettingsApiClientStub = () => ({
48+
getStoreSettingsLocale: jest.fn().mockResolvedValue({ default_shopper_language: 'en_US' }),
49+
});
3550
const createStencilStartInstance = ({
3651
browserSync,
3752
fsUtils,
@@ -44,6 +59,7 @@ describe('StencilStart unit tests', () => {
4459
CyclesDetector,
4560
stencilPushUtils,
4661
logger,
62+
storeSettingsApiClient,
4763
} = {}) => {
4864
const passedArgs = {
4965
browserSync: browserSync || getBrowserSyncStub(),
@@ -57,6 +73,7 @@ describe('StencilStart unit tests', () => {
5773
CyclesDetector: CyclesDetector || getCyclesDetectorConstructorStub(),
5874
stencilPushUtils: stencilPushUtils || getStencilPushUtilsStub(),
5975
logger: logger || getLoggerStub(),
76+
storeSettingsApiClient: storeSettingsApiClient || getStoreSettingsApiClientStub(),
6077
};
6178
const instance = new StencilStart(passedArgs);
6279
return {
@@ -151,4 +168,42 @@ describe('StencilStart unit tests', () => {
151168
expect(result).toEqual(channelUrl);
152169
});
153170
});
171+
172+
describe('port option', () => {
173+
it('should read port from the config file', async () => {
174+
const port = 1234;
175+
const browserSyncStub = getBrowserSyncStub();
176+
const { instance } = createStencilStartInstance({
177+
browserSync: browserSyncStub,
178+
stencilConfigManager: getStencilConfigManagerStub({ port }),
179+
});
180+
instance.startLocalServer = jest.fn();
181+
instance.getStartUpInfo = jest.fn().mockReturnValue('Start up info');
182+
instance.checkLangFiles = jest.fn();
183+
await instance.run({});
184+
expect(browserSyncStub.init).toHaveBeenCalledWith(
185+
expect.objectContaining({
186+
port,
187+
}),
188+
);
189+
});
190+
191+
it('should read port from the cli', async () => {
192+
const port = 1234;
193+
const browserSyncStub = getBrowserSyncStub();
194+
const { instance } = createStencilStartInstance({
195+
browserSync: browserSyncStub,
196+
stencilConfigManager: getStencilConfigManagerStub({ port: 5678 }),
197+
});
198+
instance.startLocalServer = jest.fn();
199+
instance.getStartUpInfo = jest.fn().mockReturnValue('Start up info');
200+
instance.checkLangFiles = jest.fn();
201+
await instance.run({ port });
202+
expect(browserSyncStub.init).toHaveBeenCalledWith(
203+
expect.objectContaining({
204+
port,
205+
}),
206+
);
207+
});
208+
});
154209
});

0 commit comments

Comments
 (0)