diff --git a/.eleventy.js b/.eleventy.js
index 75e74242..f61bdf13 100644
--- a/.eleventy.js
+++ b/.eleventy.js
@@ -9,7 +9,6 @@ const markdownItAnchor = require("markdown-it-anchor");
const yaml = require("js-yaml");
const { sassPlugin } = require("esbuild-sass-plugin");
const svgSprite = require("eleventy-plugin-svg-sprite");
-const { imageShortcode, imageWithClassShortcode } = require("./config");
const {
isValidGitBranch,
isValidTwitterHandle,
@@ -20,6 +19,13 @@ const {
isValidVerificationToken,
uswdsIconWithSize,
numberWithCommas,
+ sortByProp,
+ readableDate,
+ getStateFromDates,
+ htmlDateString,
+ minNumber,
+ uswdsIcon,
+ imageWithClassShortcode,
} = require("./js/global.js");
require("dotenv").config();
@@ -90,6 +96,11 @@ module.exports = function (config) {
baseUrl = new URL(hosts.undefined).href.replace(/\/$/, "");
}
+ // If BASEURL env variable exists, update pathPrefix to the BASEURL
+ if (process.env.BASEURL) {
+ pathPrefix = process.env.BASEURL;
+ }
+
config.addGlobalData("baseUrl", baseUrl);
config.addGlobalData("site.baseUrl", baseUrl);
@@ -139,160 +150,15 @@ module.exports = function (config) {
);
}
- // Template function used to sort a collection by a certain property
- // Ex: {% assign sortedJobs = collection.jobs | sortByProp: "title" %}
- function sortByProp(values, prop) {
- let vals = [...values];
- return vals.sort((a, b) => {
- if (typeof a[prop] == "string" && typeof b[prop] == "string") {
- return a[prop].localeCompare(b[prop]);
- } else {
- return Math.sign(a[prop] - b[prop]);
- }
- });
- }
-
- // Get Date and Time as Seconds
- // Datetime format: YYYY-MM-DD HH:MM
- config.addLiquidShortcode("getDateTimeinSeconds", getDateTimeinSeconds);
- function getDateTimeinSeconds(datetime) {
- // Split the datetime string into date and time parts
- const dateParts = datetime.split(" ");
- const date = dateParts[0];
- const time = dateParts[1];
-
- // Extract hours, minutes, and AM/PM
- let hours = parseInt(time.slice(0, time.length - 2).split(":")[0], 10); // Adjusted to capture full hour
- const minutes = time.length === 6 ? time.slice(2, 4) : time.slice(3, 5);
- const amPm = time.slice(-2).toLowerCase(); // Handle AM/PM case
-
- // Convert hours to 24-hour format
- if (amPm === "pm" && hours !== 12) {
- hours += 12;
- } else if (amPm === "am" && hours === 12) {
- hours = 0;
- }
-
- // Format the datetime string for timestamp conversion
- const formattedDatetime = `${date} ${String(hours).padStart(2, "0")}:${minutes} ET`;
-
- // Convert to timestamp (in seconds)
- const timestamp = Math.floor(new Date(formattedDatetime).getTime() / 1000);
-
- return timestamp;
- }
-
- // Get State From Dates
- config.addLiquidShortcode("getStateFromDates", getStateFromDates);
- function getStateFromDates(opens, closes) {
- if (!opens && !closes) {
- return "unknown";
- }
-
- // Get the current date in "America/New_York" timezone
- let now_date = new Date(
- new Date().toLocaleString("en-US", { timeZone: "America/New_York" }),
- );
-
- // Parse the 'opens' date in UTC and convert to local time
- let opens_date = opens ? new Date(opens) : null;
-
- // Parse the 'closes' date in UTC and set time to 11:59:59 PM in local time
- let closes_date = null;
- if (closes) {
- closes_date = new Date(closes);
- // Set the time to 11:59:59 PM in local time
- closes_date.setHours(23, 59, 59, 999);
- }
-
- // Convert opens_date and closes_date to local time for comparison
- if (opens_date) {
- // Adjust opens_date to local timezone
- opens_date = new Date(
- opens_date.toLocaleString("en-US", { timeZone: "America/New_York" }),
- );
-
- // Adjust closes_date to local timezone
- if (closes_date) {
- closes_date = new Date(
- closes_date.toLocaleString("en-US", { timeZone: "America/New_York" }),
- );
- }
-
- // Check if it's open or closed
- let isOpen = now_date >= opens_date;
- let isClosed = closes_date && now_date > closes_date;
-
- if (isOpen && !isClosed) {
- return "open";
- } else if (isClosed) {
- return "closed";
- } else {
- return "upcoming";
- }
- }
-
- return "unknown"; // Default fallback if no conditions are met
- }
-
- config.addFilter("stateFromDates", getStateFromDates);
config.addFilter("sortByProp", sortByProp);
-
- config.addFilter("readableDate", (dateObj) => {
- return DateTime.fromJSDate(dateObj, { zone: "America/New_York" }).toFormat(
- "dd LLL yyyy",
- );
- });
-
- // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string
- config.addFilter("htmlDateString", (dateObj) => {
- if (dateObj !== undefined && dateObj !== null) {
- let dateTime = DateTime.fromJSDate(dateObj);
-
- // If working locally, add one day to the date to match what is in the actual environments.
- if (baseUrl.includes("localhost")) {
- dateTime = dateTime.plus({ days: 1 });
- return dateTime.toFormat("yyyy-LL-dd");
- } else {
- return dateTime.toFormat("yyyy-LL-dd");
- }
- }
- });
-
- // Get the first `n` elements of a collection.
- config.addFilter("head", (array, n) => {
- if (!Array.isArray(array) || array.length === 0) {
- return [];
- }
- if (n < 0) {
- return array.slice(n);
- }
-
- return array.slice(0, n);
- });
-
- // Return the smallest number argument
- config.addFilter("min", (...numbers) => {
- return Math.min.apply(null, numbers);
- });
-
- function filterTagList(tags) {
- return (tags || []).filter(
- (tag) => ["all", "nav", "post", "posts"].indexOf(tag) === -1,
- );
- }
-
- config.addFilter("filterTagList", filterTagList);
-
- // Create an array of all tags
- config.addCollection("tagList", function (collection) {
- let tagSet = new Set();
- collection.getAll().forEach((item) => {
- (item.data.tags || []).forEach((tag) => tagSet.add(tag));
- });
-
- return filterTagList([...tagSet]);
- });
+ config.addFilter("readableDate", readableDate);
+ config.addFilter("htmlDateString", htmlDateString);
+ config.addFilter("min", minNumber);
+ config.addFilter("numberWithCommas", numberWithCommas);
+ config.addLiquidShortcode("image_with_class", imageWithClassShortcode);
+ config.addLiquidShortcode("uswds_icon", uswdsIcon);
+ config.addLiquidShortcode("uswds_icon_with_size", uswdsIconWithSize);
+ config.addLiquidShortcode("getStateFromDates", getStateFromDates);
let markdownLibrary = markdownIt({
html: true,
@@ -331,25 +197,6 @@ module.exports = function (config) {
ghostMode: false,
});
- // Set image shortcodes
- config.addLiquidShortcode("image", imageShortcode);
- config.addLiquidShortcode("image_with_class", imageWithClassShortcode);
- config.addLiquidShortcode("uswds_icon", function (name) {
- return `
- `;
- });
-
- config.addLiquidShortcode("uswds_icon_with_size", uswdsIconWithSize);
-
- config.addFilter("numberWithCommas", numberWithCommas);
-
- // If BASEURL env variable exists, update pathPrefix to the BASEURL
- if (process.env.BASEURL) {
- pathPrefix = process.env.BASEURL;
- }
-
return {
dataTemplateEngine: "liquid",
diff --git a/README.md b/README.md
index 19e465f8..0aa801ba 100644
--- a/README.md
+++ b/README.md
@@ -65,13 +65,6 @@ See the [11ty docs](https://www.11ty.dev/docs/filters/url/)
All of your images will be stored in the `_img/` directory. To reference your
images in your templates you can use the `shortcodes` built into the template.
-For referencing an image without a style class, you will pass the template
-shortcode the image's source path and the alternative image name in that order, i.e.,
-
-```NJK
-{% image "_img/my-image.png" "My PNG Image Alternative Name" %}
-```
-
For referencing an image with a style class, you will pass the template
shortcode the image's source path, class names, and the alternative image name in
that order, i.e.,
@@ -80,6 +73,11 @@ that order, i.e.,
{% image_with_class "_img/my-image.png" "img-class another-class" "My PNG Image Alternative Name" %}
```
+If the image does not have a style class, simply pass an empty string, i.e.,
+```NJK
+{% image_with_class "_img/my-image.png" "" "My PNG Image Alternative Name" %}
+```
+
### Referencing USWDS Sprite Icons
USWDS has sprite icons available for use. Here is the
diff --git a/_includes/menu.html b/_includes/menu.html
index 05b66c1e..da086c1f 100644
--- a/_includes/menu.html
+++ b/_includes/menu.html
@@ -15,7 +15,7 @@
>
{% for nav_item in primary_navigation %}
diff --git a/_tests/getStateFromDates.js b/_tests/getStateFromDates.js
new file mode 100644
index 00000000..7c81e25b
--- /dev/null
+++ b/_tests/getStateFromDates.js
@@ -0,0 +1,50 @@
+const { getStateFromDates } = require("../js/global");
+
+describe("getStateFromDates", () => {
+ beforeEach(() => {
+ // Mock the system time to ensure consistent results
+ jest.useFakeTimers().setSystemTime(new Date("2024-11-21T12:00:00Z")); // Mock current time: 7 AM ET
+ });
+
+ afterEach(() => {
+ jest.useRealTimers(); // Restore real timers
+ });
+
+ test('should return "unknown" if both opens and closes are undefined', () => {
+ expect(getStateFromDates(null, null)).toBe("unknown");
+ expect(getStateFromDates(undefined, undefined)).toBe("unknown");
+ });
+
+ test('should return "upcoming" if now is before opens', () => {
+ const opens = "2024-11-22T00:00:00Z"; // Opens tomorrow at midnight UTC
+ expect(getStateFromDates(opens, null)).toBe("upcoming");
+ });
+
+ test('should return "open" if now is after opens and before closes', () => {
+ const opens = "2024-11-20T00:00:00Z"; // Opened yesterday at midnight UTC
+ const closes = "2024-11-22T00:00:00Z"; // Closes tomorrow at midnight UTC
+ expect(getStateFromDates(opens, closes)).toBe("open");
+ });
+
+ test('should return "closed" if now is after closes', () => {
+ const opens = "2024-11-19T00:00:00Z"; // Opened two days ago at midnight UTC
+ const closes = "2024-11-20T23:59:59Z"; // Closed yesterday at 11:59:59 PM UTC
+ expect(getStateFromDates(opens, closes)).toBe("closed");
+ });
+
+ test("should handle cases with only opens defined", () => {
+ const opens = "2024-11-20T00:00:00Z"; // Opened yesterday at midnight UTC
+ expect(getStateFromDates(opens, null)).toBe("open");
+ });
+
+ test("should handle cases with only closes defined", () => {
+ const closes = "2024-11-22T00:00:00Z"; // Closes tomorrow at midnight UTC
+ expect(getStateFromDates(null, closes)).toBe("unknown"); // No opens means "unknown"
+ });
+
+ test("should handle edge cases for opens and closes on the same day", () => {
+ const opens = "2024-11-21T00:00:00Z"; // Opens today at midnight UTC
+ const closes = "2024-11-21T23:59:59Z"; // Closes today at 11:59:59 PM UTC
+ expect(getStateFromDates(opens, closes)).toBe("open"); // Current time is 7 AM ET
+ });
+});
diff --git a/_tests/imageWithClassShortcode.js b/_tests/imageWithClassShortcode.js
new file mode 100644
index 00000000..88f5f6a9
--- /dev/null
+++ b/_tests/imageWithClassShortcode.js
@@ -0,0 +1,97 @@
+const path = require("path");
+const Image = require("@11ty/eleventy-img");
+const { imageWithClassShortcode } = require("../js/global");
+
+jest.mock("@11ty/eleventy-img");
+
+describe("imageWithClassShortcode", () => {
+ beforeEach(() => {
+ // Clear environment variables before each test
+ delete process.env.BASEURL;
+ });
+
+ it("should generate an img tag with all parameters", async () => {
+ const mockMetadata = {
+ jpeg: [{ url: "/img/test-image.jpg" }],
+ };
+ Image.mockResolvedValue(mockMetadata);
+
+ const result = await imageWithClassShortcode(
+ "test-image.jpg",
+ "my-class",
+ "Test Image",
+ true,
+ 300,
+ 500,
+ );
+
+ expect(result).toBe(
+ '',
+ );
+ });
+
+ it("should add BASEURL prefix when environment variable is set", async () => {
+ process.env.BASEURL = "https://example.com";
+ const mockMetadata = {
+ jpeg: [{ url: "/img/test-image.jpg" }],
+ };
+ Image.mockResolvedValue(mockMetadata);
+
+ const result = await imageWithClassShortcode(
+ "test-image.jpg",
+ "my-class",
+ "Test Image",
+ true,
+ 300,
+ 500,
+ );
+
+ expect(result).toBe(
+ '',
+ );
+ });
+
+ it("should return an img tag without height and width if not provided", async () => {
+ const mockMetadata = {
+ jpeg: [{ url: "/img/test-image.jpg" }],
+ };
+ Image.mockResolvedValue(mockMetadata);
+
+ const result = await imageWithClassShortcode(
+ "test-image.jpg",
+ "my-class",
+ "Test Image",
+ false,
+ );
+
+ expect(result).toBe(
+ '',
+ );
+ });
+
+ it("should throw an error if image processing fails", async () => {
+ Image.mockRejectedValue(new Error("Image processing failed"));
+
+ await expect(
+ imageWithClassShortcode("test-image.jpg", "my-class", "Test Image", true),
+ ).rejects.toThrow("Image processing failed");
+ });
+
+ it("should handle missing image extension gracefully", async () => {
+ const mockMetadata = {
+ jpeg: [{ url: "/img/test-image.jpg" }],
+ };
+ Image.mockResolvedValue(mockMetadata);
+
+ const result = await imageWithClassShortcode(
+ "test-image",
+ "my-class",
+ "Test Image",
+ false,
+ );
+
+ expect(result).toBe(
+ '',
+ );
+ });
+});
diff --git a/_tests/minNumber.js b/_tests/minNumber.js
new file mode 100644
index 00000000..dd479462
--- /dev/null
+++ b/_tests/minNumber.js
@@ -0,0 +1,28 @@
+const { minNumber } = require("../js/global");
+
+describe("minNumber", () => {
+ test("should return the smallest number from a list of numbers", () => {
+ const result = minNumber(5, 10, 3, 8, 2);
+ expect(result).toBe(2);
+ });
+
+ test("should return the only number when a single number is provided", () => {
+ const result = minNumber(7);
+ expect(result).toBe(7);
+ });
+
+ test("should handle negative numbers correctly", () => {
+ const result = minNumber(-10, -5, -30, 0);
+ expect(result).toBe(-30);
+ });
+
+ test("should handle a mix of positive and negative numbers", () => {
+ const result = minNumber(15, -20, 35, 0, -5);
+ expect(result).toBe(-20);
+ });
+
+ test("should return NaN if any of the inputs are not numbers", () => {
+ const result = minNumber(5, "a", 10, {}, []);
+ expect(result).toBeNaN();
+ });
+});
diff --git a/_tests/readableDate.js b/_tests/readableDate.js
new file mode 100644
index 00000000..369b4b58
--- /dev/null
+++ b/_tests/readableDate.js
@@ -0,0 +1,41 @@
+const { DateTime } = require("luxon");
+const { readableDate } = require("../js/global");
+
+describe("readableDate", () => {
+ test('should return the formatted date in "dd LLL yyyy" format for valid dates', () => {
+ const date = new Date("2024-11-21T15:30:00Z"); // Example date
+ const expected = DateTime.fromJSDate(date, {
+ zone: "America/New_York",
+ }).toFormat("dd LLL yyyy");
+ expect(readableDate(date)).toBe(expected);
+ });
+
+ test("should handle different time zones and return consistent output", () => {
+ const date = new Date("2024-07-04T12:00:00Z");
+ const expected = DateTime.fromJSDate(date, {
+ zone: "America/New_York",
+ }).toFormat("dd LLL yyyy");
+ expect(readableDate(date)).toBe(expected);
+ });
+
+ test("should throw an error or handle gracefully when input is not a valid date", () => {
+ const invalidInputs = [null, undefined, "invalid date", {}, [], 12345];
+ invalidInputs.forEach((input) => {
+ expect(() => readableDate(input)).toThrow(); // Adjust this if your function handles invalid input differently
+ });
+ });
+
+ test("should handle edge case dates correctly", () => {
+ const edgeDates = [
+ new Date("1970-01-01T00:00:00Z"), // Unix epoch start
+ new Date("9999-12-31T23:59:59Z"), // Far future date
+ ];
+
+ edgeDates.forEach((date) => {
+ const expected = DateTime.fromJSDate(date, {
+ zone: "America/New_York",
+ }).toFormat("dd LLL yyyy");
+ expect(readableDate(date)).toBe(expected);
+ });
+ });
+});
diff --git a/_tests/sortByProp.js b/_tests/sortByProp.js
new file mode 100644
index 00000000..1227dcd8
--- /dev/null
+++ b/_tests/sortByProp.js
@@ -0,0 +1,112 @@
+const { sortByProp } = require("../js/global");
+
+describe("sortByProp", () => {
+ test("should sort an array of objects by a numeric property (Data Analyst)", () => {
+ const input = [
+ { id: 3, name: "Data Analyst" },
+ { id: 1, name: "Content Manager" },
+ { id: 2, name: "Web Developer" },
+ ];
+
+ const result = sortByProp(input, "id");
+ expect(result).toEqual([
+ { id: 1, name: "Content Manager" },
+ { id: 2, name: "Web Developer" },
+ { id: 3, name: "Data Analyst" },
+ ]);
+ });
+
+ test("should sort an array of objects by a string property alphabetically (Content Manager)", () => {
+ const input = [
+ { id: 1, name: "Data Analyst" },
+ { id: 2, name: "Content Manager" },
+ { id: 3, name: "Web Developer" },
+ ];
+
+ const result = sortByProp(input, "name");
+ expect(result).toEqual([
+ { id: 2, name: "Content Manager" },
+ { id: 1, name: "Data Analyst" },
+ { id: 3, name: "Web Developer" },
+ ]);
+ });
+
+ test("should handle mixed data types (Web Developer)", () => {
+ const input = [
+ { id: 3, name: "Web Developer" },
+ { id: 2, name: "Data Analyst" },
+ { id: 1, name: "Content Manager" },
+ ];
+
+ const result = sortByProp(input, "id");
+ expect(result).toEqual([
+ { id: 1, name: "Content Manager" },
+ { id: 2, name: "Data Analyst" },
+ { id: 3, name: "Web Developer" },
+ ]);
+ });
+
+ test("should handle an empty array", () => {
+ const input = [];
+ const result = sortByProp(input, "id");
+ expect(result).toEqual([]);
+ });
+
+ test("should return a new array without modifying the original array", () => {
+ const input = [
+ { id: 2, name: "Web Developer" },
+ { id: 1, name: "Content Manager" },
+ ];
+
+ const result = sortByProp(input, "id");
+ expect(result).toEqual([
+ { id: 1, name: "Content Manager" },
+ { id: 2, name: "Web Developer" },
+ ]);
+
+ expect(input).toEqual([
+ { id: 2, name: "Web Developer" },
+ { id: 1, name: "Content Manager" },
+ ]); // Ensure original array is unchanged
+ });
+
+ test("should handle properties that do not exist on all objects", () => {
+ const input = [
+ { id: 3, name: "Data Analyst" },
+ { id: 1 },
+ { id: 2, name: "Web Developer" },
+ ];
+
+ const result = sortByProp(input, "name");
+ expect(result).toEqual([
+ { id: 3, name: "Data Analyst" },
+ { id: 2, name: "Web Developer" },
+ { id: 1 }, // Objects without the property should stay at their original position
+ ]);
+ });
+
+ test("should handle an array with non-object elements gracefully", () => {
+ const input = [
+ { id: 1, name: "Content Manager" },
+ "randomString",
+ { id: 2, name: "Web Developer" },
+ ];
+
+ expect(() => sortByProp(input, "id")).toThrow();
+ });
+
+ test("should handle sorting with numeric strings correctly", () => {
+ const input = [
+ { id: "3", name: "Web Developer" },
+ { id: "2", name: "Data Analyst" },
+ { id: "1", name: "Content Manager" },
+ ];
+
+ const result = sortByProp(input, "id");
+ expect(result).toEqual([
+ { id: "1", name: "Content Manager" },
+ { id: "2", name: "Data Analyst" },
+ { id: "3", name: "Web Developer" },
+ ]);
+ });
+});
diff --git a/_tests/uswdsIcon.js b/_tests/uswdsIcon.js
new file mode 100644
index 00000000..e19727ab
--- /dev/null
+++ b/_tests/uswdsIcon.js
@@ -0,0 +1,50 @@
+const { uswdsIcon } = require("../js/global");
+
+describe("uswdsIcon", () => {
+ test("should return a valid SVG string for a given icon name", () => {
+ const name = "check";
+ const result = uswdsIcon(name);
+ const expected = `
+ `;
+ expect(result).toBe(expected);
+ });
+
+ test("should handle an empty string as the icon name", () => {
+ const name = "";
+ const result = uswdsIcon(name);
+ const expected = `
+ `;
+ expect(result).toBe(expected);
+ });
+
+ test("should handle special characters in the icon name", () => {
+ const name = "alert-circle";
+ const result = uswdsIcon(name);
+ const expected = `
+ `;
+ expect(result).toBe(expected);
+ });
+
+ test("should handle numeric icon names", () => {
+ const name = "123";
+ const result = uswdsIcon(name);
+ const expected = `
+ `;
+ expect(result).toBe(expected);
+ });
+
+ test("should throw an error if the name is not a string", () => {
+ const invalidInputs = [null, undefined, {}, [], 123];
+ invalidInputs.forEach((input) => {
+ expect(() => uswdsIcon(input)).toThrow("Icon name must be a string");
+ });
+ });
+});
diff --git a/config/index.js b/config/index.js
index 6ff5e0cc..e69de29b 100644
--- a/config/index.js
+++ b/config/index.js
@@ -1,53 +0,0 @@
-const path = require("path");
-const Image = require("@11ty/eleventy-img");
-
-async function imageWithClassShortcode(
- src,
- cls,
- alt,
- containFit,
- height,
- width,
-) {
- let pathPrefix = "";
- let style = "";
- let imgHeight = "";
- let imgWidth = "";
-
- if (process.env.BASEURL) {
- pathPrefix = process.env.BASEURL;
- }
-
- const ext = path.extname(src);
- const fileType = ext.replace(".", "");
-
- const metadata = await Image(src, {
- formats: [fileType],
- outputDir: "./_site/img/",
- });
-
- const data = metadata[fileType] ? metadata[fileType][0] : metadata.jpeg[0];
-
- if (containFit) {
- style = 'style="object-fit:contain;"';
- }
-
- if (height) {
- imgHeight = `height="${height}"`;
- }
-
- if (width) {
- imgWidth = `width="${width}"`;
- }
-
- return ``;
-}
-
-async function imageShortcode(src, alt) {
- return await imageWithClassShortcode(src, "", alt);
-}
-
-module.exports = {
- imageWithClassShortcode,
- imageShortcode,
-};
diff --git a/js/global.js b/js/global.js
index e251a844..add13e65 100644
--- a/js/global.js
+++ b/js/global.js
@@ -1,3 +1,12 @@
+const { DateTime } = require("luxon");
+const path = require("path");
+const Image = require("@11ty/eleventy-img");
+
+/**
+ * Validates a Git branch name based on allowed characters and structure.
+ * @param {string} branch - The branch name to validate.
+ * @returns {boolean} True if the branch name is valid, false otherwise.
+ */
function isValidGitBranch(branch) {
// Check if the input is a valid string and not empty
if (typeof branch !== "string" || branch.trim() === "") {
@@ -22,6 +31,11 @@ function isValidGitBranch(branch) {
return validGitBranch.test(branch);
}
+/**
+ * Validates a Twitter handle.
+ * @param {string|null|undefined} handle - The Twitter handle to validate.
+ * @returns {boolean} True if the handle is valid, false otherwise.
+ */
function isValidTwitterHandle(handle) {
if (handle === null || handle === undefined) {
return false;
@@ -31,6 +45,11 @@ function isValidTwitterHandle(handle) {
return validTwitterHandle.test(handle);
}
+/**
+ * Validates a DAP agency identifier.
+ * @param {string|null|undefined} agency - The agency identifier to validate.
+ * @returns {boolean} True if the agency is valid, false otherwise.
+ */
function isValidDapAgency(agency) {
if (agency === null || agency === undefined) {
return false;
@@ -40,6 +59,11 @@ function isValidDapAgency(agency) {
return validDapAgency.test(agency);
}
+/**
+ * Validates a Google Analytics ID.
+ * @param {string|null|undefined} ga - The Google Analytics ID to validate.
+ * @returns {boolean} True if the ID is valid, false otherwise.
+ */
function isValidAnalyticsId(ga) {
if (ga === null || ga === undefined) {
return false;
@@ -51,6 +75,11 @@ function isValidAnalyticsId(ga) {
return validAnalyticsId.test(ga);
}
+/**
+ * Validates a search access key.
+ * @param {string|null|undefined} accessKey - The access key to validate.
+ * @returns {boolean} True if the key is valid, false otherwise.
+ */
function isValidSearchKey(accessKey) {
if (accessKey === null || accessKey === undefined) {
return false;
@@ -60,6 +89,11 @@ function isValidSearchKey(accessKey) {
return validSearchKey.test(accessKey);
}
+/**
+ * Validates a search affiliate identifier.
+ * @param {string|null|undefined} affiliate - The affiliate identifier to validate.
+ * @returns {boolean} True if the identifier is valid, false otherwise.
+ */
function isValidSearchAffiliate(affiliate) {
if (affiliate === null || affiliate === undefined) {
return false;
@@ -69,16 +103,25 @@ function isValidSearchAffiliate(affiliate) {
return validSearchAffiliate.test(affiliate);
}
+/**
+ * Validates a verification token.
+ * @param {string|null|undefined} token - The token to validate.
+ * @returns {boolean} True if the token is valid, false otherwise.
+ */
function isValidVerificationToken(token) {
if (token === null || token === undefined) {
return false;
}
- console.log(`Testing token: "${token}" with length: ${token.length}`);
const validToken = /^[A-Za-z0-9_-]{43}$/;
return validToken.test(token);
}
+/**
+ * Formats a number with commas as thousands separators.
+ * @param {number} number - The number to format.
+ * @returns {string|number} The formatted number or the input if not a number.
+ */
function numberWithCommas(number) {
// Ensure the input is a number
if (typeof number !== "number") {
@@ -100,13 +143,243 @@ function numberWithCommas(number) {
return `${formattedInteger}.${decimalPart}`;
}
+/**
+ * Sorts an array of objects by a specified property.
+ * @param {Array} values - The array to sort.
+ * @param {string} prop - The property to sort by.
+ * @returns {Array} The sorted array.
+ * @throws {TypeError} If input is not an array or elements are not objects.
+ */
+function sortByProp(values, prop) {
+ if (!Array.isArray(values)) {
+ throw new TypeError("Input must be an array");
+ }
+
+ let vals = [...values];
+ return vals.sort((a, b) => {
+ if (
+ typeof a !== "object" ||
+ a === null ||
+ typeof b !== "object" ||
+ b === null
+ ) {
+ throw new TypeError("Array elements must be objects");
+ }
+
+ const aProp = a[prop] !== undefined ? a[prop] : null;
+ const bProp = b[prop] !== undefined ? b[prop] : null;
+
+ if (typeof aProp === "string" && typeof bProp === "string") {
+ return aProp.localeCompare(bProp);
+ } else if (aProp === null) {
+ return 1; // Place objects without the property at the end
+ } else if (bProp === null) {
+ return -1;
+ } else {
+ return Math.sign(aProp - bProp);
+ }
+ });
+}
+
+/**
+ * Converts a JavaScript Date object into a readable date string in the format `dd LLL yyyy`.
+ *
+ * @param {Date} dateObj - A valid JavaScript Date object.
+ * @returns {string} - A formatted date string, e.g., `21 Nov 2024`.
+ * @throws {Error} If the provided dateObj is not a valid Date object.
+ */
+function readableDate(dateObj) {
+ if (!(dateObj instanceof Date) || isNaN(dateObj)) {
+ throw new Error("Invalid date object");
+ }
+ return DateTime.fromJSDate(dateObj, { zone: "America/New_York" }).toFormat(
+ "dd LLL yyyy",
+ );
+}
+
+/**
+ * Determines the state of an entity based on opening and closing dates.
+ *
+ * @param {string|null} opens - The opening date in ISO format (e.g., `2024-11-21`).
+ * @param {string|null} closes - The closing date in ISO format or null if it never closes.
+ * @returns {string} - The state: `open`, `closed`, `upcoming`, or `unknown`.
+ */
+function getStateFromDates(opens, closes) {
+ if (!opens && !closes) {
+ return "unknown";
+ }
+
+ // Get the current date in "America/New_York" timezone
+ let now_date = new Date(
+ new Date().toLocaleString("en-US", { timeZone: "America/New_York" }),
+ );
+
+ // Parse the 'opens' date in UTC and convert to local time
+ let opens_date = opens ? new Date(opens) : null;
+
+ // Parse the 'closes' date in UTC and set time to 11:59:59 PM in local time
+ let closes_date = null;
+ if (closes) {
+ closes_date = new Date(closes);
+ // Set the time to 11:59:59 PM in local time
+ closes_date.setHours(23, 59, 59, 999);
+ }
+
+ // Convert opens_date and closes_date to local time for comparison
+ if (opens_date) {
+ // Adjust opens_date to local timezone
+ opens_date = new Date(
+ opens_date.toLocaleString("en-US", { timeZone: "America/New_York" }),
+ );
+
+ // Adjust closes_date to local timezone
+ if (closes_date) {
+ closes_date = new Date(
+ closes_date.toLocaleString("en-US", { timeZone: "America/New_York" }),
+ );
+ }
+
+ // Check if it's open or closed
+ let isOpen = now_date >= opens_date;
+ let isClosed = closes_date && now_date > closes_date;
+
+ if (isOpen && !isClosed) {
+ return "open";
+ } else if (isClosed) {
+ return "closed";
+ } else {
+ return "upcoming";
+ }
+ }
+
+ return "unknown"; // Default fallback if no conditions are met
+}
+
+/**
+ * Converts a JavaScript Date object into a string formatted as `yyyy-LL-dd`.
+ *
+ * @param {Date} dateObj - A valid JavaScript Date object.
+ * @returns {string} - A string in the format `yyyy-LL-dd` (e.g., `2024-11-21`).
+ */
+function htmlDateString(dateObj) {
+ if (dateObj !== undefined && dateObj !== null) {
+ let dateTime = DateTime.fromJSDate(dateObj);
+
+ // If working locally, add one day to the date to match what is in the actual environments.
+ if (baseUrl.includes("localhost")) {
+ dateTime = dateTime.plus({ days: 1 });
+ return dateTime.toFormat("yyyy-LL-dd");
+ } else {
+ return dateTime.toFormat("yyyy-LL-dd");
+ }
+ }
+}
+
+/**
+ * Returns the smallest number from a list of numbers.
+ *
+ * @param {...number} numbers - A list of numbers.
+ * @returns {number} - The smallest number in the list.
+ */
+function minNumber(...numbers) {
+ return Math.min.apply(null, numbers);
+}
+
+/**
+ * Generates a USWDS icon with a specified size.
+ *
+ * @param {string} name - The name of the icon.
+ * @param {string} size - The size of the icon (e.g., `small`, `large`).
+ * @returns {string} - The HTML string for the icon SVG.
+ * @throws {Error} If the icon name is not a string.
+ */
function uswdsIconWithSize(name, size) {
+ if (typeof name !== "string") {
+ throw new Error("Icon name must be a string");
+ }
+
return `
`;
}
+/**
+ * Generates a USWDS icon with default sizing.
+ *
+ * @param {string} name - The name of the icon.
+ * @returns {string} - The HTML string for the icon SVG.
+ * @throws {Error} If the icon name is not a string.
+ */
+function uswdsIcon(name) {
+ if (typeof name !== "string") {
+ throw new Error("Icon name must be a string");
+ }
+ return `
+ `;
+}
+
+/**
+ * Generates an HTML `` tag with optional classes, alt text, styling, and image dimensions.
+ * The function processes the image path, adds a prefix if `BASEURL` is defined in the environment,
+ * and supports the `contain` object-fit style along with custom height and width attributes.
+ *
+ * @param {string} src - The source path of the image (relative or absolute).
+ * @param {string} cls - The class attribute for the image element.
+ * @param {string} alt - The alt text for the image.
+ * @param {boolean} containFit - If true, applies `object-fit: contain` to the image.
+ * @param {number} [height] - The height of the image in pixels (optional).
+ * @param {number} [width] - The width of the image in pixels (optional).
+ * @returns {Promise} A promise that resolves to the HTML string of the `` tag.
+ * @throws {Error} If the image processing fails or invalid parameters are provided.
+ */
+async function imageWithClassShortcode(
+ src,
+ cls,
+ alt,
+ containFit,
+ height,
+ width,
+) {
+ let pathPrefix = "";
+ let style = "";
+ let imgHeight = "";
+ let imgWidth = "";
+
+ if (process.env.BASEURL) {
+ pathPrefix = process.env.BASEURL;
+ }
+
+ const ext = path.extname(src);
+ const fileType = ext.replace(".", "");
+
+ const metadata = await Image(src, {
+ formats: [fileType],
+ outputDir: "./_site/img/",
+ });
+
+ const data = metadata[fileType] ? metadata[fileType][0] : metadata.jpeg[0];
+
+ if (containFit) {
+ style = 'style="object-fit:contain;"';
+ }
+
+ if (height) {
+ imgHeight = `height="${height}"`;
+ }
+
+ if (width) {
+ imgWidth = `width="${width}"`;
+ }
+
+ // Building the img tag and ensuring there's no trailing space.
+ const imgTag = ``;
+
+ return imgTag;
+}
+
module.exports = {
isValidGitBranch,
isValidTwitterHandle,
@@ -117,4 +390,11 @@ module.exports = {
isValidVerificationToken,
numberWithCommas,
uswdsIconWithSize,
+ sortByProp,
+ readableDate,
+ getStateFromDates,
+ htmlDateString,
+ minNumber,
+ uswdsIcon,
+ imageWithClassShortcode,
};
diff --git a/report.json b/report.json
index d8e72a3d..a40f9db2 100644
--- a/report.json
+++ b/report.json
@@ -1,14 +1,14 @@
{
- "numFailedTestSuites": 0,
- "numFailedTests": 0,
- "numPassedTestSuites": 15,
- "numPassedTests": 47,
+ "numFailedTestSuites": 1,
+ "numFailedTests": 2,
+ "numPassedTestSuites": 21,
+ "numPassedTests": 81,
"numPendingTestSuites": 0,
"numPendingTests": 0,
"numRuntimeErrorTestSuites": 0,
"numTodoTests": 0,
- "numTotalTestSuites": 15,
- "numTotalTests": 47,
+ "numTotalTestSuites": 22,
+ "numTotalTests": 83,
"openHandles": [],
"snapshot": {
"added": 0,
@@ -26,306 +26,310 @@
"unmatched": 0,
"updated": 0
},
- "startTime": 1732145994622,
- "success": true,
+ "startTime": 1732228403293,
+ "success": false,
"testResults": [
{
"assertionResults": [
{
- "ancestorTitles": ["isValidVerificationToken"],
+ "ancestorTitles": ["imageShortcode"],
"duration": 4,
- "failureDetails": [],
- "failureMessages": [],
- "fullName": "isValidVerificationToken should return true for valid verification tokens",
+ "failureDetails": [{}],
+ "failureMessages": [
+ "TypeError: imageShortcode is not a function\n at Object.imageShortcode (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/imageShortcode.js:14:26)\n at Promise.then.completed (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-runner/build/testWorker.js:106:12)"
+ ],
+ "fullName": "imageShortcode should generate an img tag with the correct src and alt, using default class",
"invocations": 1,
- "location": { "column": 3, "line": 4 },
- "numPassingAsserts": 3,
+ "location": { "column": 3, "line": 7 },
+ "numPassingAsserts": 0,
"retryReasons": [],
- "status": "passed",
- "title": "should return true for valid verification tokens"
+ "status": "failed",
+ "title": "should generate an img tag with the correct src and alt, using default class"
},
{
- "ancestorTitles": ["isValidVerificationToken"],
- "duration": 1,
- "failureDetails": [],
- "failureMessages": [],
- "fullName": "isValidVerificationToken should return false for invalid verification tokens",
+ "ancestorTitles": ["imageShortcode"],
+ "duration": 0,
+ "failureDetails": [{}],
+ "failureMessages": [
+ "TypeError: imageShortcode is not a function\n at Object.imageShortcode (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/imageShortcode.js:28:18)\n at Promise.then.completed (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/node_modules/jest-runner/build/testWorker.js:106:12)"
+ ],
+ "fullName": "imageShortcode should throw an error if image processing fails",
"invocations": 1,
- "location": { "column": 3, "line": 16 },
- "numPassingAsserts": 7,
+ "location": { "column": 3, "line": 23 },
+ "numPassingAsserts": 0,
"retryReasons": [],
- "status": "passed",
- "title": "should return false for invalid verification tokens"
+ "status": "failed",
+ "title": "should throw an error if image processing fails"
}
],
- "endTime": 1732145994846,
- "message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidVerificationToken.js",
- "startTime": 1732145994649,
- "status": "passed",
+ "endTime": 1732228403812,
+ "message": "\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mimageShortcode › should generate an img tag with the correct src and alt, using default class\u001b[39m\u001b[22m\n\n TypeError: imageShortcode is not a function\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 12 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 13 |\u001b[39m \u001b[90m// Call imageShortcode and capture the result\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 14 |\u001b[39m \u001b[36mconst\u001b[39m result \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m imageShortcode(\u001b[32m\"test-image.jpg\"\u001b[39m\u001b[33m,\u001b[39m \u001b[32m\"Test Image\"\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 15 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 16 |\u001b[39m \u001b[90m// Ensure the result matches the expected HTML string\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 17 |\u001b[39m expect(result)\u001b[33m.\u001b[39mtoBe(mockResult)\u001b[33m;\u001b[39m \u001b[90m// Check if the result matches the mocked output\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.imageShortcode (\u001b[22m\u001b[2m\u001b[0m\u001b[36m_tests/imageShortcode.js\u001b[39m\u001b[0m\u001b[2m:14:26)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mimageShortcode › should throw an error if image processing fails\u001b[39m\u001b[22m\n\n TypeError: imageShortcode is not a function\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 26 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 27 |\u001b[39m \u001b[90m// Test that the error is thrown correctly\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 28 |\u001b[39m \u001b[36mawait\u001b[39m expect(imageShortcode(\u001b[32m\"test-image.jpg\"\u001b[39m\u001b[33m,\u001b[39m \u001b[32m\"Test Image\"\u001b[39m))\u001b[33m.\u001b[39mrejects\u001b[33m.\u001b[39mtoThrow(\u001b[32m\"Image processing failed\"\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 29 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 30 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 31 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.imageShortcode (\u001b[22m\u001b[2m\u001b[0m\u001b[36m_tests/imageShortcode.js\u001b[39m\u001b[0m\u001b[2m:28:18)\u001b[22m\u001b[2m\u001b[22m\n",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/imageShortcode.js",
+ "startTime": 1732228403441,
+ "status": "failed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 34,
+ "ancestorTitles": ["uswdsIconWithSize"],
+ "duration": 14,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions renders valid upcoming info sessions into the link item",
+ "fullName": "uswdsIconWithSize should return correct SVG for a small icon",
"invocations": 1,
- "location": { "column": 3, "line": 15 },
- "numPassingAsserts": 4,
+ "location": { "column": 3, "line": 4 },
+ "numPassingAsserts": 2,
"retryReasons": [],
"status": "passed",
- "title": "renders valid upcoming info sessions into the link item"
+ "title": "should return correct SVG for a small icon"
},
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 0,
+ "ancestorTitles": ["uswdsIconWithSize"],
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions does not render anything if infoSessions is an empty array",
+ "fullName": "uswdsIconWithSize should return correct SVG for a medium icon",
"invocations": 1,
- "location": { "column": 3, "line": 38 },
- "numPassingAsserts": 1,
+ "location": { "column": 3, "line": 14 },
+ "numPassingAsserts": 2,
"retryReasons": [],
"status": "passed",
- "title": "does not render anything if infoSessions is an empty array"
+ "title": "should return correct SVG for a medium icon"
},
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 1,
+ "ancestorTitles": ["uswdsIconWithSize"],
+ "duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions does not render anything if infoSessions is undefined",
+ "fullName": "uswdsIconWithSize should return correct SVG for a large icon",
"invocations": 1,
- "location": { "column": 3, "line": 45 },
- "numPassingAsserts": 1,
+ "location": { "column": 3, "line": 24 },
+ "numPassingAsserts": 2,
"retryReasons": [],
"status": "passed",
- "title": "does not render anything if infoSessions is undefined"
+ "title": "should return correct SVG for a large icon"
},
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 0,
+ "ancestorTitles": ["uswdsIconWithSize"],
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions does not render anything if infoSessions is null",
+ "fullName": "uswdsIconWithSize should return an empty SVG for invalid size",
"invocations": 1,
- "location": { "column": 3, "line": 50 },
- "numPassingAsserts": 1,
+ "location": { "column": 3, "line": 34 },
+ "numPassingAsserts": 2,
"retryReasons": [],
"status": "passed",
- "title": "does not render anything if infoSessions is null"
+ "title": "should return an empty SVG for invalid size"
},
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 1,
+ "ancestorTitles": ["uswdsIconWithSize"],
+ "duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions does not render past info sessions",
+ "fullName": "uswdsIconWithSize should handle empty icon name",
"invocations": 1,
- "location": { "column": 3, "line": 55 },
- "numPassingAsserts": 1,
+ "location": { "column": 3, "line": 44 },
+ "numPassingAsserts": 2,
"retryReasons": [],
"status": "passed",
- "title": "does not render past info sessions"
- },
+ "title": "should handle empty icon name"
+ }
+ ],
+ "endTime": 1732228404264,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/uswdsIconWithSize.js",
+ "startTime": 1732228403440,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 2,
+ "ancestorTitles": ["sortByProp"],
+ "duration": 7,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions renders only future info sessions when mixed with past sessions",
+ "fullName": "sortByProp should sort an array of objects by a numeric property (Data Analyst)",
"invocations": 1,
- "location": { "column": 3, "line": 73 },
- "numPassingAsserts": 2,
+ "location": { "column": 3, "line": 4 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "renders only future info sessions when mixed with past sessions"
+ "title": "should sort an array of objects by a numeric property (Data Analyst)"
},
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 3,
+ "ancestorTitles": ["sortByProp"],
+ "duration": 11,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions renders a styled wrapper with correct classes for /join/ page layout",
+ "fullName": "sortByProp should sort an array of objects by a string property alphabetically (Content Manager)",
"invocations": 1,
- "location": { "column": 3, "line": 96 },
- "numPassingAsserts": 2,
+ "location": { "column": 3, "line": 19 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "renders a styled wrapper with correct classes for /join/ page layout"
+ "title": "should sort an array of objects by a string property alphabetically (Content Manager)"
},
{
- "ancestorTitles": ["renderInfoSessions"],
- "duration": 1,
+ "ancestorTitles": ["sortByProp"],
+ "duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderInfoSessions renders a styled wrapper with correct classes for position layout",
+ "fullName": "sortByProp should handle mixed data types (Web Developer)",
"invocations": 1,
- "location": { "column": 3, "line": 114 },
- "numPassingAsserts": 2,
+ "location": { "column": 3, "line": 34 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "renders a styled wrapper with correct classes for position layout"
- }
- ],
- "endTime": 1732145995251,
- "message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/renderInfoSessions.js",
- "startTime": 1732145995172,
- "status": "passed",
- "summary": ""
- },
- {
- "assertionResults": [
+ "title": "should handle mixed data types (Web Developer)"
+ },
{
- "ancestorTitles": ["renderGlobalInfoSessions"],
- "duration": 1,
+ "ancestorTitles": ["sortByProp"],
+ "duration": 7,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderGlobalInfoSessions does not render anything if infoSessions is undefined",
+ "fullName": "sortByProp should handle an empty array",
"invocations": 1,
- "location": { "column": 3, "line": 22 },
+ "location": { "column": 3, "line": 49 },
"numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "does not render anything if infoSessions is undefined"
+ "title": "should handle an empty array"
},
{
- "ancestorTitles": ["renderGlobalInfoSessions"],
+ "ancestorTitles": ["sortByProp"],
"duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderGlobalInfoSessions does not render anything if infoSessions is null",
+ "fullName": "sortByProp should return a new array without modifying the original array",
"invocations": 1,
- "location": { "column": 3, "line": 29 },
- "numPassingAsserts": 1,
+ "location": { "column": 3, "line": 55 },
+ "numPassingAsserts": 2,
"retryReasons": [],
"status": "passed",
- "title": "does not render anything if infoSessions is null"
+ "title": "should return a new array without modifying the original array"
},
{
- "ancestorTitles": ["renderGlobalInfoSessions"],
- "duration": 1,
+ "ancestorTitles": ["sortByProp"],
+ "duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderGlobalInfoSessions does not render anything if infoSessions is an empty array",
+ "fullName": "sortByProp should handle properties that do not exist on all objects",
"invocations": 1,
- "location": { "column": 3, "line": 36 },
+ "location": { "column": 3, "line": 73 },
"numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "does not render anything if infoSessions is an empty array"
+ "title": "should handle properties that do not exist on all objects"
},
{
- "ancestorTitles": ["renderGlobalInfoSessions"],
- "duration": 1,
+ "ancestorTitles": ["sortByProp"],
+ "duration": 9,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderGlobalInfoSessions does not render anything if there are no future info sessions",
+ "fullName": "sortByProp should handle an array with non-object elements gracefully",
"invocations": 1,
- "location": { "column": 3, "line": 43 },
- "numPassingAsserts": 2,
+ "location": { "column": 3, "line": 88 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "does not render anything if there are no future info sessions"
+ "title": "should handle an array with non-object elements gracefully"
},
{
- "ancestorTitles": ["renderGlobalInfoSessions"],
- "duration": 2,
+ "ancestorTitles": ["sortByProp"],
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "renderGlobalInfoSessions renders only future info sessions if mixed with past sessions",
+ "fullName": "sortByProp should handle sorting with numeric strings correctly",
"invocations": 1,
- "location": { "column": 3, "line": 62 },
- "numPassingAsserts": 2,
+ "location": { "column": 3, "line": 98 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "renders only future info sessions if mixed with past sessions"
+ "title": "should handle sorting with numeric strings correctly"
}
],
- "endTime": 1732145995292,
+ "endTime": 1732228404272,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/renderGlobalInfoSessions.js",
- "startTime": 1732145995265,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/sortByProp.js",
+ "startTime": 1732228403440,
"status": "passed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["uswdsIconWithSize"],
- "duration": 1,
+ "ancestorTitles": ["uswdsIcon"],
+ "duration": 3,
"failureDetails": [],
"failureMessages": [],
- "fullName": "uswdsIconWithSize should return correct SVG for a small icon",
+ "fullName": "uswdsIcon should return a valid SVG string for a given icon name",
"invocations": 1,
"location": { "column": 3, "line": 4 },
- "numPassingAsserts": 2,
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return correct SVG for a small icon"
+ "title": "should return a valid SVG string for a given icon name"
},
{
- "ancestorTitles": ["uswdsIconWithSize"],
+ "ancestorTitles": ["uswdsIcon"],
"duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "uswdsIconWithSize should return correct SVG for a medium icon",
+ "fullName": "uswdsIcon should handle an empty string as the icon name",
"invocations": 1,
"location": { "column": 3, "line": 14 },
- "numPassingAsserts": 2,
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return correct SVG for a medium icon"
+ "title": "should handle an empty string as the icon name"
},
{
- "ancestorTitles": ["uswdsIconWithSize"],
+ "ancestorTitles": ["uswdsIcon"],
"duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "uswdsIconWithSize should return correct SVG for a large icon",
+ "fullName": "uswdsIcon should handle special characters in the icon name",
"invocations": 1,
"location": { "column": 3, "line": 24 },
- "numPassingAsserts": 2,
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return correct SVG for a large icon"
+ "title": "should handle special characters in the icon name"
},
{
- "ancestorTitles": ["uswdsIconWithSize"],
+ "ancestorTitles": ["uswdsIcon"],
"duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "uswdsIconWithSize should return an empty SVG for invalid size",
+ "fullName": "uswdsIcon should handle numeric icon names",
"invocations": 1,
"location": { "column": 3, "line": 34 },
- "numPassingAsserts": 2,
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return an empty SVG for invalid size"
+ "title": "should handle numeric icon names"
},
{
- "ancestorTitles": ["uswdsIconWithSize"],
- "duration": 0,
+ "ancestorTitles": ["uswdsIcon"],
+ "duration": 15,
"failureDetails": [],
"failureMessages": [],
- "fullName": "uswdsIconWithSize should handle empty icon name",
+ "fullName": "uswdsIcon should throw an error if the name is not a string",
"invocations": 1,
"location": { "column": 3, "line": 44 },
- "numPassingAsserts": 2,
+ "numPassingAsserts": 5,
"retryReasons": [],
"status": "passed",
- "title": "should handle empty icon name"
+ "title": "should throw an error if the name is not a string"
}
],
- "endTime": 1732145995320,
+ "endTime": 1732228404307,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/uswdsIconWithSize.js",
- "startTime": 1732145995299,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/uswdsIcon.js",
+ "startTime": 1732228403443,
"status": "passed",
"summary": ""
},
@@ -333,7 +337,7 @@
"assertionResults": [
{
"ancestorTitles": ["isValidGitBranch"],
- "duration": 1,
+ "duration": 5,
"failureDetails": [],
"failureMessages": [],
"fullName": "isValidGitBranch should return true for valid branch names",
@@ -371,59 +375,10 @@
"title": "should return false for empty string or null input"
}
],
- "endTime": 1732145995349,
+ "endTime": 1732228404322,
"message": "",
"name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidGitBranch.js",
- "startTime": 1732145995325,
- "status": "passed",
- "summary": ""
- },
- {
- "assertionResults": [
- {
- "ancestorTitles": ["formatSessionTimes"],
- "duration": 0,
- "failureDetails": [],
- "failureMessages": [],
- "fullName": "formatSessionTimes should format session times correctly for Eastern and Pacific Time",
- "invocations": 1,
- "location": { "column": 3, "line": 19 },
- "numPassingAsserts": 1,
- "retryReasons": [],
- "status": "passed",
- "title": "should format session times correctly for Eastern and Pacific Time"
- },
- {
- "ancestorTitles": ["formatSessionTimes"],
- "duration": 0,
- "failureDetails": [],
- "failureMessages": [],
- "fullName": "formatSessionTimes should handle edge cases, such as different times",
- "invocations": 1,
- "location": { "column": 3, "line": 28 },
- "numPassingAsserts": 1,
- "retryReasons": [],
- "status": "passed",
- "title": "should handle edge cases, such as different times"
- },
- {
- "ancestorTitles": ["formatSessionTimes"],
- "duration": 0,
- "failureDetails": [],
- "failureMessages": [],
- "fullName": "formatSessionTimes should handle times with AM/PM in various formats",
- "invocations": 1,
- "location": { "column": 3, "line": 37 },
- "numPassingAsserts": 1,
- "retryReasons": [],
- "status": "passed",
- "title": "should handle times with AM/PM in various formats"
- }
- ],
- "endTime": 1732145995373,
- "message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/formatSessionTimes.js",
- "startTime": 1732145995352,
+ "startTime": 1732228403441,
"status": "passed",
"summary": ""
},
@@ -431,7 +386,7 @@
"assertionResults": [
{
"ancestorTitles": ["numberWithCommas"],
- "duration": 0,
+ "duration": 3,
"failureDetails": [],
"failureMessages": [],
"fullName": "numberWithCommas should format numbers with commas",
@@ -457,7 +412,7 @@
},
{
"ancestorTitles": ["numberWithCommas"],
- "duration": 0,
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
"fullName": "numberWithCommas should handle negative numbers correctly",
@@ -483,7 +438,7 @@
},
{
"ancestorTitles": ["numberWithCommas"],
- "duration": 0,
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
"fullName": "numberWithCommas should return non-number values unchanged",
@@ -496,7 +451,7 @@
},
{
"ancestorTitles": ["numberWithCommas"],
- "duration": 0,
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
"fullName": "numberWithCommas should return 0 as \"0\"",
@@ -509,7 +464,7 @@
},
{
"ancestorTitles": ["numberWithCommas"],
- "duration": 1,
+ "duration": 0,
"failureDetails": [],
"failureMessages": [],
"fullName": "numberWithCommas should return large decimal numbers correctly",
@@ -521,82 +476,72 @@
"title": "should return large decimal numbers correctly"
}
],
- "endTime": 1732145995398,
+ "endTime": 1732228404335,
"message": "",
"name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/numberWithCommas.js",
- "startTime": 1732145995377,
+ "startTime": 1732228403442,
"status": "passed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["isValidTwitterHandle"],
- "duration": 1,
+ "ancestorTitles": ["readableDate"],
+ "duration": 44,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidTwitterHandle should return true for valid Twitter handles",
+ "fullName": "readableDate should return the formatted date in \"dd LLL yyyy\" format for valid dates",
"invocations": 1,
- "location": { "column": 3, "line": 4 },
- "numPassingAsserts": 4,
+ "location": { "column": 3, "line": 5 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return true for valid Twitter handles"
+ "title": "should return the formatted date in \"dd LLL yyyy\" format for valid dates"
},
{
- "ancestorTitles": ["isValidTwitterHandle"],
- "duration": 1,
+ "ancestorTitles": ["readableDate"],
+ "duration": 2,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidTwitterHandle should return false for invalid Twitter handles",
+ "fullName": "readableDate should handle different time zones and return consistent output",
"invocations": 1,
- "location": { "column": 3, "line": 17 },
- "numPassingAsserts": 8,
+ "location": { "column": 3, "line": 13 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return false for invalid Twitter handles"
- }
- ],
- "endTime": 1732145995418,
- "message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidTwitterHandle.js",
- "startTime": 1732145995401,
- "status": "passed",
- "summary": ""
- },
- {
- "assertionResults": [
+ "title": "should handle different time zones and return consistent output"
+ },
{
- "ancestorTitles": ["isValidSearchAffiliate"],
- "duration": 0,
+ "ancestorTitles": ["readableDate"],
+ "duration": 10,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidSearchAffiliate should return true for valid search affiliates",
+ "fullName": "readableDate should throw an error or handle gracefully when input is not a valid date",
"invocations": 1,
- "location": { "column": 3, "line": 4 },
+ "location": { "column": 3, "line": 21 },
"numPassingAsserts": 6,
"retryReasons": [],
"status": "passed",
- "title": "should return true for valid search affiliates"
+ "title": "should throw an error or handle gracefully when input is not a valid date"
},
{
- "ancestorTitles": ["isValidSearchAffiliate"],
- "duration": 0,
+ "ancestorTitles": ["readableDate"],
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidSearchAffiliate should return false for invalid search affiliates",
+ "fullName": "readableDate should handle edge case dates correctly",
"invocations": 1,
- "location": { "column": 3, "line": 19 },
- "numPassingAsserts": 8,
+ "location": { "column": 3, "line": 28 },
+ "numPassingAsserts": 2,
"retryReasons": [],
"status": "passed",
- "title": "should return false for invalid search affiliates"
+ "title": "should handle edge case dates correctly"
}
],
- "endTime": 1732145995439,
+ "endTime": 1732228404334,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidSearchAffiliate.js",
- "startTime": 1732145995422,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/readableDate.js",
+ "startTime": 1732228403442,
"status": "passed",
"summary": ""
},
@@ -604,7 +549,7 @@
"assertionResults": [
{
"ancestorTitles": ["isValidSearchKey"],
- "duration": 1,
+ "duration": 2,
"failureDetails": [],
"failureMessages": [],
"fullName": "isValidSearchKey should return true for valid search keys",
@@ -629,793 +574,2431 @@
"title": "should return false for invalid search keys"
}
],
- "endTime": 1732145995461,
+ "endTime": 1732228404360,
"message": "",
"name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidSearchKey.js",
- "startTime": 1732145995442,
+ "startTime": 1732228404293,
"status": "passed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["isValidDapAgency"],
- "duration": 1,
+ "ancestorTitles": ["isValidAnalyticsId"],
+ "duration": 4,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidDapAgency should return true for valid agency names",
+ "fullName": "isValidAnalyticsId should return true for valid Analytics IDs",
"invocations": 1,
"location": { "column": 3, "line": 4 },
- "numPassingAsserts": 5,
+ "numPassingAsserts": 6,
"retryReasons": [],
"status": "passed",
- "title": "should return true for valid agency names"
+ "title": "should return true for valid Analytics IDs"
},
{
- "ancestorTitles": ["isValidDapAgency"],
- "duration": 2,
+ "ancestorTitles": ["isValidAnalyticsId"],
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidDapAgency should return false for invalid agency names",
+ "fullName": "isValidAnalyticsId should return false for invalid Analytics IDs",
"invocations": 1,
- "location": { "column": 3, "line": 18 },
+ "location": { "column": 3, "line": 19 },
"numPassingAsserts": 8,
"retryReasons": [],
"status": "passed",
- "title": "should return false for invalid agency names"
+ "title": "should return false for invalid Analytics IDs"
}
],
- "endTime": 1732145995482,
+ "endTime": 1732228404374,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidDapAgency.js",
- "startTime": 1732145995463,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidAnalyticsId.js",
+ "startTime": 1732228404303,
"status": "passed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["isValidAnalyticsId"],
+ "ancestorTitles": ["getStateFromDates"],
+ "duration": 6,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "getStateFromDates should return \"unknown\" if both opens and closes are undefined",
+ "invocations": 1,
+ "location": { "column": 3, "line": 13 },
+ "numPassingAsserts": 2,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return \"unknown\" if both opens and closes are undefined"
+ },
+ {
+ "ancestorTitles": ["getStateFromDates"],
+ "duration": 35,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "getStateFromDates should return \"upcoming\" if now is before opens",
+ "invocations": 1,
+ "location": { "column": 3, "line": 18 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return \"upcoming\" if now is before opens"
+ },
+ {
+ "ancestorTitles": ["getStateFromDates"],
"duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidAnalyticsId should return true for valid Analytics IDs",
+ "fullName": "getStateFromDates should return \"open\" if now is after opens and before closes",
"invocations": 1,
- "location": { "column": 3, "line": 4 },
- "numPassingAsserts": 6,
+ "location": { "column": 3, "line": 23 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return true for valid Analytics IDs"
+ "title": "should return \"open\" if now is after opens and before closes"
},
{
- "ancestorTitles": ["isValidAnalyticsId"],
+ "ancestorTitles": ["getStateFromDates"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "getStateFromDates should return \"closed\" if now is after closes",
+ "invocations": 1,
+ "location": { "column": 3, "line": 29 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return \"closed\" if now is after closes"
+ },
+ {
+ "ancestorTitles": ["getStateFromDates"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "getStateFromDates should handle cases with only opens defined",
+ "invocations": 1,
+ "location": { "column": 3, "line": 35 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should handle cases with only opens defined"
+ },
+ {
+ "ancestorTitles": ["getStateFromDates"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "getStateFromDates should handle cases with only closes defined",
+ "invocations": 1,
+ "location": { "column": 3, "line": 40 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should handle cases with only closes defined"
+ },
+ {
+ "ancestorTitles": ["getStateFromDates"],
"duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "isValidAnalyticsId should return false for invalid Analytics IDs",
+ "fullName": "getStateFromDates should handle edge cases for opens and closes on the same day",
"invocations": 1,
- "location": { "column": 3, "line": 19 },
- "numPassingAsserts": 8,
+ "location": { "column": 3, "line": 45 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should return false for invalid Analytics IDs"
+ "title": "should handle edge cases for opens and closes on the same day"
}
],
- "endTime": 1732145995503,
+ "endTime": 1732228404377,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidAnalyticsId.js",
- "startTime": 1732145995485,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/getStateFromDates.js",
+ "startTime": 1732228403441,
"status": "passed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["formatDate"],
- "duration": 0,
+ "ancestorTitles": ["isValidVerificationToken"],
+ "duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "formatDate should format a Date object into yyyy-mm-dd",
+ "fullName": "isValidVerificationToken should return true for valid verification tokens",
"invocations": 1,
"location": { "column": 3, "line": 4 },
- "numPassingAsserts": 1,
+ "numPassingAsserts": 3,
"retryReasons": [],
"status": "passed",
- "title": "should format a Date object into yyyy-mm-dd"
+ "title": "should return true for valid verification tokens"
+ },
+ {
+ "ancestorTitles": ["isValidVerificationToken"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "isValidVerificationToken should return false for invalid verification tokens",
+ "invocations": 1,
+ "location": { "column": 3, "line": 16 },
+ "numPassingAsserts": 7,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return false for invalid verification tokens"
}
],
- "endTime": 1732145995523,
+ "endTime": 1732228404377,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/formatDate.js",
- "startTime": 1732145995506,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidVerificationToken.js",
+ "startTime": 1732228403818,
"status": "passed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["sortJobs"],
+ "ancestorTitles": ["imageWithClassShortcode"],
+ "duration": 3,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "imageWithClassShortcode should generate an img tag with all parameters",
+ "invocations": 1,
+ "location": { "column": 3, "line": 13 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should generate an img tag with all parameters"
+ },
+ {
+ "ancestorTitles": ["imageWithClassShortcode"],
"duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "sortJobs correctly sorts jobs into open and upcoming arrays",
+ "fullName": "imageWithClassShortcode should add BASEURL prefix when environment variable is set",
"invocations": 1,
- "location": { "column": 3, "line": 31 },
- "numPassingAsserts": 2,
+ "location": { "column": 3, "line": 33 },
+ "numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "correctly sorts jobs into open and upcoming arrays"
+ "title": "should add BASEURL prefix when environment variable is set"
+ },
+ {
+ "ancestorTitles": ["imageWithClassShortcode"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "imageWithClassShortcode should return an img tag without height and width if not provided",
+ "invocations": 1,
+ "location": { "column": 3, "line": 54 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return an img tag without height and width if not provided"
+ },
+ {
+ "ancestorTitles": ["imageWithClassShortcode"],
+ "duration": 2,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "imageWithClassShortcode should throw an error if image processing fails",
+ "invocations": 1,
+ "location": { "column": 3, "line": 72 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should throw an error if image processing fails"
+ },
+ {
+ "ancestorTitles": ["imageWithClassShortcode"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "imageWithClassShortcode should handle missing image extension gracefully",
+ "invocations": 1,
+ "location": { "column": 3, "line": 80 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should handle missing image extension gracefully"
}
],
- "endTime": 1732145995545,
+ "endTime": 1732228404416,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/sortJobs.js",
- "startTime": 1732145995526,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/imageWithClassShortcode.js",
+ "startTime": 1732228403441,
"status": "passed",
"summary": ""
},
{
"assertionResults": [
{
- "ancestorTitles": ["convertTimeToZone"],
+ "ancestorTitles": ["minNumber"],
"duration": 0,
"failureDetails": [],
"failureMessages": [],
- "fullName": "convertTimeToZone should convert time to Eastern Time",
+ "fullName": "minNumber should return the smallest number from a list of numbers",
"invocations": 1,
- "location": { "column": 3, "line": 5 },
+ "location": { "column": 3, "line": 4 },
"numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should convert time to Eastern Time"
+ "title": "should return the smallest number from a list of numbers"
},
{
- "ancestorTitles": ["convertTimeToZone"],
+ "ancestorTitles": ["minNumber"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "minNumber should return the only number when a single number is provided",
+ "invocations": 1,
+ "location": { "column": 3, "line": 9 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return the only number when a single number is provided"
+ },
+ {
+ "ancestorTitles": ["minNumber"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "minNumber should handle negative numbers correctly",
+ "invocations": 1,
+ "location": { "column": 3, "line": 14 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should handle negative numbers correctly"
+ },
+ {
+ "ancestorTitles": ["minNumber"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "minNumber should handle a mix of positive and negative numbers",
+ "invocations": 1,
+ "location": { "column": 3, "line": 19 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should handle a mix of positive and negative numbers"
+ },
+ {
+ "ancestorTitles": ["minNumber"],
"duration": 1,
"failureDetails": [],
"failureMessages": [],
- "fullName": "convertTimeToZone should convert time to Pacific Time",
+ "fullName": "minNumber should return NaN if any of the inputs are not numbers",
"invocations": 1,
- "location": { "column": 3, "line": 10 },
+ "location": { "column": 3, "line": 24 },
"numPassingAsserts": 1,
"retryReasons": [],
"status": "passed",
- "title": "should convert time to Pacific Time"
+ "title": "should return NaN if any of the inputs are not numbers"
}
],
- "endTime": 1732145995567,
+ "endTime": 1732228404429,
"message": "",
- "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/convertTimeToZone.js",
- "startTime": 1732145995548,
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/minNumber.js",
+ "startTime": 1732228404356,
"status": "passed",
"summary": ""
- }
- ],
- "wasInterrupted": false,
- "coverageMap": {
- "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/js/global.js": {
- "path": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/js/global.js",
- "statementMap": {
- "0": {
- "start": { "line": 3, "column": 2 },
- "end": { "line": 5, "column": 3 }
- },
- "1": {
- "start": { "line": 4, "column": 4 },
- "end": { "line": 4, "column": 17 }
- },
- "2": {
- "start": { "line": 8, "column": 25 },
- "end": { "line": 8, "column": 48 }
- },
- "3": {
- "start": { "line": 11, "column": 2 },
- "end": { "line": 19, "column": 3 }
- },
- "4": {
- "start": { "line": 18, "column": 4 },
- "end": { "line": 18, "column": 17 }
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["isValidSearchAffiliate"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "isValidSearchAffiliate should return true for valid search affiliates",
+ "invocations": 1,
+ "location": { "column": 3, "line": 4 },
+ "numPassingAsserts": 6,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return true for valid search affiliates"
},
- "5": {
- "start": { "line": 22, "column": 2 },
- "end": { "line": 22, "column": 37 }
+ {
+ "ancestorTitles": ["isValidSearchAffiliate"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "isValidSearchAffiliate should return false for invalid search affiliates",
+ "invocations": 1,
+ "location": { "column": 3, "line": 19 },
+ "numPassingAsserts": 8,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return false for invalid search affiliates"
+ }
+ ],
+ "endTime": 1732228404411,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidSearchAffiliate.js",
+ "startTime": 1732228404345,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["formatSessionTimes"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "formatSessionTimes should format session times correctly for Eastern and Pacific Time",
+ "invocations": 1,
+ "location": { "column": 3, "line": 26 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should format session times correctly for Eastern and Pacific Time"
+ },
+ {
+ "ancestorTitles": ["formatSessionTimes"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "formatSessionTimes should handle edge cases, such as different times",
+ "invocations": 1,
+ "location": { "column": 3, "line": 32 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should handle edge cases, such as different times"
+ },
+ {
+ "ancestorTitles": ["formatSessionTimes"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "formatSessionTimes should handle times with AM/PM in various formats",
+ "invocations": 1,
+ "location": { "column": 3, "line": 38 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should handle times with AM/PM in various formats"
+ }
+ ],
+ "endTime": 1732228404439,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/formatSessionTimes.js",
+ "startTime": 1732228404405,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["isValidDapAgency"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "isValidDapAgency should return true for valid agency names",
+ "invocations": 1,
+ "location": { "column": 3, "line": 4 },
+ "numPassingAsserts": 5,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return true for valid agency names"
+ },
+ {
+ "ancestorTitles": ["isValidDapAgency"],
+ "duration": 5,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "isValidDapAgency should return false for invalid agency names",
+ "invocations": 1,
+ "location": { "column": 3, "line": 18 },
+ "numPassingAsserts": 8,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return false for invalid agency names"
+ }
+ ],
+ "endTime": 1732228404416,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidDapAgency.js",
+ "startTime": 1732228404346,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["isValidTwitterHandle"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "isValidTwitterHandle should return true for valid Twitter handles",
+ "invocations": 1,
+ "location": { "column": 3, "line": 4 },
+ "numPassingAsserts": 4,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return true for valid Twitter handles"
+ },
+ {
+ "ancestorTitles": ["isValidTwitterHandle"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "isValidTwitterHandle should return false for invalid Twitter handles",
+ "invocations": 1,
+ "location": { "column": 3, "line": 17 },
+ "numPassingAsserts": 8,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should return false for invalid Twitter handles"
+ }
+ ],
+ "endTime": 1732228404451,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/isValidTwitterHandle.js",
+ "startTime": 1732228404365,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["convertTimeToZone"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "convertTimeToZone should convert time to Eastern Time",
+ "invocations": 1,
+ "location": { "column": 3, "line": 6 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should convert time to Eastern Time"
+ },
+ {
+ "ancestorTitles": ["convertTimeToZone"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "convertTimeToZone should convert time to Pacific Time",
+ "invocations": 1,
+ "location": { "column": 3, "line": 10 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should convert time to Pacific Time"
+ }
+ ],
+ "endTime": 1732228404472,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/convertTimeToZone.js",
+ "startTime": 1732228404409,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["sortJobs"],
+ "duration": 2,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "sortJobs correctly sorts jobs into open and upcoming arrays",
+ "invocations": 1,
+ "location": { "column": 3, "line": 27 },
+ "numPassingAsserts": 2,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "correctly sorts jobs into open and upcoming arrays"
+ }
+ ],
+ "endTime": 1732228404476,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/sortJobs.js",
+ "startTime": 1732228404434,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["formatDate"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "formatDate should format a Date object into yyyy-mm-dd",
+ "invocations": 1,
+ "location": { "column": 3, "line": 5 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "should format a Date object into yyyy-mm-dd"
+ }
+ ],
+ "endTime": 1732228404494,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/formatDate.js",
+ "startTime": 1732228404446,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["renderGlobalInfoSessions"],
+ "duration": 4,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderGlobalInfoSessions does not render anything if infoSessions is undefined",
+ "invocations": 1,
+ "location": { "column": 3, "line": 22 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render anything if infoSessions is undefined"
+ },
+ {
+ "ancestorTitles": ["renderGlobalInfoSessions"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderGlobalInfoSessions does not render anything if infoSessions is null",
+ "invocations": 1,
+ "location": { "column": 3, "line": 29 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render anything if infoSessions is null"
+ },
+ {
+ "ancestorTitles": ["renderGlobalInfoSessions"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderGlobalInfoSessions does not render anything if infoSessions is an empty array",
+ "invocations": 1,
+ "location": { "column": 3, "line": 36 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render anything if infoSessions is an empty array"
+ },
+ {
+ "ancestorTitles": ["renderGlobalInfoSessions"],
+ "duration": 5,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderGlobalInfoSessions does not render anything if there are no future info sessions",
+ "invocations": 1,
+ "location": { "column": 3, "line": 43 },
+ "numPassingAsserts": 2,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render anything if there are no future info sessions"
+ },
+ {
+ "ancestorTitles": ["renderGlobalInfoSessions"],
+ "duration": 12,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderGlobalInfoSessions renders only future info sessions if mixed with past sessions",
+ "invocations": 1,
+ "location": { "column": 3, "line": 62 },
+ "numPassingAsserts": 2,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "renders only future info sessions if mixed with past sessions"
+ }
+ ],
+ "endTime": 1732228404762,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/renderGlobalInfoSessions.js",
+ "startTime": 1732228404704,
+ "status": "passed",
+ "summary": ""
+ },
+ {
+ "assertionResults": [
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 30,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions renders valid upcoming info sessions into the link item",
+ "invocations": 1,
+ "location": { "column": 3, "line": 15 },
+ "numPassingAsserts": 4,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "renders valid upcoming info sessions into the link item"
+ },
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions does not render anything if infoSessions is an empty array",
+ "invocations": 1,
+ "location": { "column": 3, "line": 38 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render anything if infoSessions is an empty array"
+ },
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions does not render anything if infoSessions is undefined",
+ "invocations": 1,
+ "location": { "column": 3, "line": 45 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render anything if infoSessions is undefined"
+ },
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions does not render anything if infoSessions is null",
+ "invocations": 1,
+ "location": { "column": 3, "line": 50 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render anything if infoSessions is null"
+ },
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 0,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions does not render past info sessions",
+ "invocations": 1,
+ "location": { "column": 3, "line": 55 },
+ "numPassingAsserts": 1,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "does not render past info sessions"
+ },
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 1,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions renders only future info sessions when mixed with past sessions",
+ "invocations": 1,
+ "location": { "column": 3, "line": 73 },
+ "numPassingAsserts": 2,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "renders only future info sessions when mixed with past sessions"
+ },
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 3,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions renders a styled wrapper with correct classes for /join/ page layout",
+ "invocations": 1,
+ "location": { "column": 3, "line": 96 },
+ "numPassingAsserts": 2,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "renders a styled wrapper with correct classes for /join/ page layout"
+ },
+ {
+ "ancestorTitles": ["renderInfoSessions"],
+ "duration": 2,
+ "failureDetails": [],
+ "failureMessages": [],
+ "fullName": "renderInfoSessions renders a styled wrapper with correct classes for position layout",
+ "invocations": 1,
+ "location": { "column": 3, "line": 114 },
+ "numPassingAsserts": 2,
+ "retryReasons": [],
+ "status": "passed",
+ "title": "renders a styled wrapper with correct classes for position layout"
+ }
+ ],
+ "endTime": 1732228404784,
+ "message": "",
+ "name": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/_tests/renderInfoSessions.js",
+ "startTime": 1732228404704,
+ "status": "passed",
+ "summary": ""
+ }
+ ],
+ "wasInterrupted": false,
+ "coverageMap": {
+ "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/js/global.js": {
+ "path": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/js/global.js",
+ "statementMap": {
+ "0": {
+ "start": { "line": 1, "column": 21 },
+ "end": { "line": 1, "column": 37 }
+ },
+ "1": {
+ "start": { "line": 2, "column": 13 },
+ "end": { "line": 2, "column": 28 }
+ },
+ "2": {
+ "start": { "line": 3, "column": 14 },
+ "end": { "line": 3, "column": 43 }
+ },
+ "3": {
+ "start": { "line": 12, "column": 2 },
+ "end": { "line": 14, "column": 3 }
+ },
+ "4": {
+ "start": { "line": 13, "column": 4 },
+ "end": { "line": 13, "column": 17 }
+ },
+ "5": {
+ "start": { "line": 17, "column": 25 },
+ "end": { "line": 17, "column": 48 }
+ },
+ "6": {
+ "start": { "line": 20, "column": 2 },
+ "end": { "line": 28, "column": 3 }
+ },
+ "7": {
+ "start": { "line": 27, "column": 4 },
+ "end": { "line": 27, "column": 17 }
+ },
+ "8": {
+ "start": { "line": 31, "column": 2 },
+ "end": { "line": 31, "column": 37 }
+ },
+ "9": {
+ "start": { "line": 40, "column": 2 },
+ "end": { "line": 42, "column": 3 }
+ },
+ "10": {
+ "start": { "line": 41, "column": 4 },
+ "end": { "line": 41, "column": 17 }
+ },
+ "11": {
+ "start": { "line": 44, "column": 29 },
+ "end": { "line": 44, "column": 41 }
+ },
+ "12": {
+ "start": { "line": 45, "column": 2 },
+ "end": { "line": 45, "column": 41 }
+ },
+ "13": {
+ "start": { "line": 54, "column": 2 },
+ "end": { "line": 56, "column": 3 }
+ },
+ "14": {
+ "start": { "line": 55, "column": 4 },
+ "end": { "line": 55, "column": 17 }
+ },
+ "15": {
+ "start": { "line": 58, "column": 25 },
+ "end": { "line": 58, "column": 37 }
+ },
+ "16": {
+ "start": { "line": 59, "column": 2 },
+ "end": { "line": 59, "column": 37 }
+ },
+ "17": {
+ "start": { "line": 68, "column": 2 },
+ "end": { "line": 70, "column": 3 }
+ },
+ "18": {
+ "start": { "line": 69, "column": 4 },
+ "end": { "line": 69, "column": 17 }
+ },
+ "19": {
+ "start": { "line": 74, "column": 4 },
+ "end": { "line": 74, "column": 82 }
+ },
+ "20": {
+ "start": { "line": 75, "column": 2 },
+ "end": { "line": 75, "column": 35 }
+ },
+ "21": {
+ "start": { "line": 84, "column": 2 },
+ "end": { "line": 86, "column": 3 }
+ },
+ "22": {
+ "start": { "line": 85, "column": 4 },
+ "end": { "line": 85, "column": 17 }
+ },
+ "23": {
+ "start": { "line": 88, "column": 25 },
+ "end": { "line": 88, "column": 57 }
+ },
+ "24": {
+ "start": { "line": 89, "column": 2 },
+ "end": { "line": 89, "column": 40 }
+ },
+ "25": {
+ "start": { "line": 98, "column": 2 },
+ "end": { "line": 100, "column": 3 }
+ },
+ "26": {
+ "start": { "line": 99, "column": 4 },
+ "end": { "line": 99, "column": 17 }
+ },
+ "27": {
+ "start": { "line": 102, "column": 31 },
+ "end": { "line": 102, "column": 61 }
+ },
+ "28": {
+ "start": { "line": 103, "column": 2 },
+ "end": { "line": 103, "column": 46 }
+ },
+ "29": {
+ "start": { "line": 112, "column": 2 },
+ "end": { "line": 114, "column": 3 }
+ },
+ "30": {
+ "start": { "line": 113, "column": 4 },
+ "end": { "line": 113, "column": 17 }
+ },
+ "31": {
+ "start": { "line": 116, "column": 21 },
+ "end": { "line": 116, "column": 42 }
+ },
+ "32": {
+ "start": { "line": 117, "column": 2 },
+ "end": { "line": 117, "column": 32 }
+ },
+ "33": {
+ "start": { "line": 127, "column": 2 },
+ "end": { "line": 129, "column": 3 }
+ },
+ "34": {
+ "start": { "line": 128, "column": 4 },
+ "end": { "line": 128, "column": 18 }
+ },
+ "35": {
+ "start": { "line": 132, "column": 37 },
+ "end": { "line": 132, "column": 65 }
+ },
+ "36": {
+ "start": { "line": 135, "column": 27 },
+ "end": { "line": 135, "column": 76 }
+ },
+ "37": {
+ "start": { "line": 138, "column": 2 },
+ "end": { "line": 140, "column": 3 }
+ },
+ "38": {
+ "start": { "line": 139, "column": 4 },
+ "end": { "line": 139, "column": 28 }
+ },
+ "39": {
+ "start": { "line": 143, "column": 2 },
+ "end": { "line": 143, "column": 46 }
+ },
+ "40": {
+ "start": { "line": 154, "column": 2 },
+ "end": { "line": 156, "column": 3 }
+ },
+ "41": {
+ "start": { "line": 155, "column": 4 },
+ "end": { "line": 155, "column": 50 }
+ },
+ "42": {
+ "start": { "line": 158, "column": 13 },
+ "end": { "line": 158, "column": 24 }
+ },
+ "43": {
+ "start": { "line": 159, "column": 2 },
+ "end": { "line": 181, "column": 5 }
+ },
+ "44": {
+ "start": { "line": 160, "column": 4 },
+ "end": { "line": 167, "column": 5 }
+ },
+ "45": {
+ "start": { "line": 166, "column": 6 },
+ "end": { "line": 166, "column": 60 }
+ },
+ "46": {
+ "start": { "line": 169, "column": 18 },
+ "end": { "line": 169, "column": 56 }
+ },
+ "47": {
+ "start": { "line": 170, "column": 18 },
+ "end": { "line": 170, "column": 56 }
+ },
+ "48": {
+ "start": { "line": 172, "column": 4 },
+ "end": { "line": 180, "column": 5 }
+ },
+ "49": {
+ "start": { "line": 173, "column": 6 },
+ "end": { "line": 173, "column": 40 }
+ },
+ "50": {
+ "start": { "line": 174, "column": 11 },
+ "end": { "line": 180, "column": 5 }
+ },
+ "51": {
+ "start": { "line": 175, "column": 6 },
+ "end": { "line": 175, "column": 15 }
+ },
+ "52": {
+ "start": { "line": 176, "column": 11 },
+ "end": { "line": 180, "column": 5 }
+ },
+ "53": {
+ "start": { "line": 177, "column": 6 },
+ "end": { "line": 177, "column": 16 }
+ },
+ "54": {
+ "start": { "line": 179, "column": 6 },
+ "end": { "line": 179, "column": 38 }
+ },
+ "55": {
+ "start": { "line": 192, "column": 2 },
+ "end": { "line": 194, "column": 3 }
+ },
+ "56": {
+ "start": { "line": 193, "column": 4 },
+ "end": { "line": 193, "column": 43 }
+ },
+ "57": {
+ "start": { "line": 195, "column": 2 },
+ "end": { "line": 197, "column": 4 }
+ },
+ "58": {
+ "start": { "line": 208, "column": 2 },
+ "end": { "line": 210, "column": 3 }
+ },
+ "59": {
+ "start": { "line": 209, "column": 4 },
+ "end": { "line": 209, "column": 21 }
+ },
+ "60": {
+ "start": { "line": 213, "column": 17 },
+ "end": { "line": 215, "column": 3 }
+ },
+ "61": {
+ "start": { "line": 218, "column": 19 },
+ "end": { "line": 218, "column": 49 }
+ },
+ "62": {
+ "start": { "line": 221, "column": 20 },
+ "end": { "line": 221, "column": 24 }
+ },
+ "63": {
+ "start": { "line": 222, "column": 2 },
+ "end": { "line": 226, "column": 3 }
+ },
+ "64": {
+ "start": { "line": 223, "column": 4 },
+ "end": { "line": 223, "column": 35 }
+ },
+ "65": {
+ "start": { "line": 225, "column": 4 },
+ "end": { "line": 225, "column": 42 }
+ },
+ "66": {
+ "start": { "line": 229, "column": 2 },
+ "end": { "line": 253, "column": 3 }
+ },
+ "67": {
+ "start": { "line": 231, "column": 4 },
+ "end": { "line": 233, "column": 6 }
+ },
+ "68": {
+ "start": { "line": 236, "column": 4 },
+ "end": { "line": 240, "column": 5 }
+ },
+ "69": {
+ "start": { "line": 237, "column": 6 },
+ "end": { "line": 239, "column": 8 }
+ },
+ "70": {
+ "start": { "line": 243, "column": 17 },
+ "end": { "line": 243, "column": 39 }
+ },
+ "71": {
+ "start": { "line": 244, "column": 19 },
+ "end": { "line": 244, "column": 56 }
+ },
+ "72": {
+ "start": { "line": 246, "column": 4 },
+ "end": { "line": 252, "column": 5 }
+ },
+ "73": {
+ "start": { "line": 247, "column": 6 },
+ "end": { "line": 247, "column": 20 }
+ },
+ "74": {
+ "start": { "line": 248, "column": 11 },
+ "end": { "line": 252, "column": 5 }
+ },
+ "75": {
+ "start": { "line": 249, "column": 6 },
+ "end": { "line": 249, "column": 22 }
+ },
+ "76": {
+ "start": { "line": 251, "column": 6 },
+ "end": { "line": 251, "column": 24 }
+ },
+ "77": {
+ "start": { "line": 255, "column": 2 },
+ "end": { "line": 255, "column": 19 }
+ },
+ "78": {
+ "start": { "line": 265, "column": 2 },
+ "end": { "line": 275, "column": 3 }
+ },
+ "79": {
+ "start": { "line": 266, "column": 19 },
+ "end": { "line": 266, "column": 47 }
+ },
+ "80": {
+ "start": { "line": 269, "column": 4 },
+ "end": { "line": 274, "column": 5 }
+ },
+ "81": {
+ "start": { "line": 270, "column": 6 },
+ "end": { "line": 270, "column": 44 }
+ },
+ "82": {
+ "start": { "line": 271, "column": 6 },
+ "end": { "line": 271, "column": 45 }
+ },
+ "83": {
+ "start": { "line": 273, "column": 6 },
+ "end": { "line": 273, "column": 45 }
+ },
+ "84": {
+ "start": { "line": 285, "column": 2 },
+ "end": { "line": 285, "column": 39 }
+ },
+ "85": {
+ "start": { "line": 297, "column": 2 },
+ "end": { "line": 299, "column": 3 }
+ },
+ "86": {
+ "start": { "line": 298, "column": 4 },
+ "end": { "line": 298, "column": 50 }
+ },
+ "87": {
+ "start": { "line": 301, "column": 2 },
+ "end": { "line": 304, "column": 12 }
+ },
+ "88": {
+ "start": { "line": 315, "column": 2 },
+ "end": { "line": 317, "column": 3 }
+ },
+ "89": {
+ "start": { "line": 316, "column": 4 },
+ "end": { "line": 316, "column": 50 }
+ },
+ "90": {
+ "start": { "line": 318, "column": 2 },
+ "end": { "line": 321, "column": 10 }
+ },
+ "91": {
+ "start": { "line": 346, "column": 19 },
+ "end": { "line": 346, "column": 21 }
+ },
+ "92": {
+ "start": { "line": 347, "column": 14 },
+ "end": { "line": 347, "column": 16 }
+ },
+ "93": {
+ "start": { "line": 348, "column": 18 },
+ "end": { "line": 348, "column": 20 }
+ },
+ "94": {
+ "start": { "line": 349, "column": 17 },
+ "end": { "line": 349, "column": 19 }
+ },
+ "95": {
+ "start": { "line": 351, "column": 2 },
+ "end": { "line": 353, "column": 3 }
+ },
+ "96": {
+ "start": { "line": 352, "column": 4 },
+ "end": { "line": 352, "column": 37 }
+ },
+ "97": {
+ "start": { "line": 355, "column": 14 },
+ "end": { "line": 355, "column": 31 }
+ },
+ "98": {
+ "start": { "line": 356, "column": 19 },
+ "end": { "line": 356, "column": 39 }
+ },
+ "99": {
+ "start": { "line": 358, "column": 19 },
+ "end": { "line": 361, "column": 4 }
+ },
+ "100": {
+ "start": { "line": 363, "column": 15 },
+ "end": { "line": 363, "column": 76 }
+ },
+ "101": {
+ "start": { "line": 365, "column": 2 },
+ "end": { "line": 367, "column": 3 }
+ },
+ "102": {
+ "start": { "line": 366, "column": 4 },
+ "end": { "line": 366, "column": 42 }
+ },
+ "103": {
+ "start": { "line": 369, "column": 2 },
+ "end": { "line": 371, "column": 3 }
+ },
+ "104": {
+ "start": { "line": 370, "column": 4 },
+ "end": { "line": 370, "column": 37 }
+ },
+ "105": {
+ "start": { "line": 373, "column": 2 },
+ "end": { "line": 375, "column": 3 }
+ },
+ "106": {
+ "start": { "line": 374, "column": 4 },
+ "end": { "line": 374, "column": 34 }
+ },
+ "107": {
+ "start": { "line": 378, "column": 17 },
+ "end": { "line": 378, "column": 210 }
+ },
+ "108": {
+ "start": { "line": 380, "column": 2 },
+ "end": { "line": 380, "column": 16 }
+ },
+ "109": {
+ "start": { "line": 400, "column": 2 },
+ "end": { "line": 400, "column": 53 }
+ },
+ "110": {
+ "start": { "line": 403, "column": 0 },
+ "end": { "line": 421, "column": 2 }
+ }
+ },
+ "fnMap": {
+ "0": {
+ "name": "isValidGitBranch",
+ "decl": {
+ "start": { "line": 10, "column": 9 },
+ "end": { "line": 10, "column": 25 }
+ },
+ "loc": {
+ "start": { "line": 10, "column": 34 },
+ "end": { "line": 32, "column": 1 }
+ },
+ "line": 10
+ },
+ "1": {
+ "name": "isValidTwitterHandle",
+ "decl": {
+ "start": { "line": 39, "column": 9 },
+ "end": { "line": 39, "column": 29 }
+ },
+ "loc": {
+ "start": { "line": 39, "column": 38 },
+ "end": { "line": 46, "column": 1 }
+ },
+ "line": 39
+ },
+ "2": {
+ "name": "isValidDapAgency",
+ "decl": {
+ "start": { "line": 53, "column": 9 },
+ "end": { "line": 53, "column": 25 }
+ },
+ "loc": {
+ "start": { "line": 53, "column": 34 },
+ "end": { "line": 60, "column": 1 }
+ },
+ "line": 53
+ },
+ "3": {
+ "name": "isValidAnalyticsId",
+ "decl": {
+ "start": { "line": 67, "column": 9 },
+ "end": { "line": 67, "column": 27 }
+ },
+ "loc": {
+ "start": { "line": 67, "column": 32 },
+ "end": { "line": 76, "column": 1 }
+ },
+ "line": 67
+ },
+ "4": {
+ "name": "isValidSearchKey",
+ "decl": {
+ "start": { "line": 83, "column": 9 },
+ "end": { "line": 83, "column": 25 }
+ },
+ "loc": {
+ "start": { "line": 83, "column": 37 },
+ "end": { "line": 90, "column": 1 }
+ },
+ "line": 83
+ },
+ "5": {
+ "name": "isValidSearchAffiliate",
+ "decl": {
+ "start": { "line": 97, "column": 9 },
+ "end": { "line": 97, "column": 31 }
+ },
+ "loc": {
+ "start": { "line": 97, "column": 43 },
+ "end": { "line": 104, "column": 1 }
+ },
+ "line": 97
},
"6": {
- "start": { "line": 26, "column": 2 },
- "end": { "line": 28, "column": 3 }
+ "name": "isValidVerificationToken",
+ "decl": {
+ "start": { "line": 111, "column": 9 },
+ "end": { "line": 111, "column": 33 }
+ },
+ "loc": {
+ "start": { "line": 111, "column": 41 },
+ "end": { "line": 118, "column": 1 }
+ },
+ "line": 111
},
"7": {
- "start": { "line": 27, "column": 4 },
- "end": { "line": 27, "column": 17 }
+ "name": "numberWithCommas",
+ "decl": {
+ "start": { "line": 125, "column": 9 },
+ "end": { "line": 125, "column": 25 }
+ },
+ "loc": {
+ "start": { "line": 125, "column": 34 },
+ "end": { "line": 144, "column": 1 }
+ },
+ "line": 125
},
"8": {
- "start": { "line": 30, "column": 29 },
- "end": { "line": 30, "column": 41 }
+ "name": "sortByProp",
+ "decl": {
+ "start": { "line": 153, "column": 9 },
+ "end": { "line": 153, "column": 19 }
+ },
+ "loc": {
+ "start": { "line": 153, "column": 34 },
+ "end": { "line": 182, "column": 1 }
+ },
+ "line": 153
},
"9": {
- "start": { "line": 31, "column": 2 },
- "end": { "line": 31, "column": 41 }
+ "name": "(anonymous_9)",
+ "decl": {
+ "start": { "line": 159, "column": 19 },
+ "end": { "line": 159, "column": 20 }
+ },
+ "loc": {
+ "start": { "line": 159, "column": 29 },
+ "end": { "line": 181, "column": 3 }
+ },
+ "line": 159
},
"10": {
- "start": { "line": 35, "column": 2 },
- "end": { "line": 37, "column": 3 }
+ "name": "readableDate",
+ "decl": {
+ "start": { "line": 191, "column": 9 },
+ "end": { "line": 191, "column": 21 }
+ },
+ "loc": {
+ "start": { "line": 191, "column": 31 },
+ "end": { "line": 198, "column": 1 }
+ },
+ "line": 191
},
"11": {
- "start": { "line": 36, "column": 4 },
- "end": { "line": 36, "column": 17 }
+ "name": "getStateFromDates",
+ "decl": {
+ "start": { "line": 207, "column": 9 },
+ "end": { "line": 207, "column": 26 }
+ },
+ "loc": {
+ "start": { "line": 207, "column": 42 },
+ "end": { "line": 256, "column": 1 }
+ },
+ "line": 207
},
"12": {
- "start": { "line": 39, "column": 25 },
- "end": { "line": 39, "column": 37 }
+ "name": "htmlDateString",
+ "decl": {
+ "start": { "line": 264, "column": 9 },
+ "end": { "line": 264, "column": 23 }
+ },
+ "loc": {
+ "start": { "line": 264, "column": 33 },
+ "end": { "line": 276, "column": 1 }
+ },
+ "line": 264
},
"13": {
- "start": { "line": 40, "column": 2 },
- "end": { "line": 40, "column": 37 }
+ "name": "minNumber",
+ "decl": {
+ "start": { "line": 284, "column": 9 },
+ "end": { "line": 284, "column": 18 }
+ },
+ "loc": {
+ "start": { "line": 284, "column": 31 },
+ "end": { "line": 286, "column": 1 }
+ },
+ "line": 284
},
"14": {
- "start": { "line": 44, "column": 2 },
- "end": { "line": 46, "column": 3 }
+ "name": "uswdsIconWithSize",
+ "decl": {
+ "start": { "line": 296, "column": 9 },
+ "end": { "line": 296, "column": 26 }
+ },
+ "loc": {
+ "start": { "line": 296, "column": 39 },
+ "end": { "line": 305, "column": 1 }
+ },
+ "line": 296
},
"15": {
- "start": { "line": 45, "column": 4 },
- "end": { "line": 45, "column": 17 }
+ "name": "uswdsIcon",
+ "decl": {
+ "start": { "line": 314, "column": 9 },
+ "end": { "line": 314, "column": 18 }
+ },
+ "loc": {
+ "start": { "line": 314, "column": 25 },
+ "end": { "line": 322, "column": 1 }
+ },
+ "line": 314
},
"16": {
- "start": { "line": 50, "column": 4 },
- "end": { "line": 50, "column": 82 }
+ "name": "imageWithClassShortcode",
+ "decl": {
+ "start": { "line": 338, "column": 15 },
+ "end": { "line": 338, "column": 38 }
+ },
+ "loc": {
+ "start": { "line": 345, "column": 2 },
+ "end": { "line": 381, "column": 1 }
+ },
+ "line": 345
},
"17": {
- "start": { "line": 51, "column": 2 },
- "end": { "line": 51, "column": 35 }
- },
- "18": {
- "start": { "line": 55, "column": 2 },
- "end": { "line": 57, "column": 3 }
- },
- "19": {
- "start": { "line": 56, "column": 4 },
- "end": { "line": 56, "column": 17 }
- },
- "20": {
- "start": { "line": 59, "column": 25 },
- "end": { "line": 59, "column": 57 }
- },
- "21": {
- "start": { "line": 60, "column": 2 },
- "end": { "line": 60, "column": 40 }
- },
- "22": {
- "start": { "line": 64, "column": 2 },
- "end": { "line": 66, "column": 3 }
- },
- "23": {
- "start": { "line": 65, "column": 4 },
- "end": { "line": 65, "column": 17 }
- },
- "24": {
- "start": { "line": 68, "column": 31 },
- "end": { "line": 68, "column": 61 }
- },
- "25": {
- "start": { "line": 69, "column": 2 },
- "end": { "line": 69, "column": 46 }
+ "name": "imageShortcode",
+ "decl": {
+ "start": { "line": 399, "column": 15 },
+ "end": { "line": 399, "column": 29 }
+ },
+ "loc": {
+ "start": { "line": 399, "column": 40 },
+ "end": { "line": 401, "column": 1 }
+ },
+ "line": 399
+ }
+ },
+ "branchMap": {
+ "0": {
+ "loc": {
+ "start": { "line": 12, "column": 2 },
+ "end": { "line": 14, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 12, "column": 2 },
+ "end": { "line": 14, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 12
},
- "26": {
- "start": { "line": 73, "column": 2 },
- "end": { "line": 75, "column": 3 }
+ "1": {
+ "loc": {
+ "start": { "line": 12, "column": 6 },
+ "end": { "line": 12, "column": 56 }
+ },
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 12, "column": 6 },
+ "end": { "line": 12, "column": 32 }
+ },
+ {
+ "start": { "line": 12, "column": 36 },
+ "end": { "line": 12, "column": 56 }
+ }
+ ],
+ "line": 12
},
- "27": {
- "start": { "line": 74, "column": 4 },
- "end": { "line": 74, "column": 17 }
+ "2": {
+ "loc": {
+ "start": { "line": 20, "column": 2 },
+ "end": { "line": 28, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 20, "column": 2 },
+ "end": { "line": 28, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 20
},
- "28": {
- "start": { "line": 77, "column": 2 },
- "end": { "line": 77, "column": 72 }
+ "3": {
+ "loc": {
+ "start": { "line": 21, "column": 4 },
+ "end": { "line": 25, "column": 24 }
+ },
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 21, "column": 4 },
+ "end": { "line": 21, "column": 25 }
+ },
+ {
+ "start": { "line": 22, "column": 4 },
+ "end": { "line": 22, "column": 26 }
+ },
+ {
+ "start": { "line": 23, "column": 4 },
+ "end": { "line": 23, "column": 24 }
+ },
+ {
+ "start": { "line": 24, "column": 4 },
+ "end": { "line": 24, "column": 26 }
+ },
+ {
+ "start": { "line": 25, "column": 4 },
+ "end": { "line": 25, "column": 24 }
+ }
+ ],
+ "line": 21
},
- "29": {
- "start": { "line": 78, "column": 21 },
- "end": { "line": 78, "column": 42 }
+ "4": {
+ "loc": {
+ "start": { "line": 40, "column": 2 },
+ "end": { "line": 42, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 40, "column": 2 },
+ "end": { "line": 42, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 40
},
- "30": {
- "start": { "line": 79, "column": 2 },
- "end": { "line": 79, "column": 32 }
+ "5": {
+ "loc": {
+ "start": { "line": 40, "column": 6 },
+ "end": { "line": 40, "column": 45 }
+ },
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 40, "column": 6 },
+ "end": { "line": 40, "column": 21 }
+ },
+ {
+ "start": { "line": 40, "column": 25 },
+ "end": { "line": 40, "column": 45 }
+ }
+ ],
+ "line": 40
},
- "31": {
- "start": { "line": 85, "column": 2 },
- "end": { "line": 87, "column": 3 }
+ "6": {
+ "loc": {
+ "start": { "line": 54, "column": 2 },
+ "end": { "line": 56, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 54, "column": 2 },
+ "end": { "line": 56, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 54
},
- "32": {
- "start": { "line": 86, "column": 4 },
- "end": { "line": 86, "column": 18 }
+ "7": {
+ "loc": {
+ "start": { "line": 54, "column": 6 },
+ "end": { "line": 54, "column": 45 }
+ },
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 54, "column": 6 },
+ "end": { "line": 54, "column": 21 }
+ },
+ {
+ "start": { "line": 54, "column": 25 },
+ "end": { "line": 54, "column": 45 }
+ }
+ ],
+ "line": 54
},
- "33": {
- "start": { "line": 90, "column": 37 },
- "end": { "line": 90, "column": 65 }
+ "8": {
+ "loc": {
+ "start": { "line": 68, "column": 2 },
+ "end": { "line": 70, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 68, "column": 2 },
+ "end": { "line": 70, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 68
},
- "34": {
- "start": { "line": 93, "column": 27 },
- "end": { "line": 93, "column": 76 }
+ "9": {
+ "loc": {
+ "start": { "line": 68, "column": 6 },
+ "end": { "line": 68, "column": 37 }
+ },
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 68, "column": 6 },
+ "end": { "line": 68, "column": 17 }
+ },
+ {
+ "start": { "line": 68, "column": 21 },
+ "end": { "line": 68, "column": 37 }
+ }
+ ],
+ "line": 68
},
- "35": {
- "start": { "line": 96, "column": 2 },
- "end": { "line": 98, "column": 3 }
+ "10": {
+ "loc": {
+ "start": { "line": 84, "column": 2 },
+ "end": { "line": 86, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 84, "column": 2 },
+ "end": { "line": 86, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 84
},
- "36": {
- "start": { "line": 97, "column": 4 },
- "end": { "line": 97, "column": 28 }
+ "11": {
+ "loc": {
+ "start": { "line": 84, "column": 6 },
+ "end": { "line": 84, "column": 51 }
+ },
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 84, "column": 6 },
+ "end": { "line": 84, "column": 24 }
+ },
+ {
+ "start": { "line": 84, "column": 28 },
+ "end": { "line": 84, "column": 51 }
+ }
+ ],
+ "line": 84
},
- "37": {
- "start": { "line": 101, "column": 2 },
- "end": { "line": 101, "column": 46 }
+ "12": {
+ "loc": {
+ "start": { "line": 98, "column": 2 },
+ "end": { "line": 100, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 98, "column": 2 },
+ "end": { "line": 100, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 98
},
- "38": {
- "start": { "line": 105, "column": 2 },
- "end": { "line": 108, "column": 12 }
+ "13": {
+ "loc": {
+ "start": { "line": 98, "column": 6 },
+ "end": { "line": 98, "column": 51 }
+ },
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 98, "column": 6 },
+ "end": { "line": 98, "column": 24 }
+ },
+ {
+ "start": { "line": 98, "column": 28 },
+ "end": { "line": 98, "column": 51 }
+ }
+ ],
+ "line": 98
},
- "39": {
- "start": { "line": 111, "column": 0 },
- "end": { "line": 121, "column": 2 }
- }
- },
- "fnMap": {
- "0": {
- "name": "isValidGitBranch",
- "decl": {
- "start": { "line": 1, "column": 9 },
- "end": { "line": 1, "column": 25 }
+ "14": {
+ "loc": {
+ "start": { "line": 112, "column": 2 },
+ "end": { "line": 114, "column": 3 }
},
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 112, "column": 2 },
+ "end": { "line": 114, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 112
+ },
+ "15": {
"loc": {
- "start": { "line": 1, "column": 34 },
- "end": { "line": 23, "column": 1 }
+ "start": { "line": 112, "column": 6 },
+ "end": { "line": 112, "column": 43 }
},
- "line": 1
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 112, "column": 6 },
+ "end": { "line": 112, "column": 20 }
+ },
+ {
+ "start": { "line": 112, "column": 24 },
+ "end": { "line": 112, "column": 43 }
+ }
+ ],
+ "line": 112
},
- "1": {
- "name": "isValidTwitterHandle",
- "decl": {
- "start": { "line": 25, "column": 9 },
- "end": { "line": 25, "column": 29 }
+ "16": {
+ "loc": {
+ "start": { "line": 127, "column": 2 },
+ "end": { "line": 129, "column": 3 }
},
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 127, "column": 2 },
+ "end": { "line": 129, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 127
+ },
+ "17": {
"loc": {
- "start": { "line": 25, "column": 38 },
- "end": { "line": 32, "column": 1 }
+ "start": { "line": 138, "column": 2 },
+ "end": { "line": 140, "column": 3 }
},
- "line": 25
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 138, "column": 2 },
+ "end": { "line": 140, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 138
},
- "2": {
- "name": "isValidDapAgency",
- "decl": {
- "start": { "line": 34, "column": 9 },
- "end": { "line": 34, "column": 25 }
+ "18": {
+ "loc": {
+ "start": { "line": 154, "column": 2 },
+ "end": { "line": 156, "column": 3 }
},
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 154, "column": 2 },
+ "end": { "line": 156, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 154
+ },
+ "19": {
"loc": {
- "start": { "line": 34, "column": 34 },
- "end": { "line": 41, "column": 1 }
+ "start": { "line": 160, "column": 4 },
+ "end": { "line": 167, "column": 5 }
},
- "line": 34
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 160, "column": 4 },
+ "end": { "line": 167, "column": 5 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 160
},
- "3": {
- "name": "isValidAnalyticsId",
- "decl": {
- "start": { "line": 43, "column": 9 },
- "end": { "line": 43, "column": 27 }
- },
+ "20": {
"loc": {
- "start": { "line": 43, "column": 32 },
- "end": { "line": 52, "column": 1 }
+ "start": { "line": 161, "column": 6 },
+ "end": { "line": 164, "column": 16 }
},
- "line": 43
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 161, "column": 6 },
+ "end": { "line": 161, "column": 27 }
+ },
+ {
+ "start": { "line": 162, "column": 6 },
+ "end": { "line": 162, "column": 16 }
+ },
+ {
+ "start": { "line": 163, "column": 6 },
+ "end": { "line": 163, "column": 27 }
+ },
+ {
+ "start": { "line": 164, "column": 6 },
+ "end": { "line": 164, "column": 16 }
+ }
+ ],
+ "line": 161
},
- "4": {
- "name": "isValidSearchKey",
- "decl": {
- "start": { "line": 54, "column": 9 },
- "end": { "line": 54, "column": 25 }
- },
+ "21": {
"loc": {
- "start": { "line": 54, "column": 37 },
- "end": { "line": 61, "column": 1 }
+ "start": { "line": 169, "column": 18 },
+ "end": { "line": 169, "column": 56 }
},
- "line": 54
+ "type": "cond-expr",
+ "locations": [
+ {
+ "start": { "line": 169, "column": 42 },
+ "end": { "line": 169, "column": 49 }
+ },
+ {
+ "start": { "line": 169, "column": 52 },
+ "end": { "line": 169, "column": 56 }
+ }
+ ],
+ "line": 169
},
- "5": {
- "name": "isValidSearchAffiliate",
- "decl": {
- "start": { "line": 63, "column": 9 },
- "end": { "line": 63, "column": 31 }
- },
+ "22": {
"loc": {
- "start": { "line": 63, "column": 43 },
- "end": { "line": 70, "column": 1 }
+ "start": { "line": 170, "column": 18 },
+ "end": { "line": 170, "column": 56 }
},
- "line": 63
+ "type": "cond-expr",
+ "locations": [
+ {
+ "start": { "line": 170, "column": 42 },
+ "end": { "line": 170, "column": 49 }
+ },
+ {
+ "start": { "line": 170, "column": 52 },
+ "end": { "line": 170, "column": 56 }
+ }
+ ],
+ "line": 170
},
- "6": {
- "name": "isValidVerificationToken",
- "decl": {
- "start": { "line": 72, "column": 9 },
- "end": { "line": 72, "column": 33 }
- },
+ "23": {
"loc": {
- "start": { "line": 72, "column": 41 },
- "end": { "line": 80, "column": 1 }
+ "start": { "line": 172, "column": 4 },
+ "end": { "line": 180, "column": 5 }
},
- "line": 72
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 172, "column": 4 },
+ "end": { "line": 180, "column": 5 }
+ },
+ {
+ "start": { "line": 174, "column": 11 },
+ "end": { "line": 180, "column": 5 }
+ }
+ ],
+ "line": 172
},
- "7": {
- "name": "numberWithCommas",
- "decl": {
- "start": { "line": 83, "column": 9 },
- "end": { "line": 83, "column": 25 }
- },
+ "24": {
"loc": {
- "start": { "line": 83, "column": 34 },
- "end": { "line": 102, "column": 1 }
+ "start": { "line": 172, "column": 8 },
+ "end": { "line": 172, "column": 62 }
},
- "line": 83
+ "type": "binary-expr",
+ "locations": [
+ {
+ "start": { "line": 172, "column": 8 },
+ "end": { "line": 172, "column": 33 }
+ },
+ {
+ "start": { "line": 172, "column": 37 },
+ "end": { "line": 172, "column": 62 }
+ }
+ ],
+ "line": 172
},
- "8": {
- "name": "uswdsIconWithSize",
- "decl": {
- "start": { "line": 104, "column": 9 },
- "end": { "line": 104, "column": 26 }
+ "25": {
+ "loc": {
+ "start": { "line": 174, "column": 11 },
+ "end": { "line": 180, "column": 5 }
},
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 174, "column": 11 },
+ "end": { "line": 180, "column": 5 }
+ },
+ {
+ "start": { "line": 176, "column": 11 },
+ "end": { "line": 180, "column": 5 }
+ }
+ ],
+ "line": 174
+ },
+ "26": {
"loc": {
- "start": { "line": 104, "column": 39 },
- "end": { "line": 109, "column": 1 }
+ "start": { "line": 176, "column": 11 },
+ "end": { "line": 180, "column": 5 }
},
- "line": 104
- }
- },
- "branchMap": {
- "0": {
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 176, "column": 11 },
+ "end": { "line": 180, "column": 5 }
+ },
+ {
+ "start": { "line": 178, "column": 11 },
+ "end": { "line": 180, "column": 5 }
+ }
+ ],
+ "line": 176
+ },
+ "27": {
"loc": {
- "start": { "line": 3, "column": 2 },
- "end": { "line": 5, "column": 3 }
+ "start": { "line": 192, "column": 2 },
+ "end": { "line": 194, "column": 3 }
},
"type": "if",
"locations": [
{
- "start": { "line": 3, "column": 2 },
- "end": { "line": 5, "column": 3 }
+ "start": { "line": 192, "column": 2 },
+ "end": { "line": 194, "column": 3 }
},
{ "start": {}, "end": {} }
],
- "line": 3
+ "line": 192
},
- "1": {
+ "28": {
"loc": {
- "start": { "line": 3, "column": 6 },
- "end": { "line": 3, "column": 56 }
+ "start": { "line": 192, "column": 6 },
+ "end": { "line": 192, "column": 50 }
},
"type": "binary-expr",
"locations": [
{
- "start": { "line": 3, "column": 6 },
- "end": { "line": 3, "column": 32 }
+ "start": { "line": 192, "column": 6 },
+ "end": { "line": 192, "column": 32 }
},
{
- "start": { "line": 3, "column": 36 },
- "end": { "line": 3, "column": 56 }
+ "start": { "line": 192, "column": 36 },
+ "end": { "line": 192, "column": 50 }
}
],
- "line": 3
+ "line": 192
},
- "2": {
+ "29": {
"loc": {
- "start": { "line": 11, "column": 2 },
- "end": { "line": 19, "column": 3 }
+ "start": { "line": 208, "column": 2 },
+ "end": { "line": 210, "column": 3 }
},
"type": "if",
"locations": [
{
- "start": { "line": 11, "column": 2 },
- "end": { "line": 19, "column": 3 }
+ "start": { "line": 208, "column": 2 },
+ "end": { "line": 210, "column": 3 }
},
{ "start": {}, "end": {} }
],
- "line": 11
+ "line": 208
},
- "3": {
+ "30": {
"loc": {
- "start": { "line": 12, "column": 4 },
- "end": { "line": 16, "column": 24 }
+ "start": { "line": 208, "column": 6 },
+ "end": { "line": 208, "column": 23 }
},
"type": "binary-expr",
"locations": [
{
- "start": { "line": 12, "column": 4 },
- "end": { "line": 12, "column": 25 }
- },
- {
- "start": { "line": 13, "column": 4 },
- "end": { "line": 13, "column": 26 }
+ "start": { "line": 208, "column": 6 },
+ "end": { "line": 208, "column": 12 }
},
{
- "start": { "line": 14, "column": 4 },
- "end": { "line": 14, "column": 24 }
- },
+ "start": { "line": 208, "column": 16 },
+ "end": { "line": 208, "column": 23 }
+ }
+ ],
+ "line": 208
+ },
+ "31": {
+ "loc": {
+ "start": { "line": 218, "column": 19 },
+ "end": { "line": 218, "column": 49 }
+ },
+ "type": "cond-expr",
+ "locations": [
{
- "start": { "line": 15, "column": 4 },
- "end": { "line": 15, "column": 26 }
+ "start": { "line": 218, "column": 27 },
+ "end": { "line": 218, "column": 42 }
},
{
- "start": { "line": 16, "column": 4 },
- "end": { "line": 16, "column": 24 }
+ "start": { "line": 218, "column": 45 },
+ "end": { "line": 218, "column": 49 }
}
],
- "line": 12
+ "line": 218
},
- "4": {
+ "32": {
"loc": {
- "start": { "line": 26, "column": 2 },
- "end": { "line": 28, "column": 3 }
+ "start": { "line": 222, "column": 2 },
+ "end": { "line": 226, "column": 3 }
},
"type": "if",
"locations": [
{
- "start": { "line": 26, "column": 2 },
- "end": { "line": 28, "column": 3 }
+ "start": { "line": 222, "column": 2 },
+ "end": { "line": 226, "column": 3 }
},
{ "start": {}, "end": {} }
],
- "line": 26
+ "line": 222
},
- "5": {
+ "33": {
"loc": {
- "start": { "line": 26, "column": 6 },
- "end": { "line": 26, "column": 45 }
+ "start": { "line": 229, "column": 2 },
+ "end": { "line": 253, "column": 3 }
},
- "type": "binary-expr",
+ "type": "if",
"locations": [
{
- "start": { "line": 26, "column": 6 },
- "end": { "line": 26, "column": 21 }
+ "start": { "line": 229, "column": 2 },
+ "end": { "line": 253, "column": 3 }
},
- {
- "start": { "line": 26, "column": 25 },
- "end": { "line": 26, "column": 45 }
- }
+ { "start": {}, "end": {} }
],
- "line": 26
+ "line": 229
},
- "6": {
+ "34": {
"loc": {
- "start": { "line": 35, "column": 2 },
- "end": { "line": 37, "column": 3 }
+ "start": { "line": 236, "column": 4 },
+ "end": { "line": 240, "column": 5 }
},
"type": "if",
"locations": [
{
- "start": { "line": 35, "column": 2 },
- "end": { "line": 37, "column": 3 }
+ "start": { "line": 236, "column": 4 },
+ "end": { "line": 240, "column": 5 }
},
{ "start": {}, "end": {} }
],
- "line": 35
+ "line": 236
},
- "7": {
+ "35": {
"loc": {
- "start": { "line": 35, "column": 6 },
- "end": { "line": 35, "column": 45 }
+ "start": { "line": 244, "column": 19 },
+ "end": { "line": 244, "column": 56 }
},
"type": "binary-expr",
"locations": [
{
- "start": { "line": 35, "column": 6 },
- "end": { "line": 35, "column": 21 }
+ "start": { "line": 244, "column": 19 },
+ "end": { "line": 244, "column": 30 }
},
{
- "start": { "line": 35, "column": 25 },
- "end": { "line": 35, "column": 45 }
+ "start": { "line": 244, "column": 34 },
+ "end": { "line": 244, "column": 56 }
}
],
- "line": 35
+ "line": 244
},
- "8": {
+ "36": {
"loc": {
- "start": { "line": 44, "column": 2 },
- "end": { "line": 46, "column": 3 }
+ "start": { "line": 246, "column": 4 },
+ "end": { "line": 252, "column": 5 }
},
"type": "if",
"locations": [
{
- "start": { "line": 44, "column": 2 },
- "end": { "line": 46, "column": 3 }
+ "start": { "line": 246, "column": 4 },
+ "end": { "line": 252, "column": 5 }
},
- { "start": {}, "end": {} }
+ {
+ "start": { "line": 248, "column": 11 },
+ "end": { "line": 252, "column": 5 }
+ }
],
- "line": 44
+ "line": 246
},
- "9": {
+ "37": {
"loc": {
- "start": { "line": 44, "column": 6 },
- "end": { "line": 44, "column": 37 }
+ "start": { "line": 246, "column": 8 },
+ "end": { "line": 246, "column": 27 }
},
"type": "binary-expr",
"locations": [
{
- "start": { "line": 44, "column": 6 },
- "end": { "line": 44, "column": 17 }
+ "start": { "line": 246, "column": 8 },
+ "end": { "line": 246, "column": 14 }
},
{
- "start": { "line": 44, "column": 21 },
- "end": { "line": 44, "column": 37 }
+ "start": { "line": 246, "column": 18 },
+ "end": { "line": 246, "column": 27 }
}
],
- "line": 44
+ "line": 246
},
- "10": {
+ "38": {
+ "loc": {
+ "start": { "line": 248, "column": 11 },
+ "end": { "line": 252, "column": 5 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 248, "column": 11 },
+ "end": { "line": 252, "column": 5 }
+ },
+ {
+ "start": { "line": 250, "column": 11 },
+ "end": { "line": 252, "column": 5 }
+ }
+ ],
+ "line": 248
+ },
+ "39": {
"loc": {
- "start": { "line": 55, "column": 2 },
- "end": { "line": 57, "column": 3 }
+ "start": { "line": 265, "column": 2 },
+ "end": { "line": 275, "column": 3 }
},
"type": "if",
"locations": [
{
- "start": { "line": 55, "column": 2 },
- "end": { "line": 57, "column": 3 }
+ "start": { "line": 265, "column": 2 },
+ "end": { "line": 275, "column": 3 }
},
{ "start": {}, "end": {} }
],
- "line": 55
+ "line": 265
},
- "11": {
+ "40": {
"loc": {
- "start": { "line": 55, "column": 6 },
- "end": { "line": 55, "column": 51 }
+ "start": { "line": 265, "column": 6 },
+ "end": { "line": 265, "column": 47 }
},
"type": "binary-expr",
"locations": [
{
- "start": { "line": 55, "column": 6 },
- "end": { "line": 55, "column": 24 }
+ "start": { "line": 265, "column": 6 },
+ "end": { "line": 265, "column": 27 }
},
{
- "start": { "line": 55, "column": 28 },
- "end": { "line": 55, "column": 51 }
+ "start": { "line": 265, "column": 31 },
+ "end": { "line": 265, "column": 47 }
}
],
- "line": 55
+ "line": 265
},
- "12": {
+ "41": {
"loc": {
- "start": { "line": 64, "column": 2 },
- "end": { "line": 66, "column": 3 }
+ "start": { "line": 269, "column": 4 },
+ "end": { "line": 274, "column": 5 }
},
"type": "if",
"locations": [
{
- "start": { "line": 64, "column": 2 },
- "end": { "line": 66, "column": 3 }
+ "start": { "line": 269, "column": 4 },
+ "end": { "line": 274, "column": 5 }
},
- { "start": {}, "end": {} }
+ {
+ "start": { "line": 272, "column": 11 },
+ "end": { "line": 274, "column": 5 }
+ }
],
- "line": 64
+ "line": 269
},
- "13": {
+ "42": {
"loc": {
- "start": { "line": 64, "column": 6 },
- "end": { "line": 64, "column": 51 }
+ "start": { "line": 297, "column": 2 },
+ "end": { "line": 299, "column": 3 }
},
- "type": "binary-expr",
+ "type": "if",
"locations": [
{
- "start": { "line": 64, "column": 6 },
- "end": { "line": 64, "column": 24 }
+ "start": { "line": 297, "column": 2 },
+ "end": { "line": 299, "column": 3 }
},
+ { "start": {}, "end": {} }
+ ],
+ "line": 297
+ },
+ "43": {
+ "loc": {
+ "start": { "line": 315, "column": 2 },
+ "end": { "line": 317, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
{
- "start": { "line": 64, "column": 28 },
- "end": { "line": 64, "column": 51 }
- }
+ "start": { "line": 315, "column": 2 },
+ "end": { "line": 317, "column": 3 }
+ },
+ { "start": {}, "end": {} }
],
- "line": 64
+ "line": 315
},
- "14": {
+ "44": {
"loc": {
- "start": { "line": 73, "column": 2 },
- "end": { "line": 75, "column": 3 }
+ "start": { "line": 351, "column": 2 },
+ "end": { "line": 353, "column": 3 }
},
"type": "if",
"locations": [
{
- "start": { "line": 73, "column": 2 },
- "end": { "line": 75, "column": 3 }
+ "start": { "line": 351, "column": 2 },
+ "end": { "line": 353, "column": 3 }
},
{ "start": {}, "end": {} }
],
- "line": 73
+ "line": 351
},
- "15": {
+ "45": {
"loc": {
- "start": { "line": 73, "column": 6 },
- "end": { "line": 73, "column": 43 }
+ "start": { "line": 363, "column": 15 },
+ "end": { "line": 363, "column": 76 }
},
- "type": "binary-expr",
+ "type": "cond-expr",
"locations": [
{
- "start": { "line": 73, "column": 6 },
- "end": { "line": 73, "column": 20 }
+ "start": { "line": 363, "column": 36 },
+ "end": { "line": 363, "column": 57 }
},
{
- "start": { "line": 73, "column": 24 },
- "end": { "line": 73, "column": 43 }
+ "start": { "line": 363, "column": 60 },
+ "end": { "line": 363, "column": 76 }
}
],
- "line": 73
+ "line": 363
},
- "16": {
+ "46": {
"loc": {
- "start": { "line": 85, "column": 2 },
- "end": { "line": 87, "column": 3 }
+ "start": { "line": 365, "column": 2 },
+ "end": { "line": 367, "column": 3 }
},
"type": "if",
"locations": [
{
- "start": { "line": 85, "column": 2 },
- "end": { "line": 87, "column": 3 }
+ "start": { "line": 365, "column": 2 },
+ "end": { "line": 367, "column": 3 }
},
{ "start": {}, "end": {} }
],
- "line": 85
+ "line": 365
},
- "17": {
+ "47": {
+ "loc": {
+ "start": { "line": 369, "column": 2 },
+ "end": { "line": 371, "column": 3 }
+ },
+ "type": "if",
+ "locations": [
+ {
+ "start": { "line": 369, "column": 2 },
+ "end": { "line": 371, "column": 3 }
+ },
+ { "start": {}, "end": {} }
+ ],
+ "line": 369
+ },
+ "48": {
"loc": {
- "start": { "line": 96, "column": 2 },
- "end": { "line": 98, "column": 3 }
+ "start": { "line": 373, "column": 2 },
+ "end": { "line": 375, "column": 3 }
},
"type": "if",
"locations": [
{
- "start": { "line": 96, "column": 2 },
- "end": { "line": 98, "column": 3 }
+ "start": { "line": 373, "column": 2 },
+ "end": { "line": 375, "column": 3 }
},
{ "start": {}, "end": {} }
],
- "line": 96
+ "line": 373
+ },
+ "49": {
+ "loc": {
+ "start": { "line": 378, "column": 115 },
+ "end": { "line": 378, "column": 139 }
+ },
+ "type": "cond-expr",
+ "locations": [
+ {
+ "start": { "line": 378, "column": 123 },
+ "end": { "line": 378, "column": 134 }
+ },
+ {
+ "start": { "line": 378, "column": 137 },
+ "end": { "line": 378, "column": 139 }
+ }
+ ],
+ "line": 378
+ },
+ "50": {
+ "loc": {
+ "start": { "line": 378, "column": 142 },
+ "end": { "line": 378, "column": 174 }
+ },
+ "type": "cond-expr",
+ "locations": [
+ {
+ "start": { "line": 378, "column": 154 },
+ "end": { "line": 378, "column": 169 }
+ },
+ {
+ "start": { "line": 378, "column": 172 },
+ "end": { "line": 378, "column": 174 }
+ }
+ ],
+ "line": 378
+ },
+ "51": {
+ "loc": {
+ "start": { "line": 378, "column": 177 },
+ "end": { "line": 378, "column": 207 }
+ },
+ "type": "cond-expr",
+ "locations": [
+ {
+ "start": { "line": 378, "column": 188 },
+ "end": { "line": 378, "column": 202 }
+ },
+ {
+ "start": { "line": 378, "column": 205 },
+ "end": { "line": 378, "column": 207 }
+ }
+ ],
+ "line": 378
}
},
"s": {
- "0": 18,
- "1": 3,
+ "0": 15,
+ "1": 15,
"2": 15,
- "3": 15,
- "4": 4,
- "5": 11,
- "6": 12,
- "7": 2,
- "8": 10,
- "9": 10,
- "10": 13,
- "11": 2,
- "12": 11,
- "13": 11,
- "14": 14,
- "15": 2,
- "16": 12,
- "17": 12,
- "18": 12,
- "19": 2,
- "20": 10,
- "21": 10,
- "22": 14,
- "23": 2,
- "24": 12,
- "25": 12,
- "26": 10,
- "27": 2,
- "28": 8,
- "29": 8,
- "30": 8,
- "31": 10,
- "32": 4,
- "33": 6,
- "34": 6,
+ "3": 18,
+ "4": 3,
+ "5": 15,
+ "6": 15,
+ "7": 4,
+ "8": 11,
+ "9": 12,
+ "10": 2,
+ "11": 10,
+ "12": 10,
+ "13": 13,
+ "14": 2,
+ "15": 11,
+ "16": 11,
+ "17": 14,
+ "18": 2,
+ "19": 12,
+ "20": 12,
+ "21": 12,
+ "22": 2,
+ "23": 10,
+ "24": 10,
+ "25": 14,
+ "26": 2,
+ "27": 12,
+ "28": 12,
+ "29": 10,
+ "30": 2,
+ "31": 8,
+ "32": 8,
+ "33": 10,
+ "34": 4,
"35": 6,
- "36": 4,
- "37": 2,
- "38": 5,
- "39": 9
+ "36": 6,
+ "37": 6,
+ "38": 4,
+ "39": 2,
+ "40": 8,
+ "41": 0,
+ "42": 8,
+ "43": 8,
+ "44": 17,
+ "45": 1,
+ "46": 16,
+ "47": 16,
+ "48": 16,
+ "49": 6,
+ "50": 10,
+ "51": 1,
+ "52": 9,
+ "53": 2,
+ "54": 7,
+ "55": 10,
+ "56": 6,
+ "57": 4,
+ "58": 8,
+ "59": 2,
+ "60": 6,
+ "61": 6,
+ "62": 6,
+ "63": 6,
+ "64": 4,
+ "65": 4,
+ "66": 6,
+ "67": 5,
+ "68": 5,
+ "69": 3,
+ "70": 5,
+ "71": 5,
+ "72": 5,
+ "73": 3,
+ "74": 2,
+ "75": 1,
+ "76": 1,
+ "77": 1,
+ "78": 0,
+ "79": 0,
+ "80": 0,
+ "81": 0,
+ "82": 0,
+ "83": 0,
+ "84": 5,
+ "85": 5,
+ "86": 0,
+ "87": 5,
+ "88": 9,
+ "89": 5,
+ "90": 4,
+ "91": 5,
+ "92": 5,
+ "93": 5,
+ "94": 5,
+ "95": 5,
+ "96": 1,
+ "97": 5,
+ "98": 5,
+ "99": 5,
+ "100": 4,
+ "101": 4,
+ "102": 2,
+ "103": 4,
+ "104": 2,
+ "105": 4,
+ "106": 2,
+ "107": 4,
+ "108": 4,
+ "109": 0,
+ "110": 15
},
"f": {
"0": 18,
@@ -1426,7 +3009,16 @@
"5": 14,
"6": 10,
"7": 10,
- "8": 5
+ "8": 8,
+ "9": 17,
+ "10": 10,
+ "11": 8,
+ "12": 0,
+ "13": 5,
+ "14": 5,
+ "15": 9,
+ "16": 5,
+ "17": 0
},
"b": {
"0": [3, 15],
@@ -1446,10 +3038,44 @@
"14": [2, 8],
"15": [10, 9],
"16": [4, 6],
- "17": [4, 2]
+ "17": [4, 2],
+ "18": [0, 8],
+ "19": [1, 16],
+ "20": [17, 16, 16, 16],
+ "21": [15, 1],
+ "22": [14, 2],
+ "23": [6, 10],
+ "24": [16, 8],
+ "25": [1, 9],
+ "26": [2, 7],
+ "27": [6, 4],
+ "28": [10, 4],
+ "29": [2, 6],
+ "30": [8, 3],
+ "31": [5, 1],
+ "32": [4, 2],
+ "33": [5, 1],
+ "34": [3, 2],
+ "35": [5, 3],
+ "36": [3, 2],
+ "37": [5, 4],
+ "38": [1, 1],
+ "39": [0, 0],
+ "40": [0, 0],
+ "41": [0, 0],
+ "42": [0, 5],
+ "43": [5, 4],
+ "44": [1, 4],
+ "45": [0, 4],
+ "46": [2, 2],
+ "47": [2, 2],
+ "48": [2, 2],
+ "49": [2, 2],
+ "50": [2, 2],
+ "51": [2, 2]
},
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
- "hash": "52f9cdf79f955728e3bb9a2b6249622f5e3e6290"
+ "hash": "432a954fc669aa9fbd9b86a4af51894bbf4510e0"
},
"/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/js/positions.js": {
"path": "/Users/ximenakilroe/Local Sites/gsa/tts.gsa.gov/js/positions.js",