@mastra/playground-ui 37.0.0-alpha.5 → 37.0.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.
Files changed (82) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/dist/components/Columns.cjs.js +1 -1
  3. package/dist/components/Columns.es.js +1 -1
  4. package/dist/components/RuleBuilder.cjs.js +10 -0
  5. package/dist/components/RuleBuilder.cjs.js.map +1 -0
  6. package/dist/components/RuleBuilder.d.ts +2 -0
  7. package/dist/components/RuleBuilder.es.js +2 -0
  8. package/dist/components/RuleBuilder.es.js.map +1 -0
  9. package/dist/index.cjs.js +65 -908
  10. package/dist/index.cjs.js.map +1 -1
  11. package/dist/index.es.js +18 -842
  12. package/dist/index.es.js.map +1 -1
  13. package/dist/{multi-column-B9TVKcLl.cjs → multi-column-BLp7eL6P.cjs} +1 -2
  14. package/dist/{multi-column-B9TVKcLl.cjs.map → multi-column-BLp7eL6P.cjs.map} +1 -1
  15. package/dist/{multi-column-p8sEagdM.js → multi-column-DeSb1YDE.js} +1 -2
  16. package/dist/{multi-column-p8sEagdM.js.map → multi-column-DeSb1YDE.js.map} +1 -1
  17. package/dist/rule-builder-Zs6Ywp5-.js +563 -0
  18. package/dist/rule-builder-Zs6Ywp5-.js.map +1 -0
  19. package/dist/rule-builder-vwKEUlZU.cjs +594 -0
  20. package/dist/rule-builder-vwKEUlZU.cjs.map +1 -0
  21. package/dist/src/ds/components/RuleBuilder/index.d.ts +2 -0
  22. package/dist/src/utils/colors.d.ts +1 -0
  23. package/dist/src/utils/errors.d.ts +2 -0
  24. package/dist/src/utils/file.d.ts +1 -0
  25. package/dist/src/utils/formatting.d.ts +1 -0
  26. package/dist/src/utils/json-schema.d.ts +1 -0
  27. package/dist/src/utils/number.d.ts +1 -0
  28. package/dist/src/utils/query-utils.d.ts +1 -0
  29. package/dist/src/utils/rule-engine.d.ts +2 -0
  30. package/dist/src/utils/string.d.ts +1 -0
  31. package/dist/src/utils/truncate-string.d.ts +1 -0
  32. package/dist/utils/colors.cjs.js +15 -0
  33. package/dist/utils/colors.cjs.js.map +1 -0
  34. package/dist/utils/colors.d.ts +2 -0
  35. package/dist/utils/colors.es.js +11 -0
  36. package/dist/utils/colors.es.js.map +1 -0
  37. package/dist/utils/errors.cjs.js +33 -0
  38. package/dist/utils/errors.cjs.js.map +1 -0
  39. package/dist/utils/errors.d.ts +2 -0
  40. package/dist/utils/errors.es.js +22 -0
  41. package/dist/utils/errors.es.js.map +1 -0
  42. package/dist/utils/file.cjs.js +113 -0
  43. package/dist/utils/file.cjs.js.map +1 -0
  44. package/dist/utils/file.d.ts +2 -0
  45. package/dist/utils/file.es.js +100 -0
  46. package/dist/utils/file.es.js.map +1 -0
  47. package/dist/utils/formatting.cjs.js +47 -0
  48. package/dist/utils/formatting.cjs.js.map +1 -0
  49. package/dist/utils/formatting.d.ts +2 -0
  50. package/dist/utils/formatting.es.js +41 -0
  51. package/dist/utils/formatting.es.js.map +1 -0
  52. package/dist/utils/json-schema.cjs.js +3 -0
  53. package/dist/utils/json-schema.cjs.js.map +1 -0
  54. package/dist/utils/json-schema.d.ts +2 -0
  55. package/dist/utils/json-schema.es.js +2 -0
  56. package/dist/utils/json-schema.es.js.map +1 -0
  57. package/dist/utils/number.cjs.js +10 -0
  58. package/dist/utils/number.cjs.js.map +1 -0
  59. package/dist/utils/number.d.ts +2 -0
  60. package/dist/utils/number.es.js +6 -0
  61. package/dist/utils/number.es.js.map +1 -0
  62. package/dist/utils/query-utils.cjs.js +98 -0
  63. package/dist/utils/query-utils.cjs.js.map +1 -0
  64. package/dist/utils/query-utils.d.ts +2 -0
  65. package/dist/utils/query-utils.es.js +88 -0
  66. package/dist/utils/query-utils.es.js.map +1 -0
  67. package/dist/utils/rule-engine.cjs.js +29 -0
  68. package/dist/utils/rule-engine.cjs.js.map +1 -0
  69. package/dist/utils/rule-engine.d.ts +2 -0
  70. package/dist/utils/rule-engine.es.js +21 -0
  71. package/dist/utils/rule-engine.es.js.map +1 -0
  72. package/dist/utils/string.cjs.js +11 -0
  73. package/dist/utils/string.cjs.js.map +1 -0
  74. package/dist/utils/string.d.ts +2 -0
  75. package/dist/utils/string.es.js +7 -0
  76. package/dist/utils/string.es.js.map +1 -0
  77. package/dist/utils/truncate-string.cjs.js +11 -0
  78. package/dist/utils/truncate-string.cjs.js.map +1 -0
  79. package/dist/utils/truncate-string.d.ts +2 -0
  80. package/dist/utils/truncate-string.es.js +7 -0
  81. package/dist/utils/truncate-string.es.js.map +1 -0
  82. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-builder-vwKEUlZU.cjs","sources":["../src/lib/rule-engine/components/schema-utils.ts","../src/lib/rule-engine/components/rule-field-select.tsx","../src/lib/rule-engine/components/types.ts","../src/lib/rule-engine/components/rule-operator-select.tsx","../src/lib/rule-engine/components/rule-value-input.tsx","../src/lib/rule-engine/components/rule-row.tsx","../src/lib/rule-engine/components/rule-builder.tsx"],"sourcesContent":["import type { FieldOption, JsonSchema, JsonSchemaProperty } from './types';\n\n/**\n * Gets the primary type from a JSON Schema property\n */\nexport const getPropertyType = (property: JsonSchemaProperty): string => {\n if (Array.isArray(property.type)) {\n // Return the first non-null type\n return property.type.find(t => t !== 'null') || 'string';\n }\n return property.type || 'string';\n};\n\n/**\n * Checks if a property has nested children (object or array of objects)\n */\nexport const hasNestedChildren = (property: JsonSchemaProperty): boolean => {\n const type = getPropertyType(property);\n\n if (type === 'object' && property.properties) {\n return Object.keys(property.properties).length > 0;\n }\n\n if (type === 'array' && property.items) {\n const itemType = getPropertyType(property.items);\n return itemType === 'object' && !!property.items.properties;\n }\n\n return false;\n};\n\n/**\n * Extracts field options from JSON Schema properties at a given level\n */\nexport const getFieldOptionsFromProperties = (\n properties: Record<string, JsonSchemaProperty> | undefined,\n parentPath: string = '',\n): FieldOption[] => {\n if (!properties) return [];\n\n return Object.entries(properties).map(([key, property]) => {\n const path = parentPath ? `${parentPath}.${key}` : key;\n const type = getPropertyType(property);\n const hasChildren = hasNestedChildren(property);\n\n return {\n path,\n label: property.title || key,\n type,\n hasChildren,\n children: type === 'object' ? property.properties : undefined,\n items: type === 'array' ? property.items : undefined,\n };\n });\n};\n\n/**\n * Gets field options from the root schema\n */\nexport const getFieldOptionsFromSchema = (schema: JsonSchema): FieldOption[] => {\n return getFieldOptionsFromProperties(schema.properties);\n};\n\n/**\n * Gets child field options for a given field option\n */\nexport const getChildFieldOptions = (fieldOption: FieldOption, currentPath: string): FieldOption[] => {\n if (fieldOption.type === 'object' && fieldOption.children) {\n return getFieldOptionsFromProperties(fieldOption.children, currentPath);\n }\n\n if (fieldOption.type === 'array' && fieldOption.items) {\n const itemType = getPropertyType(fieldOption.items);\n if (itemType === 'object' && fieldOption.items.properties) {\n // For arrays, we use the current path directly (user will access via index or iteration)\n return getFieldOptionsFromProperties(fieldOption.items.properties, currentPath);\n }\n }\n\n return [];\n};\n\n/**\n * Parses a field path into segments\n */\nexport const parseFieldPath = (path: string): string[] => {\n return path.split('.').filter(Boolean);\n};\n\n/**\n * Gets the field option at a specific path in the schema\n */\nexport const getFieldOptionAtPath = (schema: JsonSchema, path: string): FieldOption | undefined => {\n const segments = parseFieldPath(path);\n if (segments.length === 0) return undefined;\n\n let currentProperties = schema.properties;\n let currentPath = '';\n let result: FieldOption | undefined;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (!currentProperties || !currentProperties[segment]) {\n return undefined;\n }\n\n const property = currentProperties[segment];\n currentPath = currentPath ? `${currentPath}.${segment}` : segment;\n const type = getPropertyType(property);\n const hasChildren = hasNestedChildren(property);\n\n result = {\n path: currentPath,\n label: property.title || segment,\n type,\n hasChildren,\n children: type === 'object' ? property.properties : undefined,\n items: type === 'array' ? property.items : undefined,\n };\n\n // Navigate deeper\n if (type === 'object' && property.properties) {\n currentProperties = property.properties;\n } else if (type === 'array' && property.items?.properties) {\n currentProperties = property.items.properties;\n } else {\n currentProperties = undefined;\n }\n }\n\n return result;\n};\n","import { Braces, Hash, List, ToggleLeft, Type } from 'lucide-react';\nimport * as React from 'react';\n\nimport { getFieldOptionsFromSchema, getFieldOptionAtPath, getChildFieldOptions, parseFieldPath } from './schema-utils';\nimport type { FieldOption, RuleFieldSelectProps } from './types';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select/select';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Get icon for a field type\n */\nconst getFieldTypeIcon = (type: string): React.ReactNode => {\n switch (type) {\n case 'object':\n return <Braces />;\n case 'array':\n return <List />;\n case 'number':\n case 'integer':\n return <Hash />;\n case 'boolean':\n return <ToggleLeft />;\n case 'string':\n default:\n return <Type />;\n }\n};\n\n/**\n * A single level of field selection\n */\ntype FieldLevelSelectProps = {\n options: FieldOption[];\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n};\n\nconst FieldLevelSelect: React.FC<FieldLevelSelectProps> = ({\n options,\n value,\n onChange,\n placeholder = 'Select field',\n className,\n}) => {\n return (\n <div className={cn('relative', className)}>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger className=\"min-w-[140px] text-neutral6 bg-surface4\" size=\"sm\">\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map(option => (\n <SelectItem key={option.path} value={option.path}>\n <span className=\"flex items-center gap-2\">\n <Icon size=\"sm\" className=\"text-neutral3\">\n {getFieldTypeIcon(option.type)}\n </Icon>\n {option.label}\n {option.hasChildren && <span className=\"text-neutral3\">...</span>}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n};\n\n/**\n * Recursive field selector that shows additional dropdowns for nested objects/arrays\n */\nexport const RuleFieldSelect: React.FC<RuleFieldSelectProps> = ({ schema, value, onChange, className }) => {\n // Parse the current path into segments\n const pathSegments = React.useMemo(() => parseFieldPath(value), [value]);\n\n // Build the list of selectors needed based on the current value\n const selectors = React.useMemo(() => {\n const result: Array<{\n options: FieldOption[];\n value: string;\n basePath: string;\n }> = [];\n\n // First level: root schema properties\n const rootOptions = getFieldOptionsFromSchema(schema);\n if (rootOptions.length === 0) return result;\n\n result.push({\n options: rootOptions,\n value: pathSegments[0] || '',\n basePath: '',\n });\n\n // For each segment, check if we need to add more selectors\n let currentPath = '';\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i];\n currentPath = currentPath ? `${currentPath}.${segment}` : segment;\n\n const fieldOption = getFieldOptionAtPath(schema, currentPath);\n if (!fieldOption || !fieldOption.hasChildren) break;\n\n // Get child options for the next level\n const childOptions = getChildFieldOptions(fieldOption, currentPath);\n if (childOptions.length === 0) break;\n\n // Check if there's a next segment selected\n const nextSegment = pathSegments[i + 1];\n const nextPath = nextSegment ? `${currentPath}.${nextSegment}` : '';\n\n result.push({\n options: childOptions,\n value: nextPath,\n basePath: currentPath,\n });\n }\n\n return result;\n }, [schema, pathSegments]);\n\n // Handle change at a specific level\n const handleChange = React.useCallback(\n (levelIndex: number, newValue: string) => {\n // When changing a level, we truncate any deeper selections\n onChange(newValue);\n },\n [onChange],\n );\n\n if (selectors.length === 0) {\n return <div className={cn('text-sm text-neutral3', className)}>No fields available</div>;\n }\n\n return (\n <div className={cn('flex items-center gap-1', className)}>\n {selectors.map((selector, index) => (\n <React.Fragment key={`${selector.basePath}-${index}`}>\n {index > 0 && <span className=\"text-neutral3\">.</span>}\n <FieldLevelSelect\n options={selector.options}\n value={selector.value}\n onChange={newValue => handleChange(index, newValue)}\n placeholder={index === 0 ? 'Select field' : 'Select property'}\n />\n </React.Fragment>\n ))}\n </div>\n );\n};\n","import type { ConditionOperator, Rule, RuleGroup } from '../types';\nimport type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\nexport type { JsonSchema, JsonSchemaProperty };\n\n/**\n * Represents a field option extracted from JSON Schema\n */\nexport type FieldOption = {\n /** The field path (e.g., \"user.email\") */\n path: string;\n /** Display label */\n label: string;\n /** The JSON Schema type of the field */\n type: string;\n /** Whether this field has nested properties */\n hasChildren: boolean;\n /** Child properties if type is object */\n children?: Record<string, JsonSchemaProperty>;\n /** Item schema if type is array */\n items?: JsonSchemaProperty;\n};\n\n/**\n * Props for the RuleBuilder root component\n */\nexport type RuleBuilderProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** Current rule group (recursive, supports nested groups) */\n ruleGroup: RuleGroup | undefined;\n /** Callback when rule group changes */\n onChange: (ruleGroup: RuleGroup | undefined) => void;\n /** Maximum nesting depth (default: 3) */\n maxDepth?: number;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Internal props for the recursive RuleGroupView component\n */\nexport type RuleGroupViewProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** The rule group to render */\n group: RuleGroup;\n /** Callback when this group changes */\n onChange: (group: RuleGroup) => void;\n /** Callback to remove this group (undefined for root) */\n onRemove?: () => void;\n /** Current nesting depth (0 = root) */\n depth: number;\n /** Maximum nesting depth */\n maxDepth: number;\n};\n\n/**\n * Props for a single rule row\n */\nexport type RuleRowProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** Current rule */\n rule: Rule;\n /** Callback when rule changes */\n onChange: (rule: Rule) => void;\n /** Callback to remove this rule */\n onRemove: () => void;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Props for the field selector\n */\nexport type RuleFieldSelectProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** Current selected field path */\n value: string;\n /** Callback when field changes */\n onChange: (field: string) => void;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Props for the operator selector\n */\nexport type RuleOperatorSelectProps = {\n /** Current selected operator */\n value: ConditionOperator;\n /** Callback when operator changes */\n onChange: (operator: ConditionOperator) => void;\n /** Subset of operators to show. Defaults to all operators. */\n operators?: readonly ConditionOperator[];\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Props for the value input\n */\nexport type RuleValueInputProps = {\n /** Current value */\n value: unknown;\n /** Callback when value changes */\n onChange: (value: unknown) => void;\n /** The operator (affects input behavior for \"in\" and \"not_in\") */\n operator: ConditionOperator;\n /** The field type from JSON Schema (string, number, boolean, etc.) */\n fieldType?: string;\n /** Optional placeholder */\n placeholder?: string;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Operator labels for display\n */\nexport const OPERATOR_LABELS: Record<ConditionOperator, string> = {\n equals: 'equals',\n not_equals: 'not equals',\n contains: 'contains',\n not_contains: 'not contains',\n greater_than: 'greater than',\n less_than: 'less than',\n greater_than_or_equal: 'greater than or equal',\n less_than_or_equal: 'less than or equal',\n in: 'in',\n not_in: 'not in',\n exists: 'exists',\n not_exists: 'not exists',\n};\n\n/**\n * All available operators\n */\nexport const OPERATORS: ConditionOperator[] = [\n 'equals',\n 'not_equals',\n 'contains',\n 'not_contains',\n 'greater_than',\n 'less_than',\n 'greater_than_or_equal',\n 'less_than_or_equal',\n 'in',\n 'not_in',\n 'exists',\n 'not_exists',\n];\n","import {\n Equal,\n EqualNot,\n Text,\n TextSearch,\n ChevronRight,\n ChevronLeft,\n ChevronsRight,\n ChevronsLeft,\n List,\n ListX,\n Check,\n Ban,\n} from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ConditionOperator } from '../types';\nimport type { RuleOperatorSelectProps } from './types';\nimport { OPERATOR_LABELS, OPERATORS } from './types';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select/select';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Icons for each operator type\n */\nconst OPERATOR_ICONS: Record<ConditionOperator, React.ReactNode> = {\n equals: <Equal />,\n not_equals: <EqualNot />,\n contains: <TextSearch />,\n not_contains: <Text />,\n greater_than: <ChevronRight />,\n less_than: <ChevronLeft />,\n greater_than_or_equal: <ChevronsRight />,\n less_than_or_equal: <ChevronsLeft />,\n in: <List />,\n not_in: <ListX />,\n exists: <Check />,\n not_exists: <Ban />,\n};\n\n/**\n * Select component for choosing a rule operator\n */\nexport const RuleOperatorSelect: React.FC<RuleOperatorSelectProps> = ({ value, onChange, operators, className }) => {\n const operatorList = operators ?? OPERATORS;\n\n return (\n <div className={cn('relative', className)}>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger className=\"min-w-[150px] text-neutral6 bg-surface4\" size=\"sm\">\n <SelectValue placeholder=\"Select operator\" />\n </SelectTrigger>\n <SelectContent>\n {operatorList.map(operator => (\n <SelectItem key={operator} value={operator}>\n <span className=\"flex items-center gap-2\">\n <Icon size=\"sm\" className=\"text-neutral3\">\n {OPERATOR_ICONS[operator]}\n </Icon>\n {OPERATOR_LABELS[operator]}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n};\n","import { Hash, ToggleLeft, Type } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { RuleValueInputProps } from './types';\nimport { Input } from '@/ds/components/Input/input';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select/select';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Parses a string value to the appropriate type\n */\nconst parseValue = (stringValue: string): unknown => {\n const trimmed = stringValue.trim();\n\n // Empty string\n if (trimmed === '') return '';\n\n // Boolean\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n\n // Null\n if (trimmed === 'null') return null;\n\n // Reject special number strings - keep as strings\n const lowerTrimmed = trimmed.toLowerCase();\n if (lowerTrimmed === 'infinity' || lowerTrimmed === '-infinity' || lowerTrimmed === 'nan') {\n return trimmed;\n }\n\n // Number\n const num = Number(trimmed);\n if (!Number.isNaN(num)) return num;\n\n // String (default)\n return stringValue;\n};\n\n/**\n * Parses a comma-separated string into an array of values\n */\nconst parseArrayValue = (stringValue: string): unknown[] => {\n if (stringValue.trim() === '') return [];\n\n return stringValue.split(',').map(item => parseValue(item.trim()));\n};\n\n/**\n * Converts a value to a display string\n */\nconst valueToString = (value: unknown): string => {\n if (value === null) return 'null';\n if (value === undefined) return '';\n if (Array.isArray(value)) return value.map(valueToString).join(', ');\n return String(value);\n};\n\n/**\n * Converts a boolean value to a string for the select\n */\nconst booleanToString = (value: unknown): string => {\n if (value === true) return 'true';\n if (value === false) return 'false';\n return '';\n};\n\ntype BaseInputProps = {\n value: unknown;\n onChange: (value: unknown) => void;\n placeholder?: string;\n className?: string;\n};\n\n/**\n * Boolean value input using a Select dropdown with icon inside\n */\nconst BooleanValueInput: React.FC<BaseInputProps> = ({ value, onChange, className }) => {\n const stringValue = booleanToString(value);\n\n const handleChange = React.useCallback(\n (newValue: string) => {\n onChange(newValue === 'true');\n },\n [onChange],\n );\n\n return (\n <div className={cn('relative', className)}>\n <Icon size=\"sm\" className=\"absolute left-2 top-1/2 -translate-y-1/2 text-neutral3 pointer-events-none z-10\">\n <ToggleLeft />\n </Icon>\n <Select value={stringValue} onValueChange={handleChange}>\n <SelectTrigger className=\"min-w-[140px] bg-surface4 pl-7\" size=\"sm\">\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">true</SelectItem>\n <SelectItem value=\"false\">false</SelectItem>\n </SelectContent>\n </Select>\n </div>\n );\n};\n\n/**\n * Number value input with icon inside\n */\nconst NumberValueInput: React.FC<BaseInputProps> = ({ value, onChange, placeholder, className }) => {\n const displayValue = value === undefined || value === '' ? '' : String(value);\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n if (inputValue === '') {\n onChange('');\n } else {\n const num = Number(inputValue);\n onChange(Number.isNaN(num) ? inputValue : num);\n }\n },\n [onChange],\n );\n\n return (\n <div className={cn('relative', className)}>\n <Icon size=\"sm\" className=\"absolute left-2 top-1/2 -translate-y-1/2 text-neutral3 pointer-events-none\">\n <Hash />\n </Icon>\n <Input\n type=\"number\"\n value={displayValue}\n onChange={handleChange}\n placeholder={placeholder || 'Enter number'}\n className=\"min-w-[140px] bg-surface4 pl-7\"\n size=\"sm\"\n />\n </div>\n );\n};\n\n/**\n * Text value input with icon inside\n */\nconst TextValueInput: React.FC<BaseInputProps> = ({ value, onChange, placeholder, className }) => {\n const displayValue = valueToString(value);\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(parseValue(e.target.value));\n },\n [onChange],\n );\n\n return (\n <div className={cn('relative', className)}>\n <Icon size=\"sm\" className=\"absolute left-2 top-1/2 -translate-y-1/2 text-neutral3 pointer-events-none\">\n <Type />\n </Icon>\n <Input\n value={displayValue}\n onChange={handleChange}\n placeholder={placeholder || 'Enter value'}\n className=\"min-w-[140px] bg-surface4 pl-7\"\n size=\"sm\"\n />\n </div>\n );\n};\n\n/**\n * Array value input (for \"in\" and \"not_in\" operators)\n */\nconst ArrayValueInput: React.FC<BaseInputProps> = ({ value, onChange, placeholder, className }) => {\n const displayValue = React.useMemo(() => {\n if (Array.isArray(value)) {\n return value.map(valueToString).join(', ');\n }\n return valueToString(value);\n }, [value]);\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(parseArrayValue(e.target.value));\n },\n [onChange],\n );\n\n return (\n <Input\n value={displayValue}\n onChange={handleChange}\n placeholder={placeholder || 'Enter values (comma-separated)'}\n className={cn('min-w-[160px] bg-surface4', className)}\n size=\"sm\"\n />\n );\n};\n\n/**\n * Input component for entering rule values\n * Supports different modes based on the operator and field type:\n * - \"in\" and \"not_in\": Comma-separated values (parsed as array)\n * - Boolean fields: Select dropdown with true/false\n * - Number fields: Number input\n * - Other: Text input\n */\nexport const RuleValueInput: React.FC<RuleValueInputProps> = ({\n value,\n onChange,\n operator,\n fieldType,\n placeholder,\n className,\n}) => {\n const isArrayOperator = operator === 'in' || operator === 'not_in';\n\n // Array operators always use text input for comma-separated values\n if (isArrayOperator) {\n return <ArrayValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n }\n\n // Boolean fields use Select dropdown\n if (fieldType === 'boolean') {\n return <BooleanValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n }\n\n // Number fields use number input\n if (fieldType === 'number' || fieldType === 'integer') {\n return <NumberValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n }\n\n // Default to text input\n return <TextValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n};\n","import { X } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ConditionOperator } from '../types';\n\nimport { RuleFieldSelect } from './rule-field-select';\nimport { RuleOperatorSelect } from './rule-operator-select';\nimport { RuleValueInput } from './rule-value-input';\nimport { getFieldOptionAtPath } from './schema-utils';\nimport type { RuleRowProps } from './types';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nconst PRIMITIVE_TYPES = new Set(['string', 'number', 'boolean', 'integer']);\n\n/**\n * A single rule row with field selector, operator selector, and value input\n */\nexport const RuleRow: React.FC<RuleRowProps> = ({ schema, rule, onChange, onRemove, className }) => {\n const fieldType = React.useMemo(() => {\n return getFieldOptionAtPath(schema, rule.field)?.type;\n }, [schema, rule.field]);\n\n const isPrimitive = fieldType !== undefined && PRIMITIVE_TYPES.has(fieldType);\n const isArray = fieldType === 'array';\n const isArrayOperator = rule.operator === 'in' || rule.operator === 'not_in';\n const isExistenceOperator = rule.operator === 'exists' || rule.operator === 'not_exists';\n\n // Show operator + value for primitive types, or for array types (restricted to in/not_in)\n const showComparator = isPrimitive || isArray;\n const showValueInput = !isExistenceOperator && (isPrimitive || (isArray && isArrayOperator));\n\n const handleFieldChange = React.useCallback(\n (field: string) => {\n onChange({ ...rule, field });\n },\n [rule, onChange],\n );\n\n const handleOperatorChange = React.useCallback(\n (operator: ConditionOperator) => {\n const isNewExistence = operator === 'exists' || operator === 'not_exists';\n\n // Existence operators don't need a value\n if (isNewExistence) {\n onChange({ ...rule, operator, value: undefined });\n return;\n }\n\n // Reset value when changing to/from array operators\n const isArrayOperator = operator === 'in' || operator === 'not_in';\n const wasArrayOperator = rule.operator === 'in' || rule.operator === 'not_in';\n\n let newValue = rule.value;\n if (isArrayOperator && !wasArrayOperator) {\n // Converting to array operator: wrap value in array\n newValue = rule.value !== undefined ? [rule.value] : [];\n } else if (!isArrayOperator && wasArrayOperator) {\n // Converting from array operator: take first value\n newValue = Array.isArray(rule.value) ? rule.value[0] : rule.value;\n }\n\n onChange({ ...rule, operator, value: newValue });\n },\n [rule, onChange],\n );\n\n const handleValueChange = React.useCallback(\n (value: unknown) => {\n onChange({ ...rule, value });\n },\n [rule, onChange],\n );\n\n return (\n <div className=\"flex justify-between gap-2\">\n <div className={cn('flex flex-wrap items-center gap-2', className)}>\n <RuleFieldSelect schema={schema} value={rule.field} onChange={handleFieldChange} />\n\n {showComparator && (\n <>\n <RuleOperatorSelect\n value={rule.operator}\n onChange={handleOperatorChange}\n operators={isArray ? (['in', 'not_in'] as const) : undefined}\n />\n\n {showValueInput && (\n <RuleValueInput\n value={rule.value}\n onChange={handleValueChange}\n operator={rule.operator}\n fieldType={fieldType}\n />\n )}\n </>\n )}\n </div>\n\n <Button type=\"button\" onClick={onRemove} tooltip=\"Remove rule\" size=\"icon-sm\" variant=\"ghost\">\n <X />\n </Button>\n </div>\n );\n};\n","import { Plus, X, Component } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { Rule, RuleGroup, RuleGroupDepth1 } from '../types';\nimport { isRule, createDefaultRule, createDefaultRuleGroup } from '../utils';\n\nimport { RuleRow } from './rule-row';\nimport type { RuleBuilderProps, RuleGroupViewProps } from './types';\nimport { Button } from '@/ds/components/Button';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_MAX_DEPTH = 3;\n\n/**\n * Internal recursive component that renders one level of a rule group.\n */\nconst RuleGroupView: React.FC<RuleGroupViewProps> = ({ schema, group, onChange, onRemove, depth, maxDepth }) => {\n const isRoot = depth === 0;\n\n const handleToggleOperator = () => {\n onChange({ ...group, operator: group.operator === 'AND' ? 'OR' : 'AND' });\n };\n\n const handleConditionChange = (index: number, condition: Rule | RuleGroup) => {\n onChange({\n ...group,\n conditions: group.conditions.map((c, i) => (i === index ? (condition as Rule | RuleGroupDepth1) : c)),\n });\n };\n\n const handleRemoveCondition = (index: number) => {\n const newConditions = group.conditions.filter((_, i) => i !== index);\n if (newConditions.length === 0 && onRemove) {\n onRemove();\n } else {\n onChange({ ...group, conditions: newConditions });\n }\n };\n\n const handleAddRule = () => {\n onChange({ ...group, conditions: [...group.conditions, createDefaultRule()] });\n };\n\n const handleAddGroup = () => {\n onChange({\n ...group,\n conditions: [\n ...group.conditions,\n createDefaultRuleGroup(group.operator === 'AND' ? 'OR' : 'AND') as RuleGroupDepth1,\n ],\n });\n };\n\n return (\n <div className={cn(isRoot ? 'bg-surface2' : 'pl-6 bg-surface3')}>\n {/* Non-root group header */}\n {!isRoot && (\n <div className=\"flex items-center justify-between pl-3 pr-4 py-1.5 border-b border-border1 border-dashed\">\n <span className=\"text-ui-xs text-neutral3\">Group</span>\n {onRemove && (\n <Button type=\"button\" onClick={onRemove} tooltip=\"Remove group\" size=\"icon-sm\" variant=\"ghost\">\n <X />\n </Button>\n )}\n </div>\n )}\n\n {group.conditions.map((condition, index) => (\n <div key={index} className=\"border-b border-border1 border-dashed last:border-b-0\">\n <div className={cn('relative', isRule(condition) && 'p-4 border-l-4 border-border1')}>\n {index > 0 && (\n <button\n type=\"button\"\n onClick={handleToggleOperator}\n className={cn(\n 'absolute left-1/2 -translate-x-1/2 z-10 -translate-y-1/2 top-0 text-ui-xs px-3 py-0.5 rounded-full cursor-pointer',\n group.operator === 'OR'\n ? 'bg-accent6Dark text-accent6 hover:bg-accent6Dark/70'\n : 'bg-accent3Dark text-accent3 hover:bg-accent3Dark/70',\n )}\n >\n {group.operator.toLowerCase()}\n </button>\n )}\n\n {isRule(condition) ? (\n <RuleRow\n schema={schema}\n rule={condition}\n onChange={updatedRule => handleConditionChange(index, updatedRule)}\n onRemove={() => handleRemoveCondition(index)}\n />\n ) : (\n <RuleGroupView\n schema={schema}\n group={condition}\n onChange={updatedGroup => handleConditionChange(index, updatedGroup)}\n onRemove={() => handleRemoveCondition(index)}\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n )}\n </div>\n </div>\n ))}\n\n <div className=\"p-2 flex gap-1\">\n <Button type=\"button\" onClick={handleAddRule} variant=\"ghost\" size=\"sm\">\n <Icon>\n <Plus />\n </Icon>\n Add rule\n </Button>\n {depth < maxDepth - 1 && (\n <Button type=\"button\" onClick={handleAddGroup} variant=\"ghost\" size=\"sm\">\n <Icon>\n <Component />\n </Icon>\n Add group\n </Button>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Rule builder component for creating and managing a recursive set of rules\n * based on a JSON Schema defining available fields.\n *\n * Supports nested rule groups with AND/OR operators at each level.\n */\nexport const RuleBuilder: React.FC<RuleBuilderProps> = ({\n schema,\n ruleGroup,\n onChange,\n maxDepth = DEFAULT_MAX_DEPTH,\n className,\n}) => {\n const handleGroupChange = React.useCallback(\n (group: RuleGroup) => {\n onChange(group);\n },\n [onChange],\n );\n\n const handleAddFirstRule = React.useCallback(() => {\n onChange({ operator: 'AND', conditions: [createDefaultRule()] });\n }, [onChange]);\n\n if (!ruleGroup) {\n return (\n <button\n type=\"button\"\n onClick={handleAddFirstRule}\n className=\"flex items-center justify-center gap-2 text-ui-sm text-neutral3 hover:text-neutral6 w-full border border-dashed border-border1 p-2 rounded-md\"\n >\n <Icon>\n <Plus />\n </Icon>\n Add conditional rule\n </button>\n );\n }\n\n return (\n <div className={className}>\n <RuleGroupView schema={schema} group={ruleGroup} onChange={handleGroupChange} depth={0} maxDepth={maxDepth} />\n </div>\n );\n};\n"],"names":["Braces","List","Hash","ToggleLeft","Type","jsx","cn","jsxs","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Icon","React","Equal","EqualNot","TextSearch","Text","ChevronRight","ChevronLeft","ChevronsRight","ChevronsLeft","ListX","Check","Ban","Input","isArrayOperator","Fragment","Button","X","createDefaultRule","createDefaultRuleGroup","isRule","Plus","Component"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { RuleBuilder } from '../../../lib/rule-engine/components';
2
+ export type { RuleBuilderProps } from '../../../lib/rule-engine/components';
@@ -0,0 +1 @@
1
+ export * from '../lib/colors';
@@ -0,0 +1,2 @@
1
+ export * from '../lib/errors';
2
+ export * from '../lib/query-utils';
@@ -0,0 +1 @@
1
+ export * from '../lib/file';
@@ -0,0 +1 @@
1
+ export * from '../lib/formatting';
@@ -0,0 +1 @@
1
+ export * from '../lib/json-schema';
@@ -0,0 +1 @@
1
+ export * from '../lib/number';
@@ -0,0 +1 @@
1
+ export * from '../lib/query-utils';
@@ -0,0 +1,2 @@
1
+ export type { ConditionOperator, Rule, RuleGroup } from '../lib/rule-engine';
2
+ export { countLeafRules, createDefaultRule, createDefaultRuleGroup, isRule, isRuleGroup } from '../lib/rule-engine';
@@ -0,0 +1 @@
1
+ export * from '../lib/string';
@@ -0,0 +1 @@
1
+ export * from '../lib/truncate-string';
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const stringToColor = (str, lightness = 90, saturation = 100) => {
6
+ let hash = 0;
7
+ for (let i = 0; i < str.length; i++) {
8
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
9
+ hash = hash & hash;
10
+ }
11
+ return `hsl(${hash % 360}, ${saturation}%, ${lightness}%)`;
12
+ };
13
+
14
+ exports.stringToColor = stringToColor;
15
+ //# sourceMappingURL=colors.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.cjs.js","sources":["../../src/lib/colors.ts"],"sourcesContent":["export const stringToColor = (str: string, lightness: number = 90, saturation = 100) => {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n return `hsl(${hash % 360}, ${saturation}%, ${lightness}%)`;\n};\n"],"names":[],"mappings":";;;;AAAO,MAAM,gBAAgB,CAAC,GAAA,EAAa,SAAA,GAAoB,EAAA,EAAI,aAAa,GAAA,KAAQ;AACtF,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,IAAA,CAAM,QAAQ,CAAA,IAAK,IAAA,CAAA;AAC1C,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAO,IAAA,GAAO,GAAG,CAAA,EAAA,EAAK,UAAU,MAAM,SAAS,CAAA,EAAA,CAAA;AACxD;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/utils/colors'
2
+ export {}
@@ -0,0 +1,11 @@
1
+ const stringToColor = (str, lightness = 90, saturation = 100) => {
2
+ let hash = 0;
3
+ for (let i = 0; i < str.length; i++) {
4
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
5
+ hash = hash & hash;
6
+ }
7
+ return `hsl(${hash % 360}, ${saturation}%, ${lightness}%)`;
8
+ };
9
+
10
+ export { stringToColor };
11
+ //# sourceMappingURL=colors.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.es.js","sources":["../../src/lib/colors.ts"],"sourcesContent":["export const stringToColor = (str: string, lightness: number = 90, saturation = 100) => {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n return `hsl(${hash % 360}, ${saturation}%, ${lightness}%)`;\n};\n"],"names":[],"mappings":"AAAO,MAAM,gBAAgB,CAAC,GAAA,EAAa,SAAA,GAAoB,EAAA,EAAI,aAAa,GAAA,KAAQ;AACtF,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,IAAA,CAAM,QAAQ,CAAA,IAAK,IAAA,CAAA;AAC1C,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAO,IAAA,GAAO,GAAG,CAAA,EAAA,EAAK,UAAU,MAAM,SAAS,CAAA,EAAA,CAAA;AACxD;;;;"}
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const utils_queryUtils = require('./query-utils.cjs.js');
6
+
7
+ const errorFallback = "Something went wrong while fetching the data.";
8
+ const parseError = (error) => {
9
+ try {
10
+ const httpErrorPattern = /^HTTP error! status:\s*\d+\s*- \s*/;
11
+ const errorMessage = error?.message.replace(httpErrorPattern, "");
12
+ const jsonError = JSON.parse(errorMessage || "{}");
13
+ return {
14
+ error: jsonError?.error || errorFallback,
15
+ stack: jsonError?.stack || error?.stack
16
+ };
17
+ } catch {
18
+ return {
19
+ error: error?.message || errorFallback,
20
+ stack: void 0
21
+ };
22
+ }
23
+ };
24
+
25
+ exports.is401UnauthorizedError = utils_queryUtils.is401UnauthorizedError;
26
+ exports.is403ForbiddenError = utils_queryUtils.is403ForbiddenError;
27
+ exports.is404NotFoundError = utils_queryUtils.is404NotFoundError;
28
+ exports.isBranchesNotSupportedError = utils_queryUtils.isBranchesNotSupportedError;
29
+ exports.isNonRetryableError = utils_queryUtils.isNonRetryableError;
30
+ exports.isUnsupportedObservabilityOperationError = utils_queryUtils.isUnsupportedObservabilityOperationError;
31
+ exports.shouldRetryQuery = utils_queryUtils.shouldRetryQuery;
32
+ exports.parseError = parseError;
33
+ //# sourceMappingURL=errors.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs.js","sources":["../../src/lib/errors.ts"],"sourcesContent":["const errorFallback = 'Something went wrong while fetching the data.';\nexport const parseError = (error: Error) => {\n try {\n const httpErrorPattern = /^HTTP error! status:\\s*\\d+\\s*- \\s*/;\n const errorMessage = error?.message.replace(httpErrorPattern, '');\n const jsonError = JSON.parse(errorMessage || '{}');\n return {\n error: jsonError?.error || errorFallback,\n stack: jsonError?.stack || error?.stack,\n };\n } catch {\n return {\n error: error?.message || errorFallback,\n stack: undefined,\n };\n }\n};\n"],"names":[],"mappings":";;;;;;AAAA,MAAM,aAAA,GAAgB,+CAAA;AACf,MAAM,UAAA,GAAa,CAAC,KAAA,KAAiB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,gBAAA,GAAmB,oCAAA;AACzB,IAAA,MAAM,YAAA,GAAe,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAChE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,IAAI,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,WAAW,KAAA,IAAS,aAAA;AAAA,MAC3B,KAAA,EAAO,SAAA,EAAW,KAAA,IAAS,KAAA,EAAO;AAAA,KACpC;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,OAAA,IAAW,aAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACF;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/utils/errors'
2
+ export {}
@@ -0,0 +1,22 @@
1
+ export { is401UnauthorizedError, is403ForbiddenError, is404NotFoundError, isBranchesNotSupportedError, isNonRetryableError, isUnsupportedObservabilityOperationError, shouldRetryQuery } from './query-utils.es.js';
2
+
3
+ const errorFallback = "Something went wrong while fetching the data.";
4
+ const parseError = (error) => {
5
+ try {
6
+ const httpErrorPattern = /^HTTP error! status:\s*\d+\s*- \s*/;
7
+ const errorMessage = error?.message.replace(httpErrorPattern, "");
8
+ const jsonError = JSON.parse(errorMessage || "{}");
9
+ return {
10
+ error: jsonError?.error || errorFallback,
11
+ stack: jsonError?.stack || error?.stack
12
+ };
13
+ } catch {
14
+ return {
15
+ error: error?.message || errorFallback,
16
+ stack: void 0
17
+ };
18
+ }
19
+ };
20
+
21
+ export { parseError };
22
+ //# sourceMappingURL=errors.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.es.js","sources":["../../src/lib/errors.ts"],"sourcesContent":["const errorFallback = 'Something went wrong while fetching the data.';\nexport const parseError = (error: Error) => {\n try {\n const httpErrorPattern = /^HTTP error! status:\\s*\\d+\\s*- \\s*/;\n const errorMessage = error?.message.replace(httpErrorPattern, '');\n const jsonError = JSON.parse(errorMessage || '{}');\n return {\n error: jsonError?.error || errorFallback,\n stack: jsonError?.stack || error?.stack,\n };\n } catch {\n return {\n error: error?.message || errorFallback,\n stack: undefined,\n };\n }\n};\n"],"names":[],"mappings":";;AAAA,MAAM,aAAA,GAAgB,+CAAA;AACf,MAAM,UAAA,GAAa,CAAC,KAAA,KAAiB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,gBAAA,GAAmB,oCAAA;AACzB,IAAA,MAAM,YAAA,GAAe,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAChE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,IAAI,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,WAAW,KAAA,IAAS,aAAA;AAAA,MAC3B,KAAA,EAAO,SAAA,EAAW,KAAA,IAAS,KAAA,EAAO;AAAA,KACpC;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,OAAA,IAAW,aAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACF;;;;"}
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const EXTENSION_TO_MIME = {
6
+ jpg: "image/jpg",
7
+ jpeg: "image/jpeg",
8
+ png: "image/png",
9
+ gif: "image/gif",
10
+ webp: "image/webp",
11
+ svg: "image/svg+xml",
12
+ bmp: "image/bmp",
13
+ ico: "image/x-icon",
14
+ pdf: "application/pdf",
15
+ // Video
16
+ mp4: "video/mp4",
17
+ mov: "video/quicktime",
18
+ webm: "video/webm",
19
+ mkv: "video/x-matroska",
20
+ avi: "video/x-msvideo",
21
+ mpeg: "video/mpeg",
22
+ mpg: "video/mpeg",
23
+ // Audio
24
+ mp3: "audio/mpeg",
25
+ wav: "audio/wav",
26
+ ogg: "audio/ogg",
27
+ oga: "audio/ogg",
28
+ m4a: "audio/mp4",
29
+ aac: "audio/aac",
30
+ flac: "audio/flac"
31
+ };
32
+
33
+ const BROWSER_FETCHABLE_SCHEMES = ["https://", "http://"];
34
+ const NON_FETCHABLE_REMOTE_SCHEMES = ["gs://", "s3://"];
35
+ const REMOTE_URL_SCHEMES = [...BROWSER_FETCHABLE_SCHEMES, ...NON_FETCHABLE_REMOTE_SCHEMES];
36
+ const isRemoteUrl = (value) => REMOTE_URL_SCHEMES.some((scheme) => value.startsWith(scheme));
37
+ const isBrowserFetchableUrl = (value) => BROWSER_FETCHABLE_SCHEMES.some((scheme) => value.startsWith(scheme));
38
+ const isNonFetchableRemoteUrl = (value) => NON_FETCHABLE_REMOTE_SCHEMES.some((scheme) => value.startsWith(scheme));
39
+
40
+ const contentTypeFromExtension = (url) => {
41
+ try {
42
+ const { pathname } = new URL(url);
43
+ const extension = pathname.split(".").pop();
44
+ if (!extension) return void 0;
45
+ return EXTENSION_TO_MIME[extension.toLowerCase()];
46
+ } catch {
47
+ const extension = url.split(".").pop()?.split(/[?#]/)[0];
48
+ if (!extension) return void 0;
49
+ return EXTENSION_TO_MIME[extension.toLowerCase()];
50
+ }
51
+ };
52
+ const getFileContentType = async (url) => {
53
+ if (NON_FETCHABLE_REMOTE_SCHEMES.some((scheme) => url.startsWith(scheme))) {
54
+ return contentTypeFromExtension(url);
55
+ }
56
+ try {
57
+ const response = await fetch(url, {
58
+ method: "HEAD"
59
+ });
60
+ if (!response.ok) {
61
+ throw new Error("Failed to get file content type");
62
+ }
63
+ const contentType = response.headers.get("content-type");
64
+ if (!contentType) {
65
+ throw new Error("Failed to get file content type");
66
+ }
67
+ return contentType;
68
+ } catch {
69
+ return contentTypeFromExtension(url);
70
+ }
71
+ };
72
+
73
+ const downloadJson = (filename, data) => {
74
+ const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" });
75
+ const url = URL.createObjectURL(blob);
76
+ const anchor = document.createElement("a");
77
+ anchor.href = url;
78
+ anchor.download = filename;
79
+ document.body.appendChild(anchor);
80
+ anchor.click();
81
+ anchor.remove();
82
+ URL.revokeObjectURL(url);
83
+ };
84
+
85
+ const fileToBase64 = async (file) => {
86
+ return new Promise((resolve, reject) => {
87
+ const reader = new FileReader();
88
+ reader.onload = () => {
89
+ const result = reader.result;
90
+ if (typeof result === "string") {
91
+ resolve(result);
92
+ } else {
93
+ reject(new Error("Failed to convert file to base64."));
94
+ }
95
+ };
96
+ reader.onerror = (error) => {
97
+ reject(error);
98
+ };
99
+ reader.readAsDataURL(file);
100
+ });
101
+ };
102
+
103
+ exports.BROWSER_FETCHABLE_SCHEMES = BROWSER_FETCHABLE_SCHEMES;
104
+ exports.EXTENSION_TO_MIME = EXTENSION_TO_MIME;
105
+ exports.NON_FETCHABLE_REMOTE_SCHEMES = NON_FETCHABLE_REMOTE_SCHEMES;
106
+ exports.REMOTE_URL_SCHEMES = REMOTE_URL_SCHEMES;
107
+ exports.downloadJson = downloadJson;
108
+ exports.fileToBase64 = fileToBase64;
109
+ exports.getFileContentType = getFileContentType;
110
+ exports.isBrowserFetchableUrl = isBrowserFetchableUrl;
111
+ exports.isNonFetchableRemoteUrl = isNonFetchableRemoteUrl;
112
+ exports.isRemoteUrl = isRemoteUrl;
113
+ //# sourceMappingURL=file.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.cjs.js","sources":["../../src/lib/file/constants.ts","../../src/lib/file/schemes.ts","../../src/lib/file/contentTypeFromUrl.ts","../../src/lib/file/downloadJson.ts","../../src/lib/file/toBase64.ts"],"sourcesContent":["export const EXTENSION_TO_MIME: Record<string, string> = {\n jpg: 'image/jpg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n pdf: 'application/pdf',\n // Video\n mp4: 'video/mp4',\n mov: 'video/quicktime',\n webm: 'video/webm',\n mkv: 'video/x-matroska',\n avi: 'video/x-msvideo',\n mpeg: 'video/mpeg',\n mpg: 'video/mpeg',\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n oga: 'audio/ogg',\n m4a: 'audio/mp4',\n aac: 'audio/aac',\n flac: 'audio/flac',\n};\n","/**\n * Single source of truth for the URL schemes the attachment pipeline understands.\n *\n * These MUST stay aligned with the protocols Mastra core accepts in\n * `packages/core/src/agent/message-list/prompt/attachments-to-parts.ts` (its\n * `switch (url.protocol)` whitelists exactly `http:`, `https:`, `gs:`, `s3:`\n * and throws `Unsupported URL protocol` for anything else). Forwarding a scheme\n * the UI accepts but core rejects would surface as a runtime error, so the sets\n * are kept in lockstep — see `schemes.parity.test.ts`.\n */\n\n/** Schemes the browser can fetch directly (for inline previews and HEAD lookups). */\nexport const BROWSER_FETCHABLE_SCHEMES = ['https://', 'http://'] as const;\n\n/**\n * Cloud-storage schemes that are forwarded to the model provider and resolved\n * server-side (e.g. Vertex AI for `gs://`, Bedrock for `s3://`). The browser\n * cannot fetch these, so they are never HEAD-ed or previewed inline.\n */\nexport const NON_FETCHABLE_REMOTE_SCHEMES = ['gs://', 's3://'] as const;\n\n/** Every remote scheme an attachment URL may use (fetchable + cloud-storage). */\nexport const REMOTE_URL_SCHEMES = [...BROWSER_FETCHABLE_SCHEMES, ...NON_FETCHABLE_REMOTE_SCHEMES] as const;\n\n/** True when the value starts with any supported remote scheme. */\nexport const isRemoteUrl = (value: string): boolean => REMOTE_URL_SCHEMES.some(scheme => value.startsWith(scheme));\n\n/** True when the browser can fetch the value directly (http/https). */\nexport const isBrowserFetchableUrl = (value: string): boolean =>\n BROWSER_FETCHABLE_SCHEMES.some(scheme => value.startsWith(scheme));\n\n/** True when the value is a cloud-storage URI the browser cannot fetch (gs/s3). */\nexport const isNonFetchableRemoteUrl = (value: string): boolean =>\n NON_FETCHABLE_REMOTE_SCHEMES.some(scheme => value.startsWith(scheme));\n","import { EXTENSION_TO_MIME } from './constants';\nimport { NON_FETCHABLE_REMOTE_SCHEMES } from './schemes';\n\n/** Infer a MIME type from a URL/path's file extension. */\nconst contentTypeFromExtension = (url: string): string | undefined => {\n try {\n const { pathname } = new URL(url);\n const extension = pathname.split('.').pop();\n if (!extension) return undefined;\n return EXTENSION_TO_MIME[extension.toLowerCase()];\n } catch {\n // url is not a valid absolute URL (e.g. a relative path) — extract the\n // extension from the raw string so we still return a useful MIME type.\n const extension = url.split('.').pop()?.split(/[?#]/)[0];\n if (!extension) return undefined;\n return EXTENSION_TO_MIME[extension.toLowerCase()];\n }\n};\n\nexport const getFileContentType = async (url: string) => {\n // Cloud-storage URIs are fetched server-side by the model provider (e.g. Vertex\n // AI for `gs://`, Bedrock for `s3://`); the browser cannot HEAD them, so infer\n // the content type from the extension directly.\n if (NON_FETCHABLE_REMOTE_SCHEMES.some(scheme => url.startsWith(scheme))) {\n return contentTypeFromExtension(url);\n }\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n });\n\n if (!response.ok) {\n throw new Error('Failed to get file content type');\n }\n\n const contentType = response.headers.get('content-type');\n\n if (!contentType) {\n throw new Error('Failed to get file content type');\n }\n\n return contentType;\n } catch {\n // fetch failed — try to infer content type from the file extension\n return contentTypeFromExtension(url);\n }\n};\n","// Serialize data to pretty-printed JSON and trigger a browser file download.\nexport const downloadJson = (filename: string, data: unknown): void => {\n const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n\n URL.revokeObjectURL(url);\n};\n","export const fileToBase64 = async (file: File): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n resolve(result);\n } else {\n reject(new Error('Failed to convert file to base64.'));\n }\n };\n\n reader.onerror = error => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/utils/file'
2
+ export {}
@@ -0,0 +1,100 @@
1
+ const EXTENSION_TO_MIME = {
2
+ jpg: "image/jpg",
3
+ jpeg: "image/jpeg",
4
+ png: "image/png",
5
+ gif: "image/gif",
6
+ webp: "image/webp",
7
+ svg: "image/svg+xml",
8
+ bmp: "image/bmp",
9
+ ico: "image/x-icon",
10
+ pdf: "application/pdf",
11
+ // Video
12
+ mp4: "video/mp4",
13
+ mov: "video/quicktime",
14
+ webm: "video/webm",
15
+ mkv: "video/x-matroska",
16
+ avi: "video/x-msvideo",
17
+ mpeg: "video/mpeg",
18
+ mpg: "video/mpeg",
19
+ // Audio
20
+ mp3: "audio/mpeg",
21
+ wav: "audio/wav",
22
+ ogg: "audio/ogg",
23
+ oga: "audio/ogg",
24
+ m4a: "audio/mp4",
25
+ aac: "audio/aac",
26
+ flac: "audio/flac"
27
+ };
28
+
29
+ const BROWSER_FETCHABLE_SCHEMES = ["https://", "http://"];
30
+ const NON_FETCHABLE_REMOTE_SCHEMES = ["gs://", "s3://"];
31
+ const REMOTE_URL_SCHEMES = [...BROWSER_FETCHABLE_SCHEMES, ...NON_FETCHABLE_REMOTE_SCHEMES];
32
+ const isRemoteUrl = (value) => REMOTE_URL_SCHEMES.some((scheme) => value.startsWith(scheme));
33
+ const isBrowserFetchableUrl = (value) => BROWSER_FETCHABLE_SCHEMES.some((scheme) => value.startsWith(scheme));
34
+ const isNonFetchableRemoteUrl = (value) => NON_FETCHABLE_REMOTE_SCHEMES.some((scheme) => value.startsWith(scheme));
35
+
36
+ const contentTypeFromExtension = (url) => {
37
+ try {
38
+ const { pathname } = new URL(url);
39
+ const extension = pathname.split(".").pop();
40
+ if (!extension) return void 0;
41
+ return EXTENSION_TO_MIME[extension.toLowerCase()];
42
+ } catch {
43
+ const extension = url.split(".").pop()?.split(/[?#]/)[0];
44
+ if (!extension) return void 0;
45
+ return EXTENSION_TO_MIME[extension.toLowerCase()];
46
+ }
47
+ };
48
+ const getFileContentType = async (url) => {
49
+ if (NON_FETCHABLE_REMOTE_SCHEMES.some((scheme) => url.startsWith(scheme))) {
50
+ return contentTypeFromExtension(url);
51
+ }
52
+ try {
53
+ const response = await fetch(url, {
54
+ method: "HEAD"
55
+ });
56
+ if (!response.ok) {
57
+ throw new Error("Failed to get file content type");
58
+ }
59
+ const contentType = response.headers.get("content-type");
60
+ if (!contentType) {
61
+ throw new Error("Failed to get file content type");
62
+ }
63
+ return contentType;
64
+ } catch {
65
+ return contentTypeFromExtension(url);
66
+ }
67
+ };
68
+
69
+ const downloadJson = (filename, data) => {
70
+ const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" });
71
+ const url = URL.createObjectURL(blob);
72
+ const anchor = document.createElement("a");
73
+ anchor.href = url;
74
+ anchor.download = filename;
75
+ document.body.appendChild(anchor);
76
+ anchor.click();
77
+ anchor.remove();
78
+ URL.revokeObjectURL(url);
79
+ };
80
+
81
+ const fileToBase64 = async (file) => {
82
+ return new Promise((resolve, reject) => {
83
+ const reader = new FileReader();
84
+ reader.onload = () => {
85
+ const result = reader.result;
86
+ if (typeof result === "string") {
87
+ resolve(result);
88
+ } else {
89
+ reject(new Error("Failed to convert file to base64."));
90
+ }
91
+ };
92
+ reader.onerror = (error) => {
93
+ reject(error);
94
+ };
95
+ reader.readAsDataURL(file);
96
+ });
97
+ };
98
+
99
+ export { BROWSER_FETCHABLE_SCHEMES, EXTENSION_TO_MIME, NON_FETCHABLE_REMOTE_SCHEMES, REMOTE_URL_SCHEMES, downloadJson, fileToBase64, getFileContentType, isBrowserFetchableUrl, isNonFetchableRemoteUrl, isRemoteUrl };
100
+ //# sourceMappingURL=file.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.es.js","sources":["../../src/lib/file/constants.ts","../../src/lib/file/schemes.ts","../../src/lib/file/contentTypeFromUrl.ts","../../src/lib/file/downloadJson.ts","../../src/lib/file/toBase64.ts"],"sourcesContent":["export const EXTENSION_TO_MIME: Record<string, string> = {\n jpg: 'image/jpg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n pdf: 'application/pdf',\n // Video\n mp4: 'video/mp4',\n mov: 'video/quicktime',\n webm: 'video/webm',\n mkv: 'video/x-matroska',\n avi: 'video/x-msvideo',\n mpeg: 'video/mpeg',\n mpg: 'video/mpeg',\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n oga: 'audio/ogg',\n m4a: 'audio/mp4',\n aac: 'audio/aac',\n flac: 'audio/flac',\n};\n","/**\n * Single source of truth for the URL schemes the attachment pipeline understands.\n *\n * These MUST stay aligned with the protocols Mastra core accepts in\n * `packages/core/src/agent/message-list/prompt/attachments-to-parts.ts` (its\n * `switch (url.protocol)` whitelists exactly `http:`, `https:`, `gs:`, `s3:`\n * and throws `Unsupported URL protocol` for anything else). Forwarding a scheme\n * the UI accepts but core rejects would surface as a runtime error, so the sets\n * are kept in lockstep — see `schemes.parity.test.ts`.\n */\n\n/** Schemes the browser can fetch directly (for inline previews and HEAD lookups). */\nexport const BROWSER_FETCHABLE_SCHEMES = ['https://', 'http://'] as const;\n\n/**\n * Cloud-storage schemes that are forwarded to the model provider and resolved\n * server-side (e.g. Vertex AI for `gs://`, Bedrock for `s3://`). The browser\n * cannot fetch these, so they are never HEAD-ed or previewed inline.\n */\nexport const NON_FETCHABLE_REMOTE_SCHEMES = ['gs://', 's3://'] as const;\n\n/** Every remote scheme an attachment URL may use (fetchable + cloud-storage). */\nexport const REMOTE_URL_SCHEMES = [...BROWSER_FETCHABLE_SCHEMES, ...NON_FETCHABLE_REMOTE_SCHEMES] as const;\n\n/** True when the value starts with any supported remote scheme. */\nexport const isRemoteUrl = (value: string): boolean => REMOTE_URL_SCHEMES.some(scheme => value.startsWith(scheme));\n\n/** True when the browser can fetch the value directly (http/https). */\nexport const isBrowserFetchableUrl = (value: string): boolean =>\n BROWSER_FETCHABLE_SCHEMES.some(scheme => value.startsWith(scheme));\n\n/** True when the value is a cloud-storage URI the browser cannot fetch (gs/s3). */\nexport const isNonFetchableRemoteUrl = (value: string): boolean =>\n NON_FETCHABLE_REMOTE_SCHEMES.some(scheme => value.startsWith(scheme));\n","import { EXTENSION_TO_MIME } from './constants';\nimport { NON_FETCHABLE_REMOTE_SCHEMES } from './schemes';\n\n/** Infer a MIME type from a URL/path's file extension. */\nconst contentTypeFromExtension = (url: string): string | undefined => {\n try {\n const { pathname } = new URL(url);\n const extension = pathname.split('.').pop();\n if (!extension) return undefined;\n return EXTENSION_TO_MIME[extension.toLowerCase()];\n } catch {\n // url is not a valid absolute URL (e.g. a relative path) — extract the\n // extension from the raw string so we still return a useful MIME type.\n const extension = url.split('.').pop()?.split(/[?#]/)[0];\n if (!extension) return undefined;\n return EXTENSION_TO_MIME[extension.toLowerCase()];\n }\n};\n\nexport const getFileContentType = async (url: string) => {\n // Cloud-storage URIs are fetched server-side by the model provider (e.g. Vertex\n // AI for `gs://`, Bedrock for `s3://`); the browser cannot HEAD them, so infer\n // the content type from the extension directly.\n if (NON_FETCHABLE_REMOTE_SCHEMES.some(scheme => url.startsWith(scheme))) {\n return contentTypeFromExtension(url);\n }\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n });\n\n if (!response.ok) {\n throw new Error('Failed to get file content type');\n }\n\n const contentType = response.headers.get('content-type');\n\n if (!contentType) {\n throw new Error('Failed to get file content type');\n }\n\n return contentType;\n } catch {\n // fetch failed — try to infer content type from the file extension\n return contentTypeFromExtension(url);\n }\n};\n","// Serialize data to pretty-printed JSON and trigger a browser file download.\nexport const downloadJson = (filename: string, data: unknown): void => {\n const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n\n URL.revokeObjectURL(url);\n};\n","export const fileToBase64 = async (file: File): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n resolve(result);\n } else {\n reject(new Error('Failed to convert file to base64.'));\n }\n };\n\n reader.onerror = error => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ let prettierModules;
6
+ const loadPrettier = () => prettierModules ??= Promise.all([
7
+ import('prettier/standalone'),
8
+ import('prettier/plugins/babel'),
9
+ import('prettier/plugins/estree')
10
+ ]).catch((error) => {
11
+ prettierModules = void 0;
12
+ throw error;
13
+ });
14
+ const formatJSON = async (code) => {
15
+ const [prettier, prettierPluginBabel, prettierPluginEstree] = await loadPrettier();
16
+ const formatted = await prettier.format(code, {
17
+ semi: false,
18
+ parser: "json",
19
+ printWidth: 80,
20
+ tabWidth: 2,
21
+ plugins: [prettierPluginBabel, prettierPluginEstree]
22
+ });
23
+ return formatted;
24
+ };
25
+ const formatTypeScript = async (code) => {
26
+ const [prettier, prettierPluginBabel, prettierPluginEstree] = await loadPrettier();
27
+ const formatted = await prettier.format(code, {
28
+ parser: "babel-ts",
29
+ printWidth: 80,
30
+ tabWidth: 2,
31
+ plugins: [prettierPluginBabel, prettierPluginEstree]
32
+ });
33
+ return formatted;
34
+ };
35
+ const isValidJson = (str) => {
36
+ try {
37
+ const obj = JSON.parse(str);
38
+ return !!obj && typeof obj === "object";
39
+ } catch {
40
+ return false;
41
+ }
42
+ };
43
+
44
+ exports.formatJSON = formatJSON;
45
+ exports.formatTypeScript = formatTypeScript;
46
+ exports.isValidJson = isValidJson;
47
+ //# sourceMappingURL=formatting.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.cjs.js","sources":["../../src/lib/formatting.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/consistent-type-imports */\n\nlet prettierModules:\n | Promise<\n [\n typeof import('prettier/standalone'),\n typeof import('prettier/plugins/babel'),\n typeof import('prettier/plugins/estree'),\n ]\n >\n | undefined;\n\nconst loadPrettier = () =>\n (prettierModules ??= Promise.all([\n import('prettier/standalone'),\n import('prettier/plugins/babel'),\n import('prettier/plugins/estree'),\n ]).catch(error => {\n prettierModules = undefined;\n throw error;\n }));\n\nexport const formatJSON = async (code: string) => {\n const [prettier, prettierPluginBabel, prettierPluginEstree] = await loadPrettier();\n\n const formatted = await prettier.format(code, {\n semi: false,\n parser: 'json',\n printWidth: 80,\n tabWidth: 2,\n plugins: [prettierPluginBabel, prettierPluginEstree],\n });\n\n return formatted;\n};\n\nexport const formatTypeScript = async (code: string) => {\n const [prettier, prettierPluginBabel, prettierPluginEstree] = await loadPrettier();\n\n const formatted = await prettier.format(code, {\n parser: 'babel-ts',\n printWidth: 80,\n tabWidth: 2,\n plugins: [prettierPluginBabel, prettierPluginEstree],\n });\n\n return formatted;\n};\n\nexport const isValidJson = (str: string) => {\n try {\n // Attempt to parse the string as JSON\n const obj = JSON.parse(str);\n\n // Additionally check if the parsed result is an object\n return !!obj && typeof obj === 'object';\n } catch {\n // If parsing throws an error, it's not valid JSON\n return false;\n }\n};\n"],"names":[],"mappings":";;;;AAEA,IAAI,eAAA;AAUJ,MAAM,YAAA,GAAe,MAClB,eAAA,KAAoB,OAAA,CAAQ,GAAA,CAAI;AAAA,EAC/B,OAAO,qBAAqB,CAAA;AAAA,EAC5B,OAAO,wBAAwB,CAAA;AAAA,EAC/B,OAAO,yBAAyB;AAClC,CAAC,CAAA,CAAE,MAAM,CAAA,KAAA,KAAS;AAChB,EAAA,eAAA,GAAkB,MAAA;AAClB,EAAA,MAAM,KAAA;AACR,CAAC,CAAA;AAEI,MAAM,UAAA,GAAa,OAAO,IAAA,KAAiB;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,mBAAA,EAAqB,oBAAoB,CAAA,GAAI,MAAM,YAAA,EAAa;AAEjF,EAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM;AAAA,IAC5C,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,QAAA,EAAU,CAAA;AAAA,IACV,OAAA,EAAS,CAAC,mBAAA,EAAqB,oBAAoB;AAAA,GACpD,CAAA;AAED,EAAA,OAAO,SAAA;AACT;AAEO,MAAM,gBAAA,GAAmB,OAAO,IAAA,KAAiB;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,mBAAA,EAAqB,oBAAoB,CAAA,GAAI,MAAM,YAAA,EAAa;AAEjF,EAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM;AAAA,IAC5C,MAAA,EAAQ,UAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,QAAA,EAAU,CAAA;AAAA,IACV,OAAA,EAAS,CAAC,mBAAA,EAAqB,oBAAoB;AAAA,GACpD,CAAA;AAED,EAAA,OAAO,SAAA;AACT;AAEO,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB;AAC1C,EAAA,IAAI;AAEF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAG1B,IAAA,OAAO,CAAC,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/utils/formatting'
2
+ export {}