@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.
Files changed (140) hide show
  1. package/README.md +203 -269
  2. package/dist/cli/commands.d.ts +0 -10
  3. package/dist/cli/commands.js +1 -184
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/config.d.ts +39 -0
  6. package/dist/config.js +43 -2
  7. package/dist/config.js.map +1 -1
  8. package/dist/email-validator/__tests__/domain.test.d.ts +1 -0
  9. package/dist/email-validator/__tests__/domain.test.js +128 -0
  10. package/dist/email-validator/__tests__/domain.test.js.map +1 -0
  11. package/dist/email-validator/__tests__/local-part.test.d.ts +1 -0
  12. package/dist/email-validator/__tests__/local-part.test.js +110 -0
  13. package/dist/email-validator/__tests__/local-part.test.js.map +1 -0
  14. package/dist/email-validator/__tests__/parser.test.d.ts +1 -0
  15. package/dist/email-validator/__tests__/parser.test.js +161 -0
  16. package/dist/email-validator/__tests__/parser.test.js.map +1 -0
  17. package/dist/email-validator/__tests__/validator.test.d.ts +1 -0
  18. package/dist/email-validator/__tests__/validator.test.js +152 -0
  19. package/dist/email-validator/__tests__/validator.test.js.map +1 -0
  20. package/dist/email-validator/diagnostics.d.ts +3 -0
  21. package/dist/email-validator/diagnostics.js +34 -0
  22. package/dist/email-validator/diagnostics.js.map +1 -0
  23. package/dist/email-validator/domain.d.ts +2 -0
  24. package/dist/email-validator/domain.js +119 -0
  25. package/dist/email-validator/domain.js.map +1 -0
  26. package/dist/email-validator/index.d.ts +2 -0
  27. package/dist/email-validator/index.js +2 -0
  28. package/dist/email-validator/index.js.map +1 -0
  29. package/dist/email-validator/local-part.d.ts +2 -0
  30. package/dist/email-validator/local-part.js +67 -0
  31. package/dist/email-validator/local-part.js.map +1 -0
  32. package/dist/email-validator/parser.d.ts +9 -0
  33. package/dist/email-validator/parser.js +120 -0
  34. package/dist/email-validator/parser.js.map +1 -0
  35. package/dist/email-validator/types.d.ts +24 -0
  36. package/dist/email-validator/types.js +2 -0
  37. package/dist/email-validator/types.js.map +1 -0
  38. package/dist/email-validator/validator.d.ts +9 -0
  39. package/dist/email-validator/validator.js +51 -0
  40. package/dist/email-validator/validator.js.map +1 -0
  41. package/dist/executor/runner.d.ts +19 -2
  42. package/dist/executor/runner.js +29 -4
  43. package/dist/executor/runner.js.map +1 -1
  44. package/dist/executor/template.d.ts +3 -1
  45. package/dist/executor/template.js +19 -16
  46. package/dist/executor/template.js.map +1 -1
  47. package/dist/index.js +11 -34
  48. package/dist/index.js.map +1 -1
  49. package/dist/leader/chain-router.d.ts +10 -2
  50. package/dist/leader/chain-router.js +167 -10
  51. package/dist/leader/chain-router.js.map +1 -1
  52. package/dist/leader/event-bus.d.ts +1 -1
  53. package/dist/leader/event-bus.js +2 -1
  54. package/dist/leader/event-bus.js.map +1 -1
  55. package/dist/leader/index.d.ts +7 -0
  56. package/dist/leader/index.js +99 -8
  57. package/dist/leader/index.js.map +1 -1
  58. package/dist/leader/merge-validator.d.ts +25 -0
  59. package/dist/leader/merge-validator.js +105 -0
  60. package/dist/leader/merge-validator.js.map +1 -0
  61. package/dist/leader/state.d.ts +20 -0
  62. package/dist/leader/state.js +77 -2
  63. package/dist/leader/state.js.map +1 -1
  64. package/dist/leader/stream-tailer.d.ts +12 -0
  65. package/dist/leader/stream-tailer.js +58 -0
  66. package/dist/leader/stream-tailer.js.map +1 -0
  67. package/dist/leader/tui.d.ts +8 -0
  68. package/dist/leader/tui.js +245 -17
  69. package/dist/leader/tui.js.map +1 -1
  70. package/dist/leader/watcher.js +12 -0
  71. package/dist/leader/watcher.js.map +1 -1
  72. package/dist/models/schemas.d.ts +28 -6
  73. package/dist/models/schemas.js +8 -0
  74. package/dist/models/schemas.js.map +1 -1
  75. package/dist/modules/task-queue.js +4 -0
  76. package/dist/modules/task-queue.js.map +1 -1
  77. package/dist/orchestrator/init-checker.d.ts +33 -0
  78. package/dist/orchestrator/init-checker.js +297 -0
  79. package/dist/orchestrator/init-checker.js.map +1 -0
  80. package/dist/orchestrator/run.d.ts +7 -0
  81. package/dist/orchestrator/run.js +126 -0
  82. package/dist/orchestrator/run.js.map +1 -0
  83. package/dist/skills/claude-orchestrator/SKILL.md +75 -217
  84. package/dist/templates/agents/worker-accept.md +48 -0
  85. package/dist/templates/agents/worker-build.md +38 -0
  86. package/dist/templates/agents/worker-commit-message.md +12 -0
  87. package/dist/templates/agents/worker-decompose.md +40 -0
  88. package/dist/templates/agents/worker-evaluate-format-hint.md +7 -0
  89. package/dist/templates/agents/worker-evaluate.md +49 -0
  90. package/dist/templates/agents/worker-identity.md +7 -0
  91. package/dist/templates/agents/worker-merge-decision.md +12 -0
  92. package/dist/templates/agents/worker-plan.md +36 -0
  93. package/dist/templates/agents/worker-review.md +42 -0
  94. package/dist/templates/agents/worker-task-doc.md +13 -0
  95. package/dist/templates/agents/worker-verify.md +44 -0
  96. package/dist/templates/claude-memory/personal-claude-accepter.md +17 -0
  97. package/dist/templates/claude-memory/personal-claude-builder.md +24 -0
  98. package/dist/templates/claude-memory/personal-claude-planner.md +22 -0
  99. package/dist/templates/claude-memory/personal-claude-reviewer.md +25 -0
  100. package/dist/templates/claude-memory/personal-claude-verifier.md +24 -0
  101. package/dist/templates/claude-memory/team-claude.md +61 -0
  102. package/dist/templates/user-global-claude.md +65 -0
  103. package/dist/utils/console-capture.d.ts +2 -0
  104. package/dist/utils/console-capture.js +42 -0
  105. package/dist/utils/console-capture.js.map +1 -0
  106. package/dist/utils/exec.d.ts +2 -6
  107. package/dist/utils/exec.js +48 -29
  108. package/dist/utils/exec.js.map +1 -1
  109. package/dist/utils/json.d.ts +5 -0
  110. package/dist/utils/json.js +17 -0
  111. package/dist/utils/json.js.map +1 -0
  112. package/dist/utils/logger.d.ts +1 -0
  113. package/dist/utils/logger.js +3 -0
  114. package/dist/utils/logger.js.map +1 -1
  115. package/dist/worker/child-runner.d.ts +12 -0
  116. package/dist/worker/child-runner.js +115 -0
  117. package/dist/worker/child-runner.js.map +1 -0
  118. package/dist/worker/child.d.ts +2 -0
  119. package/dist/worker/child.js +8 -0
  120. package/dist/worker/child.js.map +1 -0
  121. package/dist/worker/commit-checker.d.ts +21 -0
  122. package/dist/worker/commit-checker.js +81 -0
  123. package/dist/worker/commit-checker.js.map +1 -0
  124. package/dist/worker/evaluator.d.ts +3 -4
  125. package/dist/worker/evaluator.js +15 -50
  126. package/dist/worker/evaluator.js.map +1 -1
  127. package/dist/worker/watcher.d.ts +5 -1
  128. package/dist/worker/watcher.js +44 -9
  129. package/dist/worker/watcher.js.map +1 -1
  130. package/dist/worker/worktree-initializer.d.ts +10 -0
  131. package/dist/worker/worktree-initializer.js +238 -0
  132. package/dist/worker/worktree-initializer.js.map +1 -0
  133. package/package.json +2 -2
  134. package/dist/templates/worker-accept.md +0 -46
  135. package/dist/templates/worker-build.md +0 -45
  136. package/dist/templates/worker-decompose.md +0 -67
  137. package/dist/templates/worker-evaluate.md +0 -41
  138. package/dist/templates/worker-plan.md +0 -43
  139. package/dist/templates/worker-review.md +0 -46
  140. 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,3 @@
1
+ import type { ValidationError } from "./types.js";
2
+ export declare const ErrorCodes: Record<string, string>;
3
+ export declare function makeError(code: string, position?: number, extra?: Record<string, string>): ValidationError;
@@ -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,2 @@
1
+ import type { ValidationError } from "./types.js";
2
+ export declare function validateDomain(domain: string, isIpLiteral: boolean, isIPv6: boolean, maxLength?: number): ValidationError[];
@@ -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,2 @@
1
+ export { EmailValidator } from "./validator.js";
2
+ export type { EmailValidatorOptions, ValidationResult, ValidationError, EmailParseResult, } from "./types.js";
@@ -0,0 +1,2 @@
1
+ export { EmailValidator } from "./validator.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ import type { ValidationError } from "./types.js";
2
+ export declare function validateLocalPart(localPart: string, maxLength?: number): ValidationError[];
@@ -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;