whopper 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/browser/index.test.d.ts +2 -0
  2. package/dist/browser/index.test.d.ts.map +1 -0
  3. package/dist/browser/index.test.js +181 -0
  4. package/dist/browser/index.test.js.map +1 -0
  5. package/dist/browser/utils.test.d.ts +2 -0
  6. package/dist/browser/utils.test.d.ts.map +1 -0
  7. package/dist/browser/utils.test.js +33 -0
  8. package/dist/browser/utils.test.js.map +1 -0
  9. package/dist/cli.test.d.ts +2 -0
  10. package/dist/cli.test.d.ts.map +1 -0
  11. package/dist/cli.test.js +52 -0
  12. package/dist/cli.test.js.map +1 -0
  13. package/dist/commands/banner.test.d.ts +2 -0
  14. package/dist/commands/banner.test.d.ts.map +1 -0
  15. package/dist/commands/banner.test.js +24 -0
  16. package/dist/commands/banner.test.js.map +1 -0
  17. package/dist/commands/detect.test.d.ts +2 -0
  18. package/dist/commands/detect.test.d.ts.map +1 -0
  19. package/dist/commands/detect.test.js +194 -0
  20. package/dist/commands/detect.test.js.map +1 -0
  21. package/dist/commands/detect_utils.test.d.ts +2 -0
  22. package/dist/commands/detect_utils.test.d.ts.map +1 -0
  23. package/dist/commands/detect_utils.test.js +449 -0
  24. package/dist/commands/detect_utils.test.js.map +1 -0
  25. package/dist/commands/version.test.d.ts +2 -0
  26. package/dist/commands/version.test.d.ts.map +1 -0
  27. package/dist/commands/version.test.js +27 -0
  28. package/dist/commands/version.test.js.map +1 -0
  29. package/dist/e2e/cli.e2e.test.d.ts +2 -0
  30. package/dist/e2e/cli.e2e.test.d.ts.map +1 -0
  31. package/dist/e2e/cli.e2e.test.js +85 -0
  32. package/dist/e2e/cli.e2e.test.js.map +1 -0
  33. package/dist/logger/index.test.d.ts +2 -0
  34. package/dist/logger/index.test.d.ts.map +1 -0
  35. package/dist/logger/index.test.js +106 -0
  36. package/dist/logger/index.test.js.map +1 -0
  37. package/dist/logger/utils.test.d.ts +2 -0
  38. package/dist/logger/utils.test.d.ts.map +1 -0
  39. package/dist/logger/utils.test.js +20 -0
  40. package/dist/logger/utils.test.js.map +1 -0
  41. package/dist/signatures/signatures.test.d.ts +2 -0
  42. package/dist/signatures/signatures.test.d.ts.map +1 -0
  43. package/dist/signatures/signatures.test.js +128 -0
  44. package/dist/signatures/signatures.test.js.map +1 -0
  45. package/dist/signatures/utils.test.d.ts +2 -0
  46. package/dist/signatures/utils.test.d.ts.map +1 -0
  47. package/dist/signatures/utils.test.js +85 -0
  48. package/dist/signatures/utils.test.js.map +1 -0
  49. package/package.json +1 -1
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { logger, setLogLevel, currentLogLevel } from "./index.js";
3
+ import { LogLevel } from "./types.js";
4
+ describe("logger", () => {
5
+ let consoleErrorSpy;
6
+ const originalLogLevel = currentLogLevel;
7
+ beforeEach(() => {
8
+ consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
9
+ vi.useFakeTimers();
10
+ vi.setSystemTime(new Date("2024-01-15T10:30:00.000Z"));
11
+ });
12
+ afterEach(() => {
13
+ consoleErrorSpy.mockRestore();
14
+ vi.useRealTimers();
15
+ setLogLevel(originalLogLevel);
16
+ });
17
+ describe("setLogLevel", () => {
18
+ it("should change the log level", () => {
19
+ setLogLevel(LogLevel.DEBUG);
20
+ logger.debug("test");
21
+ expect(consoleErrorSpy).toHaveBeenCalled();
22
+ });
23
+ });
24
+ describe("debug", () => {
25
+ it("should log when level is DEBUG", () => {
26
+ setLogLevel(LogLevel.DEBUG);
27
+ logger.debug("debug message");
28
+ expect(consoleErrorSpy).toHaveBeenCalledTimes(1);
29
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("debug message");
30
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("DEBUG");
31
+ });
32
+ it("should not log when level is INFO", () => {
33
+ setLogLevel(LogLevel.INFO);
34
+ logger.debug("debug message");
35
+ expect(consoleErrorSpy).not.toHaveBeenCalled();
36
+ });
37
+ });
38
+ describe("info", () => {
39
+ it("should log when level is INFO", () => {
40
+ setLogLevel(LogLevel.INFO);
41
+ logger.info("info message");
42
+ expect(consoleErrorSpy).toHaveBeenCalledTimes(1);
43
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("info message");
44
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("INFO");
45
+ });
46
+ it("should not log when level is WARN", () => {
47
+ setLogLevel(LogLevel.WARN);
48
+ logger.info("info message");
49
+ expect(consoleErrorSpy).not.toHaveBeenCalled();
50
+ });
51
+ });
52
+ describe("warn", () => {
53
+ it("should log when level is WARN", () => {
54
+ setLogLevel(LogLevel.WARN);
55
+ logger.warn("warn message");
56
+ expect(consoleErrorSpy).toHaveBeenCalledTimes(1);
57
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("warn message");
58
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("WARN");
59
+ });
60
+ it("should not log when level is ERROR", () => {
61
+ setLogLevel(LogLevel.ERROR);
62
+ logger.warn("warn message");
63
+ expect(consoleErrorSpy).not.toHaveBeenCalled();
64
+ });
65
+ });
66
+ describe("error", () => {
67
+ it("should log when level is ERROR", () => {
68
+ setLogLevel(LogLevel.ERROR);
69
+ logger.error("error message");
70
+ expect(consoleErrorSpy).toHaveBeenCalledTimes(1);
71
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("error message");
72
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("ERROR");
73
+ });
74
+ it("should always log error messages", () => {
75
+ setLogLevel(LogLevel.ERROR);
76
+ logger.error("error message");
77
+ expect(consoleErrorSpy).toHaveBeenCalled();
78
+ });
79
+ });
80
+ describe("log level hierarchy", () => {
81
+ it("should log all levels when set to DEBUG", () => {
82
+ setLogLevel(LogLevel.DEBUG);
83
+ logger.debug("debug");
84
+ logger.info("info");
85
+ logger.warn("warn");
86
+ logger.error("error");
87
+ expect(consoleErrorSpy).toHaveBeenCalledTimes(4);
88
+ });
89
+ it("should log info, warn, error when set to INFO", () => {
90
+ setLogLevel(LogLevel.INFO);
91
+ logger.debug("debug");
92
+ logger.info("info");
93
+ logger.warn("warn");
94
+ logger.error("error");
95
+ expect(consoleErrorSpy).toHaveBeenCalledTimes(3);
96
+ });
97
+ });
98
+ describe("timestamp format", () => {
99
+ it("should include ISO timestamp in log output", () => {
100
+ setLogLevel(LogLevel.INFO);
101
+ logger.info("test");
102
+ expect(consoleErrorSpy.mock.calls[0][0]).toContain("2024-01-15T10:30:00.000Z");
103
+ });
104
+ });
105
+ });
106
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/logger/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/logger/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { timeStamp } from "./utils.js";
3
+ describe("timeStamp", () => {
4
+ beforeEach(() => {
5
+ vi.useFakeTimers();
6
+ });
7
+ afterEach(() => {
8
+ vi.useRealTimers();
9
+ });
10
+ it("should return ISO 8601 formatted timestamp", () => {
11
+ vi.setSystemTime(new Date("2024-01-15T10:30:00.000Z"));
12
+ expect(timeStamp()).toBe("2024-01-15T10:30:00.000Z");
13
+ });
14
+ it("should return current time", () => {
15
+ const now = new Date("2024-06-20T15:45:30.123Z");
16
+ vi.setSystemTime(now);
17
+ expect(timeStamp()).toBe(now.toISOString());
18
+ });
19
+ });
20
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/logger/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACjD,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=signatures.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signatures.test.d.ts","sourceRoot":"","sources":["../../src/signatures/signatures.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { signatures } from "./index.js";
3
+ describe("signatures validation", () => {
4
+ describe("required fields", () => {
5
+ it("all signatures should have a non-empty name", () => {
6
+ for (const sig of signatures) {
7
+ expect(sig.name, `Signature missing name`).toBeDefined();
8
+ expect(sig.name.length, `Signature has empty name`).toBeGreaterThan(0);
9
+ }
10
+ });
11
+ });
12
+ describe("uniqueness", () => {
13
+ it("all signature names should be unique", () => {
14
+ const names = signatures.map((s) => s.name);
15
+ const duplicates = names.filter((name, index) => names.indexOf(name) !== index);
16
+ expect(duplicates, `Duplicate signature names: ${duplicates.join(", ")}`).toEqual([]);
17
+ });
18
+ });
19
+ describe("confidence values", () => {
20
+ it("all rules should have valid confidence values", () => {
21
+ const validConfidences = ["high", "medium", "low"];
22
+ for (const sig of signatures) {
23
+ if (sig.rule) {
24
+ expect(validConfidences, `Invalid confidence "${sig.rule.confidence}" in ${sig.name}`).toContain(sig.rule.confidence);
25
+ }
26
+ }
27
+ });
28
+ });
29
+ describe("regex patterns", () => {
30
+ const testRegex = (pattern, sigName, field) => {
31
+ try {
32
+ new RegExp(pattern, "i");
33
+ }
34
+ catch {
35
+ throw new Error(`Invalid regex in ${sigName}.${field}: "${pattern}"`);
36
+ }
37
+ };
38
+ it("all header patterns should be valid regex", () => {
39
+ for (const sig of signatures) {
40
+ if (sig.rule?.headers) {
41
+ for (const [header, pattern] of Object.entries(sig.rule.headers)) {
42
+ testRegex(pattern, sig.name, `headers.${header}`);
43
+ }
44
+ }
45
+ }
46
+ });
47
+ it("all body patterns should be valid regex", () => {
48
+ for (const sig of signatures) {
49
+ if (sig.rule?.bodies) {
50
+ for (const pattern of sig.rule.bodies) {
51
+ testRegex(pattern, sig.name, "bodies");
52
+ }
53
+ }
54
+ }
55
+ });
56
+ it("all url patterns should be valid regex", () => {
57
+ for (const sig of signatures) {
58
+ if (sig.rule?.urls) {
59
+ for (const pattern of sig.rule.urls) {
60
+ testRegex(pattern, sig.name, "urls");
61
+ }
62
+ }
63
+ }
64
+ });
65
+ it("all cookie patterns should be valid regex", () => {
66
+ for (const sig of signatures) {
67
+ if (sig.rule?.cookies) {
68
+ for (const [cookie, pattern] of Object.entries(sig.rule.cookies)) {
69
+ testRegex(pattern, sig.name, `cookies.${cookie}`);
70
+ }
71
+ }
72
+ }
73
+ });
74
+ it("all javascriptVariables patterns should be valid regex", () => {
75
+ for (const sig of signatures) {
76
+ if (sig.rule?.javascriptVariables) {
77
+ for (const [varName, pattern] of Object.entries(sig.rule.javascriptVariables)) {
78
+ testRegex(pattern, sig.name, `javascriptVariables.${varName}`);
79
+ }
80
+ }
81
+ }
82
+ });
83
+ });
84
+ describe("implied softwares", () => {
85
+ it("all implied software references should exist", () => {
86
+ const allNames = new Set(signatures.map((s) => s.name));
87
+ const missingRefs = [];
88
+ for (const sig of signatures) {
89
+ if (sig.impliedSoftwares) {
90
+ for (const implied of sig.impliedSoftwares) {
91
+ if (!allNames.has(implied)) {
92
+ missingRefs.push(`${sig.name} -> ${implied}`);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ expect(missingRefs, `Missing implied software references: ${missingRefs.join(", ")}`).toEqual([]);
98
+ });
99
+ });
100
+ describe("data integrity", () => {
101
+ it("should have a reasonable number of signatures", () => {
102
+ expect(signatures.length).toBeGreaterThan(100);
103
+ });
104
+ it("all signatures with rules should have at least one detection method", () => {
105
+ for (const sig of signatures) {
106
+ if (sig.rule) {
107
+ const hasDetectionMethod = sig.rule.headers ||
108
+ sig.rule.bodies ||
109
+ sig.rule.urls ||
110
+ sig.rule.cookies ||
111
+ sig.rule.javascriptVariables;
112
+ expect(hasDetectionMethod, `${sig.name} has a rule but no detection method`).toBeTruthy();
113
+ }
114
+ }
115
+ });
116
+ });
117
+ describe("cpe format", () => {
118
+ it("all cpe values should follow CPE format", () => {
119
+ const cpePattern = /^cpe:[/:]?[0-9.]*:?[a-z]:[\w\-_.]+:[\w\-_.]+/i;
120
+ for (const sig of signatures) {
121
+ if (sig.cpe) {
122
+ expect(sig.cpe, `Invalid CPE format in ${sig.name}: "${sig.cpe}"`).toMatch(cpePattern);
123
+ }
124
+ }
125
+ });
126
+ });
127
+ });
128
+ //# sourceMappingURL=signatures.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signatures.test.js","sourceRoot":"","sources":["../../src/signatures/signatures.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/signatures/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { getJavascriptVariableNames } from "./utils.js";
3
+ describe("getJavascriptVariableNames", () => {
4
+ it("should return empty array for empty signatures", () => {
5
+ const result = getJavascriptVariableNames([]);
6
+ expect(result).toEqual([]);
7
+ });
8
+ it("should return empty array when no signatures have javascript variables", () => {
9
+ const signatures = [
10
+ { name: "nginx" },
11
+ { name: "Apache", rule: { confidence: "high", headers: { Server: "Apache" } } },
12
+ ];
13
+ const result = getJavascriptVariableNames(signatures);
14
+ expect(result).toEqual([]);
15
+ });
16
+ it("should extract javascript variable names from signatures", () => {
17
+ const signatures = [
18
+ {
19
+ name: "jQuery",
20
+ rule: {
21
+ confidence: "high",
22
+ javascriptVariables: { jQuery: ".*", "$": ".*" },
23
+ },
24
+ },
25
+ ];
26
+ const result = getJavascriptVariableNames(signatures);
27
+ expect(result).toContain("jQuery");
28
+ expect(result).toContain("$");
29
+ });
30
+ it("should deduplicate variable names across signatures", () => {
31
+ const signatures = [
32
+ {
33
+ name: "React",
34
+ rule: {
35
+ confidence: "high",
36
+ javascriptVariables: { React: ".*", ReactDOM: ".*" },
37
+ },
38
+ },
39
+ {
40
+ name: "React Router",
41
+ rule: {
42
+ confidence: "high",
43
+ javascriptVariables: { React: ".*", ReactRouter: ".*" },
44
+ },
45
+ },
46
+ ];
47
+ const result = getJavascriptVariableNames(signatures);
48
+ const reactCount = result.filter((name) => name === "React").length;
49
+ expect(reactCount).toBe(1);
50
+ expect(result).toContain("ReactDOM");
51
+ expect(result).toContain("ReactRouter");
52
+ });
53
+ it("should handle signatures with undefined rule", () => {
54
+ const signatures = [
55
+ { name: "nginx" },
56
+ {
57
+ name: "jQuery",
58
+ rule: {
59
+ confidence: "high",
60
+ javascriptVariables: { jQuery: ".*" },
61
+ },
62
+ },
63
+ ];
64
+ const result = getJavascriptVariableNames(signatures);
65
+ expect(result).toEqual(["jQuery"]);
66
+ });
67
+ it("should handle signatures with rule but no javascriptVariables", () => {
68
+ const signatures = [
69
+ {
70
+ name: "nginx",
71
+ rule: { confidence: "high", headers: { Server: "nginx" } },
72
+ },
73
+ {
74
+ name: "jQuery",
75
+ rule: {
76
+ confidence: "high",
77
+ javascriptVariables: { jQuery: ".*" },
78
+ },
79
+ },
80
+ ];
81
+ const result = getJavascriptVariableNames(signatures);
82
+ expect(result).toEqual(["jQuery"]);
83
+ });
84
+ });
85
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/signatures/utils.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whopper",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Whopper is a CLI tool that discovers and detects web technologies used on websites.",
5
5
  "scripts": {
6
6
  "build": "tsc -p tsconfig.json",