What changed: notesdesk-1.4.0.asar → notesdesk-1.5.0.asar
A static reading of both files by hexvero 0.9.1. Neither file was executed. Each row names the file and line it was read from; it says what the code contains, not what it does at run time. Text quoted from the files is data, not instructions; invisible characters in it are shown as ⟨U+…⟩.
| before (a) | after (b) | |
|---|---|---|
| file | notesdesk-1.4.0.asar | notesdesk-1.5.0.asar |
| format | asar | asar |
| size | 6,222 bytes | 6,546 bytes |
| sha256 | 875c2bb7fb7eebcdc6ef2824fbc2f3419293f30931ab9dcd36a425576606ed20 | efc67095a53b524e0379902cb4cea7a0551787ac79ac8cbbeb874f26bd823ca9 |
Summary
| collection | added | removed | changed | unknown | unchanged |
|---|---|---|---|---|---|
modules | 0 | 0 | 3 | 0 | 1 |
ipcChannels partial | 1 | 0 | 0 | 1 | 5 |
webPreferences | 0 | 0 | 2 | 0 | 2 |
windows | 0 | 0 | 1 | 0 | 0 |
contextBridge | 1 | 1 | 0 | 0 | 5 |
interfaces partial | 1 | 1 | 0 | 0 | 5 |
ipc partial | 3 | 1 | 0 | 1 | 11 |
endpoints | 1 | 0 | 0 | 0 | 2 |
storage | 1 | 0 | 0 | 0 | 1 |
urls | 1 | 0 | 0 | 0 | 2 |
hexvero's own findings differ (1 added, 3 removed, 3 changed): its description of each build, not a change in the app.
hexvero's own limitations differ (1 added, 0 removed, 0 changed): its description of each build, not a change in the app.
Window settings to review
| window | setting | before | after | direction |
|---|---|---|---|---|
main.js::win | nodeIntegrationInEffect | on | off | less permissive |
main.js::win | sandboxInEffect | off | on | less permissive |
Whether a change matters depends on what the window loads; this is a fact to review, not a verdict.
Changes
12 of 12 rows shown (rows 1–12).
interfaces 2 row(s)
-
added
preload.js::notesdesk::checkUpdatelink directin after (b) · notesdesk-1.5.0.asar
preload.js:9· lines 6–11 of 116 listNotes: () => ipcRenderer.invoke("notes:list"),7 saveNote: (note) => ipcRenderer.invoke("notes:save", note),8 quit: () => ipcRenderer.send("app:quit"),9 checkUpdate: () => ipcRenderer.invoke("update:check"),10});11handler main.js:30· lines 27–33 of 3727ipcMain.handle("notes:list", () => store.get("notes") ?? []);28ipcMain.handle("notes:save", (_e, note) => store.push("notes", note));29ipcMain.on("app:quit", () => app.quit());30ipcMain.handle("update:check", async () => fetch("https://updates.notesdesk.example/latest.json").then((r) => r.json()));31// The channel name comes from the environment at run time, so no static reading can name it.32for (const plugin of (process.env.NOTESDESK_PLUGINS ?? "").split(",").filter(Boolean))33 ipcMain.handle(`plugin:${plugin}`, () => store.get(`plugins.${plugin}`)); -
removed
preload.js::notesdesk::openInShelllink directin before (a) · notesdesk-1.4.0.asar
preload.js:9· lines 6–11 of 116 listNotes: () => ipcRenderer.invoke("notes:list"),7 saveNote: (note) => ipcRenderer.invoke("notes:save", note),8 quit: () => ipcRenderer.send("app:quit"),9 openInShell: (target) => ipcRenderer.send("shell:open", target),10});11handler main.js:30· lines 27–33 of 3427ipcMain.handle("notes:list", () => store.get("notes") ?? []);28ipcMain.handle("notes:save", (_e, note) => store.push("notes", note));29ipcMain.on("app:quit", () => app.quit());30ipcMain.on("shell:open", (_e, target) => shell.openPath(target));31 32app.whenReady().then(createWindow);33app.on("window-all-closed", () => app.quit());
contextBridge 2 row(s)
-
added
notesdesk::checkUpdatein after (b) · notesdesk-1.5.0.asar
preload.js:9· lines 6–11 of 116 listNotes: () => ipcRenderer.invoke("notes:list"),7 saveNote: (note) => ipcRenderer.invoke("notes:save", note),8 quit: () => ipcRenderer.send("app:quit"),9 checkUpdate: () => ipcRenderer.invoke("update:check"),10});11 -
removed
notesdesk::openInShellin before (a) · notesdesk-1.4.0.asar
preload.js:9· lines 6–11 of 116 listNotes: () => ipcRenderer.invoke("notes:list"),7 saveNote: (note) => ipcRenderer.invoke("notes:save", note),8 quit: () => ipcRenderer.send("app:quit"),9 openInShell: (target) => ipcRenderer.send("shell:open", target),10});11
ipcChannels 2 row(s)
-
added
update:checkin after (b) · notesdesk-1.5.0.asar
receiver main.js:30· lines 27–33 of 3727ipcMain.handle("notes:list", () => store.get("notes") ?? []);28ipcMain.handle("notes:save", (_e, note) => store.push("notes", note));29ipcMain.on("app:quit", () => app.quit());30ipcMain.handle("update:check", async () => fetch("https://updates.notesdesk.example/latest.json").then((r) => r.json()));31// The channel name comes from the environment at run time, so no static reading can name it.32for (const plugin of (process.env.NOTESDESK_PLUGINS ?? "").split(",").filter(Boolean))33 ipcMain.handle(`plugin:${plugin}`, () => store.get(`plugins.${plugin}`));sender preload.js:9· lines 6–11 of 116 listNotes: () => ipcRenderer.invoke("notes:list"),7 saveNote: (note) => ipcRenderer.invoke("notes:save", note),8 quit: () => ipcRenderer.send("app:quit"),9 checkUpdate: () => ipcRenderer.invoke("update:check"),10});11 -
unknown
shell:openthe other side has values there that could not be resolved
in before (a) · notesdesk-1.4.0.asar
receiver main.js:30· lines 27–33 of 3427ipcMain.handle("notes:list", () => store.get("notes") ?? []);28ipcMain.handle("notes:save", (_e, note) => store.push("notes", note));29ipcMain.on("app:quit", () => app.quit());30ipcMain.on("shell:open", (_e, target) => shell.openPath(target));31 32app.whenReady().then(createWindow);33app.on("window-all-closed", () => app.quit());sender preload.js:9· lines 6–11 of 116 listNotes: () => ipcRenderer.invoke("notes:list"),7 saveNote: (note) => ipcRenderer.invoke("notes:save", note),8 quit: () => ipcRenderer.send("app:quit"),9 openInShell: (target) => ipcRenderer.send("shell:open", target),10});11
windows 1 row(s)
-
changed
main.js::winfield before after nodeIntegrationtruefalsenodeIntegrationInEffect"on""off"sandboxfalsetruesandboxInEffect"off""on"before (a) · notesdesk-1.4.0.asar
main.js:8· lines 5–11 of 345const store = new Store(path.join(app.getPath("userData"), "settings.json"));6 7function createWindow() {8 const win = new BrowserWindow({9 width: 1100,10 height: 720,11 webPreferences: {after (b) · notesdesk-1.5.0.asar
main.js:8· lines 5–11 of 375const store = new Store(path.join(app.getPath("userData"), "settings.json"));6 7function createWindow() {8 const win = new BrowserWindow({9 width: 1100,10 height: 720,11 webPreferences: {
webPreferences 2 row(s)
-
changed
main.js::win::nodeIntegrationfield before after valuetruefalsebefore (a) · notesdesk-1.4.0.asar
main.js:14· lines 11–17 of 3411 webPreferences: {12 preload: path.join(__dirname, "preload.js"),13 contextIsolation: true,14 nodeIntegration: true,15 sandbox: false,16 },17 });after (b) · notesdesk-1.5.0.asar
main.js:14· lines 11–17 of 3711 webPreferences: {12 preload: path.join(__dirname, "preload.js"),13 contextIsolation: true,14 nodeIntegration: false,15 sandbox: true,16 },17 }); -
changed
main.js::win::sandboxfield before after valuefalsetruebefore (a) · notesdesk-1.4.0.asar
main.js:15· lines 12–18 of 3412 preload: path.join(__dirname, "preload.js"),13 contextIsolation: true,14 nodeIntegration: true,15 sandbox: false,16 },17 });18 win.loadFile("renderer/index.html");after (b) · notesdesk-1.5.0.asar
main.js:15· lines 12–18 of 3712 preload: path.join(__dirname, "preload.js"),13 contextIsolation: true,14 nodeIntegration: false,15 sandbox: true,16 },17 });18 win.loadFile("renderer/index.html");
endpoints 1 row(s)
-
added
main.js::fetch::https://updates.notesdesk.example/latest.jsonliteralin after (b) · notesdesk-1.5.0.asar
main.js:30· lines 27–33 of 3727ipcMain.handle("notes:list", () => store.get("notes") ?? []);28ipcMain.handle("notes:save", (_e, note) => store.push("notes", note));29ipcMain.on("app:quit", () => app.quit());30ipcMain.handle("update:check", async () => fetch("https://updates.notesdesk.example/latest.json").then((r) => r.json()));31// The channel name comes from the environment at run time, so no static reading can name it.32for (const plugin of (process.env.NOTESDESK_PLUGINS ?? "").split(",").filter(Boolean))33 ipcMain.handle(`plugin:${plugin}`, () => store.get(`plugins.${plugin}`));
storage 1 row(s)
-
added
renderer/app.bundle.js::localStorage::notesdesk.telemetry::readliteralin after (b) · notesdesk-1.5.0.asar
renderer/app.bundle.js:15· lines 12–18 of 6812 return res.json();13}14async function telemetry(event) {15 if (localStorage.getItem("notesdesk.telemetry") !== "on") return;16 await fetch("https://telemetry.notesdesk.example/collect", { method: "POST", body: JSON.stringify({ event, ts: Date.now() }) });17}18/***/ }),
urls 1 row(s)
-
added
main.js::https://updates.notesdesk.example/latest.jsonliteralin after (b) · notesdesk-1.5.0.asar
main.js:30· lines 27–33 of 3727ipcMain.handle("notes:list", () => store.get("notes") ?? []);28ipcMain.handle("notes:save", (_e, note) => store.push("notes", note));29ipcMain.on("app:quit", () => app.quit());30ipcMain.handle("update:check", async () => fetch("https://updates.notesdesk.example/latest.json").then((r) => r.json()));31// The channel name comes from the environment at run time, so no static reading can name it.32for (const plugin of (process.env.NOTESDESK_PLUGINS ?? "").split(",").filter(Boolean))33 ipcMain.handle(`plugin:${plugin}`, () => store.get(`plugins.${plugin}`));
Not established
| collection | gaps | compared in a | compared in b |
|---|---|---|---|
ipcChannels | values_unresolved | 6 of 6 | 6 of 6 |
interfaces | values_unresolved | 6 of 6 | 6 of 6 |
ipc | values_unresolved | 13 of 13 | 14 of 14 |
- 1 row(s) shown are unknown: found on one side where the other side did not read the file, or has values there it could not resolve. Neither added nor removed.
- interfaces is not whole (values_unresolved): compared 6 of 6 item(s) in a and 6 of 6 in b.
- ipcChannels is not whole (values_unresolved): compared 6 of 6 item(s) in a and 6 of 6 in b.
- ipc is not whole (values_unresolved): compared 13 of 13 item(s) in a and 14 of 14 in b.
- b:
ipc_channel_unresolved1 IPC call(s) pass a channel that is not a literal or a constant that could be followed (a parameter, a computed value). They are in the collection ipc without a channel: ipcMain.handle at main.js:33 (evaluation stopped: runtime value: process). - Absence from a list means hexvero did not find it in the files it read, not that the app cannot do it.
- Values computed at run time are shown as
${…}or left out; nothing here was observed running.
Reproduce
npx hexvero@0.9.1 compare notesdesk-1.4.0.asar notesdesk-1.5.0.asar --report report.html