@puristic/env 0.0.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 +21 -0
- package/dist/classify.d.ts +15 -0
- package/dist/classify.d.ts.map +1 -0
- package/dist/classify.js +42 -0
- package/dist/classify.js.map +1 -0
- package/dist/codegen/formatLeafComment.d.ts +3 -0
- package/dist/codegen/formatLeafComment.d.ts.map +1 -0
- package/dist/codegen/formatLeafComment.js +20 -0
- package/dist/codegen/formatLeafComment.js.map +1 -0
- package/dist/codegen/generateDts.d.ts +4 -0
- package/dist/codegen/generateDts.d.ts.map +1 -0
- package/dist/codegen/generateDts.js +78 -0
- package/dist/codegen/generateDts.js.map +1 -0
- package/dist/codegen/generateEnvExample.d.ts +6 -0
- package/dist/codegen/generateEnvExample.d.ts.map +1 -0
- package/dist/codegen/generateEnvExample.js +47 -0
- package/dist/codegen/generateEnvExample.js.map +1 -0
- package/dist/codegen/generateJsonSchema.d.ts +3 -0
- package/dist/codegen/generateJsonSchema.d.ts.map +1 -0
- package/dist/codegen/generateJsonSchema.js +26 -0
- package/dist/codegen/generateJsonSchema.js.map +1 -0
- package/dist/createConfig.d.ts +14 -0
- package/dist/createConfig.d.ts.map +1 -0
- package/dist/createConfig.js +26 -0
- package/dist/createConfig.js.map +1 -0
- package/dist/crypto/decrypt.d.ts +2 -0
- package/dist/crypto/decrypt.d.ts.map +1 -0
- package/dist/crypto/decrypt.js +13 -0
- package/dist/crypto/decrypt.js.map +1 -0
- package/dist/crypto/decryptInPlace.d.ts +3 -0
- package/dist/crypto/decryptInPlace.d.ts.map +1 -0
- package/dist/crypto/decryptInPlace.js +24 -0
- package/dist/crypto/decryptInPlace.js.map +1 -0
- package/dist/crypto/encrypt.d.ts +2 -0
- package/dist/crypto/encrypt.d.ts.map +1 -0
- package/dist/crypto/encrypt.js +13 -0
- package/dist/crypto/encrypt.js.map +1 -0
- package/dist/crypto/format.d.ts +16 -0
- package/dist/crypto/format.d.ts.map +1 -0
- package/dist/crypto/format.js +47 -0
- package/dist/crypto/format.js.map +1 -0
- package/dist/crypto/getPath.d.ts +2 -0
- package/dist/crypto/getPath.d.ts.map +1 -0
- package/dist/crypto/getPath.js +12 -0
- package/dist/crypto/getPath.js.map +1 -0
- package/dist/crypto/keygen.d.ts +6 -0
- package/dist/crypto/keygen.d.ts.map +1 -0
- package/dist/crypto/keygen.js +10 -0
- package/dist/crypto/keygen.js.map +1 -0
- package/dist/crypto/resolveKey.d.ts +11 -0
- package/dist/crypto/resolveKey.d.ts.map +1 -0
- package/dist/crypto/resolveKey.js +73 -0
- package/dist/crypto/resolveKey.js.map +1 -0
- package/dist/defineConfig.d.ts +4 -0
- package/dist/defineConfig.d.ts.map +1 -0
- package/dist/defineConfig.js +5 -0
- package/dist/defineConfig.js.map +1 -0
- package/dist/deriveName.d.ts +14 -0
- package/dist/deriveName.d.ts.map +1 -0
- package/dist/deriveName.js +52 -0
- package/dist/deriveName.js.map +1 -0
- package/dist/discovery/associate.d.ts +2 -0
- package/dist/discovery/associate.d.ts.map +1 -0
- package/dist/discovery/associate.js +20 -0
- package/dist/discovery/associate.js.map +1 -0
- package/dist/discovery/groupByDirectory.d.ts +2 -0
- package/dist/discovery/groupByDirectory.d.ts.map +1 -0
- package/dist/discovery/groupByDirectory.js +15 -0
- package/dist/discovery/groupByDirectory.js.map +1 -0
- package/dist/discovery/paths.d.ts +4 -0
- package/dist/discovery/paths.d.ts.map +1 -0
- package/dist/discovery/paths.js +15 -0
- package/dist/discovery/paths.js.map +1 -0
- package/dist/enumerateLeafPaths.d.ts +9 -0
- package/dist/enumerateLeafPaths.d.ts.map +1 -0
- package/dist/enumerateLeafPaths.js +41 -0
- package/dist/enumerateLeafPaths.js.map +1 -0
- package/dist/envText.d.ts +36 -0
- package/dist/envText.d.ts.map +1 -0
- package/dist/envText.js +147 -0
- package/dist/envText.js.map +1 -0
- package/dist/expandEnv.d.ts +3 -0
- package/dist/expandEnv.d.ts.map +1 -0
- package/dist/expandEnv.js +34 -0
- package/dist/expandEnv.js.map +1 -0
- package/dist/explain.d.ts +9 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +45 -0
- package/dist/explain.js.map +1 -0
- package/dist/findSecretPaths.d.ts +3 -0
- package/dist/findSecretPaths.d.ts.map +1 -0
- package/dist/findSecretPaths.js +31 -0
- package/dist/findSecretPaths.js.map +1 -0
- package/dist/freeze.d.ts +2 -0
- package/dist/freeze.d.ts.map +1 -0
- package/dist/freeze.js +14 -0
- package/dist/freeze.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/inspectSchema.d.ts +29 -0
- package/dist/inspectSchema.d.ts.map +1 -0
- package/dist/inspectSchema.js +0 -0
- package/dist/inspectSchema.js.map +1 -0
- package/dist/loadConfig.d.ts +5 -0
- package/dist/loadConfig.d.ts.map +1 -0
- package/dist/loadConfig.js +29 -0
- package/dist/loadConfig.js.map +1 -0
- package/dist/merge.d.ts +4 -0
- package/dist/merge.d.ts.map +1 -0
- package/dist/merge.js +24 -0
- package/dist/merge.js.map +1 -0
- package/dist/provenance.d.ts +16 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +2 -0
- package/dist/provenance.js.map +1 -0
- package/dist/secret.d.ts +5 -0
- package/dist/secret.d.ts.map +1 -0
- package/dist/secret.js +20 -0
- package/dist/secret.js.map +1 -0
- package/dist/setPath.d.ts +3 -0
- package/dist/setPath.d.ts.map +1 -0
- package/dist/setPath.js +33 -0
- package/dist/setPath.js.map +1 -0
- package/dist/source.d.ts +9 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/sources/cliArgs.d.ts +6 -0
- package/dist/sources/cliArgs.d.ts.map +1 -0
- package/dist/sources/cliArgs.js +49 -0
- package/dist/sources/cliArgs.js.map +1 -0
- package/dist/sources/env.d.ts +6 -0
- package/dist/sources/env.d.ts.map +1 -0
- package/dist/sources/env.js +22 -0
- package/dist/sources/env.js.map +1 -0
- package/dist/sources/envFile.d.ts +3 -0
- package/dist/sources/envFile.d.ts.map +1 -0
- package/dist/sources/envFile.js +56 -0
- package/dist/sources/envFile.js.map +1 -0
- package/dist/unwrapSchema.d.ts +5 -0
- package/dist/unwrapSchema.d.ts.map +1 -0
- package/dist/unwrapSchema.js +26 -0
- package/dist/unwrapSchema.js.map +1 -0
- package/dist/validateValues.d.ts +13 -0
- package/dist/validateValues.d.ts.map +1 -0
- package/dist/validateValues.js +48 -0
- package/dist/validateValues.js.map +1 -0
- package/dist/wrappers.d.ts +11 -0
- package/dist/wrappers.d.ts.map +1 -0
- package/dist/wrappers.js +47 -0
- package/dist/wrappers.js.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Artur Kurowski
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LeafDescriptorPublic } from "./inspectSchema.js";
|
|
2
|
+
export type VarStatus = "ok" | "missing-required" | "using-default" | "invalid" | "unknown" | "secret-encrypted" | "secret-plaintext" | "no-schema";
|
|
3
|
+
export interface ClassifyInput {
|
|
4
|
+
descriptor: LeafDescriptorPublic | undefined;
|
|
5
|
+
present: boolean;
|
|
6
|
+
isEncrypted: boolean;
|
|
7
|
+
validationOk: boolean | undefined;
|
|
8
|
+
validationMessage: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
export interface Classification {
|
|
11
|
+
status: VarStatus;
|
|
12
|
+
message?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function classify(input: ClassifyInput): Classification;
|
|
15
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI/D,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,kBAAkB,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,WAAW,CAAC;AAEpJ,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAwB7D"}
|
package/dist/classify.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function classify(input) {
|
|
2
|
+
const descriptor = input.descriptor;
|
|
3
|
+
if (descriptor === undefined) {
|
|
4
|
+
return { status: "unknown", message: "Not defined in the schema" };
|
|
5
|
+
}
|
|
6
|
+
if (descriptor.secret) {
|
|
7
|
+
if (!input.present) {
|
|
8
|
+
return missing(descriptor, "Required secret is missing");
|
|
9
|
+
}
|
|
10
|
+
if (input.isEncrypted) {
|
|
11
|
+
return { status: "secret-encrypted" };
|
|
12
|
+
}
|
|
13
|
+
return { status: "secret-plaintext", message: "Secret stored as plaintext — encrypt it" };
|
|
14
|
+
}
|
|
15
|
+
if (!input.present) {
|
|
16
|
+
return missing(descriptor, "Required value is missing");
|
|
17
|
+
}
|
|
18
|
+
if (input.validationOk === false) {
|
|
19
|
+
return { status: "invalid", message: invalidMessage(descriptor, input.validationMessage) };
|
|
20
|
+
}
|
|
21
|
+
return { status: "ok" };
|
|
22
|
+
}
|
|
23
|
+
function missing(descriptor, requiredMessage) {
|
|
24
|
+
if (descriptor.required) {
|
|
25
|
+
return { status: "missing-required", message: requiredMessage };
|
|
26
|
+
}
|
|
27
|
+
return { status: "using-default", message: defaultHint(descriptor) };
|
|
28
|
+
}
|
|
29
|
+
function defaultHint(descriptor) {
|
|
30
|
+
if (!descriptor.hasDefault) {
|
|
31
|
+
return "Optional — not set";
|
|
32
|
+
}
|
|
33
|
+
return descriptor.default !== undefined ? `Using default: ${String(descriptor.default)}` : "Using schema default";
|
|
34
|
+
}
|
|
35
|
+
function invalidMessage(descriptor, message) {
|
|
36
|
+
const base = message ?? "Invalid value";
|
|
37
|
+
if ((descriptor.type === "number" || descriptor.type === "boolean") && !descriptor.coerce) {
|
|
38
|
+
return `${base} — schema isn't coercion-enabled; use z.coerce.${descriptor.type}()`;
|
|
39
|
+
}
|
|
40
|
+
return base;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,QAAQ,CAAC,KAAoB;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IAC9F,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,UAAgC,EAAE,eAAuB;IACtE,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,WAAW,CAAC,UAAgC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC;IAChC,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC;AACtH,CAAC;AAED,SAAS,cAAc,CAAC,UAAgC,EAAE,OAA2B;IACjF,MAAM,IAAI,GAAG,OAAO,IAAI,eAAe,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACxF,OAAO,GAAG,IAAI,kDAAkD,UAAU,CAAC,IAAI,IAAI,CAAC;IACxF,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatLeafComment.d.ts","sourceRoot":"","sources":["../../src/codegen/formatLeafComment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAIhE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,CAS1E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function formatLeafComment(descriptor) {
|
|
2
|
+
const parts = [typeLabel(descriptor), descriptor.required ? "required" : "optional"];
|
|
3
|
+
if (descriptor.hasDefault && descriptor.default !== undefined) {
|
|
4
|
+
parts.push(`default: ${JSON.stringify(descriptor.default)}`);
|
|
5
|
+
}
|
|
6
|
+
if (descriptor.secret) {
|
|
7
|
+
parts.push("secret");
|
|
8
|
+
}
|
|
9
|
+
return parts.join(" — ");
|
|
10
|
+
}
|
|
11
|
+
function typeLabel(descriptor) {
|
|
12
|
+
if (descriptor.enumValues !== undefined) {
|
|
13
|
+
return `enum (${descriptor.enumValues.join(" | ")})`;
|
|
14
|
+
}
|
|
15
|
+
if (descriptor.constraints.length === 0) {
|
|
16
|
+
return descriptor.type;
|
|
17
|
+
}
|
|
18
|
+
return `${descriptor.type} (${descriptor.constraints.map((constraint) => constraint.label).join(", ")})`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=formatLeafComment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatLeafComment.js","sourceRoot":"","sources":["../../src/codegen/formatLeafComment.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,iBAAiB,CAAC,UAAgC;IAC9D,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACrF,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS,CAAC,UAAgC;IAC/C,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,SAAS,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACzD,CAAC;IACD,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC,IAAI,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7G,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { LeafDescriptorPublic } from "../inspectSchema.js";
|
|
2
|
+
import type { CodegenOptions } from "./generateEnvExample.js";
|
|
3
|
+
export declare function generateDts(descriptors: LeafDescriptorPublic[], options?: CodegenOptions): string;
|
|
4
|
+
//# sourceMappingURL=generateDts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateDts.d.ts","sourceRoot":"","sources":["../../src/codegen/generateDts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAe,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAoB9D,wBAAgB,WAAW,CAAC,WAAW,EAAE,oBAAoB,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAcrG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { formatLeafComment } from "./formatLeafComment.js";
|
|
2
|
+
const BANNER = "// Generated by puristic gen — DO NOT EDIT.";
|
|
3
|
+
const SCALAR = {
|
|
4
|
+
string: "string",
|
|
5
|
+
number: "number",
|
|
6
|
+
boolean: "boolean",
|
|
7
|
+
bigint: "bigint",
|
|
8
|
+
date: "Date",
|
|
9
|
+
enum: "string",
|
|
10
|
+
literal: "string",
|
|
11
|
+
unknown: "unknown",
|
|
12
|
+
};
|
|
13
|
+
export function generateDts(descriptors, options = {}) {
|
|
14
|
+
const lines = [BANNER];
|
|
15
|
+
if (options.source !== undefined) {
|
|
16
|
+
lines.push(`// Source: ${options.source}`);
|
|
17
|
+
}
|
|
18
|
+
lines.push("", "export {};", "", "declare global {", " namespace NodeJS {", " interface ProcessEnv {");
|
|
19
|
+
for (const descriptor of descriptors) {
|
|
20
|
+
lines.push(` /** ${formatLeafComment(descriptor)} */`);
|
|
21
|
+
lines.push(` ${descriptor.envName}${rawOptional(descriptor) ? "?" : ""}: ${rawType(descriptor)};`);
|
|
22
|
+
}
|
|
23
|
+
lines.push(" }", " }", "}", "");
|
|
24
|
+
lines.push("/** Parsed + coerced config — the shape returned by createConfig(definition).load(). */");
|
|
25
|
+
lines.push(`export interface PuristicConfig ${renderBranch(buildTree(descriptors), 0)}`);
|
|
26
|
+
return `${lines.join("\n")}\n`;
|
|
27
|
+
}
|
|
28
|
+
function rawOptional(descriptor) {
|
|
29
|
+
return descriptor.optional || descriptor.hasDefault;
|
|
30
|
+
}
|
|
31
|
+
function rawType(descriptor) {
|
|
32
|
+
return descriptor.enumValues !== undefined ? union(descriptor.enumValues) : "string";
|
|
33
|
+
}
|
|
34
|
+
function buildTree(descriptors) {
|
|
35
|
+
const root = new Map();
|
|
36
|
+
for (const descriptor of descriptors) {
|
|
37
|
+
let branch = root;
|
|
38
|
+
for (let i = 0; i < descriptor.path.length - 1; i++) {
|
|
39
|
+
const key = descriptor.path[i] ?? "";
|
|
40
|
+
const child = branch.get(key);
|
|
41
|
+
if (child instanceof Map) {
|
|
42
|
+
branch = child;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const created = new Map();
|
|
46
|
+
branch.set(key, created);
|
|
47
|
+
branch = created;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
branch.set(descriptor.path[descriptor.path.length - 1] ?? descriptor.envName, descriptor);
|
|
51
|
+
}
|
|
52
|
+
return root;
|
|
53
|
+
}
|
|
54
|
+
function renderBranch(branch, depth) {
|
|
55
|
+
const pad = " ".repeat(depth + 1);
|
|
56
|
+
const lines = ["{"];
|
|
57
|
+
for (const [key, value] of branch) {
|
|
58
|
+
if (value instanceof Map) {
|
|
59
|
+
lines.push(`${pad}${key}: ${renderBranch(value, depth + 1)};`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
lines.push(`${pad}${key}${configOptional(value) ? "?" : ""}: ${configType(value)};`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
lines.push(`${" ".repeat(depth)}}`);
|
|
66
|
+
return lines.join("\n");
|
|
67
|
+
}
|
|
68
|
+
function configOptional(descriptor) {
|
|
69
|
+
return descriptor.optional || descriptor.hasDefault;
|
|
70
|
+
}
|
|
71
|
+
function configType(descriptor) {
|
|
72
|
+
const base = descriptor.enumValues !== undefined ? union(descriptor.enumValues) : SCALAR[descriptor.type];
|
|
73
|
+
return descriptor.nullable ? `${base} | null` : base;
|
|
74
|
+
}
|
|
75
|
+
function union(values) {
|
|
76
|
+
return values.map((value) => JSON.stringify(value)).join(" | ");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=generateDts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateDts.js","sourceRoot":"","sources":["../../src/codegen/generateDts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LeafDescriptorPublic } from "../inspectSchema.js";
|
|
2
|
+
export interface CodegenOptions {
|
|
3
|
+
source?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function generateEnvExample(descriptors: LeafDescriptorPublic[], options?: CodegenOptions): string;
|
|
6
|
+
//# sourceMappingURL=generateEnvExample.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateEnvExample.d.ts","sourceRoot":"","sources":["../../src/codegen/generateEnvExample.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAKhE,MAAM,WAAW,cAAc;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,oBAAoB,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CA4B5G"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { formatLeafComment } from "./formatLeafComment.js";
|
|
2
|
+
const BANNER = "# Generated by puristic gen — DO NOT EDIT.";
|
|
3
|
+
export function generateEnvExample(descriptors, options = {}) {
|
|
4
|
+
const header = options.source === undefined ? [BANNER] : [BANNER, `# Source: ${options.source}`];
|
|
5
|
+
const rootLeaves = [];
|
|
6
|
+
const sections = new Map();
|
|
7
|
+
for (const descriptor of descriptors) {
|
|
8
|
+
if (descriptor.path.length <= 1) {
|
|
9
|
+
rootLeaves.push(descriptor);
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const section = descriptor.path[0] ?? "";
|
|
13
|
+
const existing = sections.get(section);
|
|
14
|
+
if (existing === undefined) {
|
|
15
|
+
sections.set(section, [descriptor]);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
existing.push(descriptor);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const blocks = [];
|
|
22
|
+
if (rootLeaves.length > 0) {
|
|
23
|
+
blocks.push(rootLeaves.map(entry).join("\n"));
|
|
24
|
+
}
|
|
25
|
+
for (const [section, leaves] of sections) {
|
|
26
|
+
blocks.push(`# --- ${section} ---\n${leaves.map(entry).join("\n")}`);
|
|
27
|
+
}
|
|
28
|
+
return `${header.join("\n")}\n\n${blocks.join("\n\n")}\n`;
|
|
29
|
+
}
|
|
30
|
+
function entry(descriptor) {
|
|
31
|
+
const lines = [`# ${formatLeafComment(descriptor)}`];
|
|
32
|
+
if (descriptor.secret) {
|
|
33
|
+
lines.push("# secret: set via `puristic encrypt`, or paste an encrypted:v1: envelope");
|
|
34
|
+
lines.push(`${descriptor.envName}=`);
|
|
35
|
+
return lines.join("\n");
|
|
36
|
+
}
|
|
37
|
+
if (descriptor.hasDefault && descriptor.default !== undefined) {
|
|
38
|
+
lines.push(`${descriptor.envName}=${literal(descriptor.default)}`);
|
|
39
|
+
return lines.join("\n");
|
|
40
|
+
}
|
|
41
|
+
lines.push(`${descriptor.envName}=`);
|
|
42
|
+
return lines.join("\n");
|
|
43
|
+
}
|
|
44
|
+
function literal(value) {
|
|
45
|
+
return typeof value === "string" ? value : String(value);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=generateEnvExample.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateEnvExample.js","sourceRoot":"","sources":["../../src/codegen/generateEnvExample.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,MAAM,GAAG,4CAA4C,CAAC;AAQ5D,MAAM,UAAU,kBAAkB,CAAC,WAAmC,EAAE,UAA0B,EAAE;IAChG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjG,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC3D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5B,SAAS;QACb,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,KAAK,CAAC,UAAgC;IAC3C,MAAM,KAAK,GAAG,CAAC,KAAK,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateJsonSchema.d.ts","sourceRoot":"","sources":["../../src/codegen/generateJsonSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAI5D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function generateJsonSchema(schema) {
|
|
3
|
+
const json = z.toJSONSchema(schema, { unrepresentable: "any" });
|
|
4
|
+
scrubSecrets(json);
|
|
5
|
+
return `${JSON.stringify(json, null, 4)}\n`;
|
|
6
|
+
}
|
|
7
|
+
function scrubSecrets(node) {
|
|
8
|
+
if (Array.isArray(node)) {
|
|
9
|
+
for (const item of node) {
|
|
10
|
+
scrubSecrets(item);
|
|
11
|
+
}
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (node === null || typeof node !== "object") {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const object = node;
|
|
18
|
+
if (object["secret"] === true) {
|
|
19
|
+
delete object["default"];
|
|
20
|
+
delete object["examples"];
|
|
21
|
+
}
|
|
22
|
+
for (const value of Object.values(object)) {
|
|
23
|
+
scrubSecrets(value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=generateJsonSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateJsonSchema.js","sourceRoot":"","sources":["../../src/codegen/generateJsonSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAChD,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAA4B,CAAC;IAC3F,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACX,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO;IACX,CAAC;IACD,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,YAAY,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import { type DecryptOptions } from "./crypto/resolveKey.js";
|
|
3
|
+
import type { Source } from "./source.js";
|
|
4
|
+
export interface ConfigDefinition<S extends z.ZodType> {
|
|
5
|
+
schema: S;
|
|
6
|
+
sources: Source[];
|
|
7
|
+
decrypt?: DecryptOptions;
|
|
8
|
+
}
|
|
9
|
+
export interface ConfigHandle<S extends z.ZodType> {
|
|
10
|
+
load: () => z.infer<S>;
|
|
11
|
+
get: () => z.infer<S>;
|
|
12
|
+
}
|
|
13
|
+
export declare function createConfig<S extends z.ZodType>(definition: ConfigDefinition<S>): ConfigHandle<S>;
|
|
14
|
+
//# sourceMappingURL=createConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createConfig.d.ts","sourceRoot":"","sources":["../src/createConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,wBAAwB,CAAC;AAGhF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IACjD,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IAC7C,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAoBlG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { decryptSecretsInPlace } from "./crypto/decryptInPlace.js";
|
|
2
|
+
import { resolvePrivateKey } from "./crypto/resolveKey.js";
|
|
3
|
+
import { deepFreeze } from "./freeze.js";
|
|
4
|
+
import { mergeSources } from "./merge.js";
|
|
5
|
+
export function createConfig(definition) {
|
|
6
|
+
let holder;
|
|
7
|
+
return {
|
|
8
|
+
load() {
|
|
9
|
+
const merged = mergeSources(definition.sources, definition.schema);
|
|
10
|
+
if (definition.decrypt?.disabled !== true) {
|
|
11
|
+
decryptSecretsInPlace(merged, definition.schema, () => resolvePrivateKey(definition.decrypt));
|
|
12
|
+
}
|
|
13
|
+
const parsed = definition.schema.parse(merged);
|
|
14
|
+
const frozen = deepFreeze(parsed);
|
|
15
|
+
holder = frozen;
|
|
16
|
+
return frozen;
|
|
17
|
+
},
|
|
18
|
+
get() {
|
|
19
|
+
if (holder === undefined) {
|
|
20
|
+
throw new Error("Config not loaded — call load() in your bootstrap before accessing config values");
|
|
21
|
+
}
|
|
22
|
+
return holder;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=createConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createConfig.js","sourceRoot":"","sources":["../src/createConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAuB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc1C,MAAM,UAAU,YAAY,CAAsB,UAA+B;IAC7E,IAAI,MAA8B,CAAC;IACnC,OAAO;QACH,IAAI;YACA,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YACnE,IAAI,UAAU,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACxC,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;YAClG,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAe,CAAC;YAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,GAAG,MAAM,CAAC;YAChB,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,GAAG;YACC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;YACxG,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decrypt.d.ts","sourceRoot":"","sources":["../../src/crypto/decrypt.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAQjF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createDecipheriv } from "node:crypto";
|
|
2
|
+
import { ml_kem512 } from "@noble/post-quantum/ml-kem.js";
|
|
3
|
+
import { base64urlDecode, decodeEnvelope } from "./format.js";
|
|
4
|
+
export function decrypt(envelope, privateKey) {
|
|
5
|
+
const sk = typeof privateKey === "string" ? base64urlDecode(privateKey) : privateKey;
|
|
6
|
+
const { kemCt, nonce, tag, ct } = decodeEnvelope(envelope);
|
|
7
|
+
const sharedSecret = ml_kem512.decapsulate(kemCt, sk);
|
|
8
|
+
const decipher = createDecipheriv("aes-256-gcm", sharedSecret, nonce);
|
|
9
|
+
decipher.setAuthTag(tag);
|
|
10
|
+
const plaintext = Buffer.concat([decipher.update(ct), decipher.final()]);
|
|
11
|
+
return plaintext.toString("utf8");
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=decrypt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../src/crypto/decrypt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,UAA+B;IACrE,MAAM,EAAE,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACrF,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACzE,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryptInPlace.d.ts","sourceRoot":"","sources":["../../src/crypto/decryptInPlace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAiB5H"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { enumerateLeafPaths } from "../enumerateLeafPaths.js";
|
|
2
|
+
import { setPath } from "../setPath.js";
|
|
3
|
+
import { decrypt } from "./decrypt.js";
|
|
4
|
+
import { getPath } from "./getPath.js";
|
|
5
|
+
export function decryptSecretsInPlace(record, schema, resolveKey) {
|
|
6
|
+
const secretLeaves = enumerateLeafPaths(schema).filter((leaf) => leaf.meta?.["secret"] === true);
|
|
7
|
+
let key;
|
|
8
|
+
for (const leaf of secretLeaves) {
|
|
9
|
+
const value = getPath(record, leaf.path);
|
|
10
|
+
if (typeof value !== "string" || !value.startsWith("encrypted:")) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (key === undefined) {
|
|
14
|
+
try {
|
|
15
|
+
key = resolveKey();
|
|
16
|
+
}
|
|
17
|
+
catch (cause) {
|
|
18
|
+
throw new Error(`Cannot decrypt secret at path "${leaf.path.join(".")}": ${cause.message}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
setPath(record, leaf.path, decrypt(value, key));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=decryptInPlace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryptInPlace.js","sourceRoot":"","sources":["../../src/crypto/decryptInPlace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,qBAAqB,CAAC,MAA+B,EAAE,MAAiB,EAAE,UAA4B;IAClH,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;IACjG,IAAI,GAA2B,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,SAAS;QACb,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC;gBACD,GAAG,GAAG,UAAU,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAO,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3G,CAAC;QACL,CAAC;QACD,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/crypto/encrypt.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAQjF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createCipheriv, randomBytes } from "node:crypto";
|
|
2
|
+
import { ml_kem512 } from "@noble/post-quantum/ml-kem.js";
|
|
3
|
+
import { base64urlDecode, encodeEnvelope } from "./format.js";
|
|
4
|
+
export function encrypt(plaintext, publicKey) {
|
|
5
|
+
const pk = typeof publicKey === "string" ? base64urlDecode(publicKey) : publicKey;
|
|
6
|
+
const { cipherText: kemCt, sharedSecret } = ml_kem512.encapsulate(pk);
|
|
7
|
+
const nonce = randomBytes(12);
|
|
8
|
+
const cipher = createCipheriv("aes-256-gcm", sharedSecret, nonce);
|
|
9
|
+
const ct = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
|
|
10
|
+
const tag = cipher.getAuthTag();
|
|
11
|
+
return encodeEnvelope(kemCt, nonce, tag, ct);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=encrypt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../src/crypto/encrypt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,SAA8B;IACrE,MAAM,EAAE,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAChC,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const ENVELOPE_PREFIX = "encrypted:v1:";
|
|
2
|
+
export declare const KEM_CT_LEN = 768;
|
|
3
|
+
export declare const NONCE_LEN = 12;
|
|
4
|
+
export declare const GCM_TAG_LEN = 16;
|
|
5
|
+
export interface Envelope {
|
|
6
|
+
kemCt: Uint8Array;
|
|
7
|
+
nonce: Uint8Array;
|
|
8
|
+
tag: Uint8Array;
|
|
9
|
+
ct: Uint8Array;
|
|
10
|
+
}
|
|
11
|
+
export declare function encodeEnvelope(kemCt: Uint8Array, nonce: Uint8Array, tag: Uint8Array, ct: Uint8Array): string;
|
|
12
|
+
export declare function decodeEnvelope(value: string): Envelope;
|
|
13
|
+
export declare function isEnvelope(value: unknown): value is string;
|
|
14
|
+
export declare function base64urlEncode(bytes: Uint8Array): string;
|
|
15
|
+
export declare function base64urlDecode(text: string): Uint8Array;
|
|
16
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/crypto/format.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,WAAW,KAAK,CAAC;AAG9B,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,MAAM,CAgB5G;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CActD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAExD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const ENVELOPE_PREFIX = "encrypted:v1:";
|
|
2
|
+
export const KEM_CT_LEN = 768;
|
|
3
|
+
export const NONCE_LEN = 12;
|
|
4
|
+
export const GCM_TAG_LEN = 16;
|
|
5
|
+
const HEADER_LEN = KEM_CT_LEN + NONCE_LEN + GCM_TAG_LEN;
|
|
6
|
+
export function encodeEnvelope(kemCt, nonce, tag, ct) {
|
|
7
|
+
if (kemCt.length !== KEM_CT_LEN) {
|
|
8
|
+
throw new Error(`encodeEnvelope: kemCt must be ${KEM_CT_LEN} bytes, got ${kemCt.length}`);
|
|
9
|
+
}
|
|
10
|
+
if (nonce.length !== NONCE_LEN) {
|
|
11
|
+
throw new Error(`encodeEnvelope: nonce must be ${NONCE_LEN} bytes, got ${nonce.length}`);
|
|
12
|
+
}
|
|
13
|
+
if (tag.length !== GCM_TAG_LEN) {
|
|
14
|
+
throw new Error(`encodeEnvelope: tag must be ${GCM_TAG_LEN} bytes, got ${tag.length}`);
|
|
15
|
+
}
|
|
16
|
+
const body = new Uint8Array(HEADER_LEN + ct.length);
|
|
17
|
+
body.set(kemCt, 0);
|
|
18
|
+
body.set(nonce, KEM_CT_LEN);
|
|
19
|
+
body.set(tag, KEM_CT_LEN + NONCE_LEN);
|
|
20
|
+
body.set(ct, HEADER_LEN);
|
|
21
|
+
return ENVELOPE_PREFIX + base64urlEncode(body);
|
|
22
|
+
}
|
|
23
|
+
export function decodeEnvelope(value) {
|
|
24
|
+
if (!value.startsWith(ENVELOPE_PREFIX)) {
|
|
25
|
+
throw new Error(`decodeEnvelope: expected prefix "${ENVELOPE_PREFIX}"`);
|
|
26
|
+
}
|
|
27
|
+
const body = base64urlDecode(value.slice(ENVELOPE_PREFIX.length));
|
|
28
|
+
if (body.length < HEADER_LEN) {
|
|
29
|
+
throw new Error(`decodeEnvelope: payload too short (${body.length} < ${HEADER_LEN})`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
kemCt: body.subarray(0, KEM_CT_LEN),
|
|
33
|
+
nonce: body.subarray(KEM_CT_LEN, KEM_CT_LEN + NONCE_LEN),
|
|
34
|
+
tag: body.subarray(KEM_CT_LEN + NONCE_LEN, HEADER_LEN),
|
|
35
|
+
ct: body.subarray(HEADER_LEN),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function isEnvelope(value) {
|
|
39
|
+
return typeof value === "string" && value.startsWith("encrypted:");
|
|
40
|
+
}
|
|
41
|
+
export function base64urlEncode(bytes) {
|
|
42
|
+
return Buffer.from(bytes).toString("base64url");
|
|
43
|
+
}
|
|
44
|
+
export function base64urlDecode(text) {
|
|
45
|
+
return new Uint8Array(Buffer.from(text, "base64url"));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/crypto/format.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAC9B,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AASxD,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,KAAiB,EAAE,GAAe,EAAE,EAAc;IAChG,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iCAAiC,UAAU,eAAe,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,eAAe,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,+BAA+B,WAAW,eAAe,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACzB,OAAO,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,eAAe,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO;QACH,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC;QACnC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;QACxD,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,EAAE,UAAU,CAAC;QACtD,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;KAChC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPath.d.ts","sourceRoot":"","sources":["../../src/crypto/getPath.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAShF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isPlainObject } from "../setPath.js";
|
|
2
|
+
export function getPath(source, path) {
|
|
3
|
+
let cursor = source;
|
|
4
|
+
for (const segment of path) {
|
|
5
|
+
if (!isPlainObject(cursor)) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
cursor = cursor[segment];
|
|
9
|
+
}
|
|
10
|
+
return cursor;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=getPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPath.js","sourceRoot":"","sources":["../../src/crypto/getPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,OAAO,CAAC,MAA+B,EAAE,IAAc;IACnE,IAAI,MAAM,GAAY,MAAM,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.d.ts","sourceRoot":"","sources":["../../src/crypto/keygen.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,eAAe,IAAI,OAAO,CAMzC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ml_kem512 } from "@noble/post-quantum/ml-kem.js";
|
|
2
|
+
import { base64urlEncode } from "./format.js";
|
|
3
|
+
export function generateKeypair() {
|
|
4
|
+
const { publicKey, secretKey } = ml_kem512.keygen();
|
|
5
|
+
return {
|
|
6
|
+
publicKey: base64urlEncode(publicKey),
|
|
7
|
+
privateKey: base64urlEncode(secretKey),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=keygen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.js","sourceRoot":"","sources":["../../src/crypto/keygen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9C,MAAM,UAAU,eAAe;IAC3B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;IACpD,OAAO;QACH,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;QACrC,UAAU,EAAE,eAAe,CAAC,SAAS,CAAC;KACzC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const PUBLIC_KEY_PATH = ".config/puristic-pub.key";
|
|
2
|
+
export interface DecryptOptions {
|
|
3
|
+
privateKey?: string | Uint8Array;
|
|
4
|
+
privateKeyPath?: string;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function resolvePublicKey(cwd?: string): Uint8Array;
|
|
8
|
+
export declare function resolvePrivateKey(options?: DecryptOptions): Uint8Array;
|
|
9
|
+
export declare function defaultPrivateKeyPath(cwd: string): string;
|
|
10
|
+
export declare function resolveProjectName(cwd?: string): string;
|
|
11
|
+
//# sourceMappingURL=resolveKey.d.ts.map
|