@adamancyzhang/claude-orchestrator 0.3.3 → 0.4.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.
- package/README.md +203 -269
- package/dist/cli/commands.d.ts +0 -10
- package/dist/cli/commands.js +1 -184
- package/dist/cli/commands.js.map +1 -1
- package/dist/config.d.ts +39 -0
- package/dist/config.js +43 -2
- package/dist/config.js.map +1 -1
- package/dist/email-validator/__tests__/domain.test.d.ts +1 -0
- package/dist/email-validator/__tests__/domain.test.js +128 -0
- package/dist/email-validator/__tests__/domain.test.js.map +1 -0
- package/dist/email-validator/__tests__/local-part.test.d.ts +1 -0
- package/dist/email-validator/__tests__/local-part.test.js +110 -0
- package/dist/email-validator/__tests__/local-part.test.js.map +1 -0
- package/dist/email-validator/__tests__/parser.test.d.ts +1 -0
- package/dist/email-validator/__tests__/parser.test.js +161 -0
- package/dist/email-validator/__tests__/parser.test.js.map +1 -0
- package/dist/email-validator/__tests__/validator.test.d.ts +1 -0
- package/dist/email-validator/__tests__/validator.test.js +152 -0
- package/dist/email-validator/__tests__/validator.test.js.map +1 -0
- package/dist/email-validator/diagnostics.d.ts +3 -0
- package/dist/email-validator/diagnostics.js +34 -0
- package/dist/email-validator/diagnostics.js.map +1 -0
- package/dist/email-validator/domain.d.ts +2 -0
- package/dist/email-validator/domain.js +119 -0
- package/dist/email-validator/domain.js.map +1 -0
- package/dist/email-validator/index.d.ts +2 -0
- package/dist/email-validator/index.js +2 -0
- package/dist/email-validator/index.js.map +1 -0
- package/dist/email-validator/local-part.d.ts +2 -0
- package/dist/email-validator/local-part.js +67 -0
- package/dist/email-validator/local-part.js.map +1 -0
- package/dist/email-validator/parser.d.ts +9 -0
- package/dist/email-validator/parser.js +120 -0
- package/dist/email-validator/parser.js.map +1 -0
- package/dist/email-validator/types.d.ts +24 -0
- package/dist/email-validator/types.js +2 -0
- package/dist/email-validator/types.js.map +1 -0
- package/dist/email-validator/validator.d.ts +9 -0
- package/dist/email-validator/validator.js +51 -0
- package/dist/email-validator/validator.js.map +1 -0
- package/dist/executor/runner.d.ts +19 -2
- package/dist/executor/runner.js +29 -4
- package/dist/executor/runner.js.map +1 -1
- package/dist/executor/template.d.ts +3 -1
- package/dist/executor/template.js +19 -16
- package/dist/executor/template.js.map +1 -1
- package/dist/index.js +11 -34
- package/dist/index.js.map +1 -1
- package/dist/leader/chain-router.d.ts +10 -2
- package/dist/leader/chain-router.js +167 -10
- package/dist/leader/chain-router.js.map +1 -1
- package/dist/leader/event-bus.d.ts +1 -1
- package/dist/leader/event-bus.js +2 -1
- package/dist/leader/event-bus.js.map +1 -1
- package/dist/leader/index.d.ts +7 -0
- package/dist/leader/index.js +99 -8
- package/dist/leader/index.js.map +1 -1
- package/dist/leader/merge-validator.d.ts +25 -0
- package/dist/leader/merge-validator.js +105 -0
- package/dist/leader/merge-validator.js.map +1 -0
- package/dist/leader/state.d.ts +20 -0
- package/dist/leader/state.js +77 -2
- package/dist/leader/state.js.map +1 -1
- package/dist/leader/stream-tailer.d.ts +12 -0
- package/dist/leader/stream-tailer.js +58 -0
- package/dist/leader/stream-tailer.js.map +1 -0
- package/dist/leader/tui.d.ts +8 -0
- package/dist/leader/tui.js +245 -17
- package/dist/leader/tui.js.map +1 -1
- package/dist/leader/watcher.js +12 -0
- package/dist/leader/watcher.js.map +1 -1
- package/dist/models/schemas.d.ts +28 -6
- package/dist/models/schemas.js +8 -0
- package/dist/models/schemas.js.map +1 -1
- package/dist/modules/task-queue.js +4 -0
- package/dist/modules/task-queue.js.map +1 -1
- package/dist/orchestrator/init-checker.d.ts +33 -0
- package/dist/orchestrator/init-checker.js +297 -0
- package/dist/orchestrator/init-checker.js.map +1 -0
- package/dist/orchestrator/run.d.ts +7 -0
- package/dist/orchestrator/run.js +126 -0
- package/dist/orchestrator/run.js.map +1 -0
- package/dist/skills/claude-orchestrator/SKILL.md +75 -217
- package/dist/templates/agents/worker-accept.md +48 -0
- package/dist/templates/agents/worker-build.md +38 -0
- package/dist/templates/agents/worker-commit-message.md +12 -0
- package/dist/templates/agents/worker-decompose.md +40 -0
- package/dist/templates/agents/worker-evaluate-format-hint.md +7 -0
- package/dist/templates/agents/worker-evaluate.md +49 -0
- package/dist/templates/agents/worker-identity.md +7 -0
- package/dist/templates/agents/worker-merge-decision.md +12 -0
- package/dist/templates/agents/worker-plan.md +36 -0
- package/dist/templates/agents/worker-review.md +42 -0
- package/dist/templates/agents/worker-task-doc.md +13 -0
- package/dist/templates/agents/worker-verify.md +44 -0
- package/dist/templates/claude-memory/personal-claude-accepter.md +17 -0
- package/dist/templates/claude-memory/personal-claude-builder.md +24 -0
- package/dist/templates/claude-memory/personal-claude-planner.md +22 -0
- package/dist/templates/claude-memory/personal-claude-reviewer.md +25 -0
- package/dist/templates/claude-memory/personal-claude-verifier.md +24 -0
- package/dist/templates/claude-memory/team-claude.md +61 -0
- package/dist/templates/user-global-claude.md +65 -0
- package/dist/utils/console-capture.d.ts +2 -0
- package/dist/utils/console-capture.js +42 -0
- package/dist/utils/console-capture.js.map +1 -0
- package/dist/utils/exec.d.ts +2 -6
- package/dist/utils/exec.js +48 -29
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/json.d.ts +5 -0
- package/dist/utils/json.js +17 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.js +3 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/worker/child-runner.d.ts +12 -0
- package/dist/worker/child-runner.js +115 -0
- package/dist/worker/child-runner.js.map +1 -0
- package/dist/worker/child.d.ts +2 -0
- package/dist/worker/child.js +8 -0
- package/dist/worker/child.js.map +1 -0
- package/dist/worker/commit-checker.d.ts +21 -0
- package/dist/worker/commit-checker.js +81 -0
- package/dist/worker/commit-checker.js.map +1 -0
- package/dist/worker/evaluator.d.ts +3 -4
- package/dist/worker/evaluator.js +15 -50
- package/dist/worker/evaluator.js.map +1 -1
- package/dist/worker/watcher.d.ts +5 -1
- package/dist/worker/watcher.js +44 -9
- package/dist/worker/watcher.js.map +1 -1
- package/dist/worker/worktree-initializer.d.ts +10 -0
- package/dist/worker/worktree-initializer.js +238 -0
- package/dist/worker/worktree-initializer.js.map +1 -0
- package/package.json +2 -2
- package/dist/templates/worker-accept.md +0 -46
- package/dist/templates/worker-build.md +0 -45
- package/dist/templates/worker-decompose.md +0 -67
- package/dist/templates/worker-evaluate.md +0 -41
- package/dist/templates/worker-plan.md +0 -43
- package/dist/templates/worker-review.md +0 -46
- package/dist/templates/worker-verify.md +0 -47
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-part.test.js","sourceRoot":"","sources":["../../../src/email-validator/__tests__/local-part.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parseEmail } from "../parser.js";
|
|
3
|
+
const defaults = { allowDisplayName: true, allowComments: false };
|
|
4
|
+
describe("parseEmail", () => {
|
|
5
|
+
describe("simple addr-spec", () => {
|
|
6
|
+
it("parses user@domain.com", () => {
|
|
7
|
+
const r = parseEmail("user@domain.com", defaults);
|
|
8
|
+
expect(r.ok).toBe(true);
|
|
9
|
+
if (r.ok) {
|
|
10
|
+
expect(r.value.localPart).toBe("user");
|
|
11
|
+
expect(r.value.domain).toBe("domain.com");
|
|
12
|
+
expect(r.value.displayName).toBeNull();
|
|
13
|
+
expect(r.value.isIpLiteral).toBe(false);
|
|
14
|
+
expect(r.value.isIPv6).toBe(false);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
it("parses a@b.c (minimal)", () => {
|
|
18
|
+
const r = parseEmail("a@b.c", defaults);
|
|
19
|
+
expect(r.ok).toBe(true);
|
|
20
|
+
if (r.ok) {
|
|
21
|
+
expect(r.value.localPart).toBe("a");
|
|
22
|
+
expect(r.value.domain).toBe("b.c");
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it("parses addr-spec with subdomain", () => {
|
|
26
|
+
const r = parseEmail("user@mail.example.co.uk", defaults);
|
|
27
|
+
expect(r.ok).toBe(true);
|
|
28
|
+
if (r.ok) {
|
|
29
|
+
expect(r.value.localPart).toBe("user");
|
|
30
|
+
expect(r.value.domain).toBe("mail.example.co.uk");
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("display name", () => {
|
|
35
|
+
it("extracts display name from angle-bracket form", () => {
|
|
36
|
+
const r = parseEmail("John Doe <john@example.com>", defaults);
|
|
37
|
+
expect(r.ok).toBe(true);
|
|
38
|
+
if (r.ok) {
|
|
39
|
+
expect(r.value.localPart).toBe("john");
|
|
40
|
+
expect(r.value.domain).toBe("example.com");
|
|
41
|
+
expect(r.value.displayName).toBe("John Doe");
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
it("returns null display name when not present", () => {
|
|
45
|
+
const r = parseEmail("user@domain.com", defaults);
|
|
46
|
+
expect(r.ok).toBe(true);
|
|
47
|
+
if (r.ok) {
|
|
48
|
+
expect(r.value.displayName).toBeNull();
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it("ignores display name when disabled", () => {
|
|
52
|
+
const r = parseEmail("John <john@example.com>", { allowDisplayName: false });
|
|
53
|
+
expect(r.ok).toBe(true);
|
|
54
|
+
if (r.ok) {
|
|
55
|
+
expect(r.value.localPart).toBe("John <john");
|
|
56
|
+
expect(r.value.domain).toBe("example.com>");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("comments", () => {
|
|
61
|
+
it("strips comments when enabled", () => {
|
|
62
|
+
const r = parseEmail("user(comment)@domain.com", { allowComments: true });
|
|
63
|
+
expect(r.ok).toBe(true);
|
|
64
|
+
if (r.ok) {
|
|
65
|
+
expect(r.value.localPart).toBe("user");
|
|
66
|
+
expect(r.value.domain).toBe("domain.com");
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
it("rejects comments when disabled", () => {
|
|
70
|
+
const r = parseEmail("user(comment)@domain.com", { allowComments: false });
|
|
71
|
+
expect(r.ok).toBe(false);
|
|
72
|
+
if (!r.ok) {
|
|
73
|
+
expect(r.error.code).toBe("ERR_COMMENTS_NOT_ALLOWED");
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
it("strips multiple comments", () => {
|
|
77
|
+
const r = parseEmail("(hello)user(world)@domain.com", { allowComments: true });
|
|
78
|
+
expect(r.ok).toBe(true);
|
|
79
|
+
if (r.ok) {
|
|
80
|
+
expect(r.value.localPart).toBe("user");
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
it("strips nested comments", () => {
|
|
84
|
+
const r = parseEmail("user((nested))@domain.com", { allowComments: true });
|
|
85
|
+
expect(r.ok).toBe(true);
|
|
86
|
+
if (r.ok) {
|
|
87
|
+
expect(r.value.localPart).toBe("user");
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe("IP literals", () => {
|
|
92
|
+
it("detects IPv4 literal", () => {
|
|
93
|
+
const r = parseEmail("user@[192.168.1.1]", defaults);
|
|
94
|
+
expect(r.ok).toBe(true);
|
|
95
|
+
if (r.ok) {
|
|
96
|
+
expect(r.value.domain).toBe("192.168.1.1");
|
|
97
|
+
expect(r.value.isIpLiteral).toBe(true);
|
|
98
|
+
expect(r.value.isIPv6).toBe(false);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
it("detects IPv6 literal", () => {
|
|
102
|
+
const r = parseEmail("user@[IPv6:2001:db8::1]", defaults);
|
|
103
|
+
expect(r.ok).toBe(true);
|
|
104
|
+
if (r.ok) {
|
|
105
|
+
expect(r.value.domain).toBe("2001:db8::1");
|
|
106
|
+
expect(r.value.isIpLiteral).toBe(true);
|
|
107
|
+
expect(r.value.isIPv6).toBe(true);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
it("detects IPv6 literal case-insensitively", () => {
|
|
111
|
+
const r = parseEmail("user@[ipv6:fe80::1]", defaults);
|
|
112
|
+
expect(r.ok).toBe(true);
|
|
113
|
+
if (r.ok) {
|
|
114
|
+
expect(r.value.isIPv6).toBe(true);
|
|
115
|
+
expect(r.value.domain).toBe("fe80::1");
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe("error cases", () => {
|
|
120
|
+
it("ERR_EMPTY_INPUT for empty string", () => {
|
|
121
|
+
const r = parseEmail("", defaults);
|
|
122
|
+
expect(r.ok).toBe(false);
|
|
123
|
+
if (!r.ok)
|
|
124
|
+
expect(r.error.code).toBe("ERR_EMPTY_INPUT");
|
|
125
|
+
});
|
|
126
|
+
it("ERR_EMPTY_INPUT for whitespace-only", () => {
|
|
127
|
+
const r = parseEmail(" ", defaults);
|
|
128
|
+
expect(r.ok).toBe(false);
|
|
129
|
+
if (!r.ok)
|
|
130
|
+
expect(r.error.code).toBe("ERR_EMPTY_INPUT");
|
|
131
|
+
});
|
|
132
|
+
it("ERR_TOTAL_LENGTH for exceeding max", () => {
|
|
133
|
+
const long = "a".repeat(255) + "@b.c";
|
|
134
|
+
const r = parseEmail(long, { maxTotalLength: 254 });
|
|
135
|
+
expect(r.ok).toBe(false);
|
|
136
|
+
if (!r.ok)
|
|
137
|
+
expect(r.error.code).toBe("ERR_TOTAL_LENGTH");
|
|
138
|
+
});
|
|
139
|
+
it("ERR_NO_AT_SIGN when missing @", () => {
|
|
140
|
+
const r = parseEmail("not-an-email", defaults);
|
|
141
|
+
expect(r.ok).toBe(false);
|
|
142
|
+
if (!r.ok)
|
|
143
|
+
expect(r.error.code).toBe("ERR_NO_AT_SIGN");
|
|
144
|
+
});
|
|
145
|
+
it("ERR_MULTIPLE_AT for double @", () => {
|
|
146
|
+
const r = parseEmail("a@b@c.com", defaults);
|
|
147
|
+
expect(r.ok).toBe(false);
|
|
148
|
+
if (!r.ok)
|
|
149
|
+
expect(r.error.code).toBe("ERR_MULTIPLE_AT");
|
|
150
|
+
});
|
|
151
|
+
it("trims whitespace around input", () => {
|
|
152
|
+
const r = parseEmail(" user@domain.com ", defaults);
|
|
153
|
+
expect(r.ok).toBe(true);
|
|
154
|
+
if (r.ok) {
|
|
155
|
+
expect(r.value.localPart).toBe("user");
|
|
156
|
+
expect(r.value.domain).toBe("domain.com");
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../../src/email-validator/__tests__/parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { EmailValidator } from "../validator.js";
|
|
3
|
+
describe("EmailValidator", () => {
|
|
4
|
+
const validator = new EmailValidator();
|
|
5
|
+
describe("validate — valid emails", () => {
|
|
6
|
+
it("accepts test@example.com", () => {
|
|
7
|
+
const r = validator.validate("test@example.com");
|
|
8
|
+
expect(r.valid).toBe(true);
|
|
9
|
+
expect(r.errors).toEqual([]);
|
|
10
|
+
expect(r.normalized).toBe("test@example.com");
|
|
11
|
+
});
|
|
12
|
+
it("accepts user@[192.168.1.1] (IPv4 literal)", () => {
|
|
13
|
+
const r = validator.validate("user@[192.168.1.1]");
|
|
14
|
+
expect(r.valid).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it("accepts a@[IPv6:2001:db8::1] (IPv6 literal)", () => {
|
|
17
|
+
const r = validator.validate("a@[IPv6:2001:db8::1]");
|
|
18
|
+
expect(r.valid).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
it("accepts quoted local-part", () => {
|
|
21
|
+
const r = validator.validate('"john.doe"@example.com');
|
|
22
|
+
expect(r.valid).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it("accepts display name", () => {
|
|
25
|
+
const r = validator.validate("John <john@example.com>");
|
|
26
|
+
expect(r.valid).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it("accepts email with plus alias", () => {
|
|
29
|
+
const r = validator.validate("user+tag@domain.com");
|
|
30
|
+
expect(r.valid).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it("accepts 254-char email (boundary)", () => {
|
|
33
|
+
const local = "a".repeat(64);
|
|
34
|
+
const domain = "b".repeat(63) + ".c".repeat(63) + ".com";
|
|
35
|
+
const email = `${local}@${domain}`;
|
|
36
|
+
if (email.length <= 254) {
|
|
37
|
+
// Only test if it fits within 254
|
|
38
|
+
const r = validator.validate(email);
|
|
39
|
+
expect(r.valid).toBe(true);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("validate — invalid emails", () => {
|
|
44
|
+
it("rejects empty string", () => {
|
|
45
|
+
const r = validator.validate("");
|
|
46
|
+
expect(r.valid).toBe(false);
|
|
47
|
+
expect(r.errors.some((e) => e.code === "ERR_EMPTY_INPUT")).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it("rejects missing @", () => {
|
|
50
|
+
const r = validator.validate("not-an-email");
|
|
51
|
+
expect(r.valid).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
it("rejects double @", () => {
|
|
54
|
+
const r = validator.validate("a@b@c.com");
|
|
55
|
+
expect(r.valid).toBe(false);
|
|
56
|
+
expect(r.errors.some((e) => e.code === "ERR_MULTIPLE_AT")).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it("rejects consecutive dots in local part", () => {
|
|
59
|
+
const r = validator.validate("john..doe@example.com");
|
|
60
|
+
expect(r.valid).toBe(false);
|
|
61
|
+
expect(r.errors.some((e) => e.code === "ERR_LOCAL_PART_CONSECUTIVE_DOTS")).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it("rejects local part > 64 chars", () => {
|
|
64
|
+
const lp = "a".repeat(65);
|
|
65
|
+
const r = validator.validate(`${lp}@example.com`);
|
|
66
|
+
expect(r.valid).toBe(false);
|
|
67
|
+
expect(r.errors.some((e) => e.code === "ERR_LOCAL_PART_LENGTH")).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it("rejects email with domain > 255 chars", () => {
|
|
70
|
+
const label = "a".repeat(63);
|
|
71
|
+
const domain = `${label}.${label}.${label}.${label}.${label}`;
|
|
72
|
+
const r = validator.validate(`user@${domain}`);
|
|
73
|
+
expect(r.valid).toBe(false);
|
|
74
|
+
// Total length check (254) fires before domain-level validation
|
|
75
|
+
expect(r.errors.some((e) => e.code === "ERR_TOTAL_LENGTH")).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
it("rejects numeric TLD", () => {
|
|
78
|
+
const r = validator.validate("user@example.123");
|
|
79
|
+
expect(r.valid).toBe(false);
|
|
80
|
+
expect(r.errors.some((e) => e.code === "ERR_DOMAIN_NUMERIC_TLD")).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it("rejects domain with no dot", () => {
|
|
83
|
+
const r = validator.validate("user@localhost");
|
|
84
|
+
expect(r.valid).toBe(false);
|
|
85
|
+
expect(r.errors.some((e) => e.code === "ERR_DOMAIN_NO_DOT")).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it("rejects leading dot in local part", () => {
|
|
88
|
+
const r = validator.validate(".user@example.com");
|
|
89
|
+
expect(r.valid).toBe(false);
|
|
90
|
+
expect(r.errors.some((e) => e.code === "ERR_LOCAL_PART_DOT_START")).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
it("rejects whitespace in addr-spec", () => {
|
|
93
|
+
const r = validator.validate("user @example.com");
|
|
94
|
+
expect(r.valid).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe("isValid convenience", () => {
|
|
98
|
+
it("returns true for valid email", () => {
|
|
99
|
+
expect(validator.isValid("test@example.com")).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it("returns false for invalid email", () => {
|
|
102
|
+
expect(validator.isValid("invalid")).toBe(false);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe("normalize", () => {
|
|
106
|
+
it("lowercases domain", () => {
|
|
107
|
+
expect(validator.normalize("Test@Example.COM")).toBe("Test@example.com");
|
|
108
|
+
});
|
|
109
|
+
it("returns null for invalid", () => {
|
|
110
|
+
expect(validator.normalize("invalid")).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
it("preserves local part case", () => {
|
|
113
|
+
expect(validator.normalize("UsEr@Domain.Com")).toBe("UsEr@domain.com");
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("options", () => {
|
|
117
|
+
it("getOptions returns defaults", () => {
|
|
118
|
+
const opts = validator.getOptions();
|
|
119
|
+
expect(opts.maxLocalPartLength).toBe(64);
|
|
120
|
+
expect(opts.maxDomainLength).toBe(255);
|
|
121
|
+
expect(opts.maxTotalLength).toBe(254);
|
|
122
|
+
expect(opts.allowComments).toBe(false);
|
|
123
|
+
expect(opts.allowDisplayName).toBe(true);
|
|
124
|
+
});
|
|
125
|
+
it("accepts custom max lengths", () => {
|
|
126
|
+
const v = new EmailValidator({ maxLocalPartLength: 10, maxDomainLength: 50, maxTotalLength: 100 });
|
|
127
|
+
const opts = v.getOptions();
|
|
128
|
+
expect(opts.maxLocalPartLength).toBe(10);
|
|
129
|
+
expect(opts.maxDomainLength).toBe(50);
|
|
130
|
+
expect(opts.maxTotalLength).toBe(100);
|
|
131
|
+
});
|
|
132
|
+
it("allows comments when configured", () => {
|
|
133
|
+
const v = new EmailValidator({ allowComments: true });
|
|
134
|
+
const r = v.validate("user(comment)@example.com");
|
|
135
|
+
expect(r.valid).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
it("rejects display name when disabled", () => {
|
|
138
|
+
const v = new EmailValidator({ allowDisplayName: false });
|
|
139
|
+
const r = v.validate("John <john@example.com>");
|
|
140
|
+
// Without display name parsing, "John <john" becomes local-part which has a space
|
|
141
|
+
expect(r.valid).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
it("getOptions returns frozen copy", () => {
|
|
144
|
+
const v = new EmailValidator();
|
|
145
|
+
const opts1 = v.getOptions();
|
|
146
|
+
const opts2 = v.getOptions();
|
|
147
|
+
expect(opts1).toEqual(opts2);
|
|
148
|
+
expect(opts1).not.toBe(opts2);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=validator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.test.js","sourceRoot":"","sources":["../../../src/email-validator/__tests__/validator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const ErrorCodes = {
|
|
2
|
+
ERR_EMPTY_INPUT: "Input is empty or whitespace-only",
|
|
3
|
+
ERR_TOTAL_LENGTH: "Address exceeds maximum length",
|
|
4
|
+
ERR_NO_AT_SIGN: "No '@' character found",
|
|
5
|
+
ERR_MULTIPLE_AT: "Multiple '@' characters found",
|
|
6
|
+
ERR_LOCAL_PART_EMPTY: "Local part is empty",
|
|
7
|
+
ERR_LOCAL_PART_LENGTH: "Local part exceeds maximum length",
|
|
8
|
+
ERR_LOCAL_PART_INVALID_CHAR: "Invalid character in local part",
|
|
9
|
+
ERR_LOCAL_PART_DOT_START: "Local part starts with '.'",
|
|
10
|
+
ERR_LOCAL_PART_DOT_END: "Local part ends with '.'",
|
|
11
|
+
ERR_LOCAL_PART_CONSECUTIVE_DOTS: "Consecutive '.' characters in local part",
|
|
12
|
+
ERR_UNBALANCED_QUOTES: "Unbalanced double-quote in quoted local part",
|
|
13
|
+
ERR_DOMAIN_EMPTY: "Domain is empty",
|
|
14
|
+
ERR_DOMAIN_LENGTH: "Domain exceeds maximum length",
|
|
15
|
+
ERR_DOMAIN_LABEL_EMPTY: "Domain label is empty",
|
|
16
|
+
ERR_DOMAIN_LABEL_LENGTH: "Domain label exceeds maximum length",
|
|
17
|
+
ERR_DOMAIN_LABEL_HYPHEN_START: "Domain label starts with '-'",
|
|
18
|
+
ERR_DOMAIN_LABEL_HYPHEN_END: "Domain label ends with '-'",
|
|
19
|
+
ERR_DOMAIN_INVALID_CHAR: "Invalid character in domain",
|
|
20
|
+
ERR_DOMAIN_NO_DOT: "Domain has no dot (TLD required)",
|
|
21
|
+
ERR_DOMAIN_NUMERIC_TLD: "Top-level domain is all-numeric",
|
|
22
|
+
ERR_IPV4_INVALID: "IPv4 literal is malformed",
|
|
23
|
+
ERR_IPV6_INVALID: "IPv6 literal is malformed",
|
|
24
|
+
ERR_COMMENTS_NOT_ALLOWED: "Comments not allowed by configuration",
|
|
25
|
+
};
|
|
26
|
+
const PLACEHOLDER_RE = /\{(\w+)\}/g;
|
|
27
|
+
export function makeError(code, position, extra) {
|
|
28
|
+
let message = ErrorCodes[code] ?? code;
|
|
29
|
+
if (extra) {
|
|
30
|
+
message = message.replace(PLACEHOLDER_RE, (_match, key) => extra[key] ?? `{${key}}`);
|
|
31
|
+
}
|
|
32
|
+
return { code, message, position: position ?? -1 };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/email-validator/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,eAAe,EAAE,mCAAmC;IACpD,gBAAgB,EAAE,gCAAgC;IAClD,cAAc,EAAE,wBAAwB;IACxC,eAAe,EAAE,+BAA+B;IAChD,oBAAoB,EAAE,qBAAqB;IAC3C,qBAAqB,EAAE,mCAAmC;IAC1D,2BAA2B,EAAE,iCAAiC;IAC9D,wBAAwB,EAAE,4BAA4B;IACtD,sBAAsB,EAAE,0BAA0B;IAClD,+BAA+B,EAAE,0CAA0C;IAC3E,qBAAqB,EAAE,8CAA8C;IACrE,gBAAgB,EAAE,iBAAiB;IACnC,iBAAiB,EAAE,+BAA+B;IAClD,sBAAsB,EAAE,uBAAuB;IAC/C,uBAAuB,EAAE,qCAAqC;IAC9D,6BAA6B,EAAE,8BAA8B;IAC7D,2BAA2B,EAAE,4BAA4B;IACzD,uBAAuB,EAAE,6BAA6B;IACtD,iBAAiB,EAAE,kCAAkC;IACrD,sBAAsB,EAAE,iCAAiC;IACzD,gBAAgB,EAAE,2BAA2B;IAC7C,gBAAgB,EAAE,2BAA2B;IAC7C,wBAAwB,EAAE,uCAAuC;CAClE,CAAC;AAEF,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAAiB,EAAE,KAA8B;IACvF,IAAI,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACvC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { makeError } from "./diagnostics.js";
|
|
2
|
+
const HOSTNAME_LABEL_RE = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/;
|
|
3
|
+
const NUMERIC_RE = /^\d+$/;
|
|
4
|
+
export function validateDomain(domain, isIpLiteral, isIPv6, maxLength) {
|
|
5
|
+
const errors = [];
|
|
6
|
+
const max = maxLength ?? 255;
|
|
7
|
+
if (domain.length === 0) {
|
|
8
|
+
errors.push(makeError("ERR_DOMAIN_EMPTY"));
|
|
9
|
+
return errors;
|
|
10
|
+
}
|
|
11
|
+
if (domain.length > max) {
|
|
12
|
+
errors.push(makeError("ERR_DOMAIN_LENGTH"));
|
|
13
|
+
}
|
|
14
|
+
if (isIPv6) {
|
|
15
|
+
validateIPv6Literal(domain, errors);
|
|
16
|
+
}
|
|
17
|
+
else if (isIpLiteral) {
|
|
18
|
+
validateIPv4Literal(domain, errors);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
validateHostname(domain, errors);
|
|
22
|
+
}
|
|
23
|
+
return errors;
|
|
24
|
+
}
|
|
25
|
+
function validateHostname(domain, errors) {
|
|
26
|
+
const labels = domain.split(".");
|
|
27
|
+
if (labels.length < 2) {
|
|
28
|
+
errors.push(makeError("ERR_DOMAIN_NO_DOT"));
|
|
29
|
+
}
|
|
30
|
+
for (let i = 0; i < labels.length; i++) {
|
|
31
|
+
const label = labels[i];
|
|
32
|
+
if (label.length === 0) {
|
|
33
|
+
errors.push(makeError("ERR_DOMAIN_LABEL_EMPTY"));
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (label.length > 63) {
|
|
37
|
+
errors.push(makeError("ERR_DOMAIN_LABEL_LENGTH"));
|
|
38
|
+
}
|
|
39
|
+
if (label.startsWith("-")) {
|
|
40
|
+
errors.push(makeError("ERR_DOMAIN_LABEL_HYPHEN_START"));
|
|
41
|
+
}
|
|
42
|
+
if (label.endsWith("-")) {
|
|
43
|
+
errors.push(makeError("ERR_DOMAIN_LABEL_HYPHEN_END"));
|
|
44
|
+
}
|
|
45
|
+
if (!HOSTNAME_LABEL_RE.test(label)) {
|
|
46
|
+
const badIdx = findFirstInvalidHostnameChar(label);
|
|
47
|
+
errors.push(makeError("ERR_DOMAIN_INVALID_CHAR", badIdx));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const tld = labels[labels.length - 1];
|
|
51
|
+
if (tld && tld.length > 0 && NUMERIC_RE.test(tld)) {
|
|
52
|
+
errors.push(makeError("ERR_DOMAIN_NUMERIC_TLD"));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function validateIPv4Literal(ip, errors) {
|
|
56
|
+
const octets = ip.split(".");
|
|
57
|
+
if (octets.length !== 4) {
|
|
58
|
+
errors.push(makeError("ERR_IPV4_INVALID"));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
for (const octet of octets) {
|
|
62
|
+
if (!/^\d{1,3}$/.test(octet)) {
|
|
63
|
+
errors.push(makeError("ERR_IPV4_INVALID"));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const num = parseInt(octet, 10);
|
|
67
|
+
if (num < 0 || num > 255) {
|
|
68
|
+
errors.push(makeError("ERR_IPV4_INVALID"));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function validateIPv6Literal(ip, errors) {
|
|
74
|
+
if (ip.length === 0) {
|
|
75
|
+
errors.push(makeError("ERR_IPV6_INVALID"));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const hexRe = /^[0-9a-fA-F]{1,4}$/;
|
|
79
|
+
const doubleColonIdx = ip.indexOf("::");
|
|
80
|
+
if (doubleColonIdx !== -1) {
|
|
81
|
+
const before = doubleColonIdx > 0 ? ip.slice(0, doubleColonIdx).split(":") : [];
|
|
82
|
+
const after = doubleColonIdx + 2 < ip.length ? ip.slice(doubleColonIdx + 2).split(":") : [];
|
|
83
|
+
const parts = [...before, ...after];
|
|
84
|
+
if (parts.length > 7) {
|
|
85
|
+
errors.push(makeError("ERR_IPV6_INVALID"));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
for (const part of parts) {
|
|
89
|
+
if (part !== "" && !hexRe.test(part)) {
|
|
90
|
+
errors.push(makeError("ERR_IPV6_INVALID"));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const parts = ip.split(":");
|
|
97
|
+
if (parts.length !== 8) {
|
|
98
|
+
errors.push(makeError("ERR_IPV6_INVALID"));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
for (const part of parts) {
|
|
102
|
+
if (!hexRe.test(part)) {
|
|
103
|
+
errors.push(makeError("ERR_IPV6_INVALID"));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function findFirstInvalidHostnameChar(label) {
|
|
109
|
+
for (let i = 0; i < label.length; i++) {
|
|
110
|
+
const ch = label[i];
|
|
111
|
+
const isAlnum = (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z") || (ch >= "0" && ch <= "9");
|
|
112
|
+
const isHyphen = ch === "-";
|
|
113
|
+
if (!isAlnum && !isHyphen) {
|
|
114
|
+
return i;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return -1;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/email-validator/domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/email-validator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { makeError } from "./diagnostics.js";
|
|
2
|
+
const DOT_ATOM_REGEX = /^[a-zA-Z0-9!#$%&'*+\-/=?^_`{|}~.]+$/;
|
|
3
|
+
const ATEXT_REGEX = /^[a-zA-Z0-9!#$%&'*+\-/=?^_`{|}~]+$/;
|
|
4
|
+
export function validateLocalPart(localPart, maxLength) {
|
|
5
|
+
const errors = [];
|
|
6
|
+
const max = maxLength ?? 64;
|
|
7
|
+
if (localPart.length === 0) {
|
|
8
|
+
errors.push(makeError("ERR_LOCAL_PART_EMPTY", 0));
|
|
9
|
+
return errors;
|
|
10
|
+
}
|
|
11
|
+
if (localPart.length > max) {
|
|
12
|
+
errors.push(makeError("ERR_LOCAL_PART_LENGTH", 0));
|
|
13
|
+
}
|
|
14
|
+
if (localPart.startsWith('"') && localPart.endsWith('"') && localPart.length >= 2) {
|
|
15
|
+
validateQuotedString(localPart, errors);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
validateDotAtom(localPart, errors);
|
|
19
|
+
}
|
|
20
|
+
return errors;
|
|
21
|
+
}
|
|
22
|
+
function validateDotAtom(localPart, errors) {
|
|
23
|
+
if (!DOT_ATOM_REGEX.test(localPart)) {
|
|
24
|
+
const badIdx = findFirstInvalidChar(localPart);
|
|
25
|
+
errors.push(makeError("ERR_LOCAL_PART_INVALID_CHAR", badIdx));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (localPart.startsWith(".")) {
|
|
29
|
+
errors.push(makeError("ERR_LOCAL_PART_DOT_START", 0));
|
|
30
|
+
}
|
|
31
|
+
if (localPart.endsWith(".")) {
|
|
32
|
+
errors.push(makeError("ERR_LOCAL_PART_DOT_END", localPart.length - 1));
|
|
33
|
+
}
|
|
34
|
+
if (localPart.includes("..")) {
|
|
35
|
+
const pos = localPart.indexOf("..");
|
|
36
|
+
errors.push(makeError("ERR_LOCAL_PART_CONSECUTIVE_DOTS", pos));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function validateQuotedString(quoted, errors) {
|
|
40
|
+
const inner = quoted.slice(1, -1);
|
|
41
|
+
for (let i = 0; i < inner.length; i++) {
|
|
42
|
+
const ch = inner[i];
|
|
43
|
+
if (ch === "\\") {
|
|
44
|
+
i++;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (ch === '"') {
|
|
48
|
+
errors.push(makeError("ERR_UNBALANCED_QUOTES", i + 1));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (ch === "\r" || ch === "\n") {
|
|
52
|
+
errors.push(makeError("ERR_LOCAL_PART_INVALID_CHAR", i + 1));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function findFirstInvalidChar(s) {
|
|
58
|
+
for (let i = 0; i < s.length; i++) {
|
|
59
|
+
const segment = s[i];
|
|
60
|
+
if (!ATEXT_REGEX.test(segment) &&
|
|
61
|
+
segment !== ".") {
|
|
62
|
+
return i;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return -1;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=local-part.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-part.js","sourceRoot":"","sources":["../../src/email-validator/local-part.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EmailParseResult, EmailValidatorOptions, ValidationError } from "./types.js";
|
|
2
|
+
export type ParseResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
value: EmailParseResult;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
error: ValidationError;
|
|
8
|
+
};
|
|
9
|
+
export declare function parseEmail(email: string, options: EmailValidatorOptions): ParseResult;
|