@veilpass/shared 0.1.0
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/LICENSE +9 -0
- package/README.md +20 -0
- package/dist/chunk-LYZMDCUB.js +30 -0
- package/dist/chunk-LYZMDCUB.js.map +1 -0
- package/dist/chunk-MX2GIROV.js +72 -0
- package/dist/chunk-MX2GIROV.js.map +1 -0
- package/dist/contracts.cjs +103 -0
- package/dist/contracts.cjs.map +1 -0
- package/dist/contracts.d.cts +116 -0
- package/dist/contracts.d.ts +116 -0
- package/dist/contracts.js +21 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.cjs +208 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/origin.cjs +54 -0
- package/dist/origin.cjs.map +1 -0
- package/dist/origin.d.cts +4 -0
- package/dist/origin.d.ts +4 -0
- package/dist/origin.js +7 -0
- package/dist/origin.js.map +1 -0
- package/package.json +24 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Irham Tri Ahmadi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# @veilpass/shared
|
|
2
|
+
|
|
3
|
+
Shared, runtime-validated contracts for a VeilPass host integration.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @veilpass/shared
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Use
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { normalizeOrigin, verifyResultSchema } from "@veilpass/shared";
|
|
15
|
+
|
|
16
|
+
const hostOrigin = normalizeOrigin("https://app.example");
|
|
17
|
+
const result = verifyResultSchema.parse(serverResponse);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This package contains no wallet access, proof generation, or server persistence. It provides the public schemas and exact-origin normalization shared by the browser SDK and host verifier.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/origin.ts
|
|
2
|
+
function isLoopback(hostname) {
|
|
3
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
|
|
4
|
+
}
|
|
5
|
+
function normalizeOrigin(input) {
|
|
6
|
+
let parsed;
|
|
7
|
+
try {
|
|
8
|
+
parsed = new URL(input);
|
|
9
|
+
} catch {
|
|
10
|
+
throw new Error("Origin must be an absolute HTTP or HTTPS origin");
|
|
11
|
+
}
|
|
12
|
+
const protocol = parsed.protocol.toLowerCase();
|
|
13
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
14
|
+
const hasExtraParts = parsed.pathname !== "" && parsed.pathname !== "/" || parsed.search !== "" || parsed.hash !== "";
|
|
15
|
+
if (protocol !== "https:" && protocol !== "http:") {
|
|
16
|
+
throw new Error("Origin must use HTTP or HTTPS");
|
|
17
|
+
}
|
|
18
|
+
if (protocol === "http:" && !isLoopback(hostname)) {
|
|
19
|
+
throw new Error("Origin must use HTTPS outside local development");
|
|
20
|
+
}
|
|
21
|
+
if (!hostname || hostname.includes("*") || parsed.username !== "" || parsed.password !== "" || hasExtraParts) {
|
|
22
|
+
throw new Error("Origin must not include credentials, wildcards, or URL parts");
|
|
23
|
+
}
|
|
24
|
+
return `${protocol}//${parsed.host.toLowerCase()}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
normalizeOrigin
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=chunk-LYZMDCUB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/origin.ts"],"sourcesContent":["export type NormalizedOrigin = `${\"http\" | \"https\"}://${string}`;\n\nfunction isLoopback(hostname: string) {\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"[::1]\"\n );\n}\n\nexport function normalizeOrigin(input: string): NormalizedOrigin {\n let parsed: URL;\n\n try {\n parsed = new URL(input);\n } catch {\n throw new Error(\"Origin must be an absolute HTTP or HTTPS origin\");\n }\n\n const protocol = parsed.protocol.toLowerCase();\n const hostname = parsed.hostname.toLowerCase();\n const hasExtraParts =\n (parsed.pathname !== \"\" && parsed.pathname !== \"/\") ||\n parsed.search !== \"\" ||\n parsed.hash !== \"\";\n\n if (protocol !== \"https:\" && protocol !== \"http:\") {\n throw new Error(\"Origin must use HTTP or HTTPS\");\n }\n if (protocol === \"http:\" && !isLoopback(hostname)) {\n throw new Error(\"Origin must use HTTPS outside local development\");\n }\n if (\n !hostname ||\n hostname.includes(\"*\") ||\n parsed.username !== \"\" ||\n parsed.password !== \"\" ||\n hasExtraParts\n ) {\n throw new Error(\"Origin must not include credentials, wildcards, or URL parts\");\n }\n\n return `${protocol}//${parsed.host.toLowerCase()}` as NormalizedOrigin;\n}\n"],"mappings":";AAEA,SAAS,WAAW,UAAkB;AACpC,SACE,aAAa,eACb,aAAa,eACb,aAAa;AAEjB;AAEO,SAAS,gBAAgB,OAAiC;AAC/D,MAAI;AAEJ,MAAI;AACF,aAAS,IAAI,IAAI,KAAK;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,QAAM,WAAW,OAAO,SAAS,YAAY;AAC7C,QAAM,WAAW,OAAO,SAAS,YAAY;AAC7C,QAAM,gBACH,OAAO,aAAa,MAAM,OAAO,aAAa,OAC/C,OAAO,WAAW,MAClB,OAAO,SAAS;AAElB,MAAI,aAAa,YAAY,aAAa,SAAS;AACjD,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,MAAI,aAAa,WAAW,CAAC,WAAW,QAAQ,GAAG;AACjD,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,MACE,CAAC,YACD,SAAS,SAAS,GAAG,KACrB,OAAO,aAAa,MACpB,OAAO,aAAa,MACpB,eACA;AACA,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAEA,SAAO,GAAG,QAAQ,KAAK,OAAO,KAAK,YAAY,CAAC;AAClD;","names":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/contracts.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var VEILPASS_ERROR_CODES = [
|
|
4
|
+
"WALLET_NOT_FOUND",
|
|
5
|
+
"WRONG_NETWORK",
|
|
6
|
+
"USER_REJECTED",
|
|
7
|
+
"NOT_ELIGIBLE",
|
|
8
|
+
"CHALLENGE_EXPIRED",
|
|
9
|
+
"CHALLENGE_SPENT",
|
|
10
|
+
"ORIGIN_MISMATCH",
|
|
11
|
+
"GATE_MISMATCH",
|
|
12
|
+
"STALE_EPOCH",
|
|
13
|
+
"CREDENTIAL_EXPIRED",
|
|
14
|
+
"CREDENTIAL_REVOKED",
|
|
15
|
+
"PROOF_INVALID",
|
|
16
|
+
"SERVICE_UNAVAILABLE"
|
|
17
|
+
];
|
|
18
|
+
var veilPassErrorCodeSchema = z.enum(VEILPASS_ERROR_CODES);
|
|
19
|
+
var publicInputsSchema = z.object({
|
|
20
|
+
gateId: z.string().min(1).max(128),
|
|
21
|
+
epoch: z.number().int().nonnegative(),
|
|
22
|
+
origin: z.string().min(1).max(512),
|
|
23
|
+
challengeHash: z.string().min(1).max(256),
|
|
24
|
+
credentialCommitment: z.string().min(1).max(256),
|
|
25
|
+
credentialRoot: z.string().min(1).max(256),
|
|
26
|
+
privateAppId: z.string().min(1).max(256),
|
|
27
|
+
loginNullifier: z.string().min(1).max(256),
|
|
28
|
+
revocationHash: z.string().min(1).max(256),
|
|
29
|
+
proofCreatedAt: z.string().datetime(),
|
|
30
|
+
proofExpiresAt: z.string().datetime()
|
|
31
|
+
}).strict();
|
|
32
|
+
var proofResultSchema = z.object({
|
|
33
|
+
challengeId: z.string().min(1).max(128),
|
|
34
|
+
proof: z.string().min(1).max(15e5),
|
|
35
|
+
publicInputs: publicInputsSchema
|
|
36
|
+
}).strict();
|
|
37
|
+
var verifiedLoginSchema = z.object({
|
|
38
|
+
ok: z.literal(true),
|
|
39
|
+
privateAppId: z.string().min(1).max(256),
|
|
40
|
+
gateId: z.string().min(1).max(128),
|
|
41
|
+
epoch: z.number().int().nonnegative(),
|
|
42
|
+
origin: z.string().min(1).max(512),
|
|
43
|
+
expiresAt: z.string().datetime()
|
|
44
|
+
}).strict();
|
|
45
|
+
var verifyErrorSchema = z.object({
|
|
46
|
+
ok: z.literal(false),
|
|
47
|
+
error: veilPassErrorCodeSchema,
|
|
48
|
+
requestId: z.string().min(1).max(128)
|
|
49
|
+
}).strict();
|
|
50
|
+
var verifyResultSchema = z.discriminatedUnion("ok", [
|
|
51
|
+
verifiedLoginSchema,
|
|
52
|
+
verifyErrorSchema
|
|
53
|
+
]);
|
|
54
|
+
var challengeResponseSchema = z.object({
|
|
55
|
+
challengeId: z.string().min(1).max(128),
|
|
56
|
+
challenge: z.string().min(1).max(512),
|
|
57
|
+
origin: z.string().min(1).max(512),
|
|
58
|
+
gateId: z.string().min(1).max(128),
|
|
59
|
+
expiresAt: z.string().datetime()
|
|
60
|
+
}).strict();
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
VEILPASS_ERROR_CODES,
|
|
64
|
+
veilPassErrorCodeSchema,
|
|
65
|
+
publicInputsSchema,
|
|
66
|
+
proofResultSchema,
|
|
67
|
+
verifiedLoginSchema,
|
|
68
|
+
verifyErrorSchema,
|
|
69
|
+
verifyResultSchema,
|
|
70
|
+
challengeResponseSchema
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=chunk-MX2GIROV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contracts.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nexport const VEILPASS_ERROR_CODES = [\r\n \"WALLET_NOT_FOUND\",\r\n \"WRONG_NETWORK\",\r\n \"USER_REJECTED\",\r\n \"NOT_ELIGIBLE\",\r\n \"CHALLENGE_EXPIRED\",\r\n \"CHALLENGE_SPENT\",\r\n \"ORIGIN_MISMATCH\",\r\n \"GATE_MISMATCH\",\r\n \"STALE_EPOCH\",\r\n \"CREDENTIAL_EXPIRED\",\r\n \"CREDENTIAL_REVOKED\",\r\n \"PROOF_INVALID\",\r\n \"SERVICE_UNAVAILABLE\",\r\n] as const;\r\n\r\nexport const veilPassErrorCodeSchema = z.enum(VEILPASS_ERROR_CODES);\r\n\r\nexport const publicInputsSchema = z\r\n .object({\r\n gateId: z.string().min(1).max(128),\r\n epoch: z.number().int().nonnegative(),\r\n origin: z.string().min(1).max(512),\r\n challengeHash: z.string().min(1).max(256),\r\n credentialCommitment: z.string().min(1).max(256),\r\n credentialRoot: z.string().min(1).max(256),\r\n privateAppId: z.string().min(1).max(256),\r\n loginNullifier: z.string().min(1).max(256),\r\n revocationHash: z.string().min(1).max(256),\r\n proofCreatedAt: z.string().datetime(),\r\n proofExpiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport const proofResultSchema = z\r\n .object({\r\n challengeId: z.string().min(1).max(128),\r\n proof: z.string().min(1).max(1_500_000),\r\n publicInputs: publicInputsSchema,\r\n })\r\n .strict();\r\n\r\nexport const verifiedLoginSchema = z\r\n .object({\r\n ok: z.literal(true),\r\n privateAppId: z.string().min(1).max(256),\r\n gateId: z.string().min(1).max(128),\r\n epoch: z.number().int().nonnegative(),\r\n origin: z.string().min(1).max(512),\r\n expiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport const verifyErrorSchema = z\r\n .object({\r\n ok: z.literal(false),\r\n error: veilPassErrorCodeSchema,\r\n requestId: z.string().min(1).max(128),\r\n })\r\n .strict();\r\n\r\nexport const verifyResultSchema = z.discriminatedUnion(\"ok\", [\r\n verifiedLoginSchema,\r\n verifyErrorSchema,\r\n]);\r\n\r\nexport const challengeResponseSchema = z\r\n .object({\r\n challengeId: z.string().min(1).max(128),\r\n challenge: z.string().min(1).max(512),\r\n origin: z.string().min(1).max(512),\r\n gateId: z.string().min(1).max(128),\r\n expiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport type VeilPassErrorCode = z.infer<typeof veilPassErrorCodeSchema>;\r\nexport type PublicInputs = z.infer<typeof publicInputsSchema>;\r\nexport type ProofResult = z.infer<typeof proofResultSchema>;\r\nexport type VerifiedLogin = z.infer<typeof verifiedLoginSchema>;\r\nexport type VerifyResult = z.infer<typeof verifyResultSchema>;\r\nexport type ChallengeResponse = z.infer<typeof challengeResponseSchema>;\r\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,0BAA0B,EAAE,KAAK,oBAAoB;AAE3D,IAAM,qBAAqB,EAC/B,OAAO;AAAA,EACN,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACxC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/C,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACzC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACvC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACzC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACzC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AACtC,CAAC,EACA,OAAO;AAEH,IAAM,oBAAoB,EAC9B,OAAO;AAAA,EACN,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAS;AAAA,EACtC,cAAc;AAChB,CAAC,EACA,OAAO;AAEH,IAAM,sBAAsB,EAChC,OAAO;AAAA,EACN,IAAI,EAAE,QAAQ,IAAI;AAAA,EAClB,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACvC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EACA,OAAO;AAEH,IAAM,oBAAoB,EAC9B,OAAO;AAAA,EACN,IAAI,EAAE,QAAQ,KAAK;AAAA,EACnB,OAAO;AAAA,EACP,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACtC,CAAC,EACA,OAAO;AAEH,IAAM,qBAAqB,EAAE,mBAAmB,MAAM;AAAA,EAC3D;AAAA,EACA;AACF,CAAC;AAEM,IAAM,0BAA0B,EACpC,OAAO;AAAA,EACN,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EACA,OAAO;","names":[]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/contracts.ts
|
|
21
|
+
var contracts_exports = {};
|
|
22
|
+
__export(contracts_exports, {
|
|
23
|
+
VEILPASS_ERROR_CODES: () => VEILPASS_ERROR_CODES,
|
|
24
|
+
challengeResponseSchema: () => challengeResponseSchema,
|
|
25
|
+
proofResultSchema: () => proofResultSchema,
|
|
26
|
+
publicInputsSchema: () => publicInputsSchema,
|
|
27
|
+
veilPassErrorCodeSchema: () => veilPassErrorCodeSchema,
|
|
28
|
+
verifiedLoginSchema: () => verifiedLoginSchema,
|
|
29
|
+
verifyErrorSchema: () => verifyErrorSchema,
|
|
30
|
+
verifyResultSchema: () => verifyResultSchema
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(contracts_exports);
|
|
33
|
+
var import_zod = require("zod");
|
|
34
|
+
var VEILPASS_ERROR_CODES = [
|
|
35
|
+
"WALLET_NOT_FOUND",
|
|
36
|
+
"WRONG_NETWORK",
|
|
37
|
+
"USER_REJECTED",
|
|
38
|
+
"NOT_ELIGIBLE",
|
|
39
|
+
"CHALLENGE_EXPIRED",
|
|
40
|
+
"CHALLENGE_SPENT",
|
|
41
|
+
"ORIGIN_MISMATCH",
|
|
42
|
+
"GATE_MISMATCH",
|
|
43
|
+
"STALE_EPOCH",
|
|
44
|
+
"CREDENTIAL_EXPIRED",
|
|
45
|
+
"CREDENTIAL_REVOKED",
|
|
46
|
+
"PROOF_INVALID",
|
|
47
|
+
"SERVICE_UNAVAILABLE"
|
|
48
|
+
];
|
|
49
|
+
var veilPassErrorCodeSchema = import_zod.z.enum(VEILPASS_ERROR_CODES);
|
|
50
|
+
var publicInputsSchema = import_zod.z.object({
|
|
51
|
+
gateId: import_zod.z.string().min(1).max(128),
|
|
52
|
+
epoch: import_zod.z.number().int().nonnegative(),
|
|
53
|
+
origin: import_zod.z.string().min(1).max(512),
|
|
54
|
+
challengeHash: import_zod.z.string().min(1).max(256),
|
|
55
|
+
credentialCommitment: import_zod.z.string().min(1).max(256),
|
|
56
|
+
credentialRoot: import_zod.z.string().min(1).max(256),
|
|
57
|
+
privateAppId: import_zod.z.string().min(1).max(256),
|
|
58
|
+
loginNullifier: import_zod.z.string().min(1).max(256),
|
|
59
|
+
revocationHash: import_zod.z.string().min(1).max(256),
|
|
60
|
+
proofCreatedAt: import_zod.z.string().datetime(),
|
|
61
|
+
proofExpiresAt: import_zod.z.string().datetime()
|
|
62
|
+
}).strict();
|
|
63
|
+
var proofResultSchema = import_zod.z.object({
|
|
64
|
+
challengeId: import_zod.z.string().min(1).max(128),
|
|
65
|
+
proof: import_zod.z.string().min(1).max(15e5),
|
|
66
|
+
publicInputs: publicInputsSchema
|
|
67
|
+
}).strict();
|
|
68
|
+
var verifiedLoginSchema = import_zod.z.object({
|
|
69
|
+
ok: import_zod.z.literal(true),
|
|
70
|
+
privateAppId: import_zod.z.string().min(1).max(256),
|
|
71
|
+
gateId: import_zod.z.string().min(1).max(128),
|
|
72
|
+
epoch: import_zod.z.number().int().nonnegative(),
|
|
73
|
+
origin: import_zod.z.string().min(1).max(512),
|
|
74
|
+
expiresAt: import_zod.z.string().datetime()
|
|
75
|
+
}).strict();
|
|
76
|
+
var verifyErrorSchema = import_zod.z.object({
|
|
77
|
+
ok: import_zod.z.literal(false),
|
|
78
|
+
error: veilPassErrorCodeSchema,
|
|
79
|
+
requestId: import_zod.z.string().min(1).max(128)
|
|
80
|
+
}).strict();
|
|
81
|
+
var verifyResultSchema = import_zod.z.discriminatedUnion("ok", [
|
|
82
|
+
verifiedLoginSchema,
|
|
83
|
+
verifyErrorSchema
|
|
84
|
+
]);
|
|
85
|
+
var challengeResponseSchema = import_zod.z.object({
|
|
86
|
+
challengeId: import_zod.z.string().min(1).max(128),
|
|
87
|
+
challenge: import_zod.z.string().min(1).max(512),
|
|
88
|
+
origin: import_zod.z.string().min(1).max(512),
|
|
89
|
+
gateId: import_zod.z.string().min(1).max(128),
|
|
90
|
+
expiresAt: import_zod.z.string().datetime()
|
|
91
|
+
}).strict();
|
|
92
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
93
|
+
0 && (module.exports = {
|
|
94
|
+
VEILPASS_ERROR_CODES,
|
|
95
|
+
challengeResponseSchema,
|
|
96
|
+
proofResultSchema,
|
|
97
|
+
publicInputsSchema,
|
|
98
|
+
veilPassErrorCodeSchema,
|
|
99
|
+
verifiedLoginSchema,
|
|
100
|
+
verifyErrorSchema,
|
|
101
|
+
verifyResultSchema
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=contracts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contracts.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nexport const VEILPASS_ERROR_CODES = [\r\n \"WALLET_NOT_FOUND\",\r\n \"WRONG_NETWORK\",\r\n \"USER_REJECTED\",\r\n \"NOT_ELIGIBLE\",\r\n \"CHALLENGE_EXPIRED\",\r\n \"CHALLENGE_SPENT\",\r\n \"ORIGIN_MISMATCH\",\r\n \"GATE_MISMATCH\",\r\n \"STALE_EPOCH\",\r\n \"CREDENTIAL_EXPIRED\",\r\n \"CREDENTIAL_REVOKED\",\r\n \"PROOF_INVALID\",\r\n \"SERVICE_UNAVAILABLE\",\r\n] as const;\r\n\r\nexport const veilPassErrorCodeSchema = z.enum(VEILPASS_ERROR_CODES);\r\n\r\nexport const publicInputsSchema = z\r\n .object({\r\n gateId: z.string().min(1).max(128),\r\n epoch: z.number().int().nonnegative(),\r\n origin: z.string().min(1).max(512),\r\n challengeHash: z.string().min(1).max(256),\r\n credentialCommitment: z.string().min(1).max(256),\r\n credentialRoot: z.string().min(1).max(256),\r\n privateAppId: z.string().min(1).max(256),\r\n loginNullifier: z.string().min(1).max(256),\r\n revocationHash: z.string().min(1).max(256),\r\n proofCreatedAt: z.string().datetime(),\r\n proofExpiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport const proofResultSchema = z\r\n .object({\r\n challengeId: z.string().min(1).max(128),\r\n proof: z.string().min(1).max(1_500_000),\r\n publicInputs: publicInputsSchema,\r\n })\r\n .strict();\r\n\r\nexport const verifiedLoginSchema = z\r\n .object({\r\n ok: z.literal(true),\r\n privateAppId: z.string().min(1).max(256),\r\n gateId: z.string().min(1).max(128),\r\n epoch: z.number().int().nonnegative(),\r\n origin: z.string().min(1).max(512),\r\n expiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport const verifyErrorSchema = z\r\n .object({\r\n ok: z.literal(false),\r\n error: veilPassErrorCodeSchema,\r\n requestId: z.string().min(1).max(128),\r\n })\r\n .strict();\r\n\r\nexport const verifyResultSchema = z.discriminatedUnion(\"ok\", [\r\n verifiedLoginSchema,\r\n verifyErrorSchema,\r\n]);\r\n\r\nexport const challengeResponseSchema = z\r\n .object({\r\n challengeId: z.string().min(1).max(128),\r\n challenge: z.string().min(1).max(512),\r\n origin: z.string().min(1).max(512),\r\n gateId: z.string().min(1).max(128),\r\n expiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport type VeilPassErrorCode = z.infer<typeof veilPassErrorCodeSchema>;\r\nexport type PublicInputs = z.infer<typeof publicInputsSchema>;\r\nexport type ProofResult = z.infer<typeof proofResultSchema>;\r\nexport type VerifiedLogin = z.infer<typeof verifiedLoginSchema>;\r\nexport type VerifyResult = z.infer<typeof verifyResultSchema>;\r\nexport type ChallengeResponse = z.infer<typeof challengeResponseSchema>;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAEX,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,0BAA0B,aAAE,KAAK,oBAAoB;AAE3D,IAAM,qBAAqB,aAC/B,OAAO;AAAA,EACN,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,eAAe,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACxC,sBAAsB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/C,gBAAgB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACzC,cAAc,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACvC,gBAAgB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACzC,gBAAgB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACzC,gBAAgB,aAAE,OAAO,EAAE,SAAS;AAAA,EACpC,gBAAgB,aAAE,OAAO,EAAE,SAAS;AACtC,CAAC,EACA,OAAO;AAEH,IAAM,oBAAoB,aAC9B,OAAO;AAAA,EACN,aAAa,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAS;AAAA,EACtC,cAAc;AAChB,CAAC,EACA,OAAO;AAEH,IAAM,sBAAsB,aAChC,OAAO;AAAA,EACN,IAAI,aAAE,QAAQ,IAAI;AAAA,EAClB,cAAc,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACvC,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,WAAW,aAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EACA,OAAO;AAEH,IAAM,oBAAoB,aAC9B,OAAO;AAAA,EACN,IAAI,aAAE,QAAQ,KAAK;AAAA,EACnB,OAAO;AAAA,EACP,WAAW,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACtC,CAAC,EACA,OAAO;AAEH,IAAM,qBAAqB,aAAE,mBAAmB,MAAM;AAAA,EAC3D;AAAA,EACA;AACF,CAAC;AAEM,IAAM,0BAA0B,aACpC,OAAO;AAAA,EACN,aAAa,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,WAAW,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjC,WAAW,aAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EACA,OAAO;","names":[]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
declare const VEILPASS_ERROR_CODES: readonly ["WALLET_NOT_FOUND", "WRONG_NETWORK", "USER_REJECTED", "NOT_ELIGIBLE", "CHALLENGE_EXPIRED", "CHALLENGE_SPENT", "ORIGIN_MISMATCH", "GATE_MISMATCH", "STALE_EPOCH", "CREDENTIAL_EXPIRED", "CREDENTIAL_REVOKED", "PROOF_INVALID", "SERVICE_UNAVAILABLE"];
|
|
4
|
+
declare const veilPassErrorCodeSchema: z.ZodEnum<{
|
|
5
|
+
WALLET_NOT_FOUND: "WALLET_NOT_FOUND";
|
|
6
|
+
WRONG_NETWORK: "WRONG_NETWORK";
|
|
7
|
+
USER_REJECTED: "USER_REJECTED";
|
|
8
|
+
NOT_ELIGIBLE: "NOT_ELIGIBLE";
|
|
9
|
+
CHALLENGE_EXPIRED: "CHALLENGE_EXPIRED";
|
|
10
|
+
CHALLENGE_SPENT: "CHALLENGE_SPENT";
|
|
11
|
+
ORIGIN_MISMATCH: "ORIGIN_MISMATCH";
|
|
12
|
+
GATE_MISMATCH: "GATE_MISMATCH";
|
|
13
|
+
STALE_EPOCH: "STALE_EPOCH";
|
|
14
|
+
CREDENTIAL_EXPIRED: "CREDENTIAL_EXPIRED";
|
|
15
|
+
CREDENTIAL_REVOKED: "CREDENTIAL_REVOKED";
|
|
16
|
+
PROOF_INVALID: "PROOF_INVALID";
|
|
17
|
+
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
|
|
18
|
+
}>;
|
|
19
|
+
declare const publicInputsSchema: z.ZodObject<{
|
|
20
|
+
gateId: z.ZodString;
|
|
21
|
+
epoch: z.ZodNumber;
|
|
22
|
+
origin: z.ZodString;
|
|
23
|
+
challengeHash: z.ZodString;
|
|
24
|
+
credentialCommitment: z.ZodString;
|
|
25
|
+
credentialRoot: z.ZodString;
|
|
26
|
+
privateAppId: z.ZodString;
|
|
27
|
+
loginNullifier: z.ZodString;
|
|
28
|
+
revocationHash: z.ZodString;
|
|
29
|
+
proofCreatedAt: z.ZodString;
|
|
30
|
+
proofExpiresAt: z.ZodString;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
declare const proofResultSchema: z.ZodObject<{
|
|
33
|
+
challengeId: z.ZodString;
|
|
34
|
+
proof: z.ZodString;
|
|
35
|
+
publicInputs: z.ZodObject<{
|
|
36
|
+
gateId: z.ZodString;
|
|
37
|
+
epoch: z.ZodNumber;
|
|
38
|
+
origin: z.ZodString;
|
|
39
|
+
challengeHash: z.ZodString;
|
|
40
|
+
credentialCommitment: z.ZodString;
|
|
41
|
+
credentialRoot: z.ZodString;
|
|
42
|
+
privateAppId: z.ZodString;
|
|
43
|
+
loginNullifier: z.ZodString;
|
|
44
|
+
revocationHash: z.ZodString;
|
|
45
|
+
proofCreatedAt: z.ZodString;
|
|
46
|
+
proofExpiresAt: z.ZodString;
|
|
47
|
+
}, z.core.$strict>;
|
|
48
|
+
}, z.core.$strict>;
|
|
49
|
+
declare const verifiedLoginSchema: z.ZodObject<{
|
|
50
|
+
ok: z.ZodLiteral<true>;
|
|
51
|
+
privateAppId: z.ZodString;
|
|
52
|
+
gateId: z.ZodString;
|
|
53
|
+
epoch: z.ZodNumber;
|
|
54
|
+
origin: z.ZodString;
|
|
55
|
+
expiresAt: z.ZodString;
|
|
56
|
+
}, z.core.$strict>;
|
|
57
|
+
declare const verifyErrorSchema: z.ZodObject<{
|
|
58
|
+
ok: z.ZodLiteral<false>;
|
|
59
|
+
error: z.ZodEnum<{
|
|
60
|
+
WALLET_NOT_FOUND: "WALLET_NOT_FOUND";
|
|
61
|
+
WRONG_NETWORK: "WRONG_NETWORK";
|
|
62
|
+
USER_REJECTED: "USER_REJECTED";
|
|
63
|
+
NOT_ELIGIBLE: "NOT_ELIGIBLE";
|
|
64
|
+
CHALLENGE_EXPIRED: "CHALLENGE_EXPIRED";
|
|
65
|
+
CHALLENGE_SPENT: "CHALLENGE_SPENT";
|
|
66
|
+
ORIGIN_MISMATCH: "ORIGIN_MISMATCH";
|
|
67
|
+
GATE_MISMATCH: "GATE_MISMATCH";
|
|
68
|
+
STALE_EPOCH: "STALE_EPOCH";
|
|
69
|
+
CREDENTIAL_EXPIRED: "CREDENTIAL_EXPIRED";
|
|
70
|
+
CREDENTIAL_REVOKED: "CREDENTIAL_REVOKED";
|
|
71
|
+
PROOF_INVALID: "PROOF_INVALID";
|
|
72
|
+
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
|
|
73
|
+
}>;
|
|
74
|
+
requestId: z.ZodString;
|
|
75
|
+
}, z.core.$strict>;
|
|
76
|
+
declare const verifyResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
77
|
+
ok: z.ZodLiteral<true>;
|
|
78
|
+
privateAppId: z.ZodString;
|
|
79
|
+
gateId: z.ZodString;
|
|
80
|
+
epoch: z.ZodNumber;
|
|
81
|
+
origin: z.ZodString;
|
|
82
|
+
expiresAt: z.ZodString;
|
|
83
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
84
|
+
ok: z.ZodLiteral<false>;
|
|
85
|
+
error: z.ZodEnum<{
|
|
86
|
+
WALLET_NOT_FOUND: "WALLET_NOT_FOUND";
|
|
87
|
+
WRONG_NETWORK: "WRONG_NETWORK";
|
|
88
|
+
USER_REJECTED: "USER_REJECTED";
|
|
89
|
+
NOT_ELIGIBLE: "NOT_ELIGIBLE";
|
|
90
|
+
CHALLENGE_EXPIRED: "CHALLENGE_EXPIRED";
|
|
91
|
+
CHALLENGE_SPENT: "CHALLENGE_SPENT";
|
|
92
|
+
ORIGIN_MISMATCH: "ORIGIN_MISMATCH";
|
|
93
|
+
GATE_MISMATCH: "GATE_MISMATCH";
|
|
94
|
+
STALE_EPOCH: "STALE_EPOCH";
|
|
95
|
+
CREDENTIAL_EXPIRED: "CREDENTIAL_EXPIRED";
|
|
96
|
+
CREDENTIAL_REVOKED: "CREDENTIAL_REVOKED";
|
|
97
|
+
PROOF_INVALID: "PROOF_INVALID";
|
|
98
|
+
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
|
|
99
|
+
}>;
|
|
100
|
+
requestId: z.ZodString;
|
|
101
|
+
}, z.core.$strict>], "ok">;
|
|
102
|
+
declare const challengeResponseSchema: z.ZodObject<{
|
|
103
|
+
challengeId: z.ZodString;
|
|
104
|
+
challenge: z.ZodString;
|
|
105
|
+
origin: z.ZodString;
|
|
106
|
+
gateId: z.ZodString;
|
|
107
|
+
expiresAt: z.ZodString;
|
|
108
|
+
}, z.core.$strict>;
|
|
109
|
+
type VeilPassErrorCode = z.infer<typeof veilPassErrorCodeSchema>;
|
|
110
|
+
type PublicInputs = z.infer<typeof publicInputsSchema>;
|
|
111
|
+
type ProofResult = z.infer<typeof proofResultSchema>;
|
|
112
|
+
type VerifiedLogin = z.infer<typeof verifiedLoginSchema>;
|
|
113
|
+
type VerifyResult = z.infer<typeof verifyResultSchema>;
|
|
114
|
+
type ChallengeResponse = z.infer<typeof challengeResponseSchema>;
|
|
115
|
+
|
|
116
|
+
export { type ChallengeResponse, type ProofResult, type PublicInputs, VEILPASS_ERROR_CODES, type VeilPassErrorCode, type VerifiedLogin, type VerifyResult, challengeResponseSchema, proofResultSchema, publicInputsSchema, veilPassErrorCodeSchema, verifiedLoginSchema, verifyErrorSchema, verifyResultSchema };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
declare const VEILPASS_ERROR_CODES: readonly ["WALLET_NOT_FOUND", "WRONG_NETWORK", "USER_REJECTED", "NOT_ELIGIBLE", "CHALLENGE_EXPIRED", "CHALLENGE_SPENT", "ORIGIN_MISMATCH", "GATE_MISMATCH", "STALE_EPOCH", "CREDENTIAL_EXPIRED", "CREDENTIAL_REVOKED", "PROOF_INVALID", "SERVICE_UNAVAILABLE"];
|
|
4
|
+
declare const veilPassErrorCodeSchema: z.ZodEnum<{
|
|
5
|
+
WALLET_NOT_FOUND: "WALLET_NOT_FOUND";
|
|
6
|
+
WRONG_NETWORK: "WRONG_NETWORK";
|
|
7
|
+
USER_REJECTED: "USER_REJECTED";
|
|
8
|
+
NOT_ELIGIBLE: "NOT_ELIGIBLE";
|
|
9
|
+
CHALLENGE_EXPIRED: "CHALLENGE_EXPIRED";
|
|
10
|
+
CHALLENGE_SPENT: "CHALLENGE_SPENT";
|
|
11
|
+
ORIGIN_MISMATCH: "ORIGIN_MISMATCH";
|
|
12
|
+
GATE_MISMATCH: "GATE_MISMATCH";
|
|
13
|
+
STALE_EPOCH: "STALE_EPOCH";
|
|
14
|
+
CREDENTIAL_EXPIRED: "CREDENTIAL_EXPIRED";
|
|
15
|
+
CREDENTIAL_REVOKED: "CREDENTIAL_REVOKED";
|
|
16
|
+
PROOF_INVALID: "PROOF_INVALID";
|
|
17
|
+
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
|
|
18
|
+
}>;
|
|
19
|
+
declare const publicInputsSchema: z.ZodObject<{
|
|
20
|
+
gateId: z.ZodString;
|
|
21
|
+
epoch: z.ZodNumber;
|
|
22
|
+
origin: z.ZodString;
|
|
23
|
+
challengeHash: z.ZodString;
|
|
24
|
+
credentialCommitment: z.ZodString;
|
|
25
|
+
credentialRoot: z.ZodString;
|
|
26
|
+
privateAppId: z.ZodString;
|
|
27
|
+
loginNullifier: z.ZodString;
|
|
28
|
+
revocationHash: z.ZodString;
|
|
29
|
+
proofCreatedAt: z.ZodString;
|
|
30
|
+
proofExpiresAt: z.ZodString;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
declare const proofResultSchema: z.ZodObject<{
|
|
33
|
+
challengeId: z.ZodString;
|
|
34
|
+
proof: z.ZodString;
|
|
35
|
+
publicInputs: z.ZodObject<{
|
|
36
|
+
gateId: z.ZodString;
|
|
37
|
+
epoch: z.ZodNumber;
|
|
38
|
+
origin: z.ZodString;
|
|
39
|
+
challengeHash: z.ZodString;
|
|
40
|
+
credentialCommitment: z.ZodString;
|
|
41
|
+
credentialRoot: z.ZodString;
|
|
42
|
+
privateAppId: z.ZodString;
|
|
43
|
+
loginNullifier: z.ZodString;
|
|
44
|
+
revocationHash: z.ZodString;
|
|
45
|
+
proofCreatedAt: z.ZodString;
|
|
46
|
+
proofExpiresAt: z.ZodString;
|
|
47
|
+
}, z.core.$strict>;
|
|
48
|
+
}, z.core.$strict>;
|
|
49
|
+
declare const verifiedLoginSchema: z.ZodObject<{
|
|
50
|
+
ok: z.ZodLiteral<true>;
|
|
51
|
+
privateAppId: z.ZodString;
|
|
52
|
+
gateId: z.ZodString;
|
|
53
|
+
epoch: z.ZodNumber;
|
|
54
|
+
origin: z.ZodString;
|
|
55
|
+
expiresAt: z.ZodString;
|
|
56
|
+
}, z.core.$strict>;
|
|
57
|
+
declare const verifyErrorSchema: z.ZodObject<{
|
|
58
|
+
ok: z.ZodLiteral<false>;
|
|
59
|
+
error: z.ZodEnum<{
|
|
60
|
+
WALLET_NOT_FOUND: "WALLET_NOT_FOUND";
|
|
61
|
+
WRONG_NETWORK: "WRONG_NETWORK";
|
|
62
|
+
USER_REJECTED: "USER_REJECTED";
|
|
63
|
+
NOT_ELIGIBLE: "NOT_ELIGIBLE";
|
|
64
|
+
CHALLENGE_EXPIRED: "CHALLENGE_EXPIRED";
|
|
65
|
+
CHALLENGE_SPENT: "CHALLENGE_SPENT";
|
|
66
|
+
ORIGIN_MISMATCH: "ORIGIN_MISMATCH";
|
|
67
|
+
GATE_MISMATCH: "GATE_MISMATCH";
|
|
68
|
+
STALE_EPOCH: "STALE_EPOCH";
|
|
69
|
+
CREDENTIAL_EXPIRED: "CREDENTIAL_EXPIRED";
|
|
70
|
+
CREDENTIAL_REVOKED: "CREDENTIAL_REVOKED";
|
|
71
|
+
PROOF_INVALID: "PROOF_INVALID";
|
|
72
|
+
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
|
|
73
|
+
}>;
|
|
74
|
+
requestId: z.ZodString;
|
|
75
|
+
}, z.core.$strict>;
|
|
76
|
+
declare const verifyResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
77
|
+
ok: z.ZodLiteral<true>;
|
|
78
|
+
privateAppId: z.ZodString;
|
|
79
|
+
gateId: z.ZodString;
|
|
80
|
+
epoch: z.ZodNumber;
|
|
81
|
+
origin: z.ZodString;
|
|
82
|
+
expiresAt: z.ZodString;
|
|
83
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
84
|
+
ok: z.ZodLiteral<false>;
|
|
85
|
+
error: z.ZodEnum<{
|
|
86
|
+
WALLET_NOT_FOUND: "WALLET_NOT_FOUND";
|
|
87
|
+
WRONG_NETWORK: "WRONG_NETWORK";
|
|
88
|
+
USER_REJECTED: "USER_REJECTED";
|
|
89
|
+
NOT_ELIGIBLE: "NOT_ELIGIBLE";
|
|
90
|
+
CHALLENGE_EXPIRED: "CHALLENGE_EXPIRED";
|
|
91
|
+
CHALLENGE_SPENT: "CHALLENGE_SPENT";
|
|
92
|
+
ORIGIN_MISMATCH: "ORIGIN_MISMATCH";
|
|
93
|
+
GATE_MISMATCH: "GATE_MISMATCH";
|
|
94
|
+
STALE_EPOCH: "STALE_EPOCH";
|
|
95
|
+
CREDENTIAL_EXPIRED: "CREDENTIAL_EXPIRED";
|
|
96
|
+
CREDENTIAL_REVOKED: "CREDENTIAL_REVOKED";
|
|
97
|
+
PROOF_INVALID: "PROOF_INVALID";
|
|
98
|
+
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
|
|
99
|
+
}>;
|
|
100
|
+
requestId: z.ZodString;
|
|
101
|
+
}, z.core.$strict>], "ok">;
|
|
102
|
+
declare const challengeResponseSchema: z.ZodObject<{
|
|
103
|
+
challengeId: z.ZodString;
|
|
104
|
+
challenge: z.ZodString;
|
|
105
|
+
origin: z.ZodString;
|
|
106
|
+
gateId: z.ZodString;
|
|
107
|
+
expiresAt: z.ZodString;
|
|
108
|
+
}, z.core.$strict>;
|
|
109
|
+
type VeilPassErrorCode = z.infer<typeof veilPassErrorCodeSchema>;
|
|
110
|
+
type PublicInputs = z.infer<typeof publicInputsSchema>;
|
|
111
|
+
type ProofResult = z.infer<typeof proofResultSchema>;
|
|
112
|
+
type VerifiedLogin = z.infer<typeof verifiedLoginSchema>;
|
|
113
|
+
type VerifyResult = z.infer<typeof verifyResultSchema>;
|
|
114
|
+
type ChallengeResponse = z.infer<typeof challengeResponseSchema>;
|
|
115
|
+
|
|
116
|
+
export { type ChallengeResponse, type ProofResult, type PublicInputs, VEILPASS_ERROR_CODES, type VeilPassErrorCode, type VerifiedLogin, type VerifyResult, challengeResponseSchema, proofResultSchema, publicInputsSchema, veilPassErrorCodeSchema, verifiedLoginSchema, verifyErrorSchema, verifyResultSchema };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VEILPASS_ERROR_CODES,
|
|
3
|
+
challengeResponseSchema,
|
|
4
|
+
proofResultSchema,
|
|
5
|
+
publicInputsSchema,
|
|
6
|
+
veilPassErrorCodeSchema,
|
|
7
|
+
verifiedLoginSchema,
|
|
8
|
+
verifyErrorSchema,
|
|
9
|
+
verifyResultSchema
|
|
10
|
+
} from "./chunk-MX2GIROV.js";
|
|
11
|
+
export {
|
|
12
|
+
VEILPASS_ERROR_CODES,
|
|
13
|
+
challengeResponseSchema,
|
|
14
|
+
proofResultSchema,
|
|
15
|
+
publicInputsSchema,
|
|
16
|
+
veilPassErrorCodeSchema,
|
|
17
|
+
verifiedLoginSchema,
|
|
18
|
+
verifyErrorSchema,
|
|
19
|
+
verifyResultSchema
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
BN254_SCALAR_MODULUS_HEX: () => BN254_SCALAR_MODULUS_HEX,
|
|
24
|
+
VEILPASS_ERROR_CODES: () => VEILPASS_ERROR_CODES,
|
|
25
|
+
base64urlToBytes: () => base64urlToBytes,
|
|
26
|
+
canonicalFieldHex: () => canonicalFieldHex,
|
|
27
|
+
challengeResponseSchema: () => challengeResponseSchema,
|
|
28
|
+
fieldHexFromBytes: () => fieldHexFromBytes,
|
|
29
|
+
fieldHexFromDigest: () => fieldHexFromDigest,
|
|
30
|
+
fieldHexToNoir: () => fieldHexToNoir,
|
|
31
|
+
hashBytesToFieldHex: () => hashBytesToFieldHex,
|
|
32
|
+
hashTextToFieldHex: () => hashTextToFieldHex,
|
|
33
|
+
normalizeOrigin: () => normalizeOrigin,
|
|
34
|
+
proofResultSchema: () => proofResultSchema,
|
|
35
|
+
publicInputsSchema: () => publicInputsSchema,
|
|
36
|
+
randomFieldHex: () => randomFieldHex,
|
|
37
|
+
u64ToFieldHex: () => u64ToFieldHex,
|
|
38
|
+
veilPassErrorCodeSchema: () => veilPassErrorCodeSchema,
|
|
39
|
+
verifiedLoginSchema: () => verifiedLoginSchema,
|
|
40
|
+
verifyErrorSchema: () => verifyErrorSchema,
|
|
41
|
+
verifyResultSchema: () => verifyResultSchema
|
|
42
|
+
});
|
|
43
|
+
module.exports = __toCommonJS(index_exports);
|
|
44
|
+
|
|
45
|
+
// src/contracts.ts
|
|
46
|
+
var import_zod = require("zod");
|
|
47
|
+
var VEILPASS_ERROR_CODES = [
|
|
48
|
+
"WALLET_NOT_FOUND",
|
|
49
|
+
"WRONG_NETWORK",
|
|
50
|
+
"USER_REJECTED",
|
|
51
|
+
"NOT_ELIGIBLE",
|
|
52
|
+
"CHALLENGE_EXPIRED",
|
|
53
|
+
"CHALLENGE_SPENT",
|
|
54
|
+
"ORIGIN_MISMATCH",
|
|
55
|
+
"GATE_MISMATCH",
|
|
56
|
+
"STALE_EPOCH",
|
|
57
|
+
"CREDENTIAL_EXPIRED",
|
|
58
|
+
"CREDENTIAL_REVOKED",
|
|
59
|
+
"PROOF_INVALID",
|
|
60
|
+
"SERVICE_UNAVAILABLE"
|
|
61
|
+
];
|
|
62
|
+
var veilPassErrorCodeSchema = import_zod.z.enum(VEILPASS_ERROR_CODES);
|
|
63
|
+
var publicInputsSchema = import_zod.z.object({
|
|
64
|
+
gateId: import_zod.z.string().min(1).max(128),
|
|
65
|
+
epoch: import_zod.z.number().int().nonnegative(),
|
|
66
|
+
origin: import_zod.z.string().min(1).max(512),
|
|
67
|
+
challengeHash: import_zod.z.string().min(1).max(256),
|
|
68
|
+
credentialCommitment: import_zod.z.string().min(1).max(256),
|
|
69
|
+
credentialRoot: import_zod.z.string().min(1).max(256),
|
|
70
|
+
privateAppId: import_zod.z.string().min(1).max(256),
|
|
71
|
+
loginNullifier: import_zod.z.string().min(1).max(256),
|
|
72
|
+
revocationHash: import_zod.z.string().min(1).max(256),
|
|
73
|
+
proofCreatedAt: import_zod.z.string().datetime(),
|
|
74
|
+
proofExpiresAt: import_zod.z.string().datetime()
|
|
75
|
+
}).strict();
|
|
76
|
+
var proofResultSchema = import_zod.z.object({
|
|
77
|
+
challengeId: import_zod.z.string().min(1).max(128),
|
|
78
|
+
proof: import_zod.z.string().min(1).max(15e5),
|
|
79
|
+
publicInputs: publicInputsSchema
|
|
80
|
+
}).strict();
|
|
81
|
+
var verifiedLoginSchema = import_zod.z.object({
|
|
82
|
+
ok: import_zod.z.literal(true),
|
|
83
|
+
privateAppId: import_zod.z.string().min(1).max(256),
|
|
84
|
+
gateId: import_zod.z.string().min(1).max(128),
|
|
85
|
+
epoch: import_zod.z.number().int().nonnegative(),
|
|
86
|
+
origin: import_zod.z.string().min(1).max(512),
|
|
87
|
+
expiresAt: import_zod.z.string().datetime()
|
|
88
|
+
}).strict();
|
|
89
|
+
var verifyErrorSchema = import_zod.z.object({
|
|
90
|
+
ok: import_zod.z.literal(false),
|
|
91
|
+
error: veilPassErrorCodeSchema,
|
|
92
|
+
requestId: import_zod.z.string().min(1).max(128)
|
|
93
|
+
}).strict();
|
|
94
|
+
var verifyResultSchema = import_zod.z.discriminatedUnion("ok", [
|
|
95
|
+
verifiedLoginSchema,
|
|
96
|
+
verifyErrorSchema
|
|
97
|
+
]);
|
|
98
|
+
var challengeResponseSchema = import_zod.z.object({
|
|
99
|
+
challengeId: import_zod.z.string().min(1).max(128),
|
|
100
|
+
challenge: import_zod.z.string().min(1).max(512),
|
|
101
|
+
origin: import_zod.z.string().min(1).max(512),
|
|
102
|
+
gateId: import_zod.z.string().min(1).max(128),
|
|
103
|
+
expiresAt: import_zod.z.string().datetime()
|
|
104
|
+
}).strict();
|
|
105
|
+
|
|
106
|
+
// src/field.ts
|
|
107
|
+
var BN254_SCALAR_MODULUS_HEX = "30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47";
|
|
108
|
+
var FIELD_HEX_LENGTH = 64;
|
|
109
|
+
function canonicalFieldHex(value) {
|
|
110
|
+
const normalized = value.trim().replace(/^0x/i, "").toLowerCase();
|
|
111
|
+
if (!/^[0-9a-f]{1,64}$/.test(normalized)) throw new Error("Expected a field element encoded as at most 32 bytes of hex");
|
|
112
|
+
const padded = normalized.padStart(FIELD_HEX_LENGTH, "0");
|
|
113
|
+
if (padded >= BN254_SCALAR_MODULUS_HEX) throw new Error("Field element exceeds the BN254 scalar modulus");
|
|
114
|
+
return padded;
|
|
115
|
+
}
|
|
116
|
+
function fieldHexToNoir(value) {
|
|
117
|
+
return `0x${canonicalFieldHex(value)}`;
|
|
118
|
+
}
|
|
119
|
+
function fieldHexFromBytes(bytes) {
|
|
120
|
+
if (bytes.byteLength !== 32) throw new Error("Expected exactly 32 bytes for a field element");
|
|
121
|
+
return canonicalFieldHex(Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join(""));
|
|
122
|
+
}
|
|
123
|
+
function fieldHexFromDigest(bytes) {
|
|
124
|
+
if (bytes.byteLength !== 32) throw new Error("Expected a 32-byte digest");
|
|
125
|
+
const fieldBytes = Uint8Array.from(bytes);
|
|
126
|
+
fieldBytes[0] &= 31;
|
|
127
|
+
return fieldHexFromBytes(fieldBytes);
|
|
128
|
+
}
|
|
129
|
+
function u64ToFieldHex(value) {
|
|
130
|
+
if (!Number.isSafeInteger(value) || value < 0) throw new Error("Expected a non-negative safe integer");
|
|
131
|
+
const bytes = new Uint8Array(32);
|
|
132
|
+
let remaining = value;
|
|
133
|
+
for (let index = 31; index >= 0 && remaining > 0; index -= 1) {
|
|
134
|
+
bytes[index] = remaining % 256;
|
|
135
|
+
remaining = Math.floor(remaining / 256);
|
|
136
|
+
}
|
|
137
|
+
return fieldHexFromBytes(bytes);
|
|
138
|
+
}
|
|
139
|
+
function randomFieldHex(randomBytes) {
|
|
140
|
+
if (randomBytes.byteLength !== 32) throw new Error("Expected 32 random bytes");
|
|
141
|
+
const fieldBytes = Uint8Array.from(randomBytes);
|
|
142
|
+
fieldBytes[0] &= 31;
|
|
143
|
+
return fieldHexFromBytes(fieldBytes);
|
|
144
|
+
}
|
|
145
|
+
async function hashTextToFieldHex(value) {
|
|
146
|
+
return hashBytesToFieldHex(new TextEncoder().encode(value));
|
|
147
|
+
}
|
|
148
|
+
async function hashBytesToFieldHex(value) {
|
|
149
|
+
if (!globalThis.crypto?.subtle) throw new Error("Web Crypto is unavailable");
|
|
150
|
+
const digest = new Uint8Array(await globalThis.crypto.subtle.digest("SHA-256", new Uint8Array(value)));
|
|
151
|
+
return fieldHexFromDigest(digest);
|
|
152
|
+
}
|
|
153
|
+
function base64urlToBytes(value) {
|
|
154
|
+
const normalized = value.replace(/-/g, "+").replace(/_/g, "/");
|
|
155
|
+
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, "=");
|
|
156
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(padded)) throw new Error("Invalid base64url value");
|
|
157
|
+
const binary = atob(padded);
|
|
158
|
+
return Uint8Array.from(binary, (character) => character.charCodeAt(0));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// src/origin.ts
|
|
162
|
+
function isLoopback(hostname) {
|
|
163
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
|
|
164
|
+
}
|
|
165
|
+
function normalizeOrigin(input) {
|
|
166
|
+
let parsed;
|
|
167
|
+
try {
|
|
168
|
+
parsed = new URL(input);
|
|
169
|
+
} catch {
|
|
170
|
+
throw new Error("Origin must be an absolute HTTP or HTTPS origin");
|
|
171
|
+
}
|
|
172
|
+
const protocol = parsed.protocol.toLowerCase();
|
|
173
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
174
|
+
const hasExtraParts = parsed.pathname !== "" && parsed.pathname !== "/" || parsed.search !== "" || parsed.hash !== "";
|
|
175
|
+
if (protocol !== "https:" && protocol !== "http:") {
|
|
176
|
+
throw new Error("Origin must use HTTP or HTTPS");
|
|
177
|
+
}
|
|
178
|
+
if (protocol === "http:" && !isLoopback(hostname)) {
|
|
179
|
+
throw new Error("Origin must use HTTPS outside local development");
|
|
180
|
+
}
|
|
181
|
+
if (!hostname || hostname.includes("*") || parsed.username !== "" || parsed.password !== "" || hasExtraParts) {
|
|
182
|
+
throw new Error("Origin must not include credentials, wildcards, or URL parts");
|
|
183
|
+
}
|
|
184
|
+
return `${protocol}//${parsed.host.toLowerCase()}`;
|
|
185
|
+
}
|
|
186
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
187
|
+
0 && (module.exports = {
|
|
188
|
+
BN254_SCALAR_MODULUS_HEX,
|
|
189
|
+
VEILPASS_ERROR_CODES,
|
|
190
|
+
base64urlToBytes,
|
|
191
|
+
canonicalFieldHex,
|
|
192
|
+
challengeResponseSchema,
|
|
193
|
+
fieldHexFromBytes,
|
|
194
|
+
fieldHexFromDigest,
|
|
195
|
+
fieldHexToNoir,
|
|
196
|
+
hashBytesToFieldHex,
|
|
197
|
+
hashTextToFieldHex,
|
|
198
|
+
normalizeOrigin,
|
|
199
|
+
proofResultSchema,
|
|
200
|
+
publicInputsSchema,
|
|
201
|
+
randomFieldHex,
|
|
202
|
+
u64ToFieldHex,
|
|
203
|
+
veilPassErrorCodeSchema,
|
|
204
|
+
verifiedLoginSchema,
|
|
205
|
+
verifyErrorSchema,
|
|
206
|
+
verifyResultSchema
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/contracts.ts","../src/field.ts","../src/origin.ts"],"sourcesContent":["export * from \"./contracts\";\r\nexport * from \"./field\";\r\nexport * from \"./origin\";\r\n","import { z } from \"zod\";\r\n\r\nexport const VEILPASS_ERROR_CODES = [\r\n \"WALLET_NOT_FOUND\",\r\n \"WRONG_NETWORK\",\r\n \"USER_REJECTED\",\r\n \"NOT_ELIGIBLE\",\r\n \"CHALLENGE_EXPIRED\",\r\n \"CHALLENGE_SPENT\",\r\n \"ORIGIN_MISMATCH\",\r\n \"GATE_MISMATCH\",\r\n \"STALE_EPOCH\",\r\n \"CREDENTIAL_EXPIRED\",\r\n \"CREDENTIAL_REVOKED\",\r\n \"PROOF_INVALID\",\r\n \"SERVICE_UNAVAILABLE\",\r\n] as const;\r\n\r\nexport const veilPassErrorCodeSchema = z.enum(VEILPASS_ERROR_CODES);\r\n\r\nexport const publicInputsSchema = z\r\n .object({\r\n gateId: z.string().min(1).max(128),\r\n epoch: z.number().int().nonnegative(),\r\n origin: z.string().min(1).max(512),\r\n challengeHash: z.string().min(1).max(256),\r\n credentialCommitment: z.string().min(1).max(256),\r\n credentialRoot: z.string().min(1).max(256),\r\n privateAppId: z.string().min(1).max(256),\r\n loginNullifier: z.string().min(1).max(256),\r\n revocationHash: z.string().min(1).max(256),\r\n proofCreatedAt: z.string().datetime(),\r\n proofExpiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport const proofResultSchema = z\r\n .object({\r\n challengeId: z.string().min(1).max(128),\r\n proof: z.string().min(1).max(1_500_000),\r\n publicInputs: publicInputsSchema,\r\n })\r\n .strict();\r\n\r\nexport const verifiedLoginSchema = z\r\n .object({\r\n ok: z.literal(true),\r\n privateAppId: z.string().min(1).max(256),\r\n gateId: z.string().min(1).max(128),\r\n epoch: z.number().int().nonnegative(),\r\n origin: z.string().min(1).max(512),\r\n expiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport const verifyErrorSchema = z\r\n .object({\r\n ok: z.literal(false),\r\n error: veilPassErrorCodeSchema,\r\n requestId: z.string().min(1).max(128),\r\n })\r\n .strict();\r\n\r\nexport const verifyResultSchema = z.discriminatedUnion(\"ok\", [\r\n verifiedLoginSchema,\r\n verifyErrorSchema,\r\n]);\r\n\r\nexport const challengeResponseSchema = z\r\n .object({\r\n challengeId: z.string().min(1).max(128),\r\n challenge: z.string().min(1).max(512),\r\n origin: z.string().min(1).max(512),\r\n gateId: z.string().min(1).max(128),\r\n expiresAt: z.string().datetime(),\r\n })\r\n .strict();\r\n\r\nexport type VeilPassErrorCode = z.infer<typeof veilPassErrorCodeSchema>;\r\nexport type PublicInputs = z.infer<typeof publicInputsSchema>;\r\nexport type ProofResult = z.infer<typeof proofResultSchema>;\r\nexport type VerifiedLogin = z.infer<typeof verifiedLoginSchema>;\r\nexport type VerifyResult = z.infer<typeof verifyResultSchema>;\r\nexport type ChallengeResponse = z.infer<typeof challengeResponseSchema>;\r\n","/**\r\n * Canonical, 32-byte BN254 scalar encoding used by the Noir membership\r\n * circuit. Values are kept as lowercase, unprefixed hex at API boundaries.\r\n * Keeping this module free of Node APIs lets the hosted login use exactly the\r\n * same encoding as the verifier.\r\n */\r\nexport const BN254_SCALAR_MODULUS_HEX = \"30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\";\r\nconst FIELD_HEX_LENGTH = 64;\r\n\r\nexport function canonicalFieldHex(value: string): string {\r\n const normalized = value.trim().replace(/^0x/i, \"\").toLowerCase();\r\n if (!/^[0-9a-f]{1,64}$/.test(normalized)) throw new Error(\"Expected a field element encoded as at most 32 bytes of hex\");\r\n const padded = normalized.padStart(FIELD_HEX_LENGTH, \"0\");\r\n if (padded >= BN254_SCALAR_MODULUS_HEX) throw new Error(\"Field element exceeds the BN254 scalar modulus\");\r\n return padded;\r\n}\r\n\r\nexport function fieldHexToNoir(value: string): string {\r\n return `0x${canonicalFieldHex(value)}`;\r\n}\r\n\r\nexport function fieldHexFromBytes(bytes: Uint8Array): string {\r\n if (bytes.byteLength !== 32) throw new Error(\"Expected exactly 32 bytes for a field element\");\r\n return canonicalFieldHex(Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\"));\r\n}\r\n\r\n/** Maps a SHA-256 digest into a 253-bit field value without a modulo bias. */\r\nexport function fieldHexFromDigest(bytes: Uint8Array): string {\r\n if (bytes.byteLength !== 32) throw new Error(\"Expected a 32-byte digest\");\r\n const fieldBytes = Uint8Array.from(bytes);\r\n fieldBytes[0] &= 0x1f;\r\n return fieldHexFromBytes(fieldBytes);\r\n}\r\n\r\nexport function u64ToFieldHex(value: number): string {\r\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(\"Expected a non-negative safe integer\");\r\n const bytes = new Uint8Array(32);\r\n let remaining = value;\r\n for (let index = 31; index >= 0 && remaining > 0; index -= 1) {\r\n bytes[index] = remaining % 256;\r\n remaining = Math.floor(remaining / 256);\r\n }\r\n return fieldHexFromBytes(bytes);\r\n}\r\n\r\nexport function randomFieldHex(randomBytes: Uint8Array): string {\r\n if (randomBytes.byteLength !== 32) throw new Error(\"Expected 32 random bytes\");\r\n const fieldBytes = Uint8Array.from(randomBytes);\r\n fieldBytes[0] &= 0x1f;\r\n return fieldHexFromBytes(fieldBytes);\r\n}\r\n\r\nexport async function hashTextToFieldHex(value: string): Promise<string> {\r\n return hashBytesToFieldHex(new TextEncoder().encode(value));\r\n}\r\n\r\nexport async function hashBytesToFieldHex(value: Uint8Array): Promise<string> {\r\n if (!globalThis.crypto?.subtle) throw new Error(\"Web Crypto is unavailable\");\r\n const digest = new Uint8Array(await globalThis.crypto.subtle.digest(\"SHA-256\", new Uint8Array(value)));\r\n return fieldHexFromDigest(digest);\r\n}\r\n\r\nexport function base64urlToBytes(value: string): Uint8Array {\r\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\r\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(padded)) throw new Error(\"Invalid base64url value\");\r\n const binary = atob(padded);\r\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\r\n}\r\n","export type NormalizedOrigin = `${\"http\" | \"https\"}://${string}`;\n\nfunction isLoopback(hostname: string) {\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"[::1]\"\n );\n}\n\nexport function normalizeOrigin(input: string): NormalizedOrigin {\n let parsed: URL;\n\n try {\n parsed = new URL(input);\n } catch {\n throw new Error(\"Origin must be an absolute HTTP or HTTPS origin\");\n }\n\n const protocol = parsed.protocol.toLowerCase();\n const hostname = parsed.hostname.toLowerCase();\n const hasExtraParts =\n (parsed.pathname !== \"\" && parsed.pathname !== \"/\") ||\n parsed.search !== \"\" ||\n parsed.hash !== \"\";\n\n if (protocol !== \"https:\" && protocol !== \"http:\") {\n throw new Error(\"Origin must use HTTP or HTTPS\");\n }\n if (protocol === \"http:\" && !isLoopback(hostname)) {\n throw new Error(\"Origin must use HTTPS outside local development\");\n }\n if (\n !hostname ||\n hostname.includes(\"*\") ||\n parsed.username !== \"\" ||\n parsed.password !== \"\" ||\n hasExtraParts\n ) {\n throw new Error(\"Origin must not include credentials, wildcards, or URL parts\");\n }\n\n return `${protocol}//${parsed.host.toLowerCase()}` as NormalizedOrigin;\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { ChallengeResponse, ProofResult, PublicInputs, VEILPASS_ERROR_CODES, VeilPassErrorCode, VerifiedLogin, VerifyResult, challengeResponseSchema, proofResultSchema, publicInputsSchema, veilPassErrorCodeSchema, verifiedLoginSchema, verifyErrorSchema, verifyResultSchema } from './contracts.cjs';
|
|
2
|
+
export { NormalizedOrigin, normalizeOrigin } from './origin.cjs';
|
|
3
|
+
import 'zod';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Canonical, 32-byte BN254 scalar encoding used by the Noir membership
|
|
7
|
+
* circuit. Values are kept as lowercase, unprefixed hex at API boundaries.
|
|
8
|
+
* Keeping this module free of Node APIs lets the hosted login use exactly the
|
|
9
|
+
* same encoding as the verifier.
|
|
10
|
+
*/
|
|
11
|
+
declare const BN254_SCALAR_MODULUS_HEX = "30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47";
|
|
12
|
+
declare function canonicalFieldHex(value: string): string;
|
|
13
|
+
declare function fieldHexToNoir(value: string): string;
|
|
14
|
+
declare function fieldHexFromBytes(bytes: Uint8Array): string;
|
|
15
|
+
/** Maps a SHA-256 digest into a 253-bit field value without a modulo bias. */
|
|
16
|
+
declare function fieldHexFromDigest(bytes: Uint8Array): string;
|
|
17
|
+
declare function u64ToFieldHex(value: number): string;
|
|
18
|
+
declare function randomFieldHex(randomBytes: Uint8Array): string;
|
|
19
|
+
declare function hashTextToFieldHex(value: string): Promise<string>;
|
|
20
|
+
declare function hashBytesToFieldHex(value: Uint8Array): Promise<string>;
|
|
21
|
+
declare function base64urlToBytes(value: string): Uint8Array;
|
|
22
|
+
|
|
23
|
+
export { BN254_SCALAR_MODULUS_HEX, base64urlToBytes, canonicalFieldHex, fieldHexFromBytes, fieldHexFromDigest, fieldHexToNoir, hashBytesToFieldHex, hashTextToFieldHex, randomFieldHex, u64ToFieldHex };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { ChallengeResponse, ProofResult, PublicInputs, VEILPASS_ERROR_CODES, VeilPassErrorCode, VerifiedLogin, VerifyResult, challengeResponseSchema, proofResultSchema, publicInputsSchema, veilPassErrorCodeSchema, verifiedLoginSchema, verifyErrorSchema, verifyResultSchema } from './contracts.js';
|
|
2
|
+
export { NormalizedOrigin, normalizeOrigin } from './origin.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Canonical, 32-byte BN254 scalar encoding used by the Noir membership
|
|
7
|
+
* circuit. Values are kept as lowercase, unprefixed hex at API boundaries.
|
|
8
|
+
* Keeping this module free of Node APIs lets the hosted login use exactly the
|
|
9
|
+
* same encoding as the verifier.
|
|
10
|
+
*/
|
|
11
|
+
declare const BN254_SCALAR_MODULUS_HEX = "30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47";
|
|
12
|
+
declare function canonicalFieldHex(value: string): string;
|
|
13
|
+
declare function fieldHexToNoir(value: string): string;
|
|
14
|
+
declare function fieldHexFromBytes(bytes: Uint8Array): string;
|
|
15
|
+
/** Maps a SHA-256 digest into a 253-bit field value without a modulo bias. */
|
|
16
|
+
declare function fieldHexFromDigest(bytes: Uint8Array): string;
|
|
17
|
+
declare function u64ToFieldHex(value: number): string;
|
|
18
|
+
declare function randomFieldHex(randomBytes: Uint8Array): string;
|
|
19
|
+
declare function hashTextToFieldHex(value: string): Promise<string>;
|
|
20
|
+
declare function hashBytesToFieldHex(value: Uint8Array): Promise<string>;
|
|
21
|
+
declare function base64urlToBytes(value: string): Uint8Array;
|
|
22
|
+
|
|
23
|
+
export { BN254_SCALAR_MODULUS_HEX, base64urlToBytes, canonicalFieldHex, fieldHexFromBytes, fieldHexFromDigest, fieldHexToNoir, hashBytesToFieldHex, hashTextToFieldHex, randomFieldHex, u64ToFieldHex };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VEILPASS_ERROR_CODES,
|
|
3
|
+
challengeResponseSchema,
|
|
4
|
+
proofResultSchema,
|
|
5
|
+
publicInputsSchema,
|
|
6
|
+
veilPassErrorCodeSchema,
|
|
7
|
+
verifiedLoginSchema,
|
|
8
|
+
verifyErrorSchema,
|
|
9
|
+
verifyResultSchema
|
|
10
|
+
} from "./chunk-MX2GIROV.js";
|
|
11
|
+
import {
|
|
12
|
+
normalizeOrigin
|
|
13
|
+
} from "./chunk-LYZMDCUB.js";
|
|
14
|
+
|
|
15
|
+
// src/field.ts
|
|
16
|
+
var BN254_SCALAR_MODULUS_HEX = "30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47";
|
|
17
|
+
var FIELD_HEX_LENGTH = 64;
|
|
18
|
+
function canonicalFieldHex(value) {
|
|
19
|
+
const normalized = value.trim().replace(/^0x/i, "").toLowerCase();
|
|
20
|
+
if (!/^[0-9a-f]{1,64}$/.test(normalized)) throw new Error("Expected a field element encoded as at most 32 bytes of hex");
|
|
21
|
+
const padded = normalized.padStart(FIELD_HEX_LENGTH, "0");
|
|
22
|
+
if (padded >= BN254_SCALAR_MODULUS_HEX) throw new Error("Field element exceeds the BN254 scalar modulus");
|
|
23
|
+
return padded;
|
|
24
|
+
}
|
|
25
|
+
function fieldHexToNoir(value) {
|
|
26
|
+
return `0x${canonicalFieldHex(value)}`;
|
|
27
|
+
}
|
|
28
|
+
function fieldHexFromBytes(bytes) {
|
|
29
|
+
if (bytes.byteLength !== 32) throw new Error("Expected exactly 32 bytes for a field element");
|
|
30
|
+
return canonicalFieldHex(Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join(""));
|
|
31
|
+
}
|
|
32
|
+
function fieldHexFromDigest(bytes) {
|
|
33
|
+
if (bytes.byteLength !== 32) throw new Error("Expected a 32-byte digest");
|
|
34
|
+
const fieldBytes = Uint8Array.from(bytes);
|
|
35
|
+
fieldBytes[0] &= 31;
|
|
36
|
+
return fieldHexFromBytes(fieldBytes);
|
|
37
|
+
}
|
|
38
|
+
function u64ToFieldHex(value) {
|
|
39
|
+
if (!Number.isSafeInteger(value) || value < 0) throw new Error("Expected a non-negative safe integer");
|
|
40
|
+
const bytes = new Uint8Array(32);
|
|
41
|
+
let remaining = value;
|
|
42
|
+
for (let index = 31; index >= 0 && remaining > 0; index -= 1) {
|
|
43
|
+
bytes[index] = remaining % 256;
|
|
44
|
+
remaining = Math.floor(remaining / 256);
|
|
45
|
+
}
|
|
46
|
+
return fieldHexFromBytes(bytes);
|
|
47
|
+
}
|
|
48
|
+
function randomFieldHex(randomBytes) {
|
|
49
|
+
if (randomBytes.byteLength !== 32) throw new Error("Expected 32 random bytes");
|
|
50
|
+
const fieldBytes = Uint8Array.from(randomBytes);
|
|
51
|
+
fieldBytes[0] &= 31;
|
|
52
|
+
return fieldHexFromBytes(fieldBytes);
|
|
53
|
+
}
|
|
54
|
+
async function hashTextToFieldHex(value) {
|
|
55
|
+
return hashBytesToFieldHex(new TextEncoder().encode(value));
|
|
56
|
+
}
|
|
57
|
+
async function hashBytesToFieldHex(value) {
|
|
58
|
+
if (!globalThis.crypto?.subtle) throw new Error("Web Crypto is unavailable");
|
|
59
|
+
const digest = new Uint8Array(await globalThis.crypto.subtle.digest("SHA-256", new Uint8Array(value)));
|
|
60
|
+
return fieldHexFromDigest(digest);
|
|
61
|
+
}
|
|
62
|
+
function base64urlToBytes(value) {
|
|
63
|
+
const normalized = value.replace(/-/g, "+").replace(/_/g, "/");
|
|
64
|
+
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, "=");
|
|
65
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(padded)) throw new Error("Invalid base64url value");
|
|
66
|
+
const binary = atob(padded);
|
|
67
|
+
return Uint8Array.from(binary, (character) => character.charCodeAt(0));
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
BN254_SCALAR_MODULUS_HEX,
|
|
71
|
+
VEILPASS_ERROR_CODES,
|
|
72
|
+
base64urlToBytes,
|
|
73
|
+
canonicalFieldHex,
|
|
74
|
+
challengeResponseSchema,
|
|
75
|
+
fieldHexFromBytes,
|
|
76
|
+
fieldHexFromDigest,
|
|
77
|
+
fieldHexToNoir,
|
|
78
|
+
hashBytesToFieldHex,
|
|
79
|
+
hashTextToFieldHex,
|
|
80
|
+
normalizeOrigin,
|
|
81
|
+
proofResultSchema,
|
|
82
|
+
publicInputsSchema,
|
|
83
|
+
randomFieldHex,
|
|
84
|
+
u64ToFieldHex,
|
|
85
|
+
veilPassErrorCodeSchema,
|
|
86
|
+
verifiedLoginSchema,
|
|
87
|
+
verifyErrorSchema,
|
|
88
|
+
verifyResultSchema
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/field.ts"],"sourcesContent":["/**\r\n * Canonical, 32-byte BN254 scalar encoding used by the Noir membership\r\n * circuit. Values are kept as lowercase, unprefixed hex at API boundaries.\r\n * Keeping this module free of Node APIs lets the hosted login use exactly the\r\n * same encoding as the verifier.\r\n */\r\nexport const BN254_SCALAR_MODULUS_HEX = \"30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\";\r\nconst FIELD_HEX_LENGTH = 64;\r\n\r\nexport function canonicalFieldHex(value: string): string {\r\n const normalized = value.trim().replace(/^0x/i, \"\").toLowerCase();\r\n if (!/^[0-9a-f]{1,64}$/.test(normalized)) throw new Error(\"Expected a field element encoded as at most 32 bytes of hex\");\r\n const padded = normalized.padStart(FIELD_HEX_LENGTH, \"0\");\r\n if (padded >= BN254_SCALAR_MODULUS_HEX) throw new Error(\"Field element exceeds the BN254 scalar modulus\");\r\n return padded;\r\n}\r\n\r\nexport function fieldHexToNoir(value: string): string {\r\n return `0x${canonicalFieldHex(value)}`;\r\n}\r\n\r\nexport function fieldHexFromBytes(bytes: Uint8Array): string {\r\n if (bytes.byteLength !== 32) throw new Error(\"Expected exactly 32 bytes for a field element\");\r\n return canonicalFieldHex(Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\"));\r\n}\r\n\r\n/** Maps a SHA-256 digest into a 253-bit field value without a modulo bias. */\r\nexport function fieldHexFromDigest(bytes: Uint8Array): string {\r\n if (bytes.byteLength !== 32) throw new Error(\"Expected a 32-byte digest\");\r\n const fieldBytes = Uint8Array.from(bytes);\r\n fieldBytes[0] &= 0x1f;\r\n return fieldHexFromBytes(fieldBytes);\r\n}\r\n\r\nexport function u64ToFieldHex(value: number): string {\r\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(\"Expected a non-negative safe integer\");\r\n const bytes = new Uint8Array(32);\r\n let remaining = value;\r\n for (let index = 31; index >= 0 && remaining > 0; index -= 1) {\r\n bytes[index] = remaining % 256;\r\n remaining = Math.floor(remaining / 256);\r\n }\r\n return fieldHexFromBytes(bytes);\r\n}\r\n\r\nexport function randomFieldHex(randomBytes: Uint8Array): string {\r\n if (randomBytes.byteLength !== 32) throw new Error(\"Expected 32 random bytes\");\r\n const fieldBytes = Uint8Array.from(randomBytes);\r\n fieldBytes[0] &= 0x1f;\r\n return fieldHexFromBytes(fieldBytes);\r\n}\r\n\r\nexport async function hashTextToFieldHex(value: string): Promise<string> {\r\n return hashBytesToFieldHex(new TextEncoder().encode(value));\r\n}\r\n\r\nexport async function hashBytesToFieldHex(value: Uint8Array): Promise<string> {\r\n if (!globalThis.crypto?.subtle) throw new Error(\"Web Crypto is unavailable\");\r\n const digest = new Uint8Array(await globalThis.crypto.subtle.digest(\"SHA-256\", new Uint8Array(value)));\r\n return fieldHexFromDigest(digest);\r\n}\r\n\r\nexport function base64urlToBytes(value: string): Uint8Array {\r\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\r\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(padded)) throw new Error(\"Invalid base64url value\");\r\n const binary = atob(padded);\r\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;AAMO,IAAM,2BAA2B;AACxC,IAAM,mBAAmB;AAElB,SAAS,kBAAkB,OAAuB;AACvD,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY;AAChE,MAAI,CAAC,mBAAmB,KAAK,UAAU,EAAG,OAAM,IAAI,MAAM,6DAA6D;AACvH,QAAM,SAAS,WAAW,SAAS,kBAAkB,GAAG;AACxD,MAAI,UAAU,yBAA0B,OAAM,IAAI,MAAM,gDAAgD;AACxG,SAAO;AACT;AAEO,SAAS,eAAe,OAAuB;AACpD,SAAO,KAAK,kBAAkB,KAAK,CAAC;AACtC;AAEO,SAAS,kBAAkB,OAA2B;AAC3D,MAAI,MAAM,eAAe,GAAI,OAAM,IAAI,MAAM,+CAA+C;AAC5F,SAAO,kBAAkB,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACnG;AAGO,SAAS,mBAAmB,OAA2B;AAC5D,MAAI,MAAM,eAAe,GAAI,OAAM,IAAI,MAAM,2BAA2B;AACxE,QAAM,aAAa,WAAW,KAAK,KAAK;AACxC,aAAW,CAAC,KAAK;AACjB,SAAO,kBAAkB,UAAU;AACrC;AAEO,SAAS,cAAc,OAAuB;AACnD,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,EAAG,OAAM,IAAI,MAAM,sCAAsC;AACrG,QAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,MAAI,YAAY;AAChB,WAAS,QAAQ,IAAI,SAAS,KAAK,YAAY,GAAG,SAAS,GAAG;AAC5D,UAAM,KAAK,IAAI,YAAY;AAC3B,gBAAY,KAAK,MAAM,YAAY,GAAG;AAAA,EACxC;AACA,SAAO,kBAAkB,KAAK;AAChC;AAEO,SAAS,eAAe,aAAiC;AAC9D,MAAI,YAAY,eAAe,GAAI,OAAM,IAAI,MAAM,0BAA0B;AAC7E,QAAM,aAAa,WAAW,KAAK,WAAW;AAC9C,aAAW,CAAC,KAAK;AACjB,SAAO,kBAAkB,UAAU;AACrC;AAEA,eAAsB,mBAAmB,OAAgC;AACvE,SAAO,oBAAoB,IAAI,YAAY,EAAE,OAAO,KAAK,CAAC;AAC5D;AAEA,eAAsB,oBAAoB,OAAoC;AAC5E,MAAI,CAAC,WAAW,QAAQ,OAAQ,OAAM,IAAI,MAAM,2BAA2B;AAC3E,QAAM,SAAS,IAAI,WAAW,MAAM,WAAW,OAAO,OAAO,OAAO,WAAW,IAAI,WAAW,KAAK,CAAC,CAAC;AACrG,SAAO,mBAAmB,MAAM;AAClC;AAEO,SAAS,iBAAiB,OAA2B;AAC1D,QAAM,aAAa,MAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC7D,QAAM,SAAS,WAAW,OAAO,KAAK,KAAK,WAAW,SAAS,CAAC,IAAI,GAAG,GAAG;AAC1E,MAAI,CAAC,yBAAyB,KAAK,MAAM,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACrF,QAAM,SAAS,KAAK,MAAM;AAC1B,SAAO,WAAW,KAAK,QAAQ,CAAC,cAAc,UAAU,WAAW,CAAC,CAAC;AACvE;","names":[]}
|
package/dist/origin.cjs
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/origin.ts
|
|
21
|
+
var origin_exports = {};
|
|
22
|
+
__export(origin_exports, {
|
|
23
|
+
normalizeOrigin: () => normalizeOrigin
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(origin_exports);
|
|
26
|
+
function isLoopback(hostname) {
|
|
27
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
|
|
28
|
+
}
|
|
29
|
+
function normalizeOrigin(input) {
|
|
30
|
+
let parsed;
|
|
31
|
+
try {
|
|
32
|
+
parsed = new URL(input);
|
|
33
|
+
} catch {
|
|
34
|
+
throw new Error("Origin must be an absolute HTTP or HTTPS origin");
|
|
35
|
+
}
|
|
36
|
+
const protocol = parsed.protocol.toLowerCase();
|
|
37
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
38
|
+
const hasExtraParts = parsed.pathname !== "" && parsed.pathname !== "/" || parsed.search !== "" || parsed.hash !== "";
|
|
39
|
+
if (protocol !== "https:" && protocol !== "http:") {
|
|
40
|
+
throw new Error("Origin must use HTTP or HTTPS");
|
|
41
|
+
}
|
|
42
|
+
if (protocol === "http:" && !isLoopback(hostname)) {
|
|
43
|
+
throw new Error("Origin must use HTTPS outside local development");
|
|
44
|
+
}
|
|
45
|
+
if (!hostname || hostname.includes("*") || parsed.username !== "" || parsed.password !== "" || hasExtraParts) {
|
|
46
|
+
throw new Error("Origin must not include credentials, wildcards, or URL parts");
|
|
47
|
+
}
|
|
48
|
+
return `${protocol}//${parsed.host.toLowerCase()}`;
|
|
49
|
+
}
|
|
50
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
51
|
+
0 && (module.exports = {
|
|
52
|
+
normalizeOrigin
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=origin.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/origin.ts"],"sourcesContent":["export type NormalizedOrigin = `${\"http\" | \"https\"}://${string}`;\n\nfunction isLoopback(hostname: string) {\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"[::1]\"\n );\n}\n\nexport function normalizeOrigin(input: string): NormalizedOrigin {\n let parsed: URL;\n\n try {\n parsed = new URL(input);\n } catch {\n throw new Error(\"Origin must be an absolute HTTP or HTTPS origin\");\n }\n\n const protocol = parsed.protocol.toLowerCase();\n const hostname = parsed.hostname.toLowerCase();\n const hasExtraParts =\n (parsed.pathname !== \"\" && parsed.pathname !== \"/\") ||\n parsed.search !== \"\" ||\n parsed.hash !== \"\";\n\n if (protocol !== \"https:\" && protocol !== \"http:\") {\n throw new Error(\"Origin must use HTTP or HTTPS\");\n }\n if (protocol === \"http:\" && !isLoopback(hostname)) {\n throw new Error(\"Origin must use HTTPS outside local development\");\n }\n if (\n !hostname ||\n hostname.includes(\"*\") ||\n parsed.username !== \"\" ||\n parsed.password !== \"\" ||\n hasExtraParts\n ) {\n throw new Error(\"Origin must not include credentials, wildcards, or URL parts\");\n }\n\n return `${protocol}//${parsed.host.toLowerCase()}` as NormalizedOrigin;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,WAAW,UAAkB;AACpC,SACE,aAAa,eACb,aAAa,eACb,aAAa;AAEjB;AAEO,SAAS,gBAAgB,OAAiC;AAC/D,MAAI;AAEJ,MAAI;AACF,aAAS,IAAI,IAAI,KAAK;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,QAAM,WAAW,OAAO,SAAS,YAAY;AAC7C,QAAM,WAAW,OAAO,SAAS,YAAY;AAC7C,QAAM,gBACH,OAAO,aAAa,MAAM,OAAO,aAAa,OAC/C,OAAO,WAAW,MAClB,OAAO,SAAS;AAElB,MAAI,aAAa,YAAY,aAAa,SAAS;AACjD,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,MAAI,aAAa,WAAW,CAAC,WAAW,QAAQ,GAAG;AACjD,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,MACE,CAAC,YACD,SAAS,SAAS,GAAG,KACrB,OAAO,aAAa,MACpB,OAAO,aAAa,MACpB,eACA;AACA,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAEA,SAAO,GAAG,QAAQ,KAAK,OAAO,KAAK,YAAY,CAAC;AAClD;","names":[]}
|
package/dist/origin.d.ts
ADDED
package/dist/origin.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@veilpass/shared",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Public contracts and exact-origin helpers for VeilPass integrations.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Irham Tri Ahmadi <irhamtria@gmail.com>",
|
|
7
|
+
"repository": { "type": "git", "url": "git+https://github.com/irham3/veilpass.git", "directory": "frontend/packages/shared" },
|
|
8
|
+
"bugs": "https://github.com/irham3/veilpass/issues",
|
|
9
|
+
"homepage": "https://github.com/irham3/veilpass#readme",
|
|
10
|
+
"type": "module",
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": { "types": "./dist/index.d.ts", "import": "./dist/index.js", "require": "./dist/index.cjs" },
|
|
15
|
+
"./contracts": { "types": "./dist/contracts.d.ts", "import": "./dist/contracts.js", "require": "./dist/contracts.cjs" },
|
|
16
|
+
"./origin": { "types": "./dist/origin.d.ts", "import": "./dist/origin.js", "require": "./dist/origin.cjs" }
|
|
17
|
+
},
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"main": "./dist/index.cjs",
|
|
20
|
+
"module": "./dist/index.js",
|
|
21
|
+
"scripts": { "build": "tsup src/index.ts src/contracts.ts src/origin.ts --format esm,cjs --dts --clean --sourcemap --tsconfig tsconfig.build.json" },
|
|
22
|
+
"dependencies": { "zod": "^4.4.3" },
|
|
23
|
+
"publishConfig": { "access": "public", "provenance": true }
|
|
24
|
+
}
|