Skip to content

Commit 0863b2d

Browse files
Merge pull request #1419 from opencomponents/fix-livereload
fix livereload so its correctly called after repackaging
2 parents 43701b4 + 920eaac commit 0863b2d

File tree

2 files changed

+96
-3
lines changed

2 files changed

+96
-3
lines changed

src/cli/facade/dev.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const dev = ({ local, logger }: { logger: Logger; local: Local }) =>
5151
components,
5252
refreshLiveReload
5353
}: { components: string[]; refreshLiveReload: () => void },
54-
cb: any
54+
packageComponents: (components: string[]) => Promise<void>
5555
) => {
5656
watch(components, componentsDir, (err, changedFile, componentDir) => {
5757
if (err) {
@@ -61,9 +61,13 @@ const dev = ({ local, logger }: { logger: Logger; local: Local }) =>
6161
if (!hotReloading) {
6262
logger.warn(cliMessages.HOT_RELOADING_DISABLED);
6363
} else if (!componentDir) {
64-
cb(components, refreshLiveReload);
64+
packageComponents(components).then(() => {
65+
refreshLiveReload();
66+
});
6567
} else {
66-
cb([componentDir], refreshLiveReload);
68+
packageComponents([componentDir]).then(() => {
69+
refreshLiveReload();
70+
});
6771
}
6872
}
6973
});

test/unit/cli-facade-dev.js

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,94 @@ describe('cli : facade : dev', () => {
4444
);
4545
});
4646
});
47+
48+
describe('when testing livereload refresh sequencing bugfix', () => {
49+
let packageComponentsStub, refreshLiveReloadSpy, watchStub;
50+
51+
beforeEach(() => {
52+
sinon.stub(local, 'getComponentsByDir').resolves(['component1']);
53+
packageComponentsStub = sinon.stub(local, 'package').resolves();
54+
logSpy.warn = sinon.spy();
55+
logSpy.ok = sinon.spy();
56+
logSpy.log = sinon.spy();
57+
58+
// Create a spy for refreshLiveReload that we can track
59+
refreshLiveReloadSpy = sinon.spy();
60+
61+
// Mock watch to simulate file changes
62+
watchStub = sinon.stub();
63+
});
64+
65+
afterEach(() => {
66+
local.getComponentsByDir.restore();
67+
local.package.restore();
68+
if (watchStub.restore) watchStub.restore();
69+
});
70+
71+
it('should call refreshLiveReload AFTER packageComponents completes', async () => {
72+
let packageComponentsCompleted = false;
73+
let refreshLiveReloadCalled = false;
74+
75+
// Mock packageComponents to track when it completes
76+
packageComponentsStub.callsFake(() => {
77+
return new Promise((resolve) => {
78+
setTimeout(() => {
79+
packageComponentsCompleted = true;
80+
resolve();
81+
}, 10);
82+
});
83+
});
84+
85+
// Mock refreshLiveReload to track when it's called
86+
const mockRefreshLiveReload = () => {
87+
refreshLiveReloadCalled = true;
88+
// Verify packageComponents completed BEFORE refreshLiveReload was called
89+
expect(packageComponentsCompleted).to.be.true;
90+
};
91+
92+
// Test the sequencing by simulating the watch callback behavior
93+
const components = ['component1'];
94+
const componentDir = 'component1';
95+
96+
// Simulate what happens in watchForChanges when a file changes
97+
const packageAndRefresh = async () => {
98+
await packageComponentsStub([componentDir]);
99+
mockRefreshLiveReload();
100+
};
101+
102+
await packageAndRefresh();
103+
104+
expect(packageComponentsCompleted).to.be.true;
105+
expect(refreshLiveReloadCalled).to.be.true;
106+
expect(packageComponentsStub.calledWith([componentDir])).to.be.true;
107+
});
108+
109+
it('should handle both single component and all components refresh sequencing', async () => {
110+
const components = ['component1', 'component2'];
111+
let allComponentsPackaged = false;
112+
let singleComponentPackaged = false;
113+
114+
packageComponentsStub.callsFake((comps) => {
115+
return new Promise((resolve) => {
116+
setTimeout(() => {
117+
if (comps.length > 1) {
118+
allComponentsPackaged = true;
119+
} else {
120+
singleComponentPackaged = true;
121+
}
122+
resolve();
123+
}, 10);
124+
});
125+
});
126+
127+
// Test packaging all components (when !componentDir)
128+
await packageComponentsStub(components);
129+
expect(allComponentsPackaged).to.be.true;
130+
131+
// Test packaging single component (when componentDir exists)
132+
await packageComponentsStub(['component1']);
133+
expect(singleComponentPackaged).to.be.true;
134+
});
135+
});
47136
});
48137
});

0 commit comments

Comments
 (0)