@geenius/tools 0.1.0 → 0.3.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/package.json +62 -3
- package/packages/convex/shared/README.md +1 -1
- package/packages/devtools/dist/index.d.ts +204 -0
- package/packages/devtools/dist/index.js +186 -0
- package/packages/devtools/dist/index.js.map +1 -0
- package/packages/devtools/react/README.md +1 -1
- package/packages/devtools/solidjs/README.md +1 -1
- package/packages/devtools/solidjs/dist/index.js +1830 -0
- package/packages/devtools/solidjs/dist/index.js.map +1 -0
- package/packages/env/dist/index.d.ts +151 -0
- package/packages/env/dist/index.js +93 -0
- package/packages/env/dist/index.js.map +1 -0
- package/packages/errors/dist/index.d.ts +177 -0
- package/packages/errors/dist/index.js +187 -0
- package/packages/errors/dist/index.js.map +1 -0
- package/packages/errors/react/README.md +1 -1
- package/packages/errors/solidjs/README.md +1 -1
- package/packages/logger/dist/index.d.ts +171 -0
- package/packages/logger/dist/index.js +216 -0
- package/packages/logger/dist/index.js.map +1 -0
- package/packages/logger/react/README.md +1 -1
- package/packages/logger/solidjs/README.md +1 -1
- package/packages/perf/dist/index.d.ts +168 -0
- package/packages/perf/dist/index.js +265 -0
- package/packages/perf/dist/index.js.map +1 -0
- package/packages/perf/react/README.md +1 -1
- package/packages/perf/solidjs/README.md +1 -1
- package/packages/shared/dist/index.d.ts +253 -0
- package/packages/shared/dist/index.js +278 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.env.example +0 -2
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.node-version +0 -1
- package/.nvmrc +0 -1
- package/.prettierrc +0 -7
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -26
- package/CONTRIBUTING.md +0 -69
- package/SECURITY.md +0 -18
- package/SUPPORT.md +0 -14
- package/packages/convex/shared/package.json +0 -42
- package/packages/convex/shared/src/audit/index.ts +0 -5
- package/packages/convex/shared/src/audit/presets.ts +0 -165
- package/packages/convex/shared/src/audit/schema.ts +0 -85
- package/packages/convex/shared/src/audit/write.ts +0 -102
- package/packages/convex/shared/src/extract.ts +0 -75
- package/packages/convex/shared/src/index.ts +0 -41
- package/packages/convex/shared/src/messages.ts +0 -45
- package/packages/convex/shared/src/security.ts +0 -112
- package/packages/convex/shared/src/throw.ts +0 -184
- package/packages/convex/shared/src/types.ts +0 -57
- package/packages/convex/shared/src/utils.ts +0 -58
- package/packages/convex/shared/tsconfig.json +0 -28
- package/packages/convex/shared/tsup.config.ts +0 -12
- package/packages/devtools/package.json +0 -27
- package/packages/devtools/react/package.json +0 -53
- package/packages/devtools/react/src/components/DesignPreview.tsx +0 -59
- package/packages/devtools/react/src/components/DesignSwitcherDropdown.tsx +0 -99
- package/packages/devtools/react/src/components/DevSidebar.tsx +0 -247
- package/packages/devtools/react/src/components/DevToolbar.tsx +0 -242
- package/packages/devtools/react/src/components/GitHubIssueDialog.tsx +0 -402
- package/packages/devtools/react/src/components/InspectorOverlay.tsx +0 -312
- package/packages/devtools/react/src/components/PageLoadWaterfall.tsx +0 -144
- package/packages/devtools/react/src/components/PerformancePanel.tsx +0 -330
- package/packages/devtools/react/src/context/DevModeContext.tsx +0 -226
- package/packages/devtools/react/src/context/PerformanceContext.tsx +0 -143
- package/packages/devtools/react/src/data/designs.ts +0 -13
- package/packages/devtools/react/src/hooks/useGitHubLabels.ts +0 -47
- package/packages/devtools/react/src/hooks/useVirtualList.ts +0 -124
- package/packages/devtools/react/src/index.ts +0 -77
- package/packages/devtools/react/src/panels/ConvexSpy.tsx +0 -130
- package/packages/devtools/react/src/panels/DatabaseSeeder.tsx +0 -116
- package/packages/devtools/react/src/panels/DevModePhase2.tsx +0 -191
- package/packages/devtools/react/src/panels/DevModePhase3.tsx +0 -234
- package/packages/devtools/react/src/panels/FeatureFlagsToggle.tsx +0 -104
- package/packages/devtools/react/src/panels/QuickRouteJump.tsx +0 -152
- package/packages/devtools/react/src/services/github-service.ts +0 -247
- package/packages/devtools/react/tsconfig.json +0 -31
- package/packages/devtools/react/tsup.config.ts +0 -18
- package/packages/devtools/solidjs/package.json +0 -49
- package/packages/devtools/solidjs/src/components/DesignPreview.tsx +0 -51
- package/packages/devtools/solidjs/src/components/DesignSwitcherDropdown.tsx +0 -95
- package/packages/devtools/solidjs/src/components/DevSidebar.tsx +0 -247
- package/packages/devtools/solidjs/src/components/DevToolbar.tsx +0 -242
- package/packages/devtools/solidjs/src/components/GitHubIssueDialog.tsx +0 -400
- package/packages/devtools/solidjs/src/components/InspectorOverlay.tsx +0 -311
- package/packages/devtools/solidjs/src/components/PageLoadWaterfall.tsx +0 -144
- package/packages/devtools/solidjs/src/components/PerformancePanel.tsx +0 -330
- package/packages/devtools/solidjs/src/context/DevModeContext.tsx +0 -216
- package/packages/devtools/solidjs/src/context/PerformanceContext.tsx +0 -135
- package/packages/devtools/solidjs/src/data/designs.ts +0 -13
- package/packages/devtools/solidjs/src/hooks/createGitHubLabels.ts +0 -47
- package/packages/devtools/solidjs/src/index.ts +0 -64
- package/packages/devtools/solidjs/src/services/github-service.ts +0 -247
- package/packages/devtools/solidjs/tsconfig.json +0 -21
- package/packages/devtools/src/index.ts +0 -377
- package/packages/devtools/tsup.config.ts +0 -12
- package/packages/env/package.json +0 -30
- package/packages/env/src/index.ts +0 -264
- package/packages/env/tsup.config.ts +0 -12
- package/packages/errors/package.json +0 -27
- package/packages/errors/react/package.json +0 -72
- package/packages/errors/react/src/analytics.ts +0 -16
- package/packages/errors/react/src/components/ErrorBoundary.tsx +0 -248
- package/packages/errors/react/src/components/ErrorDisplay.tsx +0 -328
- package/packages/errors/react/src/components/ValidationErrors.tsx +0 -102
- package/packages/errors/react/src/config.ts +0 -199
- package/packages/errors/react/src/constants.ts +0 -74
- package/packages/errors/react/src/hooks/useErrorBoundary.ts +0 -92
- package/packages/errors/react/src/hooks/useErrorHandler.ts +0 -87
- package/packages/errors/react/src/index.ts +0 -96
- package/packages/errors/react/src/types.ts +0 -102
- package/packages/errors/react/src/utils/errorMessages.ts +0 -35
- package/packages/errors/react/src/utils/errorPolicy.ts +0 -139
- package/packages/errors/react/src/utils/extractAppError.ts +0 -174
- package/packages/errors/react/src/utils/formatError.ts +0 -112
- package/packages/errors/react/tsconfig.json +0 -25
- package/packages/errors/react/tsup.config.ts +0 -24
- package/packages/errors/solidjs/package.json +0 -46
- package/packages/errors/solidjs/src/components/ErrorDisplay.tsx +0 -179
- package/packages/errors/solidjs/src/config.ts +0 -98
- package/packages/errors/solidjs/src/hooks/createErrorHandler.ts +0 -107
- package/packages/errors/solidjs/src/index.ts +0 -61
- package/packages/errors/solidjs/src/types.ts +0 -34
- package/packages/errors/solidjs/src/utils/errorPolicy.ts +0 -56
- package/packages/errors/solidjs/src/utils/extractAppError.ts +0 -94
- package/packages/errors/solidjs/src/utils/formatError.ts +0 -33
- package/packages/errors/solidjs/tsconfig.json +0 -26
- package/packages/errors/solidjs/tsup.config.ts +0 -21
- package/packages/errors/src/index.ts +0 -320
- package/packages/errors/tsup.config.ts +0 -12
- package/packages/logger/package.json +0 -27
- package/packages/logger/react/package.json +0 -46
- package/packages/logger/react/src/index.ts +0 -4
- package/packages/logger/react/src/useMetrics.ts +0 -42
- package/packages/logger/react/src/usePerformanceLog.ts +0 -61
- package/packages/logger/react/tsconfig.json +0 -31
- package/packages/logger/react/tsup.config.ts +0 -12
- package/packages/logger/solidjs/package.json +0 -45
- package/packages/logger/solidjs/src/createMetrics.ts +0 -37
- package/packages/logger/solidjs/src/createPerformanceLog.ts +0 -58
- package/packages/logger/solidjs/src/index.ts +0 -4
- package/packages/logger/solidjs/tsconfig.json +0 -32
- package/packages/logger/solidjs/tsup.config.ts +0 -12
- package/packages/logger/src/index.ts +0 -363
- package/packages/logger/tsup.config.ts +0 -12
- package/packages/perf/package.json +0 -27
- package/packages/perf/react/package.json +0 -59
- package/packages/perf/react/src/components/PerformanceDashboard.tsx +0 -257
- package/packages/perf/react/src/hooks/useMonitoredQuery.ts +0 -89
- package/packages/perf/react/src/hooks/usePerformanceMetrics.ts +0 -78
- package/packages/perf/react/src/index.ts +0 -33
- package/packages/perf/react/src/services/PerformanceMonitor.ts +0 -313
- package/packages/perf/react/src/types.ts +0 -77
- package/packages/perf/react/tsconfig.json +0 -25
- package/packages/perf/react/tsup.config.ts +0 -19
- package/packages/perf/solidjs/package.json +0 -41
- package/packages/perf/solidjs/src/components/PerformanceDashboard.tsx +0 -207
- package/packages/perf/solidjs/src/hooks/createPerformanceMetrics.ts +0 -73
- package/packages/perf/solidjs/src/index.ts +0 -31
- package/packages/perf/solidjs/src/services/PerformanceMonitor.ts +0 -134
- package/packages/perf/solidjs/src/types.ts +0 -78
- package/packages/perf/solidjs/tsconfig.json +0 -26
- package/packages/perf/solidjs/tsup.config.ts +0 -14
- package/packages/perf/src/index.ts +0 -410
- package/packages/perf/tsup.config.ts +0 -12
- package/pnpm-workspace.yaml +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @geenius/tools-env — Environment variable validation and management\n *\n * Provides schema-based environment variable validation using Zod.\n * Validates at runtime and provides type-safe access to env vars.\n */\n\nimport { z, ZodSchema } from 'zod/v4'\n\n/**\n * Environment variable schema definition\n */\nexport type EnvSchema = Record<string, ZodSchema>\n\n/**\n * Configuration for environment validation\n */\nexport interface EnvConfig {\n /** Whether to throw on validation error (default: true) */\n throw?: boolean\n /** Prefix to add to all env var names (e.g., 'REACT_APP_') */\n prefix?: string\n /** Default values for optional variables */\n defaults?: Record<string, unknown>\n}\n\n/**\n * Validates environment variables against a Zod schema\n *\n * @param schema Zod schema defining expected environment variables\n * @param config Validation configuration options\n * @returns Validated environment variables as typed object\n * @throws Error if validation fails and throw option is true\n *\n * @example\n * ```ts\n * const envSchema = {\n * DATABASE_URL: z.string().url(),\n * API_KEY: z.string(),\n * DEBUG: z.enum(['true', 'false']).optional(),\n * }\n *\n * const env = validateEnv(envSchema, { throw: true })\n * // env is now { DATABASE_URL: string, API_KEY: string, DEBUG?: string }\n * ```\n */\nexport function validateEnv<T extends EnvSchema>(\n schema: T,\n config: EnvConfig = {}\n): Partial<{ [K in keyof T]: unknown }> {\n const { prefix = '', defaults = {}, throw: shouldThrow = true } = config\n\n const envVars: Record<string, unknown> = {}\n\n // Collect env variables with prefix\n for (const key of Object.keys(schema)) {\n const prefixedKey = prefix ? `${prefix}${key}` : key\n const value = process.env[prefixedKey] ?? defaults[key]\n\n if (value !== undefined) {\n envVars[key] = value\n }\n }\n\n // Validate using zod\n const schemaObj = z.object(schema as Record<string, ZodSchema>)\n const result = schemaObj.safeParse(envVars)\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n\n const message = `Environment validation failed: ${errors}`\n\n if (shouldThrow) {\n throw new Error(message)\n }\n\n console.error(message)\n return {}\n }\n\n return result.data as Partial<{ [K in keyof T]: unknown }>\n}\n\n/**\n * Creates a reusable environment validator\n *\n * @param schema Zod schema\n * @param config Default configuration\n * @returns Validator function\n *\n * @example\n * ```ts\n * const validator = createEnvValidator(\n * { DATABASE_URL: z.string().url() },\n * { throw: true }\n * )\n * const env = validator()\n * ```\n */\nexport function createEnvValidator<T extends EnvSchema>(\n schema: T,\n config: EnvConfig = {}\n) {\n return () => validateEnv(schema, config)\n}\n\n/**\n * Gets a single environment variable with optional validation\n *\n * @param key Environment variable key\n * @param schema Optional Zod schema for validation\n * @param defaultValue Default value if not found\n * @returns Environment variable value or default\n *\n * @example\n * ```ts\n * const apiKey = getEnv('API_KEY', z.string().min(1))\n * ```\n */\nexport function getEnv<T = string>(\n key: string,\n schema?: ZodSchema,\n defaultValue?: T\n): T | undefined {\n const value = process.env[key] ?? defaultValue\n\n if (!value) return undefined\n\n if (schema) {\n const result = schema.safeParse(value)\n if (!result.success) {\n throw new Error(`Invalid env var ${key}: ${result.error.message}`)\n }\n return result.data as T\n }\n\n return value as T\n}\n\n/**\n * Checks if environment variable exists and is set\n *\n * @param key Variable name\n * @returns True if variable exists\n */\nexport function hasEnv(key: string): boolean {\n return key in process.env\n}\n\n/**\n * Gets multiple environment variables at once\n *\n * @param keys List of environment variable keys\n * @returns Object with available values\n *\n * @example\n * ```ts\n * const { API_KEY, DEBUG } = getEnvs(['API_KEY', 'DEBUG'])\n * ```\n */\nexport function getEnvs(keys: string[]): Record<string, string | undefined> {\n return keys.reduce(\n (acc, key) => {\n acc[key] = process.env[key]\n return acc\n },\n {} as Record<string, string | undefined>\n )\n}\n\n/**\n * Asserts that all required environment variables are set\n *\n * @param requiredKeys List of required variable names\n * @throws Error if any required variable is missing\n *\n * @example\n * ```ts\n * requireEnv(['DATABASE_URL', 'API_KEY'])\n * ```\n */\nexport function requireEnv(requiredKeys: string[]): void {\n const missing = requiredKeys.filter((key) => !(key in process.env))\n\n if (missing.length > 0) {\n throw new Error(\n `Missing required environment variables: ${missing.join(', ')}`\n )\n }\n}\n\n/**\n * Parses environment variable as JSON\n *\n * @param key Environment variable key\n * @param defaultValue Default object if parsing fails\n * @returns Parsed JSON object\n *\n * @example\n * ```ts\n * const config = parseEnvJson('APP_CONFIG', { theme: 'light' })\n * ```\n */\nexport function parseEnvJson<T = unknown>(\n key: string,\n defaultValue?: T\n): T | undefined {\n const value = process.env[key]\n\n if (!value) return defaultValue\n\n try {\n return JSON.parse(value) as T\n } catch {\n console.warn(`Failed to parse ${key} as JSON`)\n return defaultValue\n }\n}\n\n/**\n * Parses environment variable as boolean\n *\n * @param key Environment variable key\n * @param defaultValue Default value\n * @returns Boolean value\n *\n * @example\n * ```ts\n * const debug = parseEnvBool('DEBUG', false)\n * ```\n */\nexport function parseEnvBool(key: string, defaultValue = false): boolean {\n const value = process.env[key]\n\n if (!value) return defaultValue\n\n return ['true', '1', 'yes', 'on'].includes(value.toLowerCase())\n}\n\n/**\n * Parses environment variable as number\n *\n * @param key Environment variable key\n * @param defaultValue Default value\n * @returns Numeric value\n *\n * @example\n * ```ts\n * const port = parseEnvNumber('PORT', 3000)\n * ```\n */\nexport function parseEnvNumber(key: string, defaultValue = 0): number {\n const value = process.env[key]\n\n if (!value) return defaultValue\n\n const num = Number(value)\n return isNaN(num) ? defaultValue : num\n}\n\nexport type { ZodSchema } from 'zod/v4'\n"],"mappings":";AAOA,SAAS,SAAoB;AAuCtB,SAAS,YACd,QACA,SAAoB,CAAC,GACiB;AACtC,QAAM,EAAE,SAAS,IAAI,WAAW,CAAC,GAAG,OAAO,cAAc,KAAK,IAAI;AAElE,QAAM,UAAmC,CAAC;AAG1C,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,UAAM,cAAc,SAAS,GAAG,MAAM,GAAG,GAAG,KAAK;AACjD,UAAM,QAAQ,QAAQ,IAAI,WAAW,KAAK,SAAS,GAAG;AAEtD,QAAI,UAAU,QAAW;AACvB,cAAQ,GAAG,IAAI;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,YAAY,EAAE,OAAO,MAAmC;AAC9D,QAAM,SAAS,UAAU,UAAU,OAAO;AAE1C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SAAS,OAAO,MAAM,OACzB,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAC9C,KAAK,IAAI;AAEZ,UAAM,UAAU,kCAAkC,MAAM;AAExD,QAAI,aAAa;AACf,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,YAAQ,MAAM,OAAO;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO;AAChB;AAkBO,SAAS,mBACd,QACA,SAAoB,CAAC,GACrB;AACA,SAAO,MAAM,YAAY,QAAQ,MAAM;AACzC;AAeO,SAAS,OACd,KACA,QACA,cACe;AACf,QAAM,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAElC,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,QAAQ;AACV,UAAM,SAAS,OAAO,UAAU,KAAK;AACrC,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI,MAAM,mBAAmB,GAAG,KAAK,OAAO,MAAM,OAAO,EAAE;AAAA,IACnE;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO;AACT;AAQO,SAAS,OAAO,KAAsB;AAC3C,SAAO,OAAO,QAAQ;AACxB;AAaO,SAAS,QAAQ,MAAoD;AAC1E,SAAO,KAAK;AAAA,IACV,CAAC,KAAK,QAAQ;AACZ,UAAI,GAAG,IAAI,QAAQ,IAAI,GAAG;AAC1B,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAaO,SAAS,WAAW,cAA8B;AACvD,QAAM,UAAU,aAAa,OAAO,CAAC,QAAQ,EAAE,OAAO,QAAQ,IAAI;AAElE,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,2CAA2C,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;AAcO,SAAS,aACd,KACA,cACe;AACf,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAE7B,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,YAAQ,KAAK,mBAAmB,GAAG,UAAU;AAC7C,WAAO;AAAA,EACT;AACF;AAcO,SAAS,aAAa,KAAa,eAAe,OAAgB;AACvE,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAE7B,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,EAAE,SAAS,MAAM,YAAY,CAAC;AAChE;AAcO,SAAS,eAAe,KAAa,eAAe,GAAW;AACpE,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAE7B,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO,MAAM,GAAG,IAAI,eAAe;AACrC;","names":[]}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @geenius/tools-errors — Structured error handling
|
|
3
|
+
*
|
|
4
|
+
* Provides a hierarchy of typed errors for different error scenarios.
|
|
5
|
+
* Enables consistent error handling and formatting across the Geenius ecosystem.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error codes for different error types
|
|
9
|
+
*/
|
|
10
|
+
declare enum ErrorCode {
|
|
11
|
+
UNKNOWN = "UNKNOWN",
|
|
12
|
+
VALIDATION = "VALIDATION",
|
|
13
|
+
NOT_FOUND = "NOT_FOUND",
|
|
14
|
+
UNAUTHORIZED = "UNAUTHORIZED",
|
|
15
|
+
FORBIDDEN = "FORBIDDEN",
|
|
16
|
+
CONFLICT = "CONFLICT",
|
|
17
|
+
INTERNAL = "INTERNAL",
|
|
18
|
+
INVALID_CREDENTIALS = "INVALID_CREDENTIALS",
|
|
19
|
+
SESSION_EXPIRED = "SESSION_EXPIRED",
|
|
20
|
+
MFA_REQUIRED = "MFA_REQUIRED",
|
|
21
|
+
INVALID_TOKEN = "INVALID_TOKEN",
|
|
22
|
+
DATABASE_ERROR = "DATABASE_ERROR",
|
|
23
|
+
CONSTRAINT_VIOLATION = "CONSTRAINT_VIOLATION",
|
|
24
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
25
|
+
TIMEOUT = "TIMEOUT",
|
|
26
|
+
INVALID_CONFIG = "INVALID_CONFIG",
|
|
27
|
+
MISSING_CONFIG = "MISSING_CONFIG"
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Base Geenius error with structured information
|
|
31
|
+
*/
|
|
32
|
+
interface GeeniusErrorOptions {
|
|
33
|
+
/** Error code for classification */
|
|
34
|
+
code?: ErrorCode;
|
|
35
|
+
/** User-friendly message */
|
|
36
|
+
message: string;
|
|
37
|
+
/** Technical details */
|
|
38
|
+
cause?: Error | unknown;
|
|
39
|
+
/** HTTP status code equivalent */
|
|
40
|
+
statusCode?: number;
|
|
41
|
+
/** Contextual data */
|
|
42
|
+
context?: Record<string, unknown>;
|
|
43
|
+
/** Whether error should be logged */
|
|
44
|
+
log?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Structured error class for Geenius packages
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* throw new GeeniusError({
|
|
52
|
+
* code: ErrorCode.VALIDATION,
|
|
53
|
+
* message: 'Invalid email format',
|
|
54
|
+
* statusCode: 400,
|
|
55
|
+
* context: { field: 'email' }
|
|
56
|
+
* })
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
declare class GeeniusError extends Error {
|
|
60
|
+
readonly code: ErrorCode;
|
|
61
|
+
readonly statusCode: number;
|
|
62
|
+
readonly context: Record<string, unknown>;
|
|
63
|
+
readonly cause?: Error | unknown;
|
|
64
|
+
readonly log: boolean;
|
|
65
|
+
constructor(options: GeeniusErrorOptions);
|
|
66
|
+
/**
|
|
67
|
+
* Gets HTTP status code for error code
|
|
68
|
+
*/
|
|
69
|
+
private getDefaultStatusCode;
|
|
70
|
+
/**
|
|
71
|
+
* Converts error to JSON for serialization
|
|
72
|
+
*/
|
|
73
|
+
toJSON(): {
|
|
74
|
+
cause?: Record<string, unknown> | undefined;
|
|
75
|
+
name: string;
|
|
76
|
+
code: ErrorCode;
|
|
77
|
+
message: string;
|
|
78
|
+
statusCode: number;
|
|
79
|
+
context: Record<string, unknown>;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Converts error to string representation
|
|
83
|
+
*/
|
|
84
|
+
toString(): string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Validation error for form/input validation failures
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* throw new ValidationError({
|
|
92
|
+
* message: 'Invalid input',
|
|
93
|
+
* context: { errors: { email: 'Invalid format' } }
|
|
94
|
+
* })
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
declare class ValidationError extends GeeniusError {
|
|
98
|
+
constructor(options: Omit<GeeniusErrorOptions, 'code' | 'statusCode'>);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Authentication error
|
|
102
|
+
*/
|
|
103
|
+
declare class AuthError extends GeeniusError {
|
|
104
|
+
constructor(options: Omit<GeeniusErrorOptions, 'statusCode'>);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Not found error
|
|
108
|
+
*/
|
|
109
|
+
declare class NotFoundError extends GeeniusError {
|
|
110
|
+
constructor(options: Omit<GeeniusErrorOptions, 'code' | 'statusCode'>);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Conflict error (e.g., duplicate key)
|
|
114
|
+
*/
|
|
115
|
+
declare class ConflictError extends GeeniusError {
|
|
116
|
+
constructor(options: Omit<GeeniusErrorOptions, 'code' | 'statusCode'>);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Formats any error into structured format
|
|
120
|
+
*
|
|
121
|
+
* @param error Error to format
|
|
122
|
+
* @returns Formatted error object
|
|
123
|
+
*/
|
|
124
|
+
declare function formatError(error: unknown): Record<string, unknown>;
|
|
125
|
+
/**
|
|
126
|
+
* Type guard to check if error is GeeniusError
|
|
127
|
+
*
|
|
128
|
+
* @param error Error to check
|
|
129
|
+
* @returns True if error is GeeniusError
|
|
130
|
+
*/
|
|
131
|
+
declare function isGeeniusError(error: unknown): error is GeeniusError;
|
|
132
|
+
/**
|
|
133
|
+
* Type guard to check if error is a specific error code
|
|
134
|
+
*
|
|
135
|
+
* @param error Error to check
|
|
136
|
+
* @param code Error code to match
|
|
137
|
+
* @returns True if error has specified code
|
|
138
|
+
*/
|
|
139
|
+
declare function isErrorCode(error: unknown, code: ErrorCode): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Wraps a promise to catch and transform errors
|
|
142
|
+
*
|
|
143
|
+
* @param promise Promise to wrap
|
|
144
|
+
* @param handler Error transformation function
|
|
145
|
+
* @returns Promise with transformed errors
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```ts
|
|
149
|
+
* const result = await catchError(
|
|
150
|
+
* fetchApi(),
|
|
151
|
+
* (err) => new GeeniusError({
|
|
152
|
+
* code: ErrorCode.NETWORK_ERROR,
|
|
153
|
+
* message: 'API request failed',
|
|
154
|
+
* cause: err
|
|
155
|
+
* })
|
|
156
|
+
* )
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
declare function catchError<T>(promise: Promise<T>, handler: (error: unknown) => Error): Promise<T>;
|
|
160
|
+
/**
|
|
161
|
+
* Creates a safe function that handles errors
|
|
162
|
+
*
|
|
163
|
+
* @param fn Function to wrap
|
|
164
|
+
* @param handler Error transformation
|
|
165
|
+
* @returns Safe version of function
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```ts
|
|
169
|
+
* const safeOp = makeSafe(
|
|
170
|
+
* (id: string) => db.user.find(id),
|
|
171
|
+
* (err) => new NotFoundError({ message: 'User not found', cause: err })
|
|
172
|
+
* )
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
declare function makeSafe<T extends (...args: any[]) => any>(fn: T, handler: (error: unknown) => Error): T;
|
|
176
|
+
|
|
177
|
+
export { AuthError, ConflictError, ErrorCode, GeeniusError, type GeeniusErrorOptions, NotFoundError, ValidationError, catchError, formatError, isErrorCode, isGeeniusError, makeSafe };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
|
|
3
|
+
ErrorCode2["UNKNOWN"] = "UNKNOWN";
|
|
4
|
+
ErrorCode2["VALIDATION"] = "VALIDATION";
|
|
5
|
+
ErrorCode2["NOT_FOUND"] = "NOT_FOUND";
|
|
6
|
+
ErrorCode2["UNAUTHORIZED"] = "UNAUTHORIZED";
|
|
7
|
+
ErrorCode2["FORBIDDEN"] = "FORBIDDEN";
|
|
8
|
+
ErrorCode2["CONFLICT"] = "CONFLICT";
|
|
9
|
+
ErrorCode2["INTERNAL"] = "INTERNAL";
|
|
10
|
+
ErrorCode2["INVALID_CREDENTIALS"] = "INVALID_CREDENTIALS";
|
|
11
|
+
ErrorCode2["SESSION_EXPIRED"] = "SESSION_EXPIRED";
|
|
12
|
+
ErrorCode2["MFA_REQUIRED"] = "MFA_REQUIRED";
|
|
13
|
+
ErrorCode2["INVALID_TOKEN"] = "INVALID_TOKEN";
|
|
14
|
+
ErrorCode2["DATABASE_ERROR"] = "DATABASE_ERROR";
|
|
15
|
+
ErrorCode2["CONSTRAINT_VIOLATION"] = "CONSTRAINT_VIOLATION";
|
|
16
|
+
ErrorCode2["NETWORK_ERROR"] = "NETWORK_ERROR";
|
|
17
|
+
ErrorCode2["TIMEOUT"] = "TIMEOUT";
|
|
18
|
+
ErrorCode2["INVALID_CONFIG"] = "INVALID_CONFIG";
|
|
19
|
+
ErrorCode2["MISSING_CONFIG"] = "MISSING_CONFIG";
|
|
20
|
+
return ErrorCode2;
|
|
21
|
+
})(ErrorCode || {});
|
|
22
|
+
var GeeniusError = class _GeeniusError extends Error {
|
|
23
|
+
code;
|
|
24
|
+
statusCode;
|
|
25
|
+
context;
|
|
26
|
+
cause;
|
|
27
|
+
log;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
super(options.message);
|
|
30
|
+
this.name = "GeeniusError";
|
|
31
|
+
this.code = options.code ?? "UNKNOWN" /* UNKNOWN */;
|
|
32
|
+
this.statusCode = options.statusCode ?? this.getDefaultStatusCode(this.code);
|
|
33
|
+
this.context = options.context ?? {};
|
|
34
|
+
this.cause = options.cause;
|
|
35
|
+
this.log = options.log !== false;
|
|
36
|
+
Object.setPrototypeOf(this, _GeeniusError.prototype);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Gets HTTP status code for error code
|
|
40
|
+
*/
|
|
41
|
+
getDefaultStatusCode(code) {
|
|
42
|
+
const statusMap = {
|
|
43
|
+
["UNKNOWN" /* UNKNOWN */]: 500,
|
|
44
|
+
["VALIDATION" /* VALIDATION */]: 400,
|
|
45
|
+
["NOT_FOUND" /* NOT_FOUND */]: 404,
|
|
46
|
+
["UNAUTHORIZED" /* UNAUTHORIZED */]: 401,
|
|
47
|
+
["FORBIDDEN" /* FORBIDDEN */]: 403,
|
|
48
|
+
["CONFLICT" /* CONFLICT */]: 409,
|
|
49
|
+
["INTERNAL" /* INTERNAL */]: 500,
|
|
50
|
+
["INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */]: 401,
|
|
51
|
+
["SESSION_EXPIRED" /* SESSION_EXPIRED */]: 401,
|
|
52
|
+
["MFA_REQUIRED" /* MFA_REQUIRED */]: 403,
|
|
53
|
+
["INVALID_TOKEN" /* INVALID_TOKEN */]: 401,
|
|
54
|
+
["DATABASE_ERROR" /* DATABASE_ERROR */]: 500,
|
|
55
|
+
["CONSTRAINT_VIOLATION" /* CONSTRAINT_VIOLATION */]: 409,
|
|
56
|
+
["NETWORK_ERROR" /* NETWORK_ERROR */]: 502,
|
|
57
|
+
["TIMEOUT" /* TIMEOUT */]: 504,
|
|
58
|
+
["INVALID_CONFIG" /* INVALID_CONFIG */]: 500,
|
|
59
|
+
["MISSING_CONFIG" /* MISSING_CONFIG */]: 500
|
|
60
|
+
};
|
|
61
|
+
return statusMap[code];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Converts error to JSON for serialization
|
|
65
|
+
*/
|
|
66
|
+
toJSON() {
|
|
67
|
+
return {
|
|
68
|
+
name: this.name,
|
|
69
|
+
code: this.code,
|
|
70
|
+
message: this.message,
|
|
71
|
+
statusCode: this.statusCode,
|
|
72
|
+
context: this.context,
|
|
73
|
+
...this.cause ? { cause: formatError(this.cause) } : {}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Converts error to string representation
|
|
78
|
+
*/
|
|
79
|
+
toString() {
|
|
80
|
+
return `${this.name} [${this.code}]: ${this.message}`;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
var ValidationError = class _ValidationError extends GeeniusError {
|
|
84
|
+
constructor(options) {
|
|
85
|
+
super({
|
|
86
|
+
...options,
|
|
87
|
+
code: "VALIDATION" /* VALIDATION */,
|
|
88
|
+
statusCode: 400
|
|
89
|
+
});
|
|
90
|
+
this.name = "ValidationError";
|
|
91
|
+
Object.setPrototypeOf(this, _ValidationError.prototype);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
var AuthError = class _AuthError extends GeeniusError {
|
|
95
|
+
constructor(options) {
|
|
96
|
+
super({
|
|
97
|
+
...options,
|
|
98
|
+
code: options.code ?? "INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
|
|
99
|
+
statusCode: 401
|
|
100
|
+
});
|
|
101
|
+
this.name = "AuthError";
|
|
102
|
+
Object.setPrototypeOf(this, _AuthError.prototype);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
var NotFoundError = class _NotFoundError extends GeeniusError {
|
|
106
|
+
constructor(options) {
|
|
107
|
+
super({
|
|
108
|
+
...options,
|
|
109
|
+
code: "NOT_FOUND" /* NOT_FOUND */,
|
|
110
|
+
statusCode: 404
|
|
111
|
+
});
|
|
112
|
+
this.name = "NotFoundError";
|
|
113
|
+
Object.setPrototypeOf(this, _NotFoundError.prototype);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var ConflictError = class _ConflictError extends GeeniusError {
|
|
117
|
+
constructor(options) {
|
|
118
|
+
super({
|
|
119
|
+
...options,
|
|
120
|
+
code: "CONFLICT" /* CONFLICT */,
|
|
121
|
+
statusCode: 409
|
|
122
|
+
});
|
|
123
|
+
this.name = "ConflictError";
|
|
124
|
+
Object.setPrototypeOf(this, _ConflictError.prototype);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
function formatError(error) {
|
|
128
|
+
if (error instanceof GeeniusError) {
|
|
129
|
+
return error.toJSON();
|
|
130
|
+
}
|
|
131
|
+
if (error instanceof Error) {
|
|
132
|
+
return {
|
|
133
|
+
name: error.name,
|
|
134
|
+
message: error.message,
|
|
135
|
+
stack: error.stack
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (typeof error === "string") {
|
|
139
|
+
return { message: error };
|
|
140
|
+
}
|
|
141
|
+
if (typeof error === "object" && error !== null) {
|
|
142
|
+
return error;
|
|
143
|
+
}
|
|
144
|
+
return { message: String(error) };
|
|
145
|
+
}
|
|
146
|
+
function isGeeniusError(error) {
|
|
147
|
+
return error instanceof GeeniusError;
|
|
148
|
+
}
|
|
149
|
+
function isErrorCode(error, code) {
|
|
150
|
+
return isGeeniusError(error) && error.code === code;
|
|
151
|
+
}
|
|
152
|
+
async function catchError(promise, handler) {
|
|
153
|
+
try {
|
|
154
|
+
return await promise;
|
|
155
|
+
} catch (error) {
|
|
156
|
+
throw handler(error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function makeSafe(fn, handler) {
|
|
160
|
+
return ((...args) => {
|
|
161
|
+
try {
|
|
162
|
+
const result = fn(...args);
|
|
163
|
+
if (result instanceof Promise) {
|
|
164
|
+
return result.catch((err) => {
|
|
165
|
+
throw handler(err);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
} catch (error) {
|
|
170
|
+
throw handler(error);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
export {
|
|
175
|
+
AuthError,
|
|
176
|
+
ConflictError,
|
|
177
|
+
ErrorCode,
|
|
178
|
+
GeeniusError,
|
|
179
|
+
NotFoundError,
|
|
180
|
+
ValidationError,
|
|
181
|
+
catchError,
|
|
182
|
+
formatError,
|
|
183
|
+
isErrorCode,
|
|
184
|
+
isGeeniusError,
|
|
185
|
+
makeSafe
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @geenius/tools-errors — Structured error handling\n *\n * Provides a hierarchy of typed errors for different error scenarios.\n * Enables consistent error handling and formatting across the Geenius ecosystem.\n */\n\n/**\n * Error codes for different error types\n */\nexport enum ErrorCode {\n // Generic\n UNKNOWN = 'UNKNOWN',\n VALIDATION = 'VALIDATION',\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n FORBIDDEN = 'FORBIDDEN',\n CONFLICT = 'CONFLICT',\n INTERNAL = 'INTERNAL',\n\n // Auth-specific\n INVALID_CREDENTIALS = 'INVALID_CREDENTIALS',\n SESSION_EXPIRED = 'SESSION_EXPIRED',\n MFA_REQUIRED = 'MFA_REQUIRED',\n INVALID_TOKEN = 'INVALID_TOKEN',\n\n // Database\n DATABASE_ERROR = 'DATABASE_ERROR',\n CONSTRAINT_VIOLATION = 'CONSTRAINT_VIOLATION',\n\n // Network\n NETWORK_ERROR = 'NETWORK_ERROR',\n TIMEOUT = 'TIMEOUT',\n\n // Configuration\n INVALID_CONFIG = 'INVALID_CONFIG',\n MISSING_CONFIG = 'MISSING_CONFIG',\n}\n\n/**\n * Base Geenius error with structured information\n */\nexport interface GeeniusErrorOptions {\n /** Error code for classification */\n code?: ErrorCode\n /** User-friendly message */\n message: string\n /** Technical details */\n cause?: Error | unknown\n /** HTTP status code equivalent */\n statusCode?: number\n /** Contextual data */\n context?: Record<string, unknown>\n /** Whether error should be logged */\n log?: boolean\n}\n\n/**\n * Structured error class for Geenius packages\n *\n * @example\n * ```ts\n * throw new GeeniusError({\n * code: ErrorCode.VALIDATION,\n * message: 'Invalid email format',\n * statusCode: 400,\n * context: { field: 'email' }\n * })\n * ```\n */\nexport class GeeniusError extends Error {\n readonly code: ErrorCode\n readonly statusCode: number\n readonly context: Record<string, unknown>\n readonly cause?: Error | unknown\n readonly log: boolean\n\n constructor(options: GeeniusErrorOptions) {\n super(options.message)\n this.name = 'GeeniusError'\n this.code = options.code ?? ErrorCode.UNKNOWN\n this.statusCode = options.statusCode ?? this.getDefaultStatusCode(this.code)\n this.context = options.context ?? {}\n this.cause = options.cause\n this.log = options.log !== false\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, GeeniusError.prototype)\n }\n\n /**\n * Gets HTTP status code for error code\n */\n private getDefaultStatusCode(code: ErrorCode): number {\n const statusMap: Record<ErrorCode, number> = {\n [ErrorCode.UNKNOWN]: 500,\n [ErrorCode.VALIDATION]: 400,\n [ErrorCode.NOT_FOUND]: 404,\n [ErrorCode.UNAUTHORIZED]: 401,\n [ErrorCode.FORBIDDEN]: 403,\n [ErrorCode.CONFLICT]: 409,\n [ErrorCode.INTERNAL]: 500,\n [ErrorCode.INVALID_CREDENTIALS]: 401,\n [ErrorCode.SESSION_EXPIRED]: 401,\n [ErrorCode.MFA_REQUIRED]: 403,\n [ErrorCode.INVALID_TOKEN]: 401,\n [ErrorCode.DATABASE_ERROR]: 500,\n [ErrorCode.CONSTRAINT_VIOLATION]: 409,\n [ErrorCode.NETWORK_ERROR]: 502,\n [ErrorCode.TIMEOUT]: 504,\n [ErrorCode.INVALID_CONFIG]: 500,\n [ErrorCode.MISSING_CONFIG]: 500,\n }\n return statusMap[code]\n }\n\n /**\n * Converts error to JSON for serialization\n */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n statusCode: this.statusCode,\n context: this.context,\n ...(this.cause ? { cause: formatError(this.cause) } : {}),\n }\n }\n\n /**\n * Converts error to string representation\n */\n toString(): string {\n return `${this.name} [${this.code}]: ${this.message}`\n }\n}\n\n/**\n * Validation error for form/input validation failures\n *\n * @example\n * ```ts\n * throw new ValidationError({\n * message: 'Invalid input',\n * context: { errors: { email: 'Invalid format' } }\n * })\n * ```\n */\nexport class ValidationError extends GeeniusError {\n constructor(options: Omit<GeeniusErrorOptions, 'code' | 'statusCode'>) {\n super({\n ...options,\n code: ErrorCode.VALIDATION,\n statusCode: 400,\n })\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n\n/**\n * Authentication error\n */\nexport class AuthError extends GeeniusError {\n constructor(options: Omit<GeeniusErrorOptions, 'statusCode'>) {\n super({\n ...options,\n code: options.code ?? ErrorCode.INVALID_CREDENTIALS,\n statusCode: 401,\n })\n this.name = 'AuthError'\n Object.setPrototypeOf(this, AuthError.prototype)\n }\n}\n\n/**\n * Not found error\n */\nexport class NotFoundError extends GeeniusError {\n constructor(options: Omit<GeeniusErrorOptions, 'code' | 'statusCode'>) {\n super({\n ...options,\n code: ErrorCode.NOT_FOUND,\n statusCode: 404,\n })\n this.name = 'NotFoundError'\n Object.setPrototypeOf(this, NotFoundError.prototype)\n }\n}\n\n/**\n * Conflict error (e.g., duplicate key)\n */\nexport class ConflictError extends GeeniusError {\n constructor(options: Omit<GeeniusErrorOptions, 'code' | 'statusCode'>) {\n super({\n ...options,\n code: ErrorCode.CONFLICT,\n statusCode: 409,\n })\n this.name = 'ConflictError'\n Object.setPrototypeOf(this, ConflictError.prototype)\n }\n}\n\n/**\n * Formats any error into structured format\n *\n * @param error Error to format\n * @returns Formatted error object\n */\nexport function formatError(error: unknown): Record<string, unknown> {\n if (error instanceof GeeniusError) {\n return error.toJSON()\n }\n\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n }\n\n if (typeof error === 'string') {\n return { message: error }\n }\n\n if (typeof error === 'object' && error !== null) {\n return error as Record<string, unknown>\n }\n\n return { message: String(error) }\n}\n\n/**\n * Type guard to check if error is GeeniusError\n *\n * @param error Error to check\n * @returns True if error is GeeniusError\n */\nexport function isGeeniusError(error: unknown): error is GeeniusError {\n return error instanceof GeeniusError\n}\n\n/**\n * Type guard to check if error is a specific error code\n *\n * @param error Error to check\n * @param code Error code to match\n * @returns True if error has specified code\n */\nexport function isErrorCode(error: unknown, code: ErrorCode): boolean {\n return isGeeniusError(error) && error.code === code\n}\n\n/**\n * Wraps a promise to catch and transform errors\n *\n * @param promise Promise to wrap\n * @param handler Error transformation function\n * @returns Promise with transformed errors\n *\n * @example\n * ```ts\n * const result = await catchError(\n * fetchApi(),\n * (err) => new GeeniusError({\n * code: ErrorCode.NETWORK_ERROR,\n * message: 'API request failed',\n * cause: err\n * })\n * )\n * ```\n */\nexport async function catchError<T>(\n promise: Promise<T>,\n handler: (error: unknown) => Error\n): Promise<T> {\n try {\n return await promise\n } catch (error) {\n throw handler(error)\n }\n}\n\n/**\n * Creates a safe function that handles errors\n *\n * @param fn Function to wrap\n * @param handler Error transformation\n * @returns Safe version of function\n *\n * @example\n * ```ts\n * const safeOp = makeSafe(\n * (id: string) => db.user.find(id),\n * (err) => new NotFoundError({ message: 'User not found', cause: err })\n * )\n * ```\n */\nexport function makeSafe<T extends (...args: any[]) => any>(\n fn: T,\n handler: (error: unknown) => Error\n): T {\n return ((...args: any[]) => {\n try {\n const result = fn(...args)\n if (result instanceof Promise) {\n return result.catch((err: unknown) => {\n throw handler(err)\n })\n }\n return result\n } catch (error) {\n throw handler(error)\n }\n }) as T\n}\n"],"mappings":"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","names":["ErrorCode"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# ✦ @geenius-
|
|
1
|
+
# ✦ @geenius/tools-errors-react\n\n> React error handling UI — boundaries, displays, analytics dashboard, hooks & utilities\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/tools-errors-react\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/tools-errors-react';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# ✦ @geenius-
|
|
1
|
+
# ✦ @geenius/tools-errors-solidjs\n\n> SolidJS error handling UI — boundaries, displays, hooks & utilities\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/tools-errors-solidjs\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/tools-errors-solidjs';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @geenius/tools-logger — Structured logging
|
|
3
|
+
*
|
|
4
|
+
* Provides structured logging with levels, formatting, and contextual data.
|
|
5
|
+
* Suitable for both client and server environments.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Log levels in order of severity
|
|
9
|
+
*/
|
|
10
|
+
declare enum LogLevel {
|
|
11
|
+
DEBUG = 0,
|
|
12
|
+
INFO = 1,
|
|
13
|
+
WARN = 2,
|
|
14
|
+
ERROR = 3,
|
|
15
|
+
FATAL = 4
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Log entry structure
|
|
19
|
+
*/
|
|
20
|
+
interface LogEntry {
|
|
21
|
+
/** Log level */
|
|
22
|
+
level: LogLevel;
|
|
23
|
+
/** Log message */
|
|
24
|
+
message: string;
|
|
25
|
+
/** Contextual data */
|
|
26
|
+
context?: Record<string, unknown>;
|
|
27
|
+
/** Error object if applicable */
|
|
28
|
+
error?: Error | unknown;
|
|
29
|
+
/** Timestamp */
|
|
30
|
+
timestamp: Date;
|
|
31
|
+
/** Additional metadata */
|
|
32
|
+
metadata?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Log formatter function
|
|
36
|
+
*/
|
|
37
|
+
type LogFormatter = (entry: LogEntry) => string;
|
|
38
|
+
/**
|
|
39
|
+
* Logger transport (where logs go)
|
|
40
|
+
*/
|
|
41
|
+
interface LogTransport {
|
|
42
|
+
/** Log handler function */
|
|
43
|
+
log(entry: LogEntry): void | Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Logger configuration
|
|
47
|
+
*/
|
|
48
|
+
interface LoggerConfig {
|
|
49
|
+
/** Minimum log level to output (default: INFO) */
|
|
50
|
+
level?: LogLevel;
|
|
51
|
+
/** Custom formatter (default: pretty print) */
|
|
52
|
+
formatter?: LogFormatter;
|
|
53
|
+
/** Log transports */
|
|
54
|
+
transports?: LogTransport[];
|
|
55
|
+
/** Whether to include timestamps (default: true) */
|
|
56
|
+
timestamps?: boolean;
|
|
57
|
+
/** Whether to include source location (default: false) */
|
|
58
|
+
sourceLocation?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Structured logger with context and levels
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* const logger = createLogger({ level: LogLevel.DEBUG })
|
|
66
|
+
*
|
|
67
|
+
* logger.info('User signed in', { userId: '123' })
|
|
68
|
+
* logger.error('Database error', { error })
|
|
69
|
+
* logger.debug('Cache hit', { key: 'user:123' })
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
declare class Logger {
|
|
73
|
+
private level;
|
|
74
|
+
private formatter;
|
|
75
|
+
private transports;
|
|
76
|
+
private timestamps;
|
|
77
|
+
private sourceLocation;
|
|
78
|
+
private context;
|
|
79
|
+
constructor(config?: LoggerConfig);
|
|
80
|
+
/**
|
|
81
|
+
* Logs with debug level
|
|
82
|
+
*/
|
|
83
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
84
|
+
/**
|
|
85
|
+
* Logs with info level
|
|
86
|
+
*/
|
|
87
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
88
|
+
/**
|
|
89
|
+
* Logs with warn level
|
|
90
|
+
*/
|
|
91
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
92
|
+
/**
|
|
93
|
+
* Logs with error level
|
|
94
|
+
*/
|
|
95
|
+
error(message: string, error?: Error | unknown, context?: Record<string, unknown>): void;
|
|
96
|
+
/**
|
|
97
|
+
* Logs with fatal level
|
|
98
|
+
*/
|
|
99
|
+
fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>): void;
|
|
100
|
+
/**
|
|
101
|
+
* Core logging method
|
|
102
|
+
*/
|
|
103
|
+
private log;
|
|
104
|
+
/**
|
|
105
|
+
* Sets context for all subsequent logs
|
|
106
|
+
*/
|
|
107
|
+
setContext(key: string, value: unknown): this;
|
|
108
|
+
/**
|
|
109
|
+
* Gets current context
|
|
110
|
+
*/
|
|
111
|
+
getContext(): Record<string, unknown>;
|
|
112
|
+
/**
|
|
113
|
+
* Clears context
|
|
114
|
+
*/
|
|
115
|
+
clearContext(): this;
|
|
116
|
+
/**
|
|
117
|
+
* Creates a child logger with inherited context
|
|
118
|
+
*/
|
|
119
|
+
child(context: Record<string, unknown>): Logger;
|
|
120
|
+
/**
|
|
121
|
+
* Gets source location from stack trace
|
|
122
|
+
*/
|
|
123
|
+
private getSourceLocation;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Console transport for logging to stdout/stderr
|
|
127
|
+
*/
|
|
128
|
+
declare const consoleTransport: LogTransport;
|
|
129
|
+
/**
|
|
130
|
+
* Creates a new logger instance
|
|
131
|
+
*
|
|
132
|
+
* @param config Logger configuration
|
|
133
|
+
* @returns Configured logger
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* const logger = createLogger({
|
|
138
|
+
* level: LogLevel.DEBUG,
|
|
139
|
+
* timestamps: true
|
|
140
|
+
* })
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
declare function createLogger(config?: LoggerConfig): Logger;
|
|
144
|
+
/**
|
|
145
|
+
* Gets or creates global logger
|
|
146
|
+
*
|
|
147
|
+
* @param config Configuration for initial creation
|
|
148
|
+
* @returns Global logger instance
|
|
149
|
+
*/
|
|
150
|
+
declare function getGlobalLogger(config?: LoggerConfig): Logger;
|
|
151
|
+
/**
|
|
152
|
+
* Resets global logger (for testing)
|
|
153
|
+
*/
|
|
154
|
+
declare function resetGlobalLogger(): void;
|
|
155
|
+
/**
|
|
156
|
+
* Memory transport for testing and analysis
|
|
157
|
+
*/
|
|
158
|
+
declare class MemoryTransport implements LogTransport {
|
|
159
|
+
private entries;
|
|
160
|
+
log(entry: LogEntry): void;
|
|
161
|
+
/** Gets all logged entries */
|
|
162
|
+
getEntries(): LogEntry[];
|
|
163
|
+
/** Gets entries by level */
|
|
164
|
+
getByLevel(level: LogLevel): LogEntry[];
|
|
165
|
+
/** Clears all entries */
|
|
166
|
+
clear(): void;
|
|
167
|
+
/** Gets count of entries */
|
|
168
|
+
size(): number;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export { type LogEntry, type LogFormatter, LogLevel, type LogTransport, Logger, type LoggerConfig, MemoryTransport, consoleTransport, createLogger, getGlobalLogger, resetGlobalLogger };
|