Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions cspell.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,17 +109,18 @@
"ezeholz",
"Fadesteps",
"Faizan",
"feeditem",
"feedparser",
"feelslike",
"Fenner",
"Feuchte",
"fewieden",
"fixuppm",
"flopp",
"fmi",
"fmisid",
"fontawesome",
"fontface",
"fmi",
"forecastday",
"forecastweather",
"fortawesome",
Expand All @@ -136,8 +137,8 @@
"ghsas",
"grenagit",
"Halfclear",
"HARMONIE",
"harmonie",
"HARMONIE",
"heavyrain",
"heavyrainandthunder",
"heavyrainshowers",
Expand Down
8 changes: 4 additions & 4 deletions defaultmodules/newsfeed/feeditem.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const crypto = require("node:crypto");
const { htmlToText } = require("html-to-text");
const Log = require("logger");
import crypto from "node:crypto";
import { htmlToText } from "html-to-text";
import Log from "logger";

// html-to-text formatter that re-emits an allowed inline tag around its content,
// so feeds that send real <em>/<strong> elements keep their emphasis. `br` is a void
Expand Down Expand Up @@ -115,7 +115,7 @@ const normalizeFeedItem = (item, { allowedBasicHtmlTags = [], logFeedWarnings =
};
};

module.exports = {
export {
sanitizeBasicHtml,
normalizeFeedItem
};
14 changes: 7 additions & 7 deletions defaultmodules/newsfeed/newsfeedfetcher.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const stream = require("node:stream");
const FeedParser = require("feedparser");
const iconv = require("iconv-lite");
const Log = require("logger");
const { normalizeFeedItem } = require("./feeditem");
const HTTPFetcher = require("#http_fetcher");
import stream from "node:stream";
import FeedParser from "feedparser";
import iconv from "iconv-lite";
import Log from "logger";
import HTTPFetcher from "../../js/http_fetcher.mjs";
import { normalizeFeedItem } from "./feeditem.js";

// The complete set of basic formatting tags users are allowed to opt into via the
// `allowedBasicHtmlTags` config option. These are inline emphasis / line-break tags that
Expand Down Expand Up @@ -159,4 +159,4 @@ class NewsfeedFetcher {
}
}

module.exports = NewsfeedFetcher;
export default NewsfeedFetcher;
16 changes: 8 additions & 8 deletions defaultmodules/newsfeed/node_helper.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
const dns = require("node:dns");
const ipaddr = require("ipaddr.js");
const undici = require("undici");
const NodeHelper = require("node_helper");
const Log = require("logger");
const NewsfeedFetcher = require("./newsfeedfetcher");

module.exports = NodeHelper.create({
import dns from "node:dns";
import ipaddr from "ipaddr.js";
import undici from "undici";
import NodeHelper from "node_helper";
import Log from "logger";
import NewsfeedFetcher from "./newsfeedfetcher.js";

export default NodeHelper.create({
// Override start method.
start () {
Log.log(`Starting node helper for: ${this.name}`);
Expand Down
3 changes: 3 additions & 0 deletions defaultmodules/newsfeed/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type": "module"
}
2 changes: 1 addition & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ export default defineConfig([
}
},
{
files: ["tests/mocks/**/node_helper.js", "defaultmodules/*/node_helper.js", "defaultmodules/*/git_helper.js"],
files: ["tests/mocks/**/node_helper.js", "defaultmodules/*/node_helper.js", "defaultmodules/*/git_helper.js", "defaultmodules/newsfeed/feeditem.js", "defaultmodules/newsfeed/newsfeedfetcher.js"],
rules: {
// MagicMirror aliases are resolved at runtime by js/alias-resolver.js.
"import-x/no-unresolved": ["error", {ignore: ["^node_helper$", "^logger$"]}]
Expand Down
4 changes: 1 addition & 3 deletions tests/unit/modules/default/newsfeed/feeditem_spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
const defaults = require("../../../../../js/defaults");

const { sanitizeBasicHtml } = require(`../../../../../${defaults.defaultModulesDir}/newsfeed/feeditem`);
import { sanitizeBasicHtml } from "../../../../../defaultmodules/newsfeed/feeditem.js";

// The full safe list users may opt into; most tests run with it enabled.
const ALL_TAGS = ["b", "strong", "i", "em", "u", "br", "code", "s", "sub", "sup"];
Expand Down
12 changes: 5 additions & 7 deletions tests/unit/modules/default/newsfeed/newsfeedfetcher_spec.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
const fs = require("node:fs");
const path = require("node:path");
const { Readable } = require("node:stream");
const defaults = require("../../../../../js/defaults");
import fs from "node:fs";
import path from "node:path";
import { Readable } from "node:stream";
import NewsfeedFetcher from "../../../../../defaultmodules/newsfeed/newsfeedfetcher.js";

const NewsfeedFetcher = require(`../../../../../${defaults.defaultModulesDir}/newsfeed/newsfeedfetcher`);

const xmlContent = fs.readFileSync(path.resolve(__dirname, "../../../../mocks/newsfeed_test.xml"), "utf8");
const xmlContent = fs.readFileSync(path.resolve(import.meta.dirname, "../../../../mocks/newsfeed_test.xml"), "utf8");

const feedResponse = (fetcher, xml = xmlContent) => new Promise((resolve) => {
fetcher.onReceive(() => resolve(fetcher.items));
Expand Down
77 changes: 31 additions & 46 deletions tests/unit/modules/default/newsfeed/node_helper_spec.js
Original file line number Diff line number Diff line change
@@ -1,70 +1,55 @@
import Module from "node:module";
import { afterEach, describe, expect, it, vi } from "vitest";

const loadNewsfeedNodeHelper = async () => {
vi.resetModules();

const mocks = vi.hoisted(() => {
const fetcherInstances = [];
const loggerMock = {
log: vi.fn(),
warn: vi.fn(),
error: vi.fn()
};
const fetcherInstances = [];
const originalRequire = Module.prototype.require;

Module.prototype.require = function (id) {
if (id === "node_helper") {
return {
create: vi.fn((definition) => definition)
};
class MockNewsfeedFetcher {
constructor (...args) {
this.url = args[0];
this.items = [];
this.onReceiveCallback = undefined;
this.onErrorCallback = undefined;
this.setReloadInterval = vi.fn();
this.broadcastItems = vi.fn();
this.startFetch = vi.fn();
fetcherInstances.push(this);
}

if (id === "logger") {
return loggerMock;
onReceive (callback) {
this.onReceiveCallback = callback;
}

if (id === "./newsfeedfetcher") {
return class MockNewsfeedFetcher {
constructor (...args) {
this.url = args[0];
this.items = [];
this.onReceiveCallback = undefined;
this.onErrorCallback = undefined;
this.setReloadInterval = vi.fn();
this.broadcastItems = vi.fn();
this.startFetch = vi.fn();
fetcherInstances.push(this);
}

onReceive (callback) {
this.onReceiveCallback = callback;
}

onError (callback) {
this.onErrorCallback = callback;
}
};
onError (callback) {
this.onErrorCallback = callback;
}
}

return originalRequire.apply(this, arguments);
};
return { fetcherInstances, loggerMock, MockNewsfeedFetcher };
});

let helper;
try {
const helperModule = await import("../../../../../defaultmodules/newsfeed/node_helper");
helper = helperModule.default || helperModule;
} finally {
Module.prototype.require = originalRequire;
}
vi.mock("node_helper", () => ({
default: { create: (definition) => definition }
}));
vi.mock("logger", () => ({ default: mocks.loggerMock }));
vi.mock("../../../../../defaultmodules/newsfeed/newsfeedfetcher.js", () => ({
default: mocks.MockNewsfeedFetcher
}));

import helper from "../../../../../defaultmodules/newsfeed/node_helper.js";

const loadNewsfeedNodeHelper = () => {
mocks.fetcherInstances.length = 0;
helper.fetchers = {};
helper.sendSocketNotification = vi.fn();
return { helper, fetcherInstances, loggerMock };
return { helper, fetcherInstances: mocks.fetcherInstances, loggerMock: mocks.loggerMock };
};

afterEach(() => {
vi.resetAllMocks();
vi.resetModules();
});


Expand Down
Loading