summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/utils/build-query.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/src/utils/build-query.js')
-rw-r--r--devtools/client/debugger/src/utils/build-query.js75
1 files changed, 75 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/utils/build-query.js b/devtools/client/debugger/src/utils/build-query.js
new file mode 100644
index 0000000000..9ad4789602
--- /dev/null
+++ b/devtools/client/debugger/src/utils/build-query.js
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// @flow
+import escapeRegExp from "lodash/escapeRegExp";
+
+import type { SearchModifiers } from "../types";
+
+type QueryOptions = {
+ isGlobal?: boolean,
+ ignoreSpaces?: boolean,
+};
+
+/**
+ * Ignore doing outline matches for less than 3 whitespaces
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function ignoreWhiteSpace(str: string): string {
+ return /^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str;
+}
+
+function wholeMatch(query: string, wholeWord: boolean): string {
+ if (query === "" || !wholeWord) {
+ return query;
+ }
+
+ return `\\b${query}\\b`;
+}
+
+function buildFlags(caseSensitive: boolean, isGlobal: boolean): ?RegExp$flags {
+ if (caseSensitive && isGlobal) {
+ return "g";
+ }
+
+ if (!caseSensitive && isGlobal) {
+ return "gi";
+ }
+
+ if (!caseSensitive && !isGlobal) {
+ return "i";
+ }
+}
+
+export default function buildQuery(
+ originalQuery: string,
+ modifiers: SearchModifiers,
+ { isGlobal = false, ignoreSpaces = false }: QueryOptions
+): RegExp {
+ const { caseSensitive, regexMatch, wholeWord } = modifiers;
+
+ if (originalQuery === "") {
+ return new RegExp(originalQuery);
+ }
+
+ let query = originalQuery;
+ if (ignoreSpaces) {
+ query = ignoreWhiteSpace(query);
+ }
+
+ if (!regexMatch) {
+ query = escapeRegExp(query);
+ }
+
+ query = wholeMatch(query, wholeWord);
+ const flags = buildFlags(caseSensitive, isGlobal);
+
+ if (flags) {
+ return new RegExp(query, flags);
+ }
+
+ return new RegExp(query);
+}