Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add Flow types to Popper.js #602

Merged
merged 3 commits into from Apr 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
142 changes: 142 additions & 0 deletions packages/popper/index.js.flow
@@ -0,0 +1,142 @@
declare module 'popper.js' {
declare type Position = 'top' | 'right' | 'bottom' | 'left';
declare type Placement =
| 'auto-start'
| 'auto'
| 'auto-end'
| 'top-start'
| 'top'
| 'top-end'
| 'right-start'
| 'right'
| 'right-end'
| 'bottom-end'
| 'bottom'
| 'bottom-start'
| 'left-end'
| 'left'
| 'left-start';

declare type Offset = {
top: number,
left: number,
width: number,
height: number,
position: Position,
};

declare type Boundary = 'scrollParent' | 'viewport' | 'window';

declare type Behavior = 'flip' | 'clockwise' | 'counterclockwise';

declare type Data = {
instance: Popper,
placement: Placement,
originalPlacement: Placement,
flipped: boolean,
hide: boolean,
arrowElement: Element,
styles: CSSStyleDeclaration,
arrowStyles: CSSStyleDeclaration,
boundaries: Object,
offsets: {
popper: Offset,
reference: Offset,
arrow: {
top: number,
left: number,
},
},
};

declare type ModifierFn = (data: Data, options: Object) => Data;

declare type BaseModifier = {
order?: number,
enabled?: boolean,
fn?: ModifierFn,
};

declare type Modifiers = {
shift?: BaseModifier,
offset?: BaseModifier & {
offset?: number | string,
},
preventOverflow?: BaseModifier & {
priority?: Position[],
padding?: number,
boundariesElement?: Boundary | Element,
escapeWithReference?: boolean,
},
keepTogether?: BaseModifier,
arrow?: BaseModifier & {
element?: string | Element | null,
},
flip?: BaseModifier & {
behavior?: Behavior | Position[],
padding?: number,
boundariesElement?: Boundary | Element,
},
inner?: BaseModifier,
hide?: BaseModifier,
applyStyle?: BaseModifier & {
onLoad?: Function,
gpuAcceleration?: boolean,
},
computeStyle?: BaseModifier & {
gpuAcceleration?: boolean,
x?: 'bottom' | 'top',
y?: 'left' | 'right',
},

[name: string]: (BaseModifier & { [string]: * }) | null,
};

declare type Options = {
placement?: Placement,
positionFixed?: boolean,
eventsEnabled?: boolean,
modifiers?: Modifiers,
removeOnDestroy?: boolean,

onCreate?: (data: Data) => void,

onUpdate?: (data: Data) => void,
};

declare var placements: Placement;

declare type ReferenceObject = {
+clientHeight: number,
+clientWidth: number,

getBoundingClientRect():
| ClientRect
| {
width: number,
height: number,
top: number,
right: number,
bottom: number,
left: number,
},
};

declare type Instance = {
destroy: () => void,
scheduleUpdate: () => void,
update: () => void,
};

declare class Popper {
static placements: Placement;

constructor(
reference: Element | ReferenceObject,
popper: Element,
options?: Options
): Instance;
}

declare module.exports: Class<Popper>;
}
2 changes: 1 addition & 1 deletion packages/popper/package.json
Expand Up @@ -32,7 +32,7 @@
"postpublish": "nuget-publish && ./bower-publish.sh",
"prebuild": "yarn lint",
"pretest": "yarn lint",
"build": "node bundle.js",
"build": "node bundle.js && cp index.js.flow dist/esm/poppper.js.flow",
"lint": "eslint .",
"test": "popper-karma",
"posttest": "tsc --project tests/types/tsconfig.json",
Expand Down
25 changes: 17 additions & 8 deletions packages/tooltip/tests/functional/tooltip.js
Expand Up @@ -4,6 +4,7 @@ import then from '@popperjs/test-utils/utils/then.js';
import '@popperjs/test-utils/utils/customEventPolyfill.js';

const jasmineWrapper = document.getElementById('jasmineWrapper');
const isIE10 = navigator.appVersion.indexOf('MSIE 10') !== -1;

let reference;
let instance;
Expand Down Expand Up @@ -299,7 +300,7 @@ describe('[tooltip.js]', () => {
document.querySelector('.tooltip .tooltip-inner').textContent
).toBe(updatedContent);
done();
})
});
});

it('should update title content with HTMLElement', done => {
Expand All @@ -316,31 +317,39 @@ describe('[tooltip.js]', () => {
instance.updateTitleContent(el);

then(() => {
expect(
document.querySelector('.tooltip-inner').innerHTML
).toBe(el.outerHTML);
expect(document.querySelector('.tooltip-inner').innerHTML).toBe(
el.outerHTML
);
done();
})
});
});

it('should update the tooltip position when changing the title', done => {
// Unreliable on IE...
if (isIE10) {
pending();
}
const updatedContent = 'Updated string with a different length';
instance = new Tooltip(reference, {
title: 'Constructor message',
});

instance.show();

const oldPosition = document.querySelector('.tooltip .tooltip-inner').getBoundingClientRect().left
const oldPosition = document
.querySelector('.tooltip .tooltip-inner')
.getBoundingClientRect().left;

instance.updateTitleContent(updatedContent);

then(() => {
expect(
document.querySelector('.tooltip .tooltip-inner').getBoundingClientRect().left
document
.querySelector('.tooltip .tooltip-inner')
.getBoundingClientRect().left
).not.toBe(oldPosition);
done();
}, 500)
}, 500);
});
});

Expand Down