import { expectDeprecated, expectError, expectType } from "tsd";
import "../lib/stackexchange";
// helpers
const $modal = $("
pretend modal
");
const { helpers } = StackExchange;
expectDeprecated(helpers.bindMovablePopups);
expectDeprecated(helpers.showErrorPopup);
// most examples are from SE's JS
const message = "message";
const element = $("#el");
expectType(helpers.addLightbox().data("_popup", "value"));
expectType(
helpers.bindOnHashChange_HighlightDestination(
function (commentId, postId) {
expectType(commentId);
expectType(postId);
},
function (postId) {
expectType(postId);
}
)
);
expectType([
helpers.showMessage(
element,
message,
{
type: 'info',
position: { my: 'left top', at: 'right center' },
css: { 'margin-left': '-10px' }
}
),
helpers.showMessage(
element,
message,
{
type: "info",
position: { my: "left top", at: "right center" },
relativeToBody: true
}
),
helpers.showMessage(
element,
null,
{
messageElement: element,
type: 'config',
relativeToBody: true,
position: { my: 'top center', at: 'bottom center', offsetTop: -10, offsetLeft: 60 },
fixedTo$elem: true
}
),
helpers.showErrorMessage(element, message , { transient: true }),
helpers.showErrorMessage(element, message),
helpers.showInfoMessage(
element,
message,
{
position: {
at: "right top",
my: "left bottom"
},
cssClass: "convert-image-to-link"
}
),
]);
expectType([
helpers.suggestedTransientTimeout(message, true),
helpers.suggestedTransientTimeout(message, false),
helpers.suggestedTransientTimeout(message),
]);
expectType([
helpers.showBannerMessage(message, "error"),
helpers.showBannerMessage(message, "info"),
helpers.showBannerMessage(message, "success"),
helpers.showBannerMessage(message, "warning"),
]);
expectError(helpers.showBannerMessage(message, "danger"));
expectType([
helpers.showStacksNotice(message, "danger"),
helpers.showStacksNotice(message, "info"),
helpers.showStacksNotice(message, "success"),
helpers.showStacksNotice(message, "warning"),
helpers.showStacksNotice(message, "warning", {
transient: true,
transientTimeout: 5000,
}),
]);
expectError(helpers.showStacksNotice(message, "error"));
expectType([
helpers.showModal(
$modal,
{
returnElements: element,
shown: function () { },
closeOthers: true,
}
),
helpers.showModal($modal),
helpers.showModal(document.createElement("div")),
helpers.showModal(null),
]);
expectError(helpers.showModal());
expectType(helpers.removeMessages());
expectType(helpers.removeMessages(true));
expectType([
await helpers.loadModal("/url"),
await helpers.loadModal(
"url",
{ returnElements: element }
),
]);
expectType([
helpers.toggleStacksPopover(element),
helpers.toggleStacksPopover(element, true),
helpers.toggleStacksPopover(element, false),
helpers.queueStacksPopover(element),
helpers.queueStacksPopover(element, 100)
]);
expectType(helpers.htmlEncode("string"));
expectError(helpers.htmlEncode());
expectType([
helpers.showToast(message),
helpers.showToast(
message,
{
actions: [{ labelContents: element }],
transient: false,
type: "danger"
}
),
helpers.showToast(
message,
{
type: "success",
transient: true,
transientTimeout: 3000,
actions: [{
labelContents: "...",
click: function () { }
}],
$parent: element,
useRawHtml: true
}
),
]);
expectError(helpers.showToast());
expectError(helpers.showToast(message, { type: "error" }));
expectType(helpers.hideToasts());
expectType([
helpers.addSpinner(element),
helpers.addSpinner(
element,
{
"margin-left": "10px"
}
),
helpers.addStacksSpinner(element),
helpers.addStacksSpinner(element, "lg", "fc-orange-400 ml16 mt12")
]);
expectType(helpers.getSpinnerImg());
expectType(
helpers.getSpinnerImg(
{
position: "fixed",
color: "#abcdef",
"margin-left": "10px",
}
)
);
expectType(helpers.removeSpinner());
expectType([
helpers.closePopups("selector"),
helpers.closePopups(element, "dismiss")
]);
expectError(helpers.closePopups());
// with selector being jQuery
expectType(helpers.enableSubmitButton(element));
expectType(helpers.disableSubmitButton(element));
// with selector being string
expectType(helpers.enableSubmitButton("selector"));
expectType(helpers.disableSubmitButton("selector"));
// without first parameter
expectError(helpers.enableSubmitButton());
expectError(helpers.disableSubmitButton());
expectType(helpers.loadTicks());
expectType(helpers.loadTicks(element));
expectType([
helpers.showFancyOverlay({ message }),
helpers.showFancyOverlay(
{
message,
showClose: true,
complete: () => { },
}
),
]);
expectError(helpers.showFancyOverlay({}));
const exampleFn = (str: string) => console.log(str);
const delayed = helpers.DelayedReaction(exampleFn, 100, { sliding: true });
expectType(delayed.trigger("string"));
expectType(delayed.cancel());
expectType<() => void>(delayed.cancel);
expectType<(...args: any[]) => void>(delayed.trigger);
expectType(helpers.fireAndForget("url"));
expectError(helpers.fireAndForget());
expectType(
helpers.updateQueryStringParameter(
"https://stackoverflow/questions",
"tab",
"hot"
)
);
expectType(helpers.removeParameterFromQueryString("goodbye"));
// errors:
expectError(helpers.removeParameterFromQueryString());
expectError(helpers.updateQueryStringParameter());
expectError(helpers.updateQueryStringParameter("s1"));
expectError(helpers.updateQueryStringParameter("s1", false, {}));
expectType(helpers.parseUrl("https://example.com"));
expectError(helpers.parseUrl());
expectType(helpers.isEmailAddress("example@gmail.com"));
expectError(helpers.isEmailAddress());
expectType(helpers.submitFormOnEnterPress(element));
expectError(helpers.submitFormOnEnterPress());
expectType(helpers.isInNetwork("stackoverflow.com"));
expectError(helpers.isInNetwork());
expectType(helpers.placeCaretAtEnd(element[0]));
expectError(helpers.placeCaretAtEnd());
expectType(helpers.hasContentEditable(element));
expectType(helpers.hasContentEditable(element[0]));
expectError(helpers.hasContentEditable());
expectType(
helpers.copyTextToClipboard(
message,
{
actions: [{ labelContents: element }],
transientTimeout: 5000,
})
);
expectError(helpers.copyTextToClipboard());
expectType(helpers.encodeHexHtmlEntities("nonsense"));
expectError(helpers.encodeHexHtmlEntities());
expectType([
await helpers.showConfirmModal({
title: "Are you sure you want to rollback?",
body: message,
buttonLabel: "Rollback",
returnElements: element,
}),
await helpers.showConfirmModal({
title: "Nominate this question for reopening?",
bodyHtml: "blah blah",
buttonLabel: "Vote to reopen"
}),
]);
expectError(await helpers.showConfirmModal());
expectType([
helpers.MagicPopup(
{
selector: ".post-tag:not(.user-tag,.no-tag-menu,.invalid-tag,.job-link)",
className: "tag-group",
getUrl: element => {
expectType(element);
return "/url";
},
showing: (element, jMenu) => {
expectType(element);
expectType(jMenu);
return {
top: 15,
bottom: 15,
};
},
fade: true,
unclipped: true,
renderInline: true,
}
),
helpers.MagicPopup(
{
selector: ".user-hover .user-gravatar48, .user-hover .user-gravatar32, .js-user-hover-target",
predicate: element => {
expectType(element);
},
getUrl: () => "string",
cache: true,
id: "user-menu",
showing: () => {
return {
top: 15,
left: 16,
additional: element.clone()
};
},
shown: (element, jMenu) => {
expectType(element);
expectType(jMenu);
},
removed: (element, jMenu) => {
expectType(element);
expectType(jMenu);
},
renderInline: true
}
),
]);
expectType(helpers.noDiacritics("nonsense"));
expectError(helpers.noDiacritics());
expectType(helpers.tagSeparator("javascript|typescript"));
expectError(helpers.tagSeparator());
expectType(helpers.sanitizeAndSplitTags(element.text(), true, false));
expectError(helpers.sanitizeAndSplitTags());
// don't care about the types returned
// these should just avoid any errors
helpers.toggleUserFlags(0, true);
helpers.toggleUserFlags(0, false);
helpers.toggleAccountPreferenceFlags(0, true);
helpers.toggleAccountPreferenceFlags(0, false);
expectError(helpers.toggleUserFlags(0));
expectError(helpers.toggleAccountPreferenceFlags(0));
// end .helpers
expectType(StackExchange.question.getQuestionId());
expectType(StackExchange.question.canViewVoteCounts());
expectError(StackExchange.question.scrollToPost());
expectType(StackExchange.question.scrollToPost(123456));
expectType(StackExchange.ready(() => 42));
expectType(StackExchange.gaReady(() => console.log("loaded")));
expectError(StackExchange.ready());
expectError(StackExchange.gaReady());
const { settings } = StackExchange;
expectType(settings.accounts);
expectType(settings.flags);
expectType(StackExchange.settings.image.maxImageUploadSizeInBytes);
expectType(settings.markdown);
expectType(settings.site);
const { realtime } = StackExchange;
expectType(realtime.pauseQuestionNotifications);
expectType(realtime.debug("message"));
expectType(realtime.genericSubscribe("event", () => void 0));
expectError(realtime.reloadPosts(["1234", "32"]));