Skip to content

Commit 86bf702

Browse files
authored
feat(scaffold/builder): check length of pref number value (#114)
* feat: check length of pref number value * test: update tests
1 parent 5ea6364 commit 86bf702

7 files changed

Lines changed: 33 additions & 1 deletion

File tree

packages/scaffold/src/core/builder.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { copy, emptyDir, move, outputFile, outputJSON, readJSON, writeJson } fro
1212
import styleText from "node-style-text";
1313
import { glob } from "tinyglobby";
1414
import { generateHash } from "../utils/crypto.js";
15+
import { is32BitNumber } from "../utils/number.js";
1516
import { PrefsManager, renderPluginPrefsDts } from "../utils/prefs-manager.js";
1617
import { dateFormat, replaceInFile, toArray } from "../utils/string.js";
1718
import { Base } from "./base.js";
@@ -268,6 +269,22 @@ export default class Build extends Base {
268269
const prefsWithPrefix = prefsManager.getPrefsWithPrefix(prefix);
269270
const prefsWithoutPrefix = prefsManager.getPrefsWithoutPrefix(prefix);
270271

272+
// Checks if the preference value for the number type is less than 32 bits.
273+
// Since the underlying Preference is implemented in C++,
274+
// although firefox specifies the preference value for the number type as long int,
275+
// the length of long int is different on each operating system.
276+
// e.g. on Windows x64:
277+
// Zotero Prefs.set("extensions.test.number" 22222222222222222)
278+
// zotero.Prefs.get("extensions.test.number") // return 1383176888 but expected 22222222222222222
279+
const prefs = prefsManager.getPrefs();
280+
Object.entries(prefs).forEach(([key, value]) => {
281+
if (typeof value === "number") {
282+
if (!is32BitNumber(value)) {
283+
this.logger.warn(`Pref key '${styleText.blue(key)}' is a number, but is more than 4 bytes, which can be problematic on some OS.`);
284+
}
285+
}
286+
});
287+
271288
// Generate prefs.d.ts
272289
if (dts) {
273290
const dtsContent = renderPluginPrefsDts(prefsWithoutPrefix);

packages/scaffold/src/core/builder/prefs.ts

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* Check if a number is a C++ integer.
3+
*/
4+
export function is32BitNumber(n: number): boolean {
5+
return Number.isInteger(n)
6+
&& n >= -2147483648
7+
&& n <= 2147483647;
8+
}

packages/scaffold/test/e2e/fixtures/static/prefs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ pref("fake-number", "123");
1010
pref("templateLiteral", `{
1111
"key": "value"
1212
}`);
13+
pref("long-number", 2222222222222222);

packages/scaffold/test/e2e/snap/dist/addon/prefs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ pref("extensions.testplugin.number", 123);
44
pref("extensions.testplugin.break-line", "123");
55
pref("extensions.testplugin.fake-number", "123");
66
pref("extensions.testplugin.templateLiteral", '{\n "key": "value" \n}');
7+
pref("extensions.testplugin.long-number", 2222222222222222);

packages/scaffold/test/e2e/snap/typings/prefs.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ declare namespace _ZoteroTypes {
1313
"break-line": string;
1414
"fake-number": string;
1515
"templateLiteral": string;
16+
"long-number": number;
1617
};
1718
}
1819
}

packages/scaffold/test/e2e/tests/build.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ describe("#build", () => {
2626
}
2727
});
2828

29-
it("should output correct warnings", () => {
29+
it("should output correct warnings - ftl", () => {
3030
expect(stdout.toString()).toEqual(expect.stringContaining("meaasge-3"));
3131
});
32+
33+
it("should output correct warnings - pref long int number", () => {
34+
expect(stdout.toString()).toEqual(expect.stringContaining("is a number, but is more than 4 bytes, which can be problematic on some OS."));
35+
});
3236
});

0 commit comments

Comments
 (0)