@corti/embedded-web 0.1.1 → 0.3.1
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 +92 -50
- package/dist/CortiEmbedded.d.ts +34 -7
- package/dist/CortiEmbedded.js +274 -106
- package/dist/CortiEmbedded.js.map +1 -1
- package/dist/bundle.js +1699 -20
- package/dist/corti-embedded.d.ts +17 -1
- package/dist/corti-embedded.js +4 -3
- package/dist/corti-embedded.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/public-types.d.ts +185 -0
- package/dist/public-types.js +2 -0
- package/dist/public-types.js.map +1 -0
- package/dist/react/CortiEmbeddedReact.d.ts +32 -23
- package/dist/react/CortiEmbeddedReact.js +69 -21
- package/dist/react/CortiEmbeddedReact.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/styles/base.js +1 -1
- package/dist/styles/base.js.map +1 -1
- package/dist/styles/container-styles.js +2 -2
- package/dist/styles/container-styles.js.map +1 -1
- package/dist/styles/theme.js +2 -2
- package/dist/styles/theme.js.map +1 -1
- package/dist/types/api.d.ts +36 -22
- package/dist/types/api.js.map +1 -1
- package/dist/types/config.d.ts +16 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/payloads.d.ts +36 -4
- package/dist/types/payloads.js.map +1 -1
- package/dist/types/protocol.d.ts +9 -4
- package/dist/types/protocol.js.map +1 -1
- package/dist/types/responses.d.ts +10 -2
- package/dist/types/responses.js.map +1 -1
- package/dist/utils/PostMessageHandler.d.ts +19 -70
- package/dist/utils/PostMessageHandler.js +98 -201
- package/dist/utils/PostMessageHandler.js.map +1 -1
- package/dist/utils/baseUrl.js +8 -8
- package/dist/utils/baseUrl.js.map +1 -1
- package/dist/utils/embedUrl.js +3 -3
- package/dist/utils/embedUrl.js.map +1 -1
- package/dist/utils/errorFormatter.js +44 -20
- package/dist/utils/errorFormatter.js.map +1 -1
- package/dist/web-bundle.js +1555 -13
- package/dist/web-index.d.ts +3 -3
- package/dist/web-index.js +4 -4
- package/dist/web-index.js.map +1 -1
- package/package.json +20 -20
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return typeof value === "object" && value !== null;
|
|
3
|
+
}
|
|
4
|
+
function toStringIfFiniteNumberOrString(value) {
|
|
5
|
+
if (typeof value === "string") {
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
9
|
+
return String(value);
|
|
10
|
+
}
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
1
13
|
/**
|
|
2
14
|
* Attempts to parse a JSON string safely
|
|
3
15
|
*/
|
|
@@ -21,9 +33,9 @@ function extractStatusCode(message) {
|
|
|
21
33
|
* Checks if an object looks like a validation error
|
|
22
34
|
*/
|
|
23
35
|
function isValidationError(obj) {
|
|
24
|
-
return (typeof obj ===
|
|
36
|
+
return (typeof obj === "object" &&
|
|
25
37
|
obj !== null &&
|
|
26
|
-
(
|
|
38
|
+
("expected" in obj || "code" in obj || "path" in obj || "message" in obj));
|
|
27
39
|
}
|
|
28
40
|
/**
|
|
29
41
|
* Formats a validation error into a human-readable message
|
|
@@ -35,7 +47,7 @@ function formatValidationError(error) {
|
|
|
35
47
|
return message;
|
|
36
48
|
}
|
|
37
49
|
// Build a descriptive message from the parts
|
|
38
|
-
const pathString = path && path.length > 0 ? path.join(
|
|
50
|
+
const pathString = path && path.length > 0 ? path.join(".") : "field";
|
|
39
51
|
if (expected) {
|
|
40
52
|
return `Invalid ${pathString}: expected ${expected}`;
|
|
41
53
|
}
|
|
@@ -49,18 +61,18 @@ function formatValidationError(error) {
|
|
|
49
61
|
*/
|
|
50
62
|
function formatValidationErrors(errors) {
|
|
51
63
|
if (errors.length === 0) {
|
|
52
|
-
return
|
|
64
|
+
return "Unknown validation error";
|
|
53
65
|
}
|
|
54
66
|
if (errors.length === 1) {
|
|
55
67
|
return formatValidationError(errors[0]);
|
|
56
68
|
}
|
|
57
69
|
const errorMessages = errors.map(formatValidationError);
|
|
58
|
-
return `Multiple validation errors: ${errorMessages.join(
|
|
70
|
+
return `Multiple validation errors: ${errorMessages.join("; ")}`;
|
|
59
71
|
}
|
|
60
72
|
/**
|
|
61
73
|
* Generic error formatter that handles various error formats
|
|
62
74
|
*/
|
|
63
|
-
export function formatError(error, fallbackMessage =
|
|
75
|
+
export function formatError(error, fallbackMessage = "An error occurred") {
|
|
64
76
|
// Handle null/undefined
|
|
65
77
|
if (!error) {
|
|
66
78
|
return {
|
|
@@ -78,7 +90,7 @@ export function formatError(error, fallbackMessage = 'An error occurred') {
|
|
|
78
90
|
};
|
|
79
91
|
}
|
|
80
92
|
// Handle string errors (like "400 Bad Request")
|
|
81
|
-
if (typeof error ===
|
|
93
|
+
if (typeof error === "string") {
|
|
82
94
|
const extractedCode = extractStatusCode(error);
|
|
83
95
|
return {
|
|
84
96
|
message: error,
|
|
@@ -104,19 +116,22 @@ export function formatError(error, fallbackMessage = 'An error occurred') {
|
|
|
104
116
|
};
|
|
105
117
|
}
|
|
106
118
|
// Handle error objects
|
|
107
|
-
if (
|
|
119
|
+
if (isRecord(error)) {
|
|
108
120
|
const errorObj = error;
|
|
121
|
+
const objectMessage = typeof errorObj.message === "string" ? errorObj.message : undefined;
|
|
122
|
+
const objectCode = toStringIfFiniteNumberOrString(errorObj.code);
|
|
123
|
+
const objectStatus = toStringIfFiniteNumberOrString(errorObj.status);
|
|
109
124
|
// Handle objects with message and details structure (your original case)
|
|
110
|
-
if (
|
|
111
|
-
let formattedMessage =
|
|
112
|
-
let
|
|
125
|
+
if (objectMessage) {
|
|
126
|
+
let formattedMessage = objectMessage;
|
|
127
|
+
let code = objectCode;
|
|
113
128
|
// If no code is provided, try to extract it from the message
|
|
114
129
|
if (!code) {
|
|
115
130
|
code = extractStatusCode(formattedMessage);
|
|
116
131
|
}
|
|
117
132
|
// Try to enhance the message with parsed details
|
|
118
|
-
if (errorObj.details
|
|
119
|
-
typeof errorObj.details.message ===
|
|
133
|
+
if (isRecord(errorObj.details) &&
|
|
134
|
+
typeof errorObj.details.message === "string") {
|
|
120
135
|
const parsedDetails = tryParseJson(errorObj.details.message);
|
|
121
136
|
// Check if parsed details is an array of validation errors
|
|
122
137
|
if (Array.isArray(parsedDetails) &&
|
|
@@ -132,19 +147,28 @@ export function formatError(error, fallbackMessage = 'An error occurred') {
|
|
|
132
147
|
}
|
|
133
148
|
// Handle single validation error objects
|
|
134
149
|
if (isValidationError(errorObj)) {
|
|
150
|
+
const validationError = {
|
|
151
|
+
expected: typeof errorObj.expected === "string" ? errorObj.expected : undefined,
|
|
152
|
+
code: objectCode,
|
|
153
|
+
path: Array.isArray(errorObj.path) &&
|
|
154
|
+
errorObj.path.every(pathPart => typeof pathPart === "string")
|
|
155
|
+
? errorObj.path
|
|
156
|
+
: undefined,
|
|
157
|
+
message: objectMessage,
|
|
158
|
+
};
|
|
135
159
|
return {
|
|
136
|
-
message: formatValidationError(
|
|
137
|
-
code:
|
|
160
|
+
message: formatValidationError(validationError),
|
|
161
|
+
code: validationError.code,
|
|
138
162
|
details: error,
|
|
139
163
|
};
|
|
140
164
|
}
|
|
141
165
|
// Handle objects that might have useful error info
|
|
142
|
-
if (errorObj.error || errorObj.
|
|
143
|
-
const message = errorObj.error
|
|
144
|
-
const messageStr = typeof message ===
|
|
166
|
+
if (errorObj.error || errorObj.detail || objectStatus || objectCode) {
|
|
167
|
+
const message = errorObj.error ?? objectMessage ?? errorObj.detail;
|
|
168
|
+
const messageStr = typeof message === "string" ? message : fallbackMessage;
|
|
145
169
|
// Try to get code from various properties, or extract from message
|
|
146
|
-
let code =
|
|
147
|
-
if (!code && typeof message ===
|
|
170
|
+
let code = objectCode ?? objectStatus;
|
|
171
|
+
if (!code && typeof message === "string") {
|
|
148
172
|
code = extractStatusCode(message);
|
|
149
173
|
}
|
|
150
174
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorFormatter.js","sourceRoot":"","sources":["../../src/utils/errorFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["interface ValidationError {\n expected?: string;\n code?: string;\n path?: string[];\n message?: string;\n}\n\ninterface FormattedError {\n message: string;\n code?: string;\n details?: unknown;\n}\n\n/**\n * Attempts to parse a JSON string safely\n */\nfunction tryParseJson(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return null;\n }\n}\n\n/**\n * Extracts a 3-digit HTTP status code from an error message\n */\nfunction extractStatusCode(message: string): string | undefined {\n // Match 3-digit numbers that look like HTTP status codes (100-599)\n const statusCodeMatch = message.match(/\\b([1-5]\\d{2})\\b/);\n return statusCodeMatch ? statusCodeMatch[1] : undefined;\n}\n\n/**\n * Checks if an object looks like a validation error\n */\nfunction isValidationError(obj: unknown): obj is ValidationError {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n ('expected' in obj || 'code' in obj || 'path' in obj || 'message' in obj)\n );\n}\n\n/**\n * Formats a validation error into a human-readable message\n */\nfunction formatValidationError(error: ValidationError): string {\n const { path, expected, message, code } = error;\n\n // Use the provided message if available\n if (message) {\n return message;\n }\n\n // Build a descriptive message from the parts\n const pathString = path && path.length > 0 ? path.join('.') : 'field';\n\n if (expected) {\n return `Invalid ${pathString}: expected ${expected}`;\n }\n\n if (code) {\n return `Validation error in ${pathString} (${code})`;\n }\n\n return `Validation error in ${pathString}`;\n}\n\n/**\n * Formats multiple validation errors into a single message\n */\nfunction formatValidationErrors(errors: ValidationError[]): string {\n if (errors.length === 0) {\n return 'Unknown validation error';\n }\n\n if (errors.length === 1) {\n return formatValidationError(errors[0]);\n }\n\n const errorMessages = errors.map(formatValidationError);\n return `Multiple validation errors: ${errorMessages.join('; ')}`;\n}\n\n/**\n * Generic error formatter that handles various error formats\n */\nexport function formatError(\n error: unknown,\n fallbackMessage = 'An error occurred',\n): FormattedError {\n // Handle null/undefined\n if (!error) {\n return {\n message: fallbackMessage,\n details: error,\n };\n }\n\n // Handle Error objects\n if (error instanceof Error) {\n const extractedCode = extractStatusCode(error.message);\n return {\n message: error.message || fallbackMessage,\n code: extractedCode,\n details: error,\n };\n }\n\n // Handle string errors (like \"400 Bad Request\")\n if (typeof error === 'string') {\n const extractedCode = extractStatusCode(error);\n return {\n message: error,\n code: extractedCode,\n details: error,\n };\n }\n\n // Handle arrays (direct validation error arrays)\n if (Array.isArray(error)) {\n // Check if it's an array of validation errors\n if (error.every(isValidationError)) {\n const validationErrors = error as ValidationError[];\n return {\n message: formatValidationErrors(validationErrors),\n code: validationErrors[0]?.code, // Use the first error's code if available\n details: error,\n };\n }\n\n // Handle other arrays\n return {\n message: `Multiple errors: ${error.length} item(s)`,\n details: error,\n };\n }\n\n // Handle error objects\n if (typeof error === 'object') {\n const errorObj = error as any;\n\n // Handle objects with message and details structure (your original case)\n if (errorObj.message && typeof errorObj.message === 'string') {\n let formattedMessage = errorObj.message;\n let { code } = errorObj;\n\n // If no code is provided, try to extract it from the message\n if (!code) {\n code = extractStatusCode(formattedMessage);\n }\n\n // Try to enhance the message with parsed details\n if (\n errorObj.details?.message &&\n typeof errorObj.details.message === 'string'\n ) {\n const parsedDetails = tryParseJson(errorObj.details.message);\n\n // Check if parsed details is an array of validation errors\n if (\n Array.isArray(parsedDetails) &&\n parsedDetails.every(isValidationError)\n ) {\n formattedMessage = formatValidationErrors(\n parsedDetails as ValidationError[],\n );\n }\n }\n\n return {\n message: formattedMessage,\n code,\n details: errorObj.details,\n };\n }\n\n // Handle single validation error objects\n if (isValidationError(errorObj)) {\n return {\n message: formatValidationError(errorObj),\n code: errorObj.code,\n details: error,\n };\n }\n\n // Handle objects that might have useful error info\n if (errorObj.error || errorObj.message || errorObj.detail) {\n const message = errorObj.error || errorObj.message || errorObj.detail;\n const messageStr =\n typeof message === 'string' ? message : fallbackMessage;\n\n // Try to get code from various properties, or extract from message\n let code = errorObj.code || errorObj.status;\n if (!code && typeof message === 'string') {\n code = extractStatusCode(message);\n }\n\n return {\n message: messageStr,\n code,\n details: error,\n };\n }\n }\n\n // Fallback for any other case\n return {\n message: fallbackMessage,\n details: error,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"errorFormatter.js","sourceRoot":"","sources":["../../src/utils/errorFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["interface ValidationError {\n expected?: string;\n code?: string;\n path?: string[];\n message?: string;\n}\n\ntype ValidationErrorLike =\n | ({ expected: unknown } & Record<string, unknown>)\n | ({ code: unknown } & Record<string, unknown>)\n | ({ path: unknown } & Record<string, unknown>)\n | ({ message: unknown } & Record<string, unknown>);\n\ninterface FormattedError {\n message: string;\n code?: string;\n details?: unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction toStringIfFiniteNumberOrString(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n return undefined;\n}\n\n/**\n * Attempts to parse a JSON string safely\n */\nfunction tryParseJson(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return null;\n }\n}\n\n/**\n * Extracts a 3-digit HTTP status code from an error message\n */\nfunction extractStatusCode(message: string): string | undefined {\n // Match 3-digit numbers that look like HTTP status codes (100-599)\n const statusCodeMatch = message.match(/\\b([1-5]\\d{2})\\b/);\n return statusCodeMatch ? statusCodeMatch[1] : undefined;\n}\n\n/**\n * Checks if an object looks like a validation error\n */\nfunction isValidationError(obj: unknown): obj is ValidationErrorLike {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (\"expected\" in obj || \"code\" in obj || \"path\" in obj || \"message\" in obj)\n );\n}\n\n/**\n * Formats a validation error into a human-readable message\n */\nfunction formatValidationError(error: ValidationError): string {\n const { path, expected, message, code } = error;\n\n // Use the provided message if available\n if (message) {\n return message;\n }\n\n // Build a descriptive message from the parts\n const pathString = path && path.length > 0 ? path.join(\".\") : \"field\";\n\n if (expected) {\n return `Invalid ${pathString}: expected ${expected}`;\n }\n\n if (code) {\n return `Validation error in ${pathString} (${code})`;\n }\n\n return `Validation error in ${pathString}`;\n}\n\n/**\n * Formats multiple validation errors into a single message\n */\nfunction formatValidationErrors(errors: ValidationError[]): string {\n if (errors.length === 0) {\n return \"Unknown validation error\";\n }\n\n if (errors.length === 1) {\n return formatValidationError(errors[0]);\n }\n\n const errorMessages = errors.map(formatValidationError);\n return `Multiple validation errors: ${errorMessages.join(\"; \")}`;\n}\n\n/**\n * Generic error formatter that handles various error formats\n */\nexport function formatError(\n error: unknown,\n fallbackMessage = \"An error occurred\",\n): FormattedError {\n // Handle null/undefined\n if (!error) {\n return {\n message: fallbackMessage,\n details: error,\n };\n }\n\n // Handle Error objects\n if (error instanceof Error) {\n const extractedCode = extractStatusCode(error.message);\n return {\n message: error.message || fallbackMessage,\n code: extractedCode,\n details: error,\n };\n }\n\n // Handle string errors (like \"400 Bad Request\")\n if (typeof error === \"string\") {\n const extractedCode = extractStatusCode(error);\n return {\n message: error,\n code: extractedCode,\n details: error,\n };\n }\n\n // Handle arrays (direct validation error arrays)\n if (Array.isArray(error)) {\n // Check if it's an array of validation errors\n if (error.every(isValidationError)) {\n const validationErrors = error as ValidationError[];\n return {\n message: formatValidationErrors(validationErrors),\n code: validationErrors[0]?.code, // Use the first error's code if available\n details: error,\n };\n }\n\n // Handle other arrays\n return {\n message: `Multiple errors: ${error.length} item(s)`,\n details: error,\n };\n }\n\n // Handle error objects\n if (isRecord(error)) {\n const errorObj = error;\n const objectMessage =\n typeof errorObj.message === \"string\" ? errorObj.message : undefined;\n const objectCode = toStringIfFiniteNumberOrString(errorObj.code);\n const objectStatus = toStringIfFiniteNumberOrString(errorObj.status);\n\n // Handle objects with message and details structure (your original case)\n if (objectMessage) {\n let formattedMessage = objectMessage;\n let code = objectCode;\n\n // If no code is provided, try to extract it from the message\n if (!code) {\n code = extractStatusCode(formattedMessage);\n }\n\n // Try to enhance the message with parsed details\n if (\n isRecord(errorObj.details) &&\n typeof errorObj.details.message === \"string\"\n ) {\n const parsedDetails = tryParseJson(errorObj.details.message);\n\n // Check if parsed details is an array of validation errors\n if (\n Array.isArray(parsedDetails) &&\n parsedDetails.every(isValidationError)\n ) {\n formattedMessage = formatValidationErrors(\n parsedDetails as ValidationError[],\n );\n }\n }\n\n return {\n message: formattedMessage,\n code,\n details: errorObj.details,\n };\n }\n\n // Handle single validation error objects\n if (isValidationError(errorObj)) {\n const validationError: ValidationError = {\n expected:\n typeof errorObj.expected === \"string\" ? errorObj.expected : undefined,\n code: objectCode,\n path:\n Array.isArray(errorObj.path) &&\n errorObj.path.every(pathPart => typeof pathPart === \"string\")\n ? errorObj.path\n : undefined,\n message: objectMessage,\n };\n return {\n message: formatValidationError(validationError),\n code: validationError.code,\n details: error,\n };\n }\n\n // Handle objects that might have useful error info\n if (errorObj.error || errorObj.detail || objectStatus || objectCode) {\n const message = errorObj.error ?? objectMessage ?? errorObj.detail;\n const messageStr =\n typeof message === \"string\" ? message : fallbackMessage;\n\n // Try to get code from various properties, or extract from message\n let code = objectCode ?? objectStatus;\n if (!code && typeof message === \"string\") {\n code = extractStatusCode(message);\n }\n\n return {\n message: messageStr,\n code,\n details: error,\n };\n }\n }\n\n // Fallback for any other case\n return {\n message: fallbackMessage,\n details: error,\n };\n}\n"]}
|