verifi-lib-js 0.0.0-stage → 2.1.2

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 (33) hide show
  1. package/README.md +29 -2
  2. package/assets/bg/blue.mp4 +0 -0
  3. package/assets/bg/green.mp4 +0 -0
  4. package/assets/bg/poster.jpg +0 -0
  5. package/assets/bg/teal.mp4 +0 -0
  6. package/assets/fonts/auge-bold.otf +0 -0
  7. package/assets/fonts/auge-regular.otf +0 -0
  8. package/assets/fonts/auge-semibold.otf +0 -0
  9. package/assets/fonts/inter-var.ttf +0 -0
  10. package/assets/fonts/jetbrains-mono-var.ttf +0 -0
  11. package/assets/fonts/pacifico.ttf +0 -0
  12. package/assets/fonts/space-grotesk-var.ttf +0 -0
  13. package/assets/logos/verifi-lib-js-backup.svg +48 -0
  14. package/assets/logos/verifi-lib-js.svg +19 -0
  15. package/assets/site/backup/Pacifico-Regular-95szj24p.ttf +0 -0
  16. package/assets/site/backup/auge-bold-vywa1g7b.otf +0 -0
  17. package/assets/site/backup/auge-regular-hz0spgka.otf +0 -0
  18. package/assets/site/backup/auge-semibold-td2xkdwf.otf +0 -0
  19. package/assets/site/backup/copium-meme.png +0 -0
  20. package/assets/site/backup/engine/controller.api.js +1344 -0
  21. package/assets/site/backup/engine/controller.inject.js +511 -0
  22. package/assets/site/backup/engine/controller.sw.js +418 -0
  23. package/assets/site/backup/engine/corridor.js +13215 -0
  24. package/assets/site/backup/engine/corridor.wasm +0 -0
  25. package/assets/site/backup/site-backup.css +1 -0
  26. package/assets/site/backup/site-backup.js +74 -0
  27. package/assets/site/backup/sw.js +224 -0
  28. package/assets/site/index.html +113 -0
  29. package/assets/site/site.css +226 -0
  30. package/assets/site/site.js +209 -0
  31. package/index.cjs +104 -0
  32. package/index.d.ts +16 -0
  33. package/package.json +30 -4
@@ -0,0 +1,209 @@
1
+ /* verifi-lib-js site bundle — docs demo with bundled helpers */
2
+ (function () {
3
+ "use strict";
4
+
5
+ function isEmail(s) {
6
+ return typeof s === "string" && /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(s);
7
+ }
8
+ function isURL(s) {
9
+ if (typeof s !== "string") return false;
10
+ try {
11
+ var u = new URL(s);
12
+ return u.protocol === "http:" || u.protocol === "https:";
13
+ } catch (e) { return false; }
14
+ }
15
+ function isUUID(s) {
16
+ return typeof s === "string" &&
17
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(s);
18
+ }
19
+ function isHexColor(s) {
20
+ return typeof s === "string" && /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(s);
21
+ }
22
+ function isIPv4(s) {
23
+ if (typeof s !== "string") return false;
24
+ var p = s.split(".");
25
+ return p.length === 4 && p.every(function (n) {
26
+ return /^\d{1,3}$/.test(n) && +n <= 255;
27
+ });
28
+ }
29
+ function isJWT(s) {
30
+ if (typeof s !== "string") return false;
31
+ var parts = s.split(".");
32
+ if (parts.length !== 3) return false;
33
+ try {
34
+ parts.forEach(function (p) {
35
+ if (!/^[A-Za-z0-9_-]+={0,2}$/.test(p)) throw 0;
36
+ atob(p.replace(/-/g, "+").replace(/_/g, "/"));
37
+ });
38
+ return true;
39
+ } catch (e) { return false; }
40
+ }
41
+ function isBase64(s) {
42
+ return typeof s === "string" && s.length % 4 === 0 &&
43
+ /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(s);
44
+ }
45
+ function isJSON(s) {
46
+ if (typeof s !== "string") return false;
47
+ try { JSON.parse(s); return true; } catch (e) { return false; }
48
+ }
49
+ function isNumeric(s) {
50
+ if (typeof s === "number") return isFinite(s);
51
+ return typeof s === "string" && s.trim() !== "" && isFinite(Number(s));
52
+ }
53
+ function isSlug(s) {
54
+ return typeof s === "string" && /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(s);
55
+ }
56
+ function luhn(num) {
57
+ var d = String(num).replace(/\D/g, "");
58
+ if (d.length < 13) return false;
59
+ var sum = 0, alt = false;
60
+ for (var i = d.length - 1; i >= 0; i--) {
61
+ var n = +d[i];
62
+ if (alt) { n *= 2; if (n > 9) n -= 9; }
63
+ sum += n; alt = !alt;
64
+ }
65
+ return sum % 10 === 0;
66
+ }
67
+ function isPhone(s) {
68
+ return typeof s === "string" && /^\+?[0-9][0-9\s().-]{6,17}$/.test(s);
69
+ }
70
+ function verify(input, rules) {
71
+ var out = {};
72
+ Object.keys(rules || {}).forEach(function (field) {
73
+ var v = input == null ? "" : input[field];
74
+ var fns = Array.isArray(rules[field]) ? rules[field] : [rules[field]];
75
+ out[field] = fns.every(function (fn) {
76
+ return typeof fn === "function" ? fn(v) : fn.test ? fn.test(v) : true;
77
+ });
78
+ });
79
+ return out;
80
+ }
81
+
82
+ var API = [
83
+ ["isEmail", "isEmail(s)", "Email format check.", "formats"],
84
+ ["isURL", "isURL(s)", "Absolute http(s) URL check.", "formats"],
85
+ ["isUUID", "isUUID(s)", "RFC 4122 UUID v1-v5 check.", "formats"],
86
+ ["isHexColor", "isHexColor(s)", "#rgb, #rgba, #rrggbb, #rrggbbaa.", "formats"],
87
+ ["isIPv4", "isIPv4(s)", "Dotted-quad IPv4 check.", "formats"],
88
+ ["isJWT", "isJWT(s)", "Three-segment JWT shape check.", "formats"],
89
+ ["isBase64", "isBase64(s)", "Base64 string check.", "encodings"],
90
+ ["isJSON", "isJSON(s)", "Parses as JSON.", "encodings"],
91
+ ["isNumeric", "isNumeric(s)", "Finite number or numeric string.", "primitives"],
92
+ ["isSlug", "isSlug(s)", "kebab-case slug shape.", "primitives"],
93
+ ["isPhone", "isPhone(s)", "Loose international phone shape.", "primitives"],
94
+ ["luhn", "luhn(num)", "Luhn checksum: cards, IMEI.", "checksums"],
95
+ ["verify", "verify(input, rules)", "Run rules over an object's fields.", "composite"],
96
+ ];
97
+
98
+ var GROUP_LABEL = {
99
+ formats: "formats",
100
+ encodings: "encodings",
101
+ primitives: "primitives",
102
+ checksums: "checksums",
103
+ composite: "composite",
104
+ };
105
+
106
+ function esc(s) {
107
+ return String(s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
108
+ }
109
+
110
+ function mount() {
111
+ var tbody = document.getElementById("api-rows");
112
+ if (tbody) {
113
+ var lastGroup = null;
114
+ API.forEach(function (row) {
115
+ if (GROUP_LABEL[row[3]] !== lastGroup) {
116
+ lastGroup = GROUP_LABEL[row[3]];
117
+ var h = document.createElement("tr");
118
+ var hc = document.createElement("td");
119
+ hc.colSpan = 3;
120
+ hc.className = "group";
121
+ hc.textContent = lastGroup;
122
+ h.appendChild(hc);
123
+ tbody.appendChild(h);
124
+ }
125
+ var tr = document.createElement("tr");
126
+ tr.innerHTML =
127
+ '<td class="name">' + esc(row[0]) + "</td>" +
128
+ '<td class="sig">' + esc(row[1]) + "</td>" +
129
+ '<td class="what">' + esc(row[2]) + "</td>";
130
+ tbody.appendChild(tr);
131
+ });
132
+ }
133
+
134
+ var set = function (id, text) {
135
+ var el = document.getElementById(id);
136
+ if (el) el.textContent = text;
137
+ };
138
+
139
+ set(
140
+ "demo-cn",
141
+ 'isEmail("dev@example.com")\n' +
142
+ "=> " + isEmail("dev@example.com") + "\n" +
143
+ 'isEmail("not-an-email")\n' +
144
+ "=> " + isEmail("not-an-email")
145
+ );
146
+
147
+ set(
148
+ "demo-fmt",
149
+ 'isURL("https://example.com/x") => ' + isURL("https://example.com/x") + "\n" +
150
+ 'isUUID("3f6b2c1e-1234-4234-8234-aaaaaaaaaaaa")\n' +
151
+ "=> " + isUUID("3f6b2c1e-1234-4234-8234-aaaaaaaaaaaa") + "\n" +
152
+ 'isHexColor("#6fd9ae") => ' + isHexColor("#6fd9ae")
153
+ );
154
+
155
+ set(
156
+ "demo-time",
157
+ 'luhn("4111111111111111") => ' + luhn("4111111111111111") + "\n" +
158
+ 'luhn("4111111111111112") => ' + luhn("4111111111111112") + "\n" +
159
+ 'isPhone("+1 (555) 010-2233") => ' + isPhone("+1 (555) 010-2233")
160
+ );
161
+
162
+ set(
163
+ "demo-deb",
164
+ "verify(user, { email: isEmail, age: fn })\n" +
165
+ "user = { email: \"ada@analytical.dev\", age: 36 }\n" +
166
+ "=> " + JSON.stringify(verify(
167
+ { email: "ada@analytical.dev", age: 36 },
168
+ { email: isEmail, age: function (v) { return typeof v === "number" && v >= 13; } }
169
+ ))
170
+ );
171
+
172
+ var btn = document.getElementById("copy-install");
173
+ if (btn) {
174
+ btn.addEventListener("click", function () {
175
+ var text = "npm install verifi-lib-js";
176
+ var done = function () {
177
+ btn.textContent = "copied";
178
+ btn.classList.add("done");
179
+ setTimeout(function () {
180
+ btn.textContent = "copy";
181
+ btn.classList.remove("done");
182
+ }, 1400);
183
+ };
184
+ if (navigator.clipboard && navigator.clipboard.writeText) {
185
+ navigator.clipboard.writeText(text).then(done, fallback);
186
+ } else {
187
+ fallback();
188
+ }
189
+ function fallback() {
190
+ var ta = document.createElement("textarea");
191
+ ta.value = text;
192
+ ta.style.position = "fixed";
193
+ ta.style.opacity = "0";
194
+ document.body.appendChild(ta);
195
+ ta.select();
196
+ try { document.execCommand("copy"); } catch (e) {}
197
+ document.body.removeChild(ta);
198
+ done();
199
+ }
200
+ });
201
+ }
202
+ }
203
+
204
+ if (document.readyState === "loading") {
205
+ document.addEventListener("DOMContentLoaded", mount);
206
+ } else {
207
+ mount();
208
+ }
209
+ })();
package/index.cjs ADDED
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ function isEmail(s) {
4
+ return typeof s === "string" && /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(s);
5
+ }
6
+
7
+ function isURL(s) {
8
+ if (typeof s !== "string") return false;
9
+ try {
10
+ const u = new URL(s);
11
+ return u.protocol === "http:" || u.protocol === "https:";
12
+ } catch {
13
+ return false;
14
+ }
15
+ }
16
+
17
+ function isUUID(s) {
18
+ return typeof s === "string" &&
19
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(s);
20
+ }
21
+
22
+ function isHexColor(s) {
23
+ return typeof s === "string" && /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(s);
24
+ }
25
+
26
+ function isIPv4(s) {
27
+ if (typeof s !== "string") return false;
28
+ const p = s.split(".");
29
+ return p.length === 4 && p.every((n) => /^\d{1,3}$/.test(n) && +n <= 255 && String(+n) === n.replace(/^0+(?=\d)/, ""));
30
+ }
31
+
32
+ function isJWT(s) {
33
+ if (typeof s !== "string") return false;
34
+ const parts = s.split(".");
35
+ if (parts.length !== 3) return false;
36
+ try {
37
+ for (const p of parts) {
38
+ if (!/^[A-Za-z0-9_-]+={0,2}$/.test(p)) return false;
39
+ Buffer.from(p.replace(/-/g, "+").replace(/_/g, "/"), "base64");
40
+ }
41
+ return true;
42
+ } catch {
43
+ return false;
44
+ }
45
+ }
46
+
47
+ function isBase64(s) {
48
+ return typeof s === "string" && s.length % 4 === 0 &&
49
+ /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(s);
50
+ }
51
+
52
+ function isJSON(s) {
53
+ if (typeof s !== "string") return false;
54
+ try {
55
+ JSON.parse(s);
56
+ return true;
57
+ } catch {
58
+ return false;
59
+ }
60
+ }
61
+
62
+ function isNumeric(s) {
63
+ if (typeof s === "number") return isFinite(s);
64
+ return typeof s === "string" && s.trim() !== "" && isFinite(Number(s));
65
+ }
66
+
67
+ function isSlug(s) {
68
+ return typeof s === "string" && /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(s);
69
+ }
70
+
71
+ function luhn(num) {
72
+ const d = String(num).replace(/\D/g, "");
73
+ if (d.length < 13) return false;
74
+ let sum = 0, alt = false;
75
+ for (let i = d.length - 1; i >= 0; i--) {
76
+ let n = +d[i];
77
+ if (alt) {
78
+ n *= 2;
79
+ if (n > 9) n -= 9;
80
+ }
81
+ sum += n;
82
+ alt = !alt;
83
+ }
84
+ return sum % 10 === 0;
85
+ }
86
+
87
+ function isPhone(s) {
88
+ return typeof s === "string" && /^\+?[0-9][0-9\s().-]{6,17}$/.test(s);
89
+ }
90
+
91
+ function verify(input, rules = {}) {
92
+ const out = {};
93
+ for (const [field, rule] of Object.entries(rules)) {
94
+ const v = input == null ? "" : input[field];
95
+ const fns = Array.isArray(rule) ? rule : [rule];
96
+ out[field] = fns.every((fn) => typeof fn === "function" ? fn(v) : fn.test ? fn.test(v) : true);
97
+ }
98
+ return out;
99
+ }
100
+
101
+ module.exports = {
102
+ isEmail, isURL, isUUID, isHexColor, isIPv4, isJWT,
103
+ isBase64, isJSON, isNumeric, isSlug, isPhone, luhn, verify,
104
+ };
package/index.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export declare function isEmail(s: unknown): boolean;
2
+ export declare function isURL(s: unknown): boolean;
3
+ export declare function isUUID(s: unknown): boolean;
4
+ export declare function isHexColor(s: unknown): boolean;
5
+ export declare function isIPv4(s: unknown): boolean;
6
+ export declare function isJWT(s: unknown): boolean;
7
+ export declare function isBase64(s: unknown): boolean;
8
+ export declare function isJSON(s: unknown): boolean;
9
+ export declare function isNumeric(s: unknown): boolean;
10
+ export declare function isSlug(s: unknown): boolean;
11
+ export declare function isPhone(s: unknown): boolean;
12
+ export declare function luhn(num: unknown): boolean;
13
+ export declare function verify(
14
+ input: Record<string, unknown> | null | undefined,
15
+ rules: Record<string, Array<((v: unknown) => boolean) | RegExp>>
16
+ ): Record<string, boolean>;
package/package.json CHANGED
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "name": "verifi-lib-js",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "2.1.2",
4
+ "description": "Small, dependency-free validators for emails, URLs, UUIDs, colors, IPs, JWTs, and more.",
5
+ "main": "index.cjs",
6
+ "types": "index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./index.d.ts",
10
+ "import": "./index.cjs",
11
+ "require": "./index.cjs"
12
+ }
13
+ },
14
+ "files": [
15
+ "index.cjs",
16
+ "index.d.ts",
17
+ "README.md",
18
+ "assets"
19
+ ],
20
+ "keywords": [
21
+ "validation",
22
+ "validator",
23
+ "verify",
24
+ "email",
25
+ "url",
26
+ "uuid",
27
+ "zero-dependency"
28
+ ],
29
+ "license": "MIT",
30
+ "engines": { "node": ">=14" },
31
+ "sideEffects": false
32
+ }