@naylence/advanced-security 0.3.5-test.101 → 0.3.5-test.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/browser/index.js +13385 -12988
  2. package/dist/browser/index.js.map +1 -1
  3. package/dist/cjs/browser.js +1 -0
  4. package/dist/cjs/browser.js.map +1 -1
  5. package/dist/cjs/naylence/fame/factory-manifest.js +14 -0
  6. package/dist/cjs/naylence/fame/factory-manifest.js.map +1 -1
  7. package/dist/cjs/naylence/fame/security/cert/browser-csr.js +103 -0
  8. package/dist/cjs/naylence/fame/security/cert/browser-csr.js.map +1 -0
  9. package/dist/cjs/naylence/fame/security/cert/ca-service-client.js +331 -24
  10. package/dist/cjs/naylence/fame/security/cert/ca-service-client.js.map +1 -1
  11. package/dist/cjs/naylence/fame/security/cert/ca-types.js +8 -0
  12. package/dist/cjs/naylence/fame/security/cert/ca-types.js.map +1 -1
  13. package/dist/cjs/naylence/fame/security/cert/csr-types.js +2 -0
  14. package/dist/cjs/naylence/fame/security/cert/csr-types.js.map +1 -0
  15. package/dist/cjs/naylence/fame/security/cert/default-ca-service.js +102 -1
  16. package/dist/cjs/naylence/fame/security/cert/default-ca-service.js.map +1 -1
  17. package/dist/cjs/naylence/fame/security/cert/default-certificate-manager.js +240 -45
  18. package/dist/cjs/naylence/fame/security/cert/default-certificate-manager.js.map +1 -1
  19. package/dist/cjs/naylence/fame/security/cert/index.js +4 -1
  20. package/dist/cjs/naylence/fame/security/cert/index.js.map +1 -1
  21. package/dist/cjs/naylence/fame/security/cert/internal-ca-service.js +2 -5
  22. package/dist/cjs/naylence/fame/security/cert/internal-ca-service.js.map +1 -1
  23. package/dist/cjs/naylence/fame/security/cert/node-ed25519-csr.js +156 -0
  24. package/dist/cjs/naylence/fame/security/cert/node-ed25519-csr.js.map +1 -0
  25. package/dist/cjs/naylence/fame/security/cert/oid-constants.js +7 -0
  26. package/dist/cjs/naylence/fame/security/cert/oid-constants.js.map +1 -0
  27. package/dist/cjs/naylence/fame/security/cert/trust-store/anchor-utils.js +119 -0
  28. package/dist/cjs/naylence/fame/security/cert/trust-store/anchor-utils.js.map +1 -0
  29. package/dist/cjs/naylence/fame/security/cert/trust-store/env-provider.js +123 -0
  30. package/dist/cjs/naylence/fame/security/cert/trust-store/env-provider.js.map +1 -0
  31. package/dist/cjs/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js +220 -0
  32. package/dist/cjs/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js.map +1 -0
  33. package/dist/cjs/naylence/fame/security/cert/trust-store/http-bundle-provider.js +411 -0
  34. package/dist/cjs/naylence/fame/security/cert/trust-store/http-bundle-provider.js.map +1 -0
  35. package/dist/cjs/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js +2 -0
  36. package/dist/cjs/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js.map +1 -0
  37. package/dist/cjs/naylence/fame/security/cert/trust-store/static-bundle-provider.js +37 -0
  38. package/dist/cjs/naylence/fame/security/cert/trust-store/static-bundle-provider.js.map +1 -0
  39. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider.js +2 -0
  40. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider.js.map +1 -0
  41. package/dist/cjs/naylence/fame/security/cert/util.js +1 -2
  42. package/dist/cjs/naylence/fame/security/cert/util.js.map +1 -1
  43. package/dist/cjs/version.js +2 -2
  44. package/dist/esm/browser.js +1 -0
  45. package/dist/esm/browser.js.map +1 -1
  46. package/dist/esm/naylence/fame/factory-manifest.js +14 -0
  47. package/dist/esm/naylence/fame/factory-manifest.js.map +1 -1
  48. package/dist/esm/naylence/fame/security/cert/browser-csr.js +103 -0
  49. package/dist/esm/naylence/fame/security/cert/browser-csr.js.map +1 -0
  50. package/dist/esm/naylence/fame/security/cert/ca-server.js +35 -0
  51. package/dist/esm/naylence/fame/security/cert/ca-server.js.map +1 -1
  52. package/dist/esm/naylence/fame/security/cert/ca-service-client.js +331 -24
  53. package/dist/esm/naylence/fame/security/cert/ca-service-client.js.map +1 -1
  54. package/dist/esm/naylence/fame/security/cert/ca-types.js +8 -0
  55. package/dist/esm/naylence/fame/security/cert/ca-types.js.map +1 -1
  56. package/dist/esm/naylence/fame/security/cert/csr-types.js +2 -0
  57. package/dist/esm/naylence/fame/security/cert/csr-types.js.map +1 -0
  58. package/dist/esm/naylence/fame/security/cert/default-ca-service.js +102 -1
  59. package/dist/esm/naylence/fame/security/cert/default-ca-service.js.map +1 -1
  60. package/dist/esm/naylence/fame/security/cert/default-certificate-manager.js +240 -45
  61. package/dist/esm/naylence/fame/security/cert/default-certificate-manager.js.map +1 -1
  62. package/dist/esm/naylence/fame/security/cert/index.js +4 -1
  63. package/dist/esm/naylence/fame/security/cert/index.js.map +1 -1
  64. package/dist/esm/naylence/fame/security/cert/internal-ca-service.js +2 -5
  65. package/dist/esm/naylence/fame/security/cert/internal-ca-service.js.map +1 -1
  66. package/dist/esm/naylence/fame/security/cert/node-ed25519-csr.js +156 -0
  67. package/dist/esm/naylence/fame/security/cert/node-ed25519-csr.js.map +1 -0
  68. package/dist/esm/naylence/fame/security/cert/oid-constants.js +7 -0
  69. package/dist/esm/naylence/fame/security/cert/oid-constants.js.map +1 -0
  70. package/dist/esm/naylence/fame/security/cert/trust-store/anchor-utils.js +119 -0
  71. package/dist/esm/naylence/fame/security/cert/trust-store/anchor-utils.js.map +1 -0
  72. package/dist/esm/naylence/fame/security/cert/trust-store/env-provider.js +123 -0
  73. package/dist/esm/naylence/fame/security/cert/trust-store/env-provider.js.map +1 -0
  74. package/dist/esm/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js +220 -0
  75. package/dist/esm/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js.map +1 -0
  76. package/dist/esm/naylence/fame/security/cert/trust-store/http-bundle-provider.js +411 -0
  77. package/dist/esm/naylence/fame/security/cert/trust-store/http-bundle-provider.js.map +1 -0
  78. package/dist/esm/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js +2 -0
  79. package/dist/esm/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js.map +1 -0
  80. package/dist/esm/naylence/fame/security/cert/trust-store/static-bundle-provider.js +37 -0
  81. package/dist/esm/naylence/fame/security/cert/trust-store/static-bundle-provider.js.map +1 -0
  82. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider.js +2 -0
  83. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider.js.map +1 -0
  84. package/dist/esm/naylence/fame/security/cert/util.js +1 -2
  85. package/dist/esm/naylence/fame/security/cert/util.js.map +1 -1
  86. package/dist/esm/version.js +2 -2
  87. package/dist/types/browser.d.ts +2 -0
  88. package/dist/types/browser.d.ts.map +1 -1
  89. package/dist/types/naylence/fame/factory-manifest.d.ts +2 -0
  90. package/dist/types/naylence/fame/factory-manifest.d.ts.map +1 -1
  91. package/dist/types/naylence/fame/security/cert/browser-csr.d.ts +9 -0
  92. package/dist/types/naylence/fame/security/cert/browser-csr.d.ts.map +1 -0
  93. package/dist/types/naylence/fame/security/cert/ca-server.d.ts.map +1 -1
  94. package/dist/types/naylence/fame/security/cert/ca-service-client.d.ts.map +1 -1
  95. package/dist/types/naylence/fame/security/cert/ca-types.d.ts +32 -0
  96. package/dist/types/naylence/fame/security/cert/ca-types.d.ts.map +1 -1
  97. package/dist/types/naylence/fame/security/cert/csr-types.d.ts +5 -0
  98. package/dist/types/naylence/fame/security/cert/csr-types.d.ts.map +1 -0
  99. package/dist/types/naylence/fame/security/cert/default-ca-service.d.ts +2 -1
  100. package/dist/types/naylence/fame/security/cert/default-ca-service.d.ts.map +1 -1
  101. package/dist/types/naylence/fame/security/cert/default-certificate-manager.d.ts +33 -1
  102. package/dist/types/naylence/fame/security/cert/default-certificate-manager.d.ts.map +1 -1
  103. package/dist/types/naylence/fame/security/cert/index.d.ts +5 -1
  104. package/dist/types/naylence/fame/security/cert/index.d.ts.map +1 -1
  105. package/dist/types/naylence/fame/security/cert/internal-ca-service.d.ts +0 -3
  106. package/dist/types/naylence/fame/security/cert/internal-ca-service.d.ts.map +1 -1
  107. package/dist/types/naylence/fame/security/cert/node-ed25519-csr.d.ts +9 -0
  108. package/dist/types/naylence/fame/security/cert/node-ed25519-csr.d.ts.map +1 -0
  109. package/dist/types/naylence/fame/security/cert/oid-constants.d.ts +7 -0
  110. package/dist/types/naylence/fame/security/cert/oid-constants.d.ts.map +1 -0
  111. package/dist/types/naylence/fame/security/cert/trust-store/anchor-utils.d.ts +12 -0
  112. package/dist/types/naylence/fame/security/cert/trust-store/anchor-utils.d.ts.map +1 -0
  113. package/dist/types/naylence/fame/security/cert/trust-store/env-provider.d.ts +7 -0
  114. package/dist/types/naylence/fame/security/cert/trust-store/env-provider.d.ts.map +1 -0
  115. package/dist/types/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.d.ts +9 -0
  116. package/dist/types/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.d.ts.map +1 -0
  117. package/dist/types/naylence/fame/security/cert/trust-store/http-bundle-provider.d.ts +31 -0
  118. package/dist/types/naylence/fame/security/cert/trust-store/http-bundle-provider.d.ts.map +1 -0
  119. package/dist/types/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.d.ts +2 -0
  120. package/dist/types/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.d.ts.map +1 -0
  121. package/dist/types/naylence/fame/security/cert/trust-store/static-bundle-provider.d.ts +13 -0
  122. package/dist/types/naylence/fame/security/cert/trust-store/static-bundle-provider.d.ts.map +1 -0
  123. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider.d.ts +37 -0
  124. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider.d.ts.map +1 -0
  125. package/dist/types/naylence/fame/security/cert/util.d.ts.map +1 -1
  126. package/dist/types/version.d.ts +1 -1
  127. package/package.json +8 -5
@@ -0,0 +1,123 @@
1
+ import { HttpBundleProvider } from "./http-bundle-provider.js";
2
+ import { parseFameCaCerts } from "./fame-ca-certs-parser.js";
3
+ import { createProviderFromDataUri, createProviderFromPem, loadPemFromFile, } from "./static-bundle-provider.js";
4
+ export async function createTrustStoreProviderFromEnv(options = {}) {
5
+ const env = resolveEnv(options.env);
6
+ const rawSources = envValue(env, "FAME_CA_CERTS");
7
+ const hashPins = envValue(env, "FAME_CA_BUNDLE_SHA256");
8
+ const allowedSpkis = envValue(env, "FAME_CA_ALLOWED_ROOT_SPKIS");
9
+ const allowTofuRaw = envValue(env, "FAME_CA_ALLOW_TOFU");
10
+ const refreshIntervalRaw = envValue(env, "FAME_CA_REFRESH_INTERVAL_MS");
11
+ const sources = parseFameCaCerts(rawSources, {
12
+ hashPins,
13
+ allowedSpkis,
14
+ allowTofu: toScalar(allowTofuRaw),
15
+ refreshIntervalMs: toScalar(refreshIntervalRaw),
16
+ });
17
+ if (sources.length === 0) {
18
+ return null;
19
+ }
20
+ const providers = await Promise.all(sources.map((source) => buildProviderForSource(source, options)));
21
+ if (providers.length === 1) {
22
+ return providers[0];
23
+ }
24
+ return new CompositeTrustStoreProvider(providers);
25
+ }
26
+ class CompositeTrustStoreProvider {
27
+ constructor(providers) {
28
+ this.providers = providers;
29
+ }
30
+ async getRoots() {
31
+ const rootsLists = await Promise.all(this.providers.map((provider) => provider.getRoots()));
32
+ return rootsLists.flat();
33
+ }
34
+ onUpdate(callback) {
35
+ const unsubscribers = this.providers
36
+ .map((provider) => provider.onUpdate?.(callback) ?? null)
37
+ .filter((fn) => typeof fn === "function");
38
+ return () => {
39
+ for (const unsubscribe of unsubscribers) {
40
+ try {
41
+ unsubscribe();
42
+ }
43
+ catch {
44
+ // Swallow cleanup errors
45
+ }
46
+ }
47
+ };
48
+ }
49
+ }
50
+ async function buildProviderForSource(source, options) {
51
+ switch (source.type) {
52
+ case "INLINE_PEM":
53
+ return buildInlinePemProvider(source);
54
+ case "DATA_PEM":
55
+ return buildDataUriProvider(source);
56
+ case "FILE":
57
+ return buildFileProvider(source);
58
+ case "HTTPS_BUNDLE":
59
+ return buildHttpProvider(source, options);
60
+ default:
61
+ throw new Error(`Unsupported trust bundle source: ${source.type ?? "unknown"}`);
62
+ }
63
+ }
64
+ function buildInlinePemProvider(source) {
65
+ return createProviderFromPem(source.pem);
66
+ }
67
+ function buildDataUriProvider(source) {
68
+ return createProviderFromDataUri(source.dataUri);
69
+ }
70
+ async function buildFileProvider(source) {
71
+ const pem = await loadPemFromFile(source.path);
72
+ return createProviderFromPem(pem);
73
+ }
74
+ function buildHttpProvider(source, options) {
75
+ return new HttpBundleProvider({
76
+ url: source.url,
77
+ hashPins: source.hashPins,
78
+ allowedSpkis: source.allowedSpkis,
79
+ allowTofu: source.allowTofu,
80
+ refreshIntervalMs: source.refreshIntervalMs,
81
+ enforcePinsInBrowser: options.requirePinsInBrowser !== false,
82
+ });
83
+ }
84
+ function resolveEnv(fallback) {
85
+ if (fallback && typeof fallback === "object") {
86
+ return fallback;
87
+ }
88
+ if (isNodeEnvironment() && typeof process !== "undefined") {
89
+ return process.env;
90
+ }
91
+ if (typeof globalThis === "object" && globalThis) {
92
+ const scoped = globalThis;
93
+ if (scoped.__ENV__ && typeof scoped.__ENV__ === "object") {
94
+ return scoped.__ENV__;
95
+ }
96
+ if (scoped.env && typeof scoped.env === "object") {
97
+ return scoped.env;
98
+ }
99
+ }
100
+ return {};
101
+ }
102
+ function envValue(env, key) {
103
+ const direct = env[key];
104
+ if (typeof direct === "string" || Array.isArray(direct)) {
105
+ return direct;
106
+ }
107
+ if (typeof process !== "undefined" && process.env?.[key]) {
108
+ return process.env[key];
109
+ }
110
+ return null;
111
+ }
112
+ function toScalar(value) {
113
+ if (Array.isArray(value)) {
114
+ return value.length > 0 ? value[value.length - 1] ?? null : null;
115
+ }
116
+ return value;
117
+ }
118
+ function isNodeEnvironment() {
119
+ return (typeof process !== "undefined" &&
120
+ typeof process.versions !== "undefined" &&
121
+ typeof process.versions.node === "string");
122
+ }
123
+ //# sourceMappingURL=env-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-provider.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/cert/trust-store/env-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ export function parseFameCaCerts(rawSources, options = {}) {
2
+ const entries = normalizeSourceEntries(rawSources);
3
+ if (entries.length === 0) {
4
+ return [];
5
+ }
6
+ const envPins = normalizeStringArray(options.hashPins);
7
+ const envSpkis = normalizeStringArray(options.allowedSpkis);
8
+ const envAllowTofu = parseBoolean(options.allowTofu);
9
+ const envRefreshMs = parseInteger(options.refreshIntervalMs);
10
+ const sources = [];
11
+ for (const entry of entries) {
12
+ if (entry.startsWith("data:")) {
13
+ sources.push({ type: "DATA_PEM", dataUri: entry });
14
+ continue;
15
+ }
16
+ if (entry.startsWith("http://")) {
17
+ throw new Error("FAME_CA_CERTS may not reference insecure HTTP URLs");
18
+ }
19
+ if (entry.startsWith("https://")) {
20
+ const { source, pins } = buildHttpsSource(entry, {
21
+ hashPins: envPins,
22
+ allowedSpkis: envSpkis,
23
+ allowTofu: envAllowTofu,
24
+ refreshIntervalMs: envRefreshMs,
25
+ });
26
+ sources.push({ ...source, ...pins });
27
+ continue;
28
+ }
29
+ if (entry.startsWith("file://")) {
30
+ sources.push({
31
+ type: "FILE",
32
+ path: extractFilePath(entry),
33
+ });
34
+ continue;
35
+ }
36
+ if (entry.includes("-----BEGIN")) {
37
+ sources.push({ type: "INLINE_PEM", pem: entry });
38
+ continue;
39
+ }
40
+ sources.push({ type: "FILE", path: entry });
41
+ }
42
+ return sources;
43
+ }
44
+ function normalizeSourceEntries(candidate) {
45
+ if (!candidate) {
46
+ return [];
47
+ }
48
+ if (Array.isArray(candidate)) {
49
+ return candidate
50
+ .map((value) => (typeof value === "string" ? value.trim() : ""))
51
+ .filter((value) => value.length > 0);
52
+ }
53
+ if (typeof candidate === "string") {
54
+ const trimmed = candidate.trim();
55
+ if (!trimmed) {
56
+ return [];
57
+ }
58
+ if (trimmed.startsWith("[")) {
59
+ try {
60
+ const parsed = JSON.parse(trimmed);
61
+ if (Array.isArray(parsed)) {
62
+ return parsed
63
+ .map((value) => (typeof value === "string" ? value.trim() : ""))
64
+ .filter((value) => value.length > 0);
65
+ }
66
+ }
67
+ catch {
68
+ // fall through to delimiter parsing
69
+ }
70
+ }
71
+ if (trimmed.startsWith("data:")) {
72
+ return [trimmed];
73
+ }
74
+ if (trimmed.includes("\n")) {
75
+ return trimmed
76
+ .split(/\s*\n+\s*/u)
77
+ .map((value) => value.trim())
78
+ .filter((value) => value.length > 0);
79
+ }
80
+ return trimmed
81
+ .split(/\s*,\s*/u)
82
+ .map((value) => value.trim())
83
+ .filter((value) => value.length > 0);
84
+ }
85
+ return [];
86
+ }
87
+ function buildHttpsSource(value, defaults) {
88
+ const url = new URL(value);
89
+ if (url.protocol !== "https:") {
90
+ throw new Error("HTTPS trust bundle URL must use https://");
91
+ }
92
+ const queryPins = extractPinsFromQuery(url);
93
+ const hashPins = mergeUnique(defaults.hashPins ?? [], queryPins.hashPins ?? []);
94
+ const allowedSpkis = mergeUnique(defaults.allowedSpkis ?? [], queryPins.allowedSpkis ?? []);
95
+ const allowTofu = queryPins.allowTofu ?? defaults.allowTofu ?? undefined;
96
+ const refreshIntervalMs = queryPins.refreshIntervalMs ?? defaults.refreshIntervalMs ?? undefined;
97
+ const source = {
98
+ type: "HTTPS_BUNDLE",
99
+ url: url.toString(),
100
+ };
101
+ return {
102
+ source,
103
+ pins: {
104
+ hashPins: hashPins.length > 0 ? hashPins : undefined,
105
+ allowedSpkis: allowedSpkis.length > 0 ? allowedSpkis : undefined,
106
+ allowTofu,
107
+ refreshIntervalMs,
108
+ },
109
+ };
110
+ }
111
+ function extractPinsFromQuery(url) {
112
+ const hashPins = [];
113
+ const hashKeys = ["sha256", "hash", "bundle_sha256", "pin", "pins"];
114
+ for (const key of hashKeys) {
115
+ const values = url.searchParams.getAll(key);
116
+ for (const value of values) {
117
+ if (value) {
118
+ hashPins.push(value.trim());
119
+ }
120
+ }
121
+ }
122
+ const allowedSpkis = [];
123
+ const spkiKeys = ["spki", "allowed_spki", "allowed_spkis"];
124
+ for (const key of spkiKeys) {
125
+ const values = url.searchParams.getAll(key);
126
+ for (const value of values) {
127
+ if (value) {
128
+ allowedSpkis.push(value.trim());
129
+ }
130
+ }
131
+ }
132
+ let allowTofu;
133
+ const tofuParam = url.searchParams.get("tofu") ?? url.searchParams.get("allow_tofu");
134
+ if (tofuParam !== null) {
135
+ allowTofu = parseBoolean(tofuParam);
136
+ }
137
+ let refreshIntervalMs;
138
+ const refreshParam = url.searchParams.get("refresh") ?? url.searchParams.get("interval");
139
+ if (refreshParam !== null) {
140
+ const parsed = parseInteger(refreshParam);
141
+ if (typeof parsed === "number" && parsed > 0) {
142
+ refreshIntervalMs = parsed;
143
+ }
144
+ }
145
+ return {
146
+ hashPins: hashPins.length > 0 ? hashPins : undefined,
147
+ allowedSpkis: allowedSpkis.length > 0 ? allowedSpkis : undefined,
148
+ allowTofu,
149
+ refreshIntervalMs,
150
+ };
151
+ }
152
+ function extractFilePath(uri) {
153
+ try {
154
+ const url = new URL(uri);
155
+ if (url.protocol !== "file:") {
156
+ return uri;
157
+ }
158
+ return url.pathname;
159
+ }
160
+ catch {
161
+ return uri;
162
+ }
163
+ }
164
+ function normalizeStringArray(input) {
165
+ if (!input) {
166
+ return [];
167
+ }
168
+ if (Array.isArray(input)) {
169
+ return input.map((value) => value.trim()).filter((value) => value.length > 0);
170
+ }
171
+ if (typeof input === "string") {
172
+ return input
173
+ .split(/\s*,\s*/u)
174
+ .map((value) => value.trim())
175
+ .filter((value) => value.length > 0);
176
+ }
177
+ return [];
178
+ }
179
+ function parseBoolean(value) {
180
+ if (typeof value === "boolean") {
181
+ return value;
182
+ }
183
+ if (typeof value === "string") {
184
+ const normalized = value.trim().toLowerCase();
185
+ if (normalized === "true" || normalized === "1") {
186
+ return true;
187
+ }
188
+ if (normalized === "false" || normalized === "0") {
189
+ return false;
190
+ }
191
+ }
192
+ return undefined;
193
+ }
194
+ function parseInteger(value) {
195
+ if (typeof value === "number" && Number.isFinite(value)) {
196
+ return value;
197
+ }
198
+ if (typeof value === "string") {
199
+ const parsed = Number.parseInt(value, 10);
200
+ if (Number.isFinite(parsed)) {
201
+ return parsed;
202
+ }
203
+ }
204
+ return undefined;
205
+ }
206
+ function mergeUnique(left, right) {
207
+ const set = new Set();
208
+ for (const value of left) {
209
+ if (value) {
210
+ set.add(value);
211
+ }
212
+ }
213
+ for (const value of right) {
214
+ if (value) {
215
+ set.add(value);
216
+ }
217
+ }
218
+ return Array.from(set);
219
+ }
220
+ //# sourceMappingURL=fame-ca-certs-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fame-ca-certs-parser.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.ts"],"names":[],"mappings":"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"}