add treeshaking tests

This commit is contained in:
Rene Haas
2022-08-10 02:09:20 +02:00
parent 35d4d908f4
commit 641449ac82
44 changed files with 1187 additions and 243 deletions
+4 -2
View File
@@ -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,
},
},
});
@@ -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 };
},
},
},
};
}))();
@@ -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":"AAAA;;;;;;;;EAAA;ACKA;;EAEE,kBAAA;EACA,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,sBAAA;ACKF;;ADFA;;;;EAIE,2BAAA;EACA,kBAAA;EACA,OAAA;EACA,MAAA;ACKF;;ADFA;EACE,WAAA;EACA,eAAA;EACA,aAAA;EACA,mBAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;EACA,cAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,qBAAA;ACKF;ADHE;EACE,WAAA;EACA,UAAA;EACA,mBAAA;EACA,aAAA;EACA,WAAA;EACA,YAAA;ACKJ;;ADDA;EAEE,iEAAA;UAAA,yDAAA;ACGF;;ADAA;EACE,sBAAA;EACA,kBAAA;EACA,UAAA;EACA,gBAAA;EACA,eAAA;EACA,cAAA;EACA,oBAAA;ACGF;ADCE;EACE,oBAAA;EACA,cAAA;ACCJ;ADCE;EACE,mBAAA;EACA,eAAA;ACCJ;ADEE;EACE,WAAA;EACA,WAAA;EACA,YAAA;ACAJ;ADGE;EAEE,cAAA;EACA,kBAAA;EACA,gBAAA;EACA,eAAA;EACA,uBAAA;EACA,UAAA;ACFJ;;ADMA;EACE,sBAAA;EACA,aAAA;ACHF;;ADMA;EACE,QAAA;EACA,SAAA;EACA,gBAAA;EACA,cAAA;EACA,UAAA;ACHF;;ADMA;EACE,gBAAA;ACHF;;ADOA;EACE;IACE,YAAA;ECJF;EDMA;IACE,YAAA;ECJF;AACF;;ADFA;EACE;IACE,YAAA;ECJF;EDMA;IACE,YAAA;ECJF;AACF;AChHA;EACE,UAAA;EACA,sBAAA;EACA,kBAAA;EACA,cAAA;EACA,eAAA;EACA,UAAA;EACA,SAAA;EACA,YAAA;EACA,gBAAA;EACA,WAAA;EACA,SAAA;EACA,qBAAA;EACA,eAAA;ADkHF;AChHE;EACE,wBAAA;EACA,SAAA;ADkHJ;AChHI;EACE,YAAA;EACA,aAAA;EACA,eAAA;EACA,cAAA;ADkHN;;AEzIA;EACE,oBAAA;EACA,eAAA;EACA,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,aAAA;EACA,YAAA;EACA,8BAAA;AF4IF;AE1IE;EACE,WAAA;EACA,YAAA;EACA,cAAA;AF4IJ;AEzIE;EACE,aAAA;EACA,mBAAA;EACA,iBAAA;EACA,YAAA;EACA,WAAA;EACA,iBAAA;EACA,gBAAA;AF2IJ;AEzII;EACE,UAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;EACA,eAAA;EACA,SAAA;AF2IN;AEvIE;EACE,iBAAA;AFyIJ;AEvII;EACE,iBAAA;AFyIN;AEvIM;EACE,WAAA;EACA,cAAA;EACA,aAAA;EACA,YAAA;AFyIR;;AEnIA;;EAEE,wCAAA;AFsIF;;AEpIA;;;;;EAKE,gCAAA;AFuIF;;AErIA;;;;;;;;;;EAUE,wBAAA;EACA,qBAAA;EACA,sBAAA;EACA,6BAAA;EACA,kCAAA;AFwIF;;AErIA;;EAEE,sBAAA;EACA,WAAA;EACA,YAAA;AFwIF;;AErIA;;EAEE,kBAAA;AFwIF;;AErIA;;EAEE,aAAA;EACA,8BAAA;EACA,4BAAA;AFwIF;;AErIA;;EAEE,mBAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,WAAA;EACA,UAAA;EACA,SAAA;EACA,YAAA;EACA,UAAA;AFwIF;;AErIA;EACE,WAAA;EACA,WAAA;AFwIF;AEtIE;EACE,WAAA;EACA,kBAAA;EACA,oBAAA;EACA,WAAA;EACA,cAAA;EACA,eAAA;EACA,oBAAA;EACA,qBAAA;AFwIJ;;AEpIA;;EAEE,2BAAA;AFuIF;;AErIA;EACE,4BAAA;AFwIF;;AEtIA;EACE,6BAAA;AFyIF;;AEvIA;EACE,6BAAA;AF0IF;;AExIA;EACE,6BAAA;AF2IF;;AEzIA;EACE,6BAAA;AF4IF;;AEzIA;;EAEE,gBAAA;AF4IF;;AEzIA;EACE,iBAAA;AF4IF;;AEzIA;EACE,mBAAA;AF4IF;;AGzSA;EACE,eAAA;EACA,uFAAA;EACA,oBAAA;EACA,kBAAA;EACA,cAAA;EACA,UAAA;EACA,kBAAA;AH4SF;;AG1SA;EACE,eAAA;AH6SF;;AG3SA;EACE,gBAAA;AH8SF;;AG5SA;EACE,kBAAA;EACA,yBAAA;EACA,qBAAA;EACA,uBAAA;AH+SF;;AG7SA;EACE,kBAAA;AHgTF;;AG9SA;;EAEE,oBAAA;EACA,WAAA;EACA,YAAA;AHiTF;;AG/SA;;EAEE,oBAAA;EACA,kBAAA;AHkTF;;AGhTA;EACE,SAAA;EACA,OAAA;AHmTF;;AGjTA;EACE,MAAA;EACA,QAAA;AHoTF;;AGlTA;EACE,QAAA;AHqTF;;AGnTA;EACE,WAAA;EACA,OAAA;AHsTF;;AGpTA;;EAEE,UAAA;EACA,mBAAA;AHuTF;;AGrTA;EACE,UAAA;EACA,kBAAA;AHwTF;;AGtTA;;;;EAIE,+BAAA;AHyTF;;AGvTA;EACE,qBAAA;AH0TF;;AGxTA;EACE,OAAA;EACA,QAAA;AH2TF;;AGzTA;EACE,MAAA;EACA,SAAA;AH4TF;;AGzTA,gBAAA;AACA;;EAEE,wBAAA;AH4TF;;AG1TA,wBAAA;AACA;;EAEE,WAAA;EACA,YAAA;AH6TF;;AG3TA;;EAEE,YAAA;EACA,WAAA;AH8TF;;AG5TA;;EAEE,UAAA;EACA,QAAA;AH+TF;;AG7TA;;EAEE,YAAA;EACA,sBAAA;EACA,uBAAA;AHgUF;;AG9TA;;EAEE,uBAAA;AHiUF;;AG/TA;;EAEE,uBAAA;AHkUF;;AGhUA;;EAEE,eAAA;AHmUF;;AGjUA;;EAEE,gBAAA;AHoUF;;AGlUA;;EAEE,iCAAA;AHqUF;;AGnUA;;;;EAIE,mBAAA;AHsUF;;AGpUA;EACE,8BAAA;AHuUF;;AGrUA;EACE,oCAAA;AHwUF;;AGtUA;EACE,+BAAA;AHyUF;;AGvUA;EACE,qCAAA;AH0UF;;AGxUA;EACE,8BAAA;AH2UF;;AGzUA;EACE,oCAAA;AH4UF;;AG1UA;;;;EAIE,WAAA;EACA,kBAAA;EACA,OAAA;EACA,QAAA;EACA,MAAA;EACA,SAAA;EACA,cAAA;AH6UF;;AG3UA;EACE,aAAA;AH8UF;;AG5UA;;EAEE,SAAA;EACA,YAAA;AH+UF;;AG7UA;;EAEE,UAAA;EACA,WAAA;AHgVF;;AG9UA;;EAEE,WAAA;EACA,UAAA;AHiVF","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
@@ -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);
});