@parsrun/core 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/README.md +113 -0
- package/dist/decimal.d.ts +190 -0
- package/dist/decimal.js +347 -0
- package/dist/decimal.js.map +1 -0
- package/dist/env.d.ts +101 -0
- package/dist/env.js +172 -0
- package/dist/env.js.map +1 -0
- package/dist/error-codes.d.ts +257 -0
- package/dist/error-codes.js +261 -0
- package/dist/error-codes.js.map +1 -0
- package/dist/errors.d.ts +81 -0
- package/dist/errors.js +161 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +116 -0
- package/dist/index.js +1987 -0
- package/dist/index.js.map +1 -0
- package/dist/logger-aEibH9Mv.d.ts +262 -0
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +327 -0
- package/dist/logger.js.map +1 -0
- package/dist/runtime.d.ts +62 -0
- package/dist/runtime.js +88 -0
- package/dist/runtime.js.map +1 -0
- package/dist/transports/index.d.ts +347 -0
- package/dist/transports/index.js +657 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @parsrun/core - Environment Variables
|
|
3
|
+
* Runtime-agnostic environment variable access
|
|
4
|
+
* Works in Node.js, Deno, Bun, and Cloudflare Workers
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Set environment variables for edge runtimes (Cloudflare Workers, etc.)
|
|
8
|
+
* Call this from your worker's fetch handler with the env parameter
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* export default {
|
|
13
|
+
* async fetch(request, env) {
|
|
14
|
+
* setEdgeEnv(env);
|
|
15
|
+
* // ... rest of handler
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
declare function setEdgeEnv(env: Record<string, string | undefined>): void;
|
|
21
|
+
/**
|
|
22
|
+
* Clear edge environment store
|
|
23
|
+
*/
|
|
24
|
+
declare function clearEdgeEnv(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get an environment variable value
|
|
27
|
+
* Works across all runtimes
|
|
28
|
+
*/
|
|
29
|
+
declare function getEnv(key: string, defaultValue?: string): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Get an environment variable, throwing if not found
|
|
32
|
+
*/
|
|
33
|
+
declare function requireEnv(key: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Get an environment variable as a number
|
|
36
|
+
*/
|
|
37
|
+
declare function getEnvNumber(key: string, defaultValue?: number): number | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Get an environment variable as a float
|
|
40
|
+
*/
|
|
41
|
+
declare function getEnvFloat(key: string, defaultValue?: number): number | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Get an environment variable as a boolean
|
|
44
|
+
*/
|
|
45
|
+
declare function getEnvBoolean(key: string, defaultValue?: boolean): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Get an environment variable as an array (comma-separated)
|
|
48
|
+
*/
|
|
49
|
+
declare function getEnvArray(key: string, defaultValue?: string[]): string[];
|
|
50
|
+
/**
|
|
51
|
+
* Get an environment variable as JSON
|
|
52
|
+
*/
|
|
53
|
+
declare function getEnvJson<T>(key: string, defaultValue?: T): T | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Check if running in development mode
|
|
56
|
+
*/
|
|
57
|
+
declare function isDevelopment(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Check if running in production mode
|
|
60
|
+
*/
|
|
61
|
+
declare function isProduction(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Check if running in test mode
|
|
64
|
+
*/
|
|
65
|
+
declare function isTest(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Environment mode
|
|
68
|
+
*/
|
|
69
|
+
type EnvMode = "development" | "production" | "test";
|
|
70
|
+
/**
|
|
71
|
+
* Get current environment mode
|
|
72
|
+
*/
|
|
73
|
+
declare function getEnvMode(): EnvMode;
|
|
74
|
+
/**
|
|
75
|
+
* Create a typed environment configuration object
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const env = createEnvConfig({
|
|
80
|
+
* DATABASE_URL: { required: true },
|
|
81
|
+
* PORT: { type: 'number', default: 3000 },
|
|
82
|
+
* DEBUG: { type: 'boolean', default: false },
|
|
83
|
+
* });
|
|
84
|
+
*
|
|
85
|
+
* env.DATABASE_URL // string
|
|
86
|
+
* env.PORT // number
|
|
87
|
+
* env.DEBUG // boolean
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
declare function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T>;
|
|
91
|
+
type EnvConfigItem = {
|
|
92
|
+
type?: "string" | "number" | "boolean" | "array" | "json";
|
|
93
|
+
required?: boolean;
|
|
94
|
+
default?: unknown;
|
|
95
|
+
};
|
|
96
|
+
type EnvSchema = Record<string, EnvConfigItem>;
|
|
97
|
+
type EnvResult<T extends EnvSchema> = {
|
|
98
|
+
[K in keyof T]: T[K]["type"] extends "number" ? number : T[K]["type"] extends "boolean" ? boolean : T[K]["type"] extends "array" ? string[] : T[K]["type"] extends "json" ? unknown : string;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export { type EnvMode, clearEdgeEnv, createEnvConfig, getEnv, getEnvArray, getEnvBoolean, getEnvFloat, getEnvJson, getEnvMode, getEnvNumber, isDevelopment, isProduction, isTest, requireEnv, setEdgeEnv };
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// src/runtime.ts
|
|
2
|
+
function detectRuntime() {
|
|
3
|
+
if (typeof globalThis !== "undefined" && "Bun" in globalThis) {
|
|
4
|
+
return "bun";
|
|
5
|
+
}
|
|
6
|
+
if (typeof globalThis !== "undefined" && "Deno" in globalThis) {
|
|
7
|
+
return "deno";
|
|
8
|
+
}
|
|
9
|
+
if (typeof globalThis !== "undefined" && typeof globalThis.caches !== "undefined" && typeof globalThis.process === "undefined") {
|
|
10
|
+
return "cloudflare";
|
|
11
|
+
}
|
|
12
|
+
if (typeof globalThis !== "undefined" && typeof globalThis.EdgeRuntime !== "undefined") {
|
|
13
|
+
return "edge";
|
|
14
|
+
}
|
|
15
|
+
if (typeof globalThis !== "undefined" && typeof globalThis.window !== "undefined" && typeof globalThis.document !== "undefined") {
|
|
16
|
+
return "browser";
|
|
17
|
+
}
|
|
18
|
+
if (typeof process !== "undefined" && process.versions && process.versions.node) {
|
|
19
|
+
return "node";
|
|
20
|
+
}
|
|
21
|
+
return "unknown";
|
|
22
|
+
}
|
|
23
|
+
var runtime = detectRuntime();
|
|
24
|
+
var runtimeInfo = {
|
|
25
|
+
runtime,
|
|
26
|
+
isNode: runtime === "node",
|
|
27
|
+
isDeno: runtime === "deno",
|
|
28
|
+
isBun: runtime === "bun",
|
|
29
|
+
isCloudflare: runtime === "cloudflare",
|
|
30
|
+
isEdge: runtime === "cloudflare" || runtime === "edge" || runtime === "deno",
|
|
31
|
+
isBrowser: runtime === "browser",
|
|
32
|
+
isServer: runtime !== "browser",
|
|
33
|
+
supportsWebCrypto: typeof globalThis.crypto?.subtle !== "undefined",
|
|
34
|
+
supportsStreams: typeof globalThis.ReadableStream !== "undefined"
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// src/env.ts
|
|
38
|
+
var edgeEnvStore = {};
|
|
39
|
+
function setEdgeEnv(env) {
|
|
40
|
+
edgeEnvStore = { ...edgeEnvStore, ...env };
|
|
41
|
+
}
|
|
42
|
+
function clearEdgeEnv() {
|
|
43
|
+
edgeEnvStore = {};
|
|
44
|
+
}
|
|
45
|
+
function getEnv(key, defaultValue) {
|
|
46
|
+
if (runtime === "cloudflare" || runtime === "edge") {
|
|
47
|
+
return edgeEnvStore[key] ?? defaultValue;
|
|
48
|
+
}
|
|
49
|
+
if (runtime === "deno") {
|
|
50
|
+
try {
|
|
51
|
+
return globalThis.Deno.env.get(key) ?? defaultValue;
|
|
52
|
+
} catch {
|
|
53
|
+
return defaultValue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (typeof process !== "undefined" && process.env) {
|
|
57
|
+
return process.env[key] ?? defaultValue;
|
|
58
|
+
}
|
|
59
|
+
if (runtime === "browser" && typeof globalThis.__ENV__ !== "undefined") {
|
|
60
|
+
return globalThis.__ENV__[key] ?? defaultValue;
|
|
61
|
+
}
|
|
62
|
+
return defaultValue;
|
|
63
|
+
}
|
|
64
|
+
function requireEnv(key) {
|
|
65
|
+
const value = getEnv(key);
|
|
66
|
+
if (value === void 0 || value === "") {
|
|
67
|
+
throw new Error(`Required environment variable "${key}" is not set`);
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
function getEnvNumber(key, defaultValue) {
|
|
72
|
+
const value = getEnv(key);
|
|
73
|
+
if (value === void 0 || value === "") {
|
|
74
|
+
return defaultValue;
|
|
75
|
+
}
|
|
76
|
+
const parsed = parseInt(value, 10);
|
|
77
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
78
|
+
}
|
|
79
|
+
function getEnvFloat(key, defaultValue) {
|
|
80
|
+
const value = getEnv(key);
|
|
81
|
+
if (value === void 0 || value === "") {
|
|
82
|
+
return defaultValue;
|
|
83
|
+
}
|
|
84
|
+
const parsed = parseFloat(value);
|
|
85
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
86
|
+
}
|
|
87
|
+
function getEnvBoolean(key, defaultValue = false) {
|
|
88
|
+
const value = getEnv(key);
|
|
89
|
+
if (value === void 0 || value === "") {
|
|
90
|
+
return defaultValue;
|
|
91
|
+
}
|
|
92
|
+
return value === "true" || value === "1" || value === "yes";
|
|
93
|
+
}
|
|
94
|
+
function getEnvArray(key, defaultValue = []) {
|
|
95
|
+
const value = getEnv(key);
|
|
96
|
+
if (value === void 0 || value === "") {
|
|
97
|
+
return defaultValue;
|
|
98
|
+
}
|
|
99
|
+
return value.split(",").map((s) => s.trim()).filter(Boolean);
|
|
100
|
+
}
|
|
101
|
+
function getEnvJson(key, defaultValue) {
|
|
102
|
+
const value = getEnv(key);
|
|
103
|
+
if (value === void 0 || value === "") {
|
|
104
|
+
return defaultValue;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
return JSON.parse(value);
|
|
108
|
+
} catch {
|
|
109
|
+
return defaultValue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function isDevelopment() {
|
|
113
|
+
const env = getEnv("NODE_ENV");
|
|
114
|
+
return env === "development" || env === void 0;
|
|
115
|
+
}
|
|
116
|
+
function isProduction() {
|
|
117
|
+
return getEnv("NODE_ENV") === "production";
|
|
118
|
+
}
|
|
119
|
+
function isTest() {
|
|
120
|
+
return getEnv("NODE_ENV") === "test";
|
|
121
|
+
}
|
|
122
|
+
function getEnvMode() {
|
|
123
|
+
const env = getEnv("NODE_ENV");
|
|
124
|
+
if (env === "production") return "production";
|
|
125
|
+
if (env === "test") return "test";
|
|
126
|
+
return "development";
|
|
127
|
+
}
|
|
128
|
+
function createEnvConfig(schema) {
|
|
129
|
+
const result = {};
|
|
130
|
+
for (const [key, config] of Object.entries(schema)) {
|
|
131
|
+
const envConfig = config;
|
|
132
|
+
let value;
|
|
133
|
+
switch (envConfig.type) {
|
|
134
|
+
case "number":
|
|
135
|
+
value = getEnvNumber(key, envConfig.default);
|
|
136
|
+
break;
|
|
137
|
+
case "boolean":
|
|
138
|
+
value = getEnvBoolean(key, envConfig.default);
|
|
139
|
+
break;
|
|
140
|
+
case "array":
|
|
141
|
+
value = getEnvArray(key, envConfig.default);
|
|
142
|
+
break;
|
|
143
|
+
case "json":
|
|
144
|
+
value = getEnvJson(key, envConfig.default);
|
|
145
|
+
break;
|
|
146
|
+
default:
|
|
147
|
+
value = getEnv(key, envConfig.default);
|
|
148
|
+
}
|
|
149
|
+
if (envConfig.required && (value === void 0 || value === "")) {
|
|
150
|
+
throw new Error(`Required environment variable "${key}" is not set`);
|
|
151
|
+
}
|
|
152
|
+
result[key] = value;
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
export {
|
|
157
|
+
clearEdgeEnv,
|
|
158
|
+
createEnvConfig,
|
|
159
|
+
getEnv,
|
|
160
|
+
getEnvArray,
|
|
161
|
+
getEnvBoolean,
|
|
162
|
+
getEnvFloat,
|
|
163
|
+
getEnvJson,
|
|
164
|
+
getEnvMode,
|
|
165
|
+
getEnvNumber,
|
|
166
|
+
isDevelopment,
|
|
167
|
+
isProduction,
|
|
168
|
+
isTest,
|
|
169
|
+
requireEnv,
|
|
170
|
+
setEdgeEnv
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts","../src/env.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process.versions.node}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @parsrun/core - Error Code Catalog
|
|
3
|
+
* Centralized error code definitions for the entire framework
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Error category for grouping and filtering
|
|
7
|
+
*/
|
|
8
|
+
type ErrorCategory = "auth" | "tenant" | "validation" | "resource" | "rate_limit" | "server" | "database" | "external";
|
|
9
|
+
/**
|
|
10
|
+
* Error code definition
|
|
11
|
+
*/
|
|
12
|
+
interface ErrorCodeDefinition {
|
|
13
|
+
readonly code: string;
|
|
14
|
+
readonly status: number;
|
|
15
|
+
readonly category: ErrorCategory;
|
|
16
|
+
readonly retryable?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Centralized error code catalog
|
|
20
|
+
* All error codes used throughout the framework are defined here
|
|
21
|
+
*/
|
|
22
|
+
declare const ErrorCodes: {
|
|
23
|
+
readonly AUTH_ERROR: {
|
|
24
|
+
readonly code: "AUTH_ERROR";
|
|
25
|
+
readonly status: 401;
|
|
26
|
+
readonly category: "auth";
|
|
27
|
+
};
|
|
28
|
+
readonly UNAUTHORIZED: {
|
|
29
|
+
readonly code: "UNAUTHORIZED";
|
|
30
|
+
readonly status: 401;
|
|
31
|
+
readonly category: "auth";
|
|
32
|
+
};
|
|
33
|
+
readonly FORBIDDEN: {
|
|
34
|
+
readonly code: "FORBIDDEN";
|
|
35
|
+
readonly status: 403;
|
|
36
|
+
readonly category: "auth";
|
|
37
|
+
};
|
|
38
|
+
readonly INVALID_CREDENTIALS: {
|
|
39
|
+
readonly code: "INVALID_CREDENTIALS";
|
|
40
|
+
readonly status: 401;
|
|
41
|
+
readonly category: "auth";
|
|
42
|
+
};
|
|
43
|
+
readonly SESSION_EXPIRED: {
|
|
44
|
+
readonly code: "SESSION_EXPIRED";
|
|
45
|
+
readonly status: 401;
|
|
46
|
+
readonly category: "auth";
|
|
47
|
+
};
|
|
48
|
+
readonly TOKEN_EXPIRED: {
|
|
49
|
+
readonly code: "TOKEN_EXPIRED";
|
|
50
|
+
readonly status: 401;
|
|
51
|
+
readonly category: "auth";
|
|
52
|
+
};
|
|
53
|
+
readonly TOKEN_INVALID: {
|
|
54
|
+
readonly code: "TOKEN_INVALID";
|
|
55
|
+
readonly status: 401;
|
|
56
|
+
readonly category: "auth";
|
|
57
|
+
};
|
|
58
|
+
readonly TWO_FACTOR_REQUIRED: {
|
|
59
|
+
readonly code: "TWO_FACTOR_REQUIRED";
|
|
60
|
+
readonly status: 403;
|
|
61
|
+
readonly category: "auth";
|
|
62
|
+
};
|
|
63
|
+
readonly TWO_FACTOR_INVALID: {
|
|
64
|
+
readonly code: "TWO_FACTOR_INVALID";
|
|
65
|
+
readonly status: 401;
|
|
66
|
+
readonly category: "auth";
|
|
67
|
+
};
|
|
68
|
+
readonly ACCOUNT_LOCKED: {
|
|
69
|
+
readonly code: "ACCOUNT_LOCKED";
|
|
70
|
+
readonly status: 423;
|
|
71
|
+
readonly category: "auth";
|
|
72
|
+
};
|
|
73
|
+
readonly ACCOUNT_DISABLED: {
|
|
74
|
+
readonly code: "ACCOUNT_DISABLED";
|
|
75
|
+
readonly status: 403;
|
|
76
|
+
readonly category: "auth";
|
|
77
|
+
};
|
|
78
|
+
readonly PASSWORD_RESET_REQUIRED: {
|
|
79
|
+
readonly code: "PASSWORD_RESET_REQUIRED";
|
|
80
|
+
readonly status: 403;
|
|
81
|
+
readonly category: "auth";
|
|
82
|
+
};
|
|
83
|
+
readonly TENANT_ERROR: {
|
|
84
|
+
readonly code: "TENANT_ERROR";
|
|
85
|
+
readonly status: 400;
|
|
86
|
+
readonly category: "tenant";
|
|
87
|
+
};
|
|
88
|
+
readonly TENANT_NOT_FOUND: {
|
|
89
|
+
readonly code: "TENANT_NOT_FOUND";
|
|
90
|
+
readonly status: 404;
|
|
91
|
+
readonly category: "tenant";
|
|
92
|
+
};
|
|
93
|
+
readonly TENANT_SUSPENDED: {
|
|
94
|
+
readonly code: "TENANT_SUSPENDED";
|
|
95
|
+
readonly status: 403;
|
|
96
|
+
readonly category: "tenant";
|
|
97
|
+
};
|
|
98
|
+
readonly TENANT_LIMIT_EXCEEDED: {
|
|
99
|
+
readonly code: "TENANT_LIMIT_EXCEEDED";
|
|
100
|
+
readonly status: 403;
|
|
101
|
+
readonly category: "tenant";
|
|
102
|
+
};
|
|
103
|
+
readonly MEMBERSHIP_ERROR: {
|
|
104
|
+
readonly code: "MEMBERSHIP_ERROR";
|
|
105
|
+
readonly status: 400;
|
|
106
|
+
readonly category: "tenant";
|
|
107
|
+
};
|
|
108
|
+
readonly MEMBERSHIP_NOT_FOUND: {
|
|
109
|
+
readonly code: "MEMBERSHIP_NOT_FOUND";
|
|
110
|
+
readonly status: 404;
|
|
111
|
+
readonly category: "tenant";
|
|
112
|
+
};
|
|
113
|
+
readonly MEMBERSHIP_EXPIRED: {
|
|
114
|
+
readonly code: "MEMBERSHIP_EXPIRED";
|
|
115
|
+
readonly status: 403;
|
|
116
|
+
readonly category: "tenant";
|
|
117
|
+
};
|
|
118
|
+
readonly VALIDATION_ERROR: {
|
|
119
|
+
readonly code: "VALIDATION_ERROR";
|
|
120
|
+
readonly status: 400;
|
|
121
|
+
readonly category: "validation";
|
|
122
|
+
};
|
|
123
|
+
readonly BAD_REQUEST: {
|
|
124
|
+
readonly code: "BAD_REQUEST";
|
|
125
|
+
readonly status: 400;
|
|
126
|
+
readonly category: "validation";
|
|
127
|
+
};
|
|
128
|
+
readonly INVALID_INPUT: {
|
|
129
|
+
readonly code: "INVALID_INPUT";
|
|
130
|
+
readonly status: 422;
|
|
131
|
+
readonly category: "validation";
|
|
132
|
+
};
|
|
133
|
+
readonly MISSING_REQUIRED_FIELD: {
|
|
134
|
+
readonly code: "MISSING_REQUIRED_FIELD";
|
|
135
|
+
readonly status: 400;
|
|
136
|
+
readonly category: "validation";
|
|
137
|
+
};
|
|
138
|
+
readonly INVALID_FORMAT: {
|
|
139
|
+
readonly code: "INVALID_FORMAT";
|
|
140
|
+
readonly status: 400;
|
|
141
|
+
readonly category: "validation";
|
|
142
|
+
};
|
|
143
|
+
readonly NOT_FOUND: {
|
|
144
|
+
readonly code: "NOT_FOUND";
|
|
145
|
+
readonly status: 404;
|
|
146
|
+
readonly category: "resource";
|
|
147
|
+
};
|
|
148
|
+
readonly CONFLICT: {
|
|
149
|
+
readonly code: "CONFLICT";
|
|
150
|
+
readonly status: 409;
|
|
151
|
+
readonly category: "resource";
|
|
152
|
+
};
|
|
153
|
+
readonly DUPLICATE: {
|
|
154
|
+
readonly code: "DUPLICATE";
|
|
155
|
+
readonly status: 409;
|
|
156
|
+
readonly category: "resource";
|
|
157
|
+
};
|
|
158
|
+
readonly GONE: {
|
|
159
|
+
readonly code: "GONE";
|
|
160
|
+
readonly status: 410;
|
|
161
|
+
readonly category: "resource";
|
|
162
|
+
};
|
|
163
|
+
readonly RESOURCE_LOCKED: {
|
|
164
|
+
readonly code: "RESOURCE_LOCKED";
|
|
165
|
+
readonly status: 423;
|
|
166
|
+
readonly category: "resource";
|
|
167
|
+
};
|
|
168
|
+
readonly RATE_LIMIT_EXCEEDED: {
|
|
169
|
+
readonly code: "RATE_LIMIT_EXCEEDED";
|
|
170
|
+
readonly status: 429;
|
|
171
|
+
readonly category: "rate_limit";
|
|
172
|
+
readonly retryable: true;
|
|
173
|
+
};
|
|
174
|
+
readonly QUOTA_EXCEEDED: {
|
|
175
|
+
readonly code: "QUOTA_EXCEEDED";
|
|
176
|
+
readonly status: 429;
|
|
177
|
+
readonly category: "rate_limit";
|
|
178
|
+
};
|
|
179
|
+
readonly INTERNAL_ERROR: {
|
|
180
|
+
readonly code: "INTERNAL_ERROR";
|
|
181
|
+
readonly status: 500;
|
|
182
|
+
readonly category: "server";
|
|
183
|
+
};
|
|
184
|
+
readonly BAD_GATEWAY: {
|
|
185
|
+
readonly code: "BAD_GATEWAY";
|
|
186
|
+
readonly status: 502;
|
|
187
|
+
readonly category: "server";
|
|
188
|
+
readonly retryable: true;
|
|
189
|
+
};
|
|
190
|
+
readonly SERVICE_UNAVAILABLE: {
|
|
191
|
+
readonly code: "SERVICE_UNAVAILABLE";
|
|
192
|
+
readonly status: 503;
|
|
193
|
+
readonly category: "server";
|
|
194
|
+
readonly retryable: true;
|
|
195
|
+
};
|
|
196
|
+
readonly GATEWAY_TIMEOUT: {
|
|
197
|
+
readonly code: "GATEWAY_TIMEOUT";
|
|
198
|
+
readonly status: 504;
|
|
199
|
+
readonly category: "server";
|
|
200
|
+
readonly retryable: true;
|
|
201
|
+
};
|
|
202
|
+
readonly DATABASE_ERROR: {
|
|
203
|
+
readonly code: "DATABASE_ERROR";
|
|
204
|
+
readonly status: 500;
|
|
205
|
+
readonly category: "database";
|
|
206
|
+
};
|
|
207
|
+
readonly CONNECTION_ERROR: {
|
|
208
|
+
readonly code: "CONNECTION_ERROR";
|
|
209
|
+
readonly status: 503;
|
|
210
|
+
readonly category: "database";
|
|
211
|
+
readonly retryable: true;
|
|
212
|
+
};
|
|
213
|
+
readonly TRANSACTION_ERROR: {
|
|
214
|
+
readonly code: "TRANSACTION_ERROR";
|
|
215
|
+
readonly status: 500;
|
|
216
|
+
readonly category: "database";
|
|
217
|
+
};
|
|
218
|
+
readonly RLS_ERROR: {
|
|
219
|
+
readonly code: "RLS_ERROR";
|
|
220
|
+
readonly status: 500;
|
|
221
|
+
readonly category: "database";
|
|
222
|
+
};
|
|
223
|
+
readonly EXTERNAL_SERVICE_ERROR: {
|
|
224
|
+
readonly code: "EXTERNAL_SERVICE_ERROR";
|
|
225
|
+
readonly status: 502;
|
|
226
|
+
readonly category: "external";
|
|
227
|
+
readonly retryable: true;
|
|
228
|
+
};
|
|
229
|
+
readonly EXTERNAL_TIMEOUT: {
|
|
230
|
+
readonly code: "EXTERNAL_TIMEOUT";
|
|
231
|
+
readonly status: 504;
|
|
232
|
+
readonly category: "external";
|
|
233
|
+
readonly retryable: true;
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Error code type (union of all error code keys)
|
|
238
|
+
*/
|
|
239
|
+
type ErrorCode = keyof typeof ErrorCodes;
|
|
240
|
+
/**
|
|
241
|
+
* Get error code definition by code string
|
|
242
|
+
*/
|
|
243
|
+
declare function getErrorCode(code: string): ErrorCodeDefinition | undefined;
|
|
244
|
+
/**
|
|
245
|
+
* Get all error codes by category
|
|
246
|
+
*/
|
|
247
|
+
declare function getErrorCodesByCategory(category: ErrorCategory): ErrorCodeDefinition[];
|
|
248
|
+
/**
|
|
249
|
+
* Check if an error code is retryable
|
|
250
|
+
*/
|
|
251
|
+
declare function isRetryableError(code: string): boolean;
|
|
252
|
+
/**
|
|
253
|
+
* Get HTTP status for an error code
|
|
254
|
+
*/
|
|
255
|
+
declare function getStatusForCode(code: string): number;
|
|
256
|
+
|
|
257
|
+
export { type ErrorCategory, type ErrorCode, type ErrorCodeDefinition, ErrorCodes, getErrorCode, getErrorCodesByCategory, getStatusForCode, isRetryableError };
|