@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.
Files changed (53) hide show
  1. package/README.md +92 -50
  2. package/dist/CortiEmbedded.d.ts +34 -7
  3. package/dist/CortiEmbedded.js +274 -106
  4. package/dist/CortiEmbedded.js.map +1 -1
  5. package/dist/bundle.js +1699 -20
  6. package/dist/corti-embedded.d.ts +17 -1
  7. package/dist/corti-embedded.js +4 -3
  8. package/dist/corti-embedded.js.map +1 -1
  9. package/dist/index.d.ts +5 -5
  10. package/dist/index.js +5 -5
  11. package/dist/index.js.map +1 -1
  12. package/dist/public-types.d.ts +185 -0
  13. package/dist/public-types.js +2 -0
  14. package/dist/public-types.js.map +1 -0
  15. package/dist/react/CortiEmbeddedReact.d.ts +32 -23
  16. package/dist/react/CortiEmbeddedReact.js +69 -21
  17. package/dist/react/CortiEmbeddedReact.js.map +1 -1
  18. package/dist/react/index.d.ts +2 -2
  19. package/dist/react/index.js +1 -1
  20. package/dist/react/index.js.map +1 -1
  21. package/dist/styles/base.js +1 -1
  22. package/dist/styles/base.js.map +1 -1
  23. package/dist/styles/container-styles.js +2 -2
  24. package/dist/styles/container-styles.js.map +1 -1
  25. package/dist/styles/theme.js +2 -2
  26. package/dist/styles/theme.js.map +1 -1
  27. package/dist/types/api.d.ts +36 -22
  28. package/dist/types/api.js.map +1 -1
  29. package/dist/types/config.d.ts +16 -2
  30. package/dist/types/config.js.map +1 -1
  31. package/dist/types/index.js +1 -1
  32. package/dist/types/index.js.map +1 -1
  33. package/dist/types/payloads.d.ts +36 -4
  34. package/dist/types/payloads.js.map +1 -1
  35. package/dist/types/protocol.d.ts +9 -4
  36. package/dist/types/protocol.js.map +1 -1
  37. package/dist/types/responses.d.ts +10 -2
  38. package/dist/types/responses.js.map +1 -1
  39. package/dist/utils/PostMessageHandler.d.ts +19 -70
  40. package/dist/utils/PostMessageHandler.js +98 -201
  41. package/dist/utils/PostMessageHandler.js.map +1 -1
  42. package/dist/utils/baseUrl.js +8 -8
  43. package/dist/utils/baseUrl.js.map +1 -1
  44. package/dist/utils/embedUrl.js +3 -3
  45. package/dist/utils/embedUrl.js.map +1 -1
  46. package/dist/utils/errorFormatter.js +44 -20
  47. package/dist/utils/errorFormatter.js.map +1 -1
  48. package/dist/web-bundle.js +1555 -13
  49. package/dist/web-index.d.ts +3 -3
  50. package/dist/web-index.js +4 -4
  51. package/dist/web-index.js.map +1 -1
  52. package/package.json +20 -20
  53. 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 === 'object' &&
36
+ return (typeof obj === "object" &&
25
37
  obj !== null &&
26
- ('expected' in obj || 'code' in obj || 'path' in obj || 'message' in obj));
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('.') : 'field';
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 'Unknown validation error';
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 = 'An error occurred') {
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 === 'string') {
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 (typeof error === 'object') {
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 (errorObj.message && typeof errorObj.message === 'string') {
111
- let formattedMessage = errorObj.message;
112
- let { code } = errorObj;
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?.message &&
119
- typeof errorObj.details.message === 'string') {
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(errorObj),
137
- code: errorObj.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.message || errorObj.detail) {
143
- const message = errorObj.error || errorObj.message || errorObj.detail;
144
- const messageStr = typeof message === 'string' ? message : fallbackMessage;
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 = errorObj.code || errorObj.status;
147
- if (!code && typeof message === 'string') {
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"]}