mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-06-21 01:20:36 +03:00
add treeshaking tests
This commit is contained in:
@@ -44,8 +44,10 @@
|
||||
"build": "rollup -c",
|
||||
"jest": "jest --coverage --runInBand --detectOpenHandles --testPathPattern",
|
||||
"postjest": "full-coverage",
|
||||
"jest:node": "jest --runInBand --detectOpenHandles --selectProjects node --testPathPattern",
|
||||
"jest:jsdom": "jest --runInBand --detectOpenHandles --selectProjects jsdom --testPathPattern",
|
||||
"playwright": "playwright test --quiet",
|
||||
"playwright:dev": "playwright test --workers 1",
|
||||
"postplaywright": "playwright-merge-coverage && full-coverage"
|
||||
"postplaywright": "playwright-merge-coverage && full-coverage",
|
||||
"playwright:dev": "playwright test --workers 1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,6 +70,8 @@ Released under the MIT license.`,
|
||||
max_line_len: 80, // eslint-disable-line camelcase
|
||||
braces: true,
|
||||
indent_level: 2, // eslint-disable-line camelcase
|
||||
comments: 'all',
|
||||
preserve_annotations: true, // eslint-disable-line camelcase
|
||||
},
|
||||
}),
|
||||
],
|
||||
@@ -85,5 +87,10 @@ Released under the MIT license.`,
|
||||
totalHigh: 35000,
|
||||
}),
|
||||
],
|
||||
treeshake: {
|
||||
propertyReadSideEffects: false,
|
||||
moduleSideEffects: false,
|
||||
annotations: false,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
+8
-7
@@ -61,11 +61,12 @@ export type OptionsValidationPluginInstance = {
|
||||
|
||||
export const optionsValidationPluginName = '__osOptionsValidationPlugin';
|
||||
|
||||
export const optionsValidationPlugin: Plugin<OptionsValidationPluginInstance> = {
|
||||
[optionsValidationPluginName]: {
|
||||
_: (options: DeepPartial<Options>, doWriteErrors?: boolean) => {
|
||||
const [validated, foreign] = validateOptions(optionsTemplate, options, doWriteErrors);
|
||||
return { ...foreign, ...validated };
|
||||
export const optionsValidationPlugin: Plugin<OptionsValidationPluginInstance> =
|
||||
/* @__PURE__ */ (() => ({
|
||||
[optionsValidationPluginName]: {
|
||||
_: (options: DeepPartial<Options>, doWriteErrors?: boolean) => {
|
||||
const [validated, foreign] = validateOptions(optionsTemplate, options, doWriteErrors);
|
||||
return { ...foreign, ...validated };
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}))();
|
||||
|
||||
+195
-192
@@ -79,206 +79,209 @@ const diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {
|
||||
|
||||
export const scrollbarsHidingPluginName = '__osScrollbarsHidingPlugin';
|
||||
|
||||
export const scrollbarsHidingPlugin: Plugin<ScrollbarsHidingPluginInstance> = {
|
||||
[scrollbarsHidingPluginName]: {
|
||||
_createUniqueViewportArrangeElement: (env: InternalEnvironment) => {
|
||||
const { _nativeScrollbarsHiding, _nativeScrollbarsOverlaid, _cssCustomProperties } = env;
|
||||
const create =
|
||||
!_cssCustomProperties &&
|
||||
!_nativeScrollbarsHiding &&
|
||||
(_nativeScrollbarsOverlaid.x || _nativeScrollbarsOverlaid.y);
|
||||
const result = create ? document.createElement('style') : false;
|
||||
export const scrollbarsHidingPlugin: Plugin<ScrollbarsHidingPluginInstance> =
|
||||
/* @__PURE__ */ (() => ({
|
||||
[scrollbarsHidingPluginName]: {
|
||||
_createUniqueViewportArrangeElement: (env: InternalEnvironment) => {
|
||||
const { _nativeScrollbarsHiding, _nativeScrollbarsOverlaid, _cssCustomProperties } = env;
|
||||
const create =
|
||||
!_cssCustomProperties &&
|
||||
!_nativeScrollbarsHiding &&
|
||||
(_nativeScrollbarsOverlaid.x || _nativeScrollbarsOverlaid.y);
|
||||
const result = create ? document.createElement('style') : false;
|
||||
|
||||
if (result) {
|
||||
attr(result, 'id', `${classNameViewportArrange}-${contentArrangeCounter}`);
|
||||
contentArrangeCounter++;
|
||||
}
|
||||
if (result) {
|
||||
attr(result, 'id', `${classNameViewportArrange}-${contentArrangeCounter}`);
|
||||
contentArrangeCounter++;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
_overflowUpdateSegment: (
|
||||
doViewportArrange,
|
||||
flexboxGlue,
|
||||
viewport,
|
||||
viewportArrange,
|
||||
getState,
|
||||
getViewportOverflowState,
|
||||
hideNativeScrollbars
|
||||
) => {
|
||||
/**
|
||||
* Sets the styles of the viewport arrange element.
|
||||
* @param viewportOverflowState The viewport overflow state according to which the scrollbars shall be hidden.
|
||||
* @param viewportScrollSize The content scroll size.
|
||||
* @param directionIsRTL Whether the direction is RTL or not.
|
||||
* @returns A boolean which indicates whether the viewport arrange element was adjusted.
|
||||
*/
|
||||
const arrangeViewport: ArrangeViewport = (
|
||||
viewportOverflowState,
|
||||
viewportScrollSize,
|
||||
sizeFraction,
|
||||
directionIsRTL
|
||||
return result;
|
||||
},
|
||||
_overflowUpdateSegment: (
|
||||
doViewportArrange,
|
||||
flexboxGlue,
|
||||
viewport,
|
||||
viewportArrange,
|
||||
getState,
|
||||
getViewportOverflowState,
|
||||
hideNativeScrollbars
|
||||
) => {
|
||||
if (doViewportArrange) {
|
||||
const { _viewportPaddingStyle } = getState();
|
||||
const { _scrollbarsHideOffset, _scrollbarsHideOffsetArrange } = viewportOverflowState;
|
||||
const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;
|
||||
const { x: hideOffsetX, y: hideOffsetY } = _scrollbarsHideOffset;
|
||||
const viewportArrangeHorizontalPaddingKey: keyof StyleObject = directionIsRTL
|
||||
? 'paddingRight'
|
||||
: 'paddingLeft';
|
||||
const viewportArrangeHorizontalPaddingValue = _viewportPaddingStyle[
|
||||
viewportArrangeHorizontalPaddingKey
|
||||
] as number;
|
||||
const viewportArrangeVerticalPaddingValue = _viewportPaddingStyle.paddingTop as number;
|
||||
const fractionalContentWidth = viewportScrollSize.w + sizeFraction.w;
|
||||
const fractionalContenHeight = viewportScrollSize.h + sizeFraction.h;
|
||||
const arrangeSize = {
|
||||
w:
|
||||
hideOffsetY && arrangeY
|
||||
? `${
|
||||
hideOffsetY + fractionalContentWidth - viewportArrangeHorizontalPaddingValue
|
||||
}px`
|
||||
: '',
|
||||
h:
|
||||
hideOffsetX && arrangeX
|
||||
? `${hideOffsetX + fractionalContenHeight - viewportArrangeVerticalPaddingValue}px`
|
||||
: '',
|
||||
/**
|
||||
* Sets the styles of the viewport arrange element.
|
||||
* @param viewportOverflowState The viewport overflow state according to which the scrollbars shall be hidden.
|
||||
* @param viewportScrollSize The content scroll size.
|
||||
* @param directionIsRTL Whether the direction is RTL or not.
|
||||
* @returns A boolean which indicates whether the viewport arrange element was adjusted.
|
||||
*/
|
||||
const arrangeViewport: ArrangeViewport = (
|
||||
viewportOverflowState,
|
||||
viewportScrollSize,
|
||||
sizeFraction,
|
||||
directionIsRTL
|
||||
) => {
|
||||
if (doViewportArrange) {
|
||||
const { _viewportPaddingStyle } = getState();
|
||||
const { _scrollbarsHideOffset, _scrollbarsHideOffsetArrange } = viewportOverflowState;
|
||||
const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;
|
||||
const { x: hideOffsetX, y: hideOffsetY } = _scrollbarsHideOffset;
|
||||
const viewportArrangeHorizontalPaddingKey: keyof StyleObject = directionIsRTL
|
||||
? 'paddingRight'
|
||||
: 'paddingLeft';
|
||||
const viewportArrangeHorizontalPaddingValue = _viewportPaddingStyle[
|
||||
viewportArrangeHorizontalPaddingKey
|
||||
] as number;
|
||||
const viewportArrangeVerticalPaddingValue = _viewportPaddingStyle.paddingTop as number;
|
||||
const fractionalContentWidth = viewportScrollSize.w + sizeFraction.w;
|
||||
const fractionalContenHeight = viewportScrollSize.h + sizeFraction.h;
|
||||
const arrangeSize = {
|
||||
w:
|
||||
hideOffsetY && arrangeY
|
||||
? `${
|
||||
hideOffsetY + fractionalContentWidth - viewportArrangeHorizontalPaddingValue
|
||||
}px`
|
||||
: '',
|
||||
h:
|
||||
hideOffsetX && arrangeX
|
||||
? `${
|
||||
hideOffsetX + fractionalContenHeight - viewportArrangeVerticalPaddingValue
|
||||
}px`
|
||||
: '',
|
||||
};
|
||||
|
||||
// adjust content arrange / before element
|
||||
if (viewportArrange) {
|
||||
const { sheet } = viewportArrange;
|
||||
if (sheet) {
|
||||
const { cssRules } = sheet;
|
||||
if (cssRules) {
|
||||
if (!cssRules.length) {
|
||||
sheet.insertRule(
|
||||
`#${attr(viewportArrange, 'id')} + .${classNameViewportArrange}::before {}`,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
// @ts-ignore
|
||||
const ruleStyle = cssRules[0].style;
|
||||
|
||||
ruleStyle.width = arrangeSize.w;
|
||||
ruleStyle.height = arrangeSize.h;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
style<'--os-vaw' | '--os-vah'>(viewport, {
|
||||
'--os-vaw': arrangeSize.w,
|
||||
'--os-vah': arrangeSize.h,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return doViewportArrange;
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes all styles applied because of the viewport arrange strategy.
|
||||
* @param showNativeOverlaidScrollbars Whether native overlaid scrollbars are shown instead of hidden.
|
||||
* @param directionIsRTL Whether the direction is RTL or not.
|
||||
* @param viewportOverflowState The currentviewport overflow state or undefined if it has to be determined.
|
||||
* @returns A object with a function which applies all the removed styles and the determined viewport vverflow state.
|
||||
*/
|
||||
const undoViewportArrange: UndoArrangeViewport = (
|
||||
showNativeOverlaidScrollbars,
|
||||
directionIsRTL,
|
||||
viewportOverflowState?
|
||||
) => {
|
||||
if (doViewportArrange) {
|
||||
const finalViewportOverflowState =
|
||||
viewportOverflowState || getViewportOverflowState(showNativeOverlaidScrollbars);
|
||||
const { _viewportPaddingStyle: viewportPaddingStyle } = getState();
|
||||
const { _scrollbarsHideOffsetArrange } = finalViewportOverflowState;
|
||||
const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;
|
||||
const finalPaddingStyle: StyleObject = {};
|
||||
const assignProps = (props: string) =>
|
||||
each(props.split(' '), (prop) => {
|
||||
finalPaddingStyle[prop] = viewportPaddingStyle[prop];
|
||||
});
|
||||
|
||||
if (arrangeX) {
|
||||
assignProps('marginBottom paddingTop paddingBottom');
|
||||
}
|
||||
|
||||
if (arrangeY) {
|
||||
assignProps('marginLeft marginRight paddingLeft paddingRight');
|
||||
}
|
||||
|
||||
const prevStyle = style(viewport, keys(finalPaddingStyle));
|
||||
|
||||
removeClass(viewport, classNameViewportArrange);
|
||||
|
||||
if (!flexboxGlue) {
|
||||
finalPaddingStyle.height = '';
|
||||
}
|
||||
|
||||
style(viewport, finalPaddingStyle);
|
||||
|
||||
return [
|
||||
() => {
|
||||
hideNativeScrollbars(
|
||||
finalViewportOverflowState,
|
||||
directionIsRTL,
|
||||
doViewportArrange,
|
||||
prevStyle
|
||||
);
|
||||
style(viewport, prevStyle);
|
||||
addClass(viewport, classNameViewportArrange);
|
||||
},
|
||||
finalViewportOverflowState,
|
||||
];
|
||||
}
|
||||
return [noop];
|
||||
};
|
||||
|
||||
return [arrangeViewport, undoViewportArrange];
|
||||
},
|
||||
_envWindowZoom: () => {
|
||||
let size = { w: 0, h: 0 };
|
||||
let dpr = 0;
|
||||
|
||||
return (envInstance, updateNativeScrollbarSizeCache, triggerEvent) => {
|
||||
const sizeNew = windowSize();
|
||||
const deltaSize = {
|
||||
w: sizeNew.w - size.w,
|
||||
h: sizeNew.h - size.h,
|
||||
};
|
||||
|
||||
// adjust content arrange / before element
|
||||
if (viewportArrange) {
|
||||
const { sheet } = viewportArrange;
|
||||
if (sheet) {
|
||||
const { cssRules } = sheet;
|
||||
if (cssRules) {
|
||||
if (!cssRules.length) {
|
||||
sheet.insertRule(
|
||||
`#${attr(viewportArrange, 'id')} + .${classNameViewportArrange}::before {}`,
|
||||
0
|
||||
);
|
||||
}
|
||||
if (deltaSize.w === 0 && deltaSize.h === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// @ts-ignore
|
||||
const ruleStyle = cssRules[0].style;
|
||||
const deltaAbsSize = {
|
||||
w: abs(deltaSize.w),
|
||||
h: abs(deltaSize.h),
|
||||
};
|
||||
const deltaAbsRatio = {
|
||||
w: abs(round(sizeNew.w / (size.w / 100.0))),
|
||||
h: abs(round(sizeNew.h / (size.h / 100.0))),
|
||||
};
|
||||
const dprNew = getWindowDPR();
|
||||
const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;
|
||||
const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);
|
||||
const dprChanged = dprNew !== dpr && dprNew > 0;
|
||||
const isZoom = deltaIsBigger && difference && dprChanged;
|
||||
|
||||
ruleStyle.width = arrangeSize.w;
|
||||
ruleStyle.height = arrangeSize.h;
|
||||
}
|
||||
if (isZoom) {
|
||||
const [scrollbarSize, scrollbarSizeChanged] = updateNativeScrollbarSizeCache();
|
||||
|
||||
assignDeep(envInstance._nativeScrollbarsSize, scrollbarSize); // keep the object same!
|
||||
|
||||
if (scrollbarSizeChanged) {
|
||||
triggerEvent();
|
||||
}
|
||||
} else {
|
||||
style<'--os-vaw' | '--os-vah'>(viewport, {
|
||||
'--os-vaw': arrangeSize.w,
|
||||
'--os-vah': arrangeSize.h,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return doViewportArrange;
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes all styles applied because of the viewport arrange strategy.
|
||||
* @param showNativeOverlaidScrollbars Whether native overlaid scrollbars are shown instead of hidden.
|
||||
* @param directionIsRTL Whether the direction is RTL or not.
|
||||
* @param viewportOverflowState The currentviewport overflow state or undefined if it has to be determined.
|
||||
* @returns A object with a function which applies all the removed styles and the determined viewport vverflow state.
|
||||
*/
|
||||
const undoViewportArrange: UndoArrangeViewport = (
|
||||
showNativeOverlaidScrollbars,
|
||||
directionIsRTL,
|
||||
viewportOverflowState?
|
||||
) => {
|
||||
if (doViewportArrange) {
|
||||
const finalViewportOverflowState =
|
||||
viewportOverflowState || getViewportOverflowState(showNativeOverlaidScrollbars);
|
||||
const { _viewportPaddingStyle: viewportPaddingStyle } = getState();
|
||||
const { _scrollbarsHideOffsetArrange } = finalViewportOverflowState;
|
||||
const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;
|
||||
const finalPaddingStyle: StyleObject = {};
|
||||
const assignProps = (props: string) =>
|
||||
each(props.split(' '), (prop) => {
|
||||
finalPaddingStyle[prop] = viewportPaddingStyle[prop];
|
||||
});
|
||||
|
||||
if (arrangeX) {
|
||||
assignProps('marginBottom paddingTop paddingBottom');
|
||||
}
|
||||
|
||||
if (arrangeY) {
|
||||
assignProps('marginLeft marginRight paddingLeft paddingRight');
|
||||
}
|
||||
|
||||
const prevStyle = style(viewport, keys(finalPaddingStyle));
|
||||
|
||||
removeClass(viewport, classNameViewportArrange);
|
||||
|
||||
if (!flexboxGlue) {
|
||||
finalPaddingStyle.height = '';
|
||||
}
|
||||
|
||||
style(viewport, finalPaddingStyle);
|
||||
|
||||
return [
|
||||
() => {
|
||||
hideNativeScrollbars(
|
||||
finalViewportOverflowState,
|
||||
directionIsRTL,
|
||||
doViewportArrange,
|
||||
prevStyle
|
||||
);
|
||||
style(viewport, prevStyle);
|
||||
addClass(viewport, classNameViewportArrange);
|
||||
},
|
||||
finalViewportOverflowState,
|
||||
];
|
||||
}
|
||||
return [noop];
|
||||
};
|
||||
|
||||
return [arrangeViewport, undoViewportArrange];
|
||||
size = sizeNew;
|
||||
dpr = dprNew;
|
||||
};
|
||||
},
|
||||
},
|
||||
_envWindowZoom: () => {
|
||||
let size = { w: 0, h: 0 };
|
||||
let dpr = 0;
|
||||
|
||||
return (envInstance, updateNativeScrollbarSizeCache, triggerEvent) => {
|
||||
const sizeNew = windowSize();
|
||||
const deltaSize = {
|
||||
w: sizeNew.w - size.w,
|
||||
h: sizeNew.h - size.h,
|
||||
};
|
||||
|
||||
if (deltaSize.w === 0 && deltaSize.h === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const deltaAbsSize = {
|
||||
w: abs(deltaSize.w),
|
||||
h: abs(deltaSize.h),
|
||||
};
|
||||
const deltaAbsRatio = {
|
||||
w: abs(round(sizeNew.w / (size.w / 100.0))),
|
||||
h: abs(round(sizeNew.h / (size.h / 100.0))),
|
||||
};
|
||||
const dprNew = getWindowDPR();
|
||||
const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;
|
||||
const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);
|
||||
const dprChanged = dprNew !== dpr && dprNew > 0;
|
||||
const isZoom = deltaIsBigger && difference && dprChanged;
|
||||
|
||||
if (isZoom) {
|
||||
const [scrollbarSize, scrollbarSizeChanged] = updateNativeScrollbarSizeCache();
|
||||
|
||||
assignDeep(envInstance._nativeScrollbarsSize, scrollbarSize); // keep the object same!
|
||||
|
||||
if (scrollbarSizeChanged) {
|
||||
triggerEvent();
|
||||
}
|
||||
}
|
||||
|
||||
size = sizeNew;
|
||||
dpr = dprNew;
|
||||
};
|
||||
},
|
||||
},
|
||||
};
|
||||
}))();
|
||||
|
||||
@@ -32,7 +32,7 @@ const scrollAmount = 3333333;
|
||||
const scrollEventName = 'scroll';
|
||||
export const sizeObserverPluginName = '__osSizeObserverPlugin';
|
||||
|
||||
export const sizeObserverPlugin: Plugin<SizeObserverPluginInstance> = {
|
||||
export const sizeObserverPlugin: Plugin<SizeObserverPluginInstance> = /* @__PURE__ */ (() => ({
|
||||
[sizeObserverPluginName]: {
|
||||
_: (listenerElement, onSizeChangedCallback, observeAppearChange) => {
|
||||
const observerElementChildren = createDOM(
|
||||
@@ -96,4 +96,4 @@ export const sizeObserverPlugin: Plugin<SizeObserverPluginInstance> = {
|
||||
return [observeAppearChange ? onScroll.bind(0, false) : reset, offListeners];
|
||||
},
|
||||
},
|
||||
};
|
||||
}))();
|
||||
|
||||
@@ -225,6 +225,7 @@ html.os-viewport-scrollbar-hidden::-webkit-scrollbar-corner,
|
||||
html.os-viewport-scrollbar-hidden,
|
||||
html.os-viewport-scrollbar-hidden > body[data-overlayscrollbars] {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"sources":["../stdin","../../src/styles/sizeobserver.scss","../overlayscrollbars.css","../../src/styles/trinsicobserver.scss","../../src/styles/structure.scss","../../src/styles/scrollbars.scss"],"names":[],"mappings":"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","file":"overlayscrollbars.css"}
|
||||
{"version":3,"sources":["../stdin","../../src/styles/sizeobserver.scss","../overlayscrollbars.css","../../src/styles/trinsicobserver.scss","../../src/styles/structure.scss","../../src/styles/scrollbars.scss"],"names":[],"mappings":"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","file":"overlayscrollbars.css"}
|
||||
File diff suppressed because one or more lines are too long
+1
-1
@@ -5,7 +5,7 @@ describe('options', () => {
|
||||
expect(defaultOptions).toEqual({
|
||||
paddingAbsolute: false,
|
||||
showNativeOverlaidScrollbars: false,
|
||||
updating: {
|
||||
update: {
|
||||
elementEvents: [['img', 'load']],
|
||||
debounce: [0, 33],
|
||||
attributes: null,
|
||||
@@ -0,0 +1,148 @@
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import { rollup } from 'rollup';
|
||||
import { webpack } from 'webpack';
|
||||
import { build } from 'esbuild';
|
||||
import { terser } from 'rollup-plugin-terser';
|
||||
|
||||
import pkg from '../../package.json';
|
||||
import rollupConfig from '../../rollup.config';
|
||||
|
||||
const cleanBundle = true;
|
||||
const cleanFixture = true;
|
||||
const expectedBundleDiff = 1800;
|
||||
|
||||
const normalizePath = (pathName) =>
|
||||
pathName ? pathName.split(path.sep).join(path.posix.sep) : pathName;
|
||||
|
||||
const fixturesDir = path.join(__dirname, '.fixtures');
|
||||
const libraryFixturePath = normalizePath(path.join(fixturesDir, 'lib.js'));
|
||||
const unshakedFixturePath = normalizePath(path.join(fixturesDir, 'unshaked.js'));
|
||||
const shakedFixturePath = normalizePath(path.join(fixturesDir, 'shaked.js'));
|
||||
|
||||
const unshakedFixtureContent = `
|
||||
export * as os from '${libraryFixturePath}';
|
||||
`;
|
||||
|
||||
const shakedFixtureContent = `
|
||||
export { OverlayScrollbars } from '${libraryFixturePath}';
|
||||
`;
|
||||
|
||||
const bundleFunctions = {
|
||||
webpack: async (input, output) => {
|
||||
const outputPath = path.dirname(output);
|
||||
const outputfilename = path.basename(output);
|
||||
const compiler = webpack({
|
||||
mode: 'production',
|
||||
entry: input,
|
||||
output: {
|
||||
path: outputPath,
|
||||
filename: outputfilename,
|
||||
library: 'treeshaking',
|
||||
},
|
||||
optimization: {
|
||||
minimize: true,
|
||||
},
|
||||
});
|
||||
|
||||
const result = await new Promise((resolve, reject) => {
|
||||
compiler.run((err, res) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
resolve(res);
|
||||
});
|
||||
});
|
||||
|
||||
return result.compilation.assetsInfo.get(outputfilename).size;
|
||||
},
|
||||
rollup: async (input, output) => {
|
||||
const config = {
|
||||
input,
|
||||
output: {
|
||||
format: 'iife',
|
||||
name: 'treeshaking',
|
||||
file: output,
|
||||
plugins: [terser()],
|
||||
},
|
||||
};
|
||||
const bundle = await rollup(config);
|
||||
await bundle.write(config.output);
|
||||
|
||||
return fs.statSync(config.output.file).size;
|
||||
},
|
||||
esbuild: async (input, output) => {
|
||||
await build({
|
||||
entryPoints: [input],
|
||||
outfile: output,
|
||||
format: 'iife',
|
||||
globalName: 'treeshaking',
|
||||
bundle: true,
|
||||
minify: true,
|
||||
treeShaking: true,
|
||||
});
|
||||
|
||||
return fs.statSync(output).size;
|
||||
},
|
||||
};
|
||||
|
||||
const testBundler = (bundlerName) => async () => {
|
||||
const bundleFunction = bundleFunctions[bundlerName];
|
||||
const outputDir = path.join(__dirname, `.${bundlerName}`);
|
||||
const unshaked = await bundleFunction(unshakedFixturePath, path.join(outputDir, 'unshaked.js'));
|
||||
const shaked = await bundleFunction(shakedFixturePath, path.join(outputDir, 'shaked.js'));
|
||||
|
||||
cleanBundle && fs.rmSync(outputDir, { recursive: true });
|
||||
|
||||
console.info(`${bundlerName} size`, {
|
||||
unshaked,
|
||||
shaked,
|
||||
diff: unshaked - shaked,
|
||||
});
|
||||
|
||||
expect(unshaked - shaked).toBeGreaterThan(expectedBundleDiff);
|
||||
};
|
||||
|
||||
describe('tree shaking', () => {
|
||||
// build the fixture
|
||||
beforeAll(async () => {
|
||||
const { module } = pkg;
|
||||
const esmEntryFilename = path.basename(module);
|
||||
const config = rollupConfig.find((inputConfig) => {
|
||||
const { output } = inputConfig;
|
||||
if (output) {
|
||||
const outputArr = Array.isArray(output) ? output : [output];
|
||||
const outputConfig = outputArr.find(({ file }) => path.basename(file) === esmEntryFilename);
|
||||
if (outputConfig) {
|
||||
inputConfig.output = outputConfig;
|
||||
inputConfig.output.sourcemap = false;
|
||||
inputConfig.output.file = libraryFixturePath;
|
||||
inputConfig.plugins = inputConfig.plugins.filter((plugin) => plugin.name !== 'PROJECT');
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
const bundle = await rollup(config);
|
||||
await bundle.write(config.output);
|
||||
|
||||
if (!fs.existsSync(fixturesDir)) {
|
||||
fs.mkdirSync(fixturesDir);
|
||||
}
|
||||
|
||||
fs.writeFileSync(unshakedFixturePath, unshakedFixtureContent);
|
||||
fs.writeFileSync(shakedFixturePath, shakedFixtureContent);
|
||||
}, 60000 * 2);
|
||||
|
||||
// clean the fixture
|
||||
afterAll(() => {
|
||||
cleanFixture && fs.rmSync(fixturesDir, { recursive: true });
|
||||
});
|
||||
|
||||
test('webpack', testBundler('webpack'), 60000);
|
||||
|
||||
test('rollup', testBundler('rollup'), 60000);
|
||||
|
||||
test('esbuild', testBundler('esbuild'), 60000);
|
||||
});
|
||||
Reference in New Issue
Block a user