Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
99 lines
3.0 KiB
JavaScript
99 lines
3.0 KiB
JavaScript
"use strict";
|
|
|
|
const assert = require("node:assert/strict");
|
|
|
|
/*
|
|
When using zjquery, the first call to $("#foo")
|
|
returns a new instance of the FakeJQuery pseudoclass,
|
|
and then subsequent calls to $("#foo") get the
|
|
same instance.
|
|
*/
|
|
const {default_element, FakeJQuery} = require("./zjquery_element.cjs");
|
|
const FakeEvent = require("./zjquery_event.cjs");
|
|
|
|
function verify_selector_for_zulip(selector) {
|
|
const is_valid =
|
|
"<#.".includes(selector[0]) ||
|
|
selector === "window-stub" ||
|
|
selector === "document-stub" ||
|
|
selector === "body" ||
|
|
selector === "html" ||
|
|
selector === ":root" ||
|
|
selector.location ||
|
|
selector.includes("#") ||
|
|
selector.includes(".") ||
|
|
(selector.includes("[") && selector.indexOf("]") >= selector.indexOf("["));
|
|
|
|
assert.ok(
|
|
is_valid,
|
|
// Check if selector has only english alphabets and space.
|
|
// Then, the user is probably trying to use a tag as a selector
|
|
// like $('div a').
|
|
/^[ A-Za-z]+$/.test(selector)
|
|
? "Selector too broad! Use id, class or attributes of target instead."
|
|
: `Invalid selector: ${selector}. Use $.create() maybe?`,
|
|
);
|
|
}
|
|
|
|
function make_zjquery() {
|
|
const results = new Map();
|
|
|
|
const zjquery = function (arg, arg2) {
|
|
assert.ok(typeof arg !== "function", "zjquery does not support $(callback)");
|
|
|
|
// We occasionally create stub objects that know
|
|
// they want to be wrapped by jQuery (so they can
|
|
// in turn return stubs). The convention is that
|
|
// they provide a to_$ attribute.
|
|
if (typeof arg === "object" && "to_$" in arg) {
|
|
assert.equal(typeof arg.to_$, "function");
|
|
return arg.to_$();
|
|
}
|
|
|
|
assert.equal(
|
|
arg2,
|
|
undefined,
|
|
"We only use one-argument variations of $(...) in Zulip code.",
|
|
);
|
|
|
|
const selector = arg;
|
|
|
|
/* istanbul ignore if */
|
|
if (typeof selector !== "string") {
|
|
console.info(arg);
|
|
throw new Error("zjquery does not know how to wrap this object yet");
|
|
}
|
|
|
|
verify_selector_for_zulip(selector);
|
|
|
|
if (!results.has(selector)) {
|
|
results.set(selector, [default_element(selector)]);
|
|
}
|
|
return new FakeJQuery(results.get(selector));
|
|
};
|
|
|
|
zjquery.create = function (selector, opts) {
|
|
assert.ok(!results.has(selector), "You already created an object with this name!!");
|
|
const elements = opts?.elements ?? [default_element(selector)];
|
|
results.set(selector, elements);
|
|
|
|
return new FakeJQuery(elements);
|
|
};
|
|
|
|
zjquery.set_results = (selector, elements) => zjquery.create(selector, {elements});
|
|
|
|
zjquery.Event = FakeEvent;
|
|
|
|
zjquery.reset_selector = (selector) => {
|
|
results.delete(selector);
|
|
};
|
|
|
|
zjquery.clear_all_elements = function () {
|
|
results.clear();
|
|
};
|
|
|
|
return zjquery;
|
|
}
|
|
|
|
exports.$ = Object.freeze(make_zjquery());
|